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 __PARTICLE_H 00014 #define __PARTICLE_H 00015 00016 // -- project includes -- 00017 #include "Foundation/Quaternion.h" 00018 #include "Foundation/vec3.h" 00019 #include "Foundation/Matrix3.h" 00020 #include "Model/BasicParticle.h" 00021 #include "Parallel/CheckPointable.h" 00022 00023 //--- STL includes --- 00024 #include <map> 00025 #include <vector> 00026 #include <utility> 00027 #include <string> 00028 #include <iostream> 00029 00030 using std::map; 00031 using std::vector; 00032 using std::pair; 00033 using std::string; 00034 00035 template <class T> class ParallelParticleArray; 00036 class AMPISGBufferRoot; 00037 class AMPIBuffer; 00038 00039 namespace esys 00040 { 00041 namespace lsm 00042 { 00043 class SimpleParticleData; 00044 } 00045 } 00046 00050 class CParticle : public CBasicParticle, public esys::lsm::CheckPointable 00051 { 00052 public: // types 00053 class exchangeType 00054 { 00055 public: 00056 exchangeType() 00057 : m_pos(), 00058 m_initPos(), 00059 m_oldPos(), 00060 m_vel() 00061 { 00062 m_is_dynamic=true; 00063 } 00064 00065 exchangeType(const Vec3 &pos, const Vec3 &initPos, const Vec3 &oldPos, const Vec3 &vel,bool is_dyn) 00066 : m_pos(pos), 00067 m_initPos(initPos), 00068 m_oldPos(oldPos), 00069 m_vel(vel) 00070 { 00071 m_is_dynamic=is_dyn; 00072 } 00073 00074 Vec3 m_pos; 00075 Vec3 m_initPos; 00076 Vec3 m_oldPos; 00077 Vec3 m_vel; 00078 bool m_is_dynamic; 00079 }; 00080 00081 typedef double (CParticle::* ScalarFieldFunction)() const; 00082 typedef Vec3 (CParticle::* VectorFieldFunction)() const; 00083 00084 protected: 00086 Matrix3 m_sigma; 00087 Vec3 m_vel,m_force; 00088 Vec3 m_oldpos; 00089 Vec3 m_initpos; 00090 Vec3 m_circular_shift; 00091 double m_mass,m_div_mass; 00092 00093 bool flag; 00094 bool m_is_dynamic; 00095 00096 void setForce(const Vec3 &force) {m_force = force;} 00097 00098 public: 00099 CParticle(); 00100 CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,int,bool); 00101 CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,const Vec3&,const Vec3&,int,bool); // including oldpos 00102 CParticle(const esys::lsm::SimpleParticleData &particleData); 00103 virtual ~CParticle(){}; 00104 00105 00106 static ScalarFieldFunction getScalarFieldFunction(const string&); 00107 static VectorFieldFunction getVectorFieldFunction(const string&); 00108 00109 inline const Vec3 &getInitPos() const {return m_initpos;} 00110 inline void setInitPos(const Vec3 &initPos) {m_initpos = initPos;} 00111 inline Vec3 getDisplacement() const {return (m_pos-m_oldpos);} ; 00112 inline Vec3 getTotalDisplacement() const {return (m_pos-m_initpos);} ; 00113 inline const Vec3 &getOldPos() const {return m_oldpos;}; 00114 inline Vec3 getVel() const {return m_vel;}; 00115 inline double getAbsVel() const {return m_vel.norm();}; 00116 inline void setVel(const Vec3 &V){m_vel=V;}; 00117 inline void setMass(double mass) {m_mass = mass; m_div_mass = 1.0/m_mass;} 00118 inline double getMass() const {return m_mass;}; 00119 inline double getInvMass() const {return m_div_mass;}; 00120 inline Vec3 getForce() const {return m_force;}; 00121 virtual void setDensity(double); // needs to be virtual , different for rot. particle (mom. inert) 00122 00123 void resetDisplacement(){m_oldpos=m_pos;}; 00124 double getIDField() const {return double(m_global_id);}; 00125 double getTagField() const {return double(getTag());}; 00126 void applyForce(const Vec3&,const Vec3&); 00127 virtual void integrate(double); 00128 virtual void integrateTherm(double dt){} 00129 virtual void zeroForce(); 00130 virtual void zeroHeat() {} 00131 virtual void thermExpansion() {} 00132 inline void moveToRel(const Vec3 &v){m_pos=m_initpos+v;}; 00133 inline double getKineticEnergy() const {return 0.5*m_mass*m_vel*m_vel;}; 00134 00135 // switching on/off dynamic behaviour 00136 virtual void setNonDynamic() {m_is_dynamic=false;}; 00137 virtual void setNonDynamicLinear() {m_is_dynamic=false;}; 00138 virtual void setNonDynamicRot(){}; // do nothing 00139 00140 void setFlag(bool b=true){flag=b;}; 00141 bool isFlagged() const {return flag;}; 00142 void writeAsDXLine(ostream&,int slid=0); 00143 00144 friend ostream& operator<<(ostream&, const CParticle&); 00145 void print(){cout << *this << endl << flush;}; 00146 00147 void rescale() {}; 00148 exchangeType getExchangeValues(); 00149 void setExchangeValues(const exchangeType&); 00150 00151 // circular 00152 void setCircular(const Vec3&); 00153 00154 // stress 00155 double sigma_xx_2D() const {return m_sigma(0,0)/(M_PI*m_rad*m_rad);}; 00156 double sigma_xy_2D() const {return m_sigma(0,1)/(M_PI*m_rad*m_rad);}; 00157 double sigma_yy_2D() const {return m_sigma(1,1)/(M_PI*m_rad*m_rad);}; 00158 double sigma_d() const; 00159 00160 friend class TML_PackedMessageInterface; 00161 00162 virtual void saveCheckPointData(std::ostream& oStream); 00163 virtual void saveSnapShotData(std::ostream& oStream); 00164 00165 //virtual Quaternion getQuat(){return Quaternion(1.0,Vec3(0.0,0.0,0.0));}; 00166 virtual void applyMoment(const Vec3&){}; 00167 00168 static void get_type() {cout <<" CParticle" ;}; 00169 00170 virtual void loadCheckPointData(std::istream &iStream); 00171 00172 template <typename TmplVisitor> 00173 void visit(TmplVisitor &visitor) 00174 { 00175 visitor.visitParticle(*this); 00176 } 00177 00178 public: 00179 // Ensure that particles only move in the x-y plane 2D computations 00180 inline static void setDo2dCalculations(bool do2dCalculations) {s_do2Calculations = do2dCalculations;} 00181 inline static bool getDo2dCalculations() {return s_do2Calculations;} 00182 00183 private: 00184 static bool s_do2Calculations; 00185 00186 00187 }; 00188 00189 /* CParticle extractCParticleFrom(AMPIBuffer*); */ 00190 /* CParticle extractCParticleFrom(AMPISGBufferRoot*,int); */ 00191 00192 #endif //__PARTICLE_H 00193