dynLattice
Loading...
Searching...
No Matches
SpecialCosseratRodModel.h
Go to the documentation of this file.
1
12#pragma once
13
14#include <jem/base/Object.h>
15
16#include <materials/Material.h>
18
19#include <jem/base/Array.h>
20#include <jem/base/IllegalInputException.h>
21#include <jem/base/System.h>
22#include <jem/base/Float.h>
23#include <jem/numeric/Quaternion.h>
24#include <jem/numeric/algebra.h>
25#include <jem/numeric/algebra/matmul.h>
26#include <jem/util/Event.h>
27#include <jem/util/Properties.h>
28#include <jem/util/StringUtils.h>
29
30#include <jive/Array.h>
31#include <jive/algebra/AbstractMatrix.h>
32#include <jive/algebra/FlexMatrixBuilder.h>
33#include <jive/algebra/MatrixBuilder.h>
34#include <jive/app/Names.h>
35#include <jive/fem/ElementGroup.h>
36#include <jive/fem/ElementSet.h>
37#include <jive/fem/NodeGroup.h>
38#include <jive/fem/NodeSet.h>
39#include <jive/geom/ShapeFactory.h>
40#include <jive/geom/StdShape.h>
41#include <jive/implict/SolverInfo.h>
42#include <jive/model/Actions.h>
43#include <jive/model/Model.h>
44#include <jive/model/ModelFactory.h>
45#include <jive/model/StateVector.h>
46#include <jive/util/Assignable.h>
47#include <jive/util/Globdat.h>
48#include <jive/util/Printer.h>
49#include <jive/util/XDofSpace.h>
50#include <jive/util/XTable.h>
51#include <jive/util/utilities.h>
52
53#include <math.h>
54
55#include "misc/Line3D.h"
56#include "utils/helpers.h"
57#include "utils/testing.h"
58
59using jem::Slice;
60using jem::SliceFrom;
61using jem::numeric::matmul;
62using jem::numeric::MatmulChain;
63using jem::numeric::norm2;
64using jem::numeric::Quaternion;
65using jem::util::Properties;
66
67using jive::BoolVector;
68using jive::IdxMatrix;
69using jive::algebra::AbstractMatrix;
70using jive::algebra::FlexMBuilder;
71using jive::algebra::MatrixBuilder;
72using jive::fem::ElementGroup;
73using jive::fem::ElementSet;
74using jive::fem::newNodeGroup;
75using jive::fem::NodeGroup;
76using jive::fem::NodeSet;
77using jive::geom::IShape;
78using jive::geom::ShapeFactory;
79using jive::model::Model;
80using jive::util::Assignable;
81using jive::util::DofSpace;
82using jive::util::Globdat;
83using jive::util::joinNames;
84using jive::util::XDofSpace;
85using jive::util::XTable;
86
93
94//-----------------------------------------------------------------------
95// class SpecialCosseratRodModel
96//-----------------------------------------------------------------------
97
121class SpecialCosseratRodModel : public Model
122{
123 public:
126 static const char *TYPE_NAME;
127 static const char *TRANS_DOF_DEFAULT;
128 static const char *ROT_DOF_DEFAULT;
129 static const char *TRANS_DOF_NAMES;
130 static const char *ROT_DOF_NAMES;
131 static const char *SYMMETRIC_ONLY;
132 static const char *MATERIAL_Y_DIR;
133 static const char *GIVEN_NODES;
134 static const char *GIVEN_DIRS;
135 static const char *LUMPED_MASS;
136 static const char *HINGES;
138
141 static const idx_t TRANS_DOF_COUNT;
142 static const idx_t ROT_DOF_COUNT;
143 static const Slice TRANS_PART;
144 static const Slice ROT_PART;
146
147 JEM_DECLARE_CLASS(SpecialCosseratRodModel, Model);
148
154 explicit SpecialCosseratRodModel(const String &name,
155 const Properties &conf,
156 const Properties &props,
157 const Properties &globdat);
158
164 virtual bool takeAction(const String &action,
165 const Properties &params,
166 const Properties &globdat) override;
167
174 static Ref<Model> makeNew(const String &name,
175 const Properties &conf,
176 const Properties &props,
177 const Properties &globdat);
178
180 static void declare();
181
182 private:
188 void assemble_(MatrixBuilder &mbld,
189 const Vector &fint,
190 const Vector &disp,
191 const String &loadCase = "") const;
192
197 void assemble_(const Vector &fint,
198 const Vector &disp,
199 const String &loadCase = "") const;
200
205 void assembleGyro_(const Vector &fint,
206 const Vector &velo,
207 const Ref<AbstractMatrix> mass) const;
208
212 void assembleM_(MatrixBuilder &mbld,
213 Vector &disp) const;
214
222 void getStrainTable_(XTable &strain_table,
223 const Vector &weights,
224 const Vector &disp,
225 const bool mat_vals = false);
226
231 void getMaterialTable_(XTable &mat_table,
232 const Vector &weights,
233 const String &name);
234
242 void getStressTable_(XTable &stress_table,
243 const Vector &weights,
244 const Vector &disp,
245 const bool mat_vals = false);
246
248 void initRotation_();
249
254 void initShape_();
255
257 void initStrain_();
258
266 void getTangents_(const Matrix &phiP,
267 const Matrix &nodePhi_0,
268 const Matrix &nodeU,
269 const idx_t ie) const;
270
276 void getGeomtericStiffness_(const Cubix &B,
277 const Matrix &stresses,
278 const Matrix &nodePhi_0,
279 const Matrix &nodeU) const;
280
289 void getStrains_(const Matrix &strains,
290 const Vector &w,
291 const Matrix &nodePhi_0,
292 const Matrix &nodeU,
293 const Cubix &nodeLambda,
294 const idx_t ie,
295 const bool spatial = true) const;
296
306 void getStresses_(const Matrix &stresses,
307 const Vector &w,
308 const Matrix &nodePhi_0,
309 const Matrix &nodeU,
310 const Cubix &nodeLambda,
311 const idx_t ie,
312 const bool spatial = true,
313 const String &loadCase = "") const;
314
316 void updNodeDofs_() const;
317
319 void invalidateNodeDofs_();
320
327 void getDisplacments_(const Matrix &nodePhi_0,
328 const Matrix &nodeU,
329 const Cubix &nodeLambda,
330 const Vector &disp,
331 const IdxVector &inodes) const;
332
337 void getEnergies_(double &E_pot,
338 double &E_diss,
339 const Vector &disp) const;
340
345 void getPotentialEnergy_(XTable &energy_table,
346 const Vector &table_weights,
347 const Vector &disp) const;
348
353 void getDissipatedEnergy_(XTable &energy_table,
354 const Vector &table_weights,
355 const Vector &disp) const;
356
357 private:
358 Assignable<ElementGroup> rodElems_;
359 IdxVector rodNodes_;
360 IdxVector rodNodeIdx_;
361 Assignable<ElementSet> allElems_;
362 Assignable<NodeSet> allNodes_;
363
364 Ref<DofSpace> dofs_;
365 Ref<Line3D> shapeK_;
366 Ref<Line3D> shapeM_;
367 Ref<Material> material_;
368 Ref<Model> hinges_;
369
370 IdxVector transTypes_;
371 IdxVector rotTypes_;
372 IdxVector jtypes_;
373
374 mutable IdxMatrix nodeDofs_;
375 mutable bool nodeDofsValid_;
376
377#ifndef NDEBUG
378 mutable bool energiesStored_ = false;
379#endif
380
381 bool symOnly_;
382 Vector thickFact_;
383 Vector materialYDir_;
384
385 IdxVector givenNodes_;
386 Matrix givenDirs_;
387
388 Cubix LambdaN_;
389 Cubix matStrain0_;
390
391 // The reference geometry does not change during a run (as for matStrain0_)
392 Cubix elemGrads_;
393 Matrix elemWeights_;
394
395 // Work arrays of getStrains_, getStresses_ and the assembly: created once in
396 // initShape_ and overwritten in every call (see the note in utils/helpers.h).
397 // Not thread safe. ipPhiP_ is filled by getTangents_ and consumed at once.
398 mutable Matrix curPhi_;
399 mutable Matrix ipPhiP_;
400 mutable Cubix ipLambda_;
401 mutable Cubix ipLambdaP_;
402 mutable Matrix lambdaTP_;
403 mutable Matrix strainWork_;
404 mutable MatmulChain<double, 2> matmul_;
405};
Shape function for 1D line elements in 3D space.
Factory to register all the materials with.
Material class for representing different materials in the simulation.
Special Cosserat rod finite element model with geometrically exact kinematics.
Definition SpecialCosseratRodModel.h:122
virtual bool takeAction(const String &action, const Properties &params, const Properties &globdat) override
Handle model actions.
Definition SpecialCosseratRodModel.cpp:205
static const char * GIVEN_NODES
Given direction nodes property.
Definition SpecialCosseratRodModel.h:133
static const idx_t ROT_DOF_COUNT
Number of rotational DOFs.
Definition SpecialCosseratRodModel.h:142
static Ref< Model > makeNew(const String &name, const Properties &conf, const Properties &props, const Properties &globdat)
Create new SpecialCosseratRodModel instance.
Definition SpecialCosseratRodModel.cpp:1323
static const idx_t TRANS_DOF_COUNT
Number of translational DOFs.
Definition SpecialCosseratRodModel.h:141
static const char * SYMMETRIC_ONLY
Symmetric tangent stiffness property.
Definition SpecialCosseratRodModel.h:131
static void declare()
Declare model type to factory.
Definition SpecialCosseratRodModel.cpp:1336
static const char * GIVEN_DIRS
Given directions property.
Definition SpecialCosseratRodModel.h:134
static const char * MATERIAL_Y_DIR
Material y-direction property.
Definition SpecialCosseratRodModel.h:132
static const Slice ROT_PART
Rotational DOF slice.
Definition SpecialCosseratRodModel.h:144
static const Slice TRANS_PART
Translational DOF slice.
Definition SpecialCosseratRodModel.h:143
static const char * TRANS_DOF_NAMES
Translational DOF names property.
Definition SpecialCosseratRodModel.h:129
static const char * TRANS_DOF_DEFAULT
Default translational DOF prefix.
Definition SpecialCosseratRodModel.h:127
static const char * TYPE_NAME
Model type name.
Definition SpecialCosseratRodModel.h:126
static const char * ROT_DOF_NAMES
Rotational DOF names property.
Definition SpecialCosseratRodModel.h:130
static const char * ROT_DOF_DEFAULT
Default rotational DOF prefix.
Definition SpecialCosseratRodModel.h:128
static const char * LUMPED_MASS
Lumped mass property.
Definition SpecialCosseratRodModel.h:135
static const char * HINGES
Hinges property.
Definition SpecialCosseratRodModel.h:136
file containing some basic helper functions
Vector unskew(const Matrix &mat)
construct a axial vector from a given skew-symmetric matrix
Definition helpers.cpp:332
void expVec(const Matrix &Exp, const Vector &psi)
compute the exponential of a axial vector.
Definition helpers.cpp:185
void vec2mat(const Matrix &mat, const Vector &vec)
rearrange a vector into a matrix.
Definition helpers.cpp:136
Matrix eye(const idx_t dim)
generates an identity matrix of the given dimension.
Definition helpers.cpp:106
const Vector e3
Definition helpers.h:52
Matrix skew(const Vector &vec)
construct a skew symetric matrix from a given vector.
Definition helpers.cpp:312
several compiler macros for faster testing of variables