91 #include <boost/limits.hpp>
92 using std::runtime_error;
122 m_singleParticleInteractions(),
134 m_comm(MPI_COMM_NULL),
135 m_tml_comm(MPI_COMM_NULL),
136 m_worker_comm(MPI_COMM_NULL),
137 m_tml_worker_comm(MPI_COMM_NULL),
177 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): enter\n";
179 <<
"TSubLattice<T>::~TSubLattice():"
180 <<
" deleting wall interaction groups...\n";
198 <<
"TSubLattice<T>::~TSubLattice():"
199 <<
" deleting particle array...\n";
200 if (m_ppa !=
NULL)
delete m_ppa;
201 console.
Debug() <<
"TSubLattice<T>::~TSubLattice(): exit\n";
213 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
")\n";
215 double xsize=max.
X()-min.
X();
216 xsize=m_nrange*ceil(xsize/m_nrange);
217 double ysize=max.Y()-min.
Y();
218 ysize=m_nrange*ceil(ysize/m_nrange);
219 double zsize=max.Z()-min.
Z();
220 zsize=m_nrange*ceil(zsize/m_nrange);
221 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
222 Vec3 nmin=min-0.5*grow;
223 Vec3 nmax=max+0.5*grow;
224 console.
XDebug() <<
"range=" << m_nrange <<
", new min,max: " << nmin <<
", " << nmax <<
"\n";
233 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable\n";
239 T::setDo2dCalculations(do2d);
245 return m_ppa->getInnerSize();
258 console.
XDebug() <<
"TSubLattice<T>::initNeighborTable(" << min <<
"," << max <<
") circ\n";
259 double xsize,ysize,zsize;
264 xsize=max.
X()-min.
X();
265 if(fabs(xsize/m_nrange-lrint(xsize/m_nrange))>1e-6)
268 console.
Info() <<
"Circular x-size incompatible with range, adjusting...\n";
269 m_nrange = xsize/floor(xsize/m_nrange);
270 console.
Info() <<
"New range = " << m_nrange <<
"\n";
276 xsize=max.X()-min.
X();
277 xsize=m_nrange*ceil(xsize/m_nrange);
282 ysize=max.Y()-min.
Y();
283 if(fabs(ysize/m_nrange-lrint(ysize/m_nrange))>1e-6)
291 ysize=max.Y()-min.
Y();
292 ysize=m_nrange*ceil(ysize/m_nrange);
297 zsize=max.Z()-min.
Z();
298 if(fabs(zsize/m_nrange-lrint(zsize/m_nrange))>1e-6)
306 zsize=max.Z()-min.
Z();
307 zsize=m_nrange*ceil(zsize/m_nrange);
309 Vec3 grow=
Vec3(xsize,ysize,zsize)-(max-min);
310 Vec3 nmin=min-0.5*grow;
311 Vec3 nmax=max+0.5*grow;
312 console.
XDebug() <<
"range, new min, max: " << m_nrange <<
" " << nmin << nmax <<
"\n";
319 console.
XDebug() <<
"end TSubLattice<T>::initNeighborTable (circ)\n";
331 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: enter\n";
333 vector<T> recv_buffer;
336 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
337 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" particles \n";
338 m_ppa->insert(recv_buffer);
340 barrier.
wait(
"TSubLattice<T>::receiveParticles");
342 console.
XDebug() <<
"TSubLattice<T>::receiveParticles: exit\n";
354 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: enter\n";
356 vector<int> recv_buffer;
359 m_tml_comm.recv_broadcast_cont_packed(recv_buffer,0);
360 console.
XDebug() <<
"recvd " << recv_buffer.size() <<
" connections \n";
361 vector<int>::iterator it;
362 for (it = recv_buffer.begin(); it != recv_buffer.end(); it+=3)
364 if ( (m_ppa->getParticlePtrByIndex( *(it+1)) ==
NULL ) ||
365 (m_ppa->getParticlePtrByIndex( *(it+2)) ==
NULL ) )
369 m_temp_conn[*(it)].push_back(*(it+1));
370 m_temp_conn[*(it)].push_back(*(it+2));
373 barrier.
wait(
"TSubLattice<T>::receiveConnections");
375 console.
XDebug() <<
"TSubLattice<T>::receiveConnections: exit\n";
393 m_walls[name]=
new CWall(ipos,inorm);
404 console.
XDebug() <<
"TSubLattice<T>::addSphereBody: enter\n" ;
414 console.
XDebug() <<
"TSubLattice<T>::addSphereBody: exit\n" ;
423 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: enter\n" ;
432 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
433 if(
iter!=m_walls.end()){
441 m_WIG.insert(make_pair(wigp->
getName(),newCEWIG));
443 std::stringstream msg;
444 msg <<
"wall name '" << wallname <<
"' not found in map of walls";
445 throw std::runtime_error(msg.str().c_str());
449 console.
XDebug() <<
"TSubLattice<T>::addElasticWIG: exit\n" ;
458 console.
XDebug() <<
"TSubLattice<T>::addESphereBodyIG: enter\n" ;
467 map<string,CSphereBody*>::iterator
iter=m_spheres.find(wallname);
468 if(
iter!=m_spheres.end()){
476 m_SIG.insert(make_pair(wigp->
getName(),newCEWIG));
478 std::stringstream msg;
479 msg <<
"sphere body name '" << wallname <<
"' not found in map of sphere bodies";
480 throw std::runtime_error(msg.str().c_str());
484 console.
XDebug() <<
"TSubLattice<T>::addESphereBodyIG: exit\n" ;
493 console.
XDebug() <<
"TSubLattice<T>::addTaggedElasticWIG: enter\n" ;
500 int tag=param_buffer.
pop_int();
501 int mask=param_buffer.
pop_int();
505 console.
XDebug() << wallname <<
" tag= " << tag <<
" mask= " << mask <<
"\n" ;
506 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
507 if(
iter!=m_walls.end()){
517 m_WIG.insert(make_pair(wigp->
getName(),newCTEWIG));
519 std::stringstream msg;
520 msg <<
"wall name '" << wallname <<
"' not found in map of walls";
521 throw std::runtime_error(msg.str().c_str());
525 console.
XDebug() <<
"TSubLattice<T>::addTaggedElasticWIG: exit\n" ;
535 console.
XDebug() <<
"TSubLattice<T>::addBondedWIG: enter\n" ;
544 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
545 if(
iter!=m_walls.end()){
548 m_WIG.insert(make_pair(wigp->
getName(),newCBWIG));
550 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
563 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: enter\n" ;
572 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
573 if(
iter!=m_walls.end()){
576 m_WIG.insert(make_pair(wigp->
getName(),newCDWIG));
578 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
582 console.
XDebug() <<
"TSubLattice<T>::addDirBondedWIG: exit\n" ;
591 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: enter\n" ;
602 map<string,CWall*>::iterator
iter=m_walls.find(wname);
603 if(
iter!=m_walls.end()){
604 pos=(
iter->second)->getPos();
607 pos=
Vec3(0.0,0.0,0.0);
612 m_tml_comm.send_gather(vpos,0);
613 console.
XDebug() <<
"TSubLattice<T>::getWallPosition: exit\n" ;
622 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyPosition: enter\n" ;
633 map<string,CSphereBody*>::iterator
iter=m_spheres.find(wname);
634 if(
iter!=m_spheres.end()){
635 pos=(
iter->second)->getPos();
638 pos=
Vec3(0.0,0.0,0.0);
643 m_tml_comm.send_gather(vpos,0);
644 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyPosition: exit\n" ;
653 console.
XDebug() <<
"TSubLattice<T>::getWallForce: enter\n" ;
664 map<string,CWall*>::iterator
iter=m_walls.find(wname);
665 if(
iter!=m_walls.end()){
666 force=(
iter->second)->getForce();
669 force=
Vec3(0.0,0.0,0.0);
673 vforce.push_back(force);
674 m_tml_comm.send_gather(vforce,0);
684 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyForce: enter\n" ;
695 map<string,CSphereBody*>::iterator
iter=m_spheres.find(wname);
696 if(
iter!=m_spheres.end()){
697 force=(
iter->second)->getForce();
700 force=
Vec3(0.0,0.0,0.0);
704 vforce.push_back(force);
705 m_tml_comm.send_gather(vforce,0);
706 console.
XDebug() <<
"TSubLattice<T>::getSphereBodyForce: exit\n" ;
724 map<string,CWall*>::iterator
iter=m_walls.find(wallname);
725 if(
iter!=m_walls.end()){
728 m_WIG.insert(make_pair(wigp->
getName(),newCVWIG));
730 console.
Error() <<
"wall name " << wallname <<
" not found in map of walls\n";
753 doAddPIG(name,type,param_buffer,
false);
774 doAddPIG(name,type,param_buffer,
true);
776 console.
XDebug() <<
"end TSubLattice<T>::addTaggedPairIG()\n";
792 if(type==
"Elastic") {
797 int tag1=param_buffer.
pop_int();
798 int mask1=param_buffer.
pop_int();
799 int tag2=param_buffer.
pop_int();
800 int mask2=param_buffer.
pop_int();
802 << tag1 <<
" , " << mask1 <<
" , "
803 << tag2 <<
" , " << mask2 <<
"\n";
809 }
else if (type==
"Friction") {
817 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
820 }
else if (type==
"AdhesiveFriction") {
828 <<
"k,mu,k_s,dt,r_cut: " << figp.
k <<
" , " << figp.
mu <<
" , "
829 << figp.
k_s <<
" , " << figp.
dt <<
" " << figp.
r_cut <<
"\n";
832 }
else if (type==
"FractalFriction") {
839 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
847 <<
"x0,y0,dx,dy,nx,ny: "
848 << figp.
x0 <<
" , " << figp.
y0 <<
" , "
849 << figp.
dx <<
" , " << figp.
dy <<
" ,"
850 << figp.
nx <<
" , " << figp.
ny <<
"\n";
851 figp.
mu = boost::shared_ptr<double>(
new double[figp.
nx*figp.
ny]);
853 for(
int i=0;i<figp.
nx*figp.
ny;i++)
860 }
else if(type==
"VWFriction") {
869 <<
"k,mu,k_s,dt,alpha: " << figp.
k <<
" , " << figp.
mu <<
" , "
870 << figp.
k_s <<
" , " << figp.
dt <<
"\n";
873 }
else if(type==
"RotElastic"){
878 }
else if (type==
"RotFriction"){
888 <<
"k,mu_s,mu_d,k_s,dt,scaling: " << rfigp.
k <<
" , "
889 << rfigp.
mu_s <<
" , " << rfigp.
mu_d <<
" , "
890 << rfigp.
k_s <<
" , " << rfigp.
dt <<
" , " << rfigp.
scaling <<
"\n";
892 int tag1=param_buffer.
pop_int();
893 int mask1=param_buffer.
pop_int();
894 int tag2=param_buffer.
pop_int();
895 int mask2=param_buffer.
pop_int();
897 << tag1 <<
" , " << mask1 <<
" , "
898 << tag2 <<
" , " << mask2 <<
"\n";
904 }
else if (type ==
"RotThermElastic") {
909 <<
"k=" << eigp.
m_kr <<
" , "
921 }
else if (type ==
"RotThermFriction") {
930 <<
"k=" << rfigp.
k <<
" , "
931 <<
"mu_d=" << rfigp.
mu_d <<
" , "
932 <<
"mu_s=" << rfigp.
mu_s <<
" , "
933 <<
"k_s=" << rfigp.
k_s <<
" , "
935 <<
"dt=" << rfigp.
dt <<
"\n";
946 }
else if(type==
"HertzianElastic") {
951 int tag1=param_buffer.
pop_int();
952 int mask1=param_buffer.
pop_int();
953 int tag2=param_buffer.
pop_int();
954 int mask2=param_buffer.
pop_int();
960 }
else if(type==
"HertzianViscoElasticFriction") {
969 int tag1=param_buffer.
pop_int();
970 int mask1=param_buffer.
pop_int();
971 int tag2=param_buffer.
pop_int();
972 int mask2=param_buffer.
pop_int();
978 }
else if(type==
"HertzianViscoElastic") {
984 int tag1=param_buffer.
pop_int();
985 int mask1=param_buffer.
pop_int();
986 int tag2=param_buffer.
pop_int();
987 int mask2=param_buffer.
pop_int();
993 }
else if(type==
"HertzMindlin") {
1000 int tag1=param_buffer.
pop_int();
1001 int mask1=param_buffer.
pop_int();
1002 int tag2=param_buffer.
pop_int();
1003 int mask2=param_buffer.
pop_int();
1009 }
else if(type==
"HertzMindlinVisco") {
1017 int tag1=param_buffer.
pop_int();
1018 int mask1=param_buffer.
pop_int();
1019 int tag2=param_buffer.
pop_int();
1020 int mask2=param_buffer.
pop_int();
1026 }
else if(type==
"LinearDashpot") {
1031 int tag1=param_buffer.
pop_int();
1032 int mask1=param_buffer.
pop_int();
1033 int tag2=param_buffer.
pop_int();
1034 int mask2=param_buffer.
pop_int();
1041 cerr <<
"Unknown interaction group name "
1043 <<
" in TSubLattice<T>::addPairIG()" << endl;
1047 if(res) m_dpis.insert(make_pair(name,new_pis));
1064 vector<MeshNodeData> node_recv_buffer;
1065 vector<MeshTriData> tri_recv_buffer;
1072 console.
XDebug()<<
"TriMesh name: " << name.c_str() <<
"\n";
1075 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
1076 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
1079 m_tml_comm.recv_broadcast_cont_packed(tri_recv_buffer,0);
1080 console.
XDebug() <<
"recvd " << tri_recv_buffer.size() <<
" triangles \n";
1084 new_tm->
LoadMesh(node_recv_buffer,tri_recv_buffer);
1086 m_mesh.insert(make_pair(name,new_tm));
1107 console.
XDebug()<<
"TriMeshIG type: " << type.c_str() <<
"\n";
1109 console.
XDebug()<<
"TriMeshIG name: " << name.c_str() <<
"\n";
1111 console.
XDebug()<<
"TriMeshIG mesh name: " << meshname.c_str() <<
"\n";
1115 if (m_mesh.find(meshname) != m_mesh.end())
1117 tmp = m_mesh[meshname];
1120 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
1129 m_dpis.insert(make_pair(name,new_pis));
1131 throw runtime_error(
"unknown type in TSubLattice<T>::addTriMeshIG:" + type);
1144 console.
XDebug() <<
"TSubLattice<T>::addBondedTriMeshIG()\n";
1155 console.
XDebug()<<
"BTriMeshIG name: " << name.c_str() <<
"\n";
1157 console.
XDebug()<<
"BTriMeshIG mesh name: " << meshname.c_str() <<
"\n";
1162 string buildtype = param_buffer.
pop_string();
1163 console.
XDebug()<<
"BTriMeshIG build type: " << buildtype.c_str() <<
"\n";
1167 if (m_mesh.find(meshname) != m_mesh.end())
1169 tmp = m_mesh[meshname];
1172 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addTriMeshIG:" + meshname);
1178 if(buildtype==
"BuildByTag"){
1179 int tag=param_buffer.
pop_int();
1180 int mask=param_buffer.
pop_int();
1182 m_bpis.insert(make_pair(name,new_pis));
1183 }
else if(buildtype==
"BuildByGap"){
1186 m_bpis.insert(make_pair(name,new_pis));
1188 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedTriMeshIG:" + buildtype);
1191 console.
XDebug() <<
"end TSubLattice<T>::addBondedTriMeshIG()\n";
1205 vector<MeshNodeData2D> node_recv_buffer;
1206 vector<MeshEdgeData2D> edge_recv_buffer;
1216 m_tml_comm.recv_broadcast_cont_packed(node_recv_buffer,0);
1217 console.
XDebug() <<
"recvd " << node_recv_buffer.size() <<
" nodes \n";
1220 m_tml_comm.recv_broadcast_cont_packed(edge_recv_buffer,0);
1221 console.
XDebug() <<
"recvd " << edge_recv_buffer.size() <<
" edges \n";
1225 new_tm->
LoadMesh(node_recv_buffer,edge_recv_buffer);
1227 m_mesh2d.insert(make_pair(name,new_tm));
1249 console.
XDebug()<<
"Mesh2DIG type: " << type.c_str() <<
"\n";
1251 console.
XDebug()<<
"Mesh2DIG name: " << name.c_str() <<
"\n";
1253 console.
XDebug()<<
"Mesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1257 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1259 tmp = m_mesh2d[meshname];
1262 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addMesh2DIG:" + meshname);
1271 m_dpis.insert(make_pair(name,new_pis));
1273 throw runtime_error(
"unknown type in TSubLattice<T>::addMesh2DIG:" + type);
1287 console.
XDebug() <<
"TSubLattice<T>::addBondedMesh2DIG()\n";
1298 console.
XDebug() <<
"BMesh2DIG name: " << name.c_str() <<
"\n";
1300 console.
XDebug() <<
"BMesh2DIG mesh name: " << meshname.c_str() <<
"\n";
1305 string buildtype = param_buffer.
pop_string();
1306 console.
XDebug() <<
"BMesh2DIG build type: " << buildtype.c_str() <<
"\n";
1310 if (m_mesh2d.find(meshname) != m_mesh2d.end())
1312 tmp = m_mesh2d[meshname];
1315 throw runtime_error(
"unknown mesh name in TSubLattice<T>::addBondedMesh2DIG:" + meshname);
1321 if(buildtype==
"BuildByTag"){
1322 int tag=param_buffer.
pop_int();
1323 int mask=param_buffer.
pop_int();
1325 m_bpis.insert(make_pair(name,new_pis));
1326 }
else if(buildtype==
"BuildByGap"){
1329 m_bpis.insert(make_pair(name,new_pis));
1331 throw runtime_error(
"unknown build type in TSubLattice<T>::addBondedMesh2DIG:" + buildtype);
1334 console.
XDebug() <<
"end TSubLattice<T>::addBonded2DMeshIG()\n";
1356 if(type==
"Gravity"){
1360 m_singleParticleInteractions.insert(
1367 else if (type==
"Buoyancy"){
1371 m_singleParticleInteractions.insert(
1379 throw std::runtime_error(
1380 std::string(
"Trying to setup SIG of unknown type: ")
1402 console.
XDebug()<<
"Damping type: " << type.c_str() <<
"\n";
1405 doAddDamping(type,param_buffer);
1420 string damping_name;
1427 damping_name=
"Damping";
1429 }
else if (type==
"ABCDamping"){
1432 damping_name=params->
getName();
1434 }
else if (type==
"LocalDamping"){
1437 damping_name=params->
getName();
1440 std::stringstream msg;
1441 msg <<
"Trying to setup Damping of unknown type: " << type;
1443 throw std::runtime_error(msg.str());
1449 m_damping.insert(make_pair(damping_name,DG));
1450 m_damping[damping_name]->update();
1475 <<
"Got BondedIG parameters: " << param.
tag
1476 <<
" " << name.c_str() <<
" "
1477 << param.
k <<
" " << param.
rbreak <<
"\n";
1488 vector<int> vi(2,-1);
1489 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1491 vi[0] = (m_temp_conn[param.
tag][i]);
1492 vi[1] = (m_temp_conn[param.
tag][i+1]);
1497 m_bpis.insert(make_pair(name,B_PIS));
1509 console.
XDebug() <<
"TSubLattice<T>::addCappedBondedIG()\n";
1514 int tag=param_buffer.
pop_int();
1521 <<
"Got CappedBondedIG parameters: " << tag
1522 <<
" " << name.c_str() <<
" "
1523 << k <<
" " << rbreak <<
" " << maxforce <<
"\n";
1550 vector<int> vi(2,-1);
1551 for(
size_t i=0;i<m_temp_conn[tag].size();i+=2)
1553 vi[0] = (m_temp_conn[tag][i]);
1554 vi[1] = (m_temp_conn[tag][i+1]);
1559 m_bpis.insert(make_pair(name,B_PIS));
1561 console.
XDebug() <<
"end TSubLattice<T>::addCappedBondedIG()\n";
1567 console.
Error() <<
"TSubLattice<T>::addRotBondedIG() => trying to add rotational bonded IG to nonrotational model\n";
1573 console.
Error() <<
"TSubLattice<T>::addRotThermBondedIG() => trying to add rotational thermal bonded IG to nonrotational model\n";
1588 int tag=param_buffer.
pop_int();
1594 <<
"Got ShortBondedIG parameters: " << tag
1595 <<
" " << name.c_str() <<
" "
1596 << k <<
" " << rbreak <<
"\n";
1617 vector<int> vi(2,-1);
1618 for(
size_t i=0;i<m_temp_conn[param.
tag].size();i+=2)
1620 vi[0] = (m_temp_conn[param.
tag][i]);
1621 vi[1] = (m_temp_conn[param.
tag][i+1]);
1626 m_bpis.insert(make_pair(name,B_PIS));
1628 console.
XDebug() <<
"end TSubLattice<T>::addShortBondedIG()\n";
1649 map<string,AParallelInteractionStorage*>::iterator excluding_ig=m_bpis.find(s1);
1650 if(excluding_ig==m_bpis.end()){
1651 excluding_ig=m_dpis.find(s2);
1653 map<string,AParallelInteractionStorage*>::iterator dynamic_ig=m_dpis.find(s2);
1654 if((excluding_ig!=m_dpis.end())&&(dynamic_ig!=m_dpis.end()))
1658 dynamic_ig->second->addExIG(excluding_ig->second);
1662 console.
Error() <<
"TSubLattice<T>::setExIG() - nonexisting interaction group \n";
1684 map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.find(igname);
1686 if(
iter!=m_dpis.end()){
1688 delete m_dpis[igname];
1692 typename map<string,AWallInteractionGroup<T>*>::iterator it2=m_WIG.find(igname);
1693 if(it2!=m_WIG.end()){
1695 delete m_WIG[igname];
1701 console.
Error() <<
"TSubLattice<T>::removeIG() - nonexisting interaction group - ignore removal\n";
1714 m_ppa->exchange(&T::getExchangeValues,&T::setExchangeValues);
1728 m_ppa->forAllParticles(&T::zeroForce);
1730 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
1733 (
iter->second)->zeroForces();
1737 for(map<string,Mesh2D*>::iterator
iter=m_mesh2d.begin();
1738 iter!=m_mesh2d.end();
1740 (
iter->second)->zeroForces();
1743 for(
typename map<string,CWall*>::iterator
iter=m_walls.begin();
1744 iter!=m_walls.end();
1747 (
iter->second)->zeroForce();
1750 for(
typename map<string,CSphereBody*>::iterator
iter=m_spheres.begin();
1751 iter!=m_spheres.end();
1754 (
iter->second)->zeroForce();
1773 (it->second)->calcForces();
1778 (it->second)->calcForces();
1782 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1783 siter != m_singleParticleInteractions.end();
1787 (siter->second)->calcForces();
1790 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1792 (
iter->second)->calcForces();
1795 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1797 (
iter->second)->calcForces();
1800 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1802 (
iter->second)->calcForces();
1823 (it->second)->setTimeStepSize(dt);
1828 (it->second)->setTimeStepSize(dt);
1832 typename NameIGroupMap::iterator siter=this->m_singleParticleInteractions.begin();
1833 siter != m_singleParticleInteractions.end();
1837 (siter->second)->setTimeStepSize(dt);
1840 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
iter!=m_dpis.end();
iter++)
1842 (
iter->second)->setTimeStepSize(dt);
1845 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
iter!=m_bpis.end();
iter++)
1847 (
iter->second)->setTimeStepSize(dt);
1850 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
iter!=m_damping.end();
iter++)
1852 (
iter->second)->setTimeStepSize(dt);
1855 console.
XDebug() <<
"end TSubLattice<T>::setTimeStepSize() \n";
1867 m_ppa->forAllParticles(&T::integrate,dt);
1868 m_ppa->forAllParticles(&T::rescale) ;
1882 if (this->getParticleType() ==
"RotTherm")
1884 this->oneStepTherm();
1897 integrateTherm(m_dt);
1910 m_ppa->forAllParticles(&T::integrateTherm,dt);
1912 console.
XDebug() <<
"end TSubLattice<T>::integrateTherm \n";
1919 m_ppa->forAllParticles(&T::thermExpansion);
1921 console.
XDebug() <<
"end TSubLattice<T>::thermExpansion() \n";
1933 m_ppa->forAllParticles(&T::zeroHeat);
1958 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1963 (
iter->second)->calcHeatFrict();
1966 console.
XDebug() <<
"end TSubLattice<T>::calcHeatFrict() \n";
1977 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
1982 (
iter->second)->calcHeatTrans();
1986 typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
1991 (
iter->second)->calcHeatTrans();
1994 console.
XDebug() <<
"end TSubLattice<T>::calcHeatTrans() \n";
2013 m_pTimers->start(
"RebuildInteractions");
2014 m_pTimers->resume(
"NeighbourSearch");
2015 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
2019 console.
Debug() <<
"exchg & rebuild BPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
2020 (
iter->second)->exchange();
2021 (
iter->second)->rebuild();
2024 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
2028 console.
Debug() <<
"exchg & rebuild DPIS " <<
iter->first <<
" at node " << m_rank <<
"\n";
2029 (
iter->second)->exchange();
2030 m_pTimers->pause(
"RebuildInteractions");
2031 m_pTimers->pause(
"NeighbourSearch");
2032 barrier.
wait(
"dpis::exchange");
2033 m_pTimers->resume(
"RebuildInteractions");
2034 m_pTimers->resume(
"NeighbourSearch");
2035 (
iter->second)->rebuild();
2037 resetDisplacements();
2038 m_pTimers->stop(
"RebuildInteractions");
2047 console.
Debug() <<
"CSubLattice<T>::searchNeighbors()\n";
2049 m_pTimers->start(
"NeighbourSearch");
2050 m_pTimers->start(
"RebuildParticleArray");
2051 rebuildParticleArray();
2052 m_pTimers->stop(
"RebuildParticleArray");
2053 m_pTimers->pause(
"NeighbourSearch");
2054 barrier.
wait(
"PPA rebuild");
2055 rebuildInteractions();
2056 m_pTimers->stop(
"NeighbourSearch");
2057 console.
Debug() <<
"end CSubLattice<T>::searchNeighbors()\n";
2069 console.
Debug() <<
"m_ppa->getTimeStamp() " << m_ppa->getTimeStamp() <<
" m_last_ns " << m_last_ns <<
"\n";
2070 bool need_update=
false;
2072 m_pTimers->start(
"UpdateBondedInteractions");
2073 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_bpis.begin();
2077 bool n=(
iter->second)->update();
2078 need_update=need_update || n;
2080 m_pTimers->stop(
"UpdateBondedInteractions");
2081 if((m_ppa->getTimeStamp() > m_last_ns) || need_update)
2083 m_pTimers->start(
"UpdateDynamicInteractions");
2084 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
2088 bool n=(
iter->second)->update();
2089 need_update=need_update || n;
2091 m_pTimers->stop(
"UpdateDynamicInteractions");
2096 (it->second)->Update(m_ppa);
2102 (it->second)->Update(m_ppa);
2104 for(
typename map<string,AParallelInteractionStorage*>::iterator
iter=m_damping.begin();
2105 iter!=m_damping.end();
2107 (
iter->second)->update();
2109 m_last_ns=m_ppa->getTimeStamp();
2112 console.
Debug() <<
"end TSubLattice<T>::updateInteractions()\n";
2122 console.
Debug() <<
"TSubLattice<T>::checkNeighbors()\n";
2125 double alpha=0.5*m_alpha;
2126 double srsqr=alpha*alpha;
2132 m_ppa->forAllParticlesGet(displ,&T::getDisplacement);
2135 vector<Vec3>::iterator it=displ.begin();
2136 while((it!=displ.end())&&(mdsqr<srsqr))
2138 double sqdisp=(*it)*(*it);
2139 mdsqr = ((mdsqr < sqdisp) ? sqdisp : mdsqr);
2143 console.
XDebug() <<
"max squared displacement " << mdsqr <<
"alpha^2 = " << srsqr <<
"\n";
2153 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
2157 if(
iter->second->hasMovedBy(alpha)){
2164 console.
Debug() <<
"end TSubLattice<T>::checkNeighbors()\n";
2174 console.
Debug() <<
"slave " << m_rank <<
" resetDisplacements()\n";
2175 m_ppa->forAllParticles(&T::resetDisplacement);
2176 for(map<string,TriMesh*>::iterator
iter=m_mesh.begin();
2179 iter->second->resetCurrentDisplacement();
2181 console.
Debug() <<
"slave " << m_rank <<
" end resetDisplacements()\n";
2191 console.
Debug() <<
"TSubLattice<T>::moveParticleTo()\n";
2197 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::moveToRel),mv);
2198 console.
Debug() <<
"end TSubLattice<T>::moveParticleTo()\n";
2208 console.
Debug() <<
"TSubLattice<T>::moveTaggedParticlesBy()\n";
2212 const int tag = buffer.
pop_int();
2214 m_ppa->forParticleTag(tag, (
void (T::*)(
Vec3))(&T::moveBy),dx);
2215 console.
Debug() <<
"end TSubLattice<T>::moveTaggedParticlesBy()\n";
2222 m_ppa->forParticle(particleId, (
void (T::*)(
Vec3))(&T::moveTo), posn);
2232 console.
Debug() <<
"TSubLattice<T>::moveSingleNode()\n";
2240 console.
XDebug() <<
"name :" << name <<
" id : " <<
id <<
" disp " << disp <<
"\n";
2242 map<string,TriMesh*>::iterator tm=m_mesh.find(name);
2243 if (tm!=m_mesh.end()){
2244 (tm->second)->moveNode(
id,disp);
2246 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(name);
2247 if(m2d!=m_mesh2d.end()){
2248 (m2d->second)->moveNode(
id,disp);
2251 console.
Debug() <<
"end TSubLattice<T>::moveSingleNode()\n";
2261 console.
Error() <<
"TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n";
2264 "TSubLattice<T>::moveTaggedNodes() NOT IMPLEMENTED\n"
2285 map<string,TriMesh*>::iterator tm=m_mesh.find(meshName);
2286 if (tm != m_mesh.end()){
2287 (tm->second)->translateBy(translation);
2289 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshName);
2290 if(m2d!=m_mesh2d.end()){
2291 (m2d->second)->translateBy(translation);
2298 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: enter\n";
2299 const T *pClosest =
NULL;
2300 double minDistSqrd = std::numeric_limits<double>::max();
2303 m_ppa->getInnerParticleIterator();
2306 const T &p = it.
next();
2307 const double distSqrd = (pt - p.getPos()).norm2();
2308 if (distSqrd < minDistSqrd)
2310 minDistSqrd = distSqrd;
2314 console.
Debug() <<
"TSubLattice<T>::findParticleNearestTo: exit\n";
2319 std::make_pair(sqrt(minDistSqrd), pClosest->getID())
2321 std::make_pair(std::numeric_limits<double>::max(), -1)
2331 const T *particle =
NULL;
2333 m_ppa->getInnerParticleIterator();
2336 const T &p = it.
next();
2337 if (p.getID() == particleId)
2342 if (particle !=
NULL)
2344 return std::make_pair(particleId, particle->getPos());
2356 <<
"TSubLattice<T>::getParticleData: enter\n";
2357 typedef std::set<int> IdSet;
2362 m_ppa->getInnerParticleIterator();
2363 if (particleIdVector.size() > 0)
2365 IdSet idSet(particleIdVector.begin(), particleIdVector.end());
2367 <<
"TSubLattice<T>::getParticleData: iterating over particles\n";
2370 const T &p = it.
next();
2371 if (idSet.find(p.getID()) != idSet.end())
2373 particleVector.push_back(p);
2379 m_ppa->getAllInnerParticles(particleVector);
2382 <<
"TSubLattice<T>::getParticleData:"
2383 <<
" sending particle data of size " << particleVector.size() <<
"\n";
2384 m_tml_comm.send_gather_packed(particleVector, 0);
2386 <<
"TSubLattice<T>::getParticleData: exit\n";
2395 console.
Debug() <<
"TSubLattice<T>::tagParticleNearestTo()\n";
2404 T* part_ptr=m_ppa->getParticlePtrByPosition(pos);
2406 int old_tag=part_ptr->getTag();
2407 int new_tag=(old_tag & (~mask)) | (tag & mask);
2408 part_ptr->setTag(new_tag);
2410 cout <<
"pos, realpos: " << pos <<
" " << part_ptr->getPos() <<
" old tag, new tag " << old_tag <<
" " << part_ptr->getTag() << endl;
2412 console.
Debug() <<
"end TSubLattice<T>::tagParticleNearestTo()\n";
2422 console.
Debug() <<
"TSubLattice<T>::setParticleNonDynamic()\n";
2427 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamic));
2428 console.
Debug() <<
"end TSubLattice<T>::setParticleNonDynamic()\n";
2438 console.
Debug() <<
"TSubLattice<T>::setParticleNonRot()\n";
2443 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicRot));
2444 console.
Debug() <<
"end TSubLattice<T>::setParticleNonRot()\n";
2454 console.
Debug() <<
"TSubLattice<T>::setParticleNonTrans()\n";
2459 m_ppa->forParticleTag(tag,(
void (T::*)())(&T::setNonDynamicLinear));
2460 console.
Debug() <<
"end TSubLattice<T>::setParticleNonTrans()\n";
2469 console.
Debug() <<
"TSubLattice<T>::setTaggedParticleVel()\n";
2475 m_ppa->forParticleTag(tag,(
void (T::*)(
Vec3))(&T::setVel),v);
2476 console.
XDebug() <<
"end TSubLattice<T>::setTaggedParticleVel()\n";
2491 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2492 if(
iter!=m_walls.end())
2494 (
iter->second)->moveBy(mv);
2510 typename map<string,CSphereBody*>::iterator
iter=m_spheres.find(wname);
2511 if(
iter!=m_spheres.end())
2513 (
iter->second)->moveBy(mv);
2529 typename map<string,CWall*>::iterator
iter=m_walls.find(wname);
2530 if(
iter!=m_walls.end())
2532 (
iter->second)->setNormal(wn);
2548 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2549 if(
iter!=m_WIG.end())
2551 (
iter->second)->applyForce(f);
2562 console.
XDebug() <<
"TSubLattice<T>::setVelocityOfWall()\n";
2568 typename map<string,AWallInteractionGroup<T>*>::iterator
iter=m_WIG.find(wname);
2569 if(
iter!=m_WIG.end())
2571 (
iter->second)->setVelocity(v);
2581 console.
Debug() <<
"TSubLattice<T>::setParticleVelocity()\n";
2587 m_ppa->forParticle(
id,(
void (T::*)(
Vec3))(&T::setVel),mv);
2588 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2597 console.
Debug() <<
"TSubLattice<T>::setParticleDensity()\n";
2604 m_ppa->forParticleTagMask(tag,mask,(
void (T::*)(
double))(&T::setDensity),rho);
2605 console.
XDebug() <<
"end TSubLattice<T>::setParticleVelocity()\n";
2615 console.
Debug() <<
"TSubLattice<T>::sendDataToMaster()\n";
2616 vector<Vec3> positions;
2617 vector<double> radii;
2620 m_ppa->forAllParticlesGet(positions,(
Vec3 (T::*)()
const)(&T::getPos));
2621 m_ppa->forAllParticlesGet(radii,(
double (T::*)()
const)(&T::getRad));
2622 m_ppa->forAllParticlesGet(ids,(
int (T::*)()
const)(&T::getID));
2624 m_tml_comm.send_gather(positions,0);
2625 m_tml_comm.send_gather(radii,0);
2626 m_tml_comm.send_gather(ids,0);
2628 console.
Debug() <<
"end TSubLattice<T>::sendDataToMaster()\n";
2640 buffer.
append(m_ppa->size());
2651 cout<<
"My Rank : " << m_rank <<
"\n" ;
2654 cout << *m_ppa << endl;
2661 cout <<
"Data: my rank : " << m_rank <<
"particles : \n" ;
2662 m_ppa->forAllParticles((
void (T::*)())(&T::print));
2668 console.
Debug() <<
"time spent calculating force : " << forcetime <<
" sec\n";
2669 console.
Debug() <<
"time spent communicating : " << commtime <<
" sec\n";
2670 console.
Debug() <<
"time spent packing : " << packtime <<
" sec\n";
2671 console.
Debug() <<
"time spent unpacking : " << unpacktime <<
" sec\n";
2688 m_tml_comm.recv_broadcast_cont(fieldname,0);
2690 m_tml_comm.recv_broadcast(
id,0);
2692 m_tml_comm.recv_broadcast(is_tagged,0);
2695 typename T::ScalarFieldFunction rdf=T::getScalarFieldFunction(fieldname);
2704 m_tml_comm.recv_broadcast(tag,0);
2706 m_tml_comm.recv_broadcast(mask,0);
2710 m_field_slaves.insert(make_pair(
id,new_spfs));
2719 console.
XDebug() <<
"TSubLattice<T>::addVectorParticleField\n";
2723 m_tml_comm.recv_broadcast_cont(fieldname,0);
2724 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2725 m_tml_comm.recv_broadcast(
id,0);
2727 m_tml_comm.recv_broadcast(is_tagged,0);
2728 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2730 typename T::VectorFieldFunction rdf=T::getVectorFieldFunction(fieldname);
2739 m_tml_comm.recv_broadcast(tag,0);
2741 m_tml_comm.recv_broadcast(mask,0);
2745 m_field_slaves.insert(make_pair(
id,new_vpfs));
2747 console.
Debug() <<
"end TSubLattice<T>::addVectorParticleField\n";
2757 console.
XDebug() <<
"TSubLattice<T>::addScalarInteractionField\n";
2761 int id,is_tagged,tag,mask,is_checked;
2763 m_tml_comm.recv_broadcast_cont(fieldname,0);
2764 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2765 m_tml_comm.recv_broadcast(
id,0);
2767 m_tml_comm.recv_broadcast_cont(igname,0);
2768 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2769 m_tml_comm.recv_broadcast_cont(igtype,0);
2770 console.
XDebug() <<
"recvd. interaction group name: " << igtype <<
"\n";
2771 m_tml_comm.recv_broadcast(is_tagged,0);
2772 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2775 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2778 m_tml_comm.recv_broadcast(tag,0);
2779 m_tml_comm.recv_broadcast(mask,0);
2781 m_tml_comm.recv_broadcast(is_checked,0);
2782 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2784 if(it!=m_dpis.end())
2788 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2789 m_field_slaves.insert(make_pair(
id,new_sifs));
2793 it=m_bpis.find(igname);
2794 if(it!=m_bpis.end()){
2797 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2798 m_field_slaves.insert(make_pair(
id,new_sifs));
2803 it=m_damping.find(igname);
2804 if(it!=m_damping.end())
2807 new_sifs=(it->second)->generateNewScalarFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2808 m_field_slaves.insert(make_pair(
id,new_sifs));
2812 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2817 console.
XDebug() <<
"end TSubLattice<T>::addScalarInteractionField\n";
2826 console.
Debug() <<
"TSubLattice<T>::addVectorInteractionField\n";
2830 int id,is_tagged,tag,mask,is_checked;
2832 m_tml_comm.recv_broadcast_cont(fieldname,0);
2833 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2834 m_tml_comm.recv_broadcast(
id,0);
2836 m_tml_comm.recv_broadcast_cont(igname,0);
2837 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2838 m_tml_comm.recv_broadcast_cont(igtype,0);
2839 console.
XDebug() <<
"recvd. interaction group type: " << igtype <<
"\n";
2840 m_tml_comm.recv_broadcast(is_tagged,0);
2841 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2844 map<string,AParallelInteractionStorage*>::iterator it=m_dpis.find(igname);
2847 m_tml_comm.recv_broadcast(tag,0);
2848 m_tml_comm.recv_broadcast(mask,0);
2850 m_tml_comm.recv_broadcast(is_checked,0);
2851 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2853 if(it!=m_dpis.end())
2857 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2859 m_field_slaves.insert(make_pair(
id,new_sifs));
2861 console.
Error()<<
"ERROR: could not generate Field Slave for field " << fieldname <<
"\n";
2866 it=m_bpis.find(igname);
2867 if(it!=m_bpis.end()){
2870 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2871 m_field_slaves.insert(make_pair(
id,new_sifs));
2876 it=m_damping.find(igname);
2877 if(it!=m_damping.end())
2880 new_sifs=(it->second)->generateNewVectorFieldSlave(&m_tml_comm,fieldname,is_checked,is_tagged,tag,mask);
2881 m_field_slaves.insert(make_pair(
id,new_sifs));
2885 cerr <<
"ERROR : unknown interaction group name in addScalarInteractionField " << endl;
2890 console.
Debug() <<
"end TSubLattice<T>::addVectorInteractionField\n";
2899 console.
XDebug() <<
"TSubLattice<T>::addScalarHistoryInteractionField\n";
2903 int id,is_tagged,tag,mask,is_checked;
2905 m_tml_comm.recv_broadcast_cont(fieldname,0);
2906 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2907 m_tml_comm.recv_broadcast(
id,0);
2909 m_tml_comm.recv_broadcast_cont(igname,0);
2910 console.
XDebug() <<
"recvd. interaction group name: " << igname <<
"\n";
2911 m_tml_comm.recv_broadcast_cont(igtype,0);
2912 console.
XDebug() <<
"recvd. interaction group name: " << igtype <<
"\n";
2913 m_tml_comm.recv_broadcast(is_tagged,0);
2914 console.
XDebug() <<
"recvd. is_tagged: " << is_tagged <<
"\n";
2918 m_tml_comm.recv_broadcast(tag,0);
2919 m_tml_comm.recv_broadcast(mask,0);
2921 m_tml_comm.recv_broadcast(is_checked,0);
2922 console.
XDebug() <<
"recvd. is_checked: " << is_checked <<
"\n";
2925 map<string,AParallelInteractionStorage*>::iterator it=m_bpis.find(igname);
2926 if(it!=m_bpis.end()){
2929 new_sifs=(it->second)->generateNewScalarHistoryFieldSlave(&m_tml_comm,fieldname,is_tagged,tag,mask);
2931 m_field_slaves.insert(make_pair(
id,new_sifs));
2934 cerr <<
"ERROR : unknown interaction group name in addScalarHistoryInteractionField " << endl;
2937 console.
XDebug() <<
"end TSubLattice<T>::addScalarHistoryInteractionField\n";
2948 console.
Debug() <<
"TSubLattice<T>::addVectorTriangleField()\n";
2954 m_tml_comm.recv_broadcast_cont(fieldname,0);
2955 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
2956 m_tml_comm.recv_broadcast_cont(meshname,0);
2957 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
2958 m_tml_comm.recv_broadcast(
id,0);
2961 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
2963 if (tm!=m_mesh.end()){
2971 m_field_slaves.insert(make_pair(
id,new_vfs));
2973 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
2974 if(m2d!=m_mesh2d.end()){
2981 m_field_slaves.insert(make_pair(
id,new_efs));
2984 console.
Debug() <<
"end TSubLattice<T>::addVectorTriangleField()\n";
2993 console.
Debug() <<
"TSubLattice<T>::addScalarTriangleField()\n";
2999 m_tml_comm.recv_broadcast_cont(fieldname,0);
3000 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
3001 m_tml_comm.recv_broadcast_cont(meshname,0);
3002 console.
XDebug() <<
"recvd. meshname: " << meshname <<
"\n";
3003 m_tml_comm.recv_broadcast(
id,0);
3013 m_field_slaves.insert(make_pair(
id,new_vtfs));
3014 console.
Debug() <<
"end TSubLattice<T>::addScalarTriangleField()\n";
3023 console.
XDebug() <<
"begin TSubLattice<T>::addVectorWallField()\n";
3025 string tmp_wallname;
3026 vector<string> wallnames;
3031 m_tml_comm.recv_broadcast_cont(fieldname,0);
3032 console.
XDebug() <<
"recvd. fieldname: " << fieldname <<
"\n";
3033 m_tml_comm.recv_broadcast(nwall,0);
3035 for(
int i=0;i<nwall;i++){
3036 m_tml_comm.recv_broadcast_cont(tmp_wallname,0);
3037 wallnames.push_back(tmp_wallname);
3038 console.
XDebug() <<
"recvd. wallname: " << tmp_wallname <<
"\n";
3039 tmp_wallname.clear();
3041 m_tml_comm.recv_broadcast(
id,0);
3045 map<string,CWall*>::iterator cwalliter=m_walls.find(*(wallnames.begin()));
3046 if(cwalliter==m_walls.end()){
3047 std::stringstream msg;
3049 <<
"ERROR in addVectorWallField: wallname '"
3050 << *(wallnames.begin()) <<
" 'invalid. Valid wall names: ";
3051 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
3053 msg <<
"'" << it->first <<
"' ";
3056 throw std::runtime_error(msg.str());
3059 int sumflag=(cwalliter->second)->getFieldSummationFlag(fieldname);
3061 if(m_tml_comm.rank()==1){
3062 m_tml_comm.send(sumflag,0);
3064 m_tml_comm.barrier();
3067 AWallFieldSlave* new_fs=(cwalliter->second)->generateVectorFieldSlave(&m_tml_comm,fieldname);
3070 vector<string>::iterator niter=wallnames.begin();
3071 if(niter!=wallnames.end()) niter++ ;
3072 while(niter!=wallnames.end()){
3073 string wname=*niter;
3074 map<string,CWall*>::iterator
iter=m_walls.find(wname);
3075 if(
iter==m_walls.end()){
3076 std::stringstream msg;
3078 <<
"ERROR in addVectorWallField: wallname '"
3079 << wname <<
" 'invalid";
3080 for (map<string,CWall*>::const_iterator it = m_walls.begin(); it != m_walls.end(); it++)
3082 msg <<
"'" << it->first <<
"' ";
3086 throw std::runtime_error(msg.str());
3093 m_field_slaves.insert(make_pair(
id,new_fs));
3095 console.
Error() <<
"ERROR in addVectorWallField: got NULL Slave\n";
3099 console.
XDebug() <<
"end TSubLattice<T>::addVectorWallField()\n";
3108 console.
Debug() <<
"TSubLattice<T>::sendFieldData()\n";
3111 m_tml_comm.recv_broadcast(
id,0);
3112 console.
Debug() <<
"received field id " <<
id <<
" for data collection\n" ;
3113 if(m_field_slaves[
id] !=
NULL)
3115 m_field_slaves[id]->sendData();
3119 cerr <<
"NULL pointer in m_field_slaves!" << endl;
3122 console.
Debug() <<
"end TSubLattice<T>::sendFieldData()\n";
3134 std::streamsize oldprec=oStream.precision(9);
3143 const std::string delim =
"\n";
3146 while (particleIt.
hasNext()) {
3147 particleIt.
next().saveSnapShotData(oStream);
3154 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
3155 typename NameBondedInteractionsMap::iterator it;
3156 oStream << m_bpis.size() << delim;
3157 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
3158 it->second->saveSnapShotData(oStream);
3163 oStream <<
"TMIG " << m_mesh.size() << delim;
3164 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
3165 tm_iter!=m_mesh.end();
3167 oStream << tm_iter->first << delim;
3168 tm_iter->second->writeCheckPoint(oStream,delim);
3172 oStream.precision(oldprec);
3181 const std::string delim =
"\n";
3185 m_ppa->saveCheckPointData(oStream);
3190 typedef std::map<string,AParallelInteractionStorage*> NameBondedInteractionsMap;
3191 typename NameBondedInteractionsMap::iterator it;
3192 oStream << m_bpis.size() << delim;
3193 for (it = m_bpis.begin(); it != m_bpis.end(); it++) {
3194 it->second->saveCheckPointData(oStream);
3202 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
3205 if(
iter->second->willSave()) count_save++;
3207 oStream << count_save << delim;
3208 for(std::map<string,AParallelInteractionStorage*>::iterator
iter=m_dpis.begin();
3211 if(
iter->second->willSave()) {
3212 iter->second->saveCheckPointData(oStream);
3218 oStream <<
"Walls " << m_walls.size() << delim;
3219 for(map<string,CWall*>::iterator w_iter=m_walls.begin();
3220 w_iter!=m_walls.end();
3222 oStream << w_iter->first << delim;
3223 w_iter->second->writeCheckPoint(oStream,delim);
3227 oStream <<
"Spheres " << m_spheres.size() << delim;
3228 for(map<string,CSphereBody*>::iterator w_iter=m_spheres.begin();
3229 w_iter!=m_spheres.end();
3231 oStream << w_iter->first << delim;
3232 w_iter->second->writeCheckPoint(oStream,delim);
3236 oStream <<
"TriMesh " << m_mesh.size() << delim;
3237 for(
typename map<string,TriMesh*>::iterator tm_iter=m_mesh.begin();
3238 tm_iter!=m_mesh.end();
3240 oStream << tm_iter->first << delim;
3241 tm_iter->second->writeCheckPoint(oStream,delim);
3244 oStream <<
"Mesh2D " << m_mesh2d.size() << delim;
3245 for(
typename map<string,Mesh2D*>::iterator tm_iter=m_mesh2d.begin();
3246 tm_iter!=m_mesh2d.end();
3248 oStream << tm_iter->first << delim;
3249 tm_iter->second->writeCheckPoint(oStream,delim);
3257 m_ppa->loadCheckPointData(iStream);
3262 barrier.
wait(
"PPA rebuild");
3266 unsigned int nr_bonded_ig;
3267 iStream >> nr_bonded_ig;
3271 if(nr_bonded_ig!=m_bpis.size()){
3272 std::cerr <<
"number of bonded interaction groups differ between snapshot and script!" << std::endl;
3274 for (map<string,AParallelInteractionStorage*>::iterator it = m_bpis.begin();
3277 it->second->loadCheckPointData(iStream);
3282 unsigned int nr_nonbonded_ig;
3283 iStream >> nr_nonbonded_ig;
3287 if(nr_nonbonded_ig!=m_dpis.size()){
3288 std::cerr <<
"number of dynamic interaction groups differ between snapshot and script!" << std::endl;
3290 for (map<string,AParallelInteractionStorage*>::iterator it = m_dpis.begin();
3293 it->second->loadCheckPointData(iStream);
3299 if(token!=
"Walls") {
3300 std::cerr <<
"expected Walls , got " << token << std::endl;
3307 for(
int i=0;i<nwalls;i++){
3311 m_walls[wname]=new_wall;
3315 if(token!=
"Spheres") {
3316 std::cerr <<
"expected Spheres , got " << token << std::endl;
3321 iStream >> nspheres;
3324 for(
int i=0;i<nspheres;i++){
3328 m_spheres[sname]=new_sphere;
3335 if(token!=
"TriMesh") {
3336 std::cerr <<
"expected TriMesh , got " << token << std::endl;
3341 for(
int i=0;i<nmesh;i++){
3345 m_mesh.insert(make_pair(mname,new_tm));
3349 if(token!=
"Mesh2D") {
3350 std::cerr <<
"expected Mesh2D , got " << token << std::endl;
3355 for(
int i=0;i<nmesh;i++){
3359 m_mesh2d.insert(make_pair(mname,new_m2d));
3372 vector<int> ref_vec;
3382 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3383 if (tm!=m_mesh.end()){
3385 iter!=(tm->second)->corners_end();
3387 ref_vec.push_back(
iter->getID());
3390 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3391 if(m2d!=m_mesh2d.end()){
3393 iter!=(m2d->second)->corners_end();
3395 ref_vec.push_back(
iter->getID());
3398 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3402 m_tml_comm.send_gather(ref_vec,0);
3404 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3414 vector<int> ref_vec;
3424 map<string,TriMesh*>::iterator tm=m_mesh.find(meshname);
3425 if (tm!=m_mesh.end()){
3427 iter!=(tm->second)->triangles_end();
3429 ref_vec.push_back(
iter->getID());
3432 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3433 if(m2d!=m_mesh2d.end()){
3435 iter!=(m2d->second)->edges_end();
3437 ref_vec.push_back(
iter->getID());
3440 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMeshNodeRef() !! \n";
3444 m_tml_comm.send_gather(ref_vec,0);
3446 console.
XDebug() <<
"end TSubLattice<T>::getMeshNodeRef()\n";
3464 map<string,Mesh2D*>::iterator m2d=m_mesh2d.find(meshname);
3465 if(m2d!=m_mesh2d.end()){
3466 vector<pair<int,Vec3> > data_vec;
3471 m_tml_comm.send_gather(data_vec,0);
3473 console.
Critical() <<
"ERROR - WRONG MESH NAME IN getMesh2DStress() !! \n";
3476 console.
XDebug() <<
"end TSubLattice<T>::getMesh2DStress()\n";
3485 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): enter\n";
3490 const std::string meshName = param_buffer.
pop_string();
3494 map<string,TriMesh*>::iterator m=m_mesh.find(meshName);
3495 if(m != m_mesh.end()){
3496 vector<pair<int,Vec3> > data_vec;
3501 m_tml_comm.send_gather(data_vec,0);
3503 std::stringstream msg;
3504 msg <<
"Invalid mesh name: " << meshName <<
". No such triangular mesh.";
3505 throw std::runtime_error(msg.str().c_str());
3508 console.
XDebug() <<
"TSubLattice<T>::getTriMeshStress(): exit\n";