13 #include "Parallel/GetRef_cmd.h"
17 template <
typename TmplVisitor>
18 void CLatticeMaster::visitMeshFaceReferences(
const string &meshName)
20 throw std::runtime_error(
"CLatticeMaster::visitMeshFaceReferences: Not implemented.");
23 template <
typename TmplVisitor>
24 void CLatticeMaster::visitMesh2dNodeReferences(
const string &meshName, TmplVisitor &visitor)
26 console.
XDebug()<<
"CLatticeMaster::visitMesh2dNodeReferences( " << meshName <<
")\n";
32 std::multimap<int,int> ref_mmap;
33 m_tml_global_comm.
gather(ref_mmap);
35 std::set<int> ref_set;
36 for(std::multimap<int,int>::iterator iter=ref_mmap.begin();
39 ref_set.insert(iter->second);
41 for (std::set<int>::const_iterator it = ref_set.begin(); it != ref_set.end(); it++)
43 visitor.visitNodeRef(*it);
45 console.
XDebug()<<
"end CLatticeMaster::visitMesh2dNodeReferences()\n";
48 template <
typename TmplVisitor>
49 void CLatticeMaster::visitMesh2dEdgeStress(
const string &meshName, TmplVisitor &visitor)
51 console.
XDebug()<<
"CLatticeMaster::visitMesh2dEdgeStress( " << meshName <<
")\n";
52 std::multimap<int,pair<int,Vec3> > temp_mm;
53 std::map<int,Vec3> data;
56 cmd.append(meshName.c_str());
57 cmd.broadcastCommand();
58 cmd.broadcastBuffer();
61 m_tml_global_comm.
gather(temp_mm);
64 for(std::multimap<
int,pair<int,Vec3> >::iterator iter=temp_mm.begin();
67 if(data.find((iter->second).first)==data.end()){
68 data.insert(iter->second);
70 data[(iter->second).first]+=(iter->second).second;
74 for (std::map<int,Vec3>::const_iterator it = data.begin(); it != data.end(); it++)
76 visitor.visitRefStressPair(it->first, it->second);
79 cmd.wait(
"visitMesh2dEdgeStress");
80 console.
XDebug()<<
"end CLatticeMaster::visitMesh2dEdgeStress()\n";
83 template <
typename TmplVisitor>
84 void CLatticeMaster::visitTriMeshFaceForce(
85 const string &meshName,
89 console.
XDebug()<<
"CLatticeMaster::visitTriMeshFaceForce( " << meshName <<
")\n";
90 std::multimap<int,pair<int,Vec3> > temp_mm;
91 std::map<int,Vec3> data;
94 cmd.append(meshName.c_str());
95 cmd.broadcastCommand();
96 cmd.broadcastBuffer();
99 m_tml_global_comm.
gather(temp_mm);
102 for(std::multimap<
int,pair<int,Vec3> >::iterator iter=temp_mm.begin();
105 if(data.find((iter->second).first)==data.end()){
106 data.insert(iter->second);
108 data[(iter->second).first]+=(iter->second).second;
112 for (std::map<int,Vec3>::const_iterator it = data.begin(); it != data.end(); it++)
114 visitor.visitRefForcePair(it->first, it->second);
117 cmd.wait(
"visitTriMeshFaceStress");
118 console.
XDebug()<<
"end CLatticeMaster::visitTriMeshFaceForce()\n";
121 template <
typename TmplVisitor,
typename TmplParticle>
122 void CLatticeMaster::visitParticlesOfType(
123 const IdVector &particleIdVector,
127 console.
Debug() <<
"CLatticeMaster::visitParticlesOfType: enter\n";
128 typedef std::multimap<int,TmplParticle> ParticleMMap;
129 ParticleMMap particleMMap;
132 <<
"CLatticeMaster::visitParticlesOfType: broadcasting command\n";
134 cmd.broadcastCommand();
137 <<
"CLatticeMaster::visitParticlesOfType: broadcasting particle id's\n";
141 <<
"CLatticeMaster::visitParticlesOfType:"
142 <<
" gathering particle data from workers\n";
143 m_tml_global_comm.gather_packed(particleMMap);
145 <<
"CLatticeMaster::visitParticlesOfType:"
146 <<
" gathered " << particleMMap.size() <<
" particles\n";
149 <<
"CLatticeMaster::visitParticlesOfType:"
150 <<
" visiting particle data\n";
152 typename ParticleMMap::iterator iter=particleMMap.begin();
153 iter != particleMMap.end();
157 iter->second.visit(visitor);
160 cmd.wait(
"visitParticles");
161 console.
Debug() <<
"CLatticeMaster::visitParticlesOfType: exit\n";
164 template <
typename TmplVisitor>
165 void CLatticeMaster::visitParticles(
166 const IdVector &particleIdVector,
170 console.
Debug() <<
"CLatticeMaster::visitParticles: enter\n";
172 if (m_particle_type ==
"Basic")
174 visitParticlesOfType<TmplVisitor,CParticle>(particleIdVector, visitor);
176 else if (m_particle_type ==
"Rot")
178 visitParticlesOfType<TmplVisitor,CRotParticle>(particleIdVector, visitor);
180 else if (m_particle_type ==
"RotVi")
182 visitParticlesOfType<TmplVisitor,CRotParticleVi>(particleIdVector, visitor);
184 else if (m_particle_type ==
"RotTherm")
186 visitParticlesOfType<TmplVisitor,CRotThermParticle>(particleIdVector, visitor);
192 std::string(
"Unknown particle type: ") + m_particle_type
195 console.
Debug() <<
"CLatticeMaster::visitParticles: exit\n";
198 template <
class TmplIterator,
class TmplParticle>
205 vector<TmplParticle> particleVector;
207 <<
"CLatticeMaster::addParticles:"
208 <<
" Reserving vector memory for particles.\n";
210 const int numBroadcastParticles = 50000;
211 particleVector.reserve(numBroadcastParticles);
213 <<
"CLatticeMaster::addParticles:"
214 <<
" Beginning add-particle loop..." <<
"\n";
215 for (
int i = 0; particleIt.hasNext(); i++) {
216 const TmplParticle particle(particleIt.next());
218 particleVector.push_back(particle);
219 if (((i+1) % 5000) == 0) {
221 <<
"CLatticeMaster::addParticles:"
222 <<
"Adding particle with id "
223 << particleVector.rbegin()->getID() <<
"\n";
226 if (((i+1) % numBroadcastParticles) == 0)
228 console.
XDebug() <<
"CLatticeMaster::addParticles:"
229 <<
" Broadcasting receive cmd...." <<
"\n";
230 cmd_buffer.
broadcast(CMD_RECEIVEPARTICLES);
232 <<
"CLatticeMaster::addParticles: Broadcasting particles...." <<
"\n";
234 barrier.
wait(
"CLatticeMaster::addParticles: Post particle broadcast.");
235 barrier.
wait(
"CLatticeMaster::addParticles: Post Command.");
236 particleVector.clear();
237 particleVector.reserve(numBroadcastParticles);
241 <<
"CLatticeMaster::addParticles: Done add-particle loop..." <<
"\n";
243 <<
"CLatticeMaster::addParticles: Broadcasting final particle-receive cmd"
245 cmd_buffer.
broadcast(CMD_RECEIVEPARTICLES);
246 console.
XDebug() <<
"CLatticeMaster::addParticles:"
247 <<
" Broadcasting final set of particles...\n";
249 barrier.
wait(
"Post final particle broadcast.");
250 barrier.
wait(
"Post final particle-broadcast command.");
253 <<
"CLatticeMaster::addParticles: "
254 <<
"Building ntable (searchNeighbours)...\n";
257 <<
"CLatticeMaster::addParticles: exit\n";
261 template <
class TmplIterator>
265 <<
"CLatticeMaster::addConnections: enter\n";
270 const int numBroadcastConnections = 100000;
271 vector<int> connectionBuffer;
272 connectionBuffer.reserve(numBroadcastConnections);
274 for (; connectionIt.hasNext(); i++)
276 typename TmplIterator::value_type data = connectionIt.next();
277 connectionBuffer.push_back(data.getTag());
278 connectionBuffer.push_back(data.getP1Id());
279 connectionBuffer.push_back(data.getP2Id());
280 if ((i+1) % 50000 == 0)
282 console.
XDebug() <<
"Adding connection number " << i <<
"\n";
284 if ((i+1) % numBroadcastConnections == 0)
286 console.
XDebug() <<
"CLatticeMaster::addConnections:"
287 <<
" Broadcasting receive cmd...." <<
"\n";
288 cmd_buffer.
broadcast(CMD_RECEIVECONNECTIONS);
290 <<
"CLatticeMaster::addConnections: Broadcasting connections...." <<
"\n";
292 barrier.
wait(
"CLatticeMaster::addConnections: Post connection broadcast.");
293 barrier.
wait(
"CLatticeMaster::addConnections: Post Command.");
294 connectionBuffer.clear();
295 connectionBuffer.reserve(numBroadcastConnections);
301 <<
"CLatticeMaster::addConnections: Done add-connection loop..." <<
"\n";
303 <<
"CLatticeMaster::addConnections: Broadcasting final connection-receive cmd"
305 cmd_buffer.
broadcast(CMD_RECEIVECONNECTIONS);
306 console.
XDebug() <<
"CLatticeMaster::addConnections:"
307 <<
" Broadcasting final set of connections...\n";
309 barrier.
wait(
"Post final connection broadcast.");
310 barrier.
wait(
"Post final connection-broadcast command.");
312 console.
XDebug()<<
"Added " << i <<
" connections..." <<
"\n";
316 <<
"CLatticeMaster::addConnections: exit\n";