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";
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;
Lattice Solid Model namespace.
Definition: CheckPointable.cpp:18
Class for sending commands from the LatticeMaster to the SubLatticeControler.
Definition: mpicmdbuf.h:29
A convenience class encapsulating an MPI barrier. Includes timing of the wait and a debug message ( v...
Definition: mpibarrier.h:30
void visitMeshFaceReferences(const string &meshName)
Definition: LatticeMaster.hpp:81
ParticleIterator & getParticleIterator()
Definition: GeometryReader.cpp:281
void wait(const char *)
Definition: mpibarrier.cpp:32
int getNumRemaining() const
Definition: IterativeReader.hpp:51
command for getting mesh node reference list
Definition: GetRef_cmd.h:27
void addConnections(TmplIterator &it)
Definition: LatticeMaster.hpp:344
void visitParticles(const IdVector &particleIdVector, TmplVisitor &visitor)
Definition: LatticeMaster.hpp:228
boost::python::object iter(const boost::python::object &pyOb)
Definition: Util.h:25
base class for broadcast commands
Definition: BroadCast_cmd.h:24
Definition: GeometryReader.h:158
Definition: GeometryInfo.h:33
std::vector< int > IntVector
Definition: LatticeMaster.h:113
void particlesMinMax(const TmplParticle &particle)
Definition: LatticeMaster.hpp:402
std::vector< int > IdVector
Definition: LatticeMaster.h:572
void visitParticlesOfType(const IdVector &particleIdVector, TmplVisitor &visitor)
Definition: LatticeMaster.hpp:185
void setLsmGeoVersion(float version)
Definition: GeometryInfo.cpp:320
Definition: IterativeReader.h:28
void visitTriMeshFaceForce(const string &meshName, TmplVisitor &visitor)
Definition: LatticeMaster.hpp:147
const int CMD_RECEIVECONNECTIONS
Definition: sublattice_cmd.h:85
const int CMD_GETIDPARTICLEDATA
Definition: sublattice_cmd.h:66
Definition: GeometryReader.h:40
void addParticles(TmplIterator &it)
Definition: LatticeMaster.hpp:262
const int CMD_RECEIVEPARTICLES
Definition: sublattice_cmd.h:41
void readGeometry(const std::string &fileName)
Definition: LatticeMaster.hpp:29
void append(const TmplData &basicTypeData)
Definition: BroadCast_cmd.hpp:27
BasicCon & XDebug(bool h=true)
set verbose level of next message to "xdg"
Definition: console.cpp:316
float getLsmGeoVersion() const
Definition: GeometryInfo.cpp:328
const std::string & getParticleType()
Definition: GeometryReader.cpp:276
BasicCon & Debug(bool h=true)
set verbose level of next message to "dbg"
Definition: console.cpp:305
ConnectionIterator & getConnectionIterator()
Definition: GeometryReader.cpp:286
void wait(const std::string &barrierName)
Definition: BroadCast_cmd.cpp:38
void broadcast()
Definition: BroadCast_cmd.cpp:43
const int CMD_GETTRIMESHFORCE
Definition: sublattice_cmd.h:112
void broadcast(int)
Definition: mpicmdbuf.cpp:38
void visitMesh2dEdgeStress(const string &meshName, TmplVisitor &visitor)
Definition: LatticeMaster.hpp:112
const int CMD_GETMESH2DSTRESS
Definition: sublattice_cmd.h:111
void visitMesh2dNodeReferences(const string &meshName, TmplVisitor &visitor)
Definition: LatticeMaster.hpp:87
void broadcastBuffer()
Definition: BroadCast_cmd.cpp:33
void broadcastCommand()
Definition: BroadCast_cmd.cpp:28
const GeometryInfo & getGeometryInfo() const
Definition: GeometryReader.cpp:266