13 #include "Foundation/console.h"
15 template<
class ParticleType,
class IType>
25 template<
class ParticleType,
class IType>
27 :
TriMesh_PIS<ParticleType>(mesh_p,ppa_p),m_comm(ppa_p->getComm())
29 console.
XDebug() <<
"TriMesh_PIS_EB constructor\n";
31 this->m_update_timestamp = 0;
34 template <
class ParticleType,
class IType>
48 template <
class ParticleType,
class IType>
57 case 0: res=m_tri_int_set.find(make_pair(v[0],v[1]))!=m_tri_int_set.end();
break;
58 default: console.
Error() <<
"wrong value in argument of TriMesh_PIS::isIn !!\n";
break;
68 template<
class ParticleType,
class IType>
71 console.
XDebug() <<
"TriMesh_PIS_EB calculating " << m_triangle_interactions.size() <<
" triangle forces\n";
74 for(
typename list<typename IType::TriIntType>::iterator tri_iter=m_triangle_interactions.begin();
75 tri_iter!=m_triangle_interactions.end();
77 tri_iter->calcForces();
83 template<
class ParticleType,
class IType>
86 console.
XDebug() <<
"TriMesh_PIS_EB::update on node " << m_comm.rank() <<
"\n";
89 typename list<typename IType::TriIntType>::iterator iter=m_triangle_interactions.begin();
90 while(iter!=m_triangle_interactions.end()){
93 typename list<typename IType::TriIntType>::iterator er_iter=iter;
96 m_tri_int_set.erase(make_pair(er_iter->getTid(),er_iter->getPid()));
98 m_triangle_interactions.erase(er_iter);
104 console.
XDebug() <<
"end TriMesh_PIS_EB::update on node " << m_comm.rank() <<
"\n";
114 template<
class ParticleType,
class IType>
117 console.
XDebug() <<
"TriMesh_PIS_EB::exchange_boundary(" << dim <<
"," << dir <<
") at node " << m_comm.rank() <<
"\n";
119 std::set<int> bdry_ids;
120 std::vector<typename IType::TriIntType> recv_tri_buffer;
121 std::vector<typename IType::TriIntType> send_tri_buffer;
125 bdry_ids = this->m_ppa->getBoundarySlabIds(dim,dir);
127 for(
typename list<typename IType::TriIntType>::iterator iter=m_triangle_interactions.begin();
128 iter!=m_triangle_interactions.end();
130 int pid=iter->getPid();
131 if(bdry_ids.find(pid)!=bdry_ids.end()) {
132 send_tri_buffer.push_back(*iter);
136 m_comm.shift_cont_packed(send_tri_buffer,recv_tri_buffer,dim,dir,m_exchg_tag);
138 for(
typename std::vector<typename IType::TriIntType>::iterator iter=recv_tri_buffer.begin();
139 iter!=recv_tri_buffer.end();
144 console.
XDebug() <<
"end TriMesh_PIS_EB::exchange_boundary\n";
149 template<
class ParticleType,
class IType>
152 console.
XDebug() <<
"TriMesh_PIS_EB::exchange\n";
153 for(
int i=0;i<3;i++){
154 if(m_comm.get_dim(i)>1){
156 exchange_boundary(i,1);
158 exchange_boundary(i,-1);
161 console.
XDebug() <<
"end TriMesh_PIS_EB::exchange\n";
169 template<
class ParticleType,
class IType>
172 console.
XDebug() <<
"TriMesh_PIS_EB::rebuild on node " << m_comm.rank() <<
"\n";
176 typename list<typename IType::TriIntType>::iterator ti_iter=m_triangle_interactions.begin();
177 while(ti_iter!=m_triangle_interactions.end()){
178 int pid=ti_iter->getPid();
181 ti_iter->setPP(part_p);
182 Triangle *tri_p = this->m_mesh->getTriangleById(ti_iter->getTid());
183 ti_iter->setTP(tri_p);
186 const typename list<typename IType::TriIntType>::iterator er_iter=ti_iter;
188 m_tri_int_set.erase(make_pair(er_iter->getTid(),pid));
189 m_triangle_interactions.erase(er_iter);
193 console.
XDebug() <<
"end TriMesh_PIS_EB::rebuild on node " << m_comm.rank() <<
"\n";
207 template<
class ParticleType,
class IType>
214 bool is_in=isIn(pids);
216 if((!is_in) && (part_p!=NULL)){
219 Triangle *tri_p = this->m_mesh->getTriangleById(pids[0]);
221 m_triangle_interactions.push_back(
222 typename IType::TriIntType(
226 this->m_ppa->isInInner(part_p->getPos())
229 m_tri_int_set.insert(make_pair(pids[0],pids[1]));
234 <<
"Error: pids[2]= " << pids[2]
244 template<
class ParticleType,
class IType>
250 bool is_in=(m_tri_int_set.find(make_pair(In.getTid(),In.getPid()))!=m_tri_int_set.end());
252 if((!is_in) && (part_p!=NULL)){
253 m_triangle_interactions.push_back(In);
254 m_tri_int_set.insert(make_pair(In.getTid(),In.getPid()));
260 template<
class ParticleType,
class IType>
263 console.
XDebug() <<
"TriMesh_PIS_EB::buildFromPPATagged(" << tag <<
"," << mask <<
")\n";
265 console.
XDebug() <<
"end TriMesh_PIS_EB::buildFromPPATagged()";
270 template<
class ParticleType,
class IType>
273 console.
XDebug() <<
"TriMesh_PIS_EB::buildFromPPAByGap(" << gmax <<
")\n";
278 TriMesh::triangle_iterator tri_iter = this->m_mesh->triangles_begin();
279 tri_iter != this->m_mesh->triangles_end();
283 typename ParallelParticleArray<ParticleType>::ParticleListHandle plh=
285 console.
XDebug() <<
"triangle " << tri_iter->getID() <<
" nr. of particles : " << plh->size() <<
"\n";
287 for(
typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
291 console.
XDebug() <<
"interaction : " << tri_iter->getID() <<
" " << (*p_iter)->getID() <<
"\n";
292 if(id_set.find((*p_iter)->getID())==id_set.end()){
293 pair<bool,double> dist=tri_iter->dist((*p_iter)->getPos());
294 console.
XDebug() <<
"is valid: " << dist.first <<
" dist : " << dist.second <<
"\n";
297 double gap=fabs(dist.second-(*p_iter)->getRad());
298 console.
XDebug() <<
"radius: " << (*p_iter)->getRad() <<
" gap : " << gap <<
"\n";
301 console.
XDebug() <<
"Insert !!\n";
302 bool in_flag = this->m_ppa->isInInner((*p_iter)->getPos());
303 m_triangle_interactions.push_back(
typename IType::TriIntType((*p_iter),&(*tri_iter),m_param,in_flag));
304 m_tri_int_set.insert(make_pair(tri_iter->getID(),(*p_iter)->getID()));
305 id_set.insert((*p_iter)->getID());
311 console.
XDebug() <<
"end TriMesh_PIS_EB::buildFromPPAByGap()";
319 template<
class ParticleType,
class IType>
322 const std::string delim =
"\n";
323 typedef typename IType::TriIntType::CheckPointable CheckPointable;
327 for(
typename list<typename IType::TriIntType>::iterator it=m_triangle_interactions.begin();
328 it!=m_triangle_interactions.end();
330 if(it->isInner()) icount++;
334 oStream << IType::getType() << delim;
335 oStream << icount << delim;
336 for(
typename list<typename IType::TriIntType>::iterator it=m_triangle_interactions.begin();
337 it!=m_triangle_interactions.end();
339 if(it->isInner()) CheckPointable(*it).saveCheckPointData(oStream);