87 #include <boost/limits.hpp>
88 using std::runtime_error;
118 m_singleParticleInteractions(),
129 m_comm(MPI_COMM_NULL),
130 m_tml_comm(MPI_COMM_NULL),
131 m_worker_comm(MPI_COMM_NULL),
132 m_tml_worker_comm(MPI_COMM_NULL),
172 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): enter\n";
174 <<
"TSubLattice<T>::~TSubLattice():"
175 <<
" deleting wall interaction groups...\n";
185 <<
"TSubLattice<T>::~TSubLattice():"
186 <<
" deleting particle array...\n";
187 if (m_ppa !=
NULL)
delete m_ppa;
188 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): exit\n";
200 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
")\n";
202 double xsize=max.
X()-min.
X();
203 xsize=m_nrange*ceil(xsize/m_nrange);
204 double ysize=max.Y()-min.
Y();
205 ysize=m_nrange*ceil(ysize/m_nrange);
206 double zsize=max.Z()-min.
Z();
207 zsize=m_nrange*ceil(zsize/m_nrange);
208 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
209 Vec3 nmin=min-0.5*grow;
210 Vec3 nmax=max+0.5*grow;
211 console.
XDebug() <<
"range=" << m_nrange <<
", new min,max: " << nmin <<
", " << nmax <<
"\n";
220 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable\n";
226 T::setDo2dCalculations(do2d);
232 return m_ppa->getInnerSize();
245 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
") circ\n";
246 double xsize,ysize,zsize;
251 xsize=max.
X()-min.
X();
252 if(fabs(xsize/m_nrange-lrint(xsize/m_nrange))>1e-6)
255 console.
Info() <<
"Circular x-size incompatible with range, adjusting...\n";
256 m_nrange = xsize/floor(xsize/m_nrange);
257 console.
Info() <<
"New range = " << m_nrange <<
"\n";
263 xsize=max.X()-min.
X();
264 xsize=m_nrange*ceil(xsize/m_nrange);
269 ysize=max.Y()-min.
Y();
270 if(fabs(ysize/m_nrange-lrint(ysize/m_nrange))>1e-6)
278 ysize=max.Y()-min.
Y();
279 ysize=m_nrange*ceil(ysize/m_nrange);
284 zsize=max.Z()-min.
Z();
285 if(fabs(zsize/m_nrange-lrint(zsize/m_nrange))>1e-6)
293 zsize=max.Z()-min.
Z();
294 zsize=m_nrange*ceil(zsize/m_nrange);
296 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
297 Vec3 nmin=min-0.5*grow;
298 Vec3 nmax=max+0.5*grow;
299 console.
XDebug() <<
"range, new min, max: " << m_nrange <<
" " << nmin << nmax <<
"\n";
306 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable (circ)\n";
318 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: enter\n";
320 vector<T> recv_buffer;
323 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
324 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" particles \n";
325 m_ppa->insert(recv_buffer);
327 barrier.
wait(
"TSubLattice<T>::receiveParticles");
329 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: exit\n";
341 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: enter\n";
343 vector<int> recv_buffer;
346 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
347 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" connections \n";
348 vector<int>::iterator it;
349 for (it = recv_buffer.begin(); it != recv_buffer.end(); it+=3)
351 if ( (m_ppa->getParticlePtrByIndex( *(it+1)) ==
NULL ) ||
352 (m_ppa->getParticlePtrByIndex( *(it+2)) ==
NULL ) )
356 m_temp_conn[*(it)].push_back(*(it+1));
357 m_temp_conn[*(it)].push_back(*(it+2));
360 barrier.
wait(
"TSubLattice<T>::receiveConnections");
362 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: exit\n";
380 m_walls[name]=
new CWall(ipos,inorm);
391 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: enter\n" ;
400 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
401 if(iter!=m_walls.end()){
409 m_WIG.insert(make_pair(wigp->
getName(),newCEWIG));
411 std::stringstream msg;
412 msg <<
"wall name '" << wallname <<
"' not found in map of walls";
413 throw std::runtime_error(msg.str().c_str());
417 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: exit\n" ;
427 console.
XDebug() <<
"TSubLattice<T>::addBondedWIG: enter\n" ;
436 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
437 if(iter!=m_walls.end()){
440 m_WIG.insert(make_pair(wigp->
getName(),newCBWIG));
442 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
455 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: enter\n" ;
464 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
465 if(iter!=m_walls.end()){
468 m_WIG.insert(make_pair(wigp->
getName(),newCDWIG));
470 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
474 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: exit\n" ;
483 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: enter\n" ;
494 map<string,CWall*>::iterator
iter=m_walls.find(wname);
495 if(iter!=m_walls.end()){
496 pos=(iter->second)->getPos();
499 pos=
Vec3(0.0,0.0,0.0);
504 m_tml_comm.send_gather(vpos,0);
505 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: exit\n" ;
514 console.
XDebug() <<
"TSubLattice<T>::getWallForce: enter\n" ;
525 map<string,CWall*>::iterator
iter=m_walls.find(wname);
526 if(iter!=m_walls.end()){
527 force=(iter->second)->getForce();
530 force=
Vec3(0.0,0.0,0.0);
534 vforce.push_back(force);
535 m_tml_comm.send_gather(vforce,0);
554 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
555 if(iter!=m_walls.end()){
558 m_WIG.insert(make_pair(wigp->
getName(),newCVWIG));
560 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
583 doAddPIG(name,type,param_buffer,
false);
604 doAddPIG(name,type,param_buffer,
true);
606 console.
XDebug() <<
"end TSubLattice<T>::addTaggedPairIG()\n";
622 if(type==
"Elastic") {
627 int tag1=param_buffer.
pop_int();
628 int mask1=param_buffer.
pop_int();
629 int tag2=param_buffer.
pop_int();
630 int mask2=param_buffer.
pop_int();
632 << tag1 <<
" , " << mask1 <<
" , "
633 << tag2 <<
" , " << mask2 <<
"\n";
639 }
else if (type==
"Friction") {
647 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
650 }
else if (type==
"AdhesiveFriction") {
658 <<
"k,mu,k_s,dt,r_cut: " << figp.
k <<
" , " << figp.
mu <<
" , "
659 << figp.
k_s <<
" , " << figp.
dt <<
" " << figp.
r_cut <<
"\n";
662 }
else if (type==
"FractalFriction") {
669 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
677 <<
"x0,y0,dx,dy,nx,ny: "
678 << figp.
x0 <<
" , " << figp.
y0 <<
" , "
679 << figp.
dx <<
" , " << figp.
dy <<
" ,"
680 << figp.
nx <<
" , " << figp.
ny <<
"\n";
681 figp.
mu = boost::shared_ptr<double>(
new double[figp.
nx*figp.
ny]);
683 for(
int i=0;i<figp.
nx*figp.
ny;i++)
690 }
else if(type==
"VWFriction") {
699 <<
"k,mu,k_s,dt,alpha: " << figp.
k <<
" , " << figp.
mu <<
" , "
700 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
703 }
else if(type==
"RotElastic"){
708 }
else if (type==
"RotFriction"){
718 <<
"k,mu_s,mu_d,k_s,dt,scaling: " << rfigp.
k <<
" , "
719 << rfigp.
mu_s <<
" , " << rfigp.
mu_d <<
" , "
720 << rfigp.
k_s <<
" , " << rfigp.
dt <<
" , " << rfigp.
scaling <<
"\n";
722 int tag1=param_buffer.
pop_int();
723 int mask1=param_buffer.
pop_int();
724 int tag2=param_buffer.
pop_int();
725 int mask2=param_buffer.
pop_int();
727 << tag1 <<
" , " << mask1 <<
" , "
728 << tag2 <<
" , " << mask2 <<
"\n";
734 }
else if (type ==
"RotThermElastic") {
739 <<
"k=" << eigp.
m_kr <<
" , "
751 }
else if (type ==
"RotThermFriction") {
760 <<
"k=" << rfigp.
k <<
" , "
761 <<
"mu_d=" << rfigp.
mu_d <<
" , "
762 <<
"mu_s=" << rfigp.
mu_s <<
" , "
763 <<
"k_s=" << rfigp.
k_s <<
" , "
765 <<
"dt=" << rfigp.
dt <<
"\n";
776 }
else if(type==
"HertzianElastic") {
781 int tag1=param_buffer.
pop_int();
782 int mask1=param_buffer.
pop_int();
783 int tag2=param_buffer.
pop_int();
784 int mask2=param_buffer.
pop_int();
790 }
else if(type==
"HertzianViscoElasticFriction") {
799 int tag1=param_buffer.
pop_int();
800 int mask1=param_buffer.
pop_int();
801 int tag2=param_buffer.
pop_int();
802 int mask2=param_buffer.
pop_int();
808 }
else if(type==
"HertzianViscoElastic") {
814 int tag1=param_buffer.
pop_int();
815 int mask1=param_buffer.
pop_int();
816 int tag2=param_buffer.
pop_int();
817 int mask2=param_buffer.
pop_int();
823 }
else if(type==
"LinearDashpot") {
828 int tag1=param_buffer.
pop_int();
829 int mask1=param_buffer.
pop_int();
830 int tag2=param_buffer.
pop_int();
831 int mask2=param_buffer.
pop_int();
838 cerr <<
"Unknown interaction group name "
840 <<
" in TSubLattice<T>::addPairIG()" << endl;
844 if(res) m_dpis.insert(make_pair(name,new_pis));
861 vector<MeshNodeData> node_recv_buffer;
862 vector<MeshTriData> tri_recv_buffer;
872 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
873 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
876 m_tml_comm.recv_broadcast_cont_packed(tri_recv_buffer,0);
877 console.
XDebug() <<
"recvd " << tri_recv_buffer.size() <<
" triangles \n";
881 new_tm->
LoadMesh(node_recv_buffer,tri_recv_buffer);
883 m_mesh.insert(make_pair(name,new_tm));
904 console.
XDebug()<<
"TriMeshIG type: " << type.c_str() <<
"\n";
906 console.
XDebug()<<
"TriMeshIG name: " << name.c_str() <<
"\n";
908 console.
XDebug()<<
"TriMeshIG mesh name: " << meshname.c_str() <<
"\n";
912 if (m_mesh.find(meshname) != m_mesh.end())
914 tmp = m_mesh[meshname];
917 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
926 m_dpis.insert(make_pair(name,new_pis));
928 throw runtime_error(
"unknown type in TSubLattice<T>::addTriMeshIG:" + type);
941 console.
XDebug() <<
"TSubLattice<T>::addBondedTriMeshIG()\n";
952 console.
XDebug()<<
"BTriMeshIG name: " << name.c_str() <<
"\n";
954 console.
XDebug()<<
"BTriMeshIG mesh name: " << meshname.c_str() <<
"\n";
960 console.
XDebug()<<
"BTriMeshIG build type: " << buildtype.c_str() <<
"\n";
964 if (m_mesh.find(meshname) != m_mesh.end())
966 tmp = m_mesh[meshname];
969 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
975 if(buildtype==
"BuildByTag"){
976 int tag=param_buffer.
pop_int();
977 int mask=param_buffer.
pop_int();
979 m_bpis.insert(make_pair(name,new_pis));
980 }
else if(buildtype==
"BuildByGap"){
983 m_bpis.insert(make_pair(name,new_pis));
985 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedTriMeshIG:" + buildtype);
988 console.
XDebug() <<
"end TSubLattice<T>::addBondedTriMeshIG()\n";
1002 vector<MeshNodeData2D> node_recv_buffer;
1003 vector<MeshEdgeData2D> edge_recv_buffer;
1013 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
1014 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
1017 m_tml_comm.recv_broadcast_cont_packed(edge_recv_buffer,0);
1018 console.
XDebug() <<
"recvd " << edge_recv_buffer.size() <<
" edges \n";
1022 new_tm->
LoadMesh(node_recv_buffer,edge_recv_buffer);
1024 m_mesh2d.insert(make_pair(name,new_tm));
1046 console.
XDebug()<<
"Mesh2DIG type: " << type.c_str() <<
"\n";
1048 console.
XDebug()<<
"Mesh2DIG name: " << name.c_str() <<
"\n";
1050 console.
XDebug()<<
"Mesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1054 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1056 tmp = m_mesh2d[meshname];
1059 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addMesh2DIG:" + meshname);
1068 m_dpis.insert(make_pair(name,new_pis));
1070 throw runtime_error(
"unknown type in TSubLattice<T>::addMesh2DIG:" + type);
1084 console.
XDebug() <<
"TSubLattice<T>::addBondedMesh2DIG()\n";
1095 console.
XDebug() <<
"BMesh2DIG name: " << name.c_str() <<
"\n";
1097 console.
XDebug() <<
"BMesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1102 string buildtype = param_buffer.
pop_string();
1103 console.
XDebug() <<
"BMesh2DIG build type: " << buildtype.c_str() <<
"\n";
1107 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1109 tmp = m_mesh2d[meshname];
1112 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addBondedMesh2DIG:" + meshname);
1118 if(buildtype==
"BuildByTag"){
1119 int tag=param_buffer.
pop_int();
1120 int mask=param_buffer.
pop_int();
1122 m_bpis.insert(make_pair(name,new_pis));
1123 }
else if(buildtype==
"BuildByGap"){
1126 m_bpis.insert(make_pair(name,new_pis));
1128 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedMesh2DIG:" + buildtype);
1131 console.
XDebug() <<
"end TSubLattice<T>::addBonded2DMeshIG()\n";
1153 if(type==
"Gravity"){
1157 m_singleParticleInteractions.insert(
1164 else if (type==
"Buoyancy"){
1168 m_singleParticleInteractions.insert(
1176 throw std::runtime_error(
1177 std::string(
"Trying to setup SIG of unknown type: ")
1199 console.
XDebug()<<
"Damping type: " << type.c_str() <<
"\n";
1202 doAddDamping(type,param_buffer);
1217 string damping_name;
1224 damping_name=
"Damping";
1226 }
else if (type==
"ABCDamping"){
1229 damping_name=params->
getName();
1231 }
else if (type==
"LocalDamping"){
1234 damping_name=params->
getName();
1237 std::stringstream msg;
1238 msg <<
"Trying to setup Damping of unknown type: " << type;
1240 throw std::runtime_error(msg.str());
1246 m_damping.insert(make_pair(damping_name,DG));
1247 m_damping[damping_name]->update();
1272 <<
"Got BondedIG parameters: " << param.
tag
1273 <<
" " << name.c_str() <<
" "
1274 << param.
k <<
" " << param.
rbreak <<
"\n";
1285 vector<int> vi(2,-1);
1286 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1288 vi[0] = (m_temp_conn[param.
tag][i]);
1289 vi[1] = (m_temp_conn[param.
tag][i+1]);
1294 m_bpis.insert(make_pair(name,B_PIS));
1306 console.
XDebug() <<
"TSubLattice<T>::addCappedBondedIG()\n";
1311 int tag=param_buffer.
pop_int();
1318 <<
"Got CappedBondedIG parameters: " << tag
1319 <<
" " << name.c_str() <<
" "
1320 << k <<
" " << rbreak <<
" " << maxforce <<
"\n";
1347 vector<int> vi(2,-1);
1348 for(
size_t i=0;i<m_temp_conn[tag].size();i+=2)
1350 vi[0] = (m_temp_conn[tag][i]);
1351 vi[1] = (m_temp_conn[tag][i+1]);
1356 m_bpis.insert(make_pair(name,B_PIS));
1358 console.
XDebug() <<
"end TSubLattice<T>::addCappedBondedIG()\n";
1364 console.
Error() <<
"TSubLattice<T>::addRotBondedIG() => trying to add rotational bonded IG to nonrotational model\n";
1370 console.
Error() <<
"TSubLattice<T>::addRotThermBondedIG() => trying to add rotational thermal bonded IG to nonrotational model\n";
1385 int tag=param_buffer.
pop_int();
1391 <<
"Got ShortBondedIG parameters: " << tag
1392 <<
" " << name.c_str() <<
" "
1393 << k <<
" " << rbreak <<
"\n";
1414 vector<int> vi(2,-1);
1415 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1417 vi[0] = (m_temp_conn[param.
tag][i]);
1418 vi[1] = (m_temp_conn[param.
tag][i+1]);
1423 m_bpis.insert(make_pair(name,B_PIS));
1425 console.
XDebug() <<
"end TSubLattice<T>::addShortBondedIG()\n";
1445 map<string,AParallelInteractionStorage*>::iterator bonded_ig=m_bpis.find(s1);
1446 map<string,AParallelInteractionStorage*>::iterator dynamic_ig=m_dpis.find(s2);
1447 if((bonded_ig!=m_bpis.end())&&(dynamic_ig!=m_dpis.end()))
1451 dynamic_ig->second->addExIG(bonded_ig->second);
1455 console.
Error() <<
"TSubLattice<T>::setExIG() - nonexisting interaction group \n";
1477 map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.find(igname);
1479 if(iter!=m_dpis.end()){
1481 delete m_dpis[igname];
1485 typename map<string,AWallInteractionGroup<T>*>::iterator it2=m_WIG.find(igname);
1486 if(it2!=m_WIG.end()){
1488 delete m_WIG[igname];
1494 console.
Error() <<
"TSubLattice<T>::removeIG() - nonexisting interaction group - ignore removal\n";
1507 m_ppa->exchange(&T::getExchangeValues,&T::setExchangeValues);
1521 m_ppa->forAllParticles(&T::zeroForce);
1523 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1526 (
iter->second)->zeroForces();
1530 for(map<string,Mesh2D*>::iterator
iter=m_mesh2d.begin();
1531 iter!=m_mesh2d.end();
1533 (
iter->second)->zeroForces();
1536 for(
typename map<string,CWall*>::iterator
iter=m_walls.begin();
1537 iter!=m_walls.end();
1540 (
iter->second)->zeroForce();
1559 (it->second)->calcForces();
1563 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1564 siter != m_singleParticleInteractions.end();
1568 (siter->second)->calcForces();
1571 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1573 (
iter->second)->calcForces();
1576 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1578 (
iter->second)->calcForces();
1581 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1583 (
iter->second)->calcForces();
1604 (it->second)->setTimeStepSize(dt);
1608 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1609 siter != m_singleParticleInteractions.end();
1613 (siter->second)->setTimeStepSize(dt);
1616 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1618 (
iter->second)->setTimeStepSize(dt);
1621 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1623 (
iter->second)->setTimeStepSize(dt);
1626 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1628 (
iter->second)->setTimeStepSize(dt);
1631 console.
XDebug() <<
"end TSubLattice<T>::setTimeStepSize() \n";
1643 m_ppa->forAllParticles(&T::integrate,dt);
1644 m_ppa->forAllParticles(&T::rescale) ;
1658 if (this->getParticleType() ==
"RotTherm")
1660 this->oneStepTherm();
1673 integrateTherm(m_dt);
1686 m_ppa->forAllParticles(&T::integrateTherm,dt);
1688 console.
XDebug() <<
"end TSubLattice<T>::integrateTherm \n";
1695 m_ppa->forAllParticles(&T::thermExpansion);
1697 console.
XDebug() <<
"end TSubLattice<T>::thermExpansion() \n";
1709 m_ppa->forAllParticles(&T::zeroHeat);
1734 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1739 (
iter->second)->calcHeatFrict();
1742 console.
XDebug() <<
"end TSubLattice<T>::calcHeatFrict() \n";
1753 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1758 (
iter->second)->calcHeatTrans();
1762 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1767 (
iter->second)->calcHeatTrans();
1770 console.
XDebug() <<
"end TSubLattice<T>::calcHeatTrans() \n";
1789 m_pTimers->start(
"RebuildInteractions");
1790 m_pTimers->resume(
"NeighbourSearch");
1791 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1795 console.
Debug() <<
"exchg & rebuild BPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
1796 (
iter->second)->exchange();
1797 (
iter->second)->rebuild();
1800 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1804 console.
Debug() <<
"exchg & rebuild DPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
1805 (
iter->second)->exchange();
1806 m_pTimers->pause(
"RebuildInteractions");
1807 m_pTimers->pause(
"NeighbourSearch");
1808 barrier.
wait(
"dpis::exchange");
1809 m_pTimers->resume(
"RebuildInteractions");
1810 m_pTimers->resume(
"NeighbourSearch");
1811 (
iter->second)->rebuild();
1813 resetDisplacements();
1814 m_pTimers->stop(
"RebuildInteractions");
1823 console.
Debug() <<
"CSubLattice<T>::searchNeighbors()\n";
1825 m_pTimers->start(
"NeighbourSearch");
1826 m_pTimers->start(
"RebuildParticleArray");
1827 rebuildParticleArray();
1828 m_pTimers->stop(
"RebuildParticleArray");
1829 m_pTimers->pause(
"NeighbourSearch");
1830 barrier.
wait(
"PPA rebuild");
1831 rebuildInteractions();
1832 m_pTimers->stop(
"NeighbourSearch");
1833 console.
Debug() <<
"end CSubLattice<T>::searchNeighbors()\n";
1845 console.
Debug() <<
"m_ppa->getTimeStamp() " << m_ppa->getTimeStamp() <<
" m_last_ns " << m_last_ns <<
"\n";
1846 bool need_update=
false;
1848 m_pTimers->start(
"UpdateBondedInteractions");
1849 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1853 bool n=(
iter->second)->update();
1854 need_update=need_update || n;
1856 m_pTimers->stop(
"UpdateBondedInteractions");
1857 if((m_ppa->getTimeStamp() > m_last_ns) || need_update)
1859 m_pTimers->start(
"UpdateDynamicInteractions");
1860 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1864 bool n=(
iter->second)->update();
1865 need_update=need_update || n;
1867 m_pTimers->stop(
"UpdateDynamicInteractions");
1872 (it->second)->Update(m_ppa);
1874 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
1875 iter!=m_damping.end();
1877 (
iter->second)->update();
1879 m_last_ns=m_ppa->getTimeStamp();
1882 console.
Debug() <<
"end TSubLattice<T>::updateInteractions()\n";
1892 console.
Debug() <<
"TSubLattice<T>::checkNeighbors()\n";
1895 double alpha=0.5*m_alpha;
1896 double srsqr=alpha*alpha;
1902 m_ppa->forAllParticlesGet(displ,&T::getDisplacement);
1905 vector<Vec3>::iterator it=displ.begin();
1906 while((it!=displ.end())&&(mdsqr<srsqr))
1908 double sqdisp=(*it)*(*it);
1909 mdsqr = ((mdsqr < sqdisp) ? sqdisp : mdsqr);
1913 console.
XDebug() <<
"max squared displacement " << mdsqr <<
"alpha^2 = " << srsqr <<
"\n";
1923 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1927 if(
iter->second->hasMovedBy(alpha)){
1934 console.
Debug() <<
"end TSubLattice<T>::checkNeighbors()\n";
1944 console.
Debug() <<
"slave " << m_rank <<
" resetDisplacements()\n";
1945 m_ppa->forAllParticles(&T::resetDisplacement);
1946 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1949 iter->second->resetCurrentDisplacement();
1951 console.
Debug() <<
"slave " << m_rank <<
" end resetDisplacements()\n";
1961 console.
Debug() <<
"TSubLattice<T>::moveParticleTo()\n";
1967 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::moveToRel),mv);
1968 console.
Debug() <<
"end TSubLattice<T>::moveParticleTo()\n";
1978 console.
Debug() <<
"TSubLattice<T>::moveTaggedParticlesBy()\n";
1982 const int tag = buffer.
pop_int();
1984 m_ppa->forParticleTag(tag, (
void (T::*)(
Vec3))(&T::moveBy),dx);
1985 console.
Debug() <<
"end TSubLattice<T>::moveTaggedParticlesBy()\n";
1992 m_ppa->forParticle(particleId, (
void (T::*)(
Vec3))(&T::moveTo), posn);
2002 console.
Debug() <<
"TSubLattice<T>::moveSingleNode()\n";
2010 console.
XDebug() <<
"name :" << name <<
" id : " <<
id <<
" disp " << disp <<
"\n";
2012 map<string,TriMesh*>::iterator tm=m_mesh.find(name);
2013 if (tm!=m_mesh.end()){
2014 (tm->second)->moveNode(
id,disp);
2016 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(name);
2017 if(m2d!=m_mesh2d.end()){
2018 (m2d->second)->moveNode(
id,disp);
2021 console.
Debug() <<
"end TSubLattice<T>::moveSingleNode()\n";
2031 console.
Error() <<
"TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n";
2034 "TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n"
2055 map<string,TriMesh*>::iterator tm=m_mesh.find(meshName);
2056 if (tm != m_mesh.end()){
2057 (tm->second)->translateBy(translation);
2059 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshName);
2060 if(m2d!=m_mesh2d.end()){
2061 (m2d->second)->translateBy(translation);
2068 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: enter\n";
2069 const T *pClosest =
NULL;
2070 double minDistSqrd = std::numeric_limits<double>::max();
2073 m_ppa->getInnerParticleIterator();
2076 const T &p = it.
next();
2077 const double distSqrd = (pt - p.getPos()).norm2();
2078 if (distSqrd < minDistSqrd)
2080 minDistSqrd = distSqrd;
2084 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: exit\n";
2089 std::make_pair(sqrt(minDistSqrd), pClosest->getID())
2091 std::make_pair(std::numeric_limits<double>::max(), -1)
2101 const T *particle =
NULL;
2103 m_ppa->getInnerParticleIterator();
2106 const T &p = it.
next();
2107 if (p.getID() == particleId)
2112 if (particle !=
NULL)
2114 return std::make_pair(particleId, particle->getPos());
2126 <<
"TSubLattice<T>::getParticleData: enter\n";
2127 typedef std::set<int> IdSet;
2130 ParticleVector particleVector;
2132 m_ppa->getInnerParticleIterator();
2133 if (particleIdVector.size() > 0)
2135 IdSet idSet(particleIdVector.begin(), particleIdVector.end());
2137 <<
"TSubLattice<T>::getParticleData: iterating over particles\n";
2140 const T &p = it.
next();
2141 if (idSet.find(p.getID()) != idSet.end())
2143 particleVector.push_back(p);
2149 m_ppa->getAllInnerParticles(particleVector);
2152 <<
"TSubLattice<T>::getParticleData:"
2153 <<
" sending particle data of size " << particleVector.size() <<
"\n";
2154 m_tml_comm.send_gather_packed(particleVector, 0);
2156 <<
"TSubLattice<T>::getParticleData: exit\n";
2165 console.
Debug() <<
"TSubLattice<T>::tagParticleNearestTo()\n";
2174 T* part_ptr=m_ppa->getParticlePtrByPosition(pos);
2176 int old_tag=part_ptr->getTag();
2177 int new_tag=(old_tag & (~mask)) | (tag & mask);
2178 part_ptr->setTag(new_tag);
2180 cout <<
"pos, realpos: " << pos <<
" " << part_ptr->getPos() <<
" old tag, new tag " << old_tag <<
" " << part_ptr->getTag() << endl;
2182 console.
Debug() <<
"end TSubLattice<T>::tagParticleNearestTo()\n";
2192 console.
Debug() <<
"TSubLattice<T>::setParticleNonDynamic()\n";
2197 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamic));
2198 console.
Debug() <<
"end TSubLattice<T>::setParticleNonDynamic()\n";
2208 console.
Debug() <<
"TSubLattice<T>::setParticleNonRot()\n";
2213 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicRot));
2214 console.
Debug() <<
"end TSubLattice<T>::setParticleNonRot()\n";
2224 console.
Debug() <<
"TSubLattice<T>::setParticleNonTrans()\n";
2229 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicLinear));
2230 console.
Debug() <<
"end TSubLattice<T>::setParticleNonTrans()\n";
2239 console.
Debug() <<
"TSubLattice<T>::setTaggedParticleVel()\n";
2245 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::setVel),v);
2246 console.
XDebug() <<
"end TSubLattice<T>::setTaggedParticleVel()\n";
2261 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2262 if(iter!=m_walls.end())
2264 (iter->second)->moveBy(mv);
2280 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2281 if(iter!=m_walls.end())
2283 (iter->second)->setNormal(wn);
2299 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2300 if(iter!=m_WIG.end())
2302 (iter->second)->applyForce(f);
2313 console.
XDebug() <<
"TSubLattice<T>::setVelocityOfWall()\n";
2319 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2320 if(iter!=m_WIG.end())
2322 (iter->second)->setVelocity(v);
2332 console.
Debug() <<
"TSubLattice<T>::setParticleVelocity()\n";
2338 m_ppa->forParticle(
id,(
void (T::*)(
Vec3))(&T::setVel),mv);
2339 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2348 console.
Debug() <<
"TSubLattice<T>::setParticleDensity()\n";
2355 m_ppa->forParticleTagMask(tag,mask,(
void (T::*)(
double))(&T::setDensity),rho);
2356 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2366 console.
Debug() <<
"TSubLattice<T>::sendDataToMaster()\n";
2367 vector<Vec3> positions;
2368 vector<double> radii;
2371 m_ppa->forAllParticlesGet(positions,(
Vec3 (T::*)()
const)(&T::getPos));
2372 m_ppa->forAllParticlesGet(radii,(
double (T::*)()
const)(&T::getRad));
2373 m_ppa->forAllParticlesGet(ids,(
int (T::*)()
const)(&T::getID));
2375 m_tml_comm.send_gather(positions,0);
2376 m_tml_comm.send_gather(radii,0);
2377 m_tml_comm.send_gather(ids,0);
2379 console.
Debug() <<
"end TSubLattice<T>::sendDataToMaster()\n";
2391 buffer.
append(m_ppa->size());
2402 cout<<
"My Rank : " << m_rank <<
"\n" ;
2405 cout << *m_ppa << endl;
2412 cout <<
"Data: my rank : " << m_rank <<
"particles : \n" ;
2413 m_ppa->forAllParticles((
void (T::*)())(&T::print));
2419 console.
Debug() <<
"time spent calculating force : " << forcetime <<
" sec\n";
2420 console.
Debug() <<
"time spent communicating : " << commtime <<
" sec\n";
2421 console.
Debug() <<
"time spent packing : " << packtime <<
" sec\n";
2422 console.
Debug() <<
"time spent unpacking : " << unpacktime <<
" sec\n";
2439 m_tml_comm.recv_broadcast_cont(fieldname,0);
2441 m_tml_comm.recv_broadcast(
id,0);
2443 m_tml_comm.recv_broadcast(is_tagged,0);
2446 typename T::ScalarFieldFunction rdf=T::getScalarFieldFunction(fieldname);
2455 m_tml_comm.recv_broadcast(tag,0);
2457 m_tml_comm.recv_broadcast(mask,0);
2461 m_field_slaves.insert(make_pair(
id,new_spfs));
2470 console.
XDebug() <<
"TSubLattice<T>::addVectorParticleField\n";
2474 m_tml_comm.recv_broadcast_cont(fieldname,0);
2475 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2476 m_tml_comm.recv_broadcast(
id,0);
2478 m_tml_comm.recv_broadcast(is_tagged,0);
2479 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2481 typename T::VectorFieldFunction rdf=T::getVectorFieldFunction(fieldname);
2490 m_tml_comm.recv_broadcast(tag,0);
2492 m_tml_comm.recv_broadcast(mask,0);
2496 m_field_slaves.insert(make_pair(
id,new_vpfs));
2498 console.
Debug() <<
"end TSubLattice<T>::addVectorParticleField\n";
2508 console.
XDebug() <<
"TSubLattice<T>::addScalarInteractionField\n";
2512 int id,is_tagged,tag,mask,is_checked;
2514 m_tml_comm.recv_broadcast_cont(fieldname,0);
2515 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2516 m_tml_comm.recv_broadcast(
id,0);
2518 m_tml_comm.recv_broadcast_cont(igname,0);
2519 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2520 m_tml_comm.recv_broadcast_cont(igtype,0);
2521 console.
XDebug() <<
"recvd. interaction group name: " << igtype <<
"\n";
2522 m_tml_comm.recv_broadcast(is_tagged,0);
2523 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2526 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2529 m_tml_comm.recv_broadcast(tag,0);
2530 m_tml_comm.recv_broadcast(mask,0);
2532 m_tml_comm.recv_broadcast(is_checked,0);
2533 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2535 if(it!=m_dpis.end())
2539 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2540 m_field_slaves.insert(make_pair(
id,new_sifs));
2544 it=m_bpis.find(igname);
2545 if(it!=m_bpis.end()){
2548 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2549 m_field_slaves.insert(make_pair(
id,new_sifs));
2554 it=m_damping.find(igname);
2555 if(it!=m_damping.end())
2558 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2559 m_field_slaves.insert(make_pair(
id,new_sifs));
2563 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2568 console.
XDebug() <<
"end TSubLattice<T>::addScalarInteractionField\n";
2577 console.
Debug() <<
"TSubLattice<T>::addVectorInteractionField\n";
2581 int id,is_tagged,tag,mask,is_checked;
2583 m_tml_comm.recv_broadcast_cont(fieldname,0);
2584 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2585 m_tml_comm.recv_broadcast(
id,0);
2587 m_tml_comm.recv_broadcast_cont(igname,0);
2588 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2589 m_tml_comm.recv_broadcast_cont(igtype,0);
2590 console.
XDebug() <<
"recvd. interaction group type: " << igtype <<
"\n";
2591 m_tml_comm.recv_broadcast(is_tagged,0);
2592 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2595 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2598 m_tml_comm.recv_broadcast(tag,0);
2599 m_tml_comm.recv_broadcast(mask,0);
2601 m_tml_comm.recv_broadcast(is_checked,0);
2602 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2604 if(it!=m_dpis.end())
2608 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2610 m_field_slaves.insert(make_pair(
id,new_sifs));
2612 console.
Error()<<
"ERROR: could not generate Field Slave for field " << fieldname <<
"\n";
2617 it=m_bpis.find(igname);
2618 if(it!=m_bpis.end()){
2621 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2622 m_field_slaves.insert(make_pair(
id,new_sifs));
2627 it=m_damping.find(igname);
2628 if(it!=m_damping.end())
2631 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2632 m_field_slaves.insert(make_pair(
id,new_sifs));
2636 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2641 console.
Debug() <<
"end TSubLattice<T>::addVectorInteractionField\n";
2651 console.
Debug() <<
"TSubLattice<T>::addVectorTriangleField()\n";
2657 m_tml_comm.recv_broadcast_cont(fieldname,0);
2658 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2659 m_tml_comm.recv_broadcast_cont(meshname,0);
2660 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
2661 m_tml_comm.recv_broadcast(
id,0);
2664 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
2666 if (tm!=m_mesh.end()){
2674 m_field_slaves.insert(make_pair(
id,new_vfs));
2676 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
2677 if(m2d!=m_mesh2d.end()){
2684 m_field_slaves.insert(make_pair(
id,new_efs));
2687 console.
Debug() <<
"end TSubLattice<T>::addVectorTriangleField()\n";
2696 console.
Debug() <<
"TSubLattice<T>::addScalarTriangleField()\n";
2702 m_tml_comm.recv_broadcast_cont(fieldname,0);
2703 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2704 m_tml_comm.recv_broadcast_cont(meshname,0);
2705 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
2706 m_tml_comm.recv_broadcast(
id,0);
2716 m_field_slaves.insert(make_pair(
id,new_vtfs));
2717 console.
Debug() <<
"end TSubLattice<T>::addScalarTriangleField()\n";
2726 console.
XDebug() <<
"begin TSubLattice<T>::addVectorWallField()\n";
2728 string tmp_wallname;
2729 vector<string> wallnames;
2734 m_tml_comm.recv_broadcast_cont(fieldname,0);
2735 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2736 m_tml_comm.recv_broadcast(nwall,0);
2738 for(
int i=0;i<nwall;i++){
2739 m_tml_comm.recv_broadcast_cont(tmp_wallname,0);
2740 wallnames.push_back(tmp_wallname);
2741 console.
XDebug() <<
"recvd. wallname: " << tmp_wallname <<
"\n";
2742 tmp_wallname.clear();
2744 m_tml_comm.recv_broadcast(
id,0);
2748 map<string,CWall*>::iterator cwalliter=m_walls.find(*(wallnames.begin()));
2749 if(cwalliter==m_walls.end()){
2750 std::stringstream msg;
2752 <<
"ERROR in addVectorWallField: wallname '"
2753 << *(wallnames.begin()) <<
" 'invalid. Valid wall names: ";
2754 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
2756 msg <<
"'" << it->first <<
"' ";
2759 throw std::runtime_error(msg.str());
2762 int sumflag=(cwalliter->second)->getFieldSummationFlag(fieldname);
2764 if(m_tml_comm.rank()==1){
2765 m_tml_comm.send(sumflag,0);
2767 m_tml_comm.barrier();
2770 AWallFieldSlave* new_fs=(cwalliter->second)->generateVectorFieldSlave(&m_tml_comm,fieldname);
2773 vector<string>::iterator niter=wallnames.begin();
2774 if(niter!=wallnames.end()) niter++ ;
2775 while(niter!=wallnames.end()){
2776 string wname=*niter;
2777 map<string,CWall*>::iterator
iter=m_walls.find(wname);
2778 if(iter==m_walls.end()){
2779 std::stringstream msg;
2781 <<
"ERROR in addVectorWallField: wallname '"
2782 << wname <<
" 'invalid";
2783 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
2785 msg <<
"'" << it->first <<
"' ";
2789 throw std::runtime_error(msg.str());
2791 new_fs->
addWall(iter->second);
2796 m_field_slaves.insert(make_pair(
id,new_fs));
2798 console.
Error() <<
"ERROR in addVectorWallField: got NULL Slave\n";
2802 console.
XDebug() <<
"end TSubLattice<T>::addVectorWallField()\n";
2811 console.
Debug() <<
"TSubLattice<T>::sendFieldData()\n";
2814 m_tml_comm.recv_broadcast(
id,0);
2815 console.
Debug() <<
"received field id " <<
id <<
" for data collection\n" ;
2816 if(m_field_slaves[
id] !=
NULL)
2818 m_field_slaves[id]->sendData();
2822 cerr <<
"NULL pointer in m_field_slaves!" << endl;
2825 console.
Debug() <<
"end TSubLattice<T>::sendFieldData()\n";
2837 std::streamsize oldprec=oStream.precision(9);
2846 const std::string delim =
"\n";
2849 while (particleIt.hasNext()) {
2850 particleIt.next().saveSnapShotData(oStream);
2857 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
2858 typename NameBondedInteractionsMap::iterator it;
2859 oStream << m_bpis.size() << delim;
2860 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
2861 it->second->saveSnapShotData(oStream);
2866 oStream <<
"TMIG " << m_mesh.size() << delim;
2867 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
2868 tm_iter!=m_mesh.end();
2870 oStream << tm_iter->first << delim;
2871 tm_iter->second->writeCheckPoint(oStream,delim);
2875 oStream.precision(oldprec);
2884 const std::string delim =
"\n";
2888 m_ppa->saveCheckPointData(oStream);
2893 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
2894 typename NameBondedInteractionsMap::iterator it;
2895 oStream << m_bpis.size() << delim;
2896 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
2897 it->second->saveCheckPointData(oStream);
2905 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
2908 if(
iter->second->willSave()) count_save++;
2910 oStream << count_save << delim;
2911 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
2914 if(
iter->second->willSave()) {
2915 iter->second->saveCheckPointData(oStream);
2921 oStream <<
"Walls " << m_walls.size() << delim;
2922 for(map<string,CWall*>::iterator w_iter=m_walls.begin();
2923 w_iter!=m_walls.end();
2925 oStream << w_iter->first << delim;
2926 w_iter->second->writeCheckPoint(oStream,delim);
2930 oStream <<
"TriMesh " << m_mesh.size() << delim;
2931 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
2932 tm_iter!=m_mesh.end();
2934 oStream << tm_iter->first << delim;
2935 tm_iter->second->writeCheckPoint(oStream,delim);
2938 oStream <<
"Mesh2D " << m_mesh2d.size() << delim;
2939 for(
typename map<string,Mesh2D*>::iterator tm_iter=m_mesh2d.begin();
2940 tm_iter!=m_mesh2d.end();
2942 oStream << tm_iter->first << delim;
2943 tm_iter->second->writeCheckPoint(oStream,delim);
2951 m_ppa->loadCheckPointData(iStream);
2956 barrier.
wait(
"PPA rebuild");
2960 unsigned int nr_bonded_ig;
2961 iStream >> nr_bonded_ig;
2965 if(nr_bonded_ig!=m_bpis.size()){
2966 std::cerr <<
"number of bonded interaction groups differ between snapshot and script!" << std::endl;
2968 for (map<string,AParallelInteractionStorage*>::iterator it = m_bpis.begin();
2971 it->second->loadCheckPointData(iStream);
2976 unsigned int nr_nonbonded_ig;
2977 iStream >> nr_nonbonded_ig;
2981 if(nr_nonbonded_ig!=m_dpis.size()){
2982 std::cerr <<
"number of dynamic interaction groups differ between snapshot and script!" << std::endl;
2984 for (map<string,AParallelInteractionStorage*>::iterator it = m_dpis.begin();
2987 it->second->loadCheckPointData(iStream);
2993 if(token!=
"Walls") {
2994 std::cerr <<
"expected Walls , got " << token << std::endl;
3001 for(
int i=0;i<nwalls;i++){
3005 m_walls[wname]=new_wall;
3012 if(token!=
"TriMesh") {
3013 std::cerr <<
"expected TriMesh , got " << token << std::endl;
3018 for(
int i=0;i<nmesh;i++){
3022 m_mesh.insert(make_pair(mname,new_tm));
3026 if(token!=
"Mesh2D") {
3027 std::cerr <<
"expected Mesh2D , got " << token << std::endl;
3032 for(
int i=0;i<nmesh;i++){
3036 m_mesh2d.insert(make_pair(mname,new_m2d));
3049 vector<int> ref_vec;
3059 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3060 if (tm!=m_mesh.end()){
3062 iter!=(tm->second)->corners_end();
3064 ref_vec.push_back(
iter->getID());
3067 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3068 if(m2d!=m_mesh2d.end()){
3070 iter!=(m2d->second)->corners_end();
3072 ref_vec.push_back(
iter->getID());
3075 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3079 m_tml_comm.send_gather(ref_vec,0);
3081 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3091 vector<int> ref_vec;
3101 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3102 if (tm!=m_mesh.end()){
3104 iter!=(tm->second)->triangles_end();
3106 ref_vec.push_back(
iter->getID());
3109 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3110 if(m2d!=m_mesh2d.end()){
3112 iter!=(m2d->second)->edges_end();
3114 ref_vec.push_back(
iter->getID());
3117 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3121 m_tml_comm.send_gather(ref_vec,0);
3123 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3141 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3142 if(m2d!=m_mesh2d.end()){
3143 vector<pair<int,Vec3> > data_vec;
3148 m_tml_comm.send_gather(data_vec,0);
3150 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMesh2DStress() !! \n";
3153 console.
XDebug() <<
"end TSubLattice<T>::getMesh2DStress()\n";
3162 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): enter\n";
3167 const std::string meshName = param_buffer.
pop_string();
3171 map<string,TriMesh*>::iterator m=m_mesh.find(meshName);
3172 if(m != m_mesh.end()){
3173 vector<pair<int,Vec3> > data_vec;
3178 m_tml_comm.send_gather(data_vec,0);
3180 std::stringstream msg;
3181 msg <<
"Invalid mesh name: " << meshName <<
". No such triangular mesh.";
3182 throw std::runtime_error(msg.str().c_str());
3185 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): exit\n";
virtual void addBondedWIG()
Definition: SubLattice.hpp:425
virtual void loadCheckPoint(istream &)
Definition: TriMesh.cpp:285
virtual void moveSingleNode()
Definition: SubLattice.hpp:2000
Definition: LatticeParam.h:29
virtual void printData()
Definition: SubLattice.hpp:2410
virtual Vec3 pop_vector()
Definition: mpibuf.cpp:26
double x0
Definition: FractalFriction.h:40
virtual void addScalarParticleField()
Definition: SubLattice.hpp:2433
double k
Definition: BTriMeshIP.h:21
virtual void printTimes()
Definition: SubLattice.hpp:2417
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:453
virtual void addScalarTriangleField()
Definition: SubLattice.hpp:2694
virtual void getWallForce()
Definition: SubLattice.hpp:512
void buildFromPPATagged(int, int)
Definition: mesh2d_pis_eb.hpp:357
double k_s
Definition: RotThermFricInteraction.h:51
virtual void addSingleIG()
Definition: SubLattice.hpp:1141
double m_alpha
Definition: SubLattice.h:93
virtual ~TSubLattice()
Definition: SubLattice.hpp:170
double y0
Definition: FractalFriction.h:40
Definition: RotThermParticle.h:54
int m_last_ns
Definition: SubLattice.h:95
virtual int getNumParticles()
Definition: SubLattice.hpp:230
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:2506
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:1942
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:1378
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:2724
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:617
virtual void exchangePos()
Definition: SubLattice.hpp:1503
virtual void moveParticleTo()
Definition: SubLattice.hpp:1959
double dx
Definition: FractalFriction.h:40
void integrate(double)
Definition: SubLattice.hpp:1640
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: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:109
virtual void addMesh2D()
Definition: SubLattice.hpp:995
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
BasicCon & Error(bool h=true)
set verbose level of next message to "err"
Definition: console.cpp:261
virtual void setParticleNonTrans()
Definition: SubLattice.hpp:2222
base class for all walls
Definition: Wall.h:39
virtual void addCappedBondedIG()
Definition: SubLattice.hpp:1304
virtual void rebuildParticleArray()
Definition: SubLattice.hpp:1777
bool hasNext() const
Definition: pp_array.hpp:663
virtual void addElasticWIG()
Definition: SubLattice.hpp:389
virtual void checkNeighbors()
Definition: SubLattice.hpp:1890
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:2468
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:61
double r_cut
Definition: AdhesiveFriction.h:35
virtual void setVelocityOfWall()
Definition: SubLattice.hpp:2311
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:1692
virtual void setTaggedParticleVel()
Definition: SubLattice.hpp:2237
virtual void setParticleDensity()
Definition: SubLattice.hpp:2346
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:316
virtual void getMeshNodeRef()
Definition: SubLattice.hpp:3046
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:2206
virtual void applyForceToWall()
Definition: SubLattice.hpp:2291
bool meanR_scaling
Definition: RotFricInteraction.h:79
double m_k
Definition: ElasticInteraction.h:28
virtual void setTimeStepSize(double dt)
Definition: SubLattice.hpp:1596
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:854
virtual void initNeighborTable(const Vec3 &, const Vec3 &)
Definition: SubLattice.hpp:198
double unpacktime
Definition: SubLattice.h:115
Particle & next()
Definition: pp_array.hpp:669
void calcHeatTrans()
Definition: SubLattice.hpp:1746
Definition: BMesh2DIP.h:16
bool scaling
Definition: RotFricInteraction.h:77
virtual void addPairIG()
Definition: SubLattice.hpp:571
double m_cutoff
Definition: LinearDashpotInteraction.h:28
virtual void sendDataToMaster()
Definition: SubLattice.hpp:2364
double k
Definition: RotFricInteraction.h:72
virtual void moveWallBy()
Definition: SubLattice.hpp:2253
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:592
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:2053
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:1368
std::string getWallName() const
Definition: brokenEWallInteractionGroup.h:40
virtual void countParticles()
Definition: SubLattice.hpp:2386
double m_E
Definition: HertzianViscoElasticInteraction.h:28
double diffusivity
Definition: RotThermFricInteraction.h:53
virtual void getTriMeshForce()
Definition: SubLattice.hpp:3160
virtual void addBondedMesh2DIG()
Definition: SubLattice.hpp:1082
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:939
Interaction group parameters for CLocalDampingGroup.
Definition: LocalDampingIGP.h:27
virtual void saveCheckPointData(std::ostream &oStream)
Definition: SubLattice.hpp:2882
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:1034
class for slave part of scalar field defined on the particles
Definition: VectorParticleFieldSlave.h:31
void zeroHeat()
Definition: SubLattice.hpp:1704
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:1467
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:1668
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:1821
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:1552
CEWallIGP * extractEWallIGP(AMPIBuffer *)
Definition: EWallInteractionGroup.cpp:53
const std::string & Name() const
Definition: IGParam.h:44
virtual void send()
Definition: mpisgvbuf.cpp:287
void integrateTherm(double dt)
Definition: SubLattice.hpp:1683
virtual void sendFieldData()
Definition: SubLattice.hpp:2809
CVWallIGP * extractVWallIGP(AMPIBuffer *B)
Definition: ViscWallIG.cpp:54
void buildFromPPAByGap(double)
Definition: mesh2d_pis_eb.hpp:405
virtual void addDamping()
Definition: SubLattice.hpp:1191
virtual void saveSnapShotData(std::ostream &oStream)
Definition: SubLattice.hpp:2834
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:339
double(Triangle::* ScalarFieldFunction)() const
Definition: Triangle.h:51
virtual void addRotBondedIG()
Definition: SubLattice.hpp:1362
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:1842
virtual void addBondedIG()
Definition: SubLattice.hpp:1257
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:370
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:1786
double alpha() const
Definition: LatticeParam.h:43
virtual void addTriMeshIG()
Definition: SubLattice.hpp:892
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:2948
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:3130
void calcHeatFrict()
Definition: SubLattice.hpp:1728
virtual void do2dCalculations(bool do2d)
Definition: SubLattice.hpp:224
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:2272
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:2575
virtual void moveTaggedNodes()
Definition: SubLattice.hpp:2029
double m_kr
Definition: RotElasticInteraction.h:31
std::pair< int, Vec3 > getParticlePosn(int particleId)
Definition: SubLattice.hpp:2099
Abstract base class for slave part of field.
Definition: FieldSlave.h:22
virtual void setExIG()
Definition: SubLattice.hpp:1434
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:3088
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:2400
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:2190
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:2649
virtual void Update(ParallelParticleArray< T > *)=0
virtual void addViscWIG()
Definition: SubLattice.hpp:543
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:2066
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:1976
double m_nu
Definition: HertzianViscoElasticFrictionInteraction.h:51
void zeroForces()
Definition: SubLattice.hpp:1516
virtual bool doAddDamping(const string &, CVarMPIBuffer &)
Definition: SubLattice.hpp:1214
double m_nrange
Definition: SubLattice.h:91
double k
Spring constant.
Definition: BondedInteraction.h:51
virtual void oneStep()
Definition: SubLattice.hpp:1652
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:1990
virtual void setParticleVelocity()
Definition: SubLattice.hpp:2330
virtual void tagParticleNearestTo()
Definition: SubLattice.hpp:2163
double dt
Definition: RotFricInteraction.h:76
std::vector< SimpleParticle > ParticleVector
Definition: SimpleNTable3D.h:22
virtual void getParticleData(const IdVector &particleIdVector)
Definition: SubLattice.hpp:2123
virtual void getWallPos()
Definition: SubLattice.hpp:481
Definition: ETriMeshIP.h:17
void addWall(CWall *)
Definition: WallFieldSlave.cpp:31
Definition: RotThermElasticInteraction.h:23