Program listing for file kernel/src/modelingTools/SecondOrderDS.hpp#
Return to documentation for this file
1#ifndef SECONDORDERDS_H
2#define SECONDORDERDS_H
3
4#include "BoundaryCondition.hpp"
5#include "DynamicalSystem.hpp"
6#include "SiconosConst.hpp"
7
8
9class SecondOrderDS : public DynamicalSystem {
10
11protected:
12
13 ACCEPT_SERIALIZATION(SecondOrderDS);
14
15
16
17
18 unsigned int _ndof;
19
20
21 SP::SiconosMatrix _mass;
22
23
24 bool _hasConstantMass = false;
25
26
27 SP::SimpleMatrix _inverseMass;
28
29
30 std::vector<SP::SiconosVector> _p;
31
32
33 SP::SiconosVector _q0;
34
35
36 VectorOfMemories _pMemory;
37
38
39 SP::BoundaryCondition _boundaryConditions;
40
41
42 SP::SiconosVector _reactionToBoundaryConditions;
43
44
45 SecondOrderDS() : DynamicalSystem(Type::SecondOrderDS){};
46
47
48 SecondOrderDS(unsigned int dimension, unsigned int ndof)
49 : DynamicalSystem(dimension), _ndof(ndof), _hasConstantMass(true){};
50
51public:
52
53 virtual ~SecondOrderDS(){};
54
55
56 inline SP::SiconosVector p(unsigned int level = 2) const { return _p[level]; }
57
58
59 inline SP::SiconosMatrix mass() const { return _mass; }
60
61
62 inline SP::SimpleMatrix inverseMass() const { return _inverseMass; }
63
64
65 inline void setMassPtr(SP::SimpleMatrix newPtr)
66 {
67 _mass = newPtr;
68 _hasConstantMass = true;
69 }
70
71
72 void setRhs(const SiconosVector &newValue) override
73 {
74 THROW_EXCEPTION(
75 "SecondOrderDS - setRhs call is forbidden for 2nd order systems.");
76 }
77
78
79 void setRhsPtr(SP::SiconosVector newPtr) override
80 {
81 THROW_EXCEPTION(
82 "SecondOrderDS - setRhsPtr call is forbidden for 2nd order systems.");
83 }
84
85
86
87
88
89 virtual void computeForces(double time, SP::SiconosVector q,
90 SP::SiconosVector velocity) = 0;
91
92
93 virtual void computeJacobianqForces(double time) = 0;
94
95
96 virtual void computeJacobianvForces(double time) = 0;
97
98
99 inline unsigned int dimension() const override{ return _ndof; }
100
101
102 virtual SP::SiconosVector q() const = 0;
103
104
105 virtual void setQ(const SiconosVector &newValue) = 0;
106
107
108 virtual void setQPtr(SP::SiconosVector newPtr) = 0;
109
110
111 SP::SiconosVector q0() const { return _q0; }
112
113
114 virtual void setQ0(const SiconosVector &newValue) = 0;
115
116
117 virtual void setQ0Ptr(SP::SiconosVector newPtr) = 0;
118
119
120 virtual SP::SiconosVector velocity() const = 0;
121
122
123 virtual void setVelocity(const SiconosVector &newValue) = 0;
124
125
126 virtual void setVelocityPtr(SP::SiconosVector newPtr) = 0;
127
128
129 virtual SP::SiconosVector velocity0() const = 0;
130
131
132 virtual void setVelocity0(const SiconosVector &newValue) = 0;
133
134
135 virtual void setVelocity0Ptr(SP::SiconosVector newPtr) = 0;
136
137
138 virtual SP::SiconosVector acceleration() const = 0;
139
140
141 virtual SP::SiconosVector forces() const = 0;
142
143
144 virtual SP::SiconosMatrix jacobianqForces() const = 0;
145
146
147 virtual SP::SiconosMatrix jacobianvForces() const = 0;
148
149
150 virtual const SiconosMemory &qMemory() = 0;
151
152
153 virtual const SiconosMemory &velocityMemory() = 0;
154
155
156 virtual const SiconosMemory &forcesMemory() = 0;
157
158
159 void initMemory(unsigned int size) override = 0;
160
161
162 virtual void computeMass() = 0;
163
164
165 virtual void computeMass(SP::SiconosVector position) = 0;
166
167
168 virtual void setBoundaryConditions(SP::BoundaryCondition newbd);
169
170
171 inline SP::BoundaryCondition boundaryConditions()
172 {
173 return _boundaryConditions;
174 };
175
176
177 inline void setReactionToBoundaryConditions(SP::SiconosVector newrbd)
178 {
179 _reactionToBoundaryConditions = newrbd;
180 };
181
182
183 inline SP::SiconosVector reactionToBoundaryConditions()
184 {
185 return _reactionToBoundaryConditions;
186 };
187
188
189 virtual void init_inverse_mass() = 0;
190
191
192 virtual void update_inverse_mass() = 0;
193
194
195 virtual void init_forces() = 0;
196
197 ACCEPT_STD_VISITORS();
198};
199
200
201
202#endif