ESyS-Particle  4.0.1
SubLattice.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 __SUBLATTICE_H
14 #define __SUBLATTICE_H
15 
16 // -- project includes --
17 
18 #include "Parallel/mpibuf.h"
19 #include "Parallel/mpivbuf.h"
20 #include "Parallel/ASubLattice.h"
21 #include "Parallel/LatticeParam.h"
22 
23 #include "Foundation/Timer.h"
24 
25 #include "Model/TriMesh.h"
26 #include "Model/Mesh2D.h"
27 
28 // -- interactions --
29 #include "Model/Interaction.h"
30 #include "Model/EWallInteractionGroup.h"
31 #include "Model/BWallInteractionGroup.h"
32 #include "Model/ViscWallIG.h"
33 #include "Model/SoftBWallInteractionGroup.h"
34 
35 #include "Model/RotBondedInteraction.h"
36 #include "Model/RotElasticInteraction.h"
37 #include "Model/RotFricInteraction.h"
38 
39 // -- fields --
40 #include "Fields/FieldSlave.h"
41 #include "Fields/ScalarParticleFieldSlave.h"
42 #include "Fields/VectorParticleFieldSlave.h"
43 #include "Fields/ScalarInteractionFieldSlave.h"
44 
45 //--- TML includes ---
46 #include "tml/comm/comm.h"
47 #include "tml/comm/comm_world.h"
48 
49 //--- MPI includes ---
50 #include <mpi.h>
51 
52 //--- STL includes ---
53 #include <vector>
54 #include <map>
55 #include <string>
56 
57 using std::vector;
58 using std::map;
59 using std::string;
60 
61 template <class T> class ParallelParticleArray;
63 
67 template <typename T>
68 class TSubLattice : public ASubLattice
69 {
70  protected:
72  // -- particles storage--
73  ParticleArray *m_ppa;
74 
75  // -- interaction storage --
76  map<string,AParallelInteractionStorage*> m_dpis;
77  map<string,AParallelInteractionStorage*> m_bpis;
78 
79  typedef map<string,AInteractionGroup<T>*> NameIGroupMap;
80  NameIGroupMap m_singleParticleInteractions;
81 
82  // -- special interaction groups --
83  map<string,AParallelInteractionStorage*> m_damping;
84  map<string,AWallInteractionGroup<T>*> m_WIG;
85  map<string,CWall*> m_walls;
86  map<string,TriMesh*> m_mesh;
87  map<string,Mesh2D*> m_mesh2d;
88 
89  // -- parameters --
90  double m_dt; // time step for integration
91  double m_nrange; // search range for neighbor table
92  // double m_rmax; // max. particle radius
93  double m_alpha; // search range padding
94 
95  int m_last_ns; // timestamp of last neighborsearch
96 
97  // Temporary storage of connections
98  map<int, vector<int> > m_temp_conn;
99 
100  // -- MPI --
101  int m_rank;
102  MPI_Comm m_comm;
103  TML_Comm m_tml_comm;
104  MPI_Comm m_worker_comm;
106  // int m_num_workers;
111  esys::lsm::CLatticeParam::ProcessDims m_dims;
112 
113  // -- times --
114  double packtime;
115  double unpacktime;
116  double commtime;
117  double forcetime;
118 
119  // -- fields --
120 
121  // -- "new" fields --
122  map<int,AFieldSlave*> m_field_slaves;
123 
124  MpiWTimers *m_pTimers;
125 
126  // -- private functions --
127  void calcForces();
128  void zeroForces();
129  void integrate(double);
130  void integrateTherm(double dt);
131  void zeroHeat();
132  void thermExpansion();
133  void calcHeatFrict();
134  void calcHeatTrans();
135 
136  // functions doing the actual work adding interaction groups
137  virtual bool doAddPIG(const string&,const string&,CVarMPIBuffer&,bool tagged=false);
138  virtual bool doAddDamping(const string&,CVarMPIBuffer&);
139 
140  public:
141  TSubLattice(const esys::lsm::CLatticeParam &prm, int rank, MPI_Comm comm, MPI_Comm worker_comm);
142  virtual ~TSubLattice();
143 
144  virtual void setTimeStepSize(double dt);
145 
146  virtual vector<int> getCommCoords() const {return m_ppa->getCommCoords();};
147  virtual vector<int> getCommDims() const {return m_ppa->getCommDims();};
148 
149  virtual void receiveParticles();
150  virtual void receiveConnections();
151 
152  virtual const MPI_Comm &getWorkerComm() const {return m_worker_comm;}
153 
154  virtual void initNeighborTable(const Vec3&,const Vec3&);
155  virtual void initNeighborTable(const Vec3&,const Vec3&,const vector<bool>&);
156  virtual void addWall();
157  virtual void addElasticWIG();
158  virtual void addBondedWIG();
159  virtual void addDirBondedWIG();
160  virtual void addViscWIG();
161  virtual void addTriMesh();
162  virtual void addTriMeshIG();
163  virtual void addBondedTriMeshIG();
164  virtual void addMesh2D();
165  virtual void addMesh2DIG();
166  virtual void addBondedMesh2DIG();
167  virtual void addPairIG();
168  virtual void addTaggedPairIG();
169  virtual void addSingleIG();
170  virtual void addBondedIG();
171  virtual void addCappedBondedIG();
172  virtual void addShortBondedIG();
173  virtual void addRotBondedIG();
174  virtual void addRotThermBondedIG();
175  virtual void addDamping();
176  virtual void setExIG();
177  virtual void removeIG();
178  virtual void getWallPos();
179  virtual void getWallForce();
180 
181  virtual void oneStep();
182  virtual void oneStepTherm();
183  virtual void exchangePos();
184  void setTimeStep(double dt){m_dt=dt;};
185 
186  virtual void rebuildParticleArray();
187  virtual void rebuildInteractions();
188  virtual void searchNeighbors();
189  virtual void updateInteractions();
190  virtual void checkNeighbors();
191  void resetDisplacements();
192 
193  virtual void do2dCalculations(bool do2d);
194  virtual int getNumParticles();
195 
196  std::pair<double, int> findParticleNearestTo(const Vec3 &pt);
197 
198  std::pair<int, Vec3> getParticlePosn(int particleId);
199 
200  AParallelInteractionStorage *findPis(const std::string &groupName);
201 
202 // virtual ParticleIdPairVector getBondGroupIdPairs(const std::string &groupName);
203 
204  template <typename TmplPis>
205  ParticleIdPairVector getBondGroupIdPairs(TmplPis *pBondPis);
206 
207  virtual void moveParticleTo();
208  virtual void moveTaggedParticlesBy();
209  virtual void moveSingleParticleTo(int particleId, const Vec3 &posn);
210  virtual void moveWallBy();
211  virtual void setWallNormal();
212  virtual void applyForceToWall();
213  virtual void setParticleVelocity();
214  virtual void setVelocityOfWall();
215  virtual void setParticleNonDynamic();
216  virtual void setParticleNonRot();
217  virtual void setParticleNonTrans();
218  virtual void setParticleDensity();
219  virtual void setTaggedParticleVel();
220  virtual void tagParticleNearestTo();
221  virtual void moveSingleNode();
222  virtual void moveTaggedNodes();
223  virtual void translateMeshBy(const std::string &meshName, const Vec3 &translation);
224 
225  virtual void sendDataToMaster();
226  virtual void countParticles();
227 
228  virtual void printStruct();
229  virtual void printData();
230  virtual void printTimes();
231 
232  //-- "new" field functions --
233  virtual void addScalarParticleField();
234  virtual void addVectorParticleField();
235  virtual void addScalarInteractionField();
236  virtual void addVectorInteractionField();
237  virtual void addScalarTriangleField();
238  virtual void addVectorTriangleField();
239  virtual void sendFieldData();
240  virtual void addVectorWallField();
241 
242  // -- checkpointing --
243  virtual void saveSnapShotData(std::ostream &oStream);
244  virtual void saveCheckPointData(std::ostream &oStream);
245  virtual void loadCheckPointData(std::istream &iStream);
246 
247  // -- timer --
248  virtual void setTimer(MpiWTimers &timers) {m_pTimers = &timers;}
249 
250  // -- mesh data exchange --
251  virtual void getMeshNodeRef();
252  virtual void getMeshFaceRef();
253  virtual void getMesh2DStress();
254  virtual void getTriMeshForce();
255  virtual void getParticleData(const IdVector &particleIdVector);
256 };
257 
258 #include "Parallel/SubLattice.hpp"
259 
260 #endif