ESyS-Particle  2.3
RotParticle.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 __ROTPARTICLE_H
14 #define __ROTPARTICLE_H
15 
16 //--- MPIincludes ---
17 #include <mpi.h>
18 
19 // -- project includes --
20 #include "Foundation/vec3.h"
21 #include "Foundation/Matrix3.h"
22 #include "Model/Particle.h"
23 #include "Foundation/Quaternion.h"
24 
25 template <class T> class ParallelParticleArray;
26 class AMPISGBufferRoot;
27 class AMPIBuffer;
28 
29 
30 //--- STL includes ---
31 #include <map>
32 #include <vector>
33 #include <utility>
34 #include <string>
35 
36 using std::map;
37 using std::vector;
38 using std::pair;
39 using std::string;
40 
41 namespace esys
42 {
43  namespace lsm
44  {
45  class SimpleParticleData;
46  }
47 }
48 
53 class CRotParticle : public CParticle
54 {
55  public: // types
56 
58  {
59  public:
61  : m_pos(),
62  m_initPos(),
63  m_vel(),
64  m_angVel(),
65  m_quat()
66  {
67  m_is_dynamic=true;
68  m_is_rot=true;
69  }
70 
72  const Vec3 &pos,
73  const Vec3 &initPos,
74  const Vec3 &vel,
75  const Vec3 &currAngVel,
76  const Quaternion &quat,
77  const bool is_dyn,
78  const bool is_rot
79  )
80  : m_pos(pos),
81  m_initPos(initPos),
82  m_vel(vel),
83  m_angVel(currAngVel),
84  m_quat(quat)
85  {
86  m_is_dynamic=is_dyn;
87  m_is_rot=is_rot;
88  }
89  public:
96  bool m_is_rot;
97 
99  };
100  typedef double (CRotParticle::* ScalarFieldFunction)() const;
101  typedef Vec3 (CRotParticle::* VectorFieldFunction)() const;
102 
103  protected:
104 
109  double m_inertRot;
111  bool m_is_rot;
112 
113  void setMoment(const Vec3 &moment) {m_moment = moment;}
114 
115  public:
116  CRotParticle();
117  CRotParticle(const esys::lsm::SimpleParticleData &particleData);
118  CRotParticle(const CParticle &particle);
119  CRotParticle(
120  double rad,
121  double mass,
122  const Vec3& pos,
123  const Vec3& vel,
124  const Vec3& force,
125  int id,
126  bool is_dyn,
127  bool is_rot
128  );
129  CRotParticle(
130  double rad,
131  double mass,
132  const Vec3& pos,
133  const Vec3& vel,
134  const Vec3& force,
135  int id,
136  Quaternion& quat,
137  double inertRot,
138  const Vec3& moment,
139  const Vec3& angvel,
140  bool is_dyn,
141  bool is_rot
142  );
143  CRotParticle(
144  double rad,
145  double mass,
146  const Vec3& pos,
147  const Vec3& oldpos,
148  const Vec3& initpos,
149  const Vec3& vel,
150  const Vec3& force,
151  int id,
152  const Quaternion& quat,
153  const Quaternion& initquat,
154  double inertRot,
155  const Vec3& moment,
156  const Vec3& angvel,
157  bool is_dyn,
158  bool is_rot
159  );
160 
161  virtual ~CRotParticle(){};
162 
163  static int getPackSize();
164  static ScalarFieldFunction getScalarFieldFunction(const string&);
165  static VectorFieldFunction getVectorFieldFunction(const string&);
166 
167  // Need to define this for template class using forAllParticles call in Parallel/SubLattice.hpp.
170  virtual void setDensity(double);
171 
172  inline const Vec3 &getAngVel () const { return m_angVel;}
173  inline Vec3 getAngVelNR () const { return m_angVel;} // for field functions
174  inline void setAngVel(const Vec3 &V) { m_angVel = V;}
175  inline Quaternion getInitQuat() const { return m_initquat;}
176  inline Quaternion getQuat() const { return m_quat;}
177  inline void setQuat(const Quaternion &quat) { m_quat = quat;}
178  inline double getInertRot () const { return m_inertRot; }
179  inline void setInertRot (double inertRot)
180  {
181  m_inertRot = inertRot;
182  m_div_inertRot = 1.0/m_inertRot;
183  }
184  inline double getInvInertRot () const { return m_div_inertRot; }
185  inline Vec3 getMoment() const {return m_moment;}
186  void applyMoment( const Vec3&);
187  void integrate(double);
188  void integrateTherm(double dt){}
189  virtual void thermExpansion() {}
190  void zeroForce();
191  virtual void zeroHeat(){}
192  void rescale();
193  void setCircular(const Vec3& cv);
194  double getAngularKineticEnergy() const {return 0.5*m_inertRot*m_angVel*m_angVel;} // 1/2 I*omega^2
195  double getLinearKineticEnergy() const {return (0.5*m_mass)*(m_vel*m_vel);}
197  void writeAsDXLine(ostream&,int slid=0);
198 
199  // switching on/off dynamic behaviour
200  virtual void setNonDynamic() {m_is_dynamic=false;m_is_rot=false;};
201  virtual void setNonDynamicLinear() {m_is_dynamic=false;};
202  virtual void setNonDynamicRot() {m_is_rot=false;};
203 
204  inline Quaternion getQuatFromRotVec(const Vec3 &vec) const
205  {
206  const double angle = vec.norm();
207  const double halfAngle = angle/2.0;
208  if (halfAngle > 0.0) {
209  return Quaternion(cos(halfAngle), (vec)*(sin(halfAngle)/angle));
210  }
211  return Quaternion();
212  }
213  void rotateBy(const Vec3 &vec) {m_quat = getQuatFromRotVec(vec)*m_quat;}
214  void rotateTo(const Vec3 &vec) {m_quat = getQuatFromRotVec(vec);}
215 
216  friend ostream& operator<<(ostream&, const CRotParticle&);
217  void print(){cout << *this << endl << flush;};
218 
219  // -- checkpointing --
220  virtual void saveSnapShotData(std::ostream& oStream);
221  virtual void saveCheckPointData(std::ostream& oStream);
222  virtual void loadCheckPointData(std::istream& iStream);
223 
226 
227  template <typename TmplVisitor>
228  void visit(TmplVisitor &visitor)
229  {
230  visitor.visitRotParticle(*this);
231  }
232 
233  // stress
234  inline double sigma_xx_2D() const {return m_sigma(0,0)/(M_PI*m_rad*m_rad);};
235  inline double sigma_xy_2D() const {return m_sigma(0,1)/(M_PI*m_rad*m_rad);};
236  inline double sigma_yy_2D() const {return m_sigma(1,1)/(M_PI*m_rad*m_rad);};
237 // inline double sigma_d() const;
238  static void get_type() {cout <<" CRotParticle" ;};
239  friend class TML_PackedMessageInterface;
240 };
241 
242 #endif //__ROTPARTICLE_H
Class for a rotational particle.
Definition: RotParticle.h:53
Definition: Quaternion.h:29
double m_div_inertRot
Definition: RotParticle.h:110
friend ostream & operator<<(ostream &, const CRotParticle &)
Definition: RotParticle.cpp:528
Vec3 m_angVel
Definition: RotParticle.h:107
Matrix3 m_sigma
stress tensor.
Definition: Particle.h:86
Vec3 getDisplacement() const
Definition: Particle.h:111
Vec3 m_vel
Definition: Particle.h:87
Definition: vec3.h:46
Vec3 m_initPos
Definition: RotParticle.h:91
virtual void zeroHeat()
Definition: RotParticle.h:191
void applyMoment(const Vec3 &)
Definition: RotParticle.cpp:327
const Vec3 & getAngVel() const
Definition: RotParticle.h:172
double sigma_xx_2D() const
Definition: RotParticle.h:234
bool m_is_rot
Definition: RotParticle.h:111
exchangeType()
Definition: RotParticle.h:60
CRotParticle::exchangeType getExchangeValues()
Definition: RotParticle.cpp:332
Quaternion getQuat() const
Definition: RotParticle.h:176
double getKineticEnergy() const
Definition: RotParticle.h:196
static ScalarFieldFunction getScalarFieldFunction(const string &)
Definition: RotParticle.cpp:404
virtual void setNonDynamic()
Definition: RotParticle.h:200
void zeroForce()
Definition: RotParticle.cpp:296
void rotateTo(const Vec3 &vec)
Definition: RotParticle.h:214
void integrateTherm(double dt)
Definition: RotParticle.h:188
Definition: SimpleParticleData.h:27
Definition: CheckPointable.cpp:16
virtual void saveCheckPointData(std::ostream &oStream)
Definition: RotParticle.cpp:490
Vec3 m_angVel
Definition: RotParticle.h:93
virtual void setNonDynamicLinear()
Definition: RotParticle.h:201
virtual void loadCheckPointData(std::istream &iStream)
Definition: RotParticle.cpp:506
Vec3 getMoment() const
Definition: RotParticle.h:185
parrallel particle storage array with neighborsearch and variable exchange
Definition: SubLattice.h:61
double sigma_yy_2D() const
Definition: RotParticle.h:236
void setCircular(const Vec3 &cv)
Definition: RotParticle.cpp:466
VEC3_INLINE double norm() const
Definition: vec3.hpp:211
Quaternion getInitQuat() const
Definition: RotParticle.h:175
void rescale()
Definition: RotParticle.cpp:303
virtual void saveSnapShotData(std::ostream &oStream)
Definition: RotParticle.cpp:474
Quaternion getQuatFromRotVec(const Vec3 &vec) const
Definition: RotParticle.h:204
Con console & cout
Definition: console.cpp:30
void integrate(double)
Definition: RotParticle.cpp:275
Abstract base class for MPI send/recv buffer.
Definition: mpibuf.h:33
void resetDisplacement()
Definition: RotParticle.h:169
static int getPackSize()
virtual void thermExpansion()
Definition: RotParticle.h:189
double getAngularKineticEnergy() const
Definition: RotParticle.h:194
void resetDisplacement()
Definition: Particle.h:123
double getLinearKineticEnergy() const
Definition: RotParticle.h:195
void writeAsDXLine(ostream &, int slid=0)
void setMoment(const Vec3 &moment)
false if rotational dynamics are switched off
Definition: RotParticle.h:113
double sigma_xy_2D() const
Definition: RotParticle.h:235
double m_rad
radius
Definition: BasicParticle.h:48
bool m_is_rot
Definition: RotParticle.h:96
void print()
Definition: RotParticle.h:217
exchangeType(const Vec3 &pos, const Vec3 &initPos, const Vec3 &vel, const Vec3 &currAngVel, const Quaternion &quat, const bool is_dyn, const bool is_rot)
Definition: RotParticle.h:71
Quaternion m_quat
Definition: RotParticle.h:94
void setQuat(const Quaternion &quat)
Definition: RotParticle.h:177
virtual void setNonDynamicRot()
Definition: RotParticle.h:202
double getInvInertRot() const
Definition: RotParticle.h:184
virtual ~CRotParticle()
Definition: RotParticle.h:161
void rotateBy(const Vec3 &vec)
Definition: RotParticle.h:213
CRotParticle()
Definition: RotParticle.cpp:21
double m_inertRot
Definition: RotParticle.h:109
Vec3 m_moment
Angular velocity at time t.
Definition: RotParticle.h:108
bool m_is_dynamic
Definition: Particle.h:94
static VectorFieldFunction getVectorFieldFunction(const string &)
Definition: RotParticle.cpp:439
static void get_type()
Definition: RotParticle.h:238
void setExchangeValues(const CRotParticle::exchangeType &e)
Definition: RotParticle.cpp:351
Vec3 getAngVelNR() const
Definition: RotParticle.h:173
double(CRotParticle::* ScalarFieldFunction)() const
Definition: RotParticle.h:100
Quaternion m_initquat
Definition: RotParticle.h:106
Quaternion m_quat
Definition: RotParticle.h:105
bool m_is_dynamic
Definition: RotParticle.h:95
Vec3 getDisplacement() const
Definition: RotParticle.h:168
void visit(TmplVisitor &visitor)
Definition: RotParticle.h:228
Vec3(CRotParticle::* VectorFieldFunction)() const
Definition: RotParticle.h:101
Vec3 m_vel
Definition: RotParticle.h:92
Abstract base class for scatter/gather buffer, root component.
Definition: mpisgbuf.h:28
Class for a basic particle.
Definition: Particle.h:50
double getInertRot() const
Definition: RotParticle.h:178
void setInertRot(double inertRot)
Definition: RotParticle.h:179
Definition: RotParticle.h:57
double m_mass
Definition: Particle.h:91
Vec3 m_pos
Definition: RotParticle.h:90
void setAngVel(const Vec3 &V)
Definition: RotParticle.h:174
virtual void setDensity(double)
Definition: RotParticle.cpp:160
Abstract base/interface class for packed messages to be used in TML_Pack.
Definition: packed_message_interface.h:28