88 #include <boost/limits.hpp>
89 using std::runtime_error;
119 m_singleParticleInteractions(),
130 m_comm(MPI_COMM_NULL),
131 m_tml_comm(MPI_COMM_NULL),
132 m_worker_comm(MPI_COMM_NULL),
133 m_tml_worker_comm(MPI_COMM_NULL),
173 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): enter\n";
175 <<
"TSubLattice<T>::~TSubLattice():"
176 <<
" deleting wall interaction groups...\n";
186 <<
"TSubLattice<T>::~TSubLattice():"
187 <<
" deleting particle array...\n";
188 if (m_ppa !=
NULL)
delete m_ppa;
189 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): exit\n";
201 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
")\n";
203 double xsize=max.
X()-min.
X();
204 xsize=m_nrange*ceil(xsize/m_nrange);
205 double ysize=max.Y()-min.
Y();
206 ysize=m_nrange*ceil(ysize/m_nrange);
207 double zsize=max.Z()-min.
Z();
208 zsize=m_nrange*ceil(zsize/m_nrange);
209 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
210 Vec3 nmin=min-0.5*grow;
211 Vec3 nmax=max+0.5*grow;
212 console.
XDebug() <<
"range=" << m_nrange <<
", new min,max: " << nmin <<
", " << nmax <<
"\n";
221 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable\n";
227 T::setDo2dCalculations(do2d);
233 return m_ppa->getInnerSize();
246 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
") circ\n";
247 double xsize,ysize,zsize;
252 xsize=max.
X()-min.
X();
253 if(fabs(xsize/m_nrange-lrint(xsize/m_nrange))>1e-6)
256 console.
Info() <<
"Circular x-size incompatible with range, adjusting...\n";
257 m_nrange = xsize/floor(xsize/m_nrange);
258 console.
Info() <<
"New range = " << m_nrange <<
"\n";
264 xsize=max.X()-min.
X();
265 xsize=m_nrange*ceil(xsize/m_nrange);
270 ysize=max.Y()-min.
Y();
271 if(fabs(ysize/m_nrange-lrint(ysize/m_nrange))>1e-6)
279 ysize=max.Y()-min.
Y();
280 ysize=m_nrange*ceil(ysize/m_nrange);
285 zsize=max.Z()-min.
Z();
286 if(fabs(zsize/m_nrange-lrint(zsize/m_nrange))>1e-6)
294 zsize=max.Z()-min.
Z();
295 zsize=m_nrange*ceil(zsize/m_nrange);
297 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
298 Vec3 nmin=min-0.5*grow;
299 Vec3 nmax=max+0.5*grow;
300 console.
XDebug() <<
"range, new min, max: " << m_nrange <<
" " << nmin << nmax <<
"\n";
307 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable (circ)\n";
319 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: enter\n";
321 vector<T> recv_buffer;
324 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
325 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" particles \n";
326 m_ppa->insert(recv_buffer);
328 barrier.
wait(
"TSubLattice<T>::receiveParticles");
330 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: exit\n";
342 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: enter\n";
344 vector<int> recv_buffer;
347 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
348 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" connections \n";
349 vector<int>::iterator it;
350 for (it = recv_buffer.begin(); it != recv_buffer.end(); it+=3)
352 if ( (m_ppa->getParticlePtrByIndex( *(it+1)) ==
NULL ) ||
353 (m_ppa->getParticlePtrByIndex( *(it+2)) ==
NULL ) )
357 m_temp_conn[*(it)].push_back(*(it+1));
358 m_temp_conn[*(it)].push_back(*(it+2));
361 barrier.
wait(
"TSubLattice<T>::receiveConnections");
363 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: exit\n";
381 m_walls[name]=
new CWall(ipos,inorm);
392 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: enter\n" ;
401 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
402 if(iter!=m_walls.end()){
410 m_WIG.insert(make_pair(wigp->
getName(),newCEWIG));
412 std::stringstream msg;
413 msg <<
"wall name '" << wallname <<
"' not found in map of walls";
414 throw std::runtime_error(msg.str().c_str());
418 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: exit\n" ;
428 console.
XDebug() <<
"TSubLattice<T>::addTaggedElasticWIG: enter\n" ;
435 int tag=param_buffer.
pop_int();
436 int mask=param_buffer.
pop_int();
440 console.
XDebug() << wallname <<
" tag= " << tag <<
" mask= " << mask <<
"\n" ;
441 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
442 if(iter!=m_walls.end()){
452 m_WIG.insert(make_pair(wigp->getName(),newCTEWIG));
454 std::stringstream msg;
455 msg <<
"wall name '" << wallname <<
"' not found in map of walls";
456 throw std::runtime_error(msg.str().c_str());
460 console.
XDebug() <<
"TSubLattice<T>::addTaggedElasticWIG: exit\n" ;
470 console.
XDebug() <<
"TSubLattice<T>::addBondedWIG: enter\n" ;
479 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
480 if(iter!=m_walls.end()){
483 m_WIG.insert(make_pair(wigp->
getName(),newCBWIG));
485 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
498 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: enter\n" ;
507 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
508 if(iter!=m_walls.end()){
511 m_WIG.insert(make_pair(wigp->
getName(),newCDWIG));
513 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
517 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: exit\n" ;
526 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: enter\n" ;
537 map<string,CWall*>::iterator
iter=m_walls.find(wname);
538 if(iter!=m_walls.end()){
539 pos=(iter->second)->getPos();
542 pos=
Vec3(0.0,0.0,0.0);
547 m_tml_comm.send_gather(vpos,0);
548 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: exit\n" ;
557 console.
XDebug() <<
"TSubLattice<T>::getWallForce: enter\n" ;
568 map<string,CWall*>::iterator
iter=m_walls.find(wname);
569 if(iter!=m_walls.end()){
570 force=(iter->second)->getForce();
573 force=
Vec3(0.0,0.0,0.0);
577 vforce.push_back(force);
578 m_tml_comm.send_gather(vforce,0);
597 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
598 if(iter!=m_walls.end()){
601 m_WIG.insert(make_pair(wigp->
getName(),newCVWIG));
603 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
626 doAddPIG(name,type,param_buffer,
false);
647 doAddPIG(name,type,param_buffer,
true);
649 console.
XDebug() <<
"end TSubLattice<T>::addTaggedPairIG()\n";
665 if(type==
"Elastic") {
670 int tag1=param_buffer.
pop_int();
671 int mask1=param_buffer.
pop_int();
672 int tag2=param_buffer.
pop_int();
673 int mask2=param_buffer.
pop_int();
675 << tag1 <<
" , " << mask1 <<
" , "
676 << tag2 <<
" , " << mask2 <<
"\n";
682 }
else if (type==
"Friction") {
690 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
693 }
else if (type==
"AdhesiveFriction") {
701 <<
"k,mu,k_s,dt,r_cut: " << figp.
k <<
" , " << figp.
mu <<
" , "
702 << figp.
k_s <<
" , " << figp.
dt <<
" " << figp.
r_cut <<
"\n";
705 }
else if (type==
"FractalFriction") {
712 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
720 <<
"x0,y0,dx,dy,nx,ny: "
721 << figp.
x0 <<
" , " << figp.
y0 <<
" , "
722 << figp.
dx <<
" , " << figp.
dy <<
" ,"
723 << figp.
nx <<
" , " << figp.
ny <<
"\n";
724 figp.
mu = boost::shared_ptr<double>(
new double[figp.
nx*figp.
ny]);
726 for(
int i=0;i<figp.
nx*figp.
ny;i++)
733 }
else if(type==
"VWFriction") {
742 <<
"k,mu,k_s,dt,alpha: " << figp.
k <<
" , " << figp.
mu <<
" , "
743 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
746 }
else if(type==
"RotElastic"){
751 }
else if (type==
"RotFriction"){
761 <<
"k,mu_s,mu_d,k_s,dt,scaling: " << rfigp.
k <<
" , "
762 << rfigp.
mu_s <<
" , " << rfigp.
mu_d <<
" , "
763 << rfigp.
k_s <<
" , " << rfigp.
dt <<
" , " << rfigp.
scaling <<
"\n";
765 int tag1=param_buffer.
pop_int();
766 int mask1=param_buffer.
pop_int();
767 int tag2=param_buffer.
pop_int();
768 int mask2=param_buffer.
pop_int();
770 << tag1 <<
" , " << mask1 <<
" , "
771 << tag2 <<
" , " << mask2 <<
"\n";
777 }
else if (type ==
"RotThermElastic") {
782 <<
"k=" << eigp.
m_kr <<
" , "
794 }
else if (type ==
"RotThermFriction") {
803 <<
"k=" << rfigp.
k <<
" , "
804 <<
"mu_d=" << rfigp.
mu_d <<
" , "
805 <<
"mu_s=" << rfigp.
mu_s <<
" , "
806 <<
"k_s=" << rfigp.
k_s <<
" , "
808 <<
"dt=" << rfigp.
dt <<
"\n";
819 }
else if(type==
"HertzianElastic") {
824 int tag1=param_buffer.
pop_int();
825 int mask1=param_buffer.
pop_int();
826 int tag2=param_buffer.
pop_int();
827 int mask2=param_buffer.
pop_int();
833 }
else if(type==
"HertzianViscoElasticFriction") {
842 int tag1=param_buffer.
pop_int();
843 int mask1=param_buffer.
pop_int();
844 int tag2=param_buffer.
pop_int();
845 int mask2=param_buffer.
pop_int();
851 }
else if(type==
"HertzianViscoElastic") {
857 int tag1=param_buffer.
pop_int();
858 int mask1=param_buffer.
pop_int();
859 int tag2=param_buffer.
pop_int();
860 int mask2=param_buffer.
pop_int();
866 }
else if(type==
"LinearDashpot") {
871 int tag1=param_buffer.
pop_int();
872 int mask1=param_buffer.
pop_int();
873 int tag2=param_buffer.
pop_int();
874 int mask2=param_buffer.
pop_int();
881 cerr <<
"Unknown interaction group name "
883 <<
" in TSubLattice<T>::addPairIG()" << endl;
887 if(res) m_dpis.insert(make_pair(name,new_pis));
904 vector<MeshNodeData> node_recv_buffer;
905 vector<MeshTriData> tri_recv_buffer;
915 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
916 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
919 m_tml_comm.recv_broadcast_cont_packed(tri_recv_buffer,0);
920 console.
XDebug() <<
"recvd " << tri_recv_buffer.size() <<
" triangles \n";
924 new_tm->
LoadMesh(node_recv_buffer,tri_recv_buffer);
926 m_mesh.insert(make_pair(name,new_tm));
947 console.
XDebug()<<
"TriMeshIG type: " << type.c_str() <<
"\n";
949 console.
XDebug()<<
"TriMeshIG name: " << name.c_str() <<
"\n";
951 console.
XDebug()<<
"TriMeshIG mesh name: " << meshname.c_str() <<
"\n";
955 if (m_mesh.find(meshname) != m_mesh.end())
957 tmp = m_mesh[meshname];
960 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
969 m_dpis.insert(make_pair(name,new_pis));
971 throw runtime_error(
"unknown type in TSubLattice<T>::addTriMeshIG:" + type);
984 console.
XDebug() <<
"TSubLattice<T>::addBondedTriMeshIG()\n";
995 console.
XDebug()<<
"BTriMeshIG name: " << name.c_str() <<
"\n";
997 console.
XDebug()<<
"BTriMeshIG mesh name: " << meshname.c_str() <<
"\n";
1002 string buildtype = param_buffer.
pop_string();
1003 console.
XDebug()<<
"BTriMeshIG build type: " << buildtype.c_str() <<
"\n";
1007 if (m_mesh.find(meshname) != m_mesh.end())
1009 tmp = m_mesh[meshname];
1012 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
1018 if(buildtype==
"BuildByTag"){
1019 int tag=param_buffer.
pop_int();
1020 int mask=param_buffer.
pop_int();
1022 m_bpis.insert(make_pair(name,new_pis));
1023 }
else if(buildtype==
"BuildByGap"){
1026 m_bpis.insert(make_pair(name,new_pis));
1028 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedTriMeshIG:" + buildtype);
1031 console.
XDebug() <<
"end TSubLattice<T>::addBondedTriMeshIG()\n";
1045 vector<MeshNodeData2D> node_recv_buffer;
1046 vector<MeshEdgeData2D> edge_recv_buffer;
1056 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
1057 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
1060 m_tml_comm.recv_broadcast_cont_packed(edge_recv_buffer,0);
1061 console.
XDebug() <<
"recvd " << edge_recv_buffer.size() <<
" edges \n";
1065 new_tm->
LoadMesh(node_recv_buffer,edge_recv_buffer);
1067 m_mesh2d.insert(make_pair(name,new_tm));
1089 console.
XDebug()<<
"Mesh2DIG type: " << type.c_str() <<
"\n";
1091 console.
XDebug()<<
"Mesh2DIG name: " << name.c_str() <<
"\n";
1093 console.
XDebug()<<
"Mesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1097 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1099 tmp = m_mesh2d[meshname];
1102 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addMesh2DIG:" + meshname);
1111 m_dpis.insert(make_pair(name,new_pis));
1113 throw runtime_error(
"unknown type in TSubLattice<T>::addMesh2DIG:" + type);
1127 console.
XDebug() <<
"TSubLattice<T>::addBondedMesh2DIG()\n";
1138 console.
XDebug() <<
"BMesh2DIG name: " << name.c_str() <<
"\n";
1140 console.
XDebug() <<
"BMesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1145 string buildtype = param_buffer.
pop_string();
1146 console.
XDebug() <<
"BMesh2DIG build type: " << buildtype.c_str() <<
"\n";
1150 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1152 tmp = m_mesh2d[meshname];
1155 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addBondedMesh2DIG:" + meshname);
1161 if(buildtype==
"BuildByTag"){
1162 int tag=param_buffer.
pop_int();
1163 int mask=param_buffer.
pop_int();
1165 m_bpis.insert(make_pair(name,new_pis));
1166 }
else if(buildtype==
"BuildByGap"){
1169 m_bpis.insert(make_pair(name,new_pis));
1171 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedMesh2DIG:" + buildtype);
1174 console.
XDebug() <<
"end TSubLattice<T>::addBonded2DMeshIG()\n";
1196 if(type==
"Gravity"){
1200 m_singleParticleInteractions.insert(
1207 else if (type==
"Buoyancy"){
1211 m_singleParticleInteractions.insert(
1219 throw std::runtime_error(
1220 std::string(
"Trying to setup SIG of unknown type: ")
1242 console.
XDebug()<<
"Damping type: " << type.c_str() <<
"\n";
1245 doAddDamping(type,param_buffer);
1260 string damping_name;
1267 damping_name=
"Damping";
1269 }
else if (type==
"ABCDamping"){
1272 damping_name=params->
getName();
1274 }
else if (type==
"LocalDamping"){
1277 damping_name=params->
getName();
1280 std::stringstream msg;
1281 msg <<
"Trying to setup Damping of unknown type: " << type;
1283 throw std::runtime_error(msg.str());
1289 m_damping.insert(make_pair(damping_name,DG));
1290 m_damping[damping_name]->update();
1315 <<
"Got BondedIG parameters: " << param.
tag
1316 <<
" " << name.c_str() <<
" "
1317 << param.
k <<
" " << param.
rbreak <<
"\n";
1328 vector<int> vi(2,-1);
1329 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1331 vi[0] = (m_temp_conn[param.
tag][i]);
1332 vi[1] = (m_temp_conn[param.
tag][i+1]);
1337 m_bpis.insert(make_pair(name,B_PIS));
1349 console.
XDebug() <<
"TSubLattice<T>::addCappedBondedIG()\n";
1354 int tag=param_buffer.
pop_int();
1361 <<
"Got CappedBondedIG parameters: " << tag
1362 <<
" " << name.c_str() <<
" "
1363 << k <<
" " << rbreak <<
" " << maxforce <<
"\n";
1390 vector<int> vi(2,-1);
1391 for(
size_t i=0;i<m_temp_conn[tag].size();i+=2)
1393 vi[0] = (m_temp_conn[tag][i]);
1394 vi[1] = (m_temp_conn[tag][i+1]);
1399 m_bpis.insert(make_pair(name,B_PIS));
1401 console.
XDebug() <<
"end TSubLattice<T>::addCappedBondedIG()\n";
1407 console.
Error() <<
"TSubLattice<T>::addRotBondedIG() => trying to add rotational bonded IG to nonrotational model\n";
1413 console.
Error() <<
"TSubLattice<T>::addRotThermBondedIG() => trying to add rotational thermal bonded IG to nonrotational model\n";
1428 int tag=param_buffer.
pop_int();
1434 <<
"Got ShortBondedIG parameters: " << tag
1435 <<
" " << name.c_str() <<
" "
1436 << k <<
" " << rbreak <<
"\n";
1457 vector<int> vi(2,-1);
1458 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1460 vi[0] = (m_temp_conn[param.
tag][i]);
1461 vi[1] = (m_temp_conn[param.
tag][i+1]);
1466 m_bpis.insert(make_pair(name,B_PIS));
1468 console.
XDebug() <<
"end TSubLattice<T>::addShortBondedIG()\n";
1488 map<string,AParallelInteractionStorage*>::iterator bonded_ig=m_bpis.find(s1);
1489 map<string,AParallelInteractionStorage*>::iterator dynamic_ig=m_dpis.find(s2);
1490 if((bonded_ig!=m_bpis.end())&&(dynamic_ig!=m_dpis.end()))
1494 dynamic_ig->second->addExIG(bonded_ig->second);
1498 console.
Error() <<
"TSubLattice<T>::setExIG() - nonexisting interaction group \n";
1520 map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.find(igname);
1522 if(iter!=m_dpis.end()){
1524 delete m_dpis[igname];
1528 typename map<string,AWallInteractionGroup<T>*>::iterator it2=m_WIG.find(igname);
1529 if(it2!=m_WIG.end()){
1531 delete m_WIG[igname];
1537 console.
Error() <<
"TSubLattice<T>::removeIG() - nonexisting interaction group - ignore removal\n";
1550 m_ppa->exchange(&T::getExchangeValues,&T::setExchangeValues);
1564 m_ppa->forAllParticles(&T::zeroForce);
1566 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1569 (
iter->second)->zeroForces();
1573 for(map<string,Mesh2D*>::iterator
iter=m_mesh2d.begin();
1574 iter!=m_mesh2d.end();
1576 (
iter->second)->zeroForces();
1579 for(
typename map<string,CWall*>::iterator
iter=m_walls.begin();
1580 iter!=m_walls.end();
1583 (
iter->second)->zeroForce();
1602 (it->second)->calcForces();
1606 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1607 siter != m_singleParticleInteractions.end();
1611 (siter->second)->calcForces();
1614 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1616 (
iter->second)->calcForces();
1619 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1621 (
iter->second)->calcForces();
1624 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1626 (
iter->second)->calcForces();
1647 (it->second)->setTimeStepSize(dt);
1651 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1652 siter != m_singleParticleInteractions.end();
1656 (siter->second)->setTimeStepSize(dt);
1659 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1661 (
iter->second)->setTimeStepSize(dt);
1664 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1666 (
iter->second)->setTimeStepSize(dt);
1669 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1671 (
iter->second)->setTimeStepSize(dt);
1674 console.
XDebug() <<
"end TSubLattice<T>::setTimeStepSize() \n";
1686 m_ppa->forAllParticles(&T::integrate,dt);
1687 m_ppa->forAllParticles(&T::rescale) ;
1701 if (this->getParticleType() ==
"RotTherm")
1703 this->oneStepTherm();
1716 integrateTherm(m_dt);
1729 m_ppa->forAllParticles(&T::integrateTherm,dt);
1731 console.
XDebug() <<
"end TSubLattice<T>::integrateTherm \n";
1738 m_ppa->forAllParticles(&T::thermExpansion);
1740 console.
XDebug() <<
"end TSubLattice<T>::thermExpansion() \n";
1752 m_ppa->forAllParticles(&T::zeroHeat);
1777 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1782 (
iter->second)->calcHeatFrict();
1785 console.
XDebug() <<
"end TSubLattice<T>::calcHeatFrict() \n";
1796 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1801 (
iter->second)->calcHeatTrans();
1805 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1810 (
iter->second)->calcHeatTrans();
1813 console.
XDebug() <<
"end TSubLattice<T>::calcHeatTrans() \n";
1832 m_pTimers->start(
"RebuildInteractions");
1833 m_pTimers->resume(
"NeighbourSearch");
1834 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1838 console.
Debug() <<
"exchg & rebuild BPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
1839 (
iter->second)->exchange();
1840 (
iter->second)->rebuild();
1843 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1847 console.
Debug() <<
"exchg & rebuild DPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
1848 (
iter->second)->exchange();
1849 m_pTimers->pause(
"RebuildInteractions");
1850 m_pTimers->pause(
"NeighbourSearch");
1851 barrier.
wait(
"dpis::exchange");
1852 m_pTimers->resume(
"RebuildInteractions");
1853 m_pTimers->resume(
"NeighbourSearch");
1854 (
iter->second)->rebuild();
1856 resetDisplacements();
1857 m_pTimers->stop(
"RebuildInteractions");
1866 console.
Debug() <<
"CSubLattice<T>::searchNeighbors()\n";
1868 m_pTimers->start(
"NeighbourSearch");
1869 m_pTimers->start(
"RebuildParticleArray");
1870 rebuildParticleArray();
1871 m_pTimers->stop(
"RebuildParticleArray");
1872 m_pTimers->pause(
"NeighbourSearch");
1873 barrier.
wait(
"PPA rebuild");
1874 rebuildInteractions();
1875 m_pTimers->stop(
"NeighbourSearch");
1876 console.
Debug() <<
"end CSubLattice<T>::searchNeighbors()\n";
1888 console.
Debug() <<
"m_ppa->getTimeStamp() " << m_ppa->getTimeStamp() <<
" m_last_ns " << m_last_ns <<
"\n";
1889 bool need_update=
false;
1891 m_pTimers->start(
"UpdateBondedInteractions");
1892 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1896 bool n=(
iter->second)->update();
1897 need_update=need_update || n;
1899 m_pTimers->stop(
"UpdateBondedInteractions");
1900 if((m_ppa->getTimeStamp() > m_last_ns) || need_update)
1902 m_pTimers->start(
"UpdateDynamicInteractions");
1903 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1907 bool n=(
iter->second)->update();
1908 need_update=need_update || n;
1910 m_pTimers->stop(
"UpdateDynamicInteractions");
1915 (it->second)->Update(m_ppa);
1917 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
1918 iter!=m_damping.end();
1920 (
iter->second)->update();
1922 m_last_ns=m_ppa->getTimeStamp();
1925 console.
Debug() <<
"end TSubLattice<T>::updateInteractions()\n";
1935 console.
Debug() <<
"TSubLattice<T>::checkNeighbors()\n";
1938 double alpha=0.5*m_alpha;
1939 double srsqr=alpha*alpha;
1945 m_ppa->forAllParticlesGet(displ,&T::getDisplacement);
1948 vector<Vec3>::iterator it=displ.begin();
1949 while((it!=displ.end())&&(mdsqr<srsqr))
1951 double sqdisp=(*it)*(*it);
1952 mdsqr = ((mdsqr < sqdisp) ? sqdisp : mdsqr);
1956 console.
XDebug() <<
"max squared displacement " << mdsqr <<
"alpha^2 = " << srsqr <<
"\n";
1966 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1970 if(
iter->second->hasMovedBy(alpha)){
1977 console.
Debug() <<
"end TSubLattice<T>::checkNeighbors()\n";
1987 console.
Debug() <<
"slave " << m_rank <<
" resetDisplacements()\n";
1988 m_ppa->forAllParticles(&T::resetDisplacement);
1989 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1992 iter->second->resetCurrentDisplacement();
1994 console.
Debug() <<
"slave " << m_rank <<
" end resetDisplacements()\n";
2004 console.
Debug() <<
"TSubLattice<T>::moveParticleTo()\n";
2010 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::moveToRel),mv);
2011 console.
Debug() <<
"end TSubLattice<T>::moveParticleTo()\n";
2021 console.
Debug() <<
"TSubLattice<T>::moveTaggedParticlesBy()\n";
2025 const int tag = buffer.
pop_int();
2027 m_ppa->forParticleTag(tag, (
void (T::*)(
Vec3))(&T::moveBy),dx);
2028 console.
Debug() <<
"end TSubLattice<T>::moveTaggedParticlesBy()\n";
2035 m_ppa->forParticle(particleId, (
void (T::*)(
Vec3))(&T::moveTo), posn);
2045 console.
Debug() <<
"TSubLattice<T>::moveSingleNode()\n";
2053 console.
XDebug() <<
"name :" << name <<
" id : " <<
id <<
" disp " << disp <<
"\n";
2055 map<string,TriMesh*>::iterator tm=m_mesh.find(name);
2056 if (tm!=m_mesh.end()){
2057 (tm->second)->moveNode(
id,disp);
2059 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(name);
2060 if(m2d!=m_mesh2d.end()){
2061 (m2d->second)->moveNode(
id,disp);
2064 console.
Debug() <<
"end TSubLattice<T>::moveSingleNode()\n";
2074 console.
Error() <<
"TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n";
2077 "TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n"
2098 map<string,TriMesh*>::iterator tm=m_mesh.find(meshName);
2099 if (tm != m_mesh.end()){
2100 (tm->second)->translateBy(translation);
2102 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshName);
2103 if(m2d!=m_mesh2d.end()){
2104 (m2d->second)->translateBy(translation);
2111 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: enter\n";
2112 const T *pClosest =
NULL;
2113 double minDistSqrd = std::numeric_limits<double>::max();
2116 m_ppa->getInnerParticleIterator();
2119 const T &p = it.
next();
2120 const double distSqrd = (pt - p.getPos()).norm2();
2121 if (distSqrd < minDistSqrd)
2123 minDistSqrd = distSqrd;
2127 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: exit\n";
2132 std::make_pair(sqrt(minDistSqrd), pClosest->getID())
2134 std::make_pair(std::numeric_limits<double>::max(), -1)
2144 const T *particle =
NULL;
2146 m_ppa->getInnerParticleIterator();
2149 const T &p = it.
next();
2150 if (p.getID() == particleId)
2155 if (particle !=
NULL)
2157 return std::make_pair(particleId, particle->getPos());
2169 <<
"TSubLattice<T>::getParticleData: enter\n";
2170 typedef std::set<int> IdSet;
2173 ParticleVector particleVector;
2175 m_ppa->getInnerParticleIterator();
2176 if (particleIdVector.size() > 0)
2178 IdSet idSet(particleIdVector.begin(), particleIdVector.end());
2180 <<
"TSubLattice<T>::getParticleData: iterating over particles\n";
2183 const T &p = it.
next();
2184 if (idSet.find(p.getID()) != idSet.end())
2186 particleVector.push_back(p);
2192 m_ppa->getAllInnerParticles(particleVector);
2195 <<
"TSubLattice<T>::getParticleData:"
2196 <<
" sending particle data of size " << particleVector.size() <<
"\n";
2197 m_tml_comm.send_gather_packed(particleVector, 0);
2199 <<
"TSubLattice<T>::getParticleData: exit\n";
2208 console.
Debug() <<
"TSubLattice<T>::tagParticleNearestTo()\n";
2217 T* part_ptr=m_ppa->getParticlePtrByPosition(pos);
2219 int old_tag=part_ptr->getTag();
2220 int new_tag=(old_tag & (~mask)) | (tag & mask);
2221 part_ptr->setTag(new_tag);
2223 cout <<
"pos, realpos: " << pos <<
" " << part_ptr->getPos() <<
" old tag, new tag " << old_tag <<
" " << part_ptr->getTag() << endl;
2225 console.
Debug() <<
"end TSubLattice<T>::tagParticleNearestTo()\n";
2235 console.
Debug() <<
"TSubLattice<T>::setParticleNonDynamic()\n";
2240 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamic));
2241 console.
Debug() <<
"end TSubLattice<T>::setParticleNonDynamic()\n";
2251 console.
Debug() <<
"TSubLattice<T>::setParticleNonRot()\n";
2256 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicRot));
2257 console.
Debug() <<
"end TSubLattice<T>::setParticleNonRot()\n";
2267 console.
Debug() <<
"TSubLattice<T>::setParticleNonTrans()\n";
2272 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicLinear));
2273 console.
Debug() <<
"end TSubLattice<T>::setParticleNonTrans()\n";
2282 console.
Debug() <<
"TSubLattice<T>::setTaggedParticleVel()\n";
2288 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::setVel),v);
2289 console.
XDebug() <<
"end TSubLattice<T>::setTaggedParticleVel()\n";
2304 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2305 if(iter!=m_walls.end())
2307 (iter->second)->moveBy(mv);
2323 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2324 if(iter!=m_walls.end())
2326 (iter->second)->setNormal(wn);
2342 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2343 if(iter!=m_WIG.end())
2345 (iter->second)->applyForce(f);
2356 console.
XDebug() <<
"TSubLattice<T>::setVelocityOfWall()\n";
2362 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2363 if(iter!=m_WIG.end())
2365 (iter->second)->setVelocity(v);
2375 console.
Debug() <<
"TSubLattice<T>::setParticleVelocity()\n";
2381 m_ppa->forParticle(
id,(
void (T::*)(
Vec3))(&T::setVel),mv);
2382 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2391 console.
Debug() <<
"TSubLattice<T>::setParticleDensity()\n";
2398 m_ppa->forParticleTagMask(tag,mask,(
void (T::*)(
double))(&T::setDensity),rho);
2399 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2409 console.
Debug() <<
"TSubLattice<T>::sendDataToMaster()\n";
2410 vector<Vec3> positions;
2411 vector<double> radii;
2414 m_ppa->forAllParticlesGet(positions,(
Vec3 (T::*)()
const)(&T::getPos));
2415 m_ppa->forAllParticlesGet(radii,(
double (T::*)()
const)(&T::getRad));
2416 m_ppa->forAllParticlesGet(ids,(
int (T::*)()
const)(&T::getID));
2418 m_tml_comm.send_gather(positions,0);
2419 m_tml_comm.send_gather(radii,0);
2420 m_tml_comm.send_gather(ids,0);
2422 console.
Debug() <<
"end TSubLattice<T>::sendDataToMaster()\n";
2434 buffer.
append(m_ppa->size());
2445 cout<<
"My Rank : " << m_rank <<
"\n" ;
2448 cout << *m_ppa << endl;
2455 cout <<
"Data: my rank : " << m_rank <<
"particles : \n" ;
2456 m_ppa->forAllParticles((
void (T::*)())(&T::print));
2462 console.
Debug() <<
"time spent calculating force : " << forcetime <<
" sec\n";
2463 console.
Debug() <<
"time spent communicating : " << commtime <<
" sec\n";
2464 console.
Debug() <<
"time spent packing : " << packtime <<
" sec\n";
2465 console.
Debug() <<
"time spent unpacking : " << unpacktime <<
" sec\n";
2482 m_tml_comm.recv_broadcast_cont(fieldname,0);
2484 m_tml_comm.recv_broadcast(
id,0);
2486 m_tml_comm.recv_broadcast(is_tagged,0);
2489 typename T::ScalarFieldFunction rdf=T::getScalarFieldFunction(fieldname);
2498 m_tml_comm.recv_broadcast(tag,0);
2500 m_tml_comm.recv_broadcast(mask,0);
2504 m_field_slaves.insert(make_pair(
id,new_spfs));
2513 console.
XDebug() <<
"TSubLattice<T>::addVectorParticleField\n";
2517 m_tml_comm.recv_broadcast_cont(fieldname,0);
2518 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2519 m_tml_comm.recv_broadcast(
id,0);
2521 m_tml_comm.recv_broadcast(is_tagged,0);
2522 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2524 typename T::VectorFieldFunction rdf=T::getVectorFieldFunction(fieldname);
2533 m_tml_comm.recv_broadcast(tag,0);
2535 m_tml_comm.recv_broadcast(mask,0);
2539 m_field_slaves.insert(make_pair(
id,new_vpfs));
2541 console.
Debug() <<
"end TSubLattice<T>::addVectorParticleField\n";
2551 console.
XDebug() <<
"TSubLattice<T>::addScalarInteractionField\n";
2555 int id,is_tagged,tag,mask,is_checked;
2557 m_tml_comm.recv_broadcast_cont(fieldname,0);
2558 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2559 m_tml_comm.recv_broadcast(
id,0);
2561 m_tml_comm.recv_broadcast_cont(igname,0);
2562 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2563 m_tml_comm.recv_broadcast_cont(igtype,0);
2564 console.
XDebug() <<
"recvd. interaction group name: " << igtype <<
"\n";
2565 m_tml_comm.recv_broadcast(is_tagged,0);
2566 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2569 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2572 m_tml_comm.recv_broadcast(tag,0);
2573 m_tml_comm.recv_broadcast(mask,0);
2575 m_tml_comm.recv_broadcast(is_checked,0);
2576 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2578 if(it!=m_dpis.end())
2582 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2583 m_field_slaves.insert(make_pair(
id,new_sifs));
2587 it=m_bpis.find(igname);
2588 if(it!=m_bpis.end()){
2591 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2592 m_field_slaves.insert(make_pair(
id,new_sifs));
2597 it=m_damping.find(igname);
2598 if(it!=m_damping.end())
2601 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2602 m_field_slaves.insert(make_pair(
id,new_sifs));
2606 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2611 console.
XDebug() <<
"end TSubLattice<T>::addScalarInteractionField\n";
2620 console.
Debug() <<
"TSubLattice<T>::addVectorInteractionField\n";
2624 int id,is_tagged,tag,mask,is_checked;
2626 m_tml_comm.recv_broadcast_cont(fieldname,0);
2627 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2628 m_tml_comm.recv_broadcast(
id,0);
2630 m_tml_comm.recv_broadcast_cont(igname,0);
2631 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2632 m_tml_comm.recv_broadcast_cont(igtype,0);
2633 console.
XDebug() <<
"recvd. interaction group type: " << igtype <<
"\n";
2634 m_tml_comm.recv_broadcast(is_tagged,0);
2635 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2638 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2641 m_tml_comm.recv_broadcast(tag,0);
2642 m_tml_comm.recv_broadcast(mask,0);
2644 m_tml_comm.recv_broadcast(is_checked,0);
2645 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2647 if(it!=m_dpis.end())
2651 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2653 m_field_slaves.insert(make_pair(
id,new_sifs));
2655 console.
Error()<<
"ERROR: could not generate Field Slave for field " << fieldname <<
"\n";
2660 it=m_bpis.find(igname);
2661 if(it!=m_bpis.end()){
2664 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2665 m_field_slaves.insert(make_pair(
id,new_sifs));
2670 it=m_damping.find(igname);
2671 if(it!=m_damping.end())
2674 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2675 m_field_slaves.insert(make_pair(
id,new_sifs));
2679 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2684 console.
Debug() <<
"end TSubLattice<T>::addVectorInteractionField\n";
2694 console.
Debug() <<
"TSubLattice<T>::addVectorTriangleField()\n";
2700 m_tml_comm.recv_broadcast_cont(fieldname,0);
2701 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2702 m_tml_comm.recv_broadcast_cont(meshname,0);
2703 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
2704 m_tml_comm.recv_broadcast(
id,0);
2707 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
2709 if (tm!=m_mesh.end()){
2717 m_field_slaves.insert(make_pair(
id,new_vfs));
2719 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
2720 if(m2d!=m_mesh2d.end()){
2727 m_field_slaves.insert(make_pair(
id,new_efs));
2730 console.
Debug() <<
"end TSubLattice<T>::addVectorTriangleField()\n";
2739 console.
Debug() <<
"TSubLattice<T>::addScalarTriangleField()\n";
2745 m_tml_comm.recv_broadcast_cont(fieldname,0);
2746 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2747 m_tml_comm.recv_broadcast_cont(meshname,0);
2748 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
2749 m_tml_comm.recv_broadcast(
id,0);
2759 m_field_slaves.insert(make_pair(
id,new_vtfs));
2760 console.
Debug() <<
"end TSubLattice<T>::addScalarTriangleField()\n";
2769 console.
XDebug() <<
"begin TSubLattice<T>::addVectorWallField()\n";
2771 string tmp_wallname;
2772 vector<string> wallnames;
2777 m_tml_comm.recv_broadcast_cont(fieldname,0);
2778 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2779 m_tml_comm.recv_broadcast(nwall,0);
2781 for(
int i=0;i<nwall;i++){
2782 m_tml_comm.recv_broadcast_cont(tmp_wallname,0);
2783 wallnames.push_back(tmp_wallname);
2784 console.
XDebug() <<
"recvd. wallname: " << tmp_wallname <<
"\n";
2785 tmp_wallname.clear();
2787 m_tml_comm.recv_broadcast(
id,0);
2791 map<string,CWall*>::iterator cwalliter=m_walls.find(*(wallnames.begin()));
2792 if(cwalliter==m_walls.end()){
2793 std::stringstream msg;
2795 <<
"ERROR in addVectorWallField: wallname '"
2796 << *(wallnames.begin()) <<
" 'invalid. Valid wall names: ";
2797 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
2799 msg <<
"'" << it->first <<
"' ";
2802 throw std::runtime_error(msg.str());
2805 int sumflag=(cwalliter->second)->getFieldSummationFlag(fieldname);
2807 if(m_tml_comm.rank()==1){
2808 m_tml_comm.send(sumflag,0);
2810 m_tml_comm.barrier();
2813 AWallFieldSlave* new_fs=(cwalliter->second)->generateVectorFieldSlave(&m_tml_comm,fieldname);
2816 vector<string>::iterator niter=wallnames.begin();
2817 if(niter!=wallnames.end()) niter++ ;
2818 while(niter!=wallnames.end()){
2819 string wname=*niter;
2820 map<string,CWall*>::iterator
iter=m_walls.find(wname);
2821 if(iter==m_walls.end()){
2822 std::stringstream msg;
2824 <<
"ERROR in addVectorWallField: wallname '"
2825 << wname <<
" 'invalid";
2826 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
2828 msg <<
"'" << it->first <<
"' ";
2832 throw std::runtime_error(msg.str());
2834 new_fs->
addWall(iter->second);
2839 m_field_slaves.insert(make_pair(
id,new_fs));
2841 console.
Error() <<
"ERROR in addVectorWallField: got NULL Slave\n";
2845 console.
XDebug() <<
"end TSubLattice<T>::addVectorWallField()\n";
2854 console.
Debug() <<
"TSubLattice<T>::sendFieldData()\n";
2857 m_tml_comm.recv_broadcast(
id,0);
2858 console.
Debug() <<
"received field id " <<
id <<
" for data collection\n" ;
2859 if(m_field_slaves[
id] !=
NULL)
2861 m_field_slaves[id]->sendData();
2865 cerr <<
"NULL pointer in m_field_slaves!" << endl;
2868 console.
Debug() <<
"end TSubLattice<T>::sendFieldData()\n";
2880 std::streamsize oldprec=oStream.precision(9);
2889 const std::string delim =
"\n";
2892 while (particleIt.hasNext()) {
2893 particleIt.next().saveSnapShotData(oStream);
2900 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
2901 typename NameBondedInteractionsMap::iterator it;
2902 oStream << m_bpis.size() << delim;
2903 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
2904 it->second->saveSnapShotData(oStream);
2909 oStream <<
"TMIG " << m_mesh.size() << delim;
2910 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
2911 tm_iter!=m_mesh.end();
2913 oStream << tm_iter->first << delim;
2914 tm_iter->second->writeCheckPoint(oStream,delim);
2918 oStream.precision(oldprec);
2927 const std::string delim =
"\n";
2931 m_ppa->saveCheckPointData(oStream);
2936 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
2937 typename NameBondedInteractionsMap::iterator it;
2938 oStream << m_bpis.size() << delim;
2939 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
2940 it->second->saveCheckPointData(oStream);
2948 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
2951 if(
iter->second->willSave()) count_save++;
2953 oStream << count_save << delim;
2954 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
2957 if(
iter->second->willSave()) {
2958 iter->second->saveCheckPointData(oStream);
2964 oStream <<
"Walls " << m_walls.size() << delim;
2965 for(map<string,CWall*>::iterator w_iter=m_walls.begin();
2966 w_iter!=m_walls.end();
2968 oStream << w_iter->first << delim;
2969 w_iter->second->writeCheckPoint(oStream,delim);
2973 oStream <<
"TriMesh " << m_mesh.size() << delim;
2974 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
2975 tm_iter!=m_mesh.end();
2977 oStream << tm_iter->first << delim;
2978 tm_iter->second->writeCheckPoint(oStream,delim);
2981 oStream <<
"Mesh2D " << m_mesh2d.size() << delim;
2982 for(
typename map<string,Mesh2D*>::iterator tm_iter=m_mesh2d.begin();
2983 tm_iter!=m_mesh2d.end();
2985 oStream << tm_iter->first << delim;
2986 tm_iter->second->writeCheckPoint(oStream,delim);
2994 m_ppa->loadCheckPointData(iStream);
2999 barrier.
wait(
"PPA rebuild");
3003 unsigned int nr_bonded_ig;
3004 iStream >> nr_bonded_ig;
3008 if(nr_bonded_ig!=m_bpis.size()){
3009 std::cerr <<
"number of bonded interaction groups differ between snapshot and script!" << std::endl;
3011 for (map<string,AParallelInteractionStorage*>::iterator it = m_bpis.begin();
3014 it->second->loadCheckPointData(iStream);
3019 unsigned int nr_nonbonded_ig;
3020 iStream >> nr_nonbonded_ig;
3024 if(nr_nonbonded_ig!=m_dpis.size()){
3025 std::cerr <<
"number of dynamic interaction groups differ between snapshot and script!" << std::endl;
3027 for (map<string,AParallelInteractionStorage*>::iterator it = m_dpis.begin();
3030 it->second->loadCheckPointData(iStream);
3036 if(token!=
"Walls") {
3037 std::cerr <<
"expected Walls , got " << token << std::endl;
3044 for(
int i=0;i<nwalls;i++){
3048 m_walls[wname]=new_wall;
3055 if(token!=
"TriMesh") {
3056 std::cerr <<
"expected TriMesh , got " << token << std::endl;
3061 for(
int i=0;i<nmesh;i++){
3065 m_mesh.insert(make_pair(mname,new_tm));
3069 if(token!=
"Mesh2D") {
3070 std::cerr <<
"expected Mesh2D , got " << token << std::endl;
3075 for(
int i=0;i<nmesh;i++){
3079 m_mesh2d.insert(make_pair(mname,new_m2d));
3092 vector<int> ref_vec;
3102 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3103 if (tm!=m_mesh.end()){
3105 iter!=(tm->second)->corners_end();
3107 ref_vec.push_back(
iter->getID());
3110 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3111 if(m2d!=m_mesh2d.end()){
3113 iter!=(m2d->second)->corners_end();
3115 ref_vec.push_back(
iter->getID());
3118 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3122 m_tml_comm.send_gather(ref_vec,0);
3124 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3134 vector<int> ref_vec;
3144 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3145 if (tm!=m_mesh.end()){
3147 iter!=(tm->second)->triangles_end();
3149 ref_vec.push_back(
iter->getID());
3152 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3153 if(m2d!=m_mesh2d.end()){
3155 iter!=(m2d->second)->edges_end();
3157 ref_vec.push_back(
iter->getID());
3160 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3164 m_tml_comm.send_gather(ref_vec,0);
3166 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3184 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3185 if(m2d!=m_mesh2d.end()){
3186 vector<pair<int,Vec3> > data_vec;
3191 m_tml_comm.send_gather(data_vec,0);
3193 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMesh2DStress() !! \n";
3196 console.
XDebug() <<
"end TSubLattice<T>::getMesh2DStress()\n";
3205 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): enter\n";
3210 const std::string meshName = param_buffer.
pop_string();
3214 map<string,TriMesh*>::iterator m=m_mesh.find(meshName);
3215 if(m != m_mesh.end()){
3216 vector<pair<int,Vec3> > data_vec;
3221 m_tml_comm.send_gather(data_vec,0);
3223 std::stringstream msg;
3224 msg <<
"Invalid mesh name: " << meshName <<
". No such triangular mesh.";
3225 throw std::runtime_error(msg.str().c_str());
3228 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): exit\n";
virtual void addBondedWIG()
Definition: SubLattice.hpp:468
virtual void loadCheckPoint(istream &)
Definition: TriMesh.cpp:285
virtual void moveSingleNode()
Definition: SubLattice.hpp:2043
Definition: LatticeParam.h:29
virtual void printData()
Definition: SubLattice.hpp:2453
virtual Vec3 pop_vector()
Definition: mpibuf.cpp:26
double x0
Definition: FractalFriction.h:40
virtual void addScalarParticleField()
Definition: SubLattice.hpp:2476
double k
Definition: BTriMeshIP.h:21
virtual void printTimes()
Definition: SubLattice.hpp:2460
A convenience class encapsulating an MPI barrier. Includes timing of the wait and a debug message ( v...
Definition: mpibarrier.h:30
virtual void addDirBondedWIG()
Definition: SubLattice.hpp:496
virtual void addScalarTriangleField()
Definition: SubLattice.hpp:2737
virtual void getWallForce()
Definition: SubLattice.hpp:555
void buildFromPPATagged(int, int)
Definition: mesh2d_pis_eb.hpp:357
double k_s
Definition: RotThermFricInteraction.h:51
virtual void addSingleIG()
Definition: SubLattice.hpp:1184
double m_alpha
Definition: SubLattice.h:93
virtual ~TSubLattice()
Definition: SubLattice.hpp:171
double y0
Definition: FractalFriction.h:40
Definition: RotThermParticle.h:54
int m_last_ns
Definition: SubLattice.h:95
virtual int getNumParticles()
Definition: SubLattice.hpp:231
double m_kr
Definition: RotThermElasticInteraction.h:35
double k
Definition: BMesh2DIP.h:19
static const Vec3 ZERO
Definition: vec3.h:52
Definition: RotThermFricInteraction.h:69
void wait(const char *)
Definition: mpibarrier.cpp:32
double dt
Definition: FrictionInteraction.h:41
Interaction parameters for frictional interaction.
Definition: FrictionInteraction.h:27
void setUnbreakable(bool)
Definition: pi_storage_eb.hpp:168
double diffusivity
Definition: RotThermElasticInteraction.h:36
Interaction parameters for bonded interaction.
Definition: BondedInteraction.h:39
TML_Comm m_tml_comm
Definition: SubLattice.h:103
Interaction group parameters for CRotElasticInteractionGroups.
Definition: RotElasticInteraction.h:24
VEC3_INLINE double & Z()
Definition: vec3.h:121
virtual void addScalarInteractionField()
Definition: SubLattice.hpp:2549
double commtime
Definition: SubLattice.h:116
int getNumRemaining() const
Definition: pp_array.hpp:678
VEC3_INLINE double & Y()
Definition: vec3.h:120
Vec3(Edge2D::* VectorFieldFunction)() const
Definition: Edge2D.h:41
void resetDisplacements()
Definition: SubLattice.hpp:1985
bool m_scaling
Definition: FrictionInteraction.h:42
double k_s
Definition: RotFricInteraction.h:75
double m_damp
Definition: LinearDashpotInteraction.h:27
virtual void addShortBondedIG()
Definition: SubLattice.hpp:1421
Slave part for saving a vector field defined on the triangles in a given TriMesh. ...
Definition: VectorTriangleFieldSlave.h:35
virtual void addVectorWallField()
Definition: SubLattice.hpp:2767
CDampingIGP * extractDampingIGP(AMPIBuffer *B)
Definition: DampingIGP.cpp:64
Definition: BodyForceGroup.h:143
int tag
Definition: BondedInteraction.h:53
virtual void receiveBroadcast(int)
Definition: mpivbuf.cpp:262
static ScalarFieldFunction getScalarFieldFunction(const string &)
Definition: Triangle.cpp:296
virtual bool doAddPIG(const string &, const string &, CVarMPIBuffer &, bool tagged=false)
Definition: SubLattice.hpp:660
virtual void exchangePos()
Definition: SubLattice.hpp:1546
virtual void moveParticleTo()
Definition: SubLattice.hpp:2002
double dx
Definition: FractalFriction.h:40
void integrate(double)
Definition: SubLattice.hpp:1683
double mu
Definition: HertzianViscoElasticFrictionInteraction.h:52
Definition: BodyForceGroup.h:99
boost::python::object iter(const boost::python::object &pyOb)
Definition: Util.h:25
Definition: BodyForceGroup.h:26
Class for a group of viscous and elastic interactions between particles and a wall.
Definition: ViscWallIG.h:52
MPI_Comm m_comm
Definition: SubLattice.h:102
Definition: RotThermFricInteraction.h:34
double mu_0
Definition: FractalFriction.h:36
TSubLattice(const esys::lsm::CLatticeParam &prm, int rank, MPI_Comm comm, MPI_Comm worker_comm)
Definition: SubLattice.hpp:110
virtual void addMesh2D()
Definition: SubLattice.hpp:1038
double k_s
Definition: FrictionInteraction.h:40
Interaction parameters for frictional interaction between rotational particles.
Definition: RotFricInteraction.h:37
Definition: pi_storage_ed_t.h:30
double dt
Definition: FractalFriction.h:38
virtual void send()
Definition: mpisgbuf.cpp:221
double mu_s
Definition: RotThermFricInteraction.h:50
bool m_scaling
Definition: BondedInteraction.h:54
double m_A
Definition: HertzianViscoElasticFrictionInteraction.h:49
double packtime
Definition: SubLattice.h:114
double m_force_limit
Definition: CappedBondedInteraction.h:44
class for variable size scatter/gather buffer, leaf component
Definition: mpisgvbuf.h:68
Definition: BodyForceGroup.h:67
Interaction parameters for adhesive frictional interaction.
Definition: AdhesiveFriction.h:21
double mu
Definition: AdhesiveFriction.h:32
Class for a group of bonded, elastic interactions with per-direction spring constants between particl...
Definition: SoftBWallInteractionGroup.h:49
BasicCon & Error(bool h=true)
set verbose level of next message to "err"
Definition: console.cpp:261
virtual void setParticleNonTrans()
Definition: SubLattice.hpp:2265
base class for all walls
Definition: Wall.h:39
virtual void addCappedBondedIG()
Definition: SubLattice.hpp:1347
virtual void rebuildParticleArray()
Definition: SubLattice.hpp:1820
bool hasNext() const
Definition: pp_array.hpp:663
virtual void addElasticWIG()
Definition: SubLattice.hpp:390
parrallel particle storage array with neighborsearch and variable exchange
Definition: SubLattice.h:61
virtual void checkNeighbors()
Definition: SubLattice.hpp:1933
Interaction group parameters for Hertzian elastic interactions.
Definition: HertzianElasticInteraction.h:24
double k_s
Definition: HertzianViscoElasticFrictionInteraction.h:53
vector< Corner2D >::iterator corner_iterator
Definition: Mesh2D.h:58
ParticleIterator getInnerParticleIterator()
Definition: pp_array.hpp:684
vector< Corner >::iterator corner_iterator
Definition: TriMesh.h:66
virtual void addVectorParticleField()
Definition: SubLattice.hpp:2511
Interaction group parameters for CBWallInteractionGroups.
Definition: BWallInteractionGroup.h:38
Definition: ABCDampingIGP.h:23
double r_cut
Definition: AdhesiveFriction.h:35
virtual void setVelocityOfWall()
Definition: SubLattice.hpp:2354
parallel storage array with exchange for dynamically created interactions (friction etc...
Definition: pi_storage_ed.h:30
Abstract Base class for a group of interactions between particles and a wall.
Definition: WallIG.h:30
CSoftBWallIGP * extractSoftBWallIGP(AMPIBuffer *B)
Definition: SoftBWallInteractionGroup.cpp:64
void thermExpansion()
Definition: SubLattice.hpp:1735
virtual void setTaggedParticleVel()
Definition: SubLattice.hpp:2280
virtual void setParticleDensity()
Definition: SubLattice.hpp:2389
Interaction parameters for velocity weakening frictional interaction.
Definition: VWFrictionInteraction.h:22
int nx
Definition: FractalFriction.h:41
double mu_s
Definition: RotFricInteraction.h:74
double brk
Definition: BMesh2DIP.h:20
Interaction group parameters for CEWallInteractionGroups.
Definition: brokenEWallInteractionGroup.h:32
virtual void receiveParticles()
Definition: SubLattice.hpp:317
virtual void getMeshNodeRef()
Definition: SubLattice.hpp:3089
Con console & cout
Definition: console.cpp:30
double brk
Definition: BTriMeshIP.h:22
virtual double pop_double()
Definition: mpivbuf.cpp:210
double k_s
Definition: AdhesiveFriction.h:33
virtual void setParticleNonRot()
Definition: SubLattice.hpp:2249
virtual void applyForceToWall()
Definition: SubLattice.hpp:2334
bool meanR_scaling
Definition: RotFricInteraction.h:79
double m_k
Definition: ElasticInteraction.h:28
virtual void setTimeStepSize(double dt)
Definition: SubLattice.hpp:1639
class for slave part of scalar field defined on tagged particles
Definition: ScalarParticleFieldSlaveTagged.h:32
MPI_Comm m_worker_comm
MPI communicator between workers (excl. master)
Definition: SubLattice.h:104
boost::shared_ptr< double > mu
pointer to the array of friction coeff.
Definition: FractalFriction.h:39
virtual void loadCheckPoint(istream &)
Definition: Mesh2D.cpp:230
virtual std::string pop_string()
Definition: mpivbuf.cpp:233
static VectorFieldFunction getVectorFieldFunction(const string &)
Definition: Triangle.cpp:276
virtual void addTriMesh()
Definition: SubLattice.hpp:897
virtual void initNeighborTable(const Vec3 &, const Vec3 &)
Definition: SubLattice.hpp:199
double unpacktime
Definition: SubLattice.h:115
Particle & next()
Definition: pp_array.hpp:669
void calcHeatTrans()
Definition: SubLattice.hpp:1789
Definition: BMesh2DIP.h:16
bool scaling
Definition: RotFricInteraction.h:77
virtual void addPairIG()
Definition: SubLattice.hpp:614
double m_cutoff
Definition: LinearDashpotInteraction.h:28
virtual void sendDataToMaster()
Definition: SubLattice.hpp:2407
double k
Definition: RotFricInteraction.h:72
virtual void moveWallBy()
Definition: SubLattice.hpp:2296
static VectorFieldFunction getVectorFieldFunction(const string &)
Definition: Edge2D.cpp:101
Interaction group parameters for CElasticInteractionGroups.
Definition: ElasticInteraction.h:24
void buildFromPPATagged(int, int)
Definition: trimesh_pis_eb.hpp:261
virtual void addTaggedPairIG()
Definition: SubLattice.hpp:635
Abstract base class for a group of interactions.
Definition: InteractionGroup.h:34
int ny
array size
Definition: FractalFriction.h:41
abstract base class for parallel interaction storage array
Definition: pi_storage.h:44
Class for parallel storage of interactions between a triangle mesh and particles which doesn't requir...
Definition: trimesh_pis_ne.h:30
void LoadMesh(const vector< MeshNodeData2D > &, const vector< MeshEdgeData2D > &)
Definition: Mesh2D.cpp:35
virtual void translateMeshBy(const std::string &meshName, const Vec3 &translation)
Definition: SubLattice.hpp:2096
CBWallIGP * extractBWallIGP(AMPIBuffer *B)
Definition: BWallInteractionGroup.cpp:56
double mu_d
Definition: RotThermFricInteraction.h:49
Class for parallel storage of interactions between a 2D mesh and particles which doesn't require exch...
Definition: mesh2d_pis_ne.h:29
virtual void addRotThermBondedIG()
Definition: SubLattice.hpp:1411
std::string getWallName() const
Definition: brokenEWallInteractionGroup.h:40
virtual void countParticles()
Definition: SubLattice.hpp:2429
double m_E
Definition: HertzianViscoElasticInteraction.h:28
double diffusivity
Definition: RotThermFricInteraction.h:53
virtual void getTriMeshForce()
Definition: SubLattice.hpp:3203
virtual void addBondedMesh2DIG()
Definition: SubLattice.hpp:1125
Interaction parameters for bonded interaction with a force limit.
Definition: CappedBondedInteraction.h:40
virtual int pop_int()
Definition: mpivbuf.cpp:196
#define NULL
Definition: t_list.h:17
double nrange() const
Definition: LatticeParam.h:42
double m_nu
Definition: HertzianViscoElasticInteraction.h:29
double k
Definition: ETriMeshIP.h:66
virtual void addBondedTriMeshIG()
Definition: SubLattice.hpp:982
Interaction group parameters for CLocalDampingGroup.
Definition: LocalDampingIGP.h:27
virtual void saveCheckPointData(std::ostream &oStream)
Definition: SubLattice.hpp:2925
Interaction group parameters for CDampingGroup.
Definition: DampingIGP.h:27
double k_s
Definition: FractalFriction.h:37
abstract base class for communicator
Definition: comm.h:46
vector< Edge2D >::iterator edge_iterator
Definition: Mesh2D.h:57
Slave part for saving a scalar field defined on the triangles in a given TriMesh. ...
Definition: ScalarTriangleFieldSlave.h:35
class for slave part of scalar field defined on the particles
Definition: VectorParticleFieldSlaveTagged.h:32
virtual void addMesh2DIG()
Definition: SubLattice.hpp:1077
class for slave part of scalar field defined on the particles
Definition: VectorParticleFieldSlave.h:31
void zeroHeat()
Definition: SubLattice.hpp:1747
double dt
Definition: AdhesiveFriction.h:34
BasicCon & Info(bool h=true)
set verbose level of next message to "inf"
Definition: console.cpp:294
ABCDampingIGP * extractABCDampingIGP(AMPIBuffer *B)
Definition: ABCDampingIGP.cpp:49
MPI send/recv buffer with automagically adjusted size.
Definition: mpivbuf.h:34
virtual void removeIG()
Definition: SubLattice.hpp:1510
BasicCon & XDebug(bool h=true)
set verbose level of next message to "xdg"
Definition: console.cpp:316
double mu
Definition: FrictionInteraction.h:39
double m_alpha
Definition: VWFrictionInteraction.h:25
double forcetime
Definition: SubLattice.h:117
Buffer for MPI scatter/gather, leaf component.
Definition: mpisgbuf.h:124
virtual void oneStepTherm()
Definition: SubLattice.hpp:1711
Slave part for saving a vector field defined on the edges in a given Mesh2D.
Definition: VectorEdge2DFieldSlave.h:34
const ProcessDims & processDims() const
Definition: LatticeParam.h:44
Definition: BTriMeshIP.h:18
virtual void tryInsert(const I &)
virtual void searchNeighbors()
Definition: SubLattice.hpp:1864
static BuoyancyIGP extract(CVarMPIBuffer *pBuffer)
Definition: BodyForceGroup.cpp:92
BasicCon & Debug(bool h=true)
set verbose level of next message to "dbg"
Definition: console.cpp:305
void calcForces()
Definition: SubLattice.hpp:1595
CEWallIGP * extractEWallIGP(AMPIBuffer *)
Definition: EWallInteractionGroup.cpp:53
const std::string & Name() const
Definition: IGParam.h:44
virtual void send()
Definition: mpisgvbuf.cpp:287
virtual void addTaggedElasticWIG()
Definition: SubLattice.hpp:426
void integrateTherm(double dt)
Definition: SubLattice.hpp:1726
virtual void sendFieldData()
Definition: SubLattice.hpp:2852
CVWallIGP * extractVWallIGP(AMPIBuffer *B)
Definition: ViscWallIG.cpp:54
void buildFromPPAByGap(double)
Definition: mesh2d_pis_eb.hpp:405
virtual void addDamping()
Definition: SubLattice.hpp:1234
virtual void saveSnapShotData(std::ostream &oStream)
Definition: SubLattice.hpp:2877
parallel storage array with exchange for bonded/breakable interactions
Definition: pi_storage_eb.h:29
double rbreak
Breaking strain.
Definition: BondedInteraction.h:52
virtual void loadCheckPoint(istream &)
Definition: Wall.cpp:128
virtual void receiveConnections()
Definition: SubLattice.hpp:340
double(Triangle::* ScalarFieldFunction)() const
Definition: Triangle.h:51
virtual void addRotBondedIG()
Definition: SubLattice.hpp:1405
TML_Comm m_tml_worker_comm
TML version of the communicator between workers (excl. master)
Definition: SubLattice.h:105
virtual void updateInteractions()
Definition: SubLattice.hpp:1885
virtual void addBondedIG()
Definition: SubLattice.hpp:1300
double dy
origin and grid spacing of the array
Definition: FractalFriction.h:40
const std::string & getName() const
Definition: IGParam.h:42
Class for parallel storage of interactions between a triangle mesh and particles which does require e...
Definition: trimesh_pis_eb.h:29
double mu_d
Definition: RotFricInteraction.h:73
virtual void addWall()
Definition: SubLattice.hpp:371
double k
Definition: RotThermFricInteraction.h:48
Interaction group parameters for CSoftBWallInteractionGroups.
Definition: SoftBWallInteractionGroup.h:31
double m_E
Definition: HertzianElasticInteraction.h:27
esys::lsm::CLatticeParam::ProcessDims m_dims
Definition: SubLattice.h:111
Definition: pi_storage_ne_t.h:30
parallel storage array without exchange for dynamically created single particle interactions (i...
Definition: pi_storage_single.h:26
BasicCon & Critical(bool h=true)
set verbose level of next message to "crt"
Definition: console.cpp:250
static BodyForceIGP extract(CVarMPIBuffer *pBuffer)
Definition: BodyForceGroup.cpp:52
virtual void rebuildInteractions()
Definition: SubLattice.hpp:1829
double alpha() const
Definition: LatticeParam.h:43
virtual void addTriMeshIG()
Definition: SubLattice.hpp:935
virtual void append(int)
Definition: mpisgbuf.cpp:239
CLocalDampingIGP * extractLocalDampingIGP(AMPIBuffer *B)
Definition: LocalDampingIGP.cpp:57
virtual void loadCheckPointData(std::istream &iStream)
Definition: SubLattice.hpp:2991
Definition: pp_array.h:143
Abstract base class for slave part of field defined on a Wall.
Definition: WallFieldSlave.h:33
virtual void getMesh2DStress()
Definition: SubLattice.hpp:3173
void calcHeatFrict()
Definition: SubLattice.hpp:1771
virtual void do2dCalculations(bool do2d)
Definition: SubLattice.hpp:225
double k
Definition: FrictionInteraction.h:38
VEC3_INLINE double & X()
Definition: vec3.h:119
Vec3 getForce() const
Definition: Triangle.h:91
virtual void setWallNormal()
Definition: SubLattice.hpp:2315
vector< Triangle >::iterator triangle_iterator
Definition: TriMesh.h:64
int m_rank
rank in m_comm
Definition: SubLattice.h:101
double m_nu
Definition: HertzianElasticInteraction.h:28
virtual void addVectorInteractionField()
Definition: SubLattice.hpp:2618
virtual void moveTaggedNodes()
Definition: SubLattice.hpp:2072
double m_kr
Definition: RotElasticInteraction.h:31
std::pair< int, Vec3 > getParticlePosn(int particleId)
Definition: SubLattice.hpp:2142
Abstract base class for slave part of field.
Definition: FieldSlave.h:22
virtual void setExIG()
Definition: SubLattice.hpp:1477
Vec3(Triangle::* VectorFieldFunction)() const
Definition: Triangle.h:50
Interaction group parameters for Hertzian viscoelastic interactions with friction.
Definition: HertzianViscoElasticFrictionInteraction.h:27
double m_A
Definition: HertzianViscoElasticInteraction.h:27
class for a triangle mesh
Definition: TriMesh.h:50
virtual void getMeshFaceRef()
Definition: SubLattice.hpp:3131
double m_E
Definition: HertzianViscoElasticFrictionInteraction.h:50
virtual void printStruct()
Definition: SubLattice.hpp:2443
Class for a group of unbonded,elastic interactions between particles and a wall.
Definition: brokenEWallInteractionGroup.h:48
Interaction parameters for frictional interaction with a fractal distribution of the coefficient of f...
Definition: FractalFriction.h:25
double k
Definition: AdhesiveFriction.h:31
Interaction group parameters for Hertzian viscoelastic interactions.
Definition: HertzianViscoElasticInteraction.h:24
double dt
Definition: RotThermFricInteraction.h:52
void buildFromPPAByGap(double)
Definition: trimesh_pis_eb.hpp:306
void LoadMesh(const vector< MeshNodeData > &, const vector< MeshTriData > &)
Definition: TriMesh.cpp:31
Class for a group of bonded,elastic interactions between particles and a wall.
Definition: BWallInteractionGroup.h:56
parallel storage array without exchange for dynamically created interactions (elastic) ...
Definition: pi_storage_ne.h:28
virtual void setParticleNonDynamic()
Definition: SubLattice.hpp:2233
void setComm(MPI_Comm)
Definition: comm.cpp:43
virtual void addVectorTriangleField()
Definition: SubLattice.hpp:2692
virtual void Update(ParallelParticleArray< T > *)=0
virtual void addViscWIG()
Definition: SubLattice.hpp:586
Definition: RotThermElasticInteraction.h:61
Vec3 getForceDensity() const
Definition: Edge2D.h:70
double dt
Definition: HertzianViscoElasticFrictionInteraction.h:54
std::pair< double, int > findParticleNearestTo(const Vec3 &pt)
Definition: SubLattice.hpp:2109
Class for parallel storage of interactions between a 2D mesh and particles which does require exchang...
Definition: mesh2d_pis_eb.h:26
double k
Definition: FractalFriction.h:35
Interaction group parameters for CBWallInteractionGroups.
Definition: ViscWallIG.h:32
Interaction group parameters for Linear Dashpot interactions.
Definition: LinearDashpotInteraction.h:24
std::vector< int > IdVector
Definition: ASubLattice.h:48
virtual void moveTaggedParticlesBy()
Definition: SubLattice.hpp:2019
double m_nu
Definition: HertzianViscoElasticFrictionInteraction.h:51
void zeroForces()
Definition: SubLattice.hpp:1559
virtual bool doAddDamping(const string &, CVarMPIBuffer &)
Definition: SubLattice.hpp:1257
double m_nrange
Definition: SubLattice.h:91
double k
Spring constant.
Definition: BondedInteraction.h:51
virtual void oneStep()
Definition: SubLattice.hpp:1695
bool m_scaling
Definition: ElasticInteraction.h:29
virtual void append(int)
Definition: mpisgvbuf.cpp:319
class for slave part of scalar field defined on the particles
Definition: ScalarParticleFieldSlave.h:31
virtual void moveSingleParticleTo(int particleId, const Vec3 &posn)
Definition: SubLattice.hpp:2033
virtual void setParticleVelocity()
Definition: SubLattice.hpp:2373
virtual void tagParticleNearestTo()
Definition: SubLattice.hpp:2206
double dt
Definition: RotFricInteraction.h:76
std::vector< SimpleParticle > ParticleVector
Definition: SimpleNTable3D.h:22
virtual void getParticleData(const IdVector &particleIdVector)
Definition: SubLattice.hpp:2166
virtual void getWallPos()
Definition: SubLattice.hpp:524
Definition: ETriMeshIP.h:17
void addWall(CWall *)
Definition: WallFieldSlave.cpp:31
Definition: RotThermElasticInteraction.h:23
Class for a group of unbonded,elastic interactions between particles and a wall using only particles ...
Definition: TaggedEWallInteractionGroup.h:31