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

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

  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