ESyS-Particle
4.0.1
|
00001 00002 // // 00003 // Copyright (c) 2003-2011 by The University of Queensland // 00004 // Earth Systems Science Computational Centre (ESSCC) // 00005 // http://www.uq.edu.au/esscc // 00006 // // 00007 // Primary Business: Brisbane, Queensland, Australia // 00008 // Licensed under the Open Software License version 3.0 // 00009 // http://www.opensource.org/licenses/osl-3.0.php // 00010 // // 00012 00013 #ifndef __SUBLATTICE_H 00014 #define __SUBLATTICE_H 00015 00016 // -- project includes -- 00017 00018 #include "Parallel/mpibuf.h" 00019 #include "Parallel/mpivbuf.h" 00020 #include "Parallel/ASubLattice.h" 00021 #include "Parallel/LatticeParam.h" 00022 00023 #include "Foundation/Timer.h" 00024 00025 #include "Model/TriMesh.h" 00026 #include "Model/Mesh2D.h" 00027 00028 // -- interactions -- 00029 #include "Model/Interaction.h" 00030 #include "Model/EWallInteractionGroup.h" 00031 #include "Model/BWallInteractionGroup.h" 00032 #include "Model/ViscWallIG.h" 00033 #include "Model/SoftBWallInteractionGroup.h" 00034 00035 #include "Model/RotBondedInteraction.h" 00036 #include "Model/RotElasticInteraction.h" 00037 #include "Model/RotFricInteraction.h" 00038 00039 // -- fields -- 00040 #include "Fields/FieldSlave.h" 00041 #include "Fields/ScalarParticleFieldSlave.h" 00042 #include "Fields/VectorParticleFieldSlave.h" 00043 #include "Fields/ScalarInteractionFieldSlave.h" 00044 00045 //--- TML includes --- 00046 #include "tml/comm/comm.h" 00047 #include "tml/comm/comm_world.h" 00048 00049 //--- MPI includes --- 00050 #include <mpi.h> 00051 00052 //--- STL includes --- 00053 #include <vector> 00054 #include <map> 00055 #include <string> 00056 00057 using std::vector; 00058 using std::map; 00059 using std::string; 00060 00061 template <class T> class ParallelParticleArray; 00062 class AParallelInteractionStorage; 00063 00067 template <typename T> 00068 class TSubLattice : public ASubLattice 00069 { 00070 protected: 00071 typedef ParallelParticleArray<T> ParticleArray; 00072 // -- particles storage-- 00073 ParticleArray *m_ppa; 00074 00075 // -- interaction storage -- 00076 map<string,AParallelInteractionStorage*> m_dpis; 00077 map<string,AParallelInteractionStorage*> m_bpis; 00078 00079 typedef map<string,AInteractionGroup<T>*> NameIGroupMap; 00080 NameIGroupMap m_singleParticleInteractions; 00081 00082 // -- special interaction groups -- 00083 map<string,AParallelInteractionStorage*> m_damping; 00084 map<string,AWallInteractionGroup<T>*> m_WIG; 00085 map<string,CWall*> m_walls; 00086 map<string,TriMesh*> m_mesh; 00087 map<string,Mesh2D*> m_mesh2d; 00088 00089 // -- parameters -- 00090 double m_dt; // time step for integration 00091 double m_nrange; // search range for neighbor table 00092 // double m_rmax; // max. particle radius 00093 double m_alpha; // search range padding 00094 00095 int m_last_ns; // timestamp of last neighborsearch 00096 00097 // Temporary storage of connections 00098 map<int, vector<int> > m_temp_conn; 00099 00100 // -- MPI -- 00101 int m_rank; 00102 MPI_Comm m_comm; 00103 TML_Comm m_tml_comm; 00104 MPI_Comm m_worker_comm; 00105 TML_Comm m_tml_worker_comm; 00106 // int m_num_workers; 00111 esys::lsm::CLatticeParam::ProcessDims m_dims; 00112 00113 // -- times -- 00114 double packtime; 00115 double unpacktime; 00116 double commtime; 00117 double forcetime; 00118 00119 // -- fields -- 00120 00121 // -- "new" fields -- 00122 map<int,AFieldSlave*> m_field_slaves; 00123 00124 MpiWTimers *m_pTimers; 00125 00126 // -- private functions -- 00127 void calcForces(); 00128 void zeroForces(); 00129 void integrate(double); 00130 void integrateTherm(double dt); 00131 void zeroHeat(); 00132 void thermExpansion(); 00133 void calcHeatFrict(); 00134 void calcHeatTrans(); 00135 00136 // functions doing the actual work adding interaction groups 00137 virtual bool doAddPIG(const string&,const string&,CVarMPIBuffer&,bool tagged=false); 00138 virtual bool doAddDamping(const string&,CVarMPIBuffer&); 00139 00140 public: 00141 TSubLattice(const esys::lsm::CLatticeParam &prm, int rank, MPI_Comm comm, MPI_Comm worker_comm); 00142 virtual ~TSubLattice(); 00143 00144 virtual void setTimeStepSize(double dt); 00145 00146 virtual vector<int> getCommCoords() const {return m_ppa->getCommCoords();}; 00147 virtual vector<int> getCommDims() const {return m_ppa->getCommDims();}; 00148 00149 virtual void receiveParticles(); 00150 virtual void receiveConnections(); 00151 00152 virtual const MPI_Comm &getWorkerComm() const {return m_worker_comm;} 00153 00154 virtual void initNeighborTable(const Vec3&,const Vec3&); 00155 virtual void initNeighborTable(const Vec3&,const Vec3&,const vector<bool>&); 00156 virtual void addWall(); 00157 virtual void addElasticWIG(); 00158 virtual void addBondedWIG(); 00159 virtual void addDirBondedWIG(); 00160 virtual void addViscWIG(); 00161 virtual void addTriMesh(); 00162 virtual void addTriMeshIG(); 00163 virtual void addBondedTriMeshIG(); 00164 virtual void addMesh2D(); 00165 virtual void addMesh2DIG(); 00166 virtual void addBondedMesh2DIG(); 00167 virtual void addPairIG(); 00168 virtual void addTaggedPairIG(); 00169 virtual void addSingleIG(); 00170 virtual void addBondedIG(); 00171 virtual void addCappedBondedIG(); 00172 virtual void addShortBondedIG(); 00173 virtual void addRotBondedIG(); 00174 virtual void addRotThermBondedIG(); 00175 virtual void addDamping(); 00176 virtual void setExIG(); 00177 virtual void removeIG(); 00178 virtual void getWallPos(); 00179 virtual void getWallForce(); 00180 00181 virtual void oneStep(); 00182 virtual void oneStepTherm(); 00183 virtual void exchangePos(); 00184 void setTimeStep(double dt){m_dt=dt;}; 00185 00186 virtual void rebuildParticleArray(); 00187 virtual void rebuildInteractions(); 00188 virtual void searchNeighbors(); 00189 virtual void updateInteractions(); 00190 virtual void checkNeighbors(); 00191 void resetDisplacements(); 00192 00193 virtual void do2dCalculations(bool do2d); 00194 virtual int getNumParticles(); 00195 00196 std::pair<double, int> findParticleNearestTo(const Vec3 &pt); 00197 00198 std::pair<int, Vec3> getParticlePosn(int particleId); 00199 00200 AParallelInteractionStorage *findPis(const std::string &groupName); 00201 00202 // virtual ParticleIdPairVector getBondGroupIdPairs(const std::string &groupName); 00203 00204 template <typename TmplPis> 00205 ParticleIdPairVector getBondGroupIdPairs(TmplPis *pBondPis); 00206 00207 virtual void moveParticleTo(); 00208 virtual void moveTaggedParticlesBy(); 00209 virtual void moveSingleParticleTo(int particleId, const Vec3 &posn); 00210 virtual void moveWallBy(); 00211 virtual void setWallNormal(); 00212 virtual void applyForceToWall(); 00213 virtual void setParticleVelocity(); 00214 virtual void setVelocityOfWall(); 00215 virtual void setParticleNonDynamic(); 00216 virtual void setParticleNonRot(); 00217 virtual void setParticleNonTrans(); 00218 virtual void setParticleDensity(); 00219 virtual void setTaggedParticleVel(); 00220 virtual void tagParticleNearestTo(); 00221 virtual void moveSingleNode(); 00222 virtual void moveTaggedNodes(); 00223 virtual void translateMeshBy(const std::string &meshName, const Vec3 &translation); 00224 00225 virtual void sendDataToMaster(); 00226 virtual void countParticles(); 00227 00228 virtual void printStruct(); 00229 virtual void printData(); 00230 virtual void printTimes(); 00231 00232 //-- "new" field functions -- 00233 virtual void addScalarParticleField(); 00234 virtual void addVectorParticleField(); 00235 virtual void addScalarInteractionField(); 00236 virtual void addVectorInteractionField(); 00237 virtual void addScalarTriangleField(); 00238 virtual void addVectorTriangleField(); 00239 virtual void sendFieldData(); 00240 virtual void addVectorWallField(); 00241 00242 // -- checkpointing -- 00243 virtual void saveSnapShotData(std::ostream &oStream); 00244 virtual void saveCheckPointData(std::ostream &oStream); 00245 virtual void loadCheckPointData(std::istream &iStream); 00246 00247 // -- timer -- 00248 virtual void setTimer(MpiWTimers &timers) {m_pTimers = &timers;} 00249 00250 // -- mesh data exchange -- 00251 virtual void getMeshNodeRef(); 00252 virtual void getMeshFaceRef(); 00253 virtual void getMesh2DStress(); 00254 virtual void getTriMeshForce(); 00255 virtual void getParticleData(const IdVector &particleIdVector); 00256 }; 00257 00258 #include "Parallel/SubLattice.hpp" 00259 00260 #endif