GranOO  3.0
A robust and versatile workbench to build 3D dynamic simulations based on the Discrete Element Method
Node.hpp
Go to the documentation of this file.
1 // This file is part of GranOO, a workbench for DEM simulation.
2 //
3 // Author(s) : - Damien Andre IRCER/UNILIM, Limoges France
4 // <damien.andre@unilim.fr>
5 // - Jean-luc Charles Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
6 // <jean-luc.charles@ensam.eu>
7 // - Jeremie Girardot Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
8 // <jeremie.girardot@ensam.eu>
9 // - Cedric Hubert LAMIH/UPHF, Valenciennes France
10 // <cedric.hubert@uphf.fr>
11 // - Ivan Iordanoff Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
12 // <ivan.iordanoff@ensam.eu>
13 //
14 // Copyright (C) 2008-2019 D. Andre, JL. Charles, J. Girardot, C. Hubert, I. Iordanoff
15 //
16 // This program is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 // This program is distributed in the hope that it will be useful,
22 // but WITHOUT ANY WARRANTY; without even the implied warranty of
23 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 // GNU General Public License for more details.
25 //
26 // You should have received a copy of the GNU General Public License
27 // along with this program. If not, see <http://www.gnu.org/licenses/>.
28 
29 
30 #ifndef _LibPhysic_Node
31 #define _LibPhysic_Node
32 
33 
34 #include "GranOO3/Core/Base.hpp"
35 #include "GranOO3/Physic/ExtendedSetOf/Node.hpp"
36 
37 #include "GranOO3/Core/MArray.hpp"
39 #include "GranOO3/Physic/Dof.hpp"
40 #include "GranOO3/Geom/Point.hpp"
41 #include "GranOO3/Geom/Vector.hpp"
43 #include "GranOO3/Geom/Frame.hpp"
45 
46 
47 namespace GranOO3
48 {
49  namespace FEM
50  {
51  class Surface;
52  }
53 
54  namespace Physic
55  {
56  class Ground;
57 
58  class Node : public Core::Base, public Core::PropClass<Node>, public Core::Register<Node> {
59 
60  GRANOO_CLASS(Physic::Node, Core::Base);
61 
62  public:
63  // Constructors and destructor
64  Node(const Geom::Vector &position);
65  Node(const Geom::Point &position);
66  Node();
67 
68  virtual ~Node();
69 
70  void clear_force();
71  void clear_torque();
72 
73  // configuration
74  #ifdef FEM_MODE
75  GRANOO_ACCESS_GET(dof, Physic::Dof<6>, _dof);
76  GRANOO_ACCESS_REF(dof, Physic::Dof<6>, _dof);
77  #endif
78 
79  // position
80  GRANOO_ACCESS(initial_position, Geom::Vector , _initial_position);
81  GRANOO_ACCESS_GET(position , Geom::Vector , _position ); // the same data in memory !
82  GRANOO_ACCESS_GET(center , Geom::Point , _center ); // note that center and position are
83 
84  // linear
85 
86  GRANOO_ACCESS(linear_velocity , Geom::Vector , _linear_velocity );
87  GRANOO_ACCESS(linear_acceleration, Geom::Vector , _linear_acceleration);
88 
89 
90  // angular
91  GRANOO_ACCESS(initial_quaternion , Geom::Quaternion, _initial_quat);
92  GRANOO_ACCESS(quaternion , Geom::Quaternion, _quat );
93 
94  GRANOO_ACCESS(angular_velocity , Geom::Vector , _angular_vel );
95  GRANOO_ACCESS(quaternion_velocity , Geom::Quaternion, _quat_vel );
96  GRANOO_ACCESS(quaternion_acceleration, Geom::Quaternion, _quat_acc );
97 
98 
99 
100  #ifdef FEM_MODE
101  GRANOO_ACCESS_GET(displacement , Geom::Vector , *_displacement );
102  GRANOO_ACCESS(force , Geom::Vector , *_force );
103  GRANOO_ACCESS(angle , Geom::EulerAngle, *_angle );
104  GRANOO_ACCESS(torque , Geom::Vector , *_torque );
105  #else
106  GRANOO_ACCESS_GET(displacement , Geom::Vector , _displacement );
107  GRANOO_ACCESS(force , Geom::Vector , _force );
108  GRANOO_ACCESS(angle , Geom::EulerAngle, _angle );
109  GRANOO_ACCESS(torque , Geom::Vector , _torque );
110  #endif
111 
112  const Geom::Frame& local_frame() const;
113 
114  // Memory management
115  #ifdef FEM_MODE
116  Core::MPtr<Geom::Vector> & displacement_ptr() { return _displacement; };
117  Core::MPtr<Geom::Vector> & force_ptr() { return _force; };
118  Core::MPtr<Geom::Vector> & torque_ptr() { return _torque; };
119  Core::MPtr<Geom::EulerAngle>& angle_ptr() { return _angle; };
120  #endif
121 
122  // Movement management
123  void incremental_move(const Geom::Vector& vec);
124  void incremental_unmove(const Geom::Vector& vec);
127  void set_displacement(const Geom::Vector&);
128  void clear_displacement();
129  void set_displacement_x(const double&);
130  void set_displacement_y(const double&);
131  void set_displacement_z(const double&);
132  void set_position(const Geom::Vector&);
133  void set_position_x(const double&);
134  void set_position_y(const double&);
135  void set_position_z(const double&);
136  void set_center (const Geom::Point&);
138 
139  void update_from_fem();
140  void update_from_dem();
141 
142  void add_interaction(Node&);
143  void erase_interaction(Node&);
144  bool interact_with(const Node &) const;
145  bool interact_with(const Ground &) const; // always return false
146  bool interact_with(const FEM::Surface &) const;
147 
148 
149  //FORCE COMPUTATION
150  void apply_force (const Geom::Vector&);
151  void apply_torque(const Geom::Vector&);
152 
153  // KINEMATICS
154  void set_quaternion_velocity_from_angular_velocity(const Geom::Vector& angularVelocity);
155  void set_quaternion_acceleration_from_angular_acceleration(const Geom::Vector& angularAcceleration, const Geom::Vector& angularVelocity);
157  virtual void clear_kinematic();
159 
160  // MASS
161  virtual double get_mass() const;
162 
163  // CLONING
164  void make_equal_to(const Node&);
165 
166  // IO
167  virtual std::string info() const;
168  virtual std::ostream& write_ascii (std::ostream& out) const;
169  virtual std::istream& read_ascii (std::istream& in);
170  virtual std::ostream& export_to_povray (std::ostream& out) const;
171  virtual void draw();
172 
173  private:
174  Node(const Node&) = delete;
175  Node & operator=(const Node &) = delete;
176 
177  //SERIALIZATION
179  template<class Archive> void save(Archive&, const unsigned int ) const;
180  template<class Archive> void load(Archive&, const unsigned int);
182 
183  private:
185 
189 
190  #ifdef FEM_MODE
193  #else
196  #endif
197 
200 
201  #ifdef FEM_MODE
203  #else
205  #endif
208  #ifdef FEM_MODE
210  #else
212  #endif
216 
218 #ifdef FEM_MODE
219  Dof<6> _dof;
220 #endif
221  };
222 
223  inline
224  Node::Node() : Node(Geom::Vector(0, 0, 0)) {
225  }
226 
227  inline
228  Node::Node(const Geom::Point &position) : Node(position.to_vector()) {
229  }
230 
231  inline
232  Node::Node(const Geom::Vector &position) :
233  _interaction(),
234  _initial_position(position),
235  _center(position.to_point()),
236  _position(_center.to_vector()),
237  _displacement(0.,0.,0.),
238  _force(0.,0.,0.),
239  _linear_velocity(0.,0.,0.),
240  _linear_acceleration(0.,0.,0.),
241  _torque(0.,0.,0.),
242  _initial_quat(0.,0.,0.,1.),
243  _quat(0.,0.,0.,1.),
244  _angle(0.,0.,0.),
245  _angular_vel(0.,0.,0.),
246  _quat_vel(0.,0.,0.,0.),
247  _quat_acc(0.,0.,0.,0.),
248  _frame(_center, _quat, Geom::Frame::global)
249 #ifdef FEM_MODE
250  ,_dof((const double*&)(_displacement.ptr()))
251 #endif
252  {
253 
254  }
255 
256  inline
258 
259  }
260 
261  inline const Geom::Frame &
263 
264  return _frame;
265  }
266 
267  inline void
269  #ifdef FEM_MODE
270  _force->clear();
271  #else
272  _force.clear();
273  #endif
274  }
275 
276  inline void
278  #ifdef FEM_MODE
279  _torque->clear();
280  #else
281  _torque.clear();
282  #endif
283  }
284 
285  inline void
287 
288  _displacement += v;
289  _position += v;
290  }
291 
292  inline void
294 
295  _displacement -= v;
296  _position -= v;
297  }
298 
299 
300  inline void
302 
303  _displacement = v;
304  _position = get_initial_position() + v;
305  }
306 
307  inline void
309 #ifdef FEM_MODE
310  _displacement->clear();
311 #else
313 #endif
315  }
316 
317  inline void
318  Node::set_displacement_x(const double& val) {
319 #ifdef FEM_MODE
320  _displacement->x() = val;
321 #else
322  _displacement.x() = val;
323 #endif
324  _position.x() = _initial_position.x() + val;
325  }
326 
327  inline void
328  Node::set_displacement_y(const double& val) {
329 #ifdef FEM_MODE
330  _displacement->y() = val;
331 #else
332  _displacement.y() = val;
333 #endif
334  _position.y() = _initial_position.y() + val;
335  }
336 
337  inline void
338  Node::set_displacement_z(const double& val) {
339 #ifdef FEM_MODE
340  _displacement->z() = val;
341 #else
342  _displacement.z() = val;
343 #endif
344  _position.z() = _initial_position.z() + val;
345  }
346 
347  inline void
349  _position = v;
351  }
352 
353  inline void
354  Node::set_position_x(const double& d) {
355  _position.x() = d;
356 #ifdef FEM_MODE
358 #else
360 #endif
361 
362  }
363 
364  inline void
365  Node::set_position_y(const double& d) {
366  _position.y() = d;
367 #ifdef FEM_MODE
369 #else
371 #endif
372  }
373 
374  inline void
375  Node::set_position_z(const double& d) {
376  _position.z() = d;
377 #ifdef FEM_MODE
379 #else
381 #endif
382  }
383 
384  inline void
386  _center = p;
388  }
389 
390 
391  inline void
393 
394  _position = initial_position() + _displacement;
395  }
396 
397  inline void
399 
401  }
402 
403  inline void
405 
408 #ifdef FEM_MODE
409  _displacement->clear();
410 #else
412 #endif
413  }
414 
415  inline void
417 #ifdef FEM_MODE
419 #else
421 #endif
423  }
424 
425  inline void
427 #ifdef FEM_MODE
429 #else
431 #endif
432  }
433 
434  inline void
438  _quat_vel.clear();
439  _quat_acc.clear();
440  }
441 
442  inline void
444  // Note that the quaternion position must be updated before calling this function
445  _quat_vel = 0.5 * Geom::Quaternion(angVel)*_quat;
446  }
447 
448  inline void
450  _quat_acc = 0.5 * Geom::Quaternion(angAcc)*quaternion()+0.5 * Geom::Quaternion(angVel)*_quat_vel;
451  }
452 
453  inline void
455  const Geom::Quaternion & q = quaternion();
456  const Geom::Quaternion & dq = quaternion_velocity();
457  const Geom::Vector w = (2*(q.conjugate()*dq)).to_vector();
458  angular_velocity() = Geom::Vector(w, local_frame(), Geom::Frame::global);
459  }
460 
461  inline void
463  force() += f;
464  }
465 
466  inline void
468  torque() += t;
469  }
470 
471 
472  inline bool
473  Node::interact_with(const Ground &) const {
474  return false;
475  }
476 
477  inline bool
479  return false;
480  }
481 
482 
483  template<class Archive> void
484  Node::save(Archive& ar, const unsigned int v) const {
485  ar << boost::serialization::base_object<Core::Base>(*this);
486 
487  ar << _initial_position;
488  ar << _center;
489  ar << _displacement;
490  ar << _linear_velocity;
491  ar << _linear_acceleration;
492  ar << _force;
493 
494  ar << _initial_quat;
495  ar << _quat;
496  ar << _angle;
497  ar << _quat_vel;
498  ar << _quat_acc;
499  ar << _torque;
500 
501  }
502 
503  template<class Archive> void
504  Node::load(Archive& ar, const unsigned int v) {
505  ar >> boost::serialization::base_object<Core::Base>(*this);
506 
507  ar >> _initial_position;
508  ar >> _center;
509  ar >> _displacement;
510  ar >> _linear_velocity;
511  ar >> _linear_acceleration;
512  ar >> _force;
513 
514  ar >> _initial_quat;
515  ar >> _quat;
516  ar >> _angle;
517  ar >> _quat_vel;
518  ar >> _quat_acc;
519  ar >> _torque;
521  }
522 
523  }
524  GRANOO_CLASS_DECLARE_TPL(Physic::Node);
525 }
526 
527 #endif
Definition: Base.hpp:61
Definition: MArray.hpp:47
Definition: PropClass.hpp:47
Definition: SetOf.hpp:346
Definition: SetOf.hpp:153
Definition: Surface.hpp:47
Definition: EulerAngle.hpp:61
void to_quaternion(Quaternion &) const
Definition: EulerAngle.cpp:44
Definition: Frame.hpp:68
static const Frame & global
Definition: Frame.hpp:76
Definition: Point.hpp:62
Definition: Quaternion.hpp:54
Quaternion conjugate() const
void to_euler_angle(EulerAngle &) const
Definition: Quaternion.cpp:88
Definition: Vector.hpp:75
Definition: Dof.hpp:54
Definition: Ground.hpp:61
Definition: Node.hpp:58
virtual std::ostream & write_ascii(std::ostream &out) const
Definition: Node.cpp:108
void update_initial_parameter_to_current_parameter()
Definition: Node.hpp:404
Geom::EulerAngle _angle
Definition: Node.hpp:211
Node & operator=(const Node &)=delete
void update_displacement_from_position()
Definition: Node.hpp:398
virtual std::ostream & export_to_povray(std::ostream &out) const
Definition: Node.cpp:120
Geom::Point _center
Definition: Node.hpp:187
Geom::Vector _initial_position
Definition: Node.hpp:186
Geom::Vector _angular_vel
Definition: Node.hpp:213
Geom::Quaternion _initial_quat
Definition: Node.hpp:206
void set_position(const Geom::Vector &)
Definition: Node.hpp:348
void set_position_z(const double &)
Definition: Node.hpp:375
virtual void clear_kinematic()
Definition: Node.hpp:435
void apply_torque(const Geom::Vector &)
Definition: Node.hpp:467
void set_quaternion_velocity_from_angular_velocity(const Geom::Vector &angularVelocity)
Definition: Node.hpp:443
virtual double get_mass() const
Definition: Node.cpp:73
void set_displacement_x(const double &)
Definition: Node.hpp:318
void clear_torque()
Definition: Node.hpp:277
virtual ~Node()
Definition: Node.hpp:257
void set_displacement_y(const double &)
Definition: Node.hpp:328
Geom::Vector get_linear_velocity_at(const Geom::Point &) const
Definition: Node.cpp:63
void set_displacement(const Geom::Vector &)
Definition: Node.hpp:301
void apply_force(const Geom::Vector &)
Definition: Node.hpp:462
bool interact_with(const Node &) const
Definition: Node.cpp:58
Geom::Vector _linear_velocity
Definition: Node.hpp:198
Geom::Vector _torque
Definition: Node.hpp:204
void set_displacement_z(const double &)
Definition: Node.hpp:338
void add_interaction(Node &)
Definition: Node.cpp:48
void incremental_move(const Geom::Vector &vec)
Definition: Node.hpp:286
Geom::Vector _force
Definition: Node.hpp:195
Node(const Node &)=delete
const Geom::Frame _frame
Definition: Node.hpp:217
virtual void draw()
Definition: Node.cpp:124
Geom::Vector _linear_acceleration
Definition: Node.hpp:199
Geom::Quaternion _quat
Definition: Node.hpp:207
void make_equal_to(const Node &)
Definition: Node.cpp:79
void clear_displacement()
Definition: Node.hpp:308
void erase_interaction(Node &)
Definition: Node.cpp:53
virtual std::string info() const
Definition: Node.cpp:95
Geom::Vector & _position
Definition: Node.hpp:188
friend class boost::serialization::access
Definition: Node.hpp:178
void save(Archive &, const unsigned int) const
Definition: Node.hpp:484
const Geom::Frame & local_frame() const
Definition: Node.hpp:262
void set_position_y(const double &)
Definition: Node.hpp:365
void incremental_unmove(const Geom::Vector &vec)
Definition: Node.hpp:293
virtual std::istream & read_ascii(std::istream &in)
Definition: Node.cpp:114
Core::SetOfBase< Node > _interaction
Definition: Node.hpp:184
void clear_force()
Definition: Node.hpp:268
void set_quaternion_acceleration_from_angular_acceleration(const Geom::Vector &angularAcceleration, const Geom::Vector &angularVelocity)
Definition: Node.hpp:449
Geom::Quaternion _quat_acc
Definition: Node.hpp:215
void update_position_from_displacement()
Definition: Node.hpp:392
Geom::Vector _displacement
Definition: Node.hpp:194
void update_from_fem()
Definition: Node.hpp:416
void set_position_x(const double &)
Definition: Node.hpp:354
Node()
Definition: Node.hpp:224
void set_center(const Geom::Point &)
Definition: Node.hpp:385
void update_angular_velocity()
Definition: Node.hpp:454
void load(Archive &, const unsigned int)
Definition: Node.hpp:504
void update_from_dem()
Definition: Node.hpp:426
Geom::Quaternion _quat_vel
Definition: Node.hpp:214
const
Definition: Sensor.hpp:225
Definition: Common.hpp:198
x y t t *t x y t t t x y t t t x *y t *t t x *y t *t t x y t t t x y t t t t(t+t)") define_sfop3(16