ESyS-Particle  2.3.4
RotParticle.h
Go to the documentation of this file.
1 // //
3 // Copyright (c) 2003-2017 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.apache.org/licenses/LICENSE-2.0 //
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;
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" ;};
240 };
241 
242 #endif //__ROTPARTICLE_H
CRotParticle::setNonDynamic
virtual void setNonDynamic()
Definition: RotParticle.h:200
CRotParticle::sigma_xx_2D
double sigma_xx_2D() const
Definition: RotParticle.h:234
CBasicParticle::m_pos
Vec3 m_pos
position
Definition: BasicParticle.h:47
TML_PackedMessageInterface
Abstract base/interface class for packed messages to be used in TML_Pack.
Definition: packed_message_interface.h:29
CParticle::getTotalDisplacement
Vec3 getTotalDisplacement() const
Definition: Particle.h:112
CRotParticle::getQuatFromRotVec
Quaternion getQuatFromRotVec(const Vec3 &vec) const
Definition: RotParticle.h:204
Quaternion::return_sca
QUATERNION_INLINE double return_sca() const
Definition: Quaternion.h:81
CRotParticle::rotateTo
void rotateTo(const Vec3 &vec)
Definition: RotParticle.h:214
CRotParticle::exchangeType::exchangeType
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
CRotParticle::setNonDynamicLinear
virtual void setNonDynamicLinear()
Definition: RotParticle.h:201
CRotParticle::saveCheckPointData
virtual void saveCheckPointData(std::ostream &oStream)
Definition: RotParticle.cpp:490
RotParticle.h
CParticle::getMass
double getMass() const
Definition: Particle.h:118
CRotParticle::exchangeType::m_is_dynamic
bool m_is_dynamic
Definition: RotParticle.h:95
CRotParticle::sigma_xy_2D
double sigma_xy_2D() const
Definition: RotParticle.h:235
CRotParticle::rescale
void rescale()
Definition: RotParticle.cpp:303
CParticle::setCircular
void setCircular(const Vec3 &)
Definition: Particle.cpp:329
CRotParticle::loadCheckPointData
virtual void loadCheckPointData(std::istream &iStream)
Definition: RotParticle.cpp:506
CBasicParticle::m_rad
double m_rad
radius
Definition: BasicParticle.h:48
CRotParticle::setDensity
virtual void setDensity(double)
Definition: RotParticle.cpp:160
CRotParticle::getAngVelNR
Vec3 getAngVelNR() const
Definition: RotParticle.h:173
CBasicParticle::m_global_id
int m_global_id
Definition: BasicParticle.h:49
CRotParticle::getMoment
Vec3 getMoment() const
Definition: RotParticle.h:185
CRotParticle::sigma_yy_2D
double sigma_yy_2D() const
Definition: RotParticle.h:236
CRotParticle::getInvInertRot
double getInvInertRot() const
Definition: RotParticle.h:184
console.h
operator<<
ostream & operator<<(ostream &ost, const CRotParticle &CP)
Definition: RotParticle.cpp:528
CRotParticle::thermExpansion
virtual void thermExpansion()
Definition: RotParticle.h:189
CRotParticle::writeAsDXLine
void writeAsDXLine(ostream &, int slid=0)
CRotParticle::resetDisplacement
void resetDisplacement()
Definition: RotParticle.h:169
Matrix3.h
CRotParticle::getQuat
Quaternion getQuat() const
Definition: RotParticle.h:176
AMPIBuffer
Abstract base class for MPI send/recv buffer.
Definition: mpibuf.h:34
TML_PackedMessageInterface::pop_int
virtual int pop_int()=0
CRotParticle::getExchangeValues
CRotParticle::exchangeType getExchangeValues()
Definition: RotParticle.cpp:332
CParticle::getIDField
double getIDField() const
Definition: Particle.h:124
CParticle::resetDisplacement
void resetDisplacement()
Definition: Particle.h:123
CRotParticle::exchangeType::m_vel
Vec3 m_vel
Definition: RotParticle.h:92
Vec3::norm
VEC3_INLINE double norm() const
Definition: vec3.hpp:211
Vec3::X
VEC3_INLINE double & X()
Definition: vec3.h:119
esys::lsm::SimpleParticleData
Definition: SimpleParticleData.h:28
CRotParticle::exchangeType::m_pos
Vec3 m_pos
Definition: RotParticle.h:90
CRotParticle::getScalarFieldFunction
static ScalarFieldFunction getScalarFieldFunction(const string &)
Definition: RotParticle.cpp:404
esys
Definition: CheckPointable.cpp:17
CRotParticle::integrateTherm
void integrateTherm(double dt)
Definition: RotParticle.h:188
CRotParticle::m_inertRot
double m_inertRot
Definition: RotParticle.h:109
CRotParticle::ScalarFieldFunction
double(CRotParticle::* ScalarFieldFunction)() const
Definition: RotParticle.h:100
CRotParticle::exchangeType
Definition: RotParticle.h:58
CParticle::m_div_mass
double m_div_mass
Definition: Particle.h:91
ParallelParticleArray
parrallel particle storage array with neighborsearch and variable exchange
Definition: pp_array.h:75
CRotParticle::zeroForce
void zeroForce()
Definition: RotParticle.cpp:296
CRotParticle::~CRotParticle
virtual ~CRotParticle()
Definition: RotParticle.h:161
esys::lsm::SimpleParticleData::getRadius
double getRadius() const
Definition: SimpleParticleData.hpp:134
Vec3::Z
VEC3_INLINE double & Z()
Definition: vec3.h:121
CRotParticle::m_moment
Vec3 m_moment
Angular velocity at time t.
Definition: RotParticle.h:108
NULL
#define NULL
Definition: t_list.h:17
CRotParticle::setExchangeValues
void setExchangeValues(const CRotParticle::exchangeType &e)
Definition: RotParticle.cpp:351
CParticle::getDisplacement
Vec3 getDisplacement() const
Definition: Particle.h:111
CRotParticle::getVectorFieldFunction
static VectorFieldFunction getVectorFieldFunction(const string &)
Definition: RotParticle.cpp:439
esys::lsm::SimpleParticleData::getMass
double getMass() const
Definition: SimpleParticleData.hpp:149
CRotParticle::exchangeType::exchangeType
exchangeType()
Definition: RotParticle.h:60
Quaternion.h
CRotParticle::setCircular
void setCircular(const Vec3 &cv)
Definition: RotParticle.cpp:466
CRotParticle::exchangeType::m_initPos
Vec3 m_initPos
Definition: RotParticle.h:91
CParticle::loadCheckPointData
virtual void loadCheckPointData(std::istream &iStream)
Definition: Particle.cpp:457
CParticle::flag
bool flag
Definition: Particle.h:93
CParticle::m_force
Vec3 m_force
Definition: Particle.h:87
packed_message_interface.h
TML_PackedMessageInterface::pop_doubles
virtual void pop_doubles(double *, int)=0
CRotParticle::saveSnapShotData
virtual void saveSnapShotData(std::ostream &oStream)
Definition: RotParticle.cpp:474
CParticle::m_vel
Vec3 m_vel
Definition: Particle.h:87
TML_PackedMessageInterface::append
virtual void append(int)=0
CBasicParticle::m_tag
int m_tag
Definition: BasicParticle.h:50
Vec3::Y
VEC3_INLINE double & Y()
Definition: vec3.h:120
CRotParticle::integrate
void integrate(double)
Definition: RotParticle.cpp:275
CRotParticle::m_quat
Quaternion m_quat
Definition: RotParticle.h:105
CRotParticle::setMoment
void setMoment(const Vec3 &moment)
false if rotational dynamics are switched off
Definition: RotParticle.h:113
Quaternion
Definition: Quaternion.h:30
CRotParticle::getPackSize
static int getPackSize()
Vec3
Definition: vec3.h:47
CParticle::getDo2dCalculations
static bool getDo2dCalculations()
Definition: Particle.h:181
CParticle::m_mass
double m_mass
Definition: Particle.h:91
CRotParticle::getInitQuat
Quaternion getInitQuat() const
Definition: RotParticle.h:175
TML_PackedMessageInterface::pop_bool
virtual bool pop_bool()=0
CParticle::getVel
Vec3 getVel() const
Definition: Particle.h:114
CRotParticle::VectorFieldFunction
Vec3(CRotParticle::* VectorFieldFunction)() const
Definition: RotParticle.h:101
CRotParticle::getLinearKineticEnergy
double getLinearKineticEnergy() const
Definition: RotParticle.h:195
CParticle::saveCheckPointData
virtual void saveCheckPointData(std::ostream &oStream)
Definition: Particle.cpp:438
CParticle::getForce
Vec3 getForce() const
Definition: Particle.h:120
vec3.h
CRotParticle::getAngVel
const Vec3 & getAngVel() const
Definition: RotParticle.h:172
CRotParticle::getInertRot
double getInertRot() const
Definition: RotParticle.h:178
Matrix3
3x3 Matrix
Definition: Matrix3.h:48
CRotParticle::setQuat
void setQuat(const Quaternion &quat)
Definition: RotParticle.h:177
CRotParticle::setNonDynamicRot
virtual void setNonDynamicRot()
Definition: RotParticle.h:202
CParticle::getTagField
double getTagField() const
Definition: Particle.h:125
CParticle::m_sigma
Matrix3 m_sigma
stress tensor.
Definition: Particle.h:86
CRotParticle::print
void print()
Definition: RotParticle.h:217
CRotParticle::setAngVel
void setAngVel(const Vec3 &V)
Definition: RotParticle.h:174
CRotParticle::getDisplacement
Vec3 getDisplacement() const
Definition: RotParticle.h:168
CRotParticle::rotateBy
void rotateBy(const Vec3 &vec)
Definition: RotParticle.h:213
CParticle::getAbsVel
double getAbsVel() const
Definition: Particle.h:115
CParticle::sigma_d
double sigma_d() const
Definition: Particle.cpp:398
CRotParticle::exchangeType::m_angVel
Vec3 m_angVel
Definition: RotParticle.h:93
CRotParticle::setInertRot
void setInertRot(double inertRot)
Definition: RotParticle.h:179
CRotParticle::CRotParticle
CRotParticle()
Definition: RotParticle.cpp:21
CRotParticle::m_div_inertRot
double m_div_inertRot
Definition: RotParticle.h:110
CRotParticle::operator<<
friend ostream & operator<<(ostream &, const CRotParticle &)
Definition: RotParticle.cpp:528
CParticle::saveSnapShotData
virtual void saveSnapShotData(std::ostream &oStream)
Definition: Particle.cpp:420
CParticle::m_is_dynamic
bool m_is_dynamic
Definition: Particle.h:94
CBasicParticle::getRad
double getRad() const
Definition: BasicParticle.h:64
Quaternion::return_vec
QUATERNION_INLINE Vec3 return_vec() const
Definition: Quaternion.h:80
CRotParticle::getKineticEnergy
double getKineticEnergy() const
Definition: RotParticle.h:196
CRotParticle::m_angVel
Vec3 m_angVel
Definition: RotParticle.h:107
CParticle::m_initpos
Vec3 m_initpos
position at time of construction
Definition: Particle.h:89
CParticle::m_oldpos
Vec3 m_oldpos
position at the time of last neighbor search
Definition: Particle.h:88
CRotParticle::exchangeType::m_is_rot
bool m_is_rot
Definition: RotParticle.h:96
CBasicParticle::getPos
Vec3 getPos() const
Definition: BasicParticle.h:62
SimpleParticleData.h
CRotParticle::m_initquat
Quaternion m_initquat
Definition: RotParticle.h:106
CRotParticle::get_type
static void get_type()
Definition: RotParticle.h:238
CParticle
Class for a basic particle.
Definition: Particle.h:51
CRotParticle::zeroHeat
virtual void zeroHeat()
Definition: RotParticle.h:191
CRotParticle::exchangeType::m_quat
Quaternion m_quat
Definition: RotParticle.h:94
CRotParticle::applyMoment
void applyMoment(const Vec3 &)
Definition: RotParticle.cpp:327
CRotParticle::getAngularKineticEnergy
double getAngularKineticEnergy() const
Definition: RotParticle.h:194
CRotParticle::m_is_rot
bool m_is_rot
Definition: RotParticle.h:111
CParticle::integrate
virtual void integrate(double)
Definition: Particle.cpp:250
CRotParticle
Class for a rotational particle.
Definition: RotParticle.h:54
Particle.h
CParticle::m_circular_shift
Vec3 m_circular_shift
shift vector if particle is circular image
Definition: Particle.h:90
CRotParticle::visit
void visit(TmplVisitor &visitor)
Definition: RotParticle.h:228
AMPISGBufferRoot
Abstract base class for scatter/gather buffer, root component.
Definition: mpisgbuf.h:29