ClumpParticle.h
Go to the documentation of this file.
1 // This file is part of the MercuryDPM project (https://www.mercurydpm.org).
2 // Copyright (c), The MercuryDPM Developers Team. All rights reserved.
3 // License: BSD 3-Clause License; see the LICENSE file in the root directory.
4 
5 #ifndef MultiParticle_H
6 #define MultiParticle_H
7 
8 #include "Mercury3D.h"
9 #include "Math/SmallVector.h"
10 #include "BaseParticle.h"
11 #include "BaseInteractable.h"
12 #include "NonSphericalParticle.h"
14 #include "DPMBase.h"
20 {
21 public:
25  ClumpParticle();
26 
31 
37  ~ClumpParticle() override;
38 
39  ClumpParticle* copy() const override;
40 
41 
42  void write(std::ostream& os) const override
43  {
45  os << " nPebble_ " << nPebble_;
46  os << " clumpMass_ " << clumpMass_;
47  os << " viscousDamping_ " << viscousDamping_;
48  os << " pebblePos_ ";
49  for (const auto & pebbleP : pebblePos_) {os << pebbleP;}
50  os << " pebbleRadius_ ";
51  for (double pebbleRad : pebbleRadius_) {os << pebbleRad;}
52  //os << " pebbleParticles_ ";
53  //for (auto pebblePart : pebbleParticles_) {os << pebblePart;}
54  os << " principalDirections_ ";
56  os << " initPrincipalDirections_ ";
58  os << " clumpInitInertia_ " << clumpInitInertia_;
59  os << " clumpInertia_ " << clumpInertia_;
60  os << " rotationMatrix_ ";
61  os << rotationMatrix_;
62  os << " isPebble_ " << isPebble_;
63  //os << " clumpParticle_ " << clumpParticle_;
64  os << " isPebble_ " << isPebble_;
65  os << " isDzhanibekovParticle_ " << isDzhanibekovParticle_;
66  os << " isVerticallyOriented_ " << isVerticallyOriented_;
67  }
68 
69  void read(std::istream& is) override
70  {
72  std::string dummy;
73  is >> dummy >> nPebble_;
74  is >> dummy >> nPebble_;
75  is >> dummy >> clumpMass_;
76  is >> dummy >> viscousDamping_;
77  is >> dummy;
78  for (int i = 0; i<nPebble_; i++) {is >> pebblePos_[i];}
79  is >> dummy;
80  for (int i = 0; i<nPebble_; i++) {is >> pebbleRadius_[i];}
81  //is >> dummy;
82  //for (int i = 0; i<nPebble_; i++) {is >> pebbleParticles_[i];}
83  is >> dummy;
85  is >> dummy;
87  is >> dummy >> clumpInitInertia_;
88  is >> dummy >> clumpInertia_;
89  is >> dummy;
90  is >> rotationMatrix_;
91  is >> dummy >> isPebble_;
92  //is >> dummy >> clumpParticle_;
93  is >> dummy >> isPebble_;
94  is >> dummy >> isDzhanibekovParticle_;
95  is >> dummy >> isVerticallyOriented_;
96 
97 
98  }
99 
100  std::string getName() const override;
101 
102  bool isSphericalParticle() const override
103  {
104  return true;
105  }
106 
107  void computeMass(const ParticleSpecies& s) override;
108 
109  void setInitInertia(MatrixSymmetric3D inertia);
110 
111  void rotateTensorOfInertia();
112 
113  void addPebble(Vec3D position, Mdouble radius);
114 
115  void setClump();
116 
117  void setPrincipalDirections(Matrix3D directions);
118 
119  void setInitPrincipalDirections(Matrix3D directions);
120 
122  {
123 
125  }
127  {
129  }
131  {
133  }
134 
135  // Methods to obtain initial principal directions
137  {
139  }
141  {
143  }
145  {
147  }
148 
150  {
151  return rotationMatrix_;
152  }
153 
154  int NPebble() const; // Number of pebbles (for a clump particle)
155 
156  void actionsAfterAddObject() override; // The function that updates clump quantities after adding a pebble
157 
158  void updatePebblesVelPos();
159 
160  void integrateBeforeForceComputation(double time, double timeStep) override;
161 
162  void integrateAfterForceComputation(double time, double timeStep) override;
163 
164  void angularAccelerateClumpIterative(double timeStep); // Specific method of time integration for a clump particle
165 
166  void rotatePrincipalDirections(Vec3D rotation);
167 
168  // Principal direction
170  {
174  }
176  {
180  }
182  {
186  }
187 
188  std::vector<Mdouble> getPebbleRadius() const {
189  return pebbleRadius_;
190  }
191 
192  // add pointer to pebble pointers list
193  void setPebble(int kPebble, ClumpParticle* pPebble) {
194  pebbleParticles_[kPebble] = pPebble;
195  }
196 
197  // Sets the particle to be a pebble of a given clump
198  void setClump(ClumpParticle* master) {
199  isClump_ = false;
200  isPebble_ = true;
201  clumpParticle_ = master;
202  }
203 
205  {
206  clumpMass_ = mass;
207  invMass_ = 1 / clumpMass_;
208  }
209 
210  // Extra viscous damping on a clump
211  void setDamping(Mdouble damp)
212  {
213  viscousDamping_ = damp;
214  }
215 
216  Mdouble getKineticEnergy() const override{
217  Mdouble res = 0;
218  if (isClump_) {
219  Vec3D v = getVelocity();
220  res = 0.5 * clumpMass_ * (v.X * v.X + v.Y * v.Y + v.Z * v.Z );
221  }
222  return res;
223  }
224 
225  Mdouble getRotationalEnergy() const override{
226  Mdouble res = 0;
227  if (isClump_) {
228  Vec3D nn = getAngularVelocity();
229  Mdouble nl = nn.getLength();
230  Mdouble tol = 1e-10;
231  if (nl > tol) {
232  nn /= nl;
234  Mdouble II = Vec3D::dot(nn, (getInertia() * nn));
235  res = 0.5 * II * ww;
236  }
237  }
238  return res;
239 
240  }
241 
242  std::vector <Vec3D> getPebblePositions(){
243  std::vector <Vec3D> globalPos;
247  for (int i = 1; i <= NPebble(); i++){
248  globalPos.push_back(getPosition() + e1 * pebblePos_[i - 1].X + e2 * pebblePos_[i - 1].Y + e3 * pebblePos_[i - 1].Z);
249  }
250  return globalPos;
251  }
252 
253  std::vector <Mdouble> getPebbleRadii(){ return pebbleRadius_; }
254 
255  // Methods setting and getting some extra Boolean properties
256 
257  // check if particle is in "Dzhanibekov" state
259  {
260  return isDzhanibekovParticle_;
261  }
262 
263  // check if particle is "vertically oriented"
265  {
266  return isVerticallyOriented_;
267  }
268 
269  // set the "Dzhanibekov" state
271  {
273  }
274 
275  // set "vertically oriented" state
276  void setVerticallyOriented( bool d)
277  {
279  }
280 
281  unsigned getNumberOfFieldsVTK() const override
282  {
283  return 2;
284  }
285 
286  std::string getTypeVTK(unsigned i) const override
287  {
288  return "Int8";
289  }
290 
291 
292  std::string getNameVTK(unsigned i) const override
293  {
294  if (i==0)
295  return "DzhanibekovParticle";
296  else
297  return "VerticallyOriented";
298  }
299 
300 
301  std::vector<Mdouble> getFieldVTK(unsigned i) const override
302  {
303  if (i==0)
304  return std::vector<Mdouble>(1, isDzhanibekovParticle_);
305  else
306  return std::vector<Mdouble>(1, isVerticallyOriented_);
307  }
308 
309  void updateExtraQuantities();
310 
311 
312 private:
313 
314  int nPebble_; // Number of pebbles
315 
316  bool isDzhanibekovParticle_; // This property is needed to quantify Dzhanibekov gas properties
317 
318  bool isVerticallyOriented_; // This property is useful for mechnical stability simulations (Gomboc, Dominos)
319 
320  Vec3D angularAcceleration_; // Clump angular acceleration
321 
322  Mdouble clumpMass_; // Clump mass
323 
324  Mdouble viscousDamping_; // Viscous damping parameter - for extra clump damping
325 
326  MatrixSymmetric3D clumpInertia_; // Clump tensor of inertia
327 
328  MatrixSymmetric3D clumpInitInertia_; // Clump initial tensor of inertia
329 
330  std::vector<Vec3D> pebblePos_; // positions of pebbles in a local coordinate system
331 
332  std::vector<Mdouble> pebbleRadius_; // radii of pebbles
333 
334  Matrix3D principalDirections_; // clump's principal directions
335 
336  Matrix3D initPrincipalDirections_; // clump's initial principal directions
337 
338  std::vector<ClumpParticle*> pebbleParticles_; // pointers to pebbles
339 
340  Matrix3D rotationMatrix_; // Rotation matrix
341 
342  //Helper functions
343 
344  // Converts a Matrix3D into a MatrixSymmetric3D
345  MatrixSymmetric3D MtoS( Matrix3D M){ return MatrixSymmetric3D(M.XX, M.XY, M.XZ, M.YY, M.YZ, M.ZZ);}
346 
347  // Converts a MatrixSymmetric3D into a Matrix3D
348  Matrix3D StoM( MatrixSymmetric3D M){ return Matrix3D(M.XX, M.XY, M.XZ, M.XY, M.YY, M.YZ, M.XZ, M.YZ, M.ZZ);}
349 
350  // Transposes the matrix
351  Matrix3D transpose(Matrix3D M){ return Matrix3D(M.XX, M.YX, M.ZX, M.XY, M.YY, M.ZY, M.XZ, M.YZ, M.ZZ);}
352 };
353 
354 #endif
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Array< double, 1, 3 > e(1./3., 0.5, 2.)
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
virtual const Vec3D & getAngularVelocity() const
Returns the angular velocity of this interactable.
Definition: BaseInteractable.cc:319
virtual const Vec3D & getVelocity() const
Returns the velocity of this interactable.
Definition: BaseInteractable.cc:307
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
Definition: BaseInteractable.h:197
void write(std::ostream &os) const override
Particle print function, which accepts an std::ostream as input.
Definition: BaseParticle.cc:319
bool isClump_
The particle is pebble.
Definition: BaseParticle.h:717
MatrixSymmetric3D getInertia() const
Definition: BaseParticle.h:314
bool isPebble_
pointer to a clump particle (for a pebble)
Definition: BaseParticle.h:715
BaseParticle * clumpParticle_
Function that updates necessary quantities of a clump particle after adding a pebble.
Definition: BaseParticle.h:713
Mdouble invMass_
Particle radius_.
Definition: BaseParticle.h:651
void read(std::istream &is) override
Particle read function, which accepts an std::istream as input.
Definition: BaseParticle.cc:368
Definition: ClumpParticle.h:20
Mdouble getKineticEnergy() const override
Definition: ClumpParticle.h:216
void setPrincipalDirections_e1(Vec3D e)
Definition: ClumpParticle.h:169
int nPebble_
Definition: ClumpParticle.h:314
Vec3D getInitPrincipalDirections_e1() const
Definition: ClumpParticle.h:136
void angularAccelerateClumpIterative(double timeStep)
Definition: ClumpParticle.cc:334
void updatePebblesVelPos()
Definition: ClumpParticle.cc:227
ClumpParticle * copy() const override
Definition: ClumpParticle.cc:78
bool isSphericalParticle() const override
Definition: ClumpParticle.h:102
void setPebble(int kPebble, ClumpParticle *pPebble)
Definition: ClumpParticle.h:193
MatrixSymmetric3D clumpInitInertia_
Definition: ClumpParticle.h:328
bool getDzhanibekovParticle()
Definition: ClumpParticle.h:258
Mdouble clumpMass_
Definition: ClumpParticle.h:322
std::vector< Mdouble > getPebbleRadii()
Definition: ClumpParticle.h:253
ClumpParticle()
Basic Particle constructor, creates a particle at (0,0,0) with radius, mass and inertia equal to 1.
Definition: ClumpParticle.cc:16
Vec3D getPrincipalDirections_e2() const
Definition: ClumpParticle.h:126
MatrixSymmetric3D MtoS(Matrix3D M)
Definition: ClumpParticle.h:345
MatrixSymmetric3D clumpInertia_
Definition: ClumpParticle.h:326
void integrateAfterForceComputation(double time, double timeStep) override
Definition: ClumpParticle.cc:310
bool getVerticallyOriented()
Definition: ClumpParticle.h:264
std::vector< Mdouble > pebbleRadius_
Definition: ClumpParticle.h:332
Vec3D getInitPrincipalDirections_e2() const
Definition: ClumpParticle.h:140
Matrix3D getRotationMatrix() const
Definition: ClumpParticle.h:149
std::vector< Vec3D > pebblePos_
Definition: ClumpParticle.h:330
Matrix3D rotationMatrix_
Definition: ClumpParticle.h:340
void rotatePrincipalDirections(Vec3D rotation)
Definition: ClumpParticle.cc:126
std::string getName() const override
Definition: ClumpParticle.cc:84
void write(std::ostream &os) const override
Particle print function, which accepts an std::ostream as input.
Definition: ClumpParticle.h:42
Mdouble viscousDamping_
Definition: ClumpParticle.h:324
void setClumpMass(Mdouble mass)
Definition: ClumpParticle.h:204
std::vector< Mdouble > getFieldVTK(unsigned i) const override
Definition: ClumpParticle.h:301
void setInitPrincipalDirections(Matrix3D directions)
Definition: ClumpParticle.cc:120
void computeMass(const ParticleSpecies &s) override
Computes the particle's (inverse) mass and inertia.
Definition: ClumpParticle.cc:367
int NPebble() const
Definition: ClumpParticle.cc:90
void setClump()
Definition: ClumpParticle.cc:95
void actionsAfterAddObject() override
Definition: ClumpParticle.cc:167
void rotateTensorOfInertia()
Definition: ClumpParticle.cc:199
void setInitInertia(MatrixSymmetric3D inertia)
Definition: ClumpParticle.cc:191
Vec3D angularAcceleration_
Definition: ClumpParticle.h:320
std::string getNameVTK(unsigned i) const override
Definition: ClumpParticle.h:292
Vec3D getPrincipalDirections_e3() const
Definition: ClumpParticle.h:130
void setVerticallyOriented(bool d)
Definition: ClumpParticle.h:276
void updateExtraQuantities()
Definition: ClumpParticle.cc:381
Mdouble getRotationalEnergy() const override
Calculates the particle's rotational kinetic energy.
Definition: ClumpParticle.h:225
void integrateBeforeForceComputation(double time, double timeStep) override
Definition: ClumpParticle.cc:263
void setDzhanibekovParticle(bool d)
Definition: ClumpParticle.h:270
~ClumpParticle() override
Destructor, needs to be implemented and checked to see if it is the largest or smallest particle curr...
void setDamping(Mdouble damp)
Definition: ClumpParticle.h:211
Matrix3D StoM(MatrixSymmetric3D M)
Definition: ClumpParticle.h:348
void setPrincipalDirections(Matrix3D directions)
Definition: ClumpParticle.cc:114
void setPrincipalDirections_e3(Vec3D e)
Definition: ClumpParticle.h:181
std::vector< Vec3D > getPebblePositions()
Definition: ClumpParticle.h:242
Matrix3D initPrincipalDirections_
Definition: ClumpParticle.h:336
void setPrincipalDirections_e2(Vec3D e)
Definition: ClumpParticle.h:175
void read(std::istream &is) override
Particle read function, which accepts an std::istream as input.
Definition: ClumpParticle.h:69
unsigned getNumberOfFieldsVTK() const override
Definition: ClumpParticle.h:281
bool isVerticallyOriented_
Definition: ClumpParticle.h:318
std::vector< Mdouble > getPebbleRadius() const
Definition: ClumpParticle.h:188
Matrix3D transpose(Matrix3D M)
Definition: ClumpParticle.h:351
bool isDzhanibekovParticle_
Definition: ClumpParticle.h:316
void addPebble(Vec3D position, Mdouble radius)
Definition: ClumpParticle.cc:104
std::vector< ClumpParticle * > pebbleParticles_
Definition: ClumpParticle.h:338
std::string getTypeVTK(unsigned i) const override
Definition: ClumpParticle.h:286
Vec3D getInitPrincipalDirections_e3() const
Definition: ClumpParticle.h:144
void setClump(ClumpParticle *master)
Definition: ClumpParticle.h:198
Vec3D getPrincipalDirections_e1() const
Definition: ClumpParticle.h:121
Matrix3D principalDirections_
Definition: ClumpParticle.h:334
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Implementation of a 3D matrix.
Definition: Kernel/Math/Matrix.h:17
Mdouble YX
Definition: Kernel/Math/Matrix.h:22
Mdouble ZX
Definition: Kernel/Math/Matrix.h:22
Mdouble XY
Definition: Kernel/Math/Matrix.h:22
Mdouble YY
Definition: Kernel/Math/Matrix.h:22
Mdouble ZY
Definition: Kernel/Math/Matrix.h:22
Mdouble ZZ
Definition: Kernel/Math/Matrix.h:22
Mdouble YZ
Definition: Kernel/Math/Matrix.h:22
Mdouble XZ
Definition: Kernel/Math/Matrix.h:22
Mdouble XX
all nine matrix elements
Definition: Kernel/Math/Matrix.h:22
Implementation of a 3D symmetric matrix.
Definition: MatrixSymmetric.h:16
Base class for all non-spherical particle types.
Definition: NonSphericalParticle.h:16
Definition: ParticleSpecies.h:16
Definition: Kernel/Math/Vector.h:30
static Mdouble getLengthSquared(const Vec3D &a)
Calculates the squared length of a Vec3D: .
Definition: Kernel/Math/Vector.h:324
static Mdouble getLength(const Vec3D &a)
Calculates the length of a Vec3D: .
Definition: Vector.cc:350
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:56
RealScalar s
Definition: level1_cplx_impl.h:130
radius
Definition: UniformPSDSelfTest.py:15
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286