ESyS-Particle  4.0.1
LatticeMaster.h
1 
2 // //
3 // Copyright (c) 2003-2011 by The University of Queensland //
4 // Earth Systems Science Computational Centre (ESSCC) //
5 // http://www.uq.edu.au/esscc //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 
13 #ifndef __LATTICEMASTER_H
14 #define __LATTICEMASTER_H
15 
16 //--- Project includes ---
17 
18 #include "Parallel/mpibuf.h"
19 #include "Parallel/mpivbuf.h"
20 #include "Parallel/LatticeParam.h"
21 #include "Parallel/RankAndComm.h"
22 #include "Parallel/sublattice_cmd.h"
23 
24 #include "config.h"
25 
26 #include "Foundation/console.h"
27 #include "Foundation/Runnable.h"
28 
29 #include "Fields/FieldMaster.h"
30 #include "Fields/MaxTrigger.h"
31 
32 #include "Model/Damping.h"
33 #include "Model/LocalDamping.h"
34 #include "Model/ABCDampingIGP.h"
35 #include "Model/Particle.h"
36 #include "Model/RotParticle.h"
37 #include "Model/RotParticleVi.h"
38 #include "Model/RotThermParticle.h"
39 #include "Model/ElasticInteraction.h"
40 #include "Model/FrictionInteraction.h"
41 #include "Model/FractalFriction.h"
42 #include "Model/AdhesiveFriction.h"
43 #include "Model/HertzianElasticInteraction.h"
44 #include "Model/HertzianViscoElasticFrictionInteraction.h"
45 #include "Model/HertzianViscoElasticInteraction.h"
46 #include "Model/LinearDashpotInteraction.h"
47 #include "Model/MeshData.h"
48 #include "Model/ETriMeshIP.h"
49 #include "Model/BTriMeshIP.h"
50 #include "Model/BMesh2DIP.h"
51 #include "Model/BondedInteraction.h"
52 #include "Model/CappedBondedInteraction.h"
53 #include "Model/RotFricInteraction.h"
54 #include "Model/RotBondedInteraction.h"
55 #include "Model/RotElasticInteraction.h"
56 #include "Model/RotThermFricInteraction.h"
57 #include "Model/RotThermBondedInteraction.h"
58 #include "Model/RotThermElasticInteraction.h"
59 #include "Model/BodyForceGroup.h"
60 #include "Model/EWallInteractionGroup.h"
61 #include "Model/BWallInteractionGroup.h"
62 #include "Model/ViscWallIG.h"
63 #include "Model/SoftBWallInteractionGroup.h"
64 
65 #include <boost/filesystem/path.hpp>
66 
67 //--- MPI includes ---
68 #include <mpi.h>
69 
70 //--- TML includes ---
71 #include "tml/comm/comm_world.h"
72 
73 // -- STL includes --
74 #include <vector>
75 #include <list>
76 #include <map>
77 #include <utility>
78 #include <string>
79 
80 // forward decls.
81 // includes are in the .cpp
83 
84 namespace esys
85 {
86  namespace lsm
87  {
88  class GeometryInfo;
89  class BodyForceIGP;
90  }
91 }
92 
100 class MpiWTimers;
101 
102 namespace esys
103 {
104  namespace lsm
105  {
106  typedef std::vector<int> IntVector;
107  }
108 }
109 
110 class SpawnCmd
111 {
112 public:
113  typedef std::vector<std::string> StringVector;
114 
115  SpawnCmd();
116 
117  const std::string &getExe() const;
118 
119  boost::filesystem::path getExePath() const;
120 
121  void setExe(const std::string &exeName);
122 
123  const StringVector &getArgVector() const;
124 
125  void setArgVector(const StringVector &argVector);
126 
127  std::string getCmdLine() const;
128 
129 private:
130  std::string m_exeName;
131  StringVector m_argVector;
132 };
133 
135 {
136  public:
137  typedef std::vector<esys::lsm::Runnable *> RunnableVector;
138  typedef std::pair<int, int> ParticleIdPair;
139  typedef std::vector<ParticleIdPair> ParticleIdPairVector;
140  typedef std::vector<MeshNodeData> MeshNodeDataVector;
141  typedef std::vector<MeshTriData> MeshTriDataVector;
142  typedef std::pair<MeshNodeDataVector,MeshTriDataVector> TriMeshDataPair;
143 
144  private:
145  static std::string s_workerExeName; // name of the worker executable
146 
147  std::string m_timingFileName;
148  MpiWTimers *m_pTimers;
149  CheckPointController *m_pCheckPointController; // for restart checkpoints
150  CheckPointController *m_pSnapShotController; // for viz/analysis dumps
151  esys::lsm::CLatticeParam::ProcessDims m_processDims;
152 
153  protected:
154  typedef std::vector<int> ConnIdVector;
155  map<int,ConnIdVector> m_temp_conn;
156  vector<AFieldMaster*> m_save_fields;
157 
158  double m_x_max,m_x_min,m_y_max,m_y_min,m_z_max,m_z_min;
159  int m_global_rank;
160  int m_global_size;
161  int m_max_ts;
162  int m_center_id;
163  double m_total_time;
164  int m_t ;
165  double m_dt;
166  bool m_isInitialized ;
167  bool m_first_time;
168  std::string m_particle_type;
169 
170  RunnableVector m_preRunnableVector;
171  RunnableVector m_postRunnableVector;
172 
173  TML_Comm m_tml_global_comm;
174  MPI_Comm m_global_comm;
175 
176  void runRunnables(RunnableVector::iterator begin, RunnableVector::iterator end);
177  void runPreRunnables();
178  void runPostRunnables();
179 
180  void makeWorkerComm();
181 
182  void saveTimingData();
183  TriMeshDataPair readTriMesh(const std::string &fileName,int);
184  TriMeshDataPair readTriMesh(const std::string &fileName);
185  void readAndDistributeMesh2D(const std::string&,int);
186 
187  MpiRankAndComm getGlobalRankAndComm() const
188  {
189  return MpiRankAndComm(m_global_rank, m_global_comm);
190  }
191 
192  void disconnectWorkerProcesses();
193 
194 public:
195  CLatticeMaster();
196  ~CLatticeMaster();
197 
198  std::string getLsmVersion() const
199  {
200  return std::string(PACKAGE_VERSION);
201  }
202 
203  int getNumWorkerProcesses() const;
204 
205  int getTimeStep() const {return m_t;}
206  double getTimeStepSize() const {return m_dt;}
207  void setTimeStepSize(double dt);
208 
209  void init();
210 
219  /* void setWorkerSpawnCmd( */
220 /* const std::string &exe, */
221 /* const SpawnCmd::StringVector &argVector */
222 /* ); */
223 
228  //const SpawnCmd &getWorkerSpawnCmd();
229 
233  void spawnSlaves(int numWorkers);
234  void run();
235  void runInit();
236  void runOneStep();
237  void runEnd();
238  void oneStep();
239  void searchNeighbors(bool);
240  bool checkNeighbors();
241  void updateInteractions();
242  void addBondedIG(const CBondedIGP&);
243  void addCappedBondedIG(int,const std::string&,double,double,double);
244  void addShortBondedIG(int,const std::string&,double,double);
245 
246  void addPairIG(const CElasticIGP &prms);
247  void addPairIG(const CFrictionIGP &prms);
248  void addPairIG(const FractalFrictionIGP &prms);
249  void addPairIG(const CAdhesiveFrictionIGP &prms);
250  void addPairIG(const CRotElasticIGP &prms);
251  void addPairIG(const CRotFrictionIGP &prms);
252  void addPairIG(const CHertzianElasticIGP &prms);
253  void addPairIG(const CHertzianViscoElasticFrictionIGP &prms);
254  void addPairIG(const CHertzianViscoElasticIGP &prms);
255  void addPairIG(const CLinearDashpotIGP &prms);
256  void addPairIG(const CRotThermElasticIGP &prms);
257  void addPairIG(const CRotThermFrictionIGP &prms);
258  void addTaggedPairIG(const CRotFrictionIGP &prms,int,int,int,int);
259  void addTaggedPairIG(const CFrictionIGP &prms,int,int,int,int);
260  void addTaggedPairIG(const CHertzianElasticIGP &prms,int,int,int,int);
261  void addTaggedPairIG(const CHertzianViscoElasticFrictionIGP &prms,int,int,int,int);
262  void addTaggedPairIG(const CHertzianViscoElasticIGP &prms,int,int,int,int);
263  void addTaggedPairIG(const CLinearDashpotIGP &prms,int,int,int,int);
264  void addTaggedPairIG(const CRotElasticIGP &prms,int,int,int,int);
265  void addTaggedPairIG(const CElasticIGP &prms,int,int,int,int);
266 
267  void removeIG(const std::string&);
268 
269  void readAndDistributeTriMesh(const std::string&,const std::string&,int);
270  void readAndDistributeTriMesh(const std::string&,const std::string&);
271  void createTriMesh(
272  const std::string &meshName,
273  const MeshNodeDataVector &mndVector,
274  const MeshTriDataVector &mtdVector
275  );
276  void addMesh2D(const std::string&,const std::string&,int);
277  void addMesh2DIG(const ETriMeshIP &prms);
278  void addTriMesh(const std::string &meshName, const std::string &fileName);
279  void addTriMeshIG(const ETriMeshIP &prms);
280 
281  void addBondedTriMeshIG(const BTriMeshIP &triMeshPrms, const MeshTagBuildPrms &buildPrms);
282  void addBondedTriMeshIG(const BTriMeshIP &triMeshPrms, const MeshGapBuildPrms &buildPrms);
283 
284  void addBondedMesh2DIG(const BMesh2DIP&, const MeshTagBuildPrms&){std::cerr << "NOT IMPLEMENTED" << endl;};
285  void addBondedMesh2DIG(const BMesh2DIP&, const MeshGapBuildPrms&);
286  void addDamping(const CDampingIGP &dampingIGP);
287  void addDamping(const CLocalDampingIGP &dampingIGP);
288  void addDamping(const ABCDampingIGP &dampingIGP);
289 
290  void addSingleIG(const esys::lsm::GravityIGP &gravityIGP);
291  void addExIG(const std::string&,const std::string&);
292  void setNumSteps(int s);
293  int getNumSteps() const {return m_max_ts;};
294  int getSteps() const {return m_t;};
295 
296  void addRotBondedIG(int,const std::string&,double,double,double,double,double,double,double,double,bool);
297  void addRotThermBondedIG(const CRotThermBondedIGP &prms);
298 
299 // ParticleIdPairVector getBondGroupIdPairs(const std::string &groupName);
300 
301  // --- wall related fucntions ---
302  void addWall(const std::string&,const Vec3&,const Vec3&);
303  void addWallIG(const CEWallIGP&);
304  void addWallIG(const CBWallIGP&);
305  void addWallIG(const CVWallIGP&);
306  void addWallIG(const CSoftBWallIGP&);
307  Vec3 getWallPosn(const std::string&);
308  Vec3 getWallForce(const std::string&);
309 
310  // void initSoftBondedWall(const string&,const Vec3&,const Vec3&,double,double,double,int);
311 
312 
313  void moveParticleTo(int particleTag, const Vec3 &posn);
314  void moveTaggedParticlesBy(int particleTag, const Vec3 &displacement);
315  void moveSingleParticleTo(int particleId, const Vec3 &posn);
316  Vec3 getParticlePosn(int particleId);
317  void setParticleNonDynamic(int);
318  void setParticleNonRot(int);
319  void setParticleNonTrans(int);
320  void setParticleVel(int,const Vec3&);
321  void setParticleAngVel(int,const Vec3&);
322  void setParticleDensity(int tag,int mask,double rho);
323  void setTaggedParticleVel(int tag,const Vec3&);
324  void moveWallBy(const std::string&,const Vec3&);
325  void setWallNormal(const std::string&,const Vec3&);
326  void setVelocityOfWall(const std::string&,const Vec3&);
327  void tagParticleNearestTo(int,int,const Vec3&);
332  int findParticleNearestTo(const Vec3& pos);
333  void applyForceToWall(const std::string&,const Vec3&);
334  // --- Mesh movement functions ---
335  void moveSingleNodeBy(const std::string&,int,const Vec3&);
336  void moveTaggedNodesBy(const std::string&,int,const Vec3&);
337  void translateMeshBy(const std::string&,const Vec3&);
338 
339  void saveTimingDataToFile(const std::string &fileNamePrefix);
340 
344  void do2dCalculations(bool do2d);
345 
355  void setProcessDims(const esys::lsm::CLatticeParam::ProcessDims &dims);
356 
357  const esys::lsm::CLatticeParam::ProcessDims &getProcessDims() const;
358 
364  void setTimingFileName(const std::string &fileName);
365 
372  const std::string &getTimingFileName() const;
373 
374  const std::string &getParticleType() const
375  {
376  return m_particle_type;
377  }
378 
379  int getNumParticles();
380 
382  void addScalarParticleSaveField(const std::string&,const std::string&,const std::string&,int,int,int);
383  void addTaggedScalarParticleSaveField(const std::string&,const std::string&,const std::string&,int,int,int,int,int);
384  void addVectorParticleSaveField(const std::string&,const std::string&,const std::string&,int,int,int);
385  void addTaggedVectorParticleSaveField(const std::string&,const std::string&,const std::string&,int,int,int,int,int);
386  void addScalarInteractionSaveField(const std::string&,const std::string&,const std::string&,const std::string&,const std::string&,int,int,int,bool checked=false);
387  void addVectorInteractionSaveField(const std::string&,const std::string&,const std::string&,const std::string&,const std::string&,int,int,int,bool checked=false);
388  void addTaggedScalarInteractionSaveField(const std::string&,const std::string&,const std::string&,const std::string&,const std::string&,int,int,int,int,int,bool);
389  void addTaggedScalarParticleDistributionSaver(const std::string&,const std::string&,const std::string&,int,int,int,int,int,int,double,double,int);
390  void addVectorTriangleSaveField(const string&,const string&,const string&,const string&,int,int,int);
391  void addScalarTriangleSaveField(const string&,const string&,const string&,const string&,int,int,int);
392  void addVectorWallField(const string&,const string&,vector<string>,const string&,int,int,int);
393  // fields with trigger
394  void addVectorParticleSaveFieldWT(const std::string&,const std::string&,const std::string&,int,int,int,const MaxTrigParams&);
395  void addTaggedVectorParticleSaveFieldWT(const std::string&,const std::string&,const std::string&,int,int,int,int,int,const MaxTrigParams&);
396 
406  void performCheckPoints(
407  const std::string &fileNamePrefix,
408  int beginTime,
409  int endTime,
410  int timeInterval
411  );
412 
425  const std::string &fileNamePrefix,
426  int beginTime,
427  int endTime,
428  int timeInterval
429  );
430 
431  void initSnapShotController(const std::string&,int,int,int);
432 
434  void makeLattice(
435  const char *particleType,
436  double gridSize,
437  double verletDist
438  );
439 
440  void makeLattice(
441  const char *particleType,
442  double gridSize,
443  double verletDist,
444  double dt
445  );
446 
452 
456  const RunnableVector &getPreTimeStepRunnableVector() const
457  {
458  return m_preRunnableVector;
459  }
460 
465  {
466  return m_preRunnableVector;
467  }
468 
474 
478  const RunnableVector &getPostTimeStepRunnableVector() const
479  {
480  return m_postRunnableVector;
481  }
482 
487  {
488  return m_postRunnableVector;
489  }
490 
494  void setSpatialDomain(const Vec3 &minBBoxPt, const Vec3 &maxBBoxPt);
495 
499  void setSpatialDomain(
500  const Vec3 &minBBoxPt,
501  const Vec3 &maxBBoxPt,
502  const esys::lsm::IntVector &circDimVector
503  );
504 
509  bool haveSetSpatialDomain() const;
510 
514  void getSlaveSpatialDomains();
515 
522  void initialiseGeometry(const esys::lsm::GeometryInfo &geoInfo);
523  void initialiseGeometry(const esys::lsm::GeometryInfo &geoInfo,bool);
531  template <class TmplParticle>
532  void readGeometry(const std::string &fileName);
533 
539  void readGeometryFile(const std::string &fileName);
540 
548  void loadCheckPointData(const std::string &checkPointFileName);
549 
558  template <class TmplIterator, class TmplParticle>
559  void addParticles(TmplIterator &it);
560 
569  template <class TmplIterator>
570  void addConnections(TmplIterator &it);
571 
572  //--- function for mesh data exchange ---
573  template <typename TmplVisitor>
574  void visitMeshFaceReferences(const string &meshName);
575 
576  template <typename TmplVisitor>
577  void visitMesh2dNodeReferences(const string &meshName, TmplVisitor &visitor);
578 
579  template <typename TmplVisitor>
580  void visitMesh2dEdgeStress(const string &meshName, TmplVisitor &visitor);
581 
582  template <typename TmplVisitor>
583  void visitTriMeshFaceForce(
584  const string &meshName,
585  TmplVisitor &visitor
586  );
587 
588  typedef std::vector<int> IdVector;
589 
590  template <typename TmplVisitor, typename TmplParticle>
591  void visitParticlesOfType(
592  const IdVector &particleIdVector,
593  TmplVisitor &visitor
594  );
595 
596  template <typename TmplVisitor>
597  void visitParticles(const IdVector &particleIdVector, TmplVisitor &visitor);
598 
599  void setVerbosity(bool);
600 };
601 
602 #include "Parallel/LatticeMaster.hpp"
603 
604 #endif