21 using namespace esys::lsm;
28 template <
class TmplParticle>
32 <<
"begin CLatticeMaster::readGeometry: fileName="
40 if(m_bbx_has_been_set){
42 if(!m_geo_info.isCompatible(geoInfo)){
43 std::cerr <<
"Geometry info read from file is incompatible with previously set geometry (bounding box, circular boundaries) - Model may not run properly!" << std::endl;
51 if(m_geo_info.hasAnyPeriodicDimensions()){
52 setSpatialDomain(m_geo_info.getBBoxCorners()[0],m_geo_info.getBBoxCorners()[1],m_geo_info.getPeriodicDimensions());
54 setSpatialDomain(m_geo_info.getBBoxCorners()[0],m_geo_info.getBBoxCorners()[1]);
56 m_bbx_has_been_set=
true;
65 (std::string(
"Unknown particle type ") + geoReader.
getParticleType()).c_str()
69 addParticles<GeometryReader::ParticleIterator,TmplParticle>(particleIt);
74 console.
XDebug()<<
"Number of connections: " << connectionIt.getNumRemaining() <<
"\n";
76 addConnections(connectionIt);
80 template <
typename TmplVisitor>
83 throw std::runtime_error(
"CLatticeMaster::visitMeshFaceReferences: Not implemented.");
86 template <
typename TmplVisitor>
89 console.
XDebug()<<
"CLatticeMaster::visitMesh2dNodeReferences( " << meshName <<
")\n";
95 std::multimap<int,int> ref_mmap;
96 m_tml_global_comm.gather(ref_mmap);
98 std::set<int> ref_set;
99 for(std::multimap<int,int>::iterator
iter=ref_mmap.begin();
100 iter!=ref_mmap.end();
102 ref_set.insert(
iter->second);
104 for (std::set<int>::const_iterator it = ref_set.begin(); it != ref_set.end(); it++)
106 visitor.visitNodeRef(*it);
108 console.
XDebug()<<
"end CLatticeMaster::visitMesh2dNodeReferences()\n";
111 template <
typename TmplVisitor>
114 console.
XDebug()<<
"CLatticeMaster::visitMesh2dEdgeStress( " << meshName <<
")\n";
115 std::multimap<int,pair<int,Vec3> > temp_mm;
116 std::map<int,Vec3> data;
119 cmd.
append(meshName.c_str());
124 m_tml_global_comm.gather(temp_mm);
127 for(std::multimap<
int,pair<int,Vec3> >::iterator
iter=temp_mm.begin();
130 if(data.find((
iter->second).first)==data.end()){
131 data.insert(
iter->second);
133 data[(
iter->second).first]+=(
iter->second).second;
137 for (std::map<int,Vec3>::const_iterator it = data.begin(); it != data.end(); it++)
139 visitor.visitRefStressPair(it->first, it->second);
142 cmd.
wait(
"visitMesh2dEdgeStress");
143 console.
XDebug()<<
"end CLatticeMaster::visitMesh2dEdgeStress()\n";
146 template <
typename TmplVisitor>
148 const string &meshName,
152 console.
XDebug()<<
"CLatticeMaster::visitTriMeshFaceForce( " << meshName <<
")\n";
153 std::multimap<int,pair<int,Vec3> > temp_mm;
154 std::map<int,Vec3> data;
157 cmd.
append(meshName.c_str());
162 m_tml_global_comm.gather(temp_mm);
165 for(std::multimap<
int,pair<int,Vec3> >::iterator
iter=temp_mm.begin();
168 if(data.find((
iter->second).first)==data.end()){
169 data.insert(
iter->second);
171 data[(
iter->second).first]+=(
iter->second).second;
175 for (std::map<int,Vec3>::const_iterator it = data.begin(); it != data.end(); it++)
177 visitor.visitRefForcePair(it->first, it->second);
180 cmd.
wait(
"visitTriMeshFaceStress");
181 console.
XDebug()<<
"end CLatticeMaster::visitTriMeshFaceForce()\n";
184 template <
typename TmplVisitor,
typename TmplParticle>
190 console.
Debug() <<
"CLatticeMaster::visitParticlesOfType: enter\n";
191 typedef std::multimap<int,TmplParticle> ParticleMMap;
192 ParticleMMap particleMMap;
195 <<
"CLatticeMaster::visitParticlesOfType: broadcasting command\n";
200 <<
"CLatticeMaster::visitParticlesOfType: broadcasting particle id's\n";
201 m_tml_global_comm.broadcast_cont(particleIdVector);
204 <<
"CLatticeMaster::visitParticlesOfType:"
205 <<
" gathering particle data from workers\n";
206 m_tml_global_comm.gather_packed(particleMMap);
208 <<
"CLatticeMaster::visitParticlesOfType:"
209 <<
" gathered " << particleMMap.size() <<
" particles\n";
212 <<
"CLatticeMaster::visitParticlesOfType:"
213 <<
" visiting particle data\n";
215 typename ParticleMMap::iterator
iter=particleMMap.begin();
216 iter != particleMMap.end();
220 iter->second.visit(visitor);
223 cmd.
wait(
"visitParticles");
224 console.
Debug() <<
"CLatticeMaster::visitParticlesOfType: exit\n";
227 template <
typename TmplVisitor>
233 console.
Debug() <<
"CLatticeMaster::visitParticles: enter\n";
235 if (m_particle_type ==
"Basic")
237 visitParticlesOfType<TmplVisitor,CParticle>(particleIdVector, visitor);
239 else if (m_particle_type ==
"Rot")
241 visitParticlesOfType<TmplVisitor,CRotParticle>(particleIdVector, visitor);
243 else if (m_particle_type ==
"RotVi")
245 visitParticlesOfType<TmplVisitor,CRotParticleVi>(particleIdVector, visitor);
247 else if (m_particle_type ==
"RotTherm")
249 visitParticlesOfType<TmplVisitor,CRotThermParticle>(particleIdVector, visitor);
255 std::string(
"Unknown particle type: ") + m_particle_type
258 console.
Debug() <<
"CLatticeMaster::visitParticles: exit\n";
261 template <
class TmplIterator,
class TmplParticle>
268 vector<TmplParticle> particleVector;
270 <<
"CLatticeMaster::addParticles:"
271 <<
" Reserving vector memory for particles.\n";
273 const int numBroadcastParticles = 50000;
274 particleVector.reserve(numBroadcastParticles);
276 <<
"CLatticeMaster::addParticles:"
277 <<
" Beginning add-particle loop..." <<
"\n";
278 for (
int i = 0; particleIt.hasNext(); i++) {
279 const TmplParticle particle(particleIt.next());
281 particleVector.push_back(particle);
282 if (((i+1) % 5000) == 0) {
284 <<
"CLatticeMaster::addParticles:"
285 <<
"Adding particle with id "
286 << particleVector.rbegin()->getID() <<
"\n";
289 if (((i+1) % numBroadcastParticles) == 0)
292 <<
" Broadcasting receive cmd...." <<
"\n";
295 <<
"CLatticeMaster::addParticles: Broadcasting particles...." <<
"\n";
296 m_tml_global_comm.broadcast_cont_packed(particleVector);
297 barrier.
wait(
"CLatticeMaster::addParticles: Post particle broadcast.");
298 barrier.
wait(
"CLatticeMaster::addParticles: Post Command.");
299 particleVector.clear();
300 particleVector.reserve(numBroadcastParticles);
304 <<
"CLatticeMaster::addParticles: Done add-particle loop..." <<
"\n";
306 <<
"CLatticeMaster::addParticles: Broadcasting final particle-receive cmd"
310 <<
" Broadcasting final set of particles...\n";
311 m_tml_global_comm.broadcast_cont_packed(particleVector);
312 barrier.
wait(
"Post final particle broadcast.");
313 barrier.
wait(
"Post final particle-broadcast command.");
316 <<
"CLatticeMaster::addParticles: "
317 <<
"Building ntable (searchNeighbours)...\n";
318 searchNeighbors(
true);
320 <<
"CLatticeMaster::addParticles: exit\n";
324 template <
class TmplIterator>
328 <<
"CLatticeMaster::addConnections: enter\n";
333 const int numBroadcastConnections = 100000;
334 vector<int> connectionBuffer;
335 connectionBuffer.reserve(numBroadcastConnections);
337 for (; connectionIt.hasNext(); i++)
339 typename TmplIterator::value_type data = connectionIt.next();
340 connectionBuffer.push_back(data.getTag());
341 connectionBuffer.push_back(data.getP1Id());
342 connectionBuffer.push_back(data.getP2Id());
343 if ((i+1) % 50000 == 0)
345 console.
XDebug() <<
"Adding connection number " << i <<
"\n";
347 if ((i+1) % numBroadcastConnections == 0)
350 <<
" Broadcasting receive cmd...." <<
"\n";
353 <<
"CLatticeMaster::addConnections: Broadcasting connections...." <<
"\n";
354 m_tml_global_comm.broadcast_cont_packed(connectionBuffer);
355 barrier.
wait(
"CLatticeMaster::addConnections: Post connection broadcast.");
356 barrier.
wait(
"CLatticeMaster::addConnections: Post Command.");
357 connectionBuffer.clear();
358 connectionBuffer.reserve(numBroadcastConnections);
364 <<
"CLatticeMaster::addConnections: Done add-connection loop..." <<
"\n";
366 <<
"CLatticeMaster::addConnections: Broadcasting final connection-receive cmd"
370 <<
" Broadcasting final set of connections...\n";
371 m_tml_global_comm.broadcast_cont_packed(connectionBuffer);
372 barrier.
wait(
"Post final connection broadcast.");
373 barrier.
wait(
"Post final connection-broadcast command.");
375 console.
XDebug()<<
"Added " << i <<
" connections..." <<
"\n";
377 searchNeighbors(
true);
379 <<
"CLatticeMaster::addConnections: exit\n";