dynLattice
Loading...
Searching...
No Matches
ExplicitModule.h
Go to the documentation of this file.
1
10#pragma once
11
12#include "utils/helpers.h"
13#include <jem/base/ArithmeticException.h>
14#include <jem/base/Array.h>
15#include <jem/base/Class.h>
16#include <jem/base/ClassTemplate.h>
17#include <jem/base/System.h>
18#include <jem/base/array/operators.h>
19#include <jem/util/Event.h>
20#include <jem/util/Properties.h>
21#include <jem/util/PropertyException.h>
22#include <jive/algebra/AbstractMatrix.h>
23#include <jive/algebra/DiagMatrixObject.h>
24#include <jive/algebra/FlexMatrixBuilder.h>
25#include <jive/app/Module.h>
26#include <jive/app/ModuleFactory.h>
27#include <jive/fem/ElementGroup.h>
28#include <jive/fem/ElementSet.h>
29#include <jive/implict/Names.h>
30#include <jive/implict/SolverInfo.h>
31#include <jive/implict/SolverModule.h>
32#include <jive/implict/utilities.h>
33#include <jive/model/Actions.h>
34#include <jive/model/Model.h>
35#include <jive/model/StateVector.h>
36#include <jive/solver/Solver.h>
37#include <jive/solver/SolverParams.h>
38#include <jive/solver/declare.h>
39#include <jive/solver/utilities.h>
40#include <jive/util/Constraints.h>
41#include <jive/util/DenseTable.h>
42#include <jive/util/DofSpace.h>
43#include <jive/util/FuncUtils.h>
44#include <jive/util/Globdat.h>
45#include <jive/util/ItemSet.h>
46#include <jive/util/XTable.h>
47
48using jem::idx_t;
49using jem::newInstance;
50using jem::numeric::Function;
51
52using jive::BoolVector;
53using jive::IdxMatrix;
54using jive::Properties;
55using jive::Ref;
56using jive::String;
57using jive::StringVector;
58using jive::Vector;
59using jive::algebra::AbstractMatrix;
60using jive::algebra::DiagMatrixObject;
61using jive::algebra::FlexMatrixBuilder;
62using jive::app::Module;
63using jive::fem::ElementGroup;
64using jive::fem::ElementSet;
65using jive::implict::newSolverParams;
66using jive::implict::SolverInfo;
67using jive::implict::SolverModule;
68using jive::model::ActionParams;
69using jive::model::Actions;
70using jive::model::Model;
71using jive::model::StateVector;
72using jive::solver::newSolver;
73using jive::solver::Solver;
74using jive::util::Constraints;
75using jive::util::DenseTable;
76using jive::util::DofSpace;
77using jive::util::FuncUtils;
78using jive::util::Globdat;
79using jive::util::ItemSet;
80using jive::util::XTable;
81
85
86//-----------------------------------------------------------------------
87// class ExplicitModule
88//-----------------------------------------------------------------------
89
94class ExplicitModule : public SolverModule
95{
96 public:
103
104 JEM_DECLARE_CLASS(ExplicitModule, SolverModule);
105
108 static const char *TYPE_NAME;
109 static const char *STEP_COUNT;
110 static const char *SO3_DOFS;
111 static const char *LEN_SCALE;
112 static const char *MASS_MATRIX;
114
120 virtual Status init(const Properties &conf,
121 const Properties &props,
122 const Properties &globdat) override;
123
126 virtual void shutdown(const Properties &globdat) override;
127
131 virtual void configure(const Properties &props,
132 const Properties &globdat) override;
133
137 virtual void getConfig(const Properties &props,
138 const Properties &globdat) const override;
139
142 virtual void advance(const Properties &globdat) override;
143
147 virtual void solve(const Properties &info,
148 const Properties &globdat) override = 0;
149
152 virtual void cancel(const Properties &globdat) override;
153
157 virtual bool commit(const Properties &globdat) override;
158
161 virtual void setPrecision(double eps) override;
162
165 virtual double getPrecision() const override;
166
167 // static Ref<Module> makeNew
168
169 // (const String &name, const Properties &conf,
170 // const Properties &props, const Properties &globdat);
171
172 // static void declare();
173
174 protected:
177 explicit ExplicitModule(const String &name = "");
178
180 virtual ~ExplicitModule();
181
184 void updateMass_(const Properties &globdat);
185
187 void invalidate_();
188
191 void evalCommittedForce_(const Properties &globdat);
192
200 void publishCommittedForce_(const Properties &globdat);
201
204 void dropCommittedForce_(const Properties &globdat);
205
207 void updRotMask_();
208
213 inline void ABupdate(const Vector &delta_y,
214 const Vector &f_cur,
215 const Vector &f_old) const;
216
220 inline void ABupdate(const Vector &delta_y,
221 const Vector &f_cur) const;
222
228 void updateVec(const Vector &y_new,
229 const Vector &y_old,
230 const Vector &delta_y,
231 const bool rot = false);
232
238 void getAcce(const Vector &a,
239 const Ref<Constraints> &cons,
240 const Vector &fres,
241 const Properties &globdat);
242
248 Vector getForce(const Vector &fint,
249 const Vector &fext,
250 const Properties &globdat);
251
256 double getQuality(const Vector &y_pre,
257 const Vector &y_cor);
258
259 protected:
262 bool valid_;
264
268 Vector fintCache_;
271
274 double dtime_;
275 double prec_;
276 double minDtime_;
277 double maxDtime_;
278 double saftey_;
279 double incrFact_;
280 double decrFact_;
282
286 idx_t order_;
287 double lenScale_;
289
292 Ref<Function> updCond_;
293 Vector massInv_;
294 IdxVector dofsSO3_;
295 IdxMatrix rdofs_;
296 BoolVector isRotDof_;
298
301 Ref<Model> model_;
302 Ref<DofSpace> dofs_;
303 Ref<Constraints> cons_;
304 Ref<Solver> solver_;
306};
307
308//-----------------------------------------------------------------------
309// inline definitions
310//-----------------------------------------------------------------------
311
312inline void ExplicitModule::ABupdate(const Vector &delta_y,
313 const Vector &f_cur,
314 const Vector &f_old) const
315{
316 delta_y = dtime_ / 2. * (3. * f_cur - 1. * f_old);
317}
318
319inline void ExplicitModule::ABupdate(const Vector &delta_y,
320 const Vector &f_cur) const
321{
322 delta_y = dtime_ * f_cur;
323}
Base class for explicit time integration schemes.
Definition ExplicitModule.h:95
bool valid_
State validity flag.
Definition ExplicitModule.h:262
void updateMass_(const Properties &globdat)
Update mass matrix.
Definition ExplicitModule.cpp:521
virtual ~ExplicitModule()
Protected destructor.
Definition ExplicitModule.cpp:52
void dropCommittedForce_(const Properties &globdat)
Remove the published forces again (they are no longer valid)
Definition ExplicitModule.cpp:509
virtual void solve(const Properties &info, const Properties &globdat) override=0
Solve current time step (pure virtual)
double maxDtime_
Maximum time step size.
Definition ExplicitModule.h:277
Ref< Function > updCond_
Update condition function.
Definition ExplicitModule.h:292
void invalidate_()
invalidate_ current state
Definition ExplicitModule.cpp:580
double lenScale_
Characteristic length scale.
Definition ExplicitModule.h:287
void evalCommittedForce_(const Properties &globdat)
Evaluate the internal force at the committed state.
Definition ExplicitModule.cpp:471
static const char * SO3_DOFS
SO(3) DOF types property.
Definition ExplicitModule.h:110
BoolVector isRotDof_
Mask of rotational DOFs (rebuilt with rdofs_)
Definition ExplicitModule.h:296
Vector fintCache_
Internal force (without gyroscopic term) at the committed state.
Definition ExplicitModule.h:268
double dtime_
Current time step size.
Definition ExplicitModule.h:274
static const char * LEN_SCALE
Length scale property.
Definition ExplicitModule.h:111
Vector getForce(const Vector &fint, const Vector &fext, const Properties &globdat)
Get force vector.
Definition ExplicitModule.cpp:410
IdxVector dofsSO3_
SO(3) DOF type indices.
Definition ExplicitModule.h:294
static const char * STEP_COUNT
Step count property.
Definition ExplicitModule.h:109
double saftey_
Safety factor for step size control.
Definition ExplicitModule.h:278
virtual Status init(const Properties &conf, const Properties &props, const Properties &globdat) override
Initialize the module.
Definition ExplicitModule.cpp:62
bool fintCacheValid_
True between commit and the next state change.
Definition ExplicitModule.h:267
Ref< Constraints > cons_
Constraint manager.
Definition ExplicitModule.h:303
idx_t order_
Integration order.
Definition ExplicitModule.h:286
MassMode
Mass matrix formulation modes.
Definition ExplicitModule.h:99
@ LUMPED
Lumped mass matrix.
Definition ExplicitModule.h:100
@ CONSISTENT
Consistent mass matrix.
Definition ExplicitModule.h:101
static const char * MASS_MATRIX
globdat key of the published mass matrix
Definition ExplicitModule.h:112
Ref< Model > model_
Root of the model tree.
Definition ExplicitModule.h:301
IdxMatrix rdofs_
Rotational DOF mapping.
Definition ExplicitModule.h:295
virtual void configure(const Properties &props, const Properties &globdat) override
Configure the module from properties.
Definition ExplicitModule.cpp:221
virtual void getConfig(const Properties &props, const Properties &globdat) const override
Get current module configuration.
Definition ExplicitModule.cpp:245
virtual void shutdown(const Properties &globdat) override
Shutdown the module.
Definition ExplicitModule.cpp:205
virtual void advance(const Properties &globdat) override
Advance to next time step.
Definition ExplicitModule.cpp:262
void publishCommittedForce_(const Properties &globdat)
Publish the internal force of the committed state in globdat Not compatible with TangentOutputModule....
Definition ExplicitModule.cpp:489
double minDtime_
Minimum time step size.
Definition ExplicitModule.h:276
void updRotMask_()
Rebuild the rotational DOF mask from rdofs_.
Definition ExplicitModule.cpp:562
virtual double getPrecision() const override
Get current convergence precision.
Definition ExplicitModule.cpp:600
virtual void cancel(const Properties &globdat) override
Cancel current solution attempt.
Definition ExplicitModule.cpp:285
double prec_
Precision tolerance.
Definition ExplicitModule.h:275
void ABupdate(const Vector &delta_y, const Vector &f_cur, const Vector &f_old) const
Adams-Bashforth 2-step update.
Definition ExplicitModule.h:312
Vector massInv_
Inverse mass matrix.
Definition ExplicitModule.h:293
void updateVec(const Vector &y_new, const Vector &y_old, const Vector &delta_y, const bool rot=false)
Update displacement vectors with optional SO(3) handling.
Definition ExplicitModule.cpp:374
double incrFact_
Step size increase factor.
Definition ExplicitModule.h:279
static const char * TYPE_NAME
Module type name.
Definition ExplicitModule.h:108
Vector fintCacheDisp_
Displacements the cached force belongs to.
Definition ExplicitModule.h:269
double getQuality(const Vector &y_pre, const Vector &y_cor)
Get solution quality measure.
Definition ExplicitModule.cpp:610
Ref< DofSpace > dofs_
Degree of freedom space.
Definition ExplicitModule.h:302
double decrFact_
Step size decrease factor.
Definition ExplicitModule.h:280
virtual bool commit(const Properties &globdat) override
Compute next step size and commit solution.
Definition ExplicitModule.cpp:300
MassMode mode_
Mass matrix mode.
Definition ExplicitModule.h:285
virtual void setPrecision(double eps) override
Set convergence precision.
Definition ExplicitModule.cpp:590
void getAcce(const Vector &a, const Ref< Constraints > &cons, const Vector &fres, const Properties &globdat)
Get acceleration and return resulting force vector.
Definition ExplicitModule.cpp:351
Ref< Solver > solver_
Linear solver.
Definition ExplicitModule.h:304
file containing some basic helper functions
void expVec(const Matrix &Exp, const Vector &psi)
compute the exponential of a axial vector.
Definition helpers.cpp:185
void logMat(const Vector &rv, const Matrix &R)
compute rotational vector from rotation matrix.
Definition helpers.cpp:117
void mul3(const Matrix &C, const Matrix &A, const Matrix &B)
C = A * B for 3 x 3 matrices without heap allocation.
Definition helpers.cpp:162