ESyS-Particle  4.0.1
SubLattice.h
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