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