ESyS-Particle  4.0.1
ASubLattice.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 __ASUBLATTICE_H
00014 #define __ASUBLATTICE_H
00015 
00016 // -- project includes --
00017 #include "Model/EWallInteractionGroup.h"
00018 #include "Model/BWallInteractionGroup.h"
00019 #include "Model/SoftBWallInteractionGroup.h"
00020 #include "Model/ViscWallIG.h"
00021 #include "Parallel/CheckPointable.h"
00022 #include "Foundation/vec3.h"
00023 
00024 // -- system includes --
00025 #include <string>
00026 #include <utility>
00027 
00028 using std::string;
00029 
00030 class MpiWTimers;
00031 class TML_Comm;
00032 
00036 class ASubLattice : public esys::lsm::CheckPointable
00037 {
00038 private:
00039   std::string m_particleType;
00040 
00041 protected:
00042 
00043   // -- neighbortable --
00044 
00045 public:
00046   typedef std::pair<int,int>          ParticleIdPair;
00047   typedef std::vector<ParticleIdPair> ParticleIdPairVector;
00048   typedef std::vector<int> IdVector;
00049   
00050   virtual ~ASubLattice();
00051   void setNTSize(int);
00052   virtual void setParticleType(const std::string &particleType)
00053   {
00054     m_particleType = particleType;
00055   }
00056   virtual const std::string &getParticleType() const
00057   {
00058     return m_particleType;
00059   }
00060   virtual void setTimeStepSize(double dt) = 0;
00061   virtual vector<int> getCommCoords() const=0;
00062   virtual vector<int> getCommDims() const=0;
00063   virtual void receiveParticles()=0;
00064   virtual void receiveConnections()=0;
00065   virtual void addWall()=0;
00066   virtual void addElasticWIG()=0;
00067   virtual void addBondedWIG()=0;
00068   virtual void addDirBondedWIG()=0;
00069   virtual void addViscWIG()=0;
00070   virtual void initNeighborTable(const Vec3&,const Vec3&)=0;
00071   virtual void initNeighborTable(const Vec3&,const Vec3&,const vector<bool>&)=0;
00072   virtual void addPairIG()=0;
00073   virtual void addTaggedPairIG()=0;
00074   virtual void addTriMesh()=0;
00075   virtual void addTriMeshIG()=0;
00076   virtual void addBondedTriMeshIG()=0;
00077   virtual void addMesh2D()=0;
00078   virtual void addMesh2DIG()=0;
00079   virtual void addBondedMesh2DIG()=0;
00080   virtual void addSingleIG()=0;
00081   virtual void addBondedIG()=0;
00082   virtual void addCappedBondedIG()=0;
00083   virtual void addShortBondedIG()=0;
00084   virtual void addRotBondedIG()=0;
00085   virtual void addRotThermBondedIG()=0;
00086   virtual void addDamping()=0;
00087   //virtual void addRotDamping()=0;
00088   virtual void setExIG()=0;
00089   virtual void initComplex();
00090   virtual void removeIG()=0;
00091   virtual void getWallPos()=0;
00092   virtual void getWallForce()=0;
00093 
00094   virtual const MPI_Comm &getWorkerComm() const = 0;
00095 
00096   virtual void rebuildParticleArray()=0;
00097   virtual void rebuildInteractions()=0;
00098   virtual void searchNeighbors()=0;
00099   virtual void checkNeighbors()=0;
00100 
00101   virtual void updateInteractions()=0;
00102 
00103   virtual int getNumParticles() = 0;
00104 
00105   virtual std::pair<double, int> findParticleNearestTo(const Vec3 &pt) = 0;
00106 
00107   virtual std::pair<int, Vec3> getParticlePosn(int particleId) = 0;
00108 
00109 //  virtual ParticleIdPairVector getBondGroupIdPairs(const std::string &groupName) = 0;
00110 
00111   virtual void oneStep()=0;
00112   virtual void exchangePos()=0;
00113 
00114   // moving stuff around
00115   virtual void moveParticleTo()=0;
00116   virtual void moveTaggedParticlesBy() = 0;
00117   virtual void moveSingleParticleTo(int particleId, const Vec3 &posn)=0;
00118   virtual void moveWallBy()=0;
00119   virtual void setWallNormal()=0;
00120   virtual void applyForceToWall()=0;
00121   virtual void setVelocityOfWall()=0;
00122   virtual void setParticleVelocity()=0;
00123   virtual void setParticleDensity()=0; 
00124   virtual void setTaggedParticleVel()=0; 
00125   virtual void setParticleAngularVelocity(){};
00126   virtual void setParticleNonDynamic()=0;
00127   virtual void setParticleNonRot()=0;
00128   virtual void tagParticleNearestTo()=0;
00129   virtual void moveSingleNode()=0;
00130   virtual void moveTaggedNodes()=0;
00131   virtual void translateMeshBy(const std::string &meshName, const Vec3 &translation)=0;
00132 
00133   virtual void setTimer(MpiWTimers &timers) = 0;
00134   
00135   virtual void do2dCalculations(bool do2d) = 0;
00136 
00137   // field functions
00138   virtual void countParticles()=0;
00139 
00140   // "new" field functions
00141   virtual void addScalarParticleField()=0;
00142   virtual void addVectorParticleField()=0;
00143   virtual void addScalarInteractionField()=0;
00144   virtual void addVectorInteractionField()=0;
00145   virtual void addVectorTriangleField()=0;
00146   virtual void addScalarTriangleField()=0;
00147   virtual void sendFieldData()=0;
00148   virtual void addVectorWallField()=0;
00149 
00150   // output
00151   virtual void printStruct()=0;
00152   virtual void printData()=0;
00153   virtual void printTimes()=0;
00154   
00155   // -- mesh data exchange --
00156   virtual void getMeshNodeRef()=0;
00157   virtual void getMeshFaceRef()=0;
00158   virtual void getMesh2DStress()=0;
00159   virtual void getTriMeshForce()=0;
00160   virtual void getParticleData(const IdVector &particleIdVector)=0;
00161 
00162   // checkpointing
00163   virtual void loadCheckPointData(std::istream&){};
00164 };
00165 
00166 #endif //__ASUBLATTICE_H