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())
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>
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);
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 <<
")\n";
365 ed_iter != this->m_mesh->edges_end();
370 console.
Debug() <<
"edge " << ed_iter->getID() <<
" nr. of particles : " << plh->size() <<
"\n";
377 console.
Debug() <<
"interaction : " << ed_iter->getID() <<
" " << (*p_iter)->getID() <<
"\n";
378 if(id_set.find((*p_iter)->getID())==id_set.end()){
379 pair<bool,double> dist=ed_iter->dist((*p_iter)->getPos());
380 console.
Debug() <<
"is valid: " << dist.first <<
" dist : " << dist.second <<
"\n";
382 int ptag=(*p_iter)->getTag();
384 if((ptag & mask)==(tag & mask)){
385 console.
Debug() <<
"Inserting " << (*p_iter)->getID() <<
" !!\n";
386 bool in_flag = this->m_ppa->isInInner((*p_iter)->getPos());
387 m_edge_interactions.push_back(
typename IType::TriIntType((*p_iter),&(*ed_iter),m_param,in_flag));
388 m_edge_int_set.insert(make_pair(ed_iter->getID(),(*p_iter)->getID()));
389 id_set.insert((*p_iter)->getID());
396 console.
XDebug() <<
"end Mesh2D_PIS_EB::buildFromPPATagged()";
404 template<
class ParticleType,
class IType>
407 console.
XDebug() <<
"Mesh2D_PIS_EB::buildFromPPAByGap(" << gmax <<
")\n";
413 ed_iter != this->m_mesh->edges_end();
419 console.
Debug() <<
"edge " << ed_iter->getID() <<
" nr. of particles : " << plh->size() <<
"\n";
426 console.
Debug() <<
"interaction : " << ed_iter->getID() <<
" " << (*p_iter)->getID() <<
"\n";
427 if(id_set.find((*p_iter)->getID())==id_set.end()){
428 pair<bool,double> dist=ed_iter->dist((*p_iter)->getPos());
429 console.
Debug() <<
"is valid: " << dist.first <<
" dist : " << dist.second <<
"\n";
432 double gap=fabs(dist.second-(*p_iter)->getRad());
433 console.
Debug() <<
"radius: " << (*p_iter)->getRad() <<
" gap : " << gap <<
"\n";
436 console.
Debug() <<
"Inserting " << (*p_iter)->getID() <<
" !!\n";
437 bool in_flag = this->m_ppa->isInInner((*p_iter)->getPos());
438 m_edge_interactions.push_back(
typename IType::TriIntType((*p_iter),&(*ed_iter),m_param,in_flag));
439 m_edge_int_set.insert(make_pair(ed_iter->getID(),(*p_iter)->getID()));
440 id_set.insert((*p_iter)->getID());
448 template <
class ParticleType,
class IType>
453 m_edge_interactions.begin(),
454 m_edge_interactions.end(),
459 template <
class ParticleType,
class IType>
462 const std::string delim =
"\n";
463 typedef typename IType::TriIntType::CheckPointable CheckPointable;
466 ost << IType::getType() << delim;
470 CheckPointable(it.
next()).saveSnapShotData(ost);
474 template <
class ParticleType,
class IType>
477 const std::string delim =
"\n";
478 typedef typename IType::TriIntType::CheckPointable CheckPointable;
481 ost << IType::getType() << delim;
485 CheckPointable(it.
next()).saveCheckPointData(ost);
489 template <
class ParticleType,
class IType>
492 console.
Critical() <<
"Mesh2D_PIS_EB<ParticleType,IType>::loadCheckPointData NOT IMPLEMENTED\n";
497 template <
class ParticleType,
class IType>
505 for (
Iterator it = begin; it != end; it++) {
515 template <
class ParticleType,
class IType>
518 return (m_numRemaining > 0);
521 template <
class ParticleType,
class IType>
524 while (!isInner(m_it)) {
533 template <
class ParticleType,
class IType>
536 return m_numRemaining;
539 template <
class ParticleType,
class IType>