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())
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>
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);
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";
270 tri_iter != this->m_mesh->triangles_end();
276 console.
XDebug() <<
"triangle " << tri_iter->getID() <<
" nr. of particles : " << plh->size() <<
"\n";
282 console.
XDebug() <<
"interaction : " << tri_iter->getID() <<
" " << (*p_iter)->getID() <<
"\n";
283 if(id_set.find((*p_iter)->getID())==id_set.end()){
284 pair<bool,double> dist=tri_iter->dist((*p_iter)->getPos());
285 console.
XDebug() <<
"is valid: " << dist.first <<
" dist : " << dist.second <<
"\n";
287 int ptag=(*p_iter)->getTag();
289 if((ptag & mask)==(tag & mask)){
291 bool in_flag = this->m_ppa->isInInner((*p_iter)->getPos());
292 m_triangle_interactions.push_back(
typename IType::TriIntType((*p_iter),&(*tri_iter),m_param,in_flag));
293 m_tri_int_set.insert(make_pair(tri_iter->getID(),(*p_iter)->getID()));
294 id_set.insert((*p_iter)->getID());
300 console.
XDebug() <<
"end TriMesh_PIS_EB::buildFromPPATagged()";
305 template<
class ParticleType,
class IType>
308 console.
XDebug() <<
"TriMesh_PIS_EB::buildFromPPAByGap(" << gmax <<
")\n";
314 tri_iter != this->m_mesh->triangles_end();
320 console.
XDebug() <<
"triangle " << tri_iter->getID() <<
" nr. of particles : " << plh->size() <<
"\n";
326 console.
XDebug() <<
"interaction : " << tri_iter->getID() <<
" " << (*p_iter)->getID() <<
"\n";
327 if(id_set.find((*p_iter)->getID())==id_set.end()){
328 pair<bool,double> dist=tri_iter->dist((*p_iter)->getPos());
329 console.
XDebug() <<
"is valid: " << dist.first <<
" dist : " << dist.second <<
"\n";
332 double gap=fabs(dist.second-(*p_iter)->getRad());
333 console.
XDebug() <<
"radius: " << (*p_iter)->getRad() <<
" gap : " << gap <<
"\n";
337 bool in_flag = this->m_ppa->isInInner((*p_iter)->getPos());
338 m_triangle_interactions.push_back(
typename IType::TriIntType((*p_iter),&(*tri_iter),m_param,in_flag));
339 m_tri_int_set.insert(make_pair(tri_iter->getID(),(*p_iter)->getID()));
340 id_set.insert((*p_iter)->getID());
346 console.
XDebug() <<
"end TriMesh_PIS_EB::buildFromPPAByGap()";
354 template<
class ParticleType,
class IType>
357 const std::string delim =
"\n";
358 typedef typename IType::TriIntType::CheckPointable CheckPointable;
362 for(
typename list<typename IType::TriIntType>::iterator it=m_triangle_interactions.begin();
363 it!=m_triangle_interactions.end();
365 if(it->isInner()) icount++;
369 oStream << IType::getType() << delim;
370 oStream << icount << delim;
371 for(
typename list<typename IType::TriIntType>::iterator it=m_triangle_interactions.begin();
372 it!=m_triangle_interactions.end();
374 if(it->isInner()) CheckPointable(*it).saveCheckPointData(oStream);