89 #include <boost/limits.hpp>
90 using std::runtime_error;
120 m_singleParticleInteractions(),
132 m_comm(MPI_COMM_NULL),
133 m_tml_comm(MPI_COMM_NULL),
134 m_worker_comm(MPI_COMM_NULL),
135 m_tml_worker_comm(MPI_COMM_NULL),
175 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): enter\n";
177 <<
"TSubLattice<T>::~TSubLattice():"
178 <<
" deleting wall interaction groups...\n";
196 <<
"TSubLattice<T>::~TSubLattice():"
197 <<
" deleting particle array...\n";
198 if (m_ppa !=
NULL)
delete m_ppa;
199 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): exit\n";
211 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
")\n";
213 double xsize=max.
X()-min.
X();
214 xsize=m_nrange*ceil(xsize/m_nrange);
215 double ysize=max.Y()-min.
Y();
216 ysize=m_nrange*ceil(ysize/m_nrange);
217 double zsize=max.Z()-min.
Z();
218 zsize=m_nrange*ceil(zsize/m_nrange);
219 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
220 Vec3 nmin=min-0.5*grow;
221 Vec3 nmax=max+0.5*grow;
222 console.
XDebug() <<
"range=" << m_nrange <<
", new min,max: " << nmin <<
", " << nmax <<
"\n";
231 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable\n";
237 T::setDo2dCalculations(do2d);
243 return m_ppa->getInnerSize();
256 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
") circ\n";
257 double xsize,ysize,zsize;
262 xsize=max.
X()-min.
X();
263 if(fabs(xsize/m_nrange-lrint(xsize/m_nrange))>1e-6)
266 console.
Info() <<
"Circular x-size incompatible with range, adjusting...\n";
267 m_nrange = xsize/floor(xsize/m_nrange);
268 console.
Info() <<
"New range = " << m_nrange <<
"\n";
274 xsize=max.X()-min.
X();
275 xsize=m_nrange*ceil(xsize/m_nrange);
280 ysize=max.Y()-min.
Y();
281 if(fabs(ysize/m_nrange-lrint(ysize/m_nrange))>1e-6)
289 ysize=max.Y()-min.
Y();
290 ysize=m_nrange*ceil(ysize/m_nrange);
295 zsize=max.Z()-min.
Z();
296 if(fabs(zsize/m_nrange-lrint(zsize/m_nrange))>1e-6)
304 zsize=max.Z()-min.
Z();
305 zsize=m_nrange*ceil(zsize/m_nrange);
307 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
308 Vec3 nmin=min-0.5*grow;
309 Vec3 nmax=max+0.5*grow;
310 console.
XDebug() <<
"range, new min, max: " << m_nrange <<
" " << nmin << nmax <<
"\n";
317 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable (circ)\n";
329 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: enter\n";
331 vector<T> recv_buffer;
334 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
335 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" particles \n";
336 m_ppa->insert(recv_buffer);
338 barrier.
wait(
"TSubLattice<T>::receiveParticles");
340 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: exit\n";
352 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: enter\n";
354 vector<int> recv_buffer;
357 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
358 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" connections \n";
359 vector<int>::iterator it;
360 for (it = recv_buffer.begin(); it != recv_buffer.end(); it+=3)
362 if ( (m_ppa->getParticlePtrByIndex( *(it+1)) ==
NULL ) ||
363 (m_ppa->getParticlePtrByIndex( *(it+2)) ==
NULL ) )
367 m_temp_conn[*(it)].push_back(*(it+1));
368 m_temp_conn[*(it)].push_back(*(it+2));
371 barrier.
wait(
"TSubLattice<T>::receiveConnections");
373 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: exit\n";
391 m_walls[name]=
new CWall(ipos,inorm);
402 console.
XDebug() <<
"TSubLattice<T>::addSphereBody: enter\n" ;
412 console.
XDebug() <<
"TSubLattice<T>::addSphereBody: exit\n" ;
421 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: enter\n" ;
430 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
431 if(iter!=m_walls.end()){
439 m_WIG.insert(make_pair(wigp->
getName(),newCEWIG));
441 std::stringstream msg;
442 msg <<
"wall name '" << wallname <<
"' not found in map of walls";
443 throw std::runtime_error(msg.str().c_str());
447 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: exit\n" ;
456 console.
XDebug() <<
"TSubLattice<T>::addESphereBodyIG: enter\n" ;
465 map<string,CSphereBody*>::iterator
iter=m_spheres.find(wallname);
466 if(iter!=m_spheres.end()){
474 m_SIG.insert(make_pair(wigp->
getName(),newCEWIG));
476 std::stringstream msg;
477 msg <<
"sphere body name '" << wallname <<
"' not found in map of sphere bodies";
478 throw std::runtime_error(msg.str().c_str());
482 console.
XDebug() <<
"TSubLattice<T>::addESphereBodyIG: exit\n" ;
491 console.
XDebug() <<
"TSubLattice<T>::addTaggedElasticWIG: enter\n" ;
498 int tag=param_buffer.
pop_int();
499 int mask=param_buffer.
pop_int();
503 console.
XDebug() << wallname <<
" tag= " << tag <<
" mask= " << mask <<
"\n" ;
504 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
505 if(iter!=m_walls.end()){
515 m_WIG.insert(make_pair(wigp->getName(),newCTEWIG));
517 std::stringstream msg;
518 msg <<
"wall name '" << wallname <<
"' not found in map of walls";
519 throw std::runtime_error(msg.str().c_str());
523 console.
XDebug() <<
"TSubLattice<T>::addTaggedElasticWIG: exit\n" ;
533 console.
XDebug() <<
"TSubLattice<T>::addBondedWIG: enter\n" ;
542 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
543 if(iter!=m_walls.end()){
546 m_WIG.insert(make_pair(wigp->
getName(),newCBWIG));
548 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
561 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: enter\n" ;
570 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
571 if(iter!=m_walls.end()){
574 m_WIG.insert(make_pair(wigp->
getName(),newCDWIG));
576 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
580 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: exit\n" ;
589 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: enter\n" ;
600 map<string,CWall*>::iterator
iter=m_walls.find(wname);
601 if(iter!=m_walls.end()){
602 pos=(iter->second)->getPos();
605 pos=
Vec3(0.0,0.0,0.0);
610 m_tml_comm.send_gather(vpos,0);
611 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: exit\n" ;
620 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyPosition: enter\n" ;
631 map<string,CSphereBody*>::iterator
iter=m_spheres.find(wname);
632 if(iter!=m_spheres.end()){
633 pos=(iter->second)->getPos();
636 pos=
Vec3(0.0,0.0,0.0);
641 m_tml_comm.send_gather(vpos,0);
642 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyPosition: exit\n" ;
651 console.
XDebug() <<
"TSubLattice<T>::getWallForce: enter\n" ;
662 map<string,CWall*>::iterator
iter=m_walls.find(wname);
663 if(iter!=m_walls.end()){
664 force=(iter->second)->getForce();
667 force=
Vec3(0.0,0.0,0.0);
671 vforce.push_back(force);
672 m_tml_comm.send_gather(vforce,0);
682 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyForce: enter\n" ;
693 map<string,CSphereBody*>::iterator
iter=m_spheres.find(wname);
694 if(iter!=m_spheres.end()){
695 force=(iter->second)->getForce();
698 force=
Vec3(0.0,0.0,0.0);
702 vforce.push_back(force);
703 m_tml_comm.send_gather(vforce,0);
704 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyForce: exit\n" ;
722 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
723 if(iter!=m_walls.end()){
726 m_WIG.insert(make_pair(wigp->
getName(),newCVWIG));
728 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
751 doAddPIG(name,type,param_buffer,
false);
772 doAddPIG(name,type,param_buffer,
true);
774 console.
XDebug() <<
"end TSubLattice<T>::addTaggedPairIG()\n";
790 if(type==
"Elastic") {
795 int tag1=param_buffer.
pop_int();
796 int mask1=param_buffer.
pop_int();
797 int tag2=param_buffer.
pop_int();
798 int mask2=param_buffer.
pop_int();
800 << tag1 <<
" , " << mask1 <<
" , "
801 << tag2 <<
" , " << mask2 <<
"\n";
807 }
else if (type==
"Friction") {
815 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
818 }
else if (type==
"AdhesiveFriction") {
826 <<
"k,mu,k_s,dt,r_cut: " << figp.
k <<
" , " << figp.
mu <<
" , "
827 << figp.
k_s <<
" , " << figp.
dt <<
" " << figp.
r_cut <<
"\n";
830 }
else if (type==
"FractalFriction") {
837 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
845 <<
"x0,y0,dx,dy,nx,ny: "
846 << figp.
x0 <<
" , " << figp.
y0 <<
" , "
847 << figp.
dx <<
" , " << figp.
dy <<
" ,"
848 << figp.
nx <<
" , " << figp.
ny <<
"\n";
849 figp.
mu = boost::shared_ptr<double>(
new double[figp.
nx*figp.
ny]);
851 for(
int i=0;i<figp.
nx*figp.
ny;i++)
858 }
else if(type==
"VWFriction") {
867 <<
"k,mu,k_s,dt,alpha: " << figp.
k <<
" , " << figp.
mu <<
" , "
868 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
871 }
else if(type==
"RotElastic"){
876 }
else if (type==
"RotFriction"){
886 <<
"k,mu_s,mu_d,k_s,dt,scaling: " << rfigp.
k <<
" , "
887 << rfigp.
mu_s <<
" , " << rfigp.
mu_d <<
" , "
888 << rfigp.
k_s <<
" , " << rfigp.
dt <<
" , " << rfigp.
scaling <<
"\n";
890 int tag1=param_buffer.
pop_int();
891 int mask1=param_buffer.
pop_int();
892 int tag2=param_buffer.
pop_int();
893 int mask2=param_buffer.
pop_int();
895 << tag1 <<
" , " << mask1 <<
" , "
896 << tag2 <<
" , " << mask2 <<
"\n";
902 }
else if (type ==
"RotThermElastic") {
907 <<
"k=" << eigp.
m_kr <<
" , "
919 }
else if (type ==
"RotThermFriction") {
928 <<
"k=" << rfigp.
k <<
" , "
929 <<
"mu_d=" << rfigp.
mu_d <<
" , "
930 <<
"mu_s=" << rfigp.
mu_s <<
" , "
931 <<
"k_s=" << rfigp.
k_s <<
" , "
933 <<
"dt=" << rfigp.
dt <<
"\n";
944 }
else if(type==
"HertzianElastic") {
949 int tag1=param_buffer.
pop_int();
950 int mask1=param_buffer.
pop_int();
951 int tag2=param_buffer.
pop_int();
952 int mask2=param_buffer.
pop_int();
958 }
else if(type==
"HertzianViscoElasticFriction") {
967 int tag1=param_buffer.
pop_int();
968 int mask1=param_buffer.
pop_int();
969 int tag2=param_buffer.
pop_int();
970 int mask2=param_buffer.
pop_int();
976 }
else if(type==
"HertzianViscoElastic") {
982 int tag1=param_buffer.
pop_int();
983 int mask1=param_buffer.
pop_int();
984 int tag2=param_buffer.
pop_int();
985 int mask2=param_buffer.
pop_int();
991 }
else if(type==
"LinearDashpot") {
996 int tag1=param_buffer.
pop_int();
997 int mask1=param_buffer.
pop_int();
998 int tag2=param_buffer.
pop_int();
999 int mask2=param_buffer.
pop_int();
1006 cerr <<
"Unknown interaction group name "
1008 <<
" in TSubLattice<T>::addPairIG()" << endl;
1012 if(res) m_dpis.insert(make_pair(name,new_pis));
1029 vector<MeshNodeData> node_recv_buffer;
1030 vector<MeshTriData> tri_recv_buffer;
1037 console.
XDebug()<<
"TriMesh name: " << name.c_str() <<
"\n";
1040 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
1041 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
1044 m_tml_comm.recv_broadcast_cont_packed(tri_recv_buffer,0);
1045 console.
XDebug() <<
"recvd " << tri_recv_buffer.size() <<
" triangles \n";
1049 new_tm->
LoadMesh(node_recv_buffer,tri_recv_buffer);
1051 m_mesh.insert(make_pair(name,new_tm));
1072 console.
XDebug()<<
"TriMeshIG type: " << type.c_str() <<
"\n";
1074 console.
XDebug()<<
"TriMeshIG name: " << name.c_str() <<
"\n";
1076 console.
XDebug()<<
"TriMeshIG mesh name: " << meshname.c_str() <<
"\n";
1080 if (m_mesh.find(meshname) != m_mesh.end())
1082 tmp = m_mesh[meshname];
1085 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
1094 m_dpis.insert(make_pair(name,new_pis));
1096 throw runtime_error(
"unknown type in TSubLattice<T>::addTriMeshIG:" + type);
1109 console.
XDebug() <<
"TSubLattice<T>::addBondedTriMeshIG()\n";
1120 console.
XDebug()<<
"BTriMeshIG name: " << name.c_str() <<
"\n";
1122 console.
XDebug()<<
"BTriMeshIG mesh name: " << meshname.c_str() <<
"\n";
1127 string buildtype = param_buffer.
pop_string();
1128 console.
XDebug()<<
"BTriMeshIG build type: " << buildtype.c_str() <<
"\n";
1132 if (m_mesh.find(meshname) != m_mesh.end())
1134 tmp = m_mesh[meshname];
1137 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
1143 if(buildtype==
"BuildByTag"){
1144 int tag=param_buffer.
pop_int();
1145 int mask=param_buffer.
pop_int();
1147 m_bpis.insert(make_pair(name,new_pis));
1148 }
else if(buildtype==
"BuildByGap"){
1151 m_bpis.insert(make_pair(name,new_pis));
1153 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedTriMeshIG:" + buildtype);
1156 console.
XDebug() <<
"end TSubLattice<T>::addBondedTriMeshIG()\n";
1170 vector<MeshNodeData2D> node_recv_buffer;
1171 vector<MeshEdgeData2D> edge_recv_buffer;
1181 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
1182 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
1185 m_tml_comm.recv_broadcast_cont_packed(edge_recv_buffer,0);
1186 console.
XDebug() <<
"recvd " << edge_recv_buffer.size() <<
" edges \n";
1190 new_tm->
LoadMesh(node_recv_buffer,edge_recv_buffer);
1192 m_mesh2d.insert(make_pair(name,new_tm));
1214 console.
XDebug()<<
"Mesh2DIG type: " << type.c_str() <<
"\n";
1216 console.
XDebug()<<
"Mesh2DIG name: " << name.c_str() <<
"\n";
1218 console.
XDebug()<<
"Mesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1222 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1224 tmp = m_mesh2d[meshname];
1227 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addMesh2DIG:" + meshname);
1236 m_dpis.insert(make_pair(name,new_pis));
1238 throw runtime_error(
"unknown type in TSubLattice<T>::addMesh2DIG:" + type);
1252 console.
XDebug() <<
"TSubLattice<T>::addBondedMesh2DIG()\n";
1263 console.
XDebug() <<
"BMesh2DIG name: " << name.c_str() <<
"\n";
1265 console.
XDebug() <<
"BMesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1270 string buildtype = param_buffer.
pop_string();
1271 console.
XDebug() <<
"BMesh2DIG build type: " << buildtype.c_str() <<
"\n";
1275 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1277 tmp = m_mesh2d[meshname];
1280 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addBondedMesh2DIG:" + meshname);
1286 if(buildtype==
"BuildByTag"){
1287 int tag=param_buffer.
pop_int();
1288 int mask=param_buffer.
pop_int();
1290 m_bpis.insert(make_pair(name,new_pis));
1291 }
else if(buildtype==
"BuildByGap"){
1294 m_bpis.insert(make_pair(name,new_pis));
1296 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedMesh2DIG:" + buildtype);
1299 console.
XDebug() <<
"end TSubLattice<T>::addBonded2DMeshIG()\n";
1321 if(type==
"Gravity"){
1325 m_singleParticleInteractions.insert(
1332 else if (type==
"Buoyancy"){
1336 m_singleParticleInteractions.insert(
1344 throw std::runtime_error(
1345 std::string(
"Trying to setup SIG of unknown type: ")
1367 console.
XDebug()<<
"Damping type: " << type.c_str() <<
"\n";
1370 doAddDamping(type,param_buffer);
1385 string damping_name;
1392 damping_name=
"Damping";
1394 }
else if (type==
"ABCDamping"){
1397 damping_name=params->
getName();
1399 }
else if (type==
"LocalDamping"){
1402 damping_name=params->
getName();
1405 std::stringstream msg;
1406 msg <<
"Trying to setup Damping of unknown type: " << type;
1408 throw std::runtime_error(msg.str());
1414 m_damping.insert(make_pair(damping_name,DG));
1415 m_damping[damping_name]->update();
1440 <<
"Got BondedIG parameters: " << param.
tag
1441 <<
" " << name.c_str() <<
" "
1442 << param.
k <<
" " << param.
rbreak <<
"\n";
1453 vector<int> vi(2,-1);
1454 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1456 vi[0] = (m_temp_conn[param.
tag][i]);
1457 vi[1] = (m_temp_conn[param.
tag][i+1]);
1462 m_bpis.insert(make_pair(name,B_PIS));
1474 console.
XDebug() <<
"TSubLattice<T>::addCappedBondedIG()\n";
1479 int tag=param_buffer.
pop_int();
1486 <<
"Got CappedBondedIG parameters: " << tag
1487 <<
" " << name.c_str() <<
" "
1488 << k <<
" " << rbreak <<
" " << maxforce <<
"\n";
1515 vector<int> vi(2,-1);
1516 for(
size_t i=0;i<m_temp_conn[tag].size();i+=2)
1518 vi[0] = (m_temp_conn[tag][i]);
1519 vi[1] = (m_temp_conn[tag][i+1]);
1524 m_bpis.insert(make_pair(name,B_PIS));
1526 console.
XDebug() <<
"end TSubLattice<T>::addCappedBondedIG()\n";
1532 console.
Error() <<
"TSubLattice<T>::addRotBondedIG() => trying to add rotational bonded IG to nonrotational model\n";
1538 console.
Error() <<
"TSubLattice<T>::addRotThermBondedIG() => trying to add rotational thermal bonded IG to nonrotational model\n";
1553 int tag=param_buffer.
pop_int();
1559 <<
"Got ShortBondedIG parameters: " << tag
1560 <<
" " << name.c_str() <<
" "
1561 << k <<
" " << rbreak <<
"\n";
1582 vector<int> vi(2,-1);
1583 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1585 vi[0] = (m_temp_conn[param.
tag][i]);
1586 vi[1] = (m_temp_conn[param.
tag][i+1]);
1591 m_bpis.insert(make_pair(name,B_PIS));
1593 console.
XDebug() <<
"end TSubLattice<T>::addShortBondedIG()\n";
1613 map<string,AParallelInteractionStorage*>::iterator bonded_ig=m_bpis.find(s1);
1614 map<string,AParallelInteractionStorage*>::iterator dynamic_ig=m_dpis.find(s2);
1615 if((bonded_ig!=m_bpis.end())&&(dynamic_ig!=m_dpis.end()))
1619 dynamic_ig->second->addExIG(bonded_ig->second);
1623 console.
Error() <<
"TSubLattice<T>::setExIG() - nonexisting interaction group \n";
1645 map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.find(igname);
1647 if(iter!=m_dpis.end()){
1649 delete m_dpis[igname];
1653 typename map<string,AWallInteractionGroup<T>*>::iterator it2=m_WIG.find(igname);
1654 if(it2!=m_WIG.end()){
1656 delete m_WIG[igname];
1662 console.
Error() <<
"TSubLattice<T>::removeIG() - nonexisting interaction group - ignore removal\n";
1675 m_ppa->exchange(&T::getExchangeValues,&T::setExchangeValues);
1689 m_ppa->forAllParticles(&T::zeroForce);
1691 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1694 (
iter->second)->zeroForces();
1698 for(map<string,Mesh2D*>::iterator
iter=m_mesh2d.begin();
1699 iter!=m_mesh2d.end();
1701 (
iter->second)->zeroForces();
1704 for(
typename map<string,CWall*>::iterator
iter=m_walls.begin();
1705 iter!=m_walls.end();
1708 (
iter->second)->zeroForce();
1711 for(
typename map<string,CSphereBody*>::iterator
iter=m_spheres.begin();
1712 iter!=m_spheres.end();
1715 (
iter->second)->zeroForce();
1734 (it->second)->calcForces();
1739 (it->second)->calcForces();
1743 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1744 siter != m_singleParticleInteractions.end();
1748 (siter->second)->calcForces();
1751 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1753 (
iter->second)->calcForces();
1756 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1758 (
iter->second)->calcForces();
1761 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1763 (
iter->second)->calcForces();
1784 (it->second)->setTimeStepSize(dt);
1789 (it->second)->setTimeStepSize(dt);
1793 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1794 siter != m_singleParticleInteractions.end();
1798 (siter->second)->setTimeStepSize(dt);
1801 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1803 (
iter->second)->setTimeStepSize(dt);
1806 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1808 (
iter->second)->setTimeStepSize(dt);
1811 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1813 (
iter->second)->setTimeStepSize(dt);
1816 console.
XDebug() <<
"end TSubLattice<T>::setTimeStepSize() \n";
1828 m_ppa->forAllParticles(&T::integrate,dt);
1829 m_ppa->forAllParticles(&T::rescale) ;
1843 if (this->getParticleType() ==
"RotTherm")
1845 this->oneStepTherm();
1858 integrateTherm(m_dt);
1871 m_ppa->forAllParticles(&T::integrateTherm,dt);
1873 console.
XDebug() <<
"end TSubLattice<T>::integrateTherm \n";
1880 m_ppa->forAllParticles(&T::thermExpansion);
1882 console.
XDebug() <<
"end TSubLattice<T>::thermExpansion() \n";
1894 m_ppa->forAllParticles(&T::zeroHeat);
1919 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1924 (
iter->second)->calcHeatFrict();
1927 console.
XDebug() <<
"end TSubLattice<T>::calcHeatFrict() \n";
1938 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1943 (
iter->second)->calcHeatTrans();
1947 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1952 (
iter->second)->calcHeatTrans();
1955 console.
XDebug() <<
"end TSubLattice<T>::calcHeatTrans() \n";
1974 m_pTimers->start(
"RebuildInteractions");
1975 m_pTimers->resume(
"NeighbourSearch");
1976 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1980 console.
Debug() <<
"exchg & rebuild BPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
1981 (
iter->second)->exchange();
1982 (
iter->second)->rebuild();
1985 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1989 console.
Debug() <<
"exchg & rebuild DPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
1990 (
iter->second)->exchange();
1991 m_pTimers->pause(
"RebuildInteractions");
1992 m_pTimers->pause(
"NeighbourSearch");
1993 barrier.
wait(
"dpis::exchange");
1994 m_pTimers->resume(
"RebuildInteractions");
1995 m_pTimers->resume(
"NeighbourSearch");
1996 (
iter->second)->rebuild();
1998 resetDisplacements();
1999 m_pTimers->stop(
"RebuildInteractions");
2008 console.
Debug() <<
"CSubLattice<T>::searchNeighbors()\n";
2010 m_pTimers->start(
"NeighbourSearch");
2011 m_pTimers->start(
"RebuildParticleArray");
2012 rebuildParticleArray();
2013 m_pTimers->stop(
"RebuildParticleArray");
2014 m_pTimers->pause(
"NeighbourSearch");
2015 barrier.
wait(
"PPA rebuild");
2016 rebuildInteractions();
2017 m_pTimers->stop(
"NeighbourSearch");
2018 console.
Debug() <<
"end CSubLattice<T>::searchNeighbors()\n";
2030 console.
Debug() <<
"m_ppa->getTimeStamp() " << m_ppa->getTimeStamp() <<
" m_last_ns " << m_last_ns <<
"\n";
2031 bool need_update=
false;
2033 m_pTimers->start(
"UpdateBondedInteractions");
2034 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
2038 bool n=(
iter->second)->update();
2039 need_update=need_update || n;
2041 m_pTimers->stop(
"UpdateBondedInteractions");
2042 if((m_ppa->getTimeStamp() > m_last_ns) || need_update)
2044 m_pTimers->start(
"UpdateDynamicInteractions");
2045 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
2049 bool n=(
iter->second)->update();
2050 need_update=need_update || n;
2052 m_pTimers->stop(
"UpdateDynamicInteractions");
2057 (it->second)->Update(m_ppa);
2063 (it->second)->Update(m_ppa);
2065 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
2066 iter!=m_damping.end();
2068 (
iter->second)->update();
2070 m_last_ns=m_ppa->getTimeStamp();
2073 console.
Debug() <<
"end TSubLattice<T>::updateInteractions()\n";
2083 console.
Debug() <<
"TSubLattice<T>::checkNeighbors()\n";
2086 double alpha=0.5*m_alpha;
2087 double srsqr=alpha*alpha;
2093 m_ppa->forAllParticlesGet(displ,&T::getDisplacement);
2096 vector<Vec3>::iterator it=displ.begin();
2097 while((it!=displ.end())&&(mdsqr<srsqr))
2099 double sqdisp=(*it)*(*it);
2100 mdsqr = ((mdsqr < sqdisp) ? sqdisp : mdsqr);
2104 console.
XDebug() <<
"max squared displacement " << mdsqr <<
"alpha^2 = " << srsqr <<
"\n";
2114 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
2118 if(
iter->second->hasMovedBy(alpha)){
2125 console.
Debug() <<
"end TSubLattice<T>::checkNeighbors()\n";
2135 console.
Debug() <<
"slave " << m_rank <<
" resetDisplacements()\n";
2136 m_ppa->forAllParticles(&T::resetDisplacement);
2137 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
2140 iter->second->resetCurrentDisplacement();
2142 console.
Debug() <<
"slave " << m_rank <<
" end resetDisplacements()\n";
2152 console.
Debug() <<
"TSubLattice<T>::moveParticleTo()\n";
2158 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::moveToRel),mv);
2159 console.
Debug() <<
"end TSubLattice<T>::moveParticleTo()\n";
2169 console.
Debug() <<
"TSubLattice<T>::moveTaggedParticlesBy()\n";
2173 const int tag = buffer.
pop_int();
2175 m_ppa->forParticleTag(tag, (
void (T::*)(
Vec3))(&T::moveBy),dx);
2176 console.
Debug() <<
"end TSubLattice<T>::moveTaggedParticlesBy()\n";
2183 m_ppa->forParticle(particleId, (
void (T::*)(
Vec3))(&T::moveTo), posn);
2193 console.
Debug() <<
"TSubLattice<T>::moveSingleNode()\n";
2201 console.
XDebug() <<
"name :" << name <<
" id : " <<
id <<
" disp " << disp <<
"\n";
2203 map<string,TriMesh*>::iterator tm=m_mesh.find(name);
2204 if (tm!=m_mesh.end()){
2205 (tm->second)->moveNode(
id,disp);
2207 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(name);
2208 if(m2d!=m_mesh2d.end()){
2209 (m2d->second)->moveNode(
id,disp);
2212 console.
Debug() <<
"end TSubLattice<T>::moveSingleNode()\n";
2222 console.
Error() <<
"TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n";
2225 "TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n"
2246 map<string,TriMesh*>::iterator tm=m_mesh.find(meshName);
2247 if (tm != m_mesh.end()){
2248 (tm->second)->translateBy(translation);
2250 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshName);
2251 if(m2d!=m_mesh2d.end()){
2252 (m2d->second)->translateBy(translation);
2259 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: enter\n";
2260 const T *pClosest =
NULL;
2261 double minDistSqrd = std::numeric_limits<double>::max();
2264 m_ppa->getInnerParticleIterator();
2267 const T &p = it.
next();
2268 const double distSqrd = (pt - p.getPos()).norm2();
2269 if (distSqrd < minDistSqrd)
2271 minDistSqrd = distSqrd;
2275 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: exit\n";
2280 std::make_pair(sqrt(minDistSqrd), pClosest->getID())
2282 std::make_pair(std::numeric_limits<double>::max(), -1)
2292 const T *particle =
NULL;
2294 m_ppa->getInnerParticleIterator();
2297 const T &p = it.
next();
2298 if (p.getID() == particleId)
2303 if (particle !=
NULL)
2305 return std::make_pair(particleId, particle->getPos());
2317 <<
"TSubLattice<T>::getParticleData: enter\n";
2318 typedef std::set<int> IdSet;
2321 ParticleVector particleVector;
2323 m_ppa->getInnerParticleIterator();
2324 if (particleIdVector.size() > 0)
2326 IdSet idSet(particleIdVector.begin(), particleIdVector.end());
2328 <<
"TSubLattice<T>::getParticleData: iterating over particles\n";
2331 const T &p = it.
next();
2332 if (idSet.find(p.getID()) != idSet.end())
2334 particleVector.push_back(p);
2340 m_ppa->getAllInnerParticles(particleVector);
2343 <<
"TSubLattice<T>::getParticleData:"
2344 <<
" sending particle data of size " << particleVector.size() <<
"\n";
2345 m_tml_comm.send_gather_packed(particleVector, 0);
2347 <<
"TSubLattice<T>::getParticleData: exit\n";
2356 console.
Debug() <<
"TSubLattice<T>::tagParticleNearestTo()\n";
2365 T* part_ptr=m_ppa->getParticlePtrByPosition(pos);
2367 int old_tag=part_ptr->getTag();
2368 int new_tag=(old_tag & (~mask)) | (tag & mask);
2369 part_ptr->setTag(new_tag);
2371 cout <<
"pos, realpos: " << pos <<
" " << part_ptr->getPos() <<
" old tag, new tag " << old_tag <<
" " << part_ptr->getTag() << endl;
2373 console.
Debug() <<
"end TSubLattice<T>::tagParticleNearestTo()\n";
2383 console.
Debug() <<
"TSubLattice<T>::setParticleNonDynamic()\n";
2388 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamic));
2389 console.
Debug() <<
"end TSubLattice<T>::setParticleNonDynamic()\n";
2399 console.
Debug() <<
"TSubLattice<T>::setParticleNonRot()\n";
2404 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicRot));
2405 console.
Debug() <<
"end TSubLattice<T>::setParticleNonRot()\n";
2415 console.
Debug() <<
"TSubLattice<T>::setParticleNonTrans()\n";
2420 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicLinear));
2421 console.
Debug() <<
"end TSubLattice<T>::setParticleNonTrans()\n";
2430 console.
Debug() <<
"TSubLattice<T>::setTaggedParticleVel()\n";
2436 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::setVel),v);
2437 console.
XDebug() <<
"end TSubLattice<T>::setTaggedParticleVel()\n";
2452 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2453 if(iter!=m_walls.end())
2455 (iter->second)->moveBy(mv);
2471 typename map<string,CSphereBody*>::iterator
iter=m_spheres.find(wname);
2472 if(iter!=m_spheres.end())
2474 (iter->second)->moveBy(mv);
2490 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2491 if(iter!=m_walls.end())
2493 (iter->second)->setNormal(wn);
2509 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2510 if(iter!=m_WIG.end())
2512 (iter->second)->applyForce(f);
2523 console.
XDebug() <<
"TSubLattice<T>::setVelocityOfWall()\n";
2529 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2530 if(iter!=m_WIG.end())
2532 (iter->second)->setVelocity(v);
2542 console.
Debug() <<
"TSubLattice<T>::setParticleVelocity()\n";
2548 m_ppa->forParticle(
id,(
void (T::*)(
Vec3))(&T::setVel),mv);
2549 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2558 console.
Debug() <<
"TSubLattice<T>::setParticleDensity()\n";
2565 m_ppa->forParticleTagMask(tag,mask,(
void (T::*)(
double))(&T::setDensity),rho);
2566 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2576 console.
Debug() <<
"TSubLattice<T>::sendDataToMaster()\n";
2577 vector<Vec3> positions;
2578 vector<double> radii;
2581 m_ppa->forAllParticlesGet(positions,(
Vec3 (T::*)()
const)(&T::getPos));
2582 m_ppa->forAllParticlesGet(radii,(
double (T::*)()
const)(&T::getRad));
2583 m_ppa->forAllParticlesGet(ids,(
int (T::*)()
const)(&T::getID));
2585 m_tml_comm.send_gather(positions,0);
2586 m_tml_comm.send_gather(radii,0);
2587 m_tml_comm.send_gather(ids,0);
2589 console.
Debug() <<
"end TSubLattice<T>::sendDataToMaster()\n";
2601 buffer.
append(m_ppa->size());
2612 cout<<
"My Rank : " << m_rank <<
"\n" ;
2615 cout << *m_ppa << endl;
2622 cout <<
"Data: my rank : " << m_rank <<
"particles : \n" ;
2623 m_ppa->forAllParticles((
void (T::*)())(&T::print));
2629 console.
Debug() <<
"time spent calculating force : " << forcetime <<
" sec\n";
2630 console.
Debug() <<
"time spent communicating : " << commtime <<
" sec\n";
2631 console.
Debug() <<
"time spent packing : " << packtime <<
" sec\n";
2632 console.
Debug() <<
"time spent unpacking : " << unpacktime <<
" sec\n";
2649 m_tml_comm.recv_broadcast_cont(fieldname,0);
2651 m_tml_comm.recv_broadcast(
id,0);
2653 m_tml_comm.recv_broadcast(is_tagged,0);
2656 typename T::ScalarFieldFunction rdf=T::getScalarFieldFunction(fieldname);
2665 m_tml_comm.recv_broadcast(tag,0);
2667 m_tml_comm.recv_broadcast(mask,0);
2671 m_field_slaves.insert(make_pair(
id,new_spfs));
2680 console.
XDebug() <<
"TSubLattice<T>::addVectorParticleField\n";
2684 m_tml_comm.recv_broadcast_cont(fieldname,0);
2685 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2686 m_tml_comm.recv_broadcast(
id,0);
2688 m_tml_comm.recv_broadcast(is_tagged,0);
2689 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2691 typename T::VectorFieldFunction rdf=T::getVectorFieldFunction(fieldname);
2700 m_tml_comm.recv_broadcast(tag,0);
2702 m_tml_comm.recv_broadcast(mask,0);
2706 m_field_slaves.insert(make_pair(
id,new_vpfs));
2708 console.
Debug() <<
"end TSubLattice<T>::addVectorParticleField\n";
2718 console.
XDebug() <<
"TSubLattice<T>::addScalarInteractionField\n";
2722 int id,is_tagged,tag,mask,is_checked;
2724 m_tml_comm.recv_broadcast_cont(fieldname,0);
2725 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2726 m_tml_comm.recv_broadcast(
id,0);
2728 m_tml_comm.recv_broadcast_cont(igname,0);
2729 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2730 m_tml_comm.recv_broadcast_cont(igtype,0);
2731 console.
XDebug() <<
"recvd. interaction group name: " << igtype <<
"\n";
2732 m_tml_comm.recv_broadcast(is_tagged,0);
2733 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2736 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2739 m_tml_comm.recv_broadcast(tag,0);
2740 m_tml_comm.recv_broadcast(mask,0);
2742 m_tml_comm.recv_broadcast(is_checked,0);
2743 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2745 if(it!=m_dpis.end())
2749 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2750 m_field_slaves.insert(make_pair(
id,new_sifs));
2754 it=m_bpis.find(igname);
2755 if(it!=m_bpis.end()){
2758 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2759 m_field_slaves.insert(make_pair(
id,new_sifs));
2764 it=m_damping.find(igname);
2765 if(it!=m_damping.end())
2768 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2769 m_field_slaves.insert(make_pair(
id,new_sifs));
2773 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2778 console.
XDebug() <<
"end TSubLattice<T>::addScalarInteractionField\n";
2787 console.
Debug() <<
"TSubLattice<T>::addVectorInteractionField\n";
2791 int id,is_tagged,tag,mask,is_checked;
2793 m_tml_comm.recv_broadcast_cont(fieldname,0);
2794 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2795 m_tml_comm.recv_broadcast(
id,0);
2797 m_tml_comm.recv_broadcast_cont(igname,0);
2798 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2799 m_tml_comm.recv_broadcast_cont(igtype,0);
2800 console.
XDebug() <<
"recvd. interaction group type: " << igtype <<
"\n";
2801 m_tml_comm.recv_broadcast(is_tagged,0);
2802 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2805 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2808 m_tml_comm.recv_broadcast(tag,0);
2809 m_tml_comm.recv_broadcast(mask,0);
2811 m_tml_comm.recv_broadcast(is_checked,0);
2812 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2814 if(it!=m_dpis.end())
2818 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2820 m_field_slaves.insert(make_pair(
id,new_sifs));
2822 console.
Error()<<
"ERROR: could not generate Field Slave for field " << fieldname <<
"\n";
2827 it=m_bpis.find(igname);
2828 if(it!=m_bpis.end()){
2831 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2832 m_field_slaves.insert(make_pair(
id,new_sifs));
2837 it=m_damping.find(igname);
2838 if(it!=m_damping.end())
2841 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2842 m_field_slaves.insert(make_pair(
id,new_sifs));
2846 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2851 console.
Debug() <<
"end TSubLattice<T>::addVectorInteractionField\n";
2860 console.
XDebug() <<
"TSubLattice<T>::addScalarHistoryInteractionField\n";
2864 int id,is_tagged,tag,mask,is_checked;
2866 m_tml_comm.recv_broadcast_cont(fieldname,0);
2867 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2868 m_tml_comm.recv_broadcast(
id,0);
2870 m_tml_comm.recv_broadcast_cont(igname,0);
2871 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2872 m_tml_comm.recv_broadcast_cont(igtype,0);
2873 console.
XDebug() <<
"recvd. interaction group name: " << igtype <<
"\n";
2874 m_tml_comm.recv_broadcast(is_tagged,0);
2875 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2879 m_tml_comm.recv_broadcast(tag,0);
2880 m_tml_comm.recv_broadcast(mask,0);
2882 m_tml_comm.recv_broadcast(is_checked,0);
2883 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2886 map<string,AParallelInteractionStorage*>::iterator it=m_bpis.find(igname);
2887 if(it!=m_bpis.end()){
2890 new_sifs=(it->second)->generateNewScalarHistoryFieldSlave(&m_tml_comm,fieldname,is_tagged,tag,mask);
2892 m_field_slaves.insert(make_pair(
id,new_sifs));
2895 cerr <<
"ERROR : unknown interaction group name in addScalarHistoryInteractionField " << endl;
2898 console.
XDebug() <<
"end TSubLattice<T>::addScalarHistoryInteractionField\n";
2909 console.
Debug() <<
"TSubLattice<T>::addVectorTriangleField()\n";
2915 m_tml_comm.recv_broadcast_cont(fieldname,0);
2916 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2917 m_tml_comm.recv_broadcast_cont(meshname,0);
2918 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
2919 m_tml_comm.recv_broadcast(
id,0);
2922 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
2924 if (tm!=m_mesh.end()){
2932 m_field_slaves.insert(make_pair(
id,new_vfs));
2934 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
2935 if(m2d!=m_mesh2d.end()){
2942 m_field_slaves.insert(make_pair(
id,new_efs));
2945 console.
Debug() <<
"end TSubLattice<T>::addVectorTriangleField()\n";
2954 console.
Debug() <<
"TSubLattice<T>::addScalarTriangleField()\n";
2960 m_tml_comm.recv_broadcast_cont(fieldname,0);
2961 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2962 m_tml_comm.recv_broadcast_cont(meshname,0);
2963 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
2964 m_tml_comm.recv_broadcast(
id,0);
2974 m_field_slaves.insert(make_pair(
id,new_vtfs));
2975 console.
Debug() <<
"end TSubLattice<T>::addScalarTriangleField()\n";
2984 console.
XDebug() <<
"begin TSubLattice<T>::addVectorWallField()\n";
2986 string tmp_wallname;
2987 vector<string> wallnames;
2992 m_tml_comm.recv_broadcast_cont(fieldname,0);
2993 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2994 m_tml_comm.recv_broadcast(nwall,0);
2996 for(
int i=0;i<nwall;i++){
2997 m_tml_comm.recv_broadcast_cont(tmp_wallname,0);
2998 wallnames.push_back(tmp_wallname);
2999 console.
XDebug() <<
"recvd. wallname: " << tmp_wallname <<
"\n";
3000 tmp_wallname.clear();
3002 m_tml_comm.recv_broadcast(
id,0);
3006 map<string,CWall*>::iterator cwalliter=m_walls.find(*(wallnames.begin()));
3007 if(cwalliter==m_walls.end()){
3008 std::stringstream msg;
3010 <<
"ERROR in addVectorWallField: wallname '"
3011 << *(wallnames.begin()) <<
" 'invalid. Valid wall names: ";
3012 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
3014 msg <<
"'" << it->first <<
"' ";
3017 throw std::runtime_error(msg.str());
3020 int sumflag=(cwalliter->second)->getFieldSummationFlag(fieldname);
3022 if(m_tml_comm.rank()==1){
3023 m_tml_comm.send(sumflag,0);
3025 m_tml_comm.barrier();
3028 AWallFieldSlave* new_fs=(cwalliter->second)->generateVectorFieldSlave(&m_tml_comm,fieldname);
3031 vector<string>::iterator niter=wallnames.begin();
3032 if(niter!=wallnames.end()) niter++ ;
3033 while(niter!=wallnames.end()){
3034 string wname=*niter;
3035 map<string,CWall*>::iterator
iter=m_walls.find(wname);
3036 if(iter==m_walls.end()){
3037 std::stringstream msg;
3039 <<
"ERROR in addVectorWallField: wallname '"
3040 << wname <<
" 'invalid";
3041 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
3043 msg <<
"'" << it->first <<
"' ";
3047 throw std::runtime_error(msg.str());
3049 new_fs->
addWall(iter->second);
3054 m_field_slaves.insert(make_pair(
id,new_fs));
3056 console.
Error() <<
"ERROR in addVectorWallField: got NULL Slave\n";
3060 console.
XDebug() <<
"end TSubLattice<T>::addVectorWallField()\n";
3069 console.
Debug() <<
"TSubLattice<T>::sendFieldData()\n";
3072 m_tml_comm.recv_broadcast(
id,0);
3073 console.
Debug() <<
"received field id " <<
id <<
" for data collection\n" ;
3074 if(m_field_slaves[
id] !=
NULL)
3076 m_field_slaves[id]->sendData();
3080 cerr <<
"NULL pointer in m_field_slaves!" << endl;
3083 console.
Debug() <<
"end TSubLattice<T>::sendFieldData()\n";
3095 std::streamsize oldprec=oStream.precision(9);
3104 const std::string delim =
"\n";
3107 while (particleIt.hasNext()) {
3108 particleIt.next().saveSnapShotData(oStream);
3115 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
3116 typename NameBondedInteractionsMap::iterator it;
3117 oStream << m_bpis.size() << delim;
3118 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
3119 it->second->saveSnapShotData(oStream);
3124 oStream <<
"TMIG " << m_mesh.size() << delim;
3125 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
3126 tm_iter!=m_mesh.end();
3128 oStream << tm_iter->first << delim;
3129 tm_iter->second->writeCheckPoint(oStream,delim);
3133 oStream.precision(oldprec);
3142 const std::string delim =
"\n";
3146 m_ppa->saveCheckPointData(oStream);
3151 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
3152 typename NameBondedInteractionsMap::iterator it;
3153 oStream << m_bpis.size() << delim;
3154 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
3155 it->second->saveCheckPointData(oStream);
3163 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
3166 if(
iter->second->willSave()) count_save++;
3168 oStream << count_save << delim;
3169 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
3172 if(
iter->second->willSave()) {
3173 iter->second->saveCheckPointData(oStream);
3179 oStream <<
"Walls " << m_walls.size() << delim;
3180 for(map<string,CWall*>::iterator w_iter=m_walls.begin();
3181 w_iter!=m_walls.end();
3183 oStream << w_iter->first << delim;
3184 w_iter->second->writeCheckPoint(oStream,delim);
3188 oStream <<
"Spheres " << m_spheres.size() << delim;
3189 for(map<string,CSphereBody*>::iterator w_iter=m_spheres.begin();
3190 w_iter!=m_spheres.end();
3192 oStream << w_iter->first << delim;
3193 w_iter->second->writeCheckPoint(oStream,delim);
3197 oStream <<
"TriMesh " << m_mesh.size() << delim;
3198 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
3199 tm_iter!=m_mesh.end();
3201 oStream << tm_iter->first << delim;
3202 tm_iter->second->writeCheckPoint(oStream,delim);
3205 oStream <<
"Mesh2D " << m_mesh2d.size() << delim;
3206 for(
typename map<string,Mesh2D*>::iterator tm_iter=m_mesh2d.begin();
3207 tm_iter!=m_mesh2d.end();
3209 oStream << tm_iter->first << delim;
3210 tm_iter->second->writeCheckPoint(oStream,delim);
3218 m_ppa->loadCheckPointData(iStream);
3223 barrier.
wait(
"PPA rebuild");
3227 unsigned int nr_bonded_ig;
3228 iStream >> nr_bonded_ig;
3232 if(nr_bonded_ig!=m_bpis.size()){
3233 std::cerr <<
"number of bonded interaction groups differ between snapshot and script!" << std::endl;
3235 for (map<string,AParallelInteractionStorage*>::iterator it = m_bpis.begin();
3238 it->second->loadCheckPointData(iStream);
3243 unsigned int nr_nonbonded_ig;
3244 iStream >> nr_nonbonded_ig;
3248 if(nr_nonbonded_ig!=m_dpis.size()){
3249 std::cerr <<
"number of dynamic interaction groups differ between snapshot and script!" << std::endl;
3251 for (map<string,AParallelInteractionStorage*>::iterator it = m_dpis.begin();
3254 it->second->loadCheckPointData(iStream);
3260 if(token!=
"Walls") {
3261 std::cerr <<
"expected Walls , got " << token << std::endl;
3268 for(
int i=0;i<nwalls;i++){
3272 m_walls[wname]=new_wall;
3276 if(token!=
"Spheres") {
3277 std::cerr <<
"expected Spheres , got " << token << std::endl;
3282 iStream >> nspheres;
3285 for(
int i=0;i<nspheres;i++){
3289 m_spheres[sname]=new_sphere;
3296 if(token!=
"TriMesh") {
3297 std::cerr <<
"expected TriMesh , got " << token << std::endl;
3302 for(
int i=0;i<nmesh;i++){
3306 m_mesh.insert(make_pair(mname,new_tm));
3310 if(token!=
"Mesh2D") {
3311 std::cerr <<
"expected Mesh2D , got " << token << std::endl;
3316 for(
int i=0;i<nmesh;i++){
3320 m_mesh2d.insert(make_pair(mname,new_m2d));
3333 vector<int> ref_vec;
3343 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3344 if (tm!=m_mesh.end()){
3346 iter!=(tm->second)->corners_end();
3348 ref_vec.push_back(
iter->getID());
3351 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3352 if(m2d!=m_mesh2d.end()){
3354 iter!=(m2d->second)->corners_end();
3356 ref_vec.push_back(
iter->getID());
3359 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3363 m_tml_comm.send_gather(ref_vec,0);
3365 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3375 vector<int> ref_vec;
3385 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3386 if (tm!=m_mesh.end()){
3388 iter!=(tm->second)->triangles_end();
3390 ref_vec.push_back(
iter->getID());
3393 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3394 if(m2d!=m_mesh2d.end()){
3396 iter!=(m2d->second)->edges_end();
3398 ref_vec.push_back(
iter->getID());
3401 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3405 m_tml_comm.send_gather(ref_vec,0);
3407 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3425 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3426 if(m2d!=m_mesh2d.end()){
3427 vector<pair<int,Vec3> > data_vec;
3432 m_tml_comm.send_gather(data_vec,0);
3434 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMesh2DStress() !! \n";
3437 console.
XDebug() <<
"end TSubLattice<T>::getMesh2DStress()\n";
3446 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): enter\n";
3451 const std::string meshName = param_buffer.
pop_string();
3455 map<string,TriMesh*>::iterator m=m_mesh.find(meshName);
3456 if(m != m_mesh.end()){
3457 vector<pair<int,Vec3> > data_vec;
3462 m_tml_comm.send_gather(data_vec,0);
3464 std::stringstream msg;
3465 msg <<
"Invalid mesh name: " << meshName <<
". No such triangular mesh.";
3466 throw std::runtime_error(msg.str().c_str());
3469 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): exit\n";
virtual void addBondedWIG()
Definition: SubLattice.hpp:531
virtual void loadCheckPoint(istream &)
Definition: TriMesh.cpp:285
virtual void moveSingleNode()
Definition: SubLattice.hpp:2191
Definition: LatticeParam.h:29
virtual void printData()
Definition: SubLattice.hpp:2620
virtual Vec3 pop_vector()
Definition: mpibuf.cpp:26
double x0
Definition: FractalFriction.h:40
virtual void addScalarParticleField()
Definition: SubLattice.hpp:2643
base class for spherical non-inertial bodies (similar to simple walls)
Definition: SphereBody.h:39
double k
Definition: BTriMeshIP.h:21
virtual void printTimes()
Definition: SubLattice.hpp:2627
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:559
virtual void addScalarTriangleField()
Definition: SubLattice.hpp:2952
virtual void getWallForce()
Definition: SubLattice.hpp:649
void buildFromPPATagged(int, int)
Definition: mesh2d_pis_eb.hpp:357
double k_s
Definition: RotThermFricInteraction.h:51
virtual void addSingleIG()
Definition: SubLattice.hpp:1309
Console & XDebug()
set verbose level of next message to "xdg"
Definition: console.cpp:219
double m_alpha
Definition: SubLattice.h:98
virtual ~TSubLattice()
Definition: SubLattice.hpp:173
double y0
Definition: FractalFriction.h:40
Definition: RotThermParticle.h:54
int m_last_ns
Definition: SubLattice.h:100
virtual int getNumParticles()
Definition: SubLattice.hpp:241
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:108
Interaction group parameters for CRotElasticInteractionGroups.
Definition: RotElasticInteraction.h:24
VEC3_INLINE double & Z()
Definition: vec3.h:121
virtual void addScalarInteractionField()
Definition: SubLattice.hpp:2716
double commtime
Definition: SubLattice.h:121
int getNumRemaining() const
Definition: pp_array.hpp:678
VEC3_INLINE double & Y()
Definition: vec3.h:120
void resetDisplacements()
Definition: SubLattice.hpp:2133
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:1546
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:2982
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:785
virtual void exchangePos()
Definition: SubLattice.hpp:1671
virtual void moveParticleTo()
Definition: SubLattice.hpp:2150
double dx
Definition: FractalFriction.h:40
void integrate(double)
Definition: SubLattice.hpp:1825
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
MPI_Comm m_comm
Definition: SubLattice.h:107
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:111
virtual void addMesh2D()
Definition: SubLattice.hpp:1163
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:119
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
virtual void setParticleNonTrans()
Definition: SubLattice.hpp:2413
base class for all walls
Definition: Wall.h:39
Vec3(Triangle::* VectorFieldFunction)() const
Definition: Triangle.h:50
virtual void addCappedBondedIG()
Definition: SubLattice.hpp:1472
std::string getSphereBodyName() const
Definition: ESphereBodyInteractionGroup.h:40
virtual void rebuildParticleArray()
Definition: SubLattice.hpp:1962
bool hasNext() const
Definition: pp_array.hpp:663
virtual void addElasticWIG()
Definition: SubLattice.hpp:419
virtual void checkNeighbors()
Definition: SubLattice.hpp:2081
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
vector< Corner >::iterator corner_iterator
Definition: TriMesh.h:66
virtual void addVectorParticleField()
Definition: SubLattice.hpp:2678
Interaction group parameters for CBWallInteractionGroups.
Definition: BWallInteractionGroup.h:38
Definition: ABCDampingIGP.h:23
parrallel particle storage array with neighborsearch and variable exchange
Definition: SubLattice.h:64
double r_cut
Definition: AdhesiveFriction.h:35
virtual void setVelocityOfWall()
Definition: SubLattice.hpp:2521
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:1877
virtual void setTaggedParticleVel()
Definition: SubLattice.hpp:2428
virtual void setParticleDensity()
Definition: SubLattice.hpp:2556
Console & Info()
set verbose level of next message to "inf"
Definition: console.cpp:193
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:327
virtual void getMeshNodeRef()
Definition: SubLattice.hpp:3330
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:2397
virtual void applyForceToWall()
Definition: SubLattice.hpp:2501
bool meanR_scaling
Definition: RotFricInteraction.h:79
double m_k
Definition: ElasticInteraction.h:28
virtual void setTimeStepSize(double dt)
Definition: SubLattice.hpp:1776
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:109
boost::shared_ptr< double > mu
pointer to the array of friction coeff.
Definition: FractalFriction.h:39
virtual void addScalarHistoryInteractionField()
Definition: SubLattice.hpp:2858
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:1022
virtual void initNeighborTable(const Vec3 &, const Vec3 &)
Definition: SubLattice.hpp:209
CESphereBodyIGP * extractESphereBodyIGP(AMPIBuffer *B)
Definition: ESphereBodyInteractionGroup.cpp:52
double unpacktime
Definition: SubLattice.h:120
virtual void getSphereBodyPos()
Definition: SubLattice.hpp:618
Particle & next()
Definition: pp_array.hpp:669
void calcHeatTrans()
Definition: SubLattice.hpp:1931
virtual void addESphereBodyIG()
Definition: SubLattice.hpp:454
Definition: BMesh2DIP.h:16
bool scaling
Definition: RotFricInteraction.h:77
virtual void addPairIG()
Definition: SubLattice.hpp:739
double m_cutoff
Definition: LinearDashpotInteraction.h:28
virtual void sendDataToMaster()
Definition: SubLattice.hpp:2574
double k
Definition: RotFricInteraction.h:72
virtual void moveWallBy()
Definition: SubLattice.hpp:2444
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:760
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:2244
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
Abstract Base class for a group of interactions between particles and a sphere body.
Definition: SphereBodyIG.h:30
virtual void addRotThermBondedIG()
Definition: SubLattice.hpp:1536
std::string getWallName() const
Definition: brokenEWallInteractionGroup.h:40
virtual void countParticles()
Definition: SubLattice.hpp:2596
double m_E
Definition: HertzianViscoElasticInteraction.h:28
double diffusivity
Definition: RotThermFricInteraction.h:53
virtual void getTriMeshForce()
Definition: SubLattice.hpp:3444
virtual void addBondedMesh2DIG()
Definition: SubLattice.hpp:1250
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:1107
Console console
Definition: console.cpp:25
Interaction group parameters for CLocalDampingGroup.
Definition: LocalDampingIGP.h:27
virtual void saveCheckPointData(std::ostream &oStream)
Definition: SubLattice.hpp:3140
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:1202
class for slave part of scalar field defined on the particles
Definition: VectorParticleFieldSlave.h:31
void zeroHeat()
Definition: SubLattice.hpp:1889
double dt
Definition: AdhesiveFriction.h:34
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:1635
double mu
Definition: FrictionInteraction.h:39
double m_alpha
Definition: VWFrictionInteraction.h:25
double forcetime
Definition: SubLattice.h:122
Buffer for MPI scatter/gather, leaf component.
Definition: mpisgbuf.h:124
virtual void oneStepTherm()
Definition: SubLattice.hpp:1853
Slave part for saving a vector field defined on the edges in a given Mesh2D.
Definition: VectorEdge2DFieldSlave.h:34
Console & Error()
set verbose level of next message to "err"
Definition: console.cpp:154
const ProcessDims & processDims() const
Definition: LatticeParam.h:44
Definition: BTriMeshIP.h:18
virtual void tryInsert(const I &)
virtual void searchNeighbors()
Definition: SubLattice.hpp:2006
static BuoyancyIGP extract(CVarMPIBuffer *pBuffer)
Definition: BodyForceGroup.cpp:92
void calcForces()
Definition: SubLattice.hpp:1727
CEWallIGP * extractEWallIGP(AMPIBuffer *)
Definition: EWallInteractionGroup.cpp:53
const std::string & Name() const
Definition: IGParam.h:44
virtual void send()
Definition: mpisgvbuf.cpp:287
Vec3(Edge2D::* VectorFieldFunction)() const
Definition: Edge2D.h:41
virtual void addTaggedElasticWIG()
Definition: SubLattice.hpp:489
void integrateTherm(double dt)
Definition: SubLattice.hpp:1868
virtual void sendFieldData()
Definition: SubLattice.hpp:3067
CVWallIGP * extractVWallIGP(AMPIBuffer *B)
Definition: ViscWallIG.cpp:54
void buildFromPPAByGap(double)
Definition: mesh2d_pis_eb.hpp:405
virtual void addDamping()
Definition: SubLattice.hpp:1359
virtual void saveSnapShotData(std::ostream &oStream)
Definition: SubLattice.hpp:3092
parallel storage array with exchange for bonded/breakable interactions
Definition: pi_storage_eb.h:29
Interaction group parameters for CESphereBodyInteractionGroups.
Definition: ESphereBodyInteractionGroup.h:32
double rbreak
Breaking strain.
Definition: BondedInteraction.h:52
virtual void loadCheckPoint(istream &)
Definition: Wall.cpp:128
virtual void receiveConnections()
Definition: SubLattice.hpp:350
virtual void addRotBondedIG()
Definition: SubLattice.hpp:1530
TML_Comm m_tml_worker_comm
TML version of the communicator between workers (excl. master)
Definition: SubLattice.h:110
virtual void updateInteractions()
Definition: SubLattice.hpp:2027
virtual void addBondedIG()
Definition: SubLattice.hpp:1425
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:381
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:116
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
static BodyForceIGP extract(CVarMPIBuffer *pBuffer)
Definition: BodyForceGroup.cpp:52
virtual void rebuildInteractions()
Definition: SubLattice.hpp:1971
double alpha() const
Definition: LatticeParam.h:43
virtual void addTriMeshIG()
Definition: SubLattice.hpp:1060
Console & Critical()
set verbose level of next message to "crt"
Definition: console.cpp:141
virtual void append(int)
Definition: mpisgbuf.cpp:239
CLocalDampingIGP * extractLocalDampingIGP(AMPIBuffer *B)
Definition: LocalDampingIGP.cpp:57
Class for a group of unbonded,elastic interactions between particles and a sphere body...
Definition: ESphereBodyInteractionGroup.h:48
virtual void loadCheckPointData(std::istream &iStream)
Definition: SubLattice.hpp:3215
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:3414
void calcHeatFrict()
Definition: SubLattice.hpp:1913
virtual void do2dCalculations(bool do2d)
Definition: SubLattice.hpp:235
double k
Definition: FrictionInteraction.h:38
Console & Debug()
set verbose level of next message to "dbg"
Definition: console.cpp:206
VEC3_INLINE double & X()
Definition: vec3.h:119
Vec3 getForce() const
Definition: Triangle.h:91
virtual void setWallNormal()
Definition: SubLattice.hpp:2482
vector< Triangle >::iterator triangle_iterator
Definition: TriMesh.h:64
int m_rank
rank in m_comm
Definition: SubLattice.h:106
double m_nu
Definition: HertzianElasticInteraction.h:28
virtual void addVectorInteractionField()
Definition: SubLattice.hpp:2785
virtual void moveTaggedNodes()
Definition: SubLattice.hpp:2220
double m_kr
Definition: RotElasticInteraction.h:31
virtual void getSphereBodyForce()
Definition: SubLattice.hpp:680
virtual void moveSphereBodyBy()
Definition: SubLattice.hpp:2463
std::pair< int, Vec3 > getParticlePosn(int particleId)
Definition: SubLattice.hpp:2290
Abstract base class for slave part of field.
Definition: FieldSlave.h:22
virtual void setExIG()
Definition: SubLattice.hpp:1602
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:3372
Class for a group of bonded, elastic interactions with per-direction spring constants between particl...
Definition: SoftBWallInteractionGroup.h:49
double m_E
Definition: HertzianViscoElasticFrictionInteraction.h:50
virtual void printStruct()
Definition: SubLattice.hpp:2610
virtual void loadCheckPoint(istream &)
Definition: SphereBody.cpp:60
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
virtual void addSphereBody()
Definition: SubLattice.hpp:400
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:2381
void setComm(MPI_Comm)
Definition: comm.cpp:43
Class for a group of unbonded,elastic interactions between particles and a wall.
Definition: brokenEWallInteractionGroup.h:48
virtual void addVectorTriangleField()
Definition: SubLattice.hpp:2907
virtual void Update(ParallelParticleArray< T > *)=0
virtual void addViscWIG()
Definition: SubLattice.hpp:711
Definition: RotThermElasticInteraction.h:61
Vec3 getForceDensity() const
Definition: Edge2D.h:70
ParticleIterator getInnerParticleIterator()
Definition: pp_array.hpp:684
double dt
Definition: HertzianViscoElasticFrictionInteraction.h:54
std::pair< double, int > findParticleNearestTo(const Vec3 &pt)
Definition: SubLattice.hpp:2257
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:2167
double m_nu
Definition: HertzianViscoElasticFrictionInteraction.h:51
void zeroForces()
Definition: SubLattice.hpp:1684
virtual bool doAddDamping(const string &, CVarMPIBuffer &)
Definition: SubLattice.hpp:1382
double m_nrange
Definition: SubLattice.h:96
double k
Spring constant.
Definition: BondedInteraction.h:51
virtual void oneStep()
Definition: SubLattice.hpp:1837
bool m_scaling
Definition: ElasticInteraction.h:29
Class for a group of viscous and elastic interactions between particles and a wall.
Definition: ViscWallIG.h:52
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:2181
virtual void setParticleVelocity()
Definition: SubLattice.hpp:2540
virtual void tagParticleNearestTo()
Definition: SubLattice.hpp:2354
double(Triangle::* ScalarFieldFunction)() const
Definition: Triangle.h:51
double dt
Definition: RotFricInteraction.h:76
std::vector< SimpleParticle > ParticleVector
Definition: SimpleNTable3D.h:22
virtual void getParticleData(const IdVector &particleIdVector)
Definition: SubLattice.hpp:2314
virtual void getWallPos()
Definition: SubLattice.hpp:587
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