ESyS-Particle  2.3
Particle.h
Go to the documentation of this file.
1 // //
3 // Copyright (c) 2003-2014 by The University of Queensland //
4 // Centre for Geoscience Computing //
5 // http://earth.uq.edu.au/centre-geoscience-computing //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 
13 #ifndef __PARTICLE_H
14 #define __PARTICLE_H
15 
16 // -- project includes --
17 #include "Foundation/Quaternion.h"
18 #include "Foundation/vec3.h"
19 #include "Foundation/Matrix3.h"
20 #include "Model/BasicParticle.h"
22 
23 //--- STL includes ---
24 #include <map>
25 #include <vector>
26 #include <utility>
27 #include <string>
28 #include <iostream>
29 
30 using std::map;
31 using std::vector;
32 using std::pair;
33 using std::string;
34 
35 template <class T> class ParallelParticleArray;
36 class AMPISGBufferRoot;
37 class AMPIBuffer;
38 
39 namespace esys
40 {
41  namespace lsm
42  {
43  class SimpleParticleData;
44  }
45 }
46 
51 {
52  public: // types
54  {
55  public:
57  : m_pos(),
58  m_initPos(),
59  m_oldPos(),
60  m_vel()
61  {
62  m_is_dynamic=true;
63  }
64 
65  exchangeType(const Vec3 &pos, const Vec3 &initPos, const Vec3 &oldPos, const Vec3 &vel,bool is_dyn)
66  : m_pos(pos),
67  m_initPos(initPos),
68  m_oldPos(oldPos),
69  m_vel(vel)
70  {
71  m_is_dynamic=is_dyn;
72  }
73 
79  };
80 
81  typedef double (CParticle::* ScalarFieldFunction)() const;
82  typedef Vec3 (CParticle::* VectorFieldFunction)() const;
83 
84  protected:
92 
93  bool flag;
94  bool m_is_dynamic;
95 
96  void setForce(const Vec3 &force) {m_force = force;}
97 
98  public:
99  CParticle();
100  CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,int,bool);
101  CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,const Vec3&,const Vec3&,int,bool); // including oldpos
102  CParticle(const esys::lsm::SimpleParticleData &particleData);
103  virtual ~CParticle(){};
104 
105 
106  static ScalarFieldFunction getScalarFieldFunction(const string&);
107  static VectorFieldFunction getVectorFieldFunction(const string&);
108 
109  inline const Vec3 &getInitPos() const {return m_initpos;}
110  inline void setInitPos(const Vec3 &initPos) {m_initpos = initPos;}
111  inline Vec3 getDisplacement() const {return (m_pos-m_oldpos);} ;
112  inline Vec3 getTotalDisplacement() const {return (m_pos-m_initpos);} ;
113  inline const Vec3 &getOldPos() const {return m_oldpos;};
114  inline Vec3 getVel() const {return m_vel;};
115  inline double getAbsVel() const {return m_vel.norm();};
116  inline void setVel(const Vec3 &V){m_vel=V;};
117  inline void setMass(double mass) {m_mass = mass; m_div_mass = 1.0/m_mass;}
118  inline double getMass() const {return m_mass;};
119  inline double getInvMass() const {return m_div_mass;};
120  inline Vec3 getForce() const {return m_force;};
121  virtual void setDensity(double); // needs to be virtual , different for rot. particle (mom. inert)
122 
123  void resetDisplacement(){m_oldpos=m_pos;};
124  double getIDField() const {return double(m_global_id);};
125  double getTagField() const {return double(getTag());};
126  void applyForce(const Vec3&,const Vec3&);
127  virtual void integrate(double);
128  virtual void integrateTherm(double){}
129  virtual void zeroForce();
130  virtual void zeroHeat() {}
131  virtual void thermExpansion() {}
132  inline void moveToRel(const Vec3 &v){m_pos=m_initpos+v;};
133  inline double getKineticEnergy() const {return 0.5*m_mass*m_vel*m_vel;};
134 
135  // switching on/off dynamic behaviour
136  virtual void setNonDynamic() {m_is_dynamic=false;};
137  virtual void setNonDynamicLinear() {m_is_dynamic=false;};
138  virtual void setNonDynamicRot(){}; // do nothing
139 
140  void setFlag(bool b=true){flag=b;};
141  bool isFlagged() const {return flag;};
142  void writeAsDXLine(ostream&,int slid=0);
143 
144  friend ostream& operator<<(ostream&, const CParticle&);
145  void print(){cout << *this << endl << flush;};
146 
147  void rescale() {};
148  exchangeType getExchangeValues();
149  void setExchangeValues(const exchangeType&);
150 
151  // circular
152  void setCircular(const Vec3&);
153 
154  // stress
155  double sigma_xx_2D() const {return m_sigma(0,0)/(M_PI*m_rad*m_rad);};
156  double sigma_xy_2D() const {return m_sigma(0,1)/(M_PI*m_rad*m_rad);};
157  double sigma_yy_2D() const {return m_sigma(1,1)/(M_PI*m_rad*m_rad);};
158  double sigma_d() const;
159 
161 
162  virtual void saveCheckPointData(std::ostream& oStream);
163  virtual void saveSnapShotData(std::ostream& oStream);
164 
165  //virtual Quaternion getQuat(){return Quaternion(1.0,Vec3(0.0,0.0,0.0));};
166  virtual void applyMoment(const Vec3&){};
167 
168  static void get_type() {cout <<" CParticle" ;};
169 
170  virtual void loadCheckPointData(std::istream &iStream);
171 
172  template <typename TmplVisitor>
173  void visit(TmplVisitor &visitor)
174  {
175  visitor.visitParticle(*this);
176  }
177 
178 public:
179  // Ensure that particles only move in the x-y plane 2D computations
180  inline static void setDo2dCalculations(bool do2dCalculations) {s_do2Calculations = do2dCalculations;}
181  inline static bool getDo2dCalculations() {return s_do2Calculations;}
182 
183 private:
184  static bool s_do2Calculations;
185 
186 
187 };
188 
189 /* CParticle extractCParticleFrom(AMPIBuffer*); */
190 /* CParticle extractCParticleFrom(AMPISGBufferRoot*,int); */
191 
192 #endif //__PARTICLE_H
193 
virtual void thermExpansion()
Definition: Particle.h:131
double getInvMass() const
Definition: Particle.h:119
Matrix3 m_sigma
stress tensor.
Definition: Particle.h:86
Vec3 getDisplacement() const
Definition: Particle.h:111
double sigma_xx_2D() const
Definition: Particle.h:155
Vec3 m_vel
Definition: Particle.h:87
virtual void saveCheckPointData(std::ostream &oStream)
Definition: Particle.cpp:438
static bool getDo2dCalculations()
Definition: Particle.h:181
Definition: vec3.h:46
bool m_is_dynamic
Definition: Particle.h:78
Vec3 m_initpos
position at time of construction
Definition: Particle.h:89
int m_global_id
Definition: BasicParticle.h:49
CParticle()
Definition: Particle.cpp:26
static VectorFieldFunction getVectorFieldFunction(const string &)
Definition: Particle.cpp:161
Vec3 m_force
Definition: Particle.h:87
virtual void setNonDynamicLinear()
Definition: Particle.h:137
double getKineticEnergy() const
move relative to initial position
Definition: Particle.h:133
void moveToRel(const Vec3 &v)
Definition: Particle.h:132
bool isFlagged() const
Definition: Particle.h:141
virtual void zeroForce()
Definition: Particle.cpp:272
virtual void setNonDynamicRot()
Definition: Particle.h:138
3x3 Matrix
Definition: Matrix3.h:47
double sigma_yy_2D() const
Definition: Particle.h:157
void writeAsDXLine(ostream &, int slid=0)
Definition: Particle.cpp:284
Vec3 getVel() const
Definition: Particle.h:114
Definition: SimpleParticleData.h:27
double getAbsVel() const
Definition: Particle.h:115
Definition: CheckPointable.cpp:16
Vec3 m_oldPos
Definition: Particle.h:76
Vec3 m_circular_shift
shift vector if particle is circular image
Definition: Particle.h:90
parrallel particle storage array with neighborsearch and variable exchange
Definition: SubLattice.h:61
const Vec3 & getInitPos() const
Definition: Particle.h:109
void setInitPos(const Vec3 &initPos)
Definition: Particle.h:110
VEC3_INLINE double norm() const
Definition: vec3.hpp:211
void setExchangeValues(const exchangeType &)
Definition: Particle.cpp:315
Vec3 getForce() const
Definition: Particle.h:120
exchangeType(const Vec3 &pos, const Vec3 &initPos, const Vec3 &oldPos, const Vec3 &vel, bool is_dyn)
Definition: Particle.h:65
Vec3 m_pos
position
Definition: BasicParticle.h:47
int getTag() const
Definition: BasicParticle.h:74
Con console & cout
Definition: console.cpp:30
Abstract base class for MPI send/recv buffer.
Definition: mpibuf.h:33
Vec3 getTotalDisplacement() const
Definition: Particle.h:112
static void setDo2dCalculations(bool do2dCalculations)
Definition: Particle.h:180
void resetDisplacement()
Definition: Particle.h:123
Basic Particle class. Contains only the "geometric part" of the particle, i.e. position and radius...
Definition: BasicParticle.h:44
void setCircular(const Vec3 &)
Definition: Particle.cpp:329
double m_rad
radius
Definition: BasicParticle.h:48
virtual void loadCheckPointData(std::istream &iStream)
Definition: Particle.cpp:457
virtual ~CParticle()
Definition: Particle.h:103
double sigma_xy_2D() const
Definition: Particle.h:156
void applyForce(const Vec3 &, const Vec3 &)
Definition: Particle.cpp:384
virtual void integrateTherm(double)
Definition: Particle.h:128
virtual void zeroHeat()
Definition: Particle.h:130
void rescale()
Definition: Particle.h:147
Vec3 m_vel
Definition: Particle.h:77
double m_div_mass
Definition: Particle.h:91
exchangeType getExchangeValues()
Definition: Particle.cpp:298
virtual void applyMoment(const Vec3 &)
Definition: Particle.h:166
friend ostream & operator<<(ostream &, const CParticle &)
Definition: Particle.cpp:407
bool m_is_dynamic
Definition: Particle.h:94
void visit(TmplVisitor &visitor)
Definition: Particle.h:173
void print()
Definition: Particle.h:145
double getIDField() const
Definition: Particle.h:124
static void get_type()
Definition: Particle.h:168
Vec3(CParticle::* VectorFieldFunction)() const
Definition: Particle.h:82
double getMass() const
Definition: Particle.h:118
Vec3 m_pos
Definition: Particle.h:74
virtual void setNonDynamic()
Definition: Particle.h:136
Definition: CheckPointable.h:26
virtual void integrate(double)
Definition: Particle.cpp:250
static ScalarFieldFunction getScalarFieldFunction(const string &)
Definition: Particle.cpp:126
Vec3 m_initPos
Definition: Particle.h:75
Definition: Particle.h:53
double sigma_d() const
Definition: Particle.cpp:398
void setMass(double mass)
Definition: Particle.h:117
virtual void setDensity(double)
Definition: Particle.cpp:105
bool flag
Definition: Particle.h:93
static bool s_do2Calculations
Definition: Particle.h:184
virtual void saveSnapShotData(std::ostream &oStream)
Definition: Particle.cpp:420
void setVel(const Vec3 &V)
Definition: Particle.h:116
const Vec3 & getOldPos() const
Definition: Particle.h:113
void setForce(const Vec3 &force)
Definition: Particle.h:96
Vec3 m_oldpos
position at the time of last neighbor search
Definition: Particle.h:88
double(CParticle::* ScalarFieldFunction)() const
Definition: Particle.h:81
Abstract base class for scatter/gather buffer, root component.
Definition: mpisgbuf.h:28
Class for a basic particle.
Definition: Particle.h:50
double getTagField() const
Definition: Particle.h:125
void setFlag(bool b=true)
Definition: Particle.h:140
double m_mass
Definition: Particle.h:91
exchangeType()
Definition: Particle.h:56
Abstract base/interface class for packed messages to be used in TML_Pack.
Definition: packed_message_interface.h:28