Program listing for file kernel/src/modelingTools/LagrangianDS.hpp

Program listing for file kernel/src/modelingTools/LagrangianDS.hpp#

  1#ifndef LAGRANGIANDS_H
  2#define LAGRANGIANDS_H
  3
  4#include "BoundaryCondition.hpp"
  5#include "DynamicalSystem.hpp"
  6#include "SecondOrderDS.hpp"
  7#include "SiconosConst.hpp"
  8
  9
 10class LagrangianDS : public SecondOrderDS {
 11
 12protected:
 13
 14  ACCEPT_SERIALIZATION(LagrangianDS);
 15
 16
 17  void _init(SP::SiconosVector position, SP::SiconosVector velocity);
 18
 19
 20
 21
 22  VectorOfVectors _q;
 23
 24
 25  SP::SiconosVector _velocity0;
 26
 27
 28  SiconosMemory _qMemory;
 29
 30
 31  SiconosMemory _velocityMemory;
 32
 33
 34  SP::SiconosVector _fInt;
 35
 36
 37
 38
 39
 40
 41
 42
 43  SP::SiconosMatrix _jacobianFIntq;
 44
 45
 46  SP::SiconosMatrix _jacobianFIntqDot;
 47
 48
 49  SP::SiconosVector _fExt;
 50
 51
 52  bool _hasConstantFExt = false;
 53
 54
 55  SP::SiconosVector _fGyr;
 56
 57
 58  SP::SiconosMatrix _jacobianFGyrq;
 59
 60  SP::SiconosMatrix _jacobianFGyrqDot;
 61
 62
 63  SP::SiconosVector _forces;
 64
 65
 66  SP::SiconosMatrix _jacobianqForces;
 67
 68
 69  SP::SiconosMatrix _jacobianqDotForces;
 70
 71
 72  SiconosMemory _forcesMemory;
 73
 74  enum LagrangianDSRhsMatrices {
 75    jacobianXBloc10,
 76    jacobianXBloc11,
 77    zeroMatrix,
 78    idMatrix,
 79    numberOfRhsMatrices
 80  };
 81
 82  VectorOfSMatrices _rhsMatrices;
 83
 84
 85
 86
 87  SP::PluggedObject _pluginMass;
 88
 89
 90  SP::PluggedObject _pluginFInt;
 91
 92
 93
 94  SP::PluggedObject _pluginFExt;
 95
 96
 97  SP::PluggedObject _pluginFGyr;
 98
 99
100  SP::PluggedObject _pluginJacqFInt;
101
102
103  SP::PluggedObject _pluginJacqDotFInt;
104
105
106  SP::PluggedObject _pluginJacqFGyr;
107
108
109  SP::PluggedObject _pluginJacqDotFGyr;
110
111
112  void _zeroPlugin() override;
113
114
115  LagrangianDS() : SecondOrderDS(){};
116
117public:
118
119  LagrangianDS(SP::SiconosVector position, SP::SiconosVector velocity);
120
121
122  LagrangianDS(SP::SiconosVector position, SP::SiconosVector velocity,
123               SP::SiconosMatrix mass);
124
125
126  LagrangianDS(SP::SiconosVector position, SP::SiconosVector velocity,
127               const std::string &plugin);
128
129
130  virtual ~LagrangianDS(){};
131
132
133  void resetToInitialState() override;
134
135
136  void initRhs(double time) override;
137
138
139  void initializeNonSmoothInput(unsigned int level) override;
140
141
142  void computeRhs(double time) override;
143
144
145  void computeJacobianRhsx(double time) override;
146
147
148  void resetAllNonSmoothParts() override;
149
150
151  void resetNonSmoothPart(unsigned int level) override;
152
153
154  void setRhs(const SiconosVector &newValue) override
155  {
156    THROW_EXCEPTION(
157        "LagrangianDS - setRhs call is forbidden for 2nd order systems.");
158  }
159
160
161  void setRhsPtr(SP::SiconosVector newPtr) override
162  {
163    THROW_EXCEPTION(
164        "LagrangianDS - setRhsPtr call is forbidden for 2nd order systems.");
165  }
166
167
168
169
170
171  void computeForces(double time, SP::SiconosVector q,
172                     SP::SiconosVector velocity) override;
173
174
175  void computeJacobianqForces(double time) override;
176
177
178  virtual void computeJacobianqDotForces(double time)
179  {
180    computeJacobianvForces(time);
181  };
182
183
184  void computeJacobianvForces(double time) override;
185
186
187  inline SP::SiconosVector q() const override { return _q[0]; }
188
189
190  void setQ(const SiconosVector &newValue) override;
191
192
193  void setQPtr(SP::SiconosVector newPtr) override;
194
195
196  void setQ0(const SiconosVector &newValue) override;
197
198
199  void setQ0Ptr(SP::SiconosVector newPtr) override;
200
201
202  inline SP::SiconosVector velocity() const override { return _q[1]; }
203
204
205  void setVelocity(const SiconosVector &newValue) override;
206
207
208  void setVelocityPtr(SP::SiconosVector newPtr) override;
209
210
211  inline SP::SiconosVector velocity0() const override { return _velocity0; }
212
213
214  void setVelocity0(const SiconosVector &newValue) override;
215
216
217  void setVelocity0Ptr(SP::SiconosVector newPtr) override;
218
219
220  SP::SiconosVector acceleration() const override { return _q[2]; };
221
222
223  inline SP::SiconosVector fInt() const { return _fInt; }
224
225
226  inline void setFIntPtr(SP::SiconosVector newPtr) { _fInt = newPtr; }
227
228
229  inline SP::SiconosVector fExt() const { return _fExt; }
230
231
232  inline void setFExtPtr(SP::SiconosVector newPtr)
233  {
234    _fExt = newPtr;
235    _hasConstantFExt = true;
236  }
237
238
239  inline SP::SiconosVector fGyr() const { return _fGyr; }
240
241
242  inline void setFGyrPtr(SP::SiconosVector newPtr) { _fGyr = newPtr; }
243
244
245  inline SP::SiconosMatrix jacobianFIntq() const { return _jacobianFIntq; }
246
247
248  inline SP::SiconosMatrix jacobianFIntqDot() const
249  {
250    return _jacobianFIntqDot;
251  }
252  void allocateMass();
253  void allocateJacobianFIntq();
254  void allocateJacobianFIntqDot();
255  void allocateFInt();
256  void allocateFExt();
257
258
259  inline void setJacobianFIntqPtr(SP::SiconosMatrix newPtr)
260  {
261    _jacobianFIntq = newPtr;
262  }
263
264
265  inline void setJacobianFIntqDotPtr(SP::SiconosMatrix newPtr)
266  {
267    _jacobianFIntqDot = newPtr;
268  }
269
270
271  inline SP::SiconosMatrix jacobianFGyrq() const { return _jacobianFGyrq; }
272
273
274
275  inline SP::SiconosMatrix jacobianFGyrqDot() const
276  {
277    return _jacobianFGyrqDot;
278  }
279
280
281  inline void setJacobianFGyrqPtr(SP::SiconosMatrix newPtr)
282  {
283    _jacobianFGyrq = newPtr;
284  }
285
286
287  inline void setJacobianFGyrqDotPtr(SP::SiconosMatrix newPtr)
288  {
289    _jacobianFGyrqDot = newPtr;
290  }
291
292
293  inline SP::SiconosVector forces() const override { return _forces; }
294
295
296  virtual inline SP::SiconosMatrix jacobianqForces() const override
297  {
298    return _jacobianqForces;
299  }
300
301
302  inline SP::SiconosMatrix jacobianvForces() const override
303  {
304    return _jacobianqDotForces;
305  }
306
307
308  inline const SiconosMemory &qMemory() override { return _qMemory; }
309
310
311  inline const SiconosMemory &velocityMemory() override
312  {
313    return _velocityMemory;
314  }
315
316
317  inline const SiconosMemory &pMemory(unsigned int level)
318  {
319    return _pMemory[level];
320  }
321
322
323  inline const SiconosMemory &forcesMemory() override { return _forcesMemory; }
324
325
326  void initMemory(unsigned int size) override;
327
328
329  void swapInMemory() override;
330
331
332  void setComputeMassFunction(const std::string &pluginPath,
333                              const std::string &functionName)
334  {
335    _pluginMass->setComputeFunction(pluginPath, functionName);
336    if (!_mass)
337      _mass.reset(new SimpleMatrix(_ndof, _ndof));
338    _hasConstantMass = false;
339  }
340
341
342  void setComputeMassFunction(FPtr7 fct)
343  {
344    _pluginMass->setComputeFunction((void *)fct);
345    if (!_mass)
346      _mass.reset(new SimpleMatrix(_ndof, _ndof));
347    _hasConstantMass = false;
348  }
349
350
351  void setComputeFIntFunction(const std::string &pluginPath,
352                              const std::string &functionName);
353
354
355  void setComputeFIntFunction(FPtr6 fct);
356
357
358  void setComputeFExtFunction(const std::string &pluginPath,
359                              const std::string &functionName)
360  {
361    _pluginFExt->setComputeFunction(pluginPath, functionName);
362    if (!_fExt)
363      _fExt.reset(new SiconosVector(_ndof));
364    _hasConstantFExt = false;
365  }
366
367
368  void setComputeFExtFunction(VectorFunctionOfTime fct)
369  {
370    _pluginFExt->setComputeFunction((void *)fct);
371    if (!_fExt)
372      _fExt.reset(new SiconosVector(_ndof));
373
374    _hasConstantFExt = false;
375  }
376
377
378  void setComputeFGyrFunction(const std::string &pluginPath,
379                              const std::string &functionName);
380
381
382  void setComputeFGyrFunction(FPtr5 fct);
383
384
385  void setComputeJacobianFIntqFunction(const std::string &pluginPath,
386                                       const std::string &functionName);
387
388  void setComputeJacobianFIntqDotFunction(const std::string &pluginPath,
389                                          const std::string &functionName);
390
391
392  void setComputeJacobianFIntqFunction(FPtr6 fct);
393
394  void setComputeJacobianFIntqDotFunction(FPtr6 fct);
395
396
397  void setComputeJacobianFGyrqFunction(const std::string &pluginPath,
398                                       const std::string &functionName);
399
400
401  void setComputeJacobianFGyrqDotFunction(const std::string &pluginPath,
402                                          const std::string &functionName);
403
404
405  void setComputeJacobianFGyrqFunction(FPtr5 fct);
406
407  void setComputeJacobianFGyrqDotFunction(FPtr5 fct);
408
409
410  void computeMass() override;
411
412
413  void computeMass(SP::SiconosVector position) override;
414
415
416  virtual void computeFInt(double time);
417
418
419  virtual void computeFInt(double time, SP::SiconosVector position,
420                           SP::SiconosVector velocity);
421
422
423  virtual void computeFExt(double time);
424
425
426  virtual void computeFGyr();
427
428
429  virtual void computeFGyr(SP::SiconosVector position,
430                           SP::SiconosVector velocity);
431
432
433  virtual void computeJacobianFIntq(double time);
434
435  virtual void computeJacobianFIntqDot(double time);
436
437
438  virtual void computeJacobianFIntq(double time, SP::SiconosVector position,
439                                    SP::SiconosVector velocity);
440
441
442  virtual void computeJacobianFIntqDot(double time, SP::SiconosVector position,
443                                       SP::SiconosVector velocity);
444
445
446  virtual void computeJacobianFGyrq();
447
448
449  virtual void computeJacobianFGyrqDot();
450
451
452  virtual void computeJacobianFGyrq(SP::SiconosVector position,
453                                    SP::SiconosVector velocity);
454
455
456  virtual void computeJacobianFGyrqDot(SP::SiconosVector position,
457                                       SP::SiconosVector velocity);
458
459
460  void updatePlugins(double time) override{};
461
462
463  double computeKineticEnergy();
464
465
466  void display(bool brief = true) const override;
467
468
469  void computePostImpactVelocity();
470
471
472  void init_generalized_coordinates(unsigned int level);
473
474
475  void init_inverse_mass() override;
476
477
478  void update_inverse_mass() override;
479
480
481  void init_forces() override;
482
483  ACCEPT_STD_VISITORS();
484};
485
486TYPEDEF_SPTR(LagrangianDS)
487
488#endif