Go to the documentation of this file.
47 using namespace Eigen;
51 template <
int nDim,
int nNodes >
70 using RhsSized = Matrix< double, sizeLoadVector, 1 >;
72 using CSized = Matrix< double, ParentGeometryElement::voigtSize, ParentGeometryElement::voigtSize >;
73 using Voigt = Matrix< double, ParentGeometryElement::voigtSize, 1 >;
90 inline const static auto layout = makeLayout( {
91 { .name =
"stress", .length = 6 },
92 { .name =
"strain", .length = 6 },
93 { .name =
"begin of material state", .length = 0 },
105 stress( &find(
"stress" ) ),
106 strain( &find(
"strain" ) ),
107 materialStateVars( &find(
"begin of material state" ),
108 nStateVars - getNumberOfRequiredStateVarsQuadraturePointOnly() ){};
113 std::unique_ptr< MarmotMaterialHypoElastic >
material;
117 return QPStateVarManager::getNumberOfRequiredStateVarsQuadraturePointOnly();
122 return getNumberOfRequiredStateVarsQuadraturePointOnly() + material->getNumberOfRequiredStateVars();
127 managedStateVars = std::make_unique< QPStateVarManager >( stateVars, nStateVars );
128 material->assignStateVars( managedStateVars->materialStateVars.data(),
129 managedStateVars->materialStateVars.size() );
133 : xi( xi ), weight( weight ), detJ( 0.0 ), J0xW( 0.0 ),
B(
BSized::Zero() ){};
136 std::vector< QuadraturePoint >
qps;
142 int getNumberOfRequiredStateVars();
144 std::vector< std::vector< std::string > > getNodeFields();
146 std::vector< int > getDofIndicesPermutationPattern();
156 void assignStateVars(
double* stateVars,
int nStateVars );
162 void assignNodeCoordinates(
const double* coordinates );
164 void initializeYourself();
166 void setInitialConditions( StateTypes state,
const double* values );
171 const int elementFace,
173 const double* QTotal,
177 void computeBodyForce(
double*
P,
180 const double* QTotal,
184 void computeYourself(
const double* QTotal,
192 void computeConsistentInertia(
double* M );
194 void computeLumpedInertia(
double* M );
198 const auto& qp = qps[qpNumber];
200 if ( qp.managedStateVars->contains( stateName ) ) {
201 return qp.managedStateVars->getStateView( stateName );
204 if ( stateName ==
"sdv" ) {
205 std::cout << __PRETTY_FUNCTION__ <<
" on 'sdv' is discouraged and deprecated, please use precise state name";
206 return { qp.managedStateVars->materialStateVars.data(),
207 static_cast< int >( qp.managedStateVars->materialStateVars.size() ) };
211 return qp.material->getStateView( stateName );
215 std::vector< double > getCoordinatesAtCenter();
217 std::vector< std::vector< double > > getCoordinatesAtQuadraturePoints();
219 int getNumberOfQuadraturePoints();
222 template <
int nDim,
int nNodes >
228 elementProperties( Map< const VectorXd >( nullptr, 0 ) ),
229 elLabel( elementID ),
230 sectionType( sectionType )
234 qps.push_back( std::move( qp ) );
238 template <
int nDim,
int nNodes >
241 return qps[0].getNumberOfRequiredStateVars() * qps.size();
244 template <
int nDim,
int nNodes >
249 static vector< vector< string > > nodeFields;
250 if ( nodeFields.empty() )
251 for (
int i = 0; i <
nNodes; i++ ) {
252 nodeFields.push_back( vector< string >() );
253 nodeFields[i].push_back(
"displacement" );
259 template <
int nDim,
int nNodes >
262 static std::vector< int > permutationPattern;
263 if ( permutationPattern.empty() )
265 permutationPattern.push_back( i );
267 return permutationPattern;
270 template <
int nDim,
int nNodes >
273 const int nQpStateVars = nStateVars / qps.size();
275 for (
size_t i = 0; i < qps.size(); i++ ) {
277 double* qpStateVars = stateVars + ( i * nQpStateVars );
278 qp.assignStateVars( qpStateVars, nQpStateVars );
282 template <
int nDim,
int nNodes >
285 new ( &elementProperties ) Eigen::Map< const Eigen::VectorXd >( elementPropertiesInfo.
elementProperties,
289 template <
int nDim,
int nNodes >
292 for (
auto& qp : qps ) {
301 << __PRETTY_FUNCTION__
302 <<
": invalid material assigned; cannot cast to MarmotMaterialHypoElastic!" );
304 if constexpr (
nDim == 3 )
305 qp.material->setCharacteristicElementLength( std::cbrt( 8 * qp.detJ ) );
306 if constexpr (
nDim == 2 )
307 qp.material->setCharacteristicElementLength( std::sqrt( 4 * qp.detJ ) );
308 if constexpr (
nDim == 1 )
309 qp.material->setCharacteristicElementLength( 2 * qp.detJ );
313 template <
int nDim,
int nNodes >
316 ParentGeometryElement::assignNodeCoordinates( coordinates );
319 template <
int nDim,
int nNodes >
327 qp.detJ = J.determinant();
328 qp.B = this->
B( dNdX );
330 if constexpr (
nDim == 3 ) {
331 qp.J0xW = qp.weight * qp.detJ;
333 if constexpr (
nDim == 2 ) {
334 const double& thickness = elementProperties[0];
335 qp.J0xW = qp.weight * qp.detJ * thickness;
337 if constexpr (
nDim == 1 ) {
338 const double& crossSection = elementProperties[0];
339 qp.J0xW = qp.weight * qp.detJ * crossSection;
344 template <
int nDim,
int nNodes >
354 using namespace ContinuumMechanics::VoigtNotation;
356 Map< const RhsSized > QTotal( QTotal_ );
357 Map< const RhsSized > dQ( dQ_ );
358 Map< KeSizedMatrix > Ke( Ke_ );
359 Map< RhsSized > Pe( Pe_ );
369 if constexpr (
nDim == 1 ) {
371 S = reduce3DVoigt< ParentGeometryElement::voigtSize >( qp.managedStateVars->stress );
372 qp.material->computeUniaxialStress( S.data(), C.data(), dE.data(), time, dT, pNewDT );
373 qp.managedStateVars->stress = make3DVoigt< ParentGeometryElement::voigtSize >( S );
376 else if constexpr (
nDim == 2 ) {
378 if ( sectionType == SectionType::PlaneStress ) {
380 S = reduce3DVoigt< ParentGeometryElement::voigtSize >( qp.managedStateVars->stress );
381 qp.material->computePlaneStress( S.data(), C.data(), dE.data(), time, dT, pNewDT );
382 qp.managedStateVars->stress = make3DVoigt< ParentGeometryElement::voigtSize >( S );
385 else if ( sectionType == SectionType::PlaneStrain ) {
390 Vector6d S6 = qp.managedStateVars->stress;
391 qp.material->computeStress( S6.data(), C66.data(), dE6.data(), time, dT, pNewDT );
392 qp.managedStateVars->stress = S6;
394 S = reduce3DVoigt< ParentGeometryElement::voigtSize >( S6 );
399 else if constexpr (
nDim == 3 ) {
400 if ( sectionType == SectionType::Solid ) {
402 S = qp.managedStateVars->stress;
403 qp.material->computeStress( S.data(), C.data(), dE.data(), time, dT, pNewDT );
404 qp.managedStateVars->stress = S;
408 qp.managedStateVars->strain += make3DVoigt< ParentGeometryElement::voigtSize >( dE );
413 Ke +=
B.transpose() * C *
B * qp.J0xW;
414 Pe -=
B.transpose() * S * qp.J0xW;
418 template <
int nDim,
int nNodes >
424 qp.material->initializeYourself();
431 XiSized coordAtGauss = this->
NB( this->
N( qp.xi ) ) * this->coordinates;
433 const double sigY1 = values[0];
434 const double sigY2 = values[2];
435 const double y1 = values[1];
436 const double y2 = values[3];
438 using namespace Math;
439 qp.managedStateVars->stress( 1 ) =
linearInterpolation( coordAtGauss[1], y1, y2, sigY1, sigY2 );
440 qp.managedStateVars->stress( 0 ) = values[4] * qp.managedStateVars->stress( 1 );
441 qp.managedStateVars->stress( 2 ) = values[5] * qp.managedStateVars->stress( 1 );
446 throw std::invalid_argument(
"Please use initializeStateVars directly on material" );
448 default:
throw std::invalid_argument(
MakeString() << __PRETTY_FUNCTION__ <<
": invalid initial condition" );
452 template <
int nDim,
int nNodes >
456 const int elementFace,
458 const double* QTotal,
462 Map< RhsSized > fU(
P );
464 switch ( loadType ) {
467 const double p = load[0];
474 Pk *= elementProperties[0];
484 const XiSized tractionVector( load );
488 Pk *= elementProperties[0];
494 throw std::invalid_argument(
"Invalid Load Type specified" );
499 template <
int nDim,
int nNodes >
503 const double* QTotal,
507 Map< RhsSized > Pe( P_ );
508 const Map< const Matrix< double, nDim, 1 > > f( load );
510 for (
const auto& qp : qps )
511 Pe += this->
NB( this->
N( qp.xi ) ).transpose() * f * qp.J0xW;
514 template <
int nDim,
int nNodes >
517 Map< KeSizedMatrix > Me( M );
520 for (
const auto& qp : qps ) {
521 const auto N_ = this->
NB( this->
N( qp.xi ) );
522 const double rho = qp.material->getDensity();
523 Me += N_.transpose() * N_ * qp.detJ * qp.weight * rho;
526 template <
int nDim,
int nNodes >
529 Map< RhsSized > Me( M );
534 computeConsistentInertia( CMM.data() );
536 Me = CMM.rowwise().sum();
539 template <
int nDim,
int nNodes >
542 std::vector< double > coords(
nDim );
544 Eigen::Map< XiSized > coordsMap( &coords[0] );
545 const auto centerXi = XiSized::Zero();
546 coordsMap = this->
NB( this->
N( centerXi ) ) * this->coordinates;
550 template <
int nDim,
int nNodes >
553 std::vector< std::vector< double > > listedCoords;
555 std::vector< double > coords(
nDim );
556 Eigen::Map< XiSized > coordsMap( &coords[0] );
558 for (
const auto& qp : qps ) {
559 coordsMap = this->
NB( this->
N( qp.xi ) ) * this->coordinates;
560 listedCoords.push_back( coords );
566 template <
int nDim,
int nNodes >
typename ParentGeometryElement::XiSized XiSized
Definition: DisplacementFiniteElement.h:69
const SectionType sectionType
Definition: DisplacementFiniteElement.h:77
Map< const VectorXd > elementProperties
Definition: DisplacementFiniteElement.h:75
@ GeostaticStress
Definition: MarmotElement.h:44
BSized B
Definition: DisplacementFiniteElement.h:86
void assignProperty(const ElementProperties &marmotElementProperty)
Definition: DisplacementFiniteElement.h:283
Definition: MarmotElementProperty.h:42
@ MarmotMaterialStateVars
Definition: MarmotElement.h:45
@ UniaxialStress
Definition: DisplacementFiniteElement.h:56
Eigen::Matrix< double, 1, nNodes > dNdXiSized
Definition: MarmotFiniteElement.h:94
void initializeYourself()
Definition: DisplacementFiniteElement.h:320
std::vector< double > getCoordinatesAtCenter()
Definition: DisplacementFiniteElement.h:540
@ MarmotMaterialInitialization
Definition: MarmotElement.h:46
Definition: MarmotElement.h:36
Definition: MarmotGeometryElement.h:36
int getNDofPerElement()
Definition: DisplacementFiniteElement.h:152
Eigen::Matrix< double, 6, 6 > Matrix6d
Definition: MarmotTypedefs.h:35
Matrix< double, sizeLoadVector, sizeLoadVector > KeSizedMatrix
Definition: DisplacementFiniteElement.h:71
void setInitialConditions(StateTypes state, const double *values)
Definition: DisplacementFiniteElement.h:419
void assembleIntoParentVectorial(const Eigen::VectorXd &boundaryVector, Eigen::Ref< Eigen::VectorXd > ParentVector)
Definition: MarmotFiniteElementBoundary.cpp:274
Definition: MarmotFiniteElement.h:297
Definition: DisplacementFiniteElement.h:52
std::unique_ptr< MarmotMaterialHypoElastic > material
Definition: DisplacementFiniteElement.h:113
int getNumberOfQuadraturePoints()
Definition: DisplacementFiniteElement.h:567
constexpr int nDim
Definition: MarmotFiniteElement.h:112
void assignStateVars(double *stateVars, int nStateVars)
Definition: DisplacementFiniteElement.h:271
@ PlaneStrain
Definition: DisplacementFiniteElement.h:58
void assignStateVars(double *stateVars, int nStateVars)
Definition: DisplacementFiniteElement.h:125
Eigen::Matrix< double, voigtSize, nNodes *nDim > BSized
Definition: MarmotGeometryElement.h:59
int nMaterialProperties
Definition: MarmotElementProperty.h:34
A convenience auxiliary class for managing multiple statevars with arbitrary length in a single conse...
Definition: MarmotStateVarVectorManager.h:37
int getNumberOfRequiredStateVarsQuadraturePointOnly()
Definition: DisplacementFiniteElement.h:115
DistributedLoadTypes
Definition: MarmotElement.h:49
Eigen::Map< Vector6d > mVector6d
Definition: MarmotTypedefs.h:49
Eigen::Matrix< double, nDim, 1 > XiSized
Definition: MarmotGeometryElement.h:53
@ SurfaceTraction
Definition: MarmotElement.h:52
Eigen::VectorXd computeVectorialLoadVector(const Eigen::VectorXd &direction)
compute the element load vector for a unit vectorial load in a given direction.
Definition: MarmotFiniteElementBoundary.cpp:206
double linearInterpolation(double x, double x0, double x1, double y0, double y1)
Definition: MarmotMath.cpp:7
static MarmotMaterial * createMaterial(int materialCode, const double *materialProperties, int nMaterialProperties, int materialNumber)
const double * elementProperties
Definition: MarmotElementProperty.h:44
Definition: MarmotUtils.h:29
SectionType
Definition: DisplacementFiniteElement.h:55
void computeDistributedLoad(MarmotElement::DistributedLoadTypes loadType, double *P, double *K, const int elementFace, const double *load, const double *QTotal, const double *time, double dT)
Definition: DisplacementFiniteElement.h:453
@ Solid
Definition: DisplacementFiniteElement.h:59
Eigen::Matrix3d getPlaneStrainTangent(const Matrix6d &C)
Definition: MarmotLowerDimensionalStress.cpp:37
int getNumberOfRequiredStateVars()
Definition: DisplacementFiniteElement.h:239
Definition: DisplacementFiniteElement.h:49
This file includes functions needed for calculations with stress and strain tensors written in voigt ...
Definition: MarmotTesting.h:32
const int elLabel
Definition: DisplacementFiniteElement.h:76
Eigen::VectorXd computeSurfaceNormalVectorialLoadVector()
compute the element load vector for a unit vectorial load normal to the surface.
Definition: MarmotFiniteElementBoundary.cpp:147
@ PlaneStress
Definition: DisplacementFiniteElement.h:57
Eigen::Matrix< double, voigtSize, nNodes *nDim > B(const Eigen::Matrix< double, nDim, nNodes > &dNdX)
Definition: MarmotFiniteElement.h:116
double detJ
Definition: DisplacementFiniteElement.h:84
std::vector< QuadraturePoint > qps
Definition: DisplacementFiniteElement.h:136
Eigen::Matrix< double, nDim, nNodes > dNdXiSized
Definition: MarmotGeometryElement.h:58
void computeLumpedInertia(double *M)
Definition: DisplacementFiniteElement.h:527
StateTypes
Definition: MarmotElement.h:39
const Marmot::Vector6d P
Definition: MarmotVoigt.cpp:16
mVector6d stress
Definition: DisplacementFiniteElement.h:97
double J0xW
Definition: DisplacementFiniteElement.h:85
Matrix< double, ParentGeometryElement::voigtSize, 1 > Voigt
Definition: DisplacementFiniteElement.h:73
std::vector< std::vector< std::string > > getNodeFields()
Definition: DisplacementFiniteElement.h:245
Eigen::MatrixXd NB(const Eigen::VectorXd &N, const int nDoFPerNode)
const double * materialProperties
Definition: MarmotElementProperty.h:33
Definition: DisplacementFiniteElement.h:79
Eigen::Map< Eigen::VectorXd > materialStateVars
Definition: DisplacementFiniteElement.h:99
const XiSized xi
Definition: DisplacementFiniteElement.h:81
constexpr int nNodes
Definition: MarmotFiniteElement.h:92
Eigen::Matrix< double, 6, 1 > Vector6d
Definition: MarmotTypedefs.h:43
const std::vector< QuadraturePointInfo > & getGaussPointInfo(Marmot::FiniteElement::ElementShapes shape, IntegrationTypes integrationType)
Definition: MarmotFiniteElementBasic.cpp:100
const Marmot::FiniteElement::ElementShapes shape
Definition: MarmotGeometryElement.h:63
int nElementProperties
Definition: MarmotElementProperty.h:45
dNdXiSized dNdXi(double xi)
Definition: MarmotFiniteElement1D.cpp:22
int getNumberOfRequiredStateVars()
Definition: DisplacementFiniteElement.h:120
std::vector< std::vector< double > > getCoordinatesAtQuadraturePoints()
Definition: DisplacementFiniteElement.h:551
Marmot::Vector6d planeVoigtToVoigt(const Eigen::Vector3d &voigtPlane)
IntegrationTypes
Definition: MarmotFiniteElement.h:358
int getNSpatialDimensions()
Definition: DisplacementFiniteElement.h:150
QPStateVarManager(double *theStateVarVector, int nStateVars)
Definition: DisplacementFiniteElement.h:103
std::unique_ptr< QPStateVarManager > managedStateVars
Definition: DisplacementFiniteElement.h:111
const double weight
Definition: DisplacementFiniteElement.h:82
int getNNodes()
Definition: DisplacementFiniteElement.h:148
int materialCode
Definition: MarmotElementProperty.h:32
static int getNumberOfRequiredStateVarsQuadraturePointOnly()
Definition: DisplacementFiniteElement.h:101
Definition: MarmotElementProperty.h:30
QuadraturePoint(XiSized xi, double weight)
Definition: DisplacementFiniteElement.h:132
@ Pressure
Definition: MarmotElement.h:50
Eigen::MatrixXd Jacobian(const Eigen::MatrixXd &dN_dXi, const Eigen::VectorXd &coordinates)
void computeBodyForce(double *P, double *K, const double *load, const double *QTotal, const double *time, double dT)
Definition: DisplacementFiniteElement.h:500
NSized N(double xi)
Definition: MarmotFiniteElement1D.cpp:15
Definition: DisplacementFiniteElement.h:88
Eigen::Matrix< double, nDim, nDim > JacobianSized
Definition: MarmotGeometryElement.h:55
void computeConsistentInertia(double *M)
Definition: DisplacementFiniteElement.h:515
void computeYourself(const double *QTotal, const double *dQ, double *Pe, double *Ke, const double *time, double dT, double &pNewdT)
Definition: DisplacementFiniteElement.h:345
mVector6d strain
Definition: DisplacementFiniteElement.h:98
std::vector< int > getDofIndicesPermutationPattern()
Definition: DisplacementFiniteElement.h:260
Matrix< double, sizeLoadVector, 1 > RhsSized
Definition: DisplacementFiniteElement.h:70
Matrix< double, ParentGeometryElement::voigtSize, ParentGeometryElement::voigtSize > CSized
Definition: DisplacementFiniteElement.h:72
std::string getElementShape()
Definition: DisplacementFiniteElement.h:154
StateView getStateView(const std::string &stateName, int qpNumber)
Definition: DisplacementFiniteElement.h:196
Definition: MarmotMaterialHypoElastic.h:54
void assignNodeCoordinates(const double *coordinates)
Definition: DisplacementFiniteElement.h:314
Definition: MarmotJournal.h:32