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);
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";
279 if (m_geo_info.hasAnyPeriodicDimensions())
280 periodicity = m_geo_info.getPeriodicDimensions();
281 for (
int i=0; i<3; i++)
282 m_particle_dimensions[i] = periodicity[i]==0 ? i : 3;
283 if (m_geo_info.is2d())
284 m_particle_dimensions[2]=3;
285 int periodicTotal = periodicity[0] + periodicity[1] + periodicity[2];
286 if (periodicTotal==1 || periodicTotal==2)
287 std::sort(m_particle_dimensions.begin(), m_particle_dimensions.end());
289 const int numBroadcastParticles = 50000;
290 particleVector.reserve(numBroadcastParticles);
292 <<
"CLatticeMaster::addParticles:"
293 <<
" Beginning add-particle loop..." <<
"\n";
294 for (
int i = 0; particleIt.hasNext(); i++) {
295 const TmplParticle particle(particleIt.next());
298 particlesMinMax(particle);
300 particleVector.push_back(particle);
301 if (((i+1) % 5000) == 0) {
303 <<
"CLatticeMaster::addParticles:"
304 <<
"Adding particle with id "
305 << particleVector.rbegin()->getID() <<
"\n";
308 if (((i+1) % numBroadcastParticles) == 0)
311 <<
" Broadcasting receive cmd...." <<
"\n";
314 <<
"CLatticeMaster::addParticles: Broadcasting particles...." <<
"\n";
315 m_tml_global_comm.broadcast_cont_packed(particleVector);
316 barrier.
wait(
"CLatticeMaster::addParticles: Post particle broadcast.");
317 barrier.
wait(
"CLatticeMaster::addParticles: Post Command.");
318 particleVector.clear();
319 particleVector.reserve(numBroadcastParticles);
323 <<
"CLatticeMaster::addParticles: Done add-particle loop..." <<
"\n";
325 <<
"CLatticeMaster::addParticles: Broadcasting final particle-receive cmd"
329 <<
" Broadcasting final set of particles...\n";
330 m_tml_global_comm.broadcast_cont_packed(particleVector);
331 barrier.
wait(
"Post final particle broadcast.");
332 barrier.
wait(
"Post final particle-broadcast command.");
335 <<
"CLatticeMaster::addParticles: "
336 <<
"Building ntable (searchNeighbours)...\n";
337 searchNeighbors(
true);
339 <<
"CLatticeMaster::addParticles: exit\n";
343 template <
class TmplIterator>
347 <<
"CLatticeMaster::addConnections: enter\n";
352 const int numBroadcastConnections = 100000;
353 vector<int> connectionBuffer;
354 connectionBuffer.reserve(numBroadcastConnections);
356 for (; connectionIt.hasNext(); i++)
358 typename TmplIterator::value_type data = connectionIt.next();
359 connectionBuffer.push_back(data.getTag());
360 connectionBuffer.push_back(data.getP1Id());
361 connectionBuffer.push_back(data.getP2Id());
362 if ((i+1) % 50000 == 0)
364 console.
XDebug() <<
"Adding connection number " << i <<
"\n";
366 if ((i+1) % numBroadcastConnections == 0)
369 <<
" Broadcasting receive cmd...." <<
"\n";
372 <<
"CLatticeMaster::addConnections: Broadcasting connections...." <<
"\n";
373 m_tml_global_comm.broadcast_cont_packed(connectionBuffer);
374 barrier.
wait(
"CLatticeMaster::addConnections: Post connection broadcast.");
375 barrier.
wait(
"CLatticeMaster::addConnections: Post Command.");
376 connectionBuffer.clear();
377 connectionBuffer.reserve(numBroadcastConnections);
383 <<
"CLatticeMaster::addConnections: Done add-connection loop..." <<
"\n";
385 <<
"CLatticeMaster::addConnections: Broadcasting final connection-receive cmd"
389 <<
" Broadcasting final set of connections...\n";
390 m_tml_global_comm.broadcast_cont_packed(connectionBuffer);
391 barrier.
wait(
"Post final connection broadcast.");
392 barrier.
wait(
"Post final connection-broadcast command.");
394 console.
XDebug()<<
"Added " << i <<
" connections..." <<
"\n";
396 searchNeighbors(
true);
398 <<
"CLatticeMaster::addConnections: exit\n";
401 template<
typename TmplParticle>
404 Vec3 position = particle.getPos();
405 double radius = particle.getRad();
407 for (
int j=0, k=m_particle_dimensions[j]; j<3 && k<3; k=m_particle_dimensions[++j]) {
408 if (m_init_min_pt[k]!=m_init_min_pt[k] || position[k]-radius<m_init_min_pt[k])
409 m_init_min_pt[k] = position[k]-radius;
410 if (m_init_max_pt[k]!=m_init_max_pt[k] || position[k]+radius>m_init_max_pt[k])
411 m_init_max_pt[k] = position[k]+radius;