13 template<
class ParticleType,
class IType>
15 template<
class ParticleType,
class IType>
25 template<
class ParticleType,
class IType>
27 :
Mesh2D_PIS<ParticleType>(mesh_p,ppa_p),m_comm(ppa_p->getComm())
29 console.
XDebug() <<
"Mesh2D_PIS_EB constructor\n";
31 this->m_update_timestamp=0;
43 template<
class ParticleType,
class IType>
52 case 1: res=m_edge_int_set.find(make_pair(v[0],v[1]))!=m_edge_int_set.end();
break;
53 case 2: res=m_edge_int_set.find(make_pair(v[0],v[1]))!=m_corner_int_set.end();
break;
54 default: console.
Error() <<
"wrong value in argument of Mesh2D_PIS::isIn !!\n";
break;
64 template<
class ParticleType,
class IType>
67 console.
XDebug() <<
"Mesh2D_PIS_EB calculating " << m_edge_interactions.size() <<
" edge forces and"
68 << m_corner_interactions.size() <<
" corner forces\n";
71 for(
typename list<typename IType::TriIntType>::iterator ed_iter=m_edge_interactions.begin();
72 ed_iter!=m_edge_interactions.end();
74 ed_iter->calcForces();
77 for(
typename list<typename IType::CornerIntType>::iterator c_iter=m_corner_interactions.begin();
78 c_iter!=m_corner_interactions.end();
86 template<
class ParticleType,
class IType>
89 console.
XDebug() <<
"Mesh2D_PIS_EB::update on node " << m_comm.rank() <<
"\n";
93 typename list<typename IType::TriIntType>::iterator iter=m_edge_interactions.begin();
94 while(iter!=m_edge_interactions.end()){
97 typename list<typename IType::TriIntType>::iterator er_iter=iter;
100 m_edge_int_set.erase(make_pair(er_iter->getTid(),er_iter->getPid()));
102 m_edge_interactions.erase(er_iter);
108 typename list<typename IType::CornerIntType>::iterator c_iter=m_corner_interactions.begin();
109 while(c_iter!=m_corner_interactions.end()){
110 if(c_iter->broken()){
112 typename list<typename IType::CornerIntType>::iterator cr_iter=c_iter;
115 m_corner_int_set.erase(make_pair(cr_iter->getCid(),cr_iter->getPid()));
117 m_corner_interactions.erase(cr_iter);
122 console.
XDebug() <<
"end Mesh2D_PIS_EB::update on node " << m_comm.rank() <<
"\n";
129 template<
class ParticleType,
class IType>
132 console.
XDebug() <<
"TriMesh_PIS_EB::exchange\n";
133 for(
int i=0;i<3;i++){
134 if(m_comm.get_dim(i)>1){
136 exchange_boundary(i,1);
138 exchange_boundary(i,-1);
141 console.
XDebug() <<
"end TriMesh_PIS_EB::exchange\n";
150 template<
class ParticleType,
class IType>
153 console.
XDebug() <<
"Mesh2D_PIS_EB::exchange_boundary(" << dim <<
"," << dir <<
") at node " << m_comm.rank() <<
"\n";
155 std::set<int> bdry_ids;
156 std::vector<typename IType::TriIntType> recv_tri_buffer;
157 std::vector<typename IType::TriIntType> send_tri_buffer;
158 std::vector<typename IType::CornerIntType> recv_corner_buffer;
159 std::vector<typename IType::CornerIntType> send_corner_buffer;
163 bdry_ids = this->m_ppa->getBoundarySlabIds(dim,dir);
166 for(
typename std::list<typename IType::TriIntType>::iterator iter=m_edge_interactions.begin();
167 iter!=m_edge_interactions.end();
169 int pid=iter->getPid();
170 if(bdry_ids.find(pid)!=bdry_ids.end()) {
171 send_tri_buffer.push_back(*iter);
175 m_comm.shift_cont_packed(send_tri_buffer,recv_tri_buffer,dim,dir,m_edge_exchg_tag);
177 for(
typename std::vector<typename IType::TriIntType>::iterator iter=recv_tri_buffer.begin();
178 iter!=recv_tri_buffer.end();
184 for(
typename std::list<typename IType::CornerIntType>::iterator iter=m_corner_interactions.begin();
185 iter!=m_corner_interactions.end();
187 int pid=iter->getPid();
188 if(bdry_ids.find(pid)!=bdry_ids.end()) {
189 send_corner_buffer.push_back(*iter);
193 m_comm.shift_cont_packed(send_corner_buffer,recv_corner_buffer,dim,dir,m_corner_exchg_tag);
195 for(
typename std::vector<typename IType::CornerIntType>::iterator iter=recv_corner_buffer.begin();
196 iter!=recv_corner_buffer.end();
201 console.
XDebug() <<
"end Mesh2D_PIS_EB::exchange_boundary\n";
204 template<
class ParticleType,
class IType>
214 template<
class ParticleType,
class IType>
217 console.
XDebug() <<
"Mesh2D_PIS_EB::rebuild on node " << m_comm.rank() <<
"\n";
221 typename std::list<typename IType::TriIntType>::iterator ti_iter=m_edge_interactions.begin();
222 while(ti_iter!=m_edge_interactions.end()){
223 int pid=ti_iter->getPid();
226 ti_iter->setPP(part_p);
227 Edge2D *ed_p = this->m_mesh->getEdgeById(ti_iter->getTid());
228 ti_iter->setTP(ed_p);
231 const typename list<typename IType::TriIntType>::iterator er_iter=ti_iter;
233 m_edge_int_set.erase(make_pair(er_iter->getTid(),pid));
234 m_edge_interactions.erase(er_iter);
238 typename list<typename IType::CornerIntType>::iterator ci_iter=m_corner_interactions.begin();
239 while(ci_iter!=m_corner_interactions.end()){
240 int pid=ci_iter->getPid();
243 ci_iter->setPP(part_p);
244 Corner2D *co_p = this->m_mesh->getCornerById(ci_iter->getCid());
245 ci_iter->setCP(co_p);
248 const typename list<typename IType::CornerIntType>::iterator cr_iter=ci_iter;
250 m_corner_int_set.erase(make_pair(cr_iter->getCid(),pid));
251 m_corner_interactions.erase(cr_iter);
255 console.
XDebug() <<
"end Mesh2D_PIS_EB::rebuild on node " << m_comm.rank() <<
"\n";
260 template<
class ParticleType,
class IType>
263 console.
XDebug() <<
"Mesh2D_PIS_EB::tryInsert(const typename IType::TriIntType& In)\n";
267 bool is_in=(m_edge_int_set.find(make_pair(In.getTid(),In.getPid()))!=m_edge_int_set.end());
269 if((!is_in) && (part_p!=NULL)){
270 m_edge_interactions.push_back(In);
271 m_edge_int_set.insert(make_pair(In.getTid(),In.getPid()));
277 template<
class ParticleType,
class IType>
280 console.
XDebug() <<
"Mesh2D_PIS_EB::tryInsert(const typename IType::CornerIntType& In)\n";
284 bool is_in=(m_corner_int_set.find(make_pair(In.getCid(),In.getPid()))!=m_corner_int_set.end());
286 if((!is_in) && (part_p!=NULL)){
287 m_corner_interactions.push_back(In);
288 m_corner_int_set.insert(make_pair(In.getCid(),In.getPid()));
303 template<
class ParticleType,
class IType>
306 console.
XDebug() <<
"Mesh2D_PIS_EB::(const vector<int>& pids)\n";
311 bool is_in=isIn(pids);
313 if((!is_in) && (part_p!=NULL)){
316 Edge2D *edge_p = this->m_mesh->getEdgeById(pids[0]);
318 m_edge_interactions.push_back(
319 typename IType::TriIntType(
323 this->m_ppa->isInInner(part_p->getPos())
326 m_edge_int_set.insert(make_pair(pids[0],pids[1]));
328 console.
Error() <<
"ERROR: Wrong edge id " << pids[0] <<
" in Mesh2D_PIS_EB::tryInsert\n";
332 Corner2D *corner_p = this->m_mesh->getCornerById(pids[0]);
334 m_corner_interactions.push_back(
335 typename IType::CornerIntType(
339 this->m_ppa->isInInner(part_p->getPos())
342 m_corner_int_set.insert(make_pair(pids[0],pids[1]));
344 console.
Error() <<
"ERROR: Wrong corner id " << pids[0] <<
" in Mesh2D_PIS_EB::tryInsert\n";
347 default : console.
Error() <<
"Error: pids[2]= " << pids[2] <<
"\n";
356 template<
class ParticleType,
class IType>
359 console.
XDebug() <<
"Mesh2D_PIS_EB::buildFromPPATagged(" << tag <<
"," << mask <<
") not implemented \n";
361 console.
XDebug() <<
"end Mesh2D_PIS_EB::buildFromPPATagged()";
369 template<
class ParticleType,
class IType>
372 console.
XDebug() <<
"Mesh2D_PIS_EB::buildFromPPAByGap(" << gmax <<
")\n";
377 Mesh2D::edge_iterator ed_iter = this->m_mesh->edges_begin();
378 ed_iter != this->m_mesh->edges_end();
382 typename ParallelParticleArray<ParticleType>::ParticleListHandle plh=
384 console.
Debug() <<
"edge " << ed_iter->getID() <<
" nr. of particles : " << plh->size() <<
"\n";
387 typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
391 console.
Debug() <<
"interaction : " << ed_iter->getID() <<
" " << (*p_iter)->getID() <<
"\n";
392 if(id_set.find((*p_iter)->getID())==id_set.end()){
393 pair<bool,double> dist=ed_iter->dist((*p_iter)->getPos());
394 console.
Debug() <<
"is valid: " << dist.first <<
" dist : " << dist.second <<
"\n";
397 double gap=fabs(dist.second-(*p_iter)->getRad());
398 console.
Debug() <<
"radius: " << (*p_iter)->getRad() <<
" gap : " << gap <<
"\n";
401 console.
Debug() <<
"Inserting " << (*p_iter)->getID() <<
" !!\n";
402 bool in_flag = this->m_ppa->isInInner((*p_iter)->getPos());
403 m_edge_interactions.push_back(
typename IType::TriIntType((*p_iter),&(*ed_iter),m_param,in_flag));
404 m_edge_int_set.insert(make_pair(ed_iter->getID(),(*p_iter)->getID()));
405 id_set.insert((*p_iter)->getID());
413 template <
class ParticleType,
class IType>
418 m_edge_interactions.begin(),
419 m_edge_interactions.end(),
424 template <
class ParticleType,
class IType>
427 const std::string delim =
"\n";
428 typedef typename IType::TriIntType::CheckPointable CheckPointable;
430 InteractionIterator it = getInnerInteractionIterator();
431 ost << IType::getType() << delim;
432 ost << it.getNumRemaining();
433 while (it.hasNext()){
435 CheckPointable(it.next()).saveCheckPointData(ost);
439 template <
class ParticleType,
class IType>
442 console.
Critical() <<
"Mesh2D_PIS_EB<ParticleType,IType>::loadCheckPointData NOT IMPLEMENTED\n";
447 template <
class ParticleType,
class IType>
455 for (Iterator it = begin; it != end; it++) {
465 template <
class ParticleType,
class IType>
468 return (m_numRemaining > 0);
471 template <
class ParticleType,
class IType>
474 while (!isInner(m_it)) {
477 Interaction &i = *m_it;
483 template <
class ParticleType,
class IType>
486 return m_numRemaining;
489 template <
class ParticleType,
class IType>
492 return m_ppa->isInInner(it->getPos());