ESyS-Particle  4.0.1
mesh2d_pis_ne.hpp
1 
2 // //
3 // Copyright (c) 2003-2011 by The University of Queensland //
4 // Earth Systems Science Computational Centre (ESSCC) //
5 // http://www.uq.edu.au/esscc //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 #include "Foundation/console.h"
13 
21 template<class ParticleType,class IType>
23  :Mesh2D_PIS<ParticleType>(mesh_p,ppa_p)
24 {
25  m_param=param;
26  this->m_update_timestamp=0;
27 }
28 
32 template<class ParticleType,class IType>
34 {}
35 
45 template <class ParticleType,class IType>
46 bool Mesh2D_PIS_NE<ParticleType,IType>::isIn(const std::vector<int>& v)
47 {
48  bool res=false;
49 
50  if(v.size()<3){
51  res=false;
52  } else {
53  switch (v[2]){
54  case 0: res=m_edge_int_set.find(make_pair(v[0],v[1]))!=m_edge_int_set.end(); break;
55  case 1: res=m_corner_int_set.find(make_pair(v[0],v[1]))!=m_corner_int_set.end(); break;
56  default: console.Error() << "wrong value in argument of Mesh2D_PIS::isIn !!\n"; break;
57  }
58  }
59 
60  return res;
61 }
62 
66 template<class ParticleType,class IType>
68 {
69  console.XDebug() << "Mesh2D_PIS_NE calculating " << m_edge_interactions.size() << " line forces , "
70  << m_corner_interactions.size() << "corner forces\n";
71 
72  // calculate forces for edge interactions
73  for(typename std::vector<typename IType::EdgeIntType>::iterator tri_iter=m_edge_interactions.begin();
74  tri_iter!=m_edge_interactions.end();
75  tri_iter++){
76  tri_iter->calcForces();
77  }
78  // calculate forces for corner interactions
79  for(typename std::vector<typename IType::CornerIntType>::iterator corner_iter=m_corner_interactions.begin();
80  corner_iter!=m_corner_interactions.end();
81  corner_iter++){
82  corner_iter->calcForces();
83  }
84 }
85 
89 template<class ParticleType,class IType>
91 {
92  console.XDebug() << "Mesh2D_PIS_NE::update\n";
93  bool res=false;
94  //int count_edge=0;
95  //int count_tri=0;
96 
97  if(this->m_update_timestamp != this->m_ppa->getTimeStamp()){// m_ppa rebuild since last update
98  console.XDebug() << "Mesh2D_PIS_NE doing update\n";
99  // clean out old interactions
100  m_edge_interactions.clear();
101  m_corner_interactions.clear();
102  m_edge_int_set.clear();
103  m_corner_int_set.clear();
104  // -- get edge interactions
105  // for all edges
106  for(
107  Mesh2D::edge_iterator ed_iter = this->m_mesh->edges_begin();
108  ed_iter != this->m_mesh->edges_end();
109  ed_iter++
110  ){
111  typename ParallelParticleArray<ParticleType>::ParticleListHandle plh =
112  ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearEdge(&(*ed_iter));
113  for (
114  typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
115  p_iter!=plh->end();
116  p_iter++
117  ){
118  bool iflag = this->m_ppa->isInInner((*p_iter)->getPos());
119  m_edge_interactions.push_back(typename IType::EdgeIntType(*p_iter,&(*ed_iter),m_param,iflag));
120  //m_particle_id_set.insert((*p_iter)->getID());
121  }
122  }
123  // --- get corner interactions
124  for (
125  Mesh2D::corner_iterator co_iter = this->m_mesh->corners_begin();
126  co_iter != this->m_mesh->corners_end();
127  co_iter++
128  ){
129  typename ParallelParticleArray<ParticleType>::ParticleListHandle plh=
130  ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearPoint(co_iter->getPos());
131  for (
132  typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
133  p_iter!=plh->end();
134  p_iter++
135  ){
136  bool iflag = this->m_ppa->isInInner((*p_iter)->getPos());
137  m_corner_interactions.push_back(typename IType::CornerIntType(*p_iter,&(*co_iter),m_param,iflag));
138  //m_particle_id_set.insert((*p_iter)->getID());
139  }
140  }
141  // set timestamp
142  this->m_update_timestamp = this->m_ppa->getTimeStamp();
143  }
144  console.XDebug() << "end ElasticMesh2DIG<T>::Update\n";
145 
146  return res;
147 }
148