ESyS-Particle  2.3.2
SubLattice.h
Go to the documentation of this file.
1 // //
3 // Copyright (c) 2003-2014 by The University of Queensland //
4 // Centre for Geoscience Computing //
5 // http://earth.uq.edu.au/centre-geoscience-computing //
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"
32 #include "Model/ViscWallIG.h"
34 
38 
39 #include "Model/SphereBodyIG.h"
41 
42 // -- fields --
43 #include "Fields/FieldSlave.h"
47 
48 //--- TML includes ---
49 #include "tml/comm/comm.h"
50 #include "tml/comm/comm_world.h"
51 
52 //--- MPI includes ---
53 #include <mpi.h>
54 
55 //--- STL includes ---
56 #include <vector>
57 #include <map>
58 #include <string>
59 
60 using std::vector;
61 using std::map;
62 using std::string;
63 
64 template <class T> class ParallelParticleArray;
66 
70 template <typename T>
71 class TSubLattice : public ASubLattice
72 {
73  protected:
75  // -- particles storage--
76  ParticleArray *m_ppa;
77 
78  // -- interaction storage --
79  map<string,AParallelInteractionStorage*> m_dpis;
80  map<string,AParallelInteractionStorage*> m_bpis;
81 
82  typedef map<string,AInteractionGroup<T>*> NameIGroupMap;
84 
85  // -- special interaction groups --
86  map<string,AParallelInteractionStorage*> m_damping;
87  map<string,AWallInteractionGroup<T>*> m_WIG;
88  map<string,ASphereBodyInteractionGroup<T>*> m_SIG;
89  map<string,CWall*> m_walls;
90  map<string,CSphereBody*> m_spheres;
91  map<string,TriMesh*> m_mesh;
92  map<string,Mesh2D*> m_mesh2d;
93 
94  // -- parameters --
95  double m_dt; // time step for integration
96  double m_nrange; // search range for neighbor table
97  // double m_rmax; // max. particle radius
98  double m_alpha; // search range padding
99 
100  int m_last_ns; // timestamp of last neighborsearch
101 
102  // Temporary storage of connections
103  map<int, vector<int> > m_temp_conn;
104 
105  // -- MPI --
106  int m_rank;
107  MPI_Comm m_comm;
109  MPI_Comm m_worker_comm;
111  // int m_num_workers;
117 
118  // -- times --
119  double packtime;
120  double unpacktime;
121  double commtime;
122  double forcetime;
123 
124  // -- fields --
125 
126  // -- "new" fields --
127  map<int,AFieldSlave*> m_field_slaves;
128 
130 
131  // -- private functions --
132  void calcForces();
133  void zeroForces();
134  void integrate(double);
135  void integrateTherm(double dt);
136  void zeroHeat();
137  void thermExpansion();
138  void calcHeatFrict();
139  void calcHeatTrans();
140 
141  // functions doing the actual work adding interaction groups
142  virtual bool doAddPIG(const string&,const string&,CVarMPIBuffer&,bool tagged=false);
143  virtual bool doAddDamping(const string&,CVarMPIBuffer&);
144 
145  public:
146  TSubLattice(const esys::lsm::CLatticeParam &prm, int rank, MPI_Comm comm, MPI_Comm worker_comm);
147  virtual ~TSubLattice();
148 
149  virtual void setTimeStepSize(double dt);
150 
151  virtual vector<int> getCommCoords() const {return m_ppa->getCommCoords();};
152  virtual vector<int> getCommDims() const {return m_ppa->getCommDims();};
153 
154  virtual void receiveParticles();
155  virtual void receiveConnections();
156 
157  virtual const MPI_Comm &getWorkerComm() const {return m_worker_comm;}
158 
159  virtual void initNeighborTable(const Vec3&,const Vec3&);
160  virtual void initNeighborTable(const Vec3&,const Vec3&,const vector<bool>&);
161  virtual void addWall();
162  virtual void addElasticWIG();
163  virtual void addBondedWIG();
164  virtual void addDirBondedWIG();
165  virtual void addViscWIG();
166  virtual void addTaggedElasticWIG();
167  virtual void addTriMesh();
168  virtual void addTriMeshIG();
169  virtual void addBondedTriMeshIG();
170  virtual void addMesh2D();
171  virtual void addMesh2DIG();
172  virtual void addBondedMesh2DIG();
173  virtual void addPairIG();
174  virtual void addTaggedPairIG();
175  virtual void addSingleIG();
176  virtual void addBondedIG();
177  virtual void addCappedBondedIG();
178  virtual void addShortBondedIG();
179  virtual void addRotBondedIG();
180  virtual void addRotThermBondedIG();
181  virtual void addDamping();
182  virtual void setExIG();
183  virtual void removeIG();
184  virtual void getWallPos();
185  virtual void getWallForce();
186  virtual void addSphereBody();
187  virtual void addESphereBodyIG();
188  virtual void getSphereBodyPos();
189  virtual void getSphereBodyForce();
190 
191  virtual void oneStep();
192  virtual void oneStepTherm();
193  virtual void exchangePos();
194  void setTimeStep(double dt){m_dt=dt;};
195 
196  virtual void rebuildParticleArray();
197  virtual void rebuildInteractions();
198  virtual void searchNeighbors();
199  virtual void updateInteractions();
200  virtual void checkNeighbors();
201  void resetDisplacements();
202 
203  virtual void do2dCalculations(bool do2d);
204  virtual int getNumParticles();
205 
206  std::pair<double, int> findParticleNearestTo(const Vec3 &pt);
207 
208  std::pair<int, Vec3> getParticlePosn(int particleId);
209 
210  AParallelInteractionStorage *findPis(const std::string &groupName);
211 
212 // virtual ParticleIdPairVector getBondGroupIdPairs(const std::string &groupName);
213 
214  template <typename TmplPis>
215  ParticleIdPairVector getBondGroupIdPairs(TmplPis *pBondPis);
216 
217  virtual void moveParticleTo();
218  virtual void moveTaggedParticlesBy();
219  virtual void moveSingleParticleTo(int particleId, const Vec3 &posn);
220  virtual void moveWallBy();
221  virtual void moveSphereBodyBy();
222  virtual void setWallNormal();
223  virtual void applyForceToWall();
224  virtual void setParticleVelocity();
225  virtual void setVelocityOfWall();
226  virtual void setParticleNonDynamic();
227  virtual void setParticleNonRot();
228  virtual void setParticleNonTrans();
229  virtual void setParticleDensity();
230  virtual void setTaggedParticleVel();
231  virtual void tagParticleNearestTo();
232  virtual void moveSingleNode();
233  virtual void moveTaggedNodes();
234  virtual void translateMeshBy(const std::string &meshName, const Vec3 &translation);
235 
236  virtual void sendDataToMaster();
237  virtual void countParticles();
238 
239  virtual void printStruct();
240  virtual void printData();
241  virtual void printTimes();
242 
243  //-- "new" field functions --
244  virtual void addScalarParticleField();
245  virtual void addVectorParticleField();
246  virtual void addScalarInteractionField();
247  virtual void addScalarHistoryInteractionField();
248  virtual void addVectorInteractionField();
249  virtual void addScalarTriangleField();
250  virtual void addVectorTriangleField();
251  virtual void sendFieldData();
252  virtual void addVectorWallField();
253 
254  // -- checkpointing --
255  virtual void saveSnapShotData(std::ostream &oStream);
256  virtual void saveCheckPointData(std::ostream &oStream);
257  virtual void loadCheckPointData(std::istream &iStream);
258 
259  // -- timer --
260  virtual void setTimer(MpiWTimers &timers) {m_pTimers = &timers;}
261 
262  // -- mesh data exchange --
263  virtual void getMeshNodeRef();
264  virtual void getMeshFaceRef();
265  virtual void getMesh2DStress();
266  virtual void getTriMeshForce();
267  virtual void getParticleData(const IdVector &particleIdVector);
268 };
269 
270 #include "Parallel/SubLattice.hpp"
271 
272 #endif
virtual void addBondedWIG()
Definition: SubLattice.hpp:531
virtual void moveSingleNode()
Definition: SubLattice.hpp:2191
Definition: LatticeParam.h:29
map< string, AParallelInteractionStorage * > m_bpis
dynamic interactions
Definition: SubLattice.h:80
virtual void printData()
Definition: SubLattice.hpp:2620
virtual void addScalarParticleField()
Definition: SubLattice.hpp:2643
virtual void printTimes()
Definition: SubLattice.hpp:2627
virtual void addDirBondedWIG()
Definition: SubLattice.hpp:559
virtual void addScalarTriangleField()
Definition: SubLattice.hpp:2952
virtual void getWallForce()
Definition: SubLattice.hpp:649
virtual void addSingleIG()
Definition: SubLattice.hpp:1309
double m_alpha
Definition: SubLattice.h:98
virtual void setTimer(MpiWTimers &timers)
Definition: SubLattice.h:260
virtual ~TSubLattice()
Definition: SubLattice.hpp:173
int m_last_ns
Definition: SubLattice.h:100
virtual int getNumParticles()
Definition: SubLattice.hpp:241
Definition: vec3.h:46
TML_Comm m_tml_comm
Definition: SubLattice.h:108
virtual void addScalarInteractionField()
Definition: SubLattice.hpp:2716
double commtime
Definition: SubLattice.h:121
void resetDisplacements()
Definition: SubLattice.hpp:2133
double m_dt
Definition: SubLattice.h:95
virtual void addShortBondedIG()
Definition: SubLattice.hpp:1546
virtual void addVectorWallField()
Definition: SubLattice.hpp:2982
virtual bool doAddPIG(const string &, const string &, CVarMPIBuffer &, bool tagged=false)
Definition: SubLattice.hpp:785
virtual void exchangePos()
Definition: SubLattice.hpp:1671
virtual void moveParticleTo()
Definition: SubLattice.hpp:2150
void integrate(double)
Definition: SubLattice.hpp:1825
void setTimeStep(double dt)
Definition: SubLattice.h:194
MPI_Comm m_comm
Definition: SubLattice.h:107
TSubLattice(const esys::lsm::CLatticeParam &prm, int rank, MPI_Comm comm, MPI_Comm worker_comm)
Definition: SubLattice.hpp:111
virtual void addMesh2D()
Definition: SubLattice.hpp:1163
ParallelParticleArray< T > ParticleArray
Definition: SubLattice.h:74
double packtime
Definition: SubLattice.h:119
std::vector< unsigned int > ProcessDims
Definition: LatticeParam.h:32
map< string, ASphereBodyInteractionGroup< T > * > m_SIG
Definition: SubLattice.h:88
map< int, vector< int > > m_temp_conn
Definition: SubLattice.h:103
virtual void setParticleNonTrans()
Definition: SubLattice.hpp:2413
MpiWTimers * m_pTimers
Definition: SubLattice.h:129
map< string, CSphereBody * > m_spheres
Definition: SubLattice.h:90
virtual void addCappedBondedIG()
Definition: SubLattice.hpp:1472
ParticleIdPairVector getBondGroupIdPairs(TmplPis *pBondPis)
map< string, AParallelInteractionStorage * > m_dpis
Definition: SubLattice.h:79
virtual void rebuildParticleArray()
Definition: SubLattice.hpp:1962
vector< int > getCommDims() const
Definition: pp_array.h:103
virtual void addElasticWIG()
Definition: SubLattice.hpp:419
virtual void checkNeighbors()
Definition: SubLattice.hpp:2081
NameIGroupMap m_singleParticleInteractions
Definition: SubLattice.h:83
std::vector< ParticleIdPair > ParticleIdPairVector
Definition: ASubLattice.h:47
vector< int > getCommCoords() const
Definition: pp_array.h:102
virtual void addVectorParticleField()
Definition: SubLattice.hpp:2678
parrallel particle storage array with neighborsearch and variable exchange
Definition: SubLattice.h:64
virtual void setVelocityOfWall()
Definition: SubLattice.hpp:2521
void thermExpansion()
Definition: SubLattice.hpp:1877
virtual void setTaggedParticleVel()
Definition: SubLattice.hpp:2428
virtual void setParticleDensity()
Definition: SubLattice.hpp:2556
virtual void receiveParticles()
Definition: SubLattice.hpp:327
virtual void getMeshNodeRef()
Definition: SubLattice.hpp:3330
virtual void setParticleNonRot()
Definition: SubLattice.hpp:2397
virtual void applyForceToWall()
Definition: SubLattice.hpp:2501
virtual void setTimeStepSize(double dt)
Definition: SubLattice.hpp:1776
MPI_Comm m_worker_comm
MPI communicator between workers (excl. master)
Definition: SubLattice.h:109
map< string, AParallelInteractionStorage * > m_damping
Body/gravitational force interactions.
Definition: SubLattice.h:86
virtual void addScalarHistoryInteractionField()
Definition: SubLattice.hpp:2858
virtual void addTriMesh()
Definition: SubLattice.hpp:1022
virtual void initNeighborTable(const Vec3 &, const Vec3 &)
Definition: SubLattice.hpp:209
double unpacktime
Definition: SubLattice.h:120
AParallelInteractionStorage * findPis(const std::string &groupName)
virtual void getSphereBodyPos()
Definition: SubLattice.hpp:618
void calcHeatTrans()
Definition: SubLattice.hpp:1931
virtual void addESphereBodyIG()
Definition: SubLattice.hpp:454
virtual const MPI_Comm & getWorkerComm() const
Definition: SubLattice.h:157
virtual void addPairIG()
Definition: SubLattice.hpp:739
virtual void sendDataToMaster()
Definition: SubLattice.hpp:2574
map< string, AInteractionGroup< T > * > NameIGroupMap
persistent interactions
Definition: SubLattice.h:82
virtual void moveWallBy()
Definition: SubLattice.hpp:2444
virtual void addTaggedPairIG()
Definition: SubLattice.hpp:760
abstract base class for parallel interaction storage array
Definition: pi_storage.h:44
virtual void translateMeshBy(const std::string &meshName, const Vec3 &translation)
Definition: SubLattice.hpp:2244
virtual void addRotThermBondedIG()
Definition: SubLattice.hpp:1536
virtual void countParticles()
Definition: SubLattice.hpp:2596
virtual void getTriMeshForce()
Definition: SubLattice.hpp:3444
virtual void addBondedMesh2DIG()
Definition: SubLattice.hpp:1250
virtual vector< int > getCommCoords() const
Definition: SubLattice.h:151
virtual void addBondedTriMeshIG()
Definition: SubLattice.hpp:1107
virtual void saveCheckPointData(std::ostream &oStream)
Definition: SubLattice.hpp:3140
abstract base class for communicator
Definition: comm.h:46
map< string, AWallInteractionGroup< T > * > m_WIG
Definition: SubLattice.h:87
virtual void addMesh2DIG()
Definition: SubLattice.hpp:1202
void zeroHeat()
Definition: SubLattice.hpp:1889
map< int, AFieldSlave * > m_field_slaves
Definition: SubLattice.h:127
ParticleArray * m_ppa
Definition: SubLattice.h:76
MPI send/recv buffer with automagically adjusted size.
Definition: mpivbuf.h:34
virtual void removeIG()
Definition: SubLattice.hpp:1635
double forcetime
Definition: SubLattice.h:122
virtual void oneStepTherm()
Definition: SubLattice.hpp:1853
virtual void searchNeighbors()
Definition: SubLattice.hpp:2006
void calcForces()
Definition: SubLattice.hpp:1727
virtual void addTaggedElasticWIG()
Definition: SubLattice.hpp:489
void integrateTherm(double dt)
Definition: SubLattice.hpp:1868
virtual void sendFieldData()
Definition: SubLattice.hpp:3067
virtual void addDamping()
Definition: SubLattice.hpp:1359
virtual void saveSnapShotData(std::ostream &oStream)
Definition: SubLattice.hpp:3092
virtual void receiveConnections()
Definition: SubLattice.hpp:350
virtual void addRotBondedIG()
Definition: SubLattice.hpp:1530
TML_Comm m_tml_worker_comm
TML version of the communicator between workers (excl. master)
Definition: SubLattice.h:110
virtual void updateInteractions()
Definition: SubLattice.hpp:2027
virtual void addBondedIG()
Definition: SubLattice.hpp:1425
virtual void addWall()
Definition: SubLattice.hpp:381
esys::lsm::CLatticeParam::ProcessDims m_dims
Definition: SubLattice.h:116
map< string, Mesh2D * > m_mesh2d
Definition: SubLattice.h:92
virtual void rebuildInteractions()
Definition: SubLattice.hpp:1971
virtual void addTriMeshIG()
Definition: SubLattice.hpp:1060
virtual void loadCheckPointData(std::istream &iStream)
Definition: SubLattice.hpp:3215
virtual void getMesh2DStress()
Definition: SubLattice.hpp:3414
void calcHeatFrict()
Definition: SubLattice.hpp:1913
virtual void do2dCalculations(bool do2d)
Definition: SubLattice.hpp:235
virtual void setWallNormal()
Definition: SubLattice.hpp:2482
int m_rank
rank in m_comm
Definition: SubLattice.h:106
virtual void addVectorInteractionField()
Definition: SubLattice.hpp:2785
virtual void moveTaggedNodes()
Definition: SubLattice.hpp:2220
virtual void getSphereBodyForce()
Definition: SubLattice.hpp:680
virtual void moveSphereBodyBy()
Definition: SubLattice.hpp:2463
Abstract base class for sublattices.
Definition: ASubLattice.h:36
std::pair< int, Vec3 > getParticlePosn(int particleId)
Definition: SubLattice.hpp:2290
virtual void setExIG()
Definition: SubLattice.hpp:1602
virtual void getMeshFaceRef()
Definition: SubLattice.hpp:3372
virtual void printStruct()
Definition: SubLattice.hpp:2610
Definition: Timer.h:86
virtual void addSphereBody()
Definition: SubLattice.hpp:400
virtual void setParticleNonDynamic()
Definition: SubLattice.hpp:2381
map< string, TriMesh * > m_mesh
Definition: SubLattice.h:91
virtual vector< int > getCommDims() const
Definition: SubLattice.h:152
virtual void addVectorTriangleField()
Definition: SubLattice.hpp:2907
virtual void addViscWIG()
Definition: SubLattice.hpp:711
Class for a Sublattice.
Definition: SubLattice.h:71
std::pair< double, int > findParticleNearestTo(const Vec3 &pt)
Definition: SubLattice.hpp:2257
std::vector< int > IdVector
Definition: ASubLattice.h:48
virtual void moveTaggedParticlesBy()
Definition: SubLattice.hpp:2167
void zeroForces()
Definition: SubLattice.hpp:1684
virtual bool doAddDamping(const string &, CVarMPIBuffer &)
Definition: SubLattice.hpp:1382
double m_nrange
Definition: SubLattice.h:96
virtual void oneStep()
Definition: SubLattice.hpp:1837
virtual void moveSingleParticleTo(int particleId, const Vec3 &posn)
Definition: SubLattice.hpp:2181
virtual void setParticleVelocity()
Definition: SubLattice.hpp:2540
virtual void tagParticleNearestTo()
Definition: SubLattice.hpp:2354
map< string, CWall * > m_walls
Definition: SubLattice.h:89
virtual void getParticleData(const IdVector &particleIdVector)
Definition: SubLattice.hpp:2314
virtual void getWallPos()
Definition: SubLattice.hpp:587