ESyS-Particle  4.0.1
trimesh_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 
13 #include "Foundation/console.h"
14 
22 template<class ParticleType,class IType>
24  :TriMesh_PIS<ParticleType>(mesh_p,ppa_p)
25 {
26  m_param=param;
27  this->m_update_timestamp=0;
28 }
29 
33 template<class ParticleType,class IType>
35 {}
36 
46 template <class ParticleType,class IType>
47 bool TriMesh_PIS_NE<ParticleType,IType>::isIn(const std::vector<int>& v)
48 {
49  bool res=false;
50 
51  if(v.size()<3){
52  res=false;
53  } else {
54  switch (v[2]){
55  case 0: res=m_tri_int_set.find(make_pair(v[0],v[1]))!=m_tri_int_set.end(); break;
56  case 1: res=m_edge_int_set.find(make_pair(v[0],v[1]))!=m_edge_int_set.end(); break;
57  case 2: res=m_corner_int_set.find(make_pair(v[0],v[1]))!=m_corner_int_set.end(); break;
58  default: console.Error() << "wrong value in argument of TriMesh_PIS::isIn !!\n"; break;
59  }
60  }
61 
62  return res;
63 }
64 
68 template<class ParticleType,class IType>
70 {
71  console.XDebug() << "TriMesh_PIS_NE calculating " << m_triangle_interactions.size() << " triangle forces , "
72  << m_edge_interactions.size() << "edge forces and "
73  << m_corner_interactions.size() << "corner forces\n";
74 
75  // calculate forces for triangle interactions
76  for(typename std::vector<typename IType::TriIntType>::iterator tri_iter=m_triangle_interactions.begin();
77  tri_iter!=m_triangle_interactions.end();
78  tri_iter++){
79  tri_iter->calcForces();
80  }
81  // calculate forces for edge interactions
82  for(typename std::vector<typename IType::EdgeIntType>::iterator edge_iter=m_edge_interactions.begin();
83  edge_iter!=m_edge_interactions.end();
84  edge_iter++){
85  edge_iter->calcForces();
86  }
87  // calculate forces for corner interactions
88  for(typename std::vector<typename IType::CornerIntType>::iterator corner_iter=m_corner_interactions.begin();
89  corner_iter!=m_corner_interactions.end();
90  corner_iter++){
91  corner_iter->calcForces();
92  }
93 }
94 
98 template<class ParticleType,class IType>
100 {
101  console.XDebug() << "TriMesh_PIS_NE::update\n";
102  bool res=false;
103  //int count_edge=0;
104  //int count_tri=0;
105 
106  if(this->m_update_timestamp != this->m_ppa->getTimeStamp()){// m_ppa rebuild since last update
107  console.XDebug() << "TriMesh_PIS_NE doing update\n";
108  // clean out old interactions
109  m_triangle_interactions.clear();
110  m_edge_interactions.clear();
111  m_corner_interactions.clear();
112  m_tri_int_set.clear();
113  m_edge_int_set.clear();
114  m_corner_int_set.clear();
115  // -- get triangle interactions --
116  // for all triangles
117  for(
118  TriMesh::triangle_iterator tri_iter = this->m_mesh->triangles_begin();
119  tri_iter != this->m_mesh->triangles_end();
120  tri_iter++){
121  // get list of particles near this triangle
122  typename ParallelParticleArray<ParticleType>::ParticleListHandle plh=
123  ((ParallelParticleArray<ParticleType>*)this->m_ppa)->getParticlesNearTriangle(*tri_iter);
124  // for all particles found
125  for(
126  typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
127  p_iter!=plh->end();
128  p_iter++
129  ){
130  bool iflag = this->m_ppa->isInInner((*p_iter)->getPos());
131  m_triangle_interactions.push_back(typename IType::TriIntType(*p_iter,&(*tri_iter),m_param,iflag));
132  m_tri_int_set.insert(make_pair(tri_iter->getID(),(*p_iter)->getID()));
133  }
134  }
135  // -- get edge interactions
136  // for all edges
137  for(
138  TriMesh::edge_iterator ed_iter = this->m_mesh->edges_begin();
139  ed_iter != this->m_mesh->edges_end();
140  ed_iter++
141  ){
142  typename ParallelParticleArray<ParticleType>::ParticleListHandle plh =
143  ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearEdge(&(*ed_iter));
144  for (
145  typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
146  p_iter!=plh->end();
147  p_iter++
148  ){
149  bool iflag = this->m_ppa->isInInner((*p_iter)->getPos());
150  m_edge_interactions.push_back(typename IType::EdgeIntType(*p_iter,&(*ed_iter),m_param,iflag));
151  //m_particle_id_set.insert((*p_iter)->getID());
152  }
153  }
154  // --- get corner interactions
155  for (
156  TriMesh::corner_iterator co_iter = this->m_mesh->corners_begin();
157  co_iter != this->m_mesh->corners_end();
158  co_iter++
159  ){
160  typename ParallelParticleArray<ParticleType>::ParticleListHandle plh=
161  ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearPoint(co_iter->getPos());
162  for (
163  typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
164  p_iter!=plh->end();
165  p_iter++
166  ){
167  bool iflag = this->m_ppa->isInInner((*p_iter)->getPos());
168  m_corner_interactions.push_back(typename IType::CornerIntType(*p_iter,&(*co_iter),m_param,iflag));
169  //m_particle_id_set.insert((*p_iter)->getID());
170  }
171  }
172  // set timestamp
173  this->m_update_timestamp = this->m_ppa->getTimeStamp();
174  }
175  console.XDebug() << "end ElasticTriMeshIG<T>::Update\n";
176 
177  return res;
178 }
179 
180