Program listing for file kernel/src/modelingTools/LagrangianDS.hpp#
Return to documentation for this file
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