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::IdxMatrix;
53using jive::Properties;
54using jive::Ref;
55using jive::String;
56using jive::StringVector;
57using jive::Vector;
58using jive::algebra::AbstractMatrix;
59using jive::algebra::DiagMatrixObject;
60using jive::algebra::FlexMatrixBuilder;
61using jive::app::Module;
62using jive::fem::ElementGroup;
63using jive::fem::ElementSet;
64using jive::implict::newSolverParams;
65using jive::implict::SolverInfo;
66using jive::implict::SolverModule;
67using jive::model::ActionParams;
68using jive::model::Actions;
69using jive::model::Model;
70using jive::model::StateVector;
71using jive::solver::newSolver;
72using jive::solver::Solver;
73using jive::util::Constraints;
74using jive::util::DenseTable;
75using jive::util::DofSpace;
76using jive::util::FuncUtils;
77using jive::util::Globdat;
78using jive::util::ItemSet;
79using jive::util::XTable;
80
83
84//-----------------------------------------------------------------------
85// class ExplicitModule
86//-----------------------------------------------------------------------
87
92class ExplicitModule : public SolverModule
93{
94public:
101
102 JEM_DECLARE_CLASS(ExplicitModule, SolverModule);
103
106 static const char *TYPE_NAME;
107 static const char *STEP_COUNT;
108 static const char *SO3_DOFS;
109 static const char *LEN_SCALE;
111
117 virtual Status init(const Properties &conf,
118 const Properties &props,
119 const Properties &globdat) override;
120
123 virtual void shutdown(const Properties &globdat) override;
124
128 virtual void configure(const Properties &props,
129 const Properties &globdat) override;
130
134 virtual void getConfig(const Properties &props,
135 const Properties &globdat) const override;
136
139 virtual void advance(const Properties &globdat) override;
140
144 virtual void solve(const Properties &info,
145 const Properties &globdat) override = 0;
146
149 virtual void cancel(const Properties &globdat) override;
150
154 virtual bool commit(const Properties &globdat) override;
155
158 virtual void setPrecision(double eps) override;
159
162 virtual double getPrecision() const override;
163
164 // static Ref<Module> makeNew
165
166 // (const String &name, const Properties &conf,
167 // const Properties &props, const Properties &globdat);
168
169 // static void declare();
170
171protected:
174 explicit ExplicitModule(const String &name = "");
175
177 virtual ~ExplicitModule();
178
181 void updateMass_(const Properties &globdat);
182
184 void invalidate_();
185
190 inline void ABupdate(const Vector &delta_y,
191 const Vector &f_cur,
192 const Vector &f_old) const;
193
197 inline void ABupdate(const Vector &delta_y,
198 const Vector &f_cur) const;
199
205 void updateVec(const Vector &y_new,
206 const Vector &y_old,
207 const Vector &delta_y,
208 const bool rot = false);
209
215 void getAcce(const Vector &a,
216 const Ref<Constraints> &cons,
217 const Vector &fres,
218 const Properties &globdat);
219
225 Vector getForce(const Vector &fint,
226 const Vector &fext,
227 const Properties &globdat);
228
233 double getQuality(const Vector &y_pre,
234 const Vector &y_cor);
235
236protected:
239 bool valid_;
241
244 double dtime_;
245 double prec_;
246 double minDtime_;
247 double maxDtime_;
248 double saftey_;
249 double incrFact_;
250 double decrFact_;
252
256 idx_t order_;
257 double lenScale_;
259
262 Ref<Function> updCond_;
263 Vector massInv_;
264 IdxVector dofsSO3_;
265 IdxMatrix rdofs_;
267
270 Ref<Model> model_;
271 Ref<DofSpace> dofs_;
272 Ref<Constraints> cons_;
273 Ref<Solver> solver_;
275};
276
277//-----------------------------------------------------------------------
278// inline definitions
279//-----------------------------------------------------------------------
280
281inline void ExplicitModule::ABupdate(const Vector &delta_y,
282 const Vector &f_cur,
283 const Vector &f_old) const
284{
285 delta_y = dtime_ / 2. * (3. * f_cur - 1. * f_old);
286}
287
288inline void ExplicitModule::ABupdate(const Vector &delta_y,
289 const Vector &f_cur) const
290{
291 delta_y = dtime_ * f_cur;
292}
Base class for explicit time integration schemes.
Definition ExplicitModule.h:93
bool valid_
State validity flag.
Definition ExplicitModule.h:239
void updateMass_(const Properties &globdat)
Update mass matrix.
Definition ExplicitModule.cpp:425
virtual ~ExplicitModule()
Protected destructor.
Definition ExplicitModule.cpp:50
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:247
Ref< Function > updCond_
Update condition function.
Definition ExplicitModule.h:262
void invalidate_()
invalidate_ current state
Definition ExplicitModule.cpp:465
double lenScale_
Characteristic length scale.
Definition ExplicitModule.h:257
static const char * SO3_DOFS
SO(3) DOF types property.
Definition ExplicitModule.h:108
double dtime_
Current time step size.
Definition ExplicitModule.h:244
static const char * LEN_SCALE
Length scale property.
Definition ExplicitModule.h:109
Vector getForce(const Vector &fint, const Vector &fext, const Properties &globdat)
Get force vector.
Definition ExplicitModule.cpp:398
IdxVector dofsSO3_
SO(3) DOF type indices.
Definition ExplicitModule.h:264
static const char * STEP_COUNT
Step count property.
Definition ExplicitModule.h:107
double saftey_
Safety factor for step size control.
Definition ExplicitModule.h:248
virtual Status init(const Properties &conf, const Properties &props, const Properties &globdat) override
Initialize the module.
Definition ExplicitModule.cpp:60
Ref< Constraints > cons_
Constraint manager.
Definition ExplicitModule.h:272
idx_t order_
Integration order.
Definition ExplicitModule.h:256
MassMode
Mass matrix formulation modes.
Definition ExplicitModule.h:97
@ LUMPED
Lumped mass matrix.
Definition ExplicitModule.h:98
@ CONSISTENT
Consistent mass matrix.
Definition ExplicitModule.h:99
Ref< Model > model_
Root of the model tree.
Definition ExplicitModule.h:270
IdxMatrix rdofs_
Rotational DOF mapping.
Definition ExplicitModule.h:265
virtual void configure(const Properties &props, const Properties &globdat) override
Configure the module from properties.
Definition ExplicitModule.cpp:218
virtual void getConfig(const Properties &props, const Properties &globdat) const override
Get current module configuration.
Definition ExplicitModule.cpp:242
virtual void shutdown(const Properties &globdat) override
Shutdown the module.
Definition ExplicitModule.cpp:202
virtual void advance(const Properties &globdat) override
Advance to next time step.
Definition ExplicitModule.cpp:259
double minDtime_
Minimum time step size.
Definition ExplicitModule.h:246
virtual double getPrecision() const override
Get current convergence precision.
Definition ExplicitModule.cpp:484
virtual void cancel(const Properties &globdat) override
Cancel current solution attempt.
Definition ExplicitModule.cpp:277
double prec_
Precision tolerance.
Definition ExplicitModule.h:245
void ABupdate(const Vector &delta_y, const Vector &f_cur, const Vector &f_old) const
Adams-Bashforth 2-step update.
Definition ExplicitModule.h:281
Vector massInv_
Inverse mass matrix.
Definition ExplicitModule.h:263
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:362
double incrFact_
Step size increase factor.
Definition ExplicitModule.h:249
static const char * TYPE_NAME
Module type name.
Definition ExplicitModule.h:106
double getQuality(const Vector &y_pre, const Vector &y_cor)
Get solution quality measure.
Definition ExplicitModule.cpp:494
Ref< DofSpace > dofs_
Degree of freedom space.
Definition ExplicitModule.h:271
double decrFact_
Step size decrease factor.
Definition ExplicitModule.h:250
virtual bool commit(const Properties &globdat) override
Compute next step size and commit solution.
Definition ExplicitModule.cpp:291
MassMode mode_
Mass matrix mode.
Definition ExplicitModule.h:255
virtual void setPrecision(double eps) override
Set convergence precision.
Definition ExplicitModule.cpp:474
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:339
Ref< Solver > solver_
Linear solver.
Definition ExplicitModule.h:273
file containing some basic helper functions
void expVec(const Matrix &Exp, const Vector &psi)
compute the exponential of a axial vector.
Definition helpers.cpp:139
void logMat(const Vector &rv, const Matrix &R)
compute rotational vector from rotation matrix.
Definition helpers.cpp:99