ESyS-Particle  2.3.4
RotParticleVi.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 __ROTPARTICLEVI_H
14 #define __ROTPARTICLEVI_H
15 
16 // -- project includes --
17 #include "Foundation/vec3.h"
18 #include "Foundation/Matrix3.h"
19 #include "Model/Particle.h"
20 #include "Foundation/Quaternion.h"
21 
22 template <class T> class ParallelParticleArray;
23 class AMPISGBufferRoot;
24 class AMPIBuffer;
25 class AField;
26 
27 //--- MPIincludes ---
28 #include <mpi.h>
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 
52 class CRotParticleVi : public CParticle
53 {
54  public: // types
55 
57  {
58  public:
60  : m_pos(),
61  m_initPos(),
62  m_vel(),
63  m_angVel(),
64  m_angVel_t(),
65  m_quat()
66  {
67  }
68 
70  const Vec3 &pos,
71  const Vec3 &initPos,
72  const Vec3 &vel,
73  const Vec3 &AngVel,
74  const Vec3 &currAngVel,
75  const Quaternion &quat
76  )
77  : m_pos(pos),
78  m_initPos(initPos),
79  m_vel(vel),
80  m_angVel(AngVel),
81  m_angVel_t(currAngVel),
82  m_quat(quat)
83  {
84  }
85  public:
92 
94  };
95  typedef double (CRotParticleVi::* ScalarFieldFunction)() const;
96  typedef Vec3 (CRotParticleVi::* VectorFieldFunction)() const;
97 
98  protected:
99 
102  Vec3 m_angVel; // ! Angular velocity at time t -0.5*dt
105  double m_inertRot;
108 
109  public:
110  CRotParticleVi();
111  CRotParticleVi(const esys::lsm::SimpleParticleData &particleData);
113  double rad,
114  double mass,
115  const Vec3& pos,
116  const Vec3& vel,
117  const Vec3& force,
118  int id,
119  bool is_dyn
120  );
122  double rad,
123  double mass,
124  const Vec3& pos,
125  const Vec3& vel,
126  const Vec3& force,
127  int id,
128  Quaternion& quat,
129  double inertRot,
130  const Vec3& moment,
131  const Vec3& angvel,
132  const Vec3& angvel_t
133  );
135  double rad,
136  double mass,
137  const Vec3& pos,
138  const Vec3& oldpos,
139  const Vec3& initpos,
140  const Vec3& vel,
141  const Vec3& force,
142  int id,
143  const Quaternion& quat,
144  const Quaternion& initquat,
145  double inertRot,
146  const Vec3& moment,
147  const Vec3& angvel,
148  const Vec3& angvel_t
149  );
150 
151  CRotParticleVi(const CParticle &p);
152 
153  virtual ~CRotParticleVi(){};
154 
155  static int getPackSize();
156  static ScalarFieldFunction getScalarFieldFunction(const string&);
157  static VectorFieldFunction getVectorFieldFunction(const string&);
158 
159  // Need to define this for template class using forAllParticles call in Parallel/SubLattice.hpp.
162 
163  inline const Vec3 &getAngVel () const { return m_angVel;}
164  inline const Vec3 getAngVel_t () const { return m_angVel_t ;} ;
165  inline void setAngVel_t (const Vec3 &v) { m_angVel_t = v;} ;
166  inline Vec3 getAngVelNR () const { return m_angVel_t;} // for field functions
167  inline void setAngVel(const Vec3 &V) { m_angVel = V;}
168  inline Quaternion getInitQuat() const { return m_initquat;}
169  inline Quaternion getQuat() const { return m_quat;}
170  inline void setQuat(const Quaternion &q) {m_quat = q;}
171  inline double getInertRot () const { return m_inertRot; }
172  inline void setInertRot (double inertRot)
173  {
174  m_inertRot = inertRot;
176  }
177  inline double getInvInertRot () const { return m_div_inertRot; }
178  inline Vec3 getMoment() const {return m_moment;}
179  inline void setMoment(const Vec3 &moment) {m_moment = moment;}
180  Vec3 getAngVector()const ;
181  void applyMoment( const Vec3&);
182  void integrate(double);
183  void zeroForce();
184 
185 //wycnewadded
186  virtual void zeroHeat(){} ;
187  virtual void integrateTherm(double){} ;
188  virtual void setTemperature(double){} ;
189  virtual void setCp(double){} ;
190  virtual void setThermExpansion0(double){} ;
191  virtual void setThermExpansion1(double){} ;
192  virtual void setThermExpansion2(double){} ;
193  virtual void thermExpansion(){} ;
194  virtual double get_y() {return m_pos.Y(); } ;
195 
196 
197  void rescale();
198  void setCircular(const Vec3& cv);
200  double getLinearKineticEnergy() const {return (0.5*m_mass)*(m_vel*m_vel);}
202  void writeAsDXLine(ostream&,int slid=0);
203  virtual void setNonRot() {m_inertRot=0.0;m_div_inertRot=0.0;};
204 
205  inline Quaternion getQuatFromRotVec(const Vec3 &vec) const
206  {
207  const double angle = vec.norm();
208  const double halfAngle = angle/2.0;
209  if (halfAngle > 0.0) {
210  return Quaternion(cos(halfAngle), (vec)*(sin(halfAngle)/angle));
211  }
212  return Quaternion();
213  }
214  void rotateBy(const Vec3 &vec) {m_quat = getQuatFromRotVec(vec)*m_quat;}
215  void rotateTo(const Vec3 &vec) {m_quat = getQuatFromRotVec(vec);}
216 
217  static map<string,AField*> generateFields(ParallelParticleArray<CRotParticleVi>*);
218 
219  friend ostream& operator<<(ostream&, const CRotParticleVi&);
220  void print(){cout << *this << endl << flush;};
221 
222  // -- checkpointing --
223  virtual void saveSnapShotData(std::ostream& oStream);
224  virtual void saveCheckPointData(std::ostream& oStream);
225  virtual void loadCheckPointData(std::istream& iStream);
226 
229 
230  // stress
231  inline double sigma_xx_2D() const {return m_sigma(0,0)/(M_PI*m_rad*m_rad);};
232  inline double sigma_xy_2D() const {return m_sigma(0,1)/(M_PI*m_rad*m_rad);};
233  inline double sigma_yy_2D() const {return m_sigma(1,1)/(M_PI*m_rad*m_rad);};
234 // inline double sigma_d() const;
235  static void get_type() {cout <<" CRotParticleVi" ;};
237 
238  template <typename TmplVisitor>
239  void visit(TmplVisitor &visitor)
240  {
241  visitor.visitRotParticleVi(*this);
242  }
243 
244 };
245 
246 #endif //__ROTPARTICLEVI_H
CRotParticleVi
Definition: RotParticleVi.h:53
CRotParticleVi::m_moment
Vec3 m_moment
Angular velocity at time t.
Definition: RotParticleVi.h:104
CRotParticleVi::getAngVelNR
Vec3 getAngVelNR() const
Definition: RotParticleVi.h:166
CBasicParticle::m_pos
Vec3 m_pos
position
Definition: BasicParticle.h:47
CRotParticleVi::getPackSize
static int getPackSize()
TML_PackedMessageInterface
Abstract base/interface class for packed messages to be used in TML_Pack.
Definition: packed_message_interface.h:29
CRotParticleVi::VectorFieldFunction
Vec3(CRotParticleVi::* VectorFieldFunction)() const
Definition: RotParticleVi.h:96
CRotParticleVi::resetDisplacement
void resetDisplacement()
Definition: RotParticleVi.h:161
CParticle::getTotalDisplacement
Vec3 getTotalDisplacement() const
Definition: Particle.h:112
CRotParticleVi::m_is_dynamic
bool m_is_dynamic
Definition: RotParticleVi.h:107
CRotParticleVi::print
void print()
Definition: RotParticleVi.h:220
Quaternion::return_sca
QUATERNION_INLINE double return_sca() const
Definition: Quaternion.h:81
CRotParticleVi::getAngVel_t
const Vec3 getAngVel_t() const
Definition: RotParticleVi.h:164
CRotParticleVi::setAngVel
void setAngVel(const Vec3 &V)
Definition: RotParticleVi.h:167
CRotParticleVi::exchangeType::m_vel
Vec3 m_vel
Definition: RotParticleVi.h:88
CRotParticleVi::exchangeType
Definition: RotParticleVi.h:57
CRotParticleVi::getKineticEnergy
double getKineticEnergy() const
Definition: RotParticleVi.h:201
CRotParticleVi::get_y
virtual double get_y()
Definition: RotParticleVi.h:194
CRotParticleVi::exchangeType::exchangeType
exchangeType()
Definition: RotParticleVi.h:59
CParticle::getMass
double getMass() const
Definition: Particle.h:118
CParticle::setCircular
void setCircular(const Vec3 &)
Definition: Particle.cpp:329
CBasicParticle::m_rad
double m_rad
radius
Definition: BasicParticle.h:48
CBasicParticle::m_global_id
int m_global_id
Definition: BasicParticle.h:49
CRotParticleVi::sigma_xx_2D
double sigma_xx_2D() const
Definition: RotParticleVi.h:231
CRotParticleVi::getQuat
Quaternion getQuat() const
Definition: RotParticleVi.h:169
CRotParticleVi::setNonRot
virtual void setNonRot()
Definition: RotParticleVi.h:203
CRotParticleVi::getScalarFieldFunction
static ScalarFieldFunction getScalarFieldFunction(const string &)
Definition: RotParticleVi.cpp:437
CRotParticleVi::rescale
void rescale()
Definition: RotParticleVi.cpp:331
CRotParticleVi::zeroForce
void zeroForce()
Definition: RotParticleVi.cpp:324
CRotParticleVi::get_type
static void get_type()
Definition: RotParticleVi.h:235
console.h
CRotParticleVi::operator<<
friend ostream & operator<<(ostream &, const CRotParticleVi &)
Definition: RotParticleVi.cpp:589
CRotParticleVi::getInertRot
double getInertRot() const
Definition: RotParticleVi.h:171
CRotParticleVi::setCp
virtual void setCp(double)
Definition: RotParticleVi.h:189
Matrix3.h
AMPIBuffer
Abstract base class for MPI send/recv buffer.
Definition: mpibuf.h:34
TML_PackedMessageInterface::pop_int
virtual int pop_int()=0
CRotParticleVi::getDisplacement
Vec3 getDisplacement() const
Definition: RotParticleVi.h:160
CRotParticleVi::exchangeType::m_quat
Quaternion m_quat
Definition: RotParticleVi.h:91
CRotParticleVi::zeroHeat
virtual void zeroHeat()
Definition: RotParticleVi.h:186
CRotParticleVi::ScalarFieldFunction
double(CRotParticleVi::* ScalarFieldFunction)() const
Definition: RotParticleVi.h:95
CParticle::getIDField
double getIDField() const
Definition: Particle.h:124
CRotParticleVi::integrateTherm
virtual void integrateTherm(double)
Definition: RotParticleVi.h:187
CRotParticleVi::integrate
void integrate(double)
Definition: RotParticleVi.cpp:260
CParticle::resetDisplacement
void resetDisplacement()
Definition: Particle.h:123
CRotParticleVi::generateFields
static map< string, AField * > generateFields(ParallelParticleArray< CRotParticleVi > *)
Definition: RotParticleVi.cpp:360
Vec3::norm
VEC3_INLINE double norm() const
Definition: vec3.hpp:211
CRotParticleVi::setAngVel_t
void setAngVel_t(const Vec3 &v)
Definition: RotParticleVi.h:165
CRotParticleVi::sigma_yy_2D
double sigma_yy_2D() const
Definition: RotParticleVi.h:233
Vec3::X
VEC3_INLINE double & X()
Definition: vec3.h:119
esys::lsm::SimpleParticleData
Definition: SimpleParticleData.h:28
esys
Definition: CheckPointable.cpp:17
CRotParticleVi::m_angVel_t
Vec3 m_angVel_t
Definition: RotParticleVi.h:103
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
CRotParticleVi::rotateBy
void rotateBy(const Vec3 &vec)
Definition: RotParticleVi.h:214
esys::lsm::SimpleParticleData::getRadius
double getRadius() const
Definition: SimpleParticleData.hpp:134
CRotParticleVi::exchangeType::m_angVel
Vec3 m_angVel
Definition: RotParticleVi.h:89
Vec3::Z
VEC3_INLINE double & Z()
Definition: vec3.h:121
CRotParticleVi::setQuat
void setQuat(const Quaternion &q)
Definition: RotParticleVi.h:170
CRotParticleVi::exchangeType::m_initPos
Vec3 m_initPos
Definition: RotParticleVi.h:87
CRotParticleVi::getLinearKineticEnergy
double getLinearKineticEnergy() const
Definition: RotParticleVi.h:200
CRotParticleVi::setThermExpansion0
virtual void setThermExpansion0(double)
Definition: RotParticleVi.h:190
NULL
#define NULL
Definition: t_list.h:17
CParticle::getDisplacement
Vec3 getDisplacement() const
Definition: Particle.h:111
CRotParticleVi::getMoment
Vec3 getMoment() const
Definition: RotParticleVi.h:178
esys::lsm::SimpleParticleData::getMass
double getMass() const
Definition: SimpleParticleData.hpp:149
CRotParticleVi::setInertRot
void setInertRot(double inertRot)
Definition: RotParticleVi.h:172
CRotParticleVi::setExchangeValues
void setExchangeValues(const CRotParticleVi::exchangeType &e)
Definition: RotParticleVi.cpp:385
Quaternion.h
CParticle::loadCheckPointData
virtual void loadCheckPointData(std::istream &iStream)
Definition: Particle.cpp:457
CRotParticleVi::setMoment
void setMoment(const Vec3 &moment)
Definition: RotParticleVi.h:179
CRotParticleVi::m_initquat
Quaternion m_initquat
Definition: RotParticleVi.h:101
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
CRotParticleVi::saveCheckPointData
virtual void saveCheckPointData(std::ostream &oStream)
Definition: RotParticleVi.cpp:559
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
CRotParticleVi::m_div_inertRot
double m_div_inertRot
Definition: RotParticleVi.h:106
CRotParticleVi::~CRotParticleVi
virtual ~CRotParticleVi()
Definition: RotParticleVi.h:153
CRotParticleVi::getExchangeValues
CRotParticleVi::exchangeType getExchangeValues()
Definition: RotParticleVi.cpp:367
CRotParticleVi::m_angVel
Vec3 m_angVel
Definition: RotParticleVi.h:102
CRotParticleVi::getAngVector
Vec3 getAngVector() const
Definition: RotParticleVi.cpp:493
CRotParticleVi::thermExpansion
virtual void thermExpansion()
Definition: RotParticleVi.h:193
RotParticleVi.h
CRotParticleVi::setCircular
void setCircular(const Vec3 &cv)
Definition: RotParticleVi.cpp:537
Quaternion
Definition: Quaternion.h:30
Vec3
Definition: vec3.h:47
CRotParticleVi::loadCheckPointData
virtual void loadCheckPointData(std::istream &iStream)
Definition: RotParticleVi.cpp:570
CParticle::getDo2dCalculations
static bool getDo2dCalculations()
Definition: Particle.h:181
CParticle::m_mass
double m_mass
Definition: Particle.h:91
CRotParticleVi::applyMoment
void applyMoment(const Vec3 &)
Definition: RotParticleVi.cpp:355
operator<<
ostream & operator<<(ostream &ost, const CRotParticleVi &CP)
Definition: RotParticleVi.cpp:589
CParticle::getVel
Vec3 getVel() const
Definition: Particle.h:114
CParticle::saveCheckPointData
virtual void saveCheckPointData(std::ostream &oStream)
Definition: Particle.cpp:438
CParticle::getForce
Vec3 getForce() const
Definition: Particle.h:120
vec3.h
CRotParticleVi::setTemperature
virtual void setTemperature(double)
Definition: RotParticleVi.h:188
CRotParticleVi::exchangeType::m_angVel_t
Vec3 m_angVel_t
Definition: RotParticleVi.h:90
Matrix3
3x3 Matrix
Definition: Matrix3.h:48
CParticle::m_sigma
Matrix3 m_sigma
stress tensor.
Definition: Particle.h:86
CRotParticleVi::getInvInertRot
double getInvInertRot() const
Definition: RotParticleVi.h:177
CRotParticleVi::saveSnapShotData
virtual void saveSnapShotData(std::ostream &oStream)
Definition: RotParticleVi.cpp:545
CParticle::sigma_d
double sigma_d() const
Definition: Particle.cpp:398
CRotParticleVi::visit
void visit(TmplVisitor &visitor)
Definition: RotParticleVi.h:239
CRotParticleVi::setThermExpansion1
virtual void setThermExpansion1(double)
Definition: RotParticleVi.h:191
CParticle::saveSnapShotData
virtual void saveSnapShotData(std::ostream &oStream)
Definition: Particle.cpp:420
CRotParticleVi::m_inertRot
double m_inertRot
Definition: RotParticleVi.h:105
CBasicParticle::getRad
double getRad() const
Definition: BasicParticle.h:64
Quaternion::return_vec
QUATERNION_INLINE Vec3 return_vec() const
Definition: Quaternion.h:80
CRotParticleVi::m_quat
Quaternion m_quat
Definition: RotParticleVi.h:100
CRotParticleVi::getAngVel
const Vec3 & getAngVel() const
Definition: RotParticleVi.h:163
CRotParticleVi::exchangeType::exchangeType
exchangeType(const Vec3 &pos, const Vec3 &initPos, const Vec3 &vel, const Vec3 &AngVel, const Vec3 &currAngVel, const Quaternion &quat)
Definition: RotParticleVi.h:69
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
CBasicParticle::getPos
Vec3 getPos() const
Definition: BasicParticle.h:62
SimpleParticleData.h
CRotParticleVi::getInitQuat
Quaternion getInitQuat() const
Definition: RotParticleVi.h:168
CRotParticleVi::rotateTo
void rotateTo(const Vec3 &vec)
Definition: RotParticleVi.h:215
CRotParticleVi::writeAsDXLine
void writeAsDXLine(ostream &, int slid=0)
CRotParticleVi::sigma_xy_2D
double sigma_xy_2D() const
Definition: RotParticleVi.h:232
CParticle
Class for a basic particle.
Definition: Particle.h:51
CRotParticleVi::getAngularKineticEnergy
double getAngularKineticEnergy() const
Definition: RotParticleVi.h:199
CRotParticleVi::CRotParticleVi
CRotParticleVi()
Definition: RotParticleVi.cpp:21
CRotParticleVi::getVectorFieldFunction
static VectorFieldFunction getVectorFieldFunction(const string &)
Definition: RotParticleVi.cpp:465
CRotParticleVi::getQuatFromRotVec
Quaternion getQuatFromRotVec(const Vec3 &vec) const
Definition: RotParticleVi.h:205
CRotParticleVi::setThermExpansion2
virtual void setThermExpansion2(double)
Definition: RotParticleVi.h:192
CRotParticleVi::exchangeType::m_pos
Vec3 m_pos
Definition: RotParticleVi.h:86
Particle.h
CParticle::m_circular_shift
Vec3 m_circular_shift
shift vector if particle is circular image
Definition: Particle.h:90
AMPISGBufferRoot
Abstract base class for scatter/gather buffer, root component.
Definition: mpisgbuf.h:29