DisplacementFiniteElement.h
Go to the documentation of this file.
1 /* ---------------------------------------------------------------------
2  * _
3  * _ __ ___ __ _ _ __ _ __ ___ ___ | |_
4  * | '_ ` _ \ / _` | '__| '_ ` _ \ / _ \| __|
5  * | | | | | | (_| | | | | | | | | (_) | |_
6  * |_| |_| |_|\__,_|_| |_| |_| |_|\___/ \__|
7  *
8  * Unit of Strength of Materials and Structural Analysis
9  * University of Innsbruck,
10  * 2020 - today
11  *
12  * festigkeitslehre@uibk.ac.at
13  *
14  * Matthias Neuner matthias.neuner@uibk.ac.at
15  * Magdalena Schreter magdalena.schreter@uibk.ac.at
16  *
17  * This file is part of the MAteRialMOdellingToolbox (marmot).
18  *
19  * This library is free software; you can redistribute it and/or
20  * modify it under the terms of the GNU Lesser General Public
21  * License as published by the Free Software Foundation; either
22  * version 2.1 of the License, or (at your option) any later version.
23  *
24  * The full text of the license can be found in the file LICENSE.md at
25  * the top level directory of marmot.
26  * ---------------------------------------------------------------------
27  */
28 #pragma once
29 #include "Marmot/Marmot.h"
30 #include "Marmot/MarmotConstants.h"
31 #include "Marmot/MarmotElement.h"
35 #include "Marmot/MarmotJournal.h"
38 #include "Marmot/MarmotMath.h"
40 #include "Marmot/MarmotTypedefs.h"
41 #include "Marmot/MarmotVoigt.h"
42 #include <iostream>
43 #include <memory>
44 #include <vector>
45 
46 using namespace Marmot;
47 using namespace Eigen;
48 
49 namespace Marmot::Elements {
50 
51  template < int nDim, int nNodes >
52  class DisplacementFiniteElement : public MarmotElement, public MarmotGeometryElement< nDim, nNodes > {
53 
54  public:
55  enum SectionType {
60  };
61 
62  static constexpr int sizeLoadVector = nNodes * nDim;
63  static constexpr int nCoordinates = nNodes * nDim;
64 
70  using RhsSized = Matrix< double, sizeLoadVector, 1 >;
71  using KeSizedMatrix = Matrix< double, sizeLoadVector, sizeLoadVector >;
72  using CSized = Matrix< double, ParentGeometryElement::voigtSize, ParentGeometryElement::voigtSize >;
73  using Voigt = Matrix< double, ParentGeometryElement::voigtSize, 1 >;
74 
75  Map< const VectorXd > elementProperties;
76  const int elLabel;
78 
79  struct QuadraturePoint {
80 
81  const XiSized xi;
82  const double weight;
83 
84  double detJ;
85  double J0xW;
87 
89 
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 },
94  } );
95 
96  public:
99  Eigen::Map< Eigen::VectorXd > materialStateVars;
100 
101  static int getNumberOfRequiredStateVarsQuadraturePointOnly() { return layout.nRequiredStateVars; };
102 
103  QPStateVarManager( double* theStateVarVector, int nStateVars )
104  : MarmotStateVarVectorManager( theStateVarVector, layout ),
105  stress( &find( "stress" ) ),
106  strain( &find( "strain" ) ),
107  materialStateVars( &find( "begin of material state" ),
108  nStateVars - getNumberOfRequiredStateVarsQuadraturePointOnly() ){};
109  };
110 
111  std::unique_ptr< QPStateVarManager > managedStateVars;
112 
113  std::unique_ptr< MarmotMaterialHypoElastic > material;
114 
116  {
117  return QPStateVarManager::getNumberOfRequiredStateVarsQuadraturePointOnly();
118  };
119 
121  {
122  return getNumberOfRequiredStateVarsQuadraturePointOnly() + material->getNumberOfRequiredStateVars();
123  };
124 
125  void assignStateVars( double* stateVars, int nStateVars )
126  {
127  managedStateVars = std::make_unique< QPStateVarManager >( stateVars, nStateVars );
128  material->assignStateVars( managedStateVars->materialStateVars.data(),
129  managedStateVars->materialStateVars.size() );
130  }
131 
132  QuadraturePoint( XiSized xi, double weight )
133  : xi( xi ), weight( weight ), detJ( 0.0 ), J0xW( 0.0 ), B( BSized::Zero() ){};
134  };
135 
136  std::vector< QuadraturePoint > qps;
137 
138  DisplacementFiniteElement( int elementID,
140  SectionType sectionType );
141 
142  int getNumberOfRequiredStateVars();
143 
144  std::vector< std::vector< std::string > > getNodeFields();
145 
146  std::vector< int > getDofIndicesPermutationPattern();
147 
148  int getNNodes() { return nNodes; }
149 
150  int getNSpatialDimensions() { return nDim; }
151 
152  int getNDofPerElement() { return sizeLoadVector; }
153 
154  std::string getElementShape() { return ParentGeometryElement::getElementShape(); }
155 
156  void assignStateVars( double* stateVars, int nStateVars );
157 
158  void assignProperty( const ElementProperties& marmotElementProperty );
159 
160  void assignProperty( const MarmotMaterialSection& marmotElementProperty );
161 
162  void assignNodeCoordinates( const double* coordinates );
163 
164  void initializeYourself();
165 
166  void setInitialConditions( StateTypes state, const double* values );
167 
168  void computeDistributedLoad( MarmotElement::DistributedLoadTypes loadType,
169  double* P,
170  double* K,
171  const int elementFace,
172  const double* load,
173  const double* QTotal,
174  const double* time,
175  double dT );
176 
177  void computeBodyForce( double* P,
178  double* K,
179  const double* load,
180  const double* QTotal,
181  const double* time,
182  double dT );
183 
184  void computeYourself( const double* QTotal,
185  const double* dQ,
186  double* Pe,
187  double* Ke,
188  const double* time,
189  double dT,
190  double& pNewdT );
191 
192  void computeConsistentInertia( double* M );
193 
194  void computeLumpedInertia( double* M );
195 
196  StateView getStateView( const std::string& stateName, int qpNumber )
197  {
198  const auto& qp = qps[qpNumber];
199 
200  if ( qp.managedStateVars->contains( stateName ) ) {
201  return qp.managedStateVars->getStateView( stateName );
202  }
203 
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() ) };
208  }
209 
210  else {
211  return qp.material->getStateView( stateName );
212  }
213  }
214 
215  std::vector< double > getCoordinatesAtCenter();
216 
217  std::vector< std::vector< double > > getCoordinatesAtQuadraturePoints();
218 
219  int getNumberOfQuadraturePoints();
220  };
221 
222  template < int nDim, int nNodes >
224  int elementID,
226  SectionType sectionType )
228  elementProperties( Map< const VectorXd >( nullptr, 0 ) ),
229  elLabel( elementID ),
230  sectionType( sectionType )
231  {
232  for ( const auto& qpInfo : FiniteElement::Quadrature::getGaussPointInfo( this->shape, integrationType ) ) {
233  QuadraturePoint qp( qpInfo.xi, qpInfo.weight );
234  qps.push_back( std::move( qp ) );
235  }
236  }
237 
238  template < int nDim, int nNodes >
240  {
241  return qps[0].getNumberOfRequiredStateVars() * qps.size();
242  }
243 
244  template < int nDim, int nNodes >
245  std::vector< std::vector< std::string > > DisplacementFiniteElement< nDim, nNodes >::getNodeFields()
246  {
247  using namespace std;
248 
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" );
254  }
255 
256  return nodeFields;
257  }
258 
259  template < int nDim, int nNodes >
261  {
262  static std::vector< int > permutationPattern;
263  if ( permutationPattern.empty() )
264  for ( int i = 0; i < nNodes * nDim; i++ )
265  permutationPattern.push_back( i );
266 
267  return permutationPattern;
268  }
269 
270  template < int nDim, int nNodes >
271  void DisplacementFiniteElement< nDim, nNodes >::assignStateVars( double* stateVars, int nStateVars )
272  {
273  const int nQpStateVars = nStateVars / qps.size();
274 
275  for ( size_t i = 0; i < qps.size(); i++ ) {
276  auto& qp = qps[i];
277  double* qpStateVars = stateVars + ( i * nQpStateVars );
278  qp.assignStateVars( qpStateVars, nQpStateVars );
279  }
280  }
281 
282  template < int nDim, int nNodes >
284  {
285  new ( &elementProperties ) Eigen::Map< const Eigen::VectorXd >( elementPropertiesInfo.elementProperties,
286  elementPropertiesInfo.nElementProperties );
287  }
288 
289  template < int nDim, int nNodes >
291  {
292  for ( auto& qp : qps ) {
293  qp.material = std::unique_ptr< MarmotMaterialHypoElastic >( dynamic_cast< MarmotMaterialHypoElastic* >(
295  section.materialProperties,
296  section.nMaterialProperties,
297  elLabel ) ) );
298 
299  if ( !qp.material )
300  throw std::invalid_argument( MakeString()
301  << __PRETTY_FUNCTION__
302  << ": invalid material assigned; cannot cast to MarmotMaterialHypoElastic!" );
303 
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 );
310  }
311  }
312 
313  template < int nDim, int nNodes >
315  {
316  ParentGeometryElement::assignNodeCoordinates( coordinates );
317  }
318 
319  template < int nDim, int nNodes >
321  {
322  for ( QuadraturePoint& qp : qps ) {
323  const dNdXiSized dNdXi = this->dNdXi( qp.xi );
324  const JacobianSized J = this->Jacobian( dNdXi );
325  const JacobianSized JInv = J.inverse();
326  const dNdXiSized dNdX = this->dNdX( dNdXi, JInv );
327  qp.detJ = J.determinant();
328  qp.B = this->B( dNdX );
329 
330  if constexpr ( nDim == 3 ) {
331  qp.J0xW = qp.weight * qp.detJ;
332  }
333  if constexpr ( nDim == 2 ) {
334  const double& thickness = elementProperties[0];
335  qp.J0xW = qp.weight * qp.detJ * thickness;
336  }
337  if constexpr ( nDim == 1 ) {
338  const double& crossSection = elementProperties[0];
339  qp.J0xW = qp.weight * qp.detJ * crossSection;
340  }
341  }
342  }
343 
344  template < int nDim, int nNodes >
346  const double* dQ_,
347  double* Pe_,
348  double* Ke_,
349  const double* time,
350  double dT,
351  double& pNewDT )
352  {
353  using namespace Marmot;
354  using namespace ContinuumMechanics::VoigtNotation;
355 
356  Map< const RhsSized > QTotal( QTotal_ );
357  Map< const RhsSized > dQ( dQ_ );
358  Map< KeSizedMatrix > Ke( Ke_ );
359  Map< RhsSized > Pe( Pe_ );
360 
361  Voigt S, dE;
362  CSized C;
363 
364  for ( QuadraturePoint& qp : qps ) {
365 
366  const BSized& B = qp.B;
367  dE = B * dQ;
368 
369  if constexpr ( nDim == 1 ) {
370 
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 );
374  }
375 
376  else if constexpr ( nDim == 2 ) {
377 
378  if ( sectionType == SectionType::PlaneStress ) {
379 
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 );
383  }
384 
385  else if ( sectionType == SectionType::PlaneStrain ) {
386 
387  Vector6d dE6 = planeVoigtToVoigt( dE );
388  Matrix6d C66;
389 
390  Vector6d S6 = qp.managedStateVars->stress;
391  qp.material->computeStress( S6.data(), C66.data(), dE6.data(), time, dT, pNewDT );
392  qp.managedStateVars->stress = S6;
393 
394  S = reduce3DVoigt< ParentGeometryElement::voigtSize >( S6 );
396  }
397  }
398 
399  else if constexpr ( nDim == 3 ) {
400  if ( sectionType == SectionType::Solid ) {
401 
402  S = qp.managedStateVars->stress;
403  qp.material->computeStress( S.data(), C.data(), dE.data(), time, dT, pNewDT );
404  qp.managedStateVars->stress = S;
405  }
406  }
407 
408  qp.managedStateVars->strain += make3DVoigt< ParentGeometryElement::voigtSize >( dE );
409 
410  if ( pNewDT < 1.0 )
411  return;
412 
413  Ke += B.transpose() * C * B * qp.J0xW;
414  Pe -= B.transpose() * S * qp.J0xW;
415  }
416  }
417 
418  template < int nDim, int nNodes >
420  {
421  switch ( state ) {
423  for ( QuadraturePoint& qp : qps ) {
424  qp.material->initializeYourself();
425  }
426  break;
427  }
429  if ( nDim >= 2 )
430  for ( QuadraturePoint& qp : qps ) {
431  XiSized coordAtGauss = this->NB( this->N( qp.xi ) ) * this->coordinates;
432 
433  const double sigY1 = values[0];
434  const double sigY2 = values[2];
435  const double y1 = values[1];
436  const double y2 = values[3];
437 
438  using namespace Math;
439  qp.managedStateVars->stress( 1 ) = linearInterpolation( coordAtGauss[1], y1, y2, sigY1, sigY2 ); // sigma_y
440  qp.managedStateVars->stress( 0 ) = values[4] * qp.managedStateVars->stress( 1 ); // sigma_x
441  qp.managedStateVars->stress( 2 ) = values[5] * qp.managedStateVars->stress( 1 );
442  }
443  break;
444  }
446  throw std::invalid_argument( "Please use initializeStateVars directly on material" );
447  }
448  default: throw std::invalid_argument( MakeString() << __PRETTY_FUNCTION__ << ": invalid initial condition" );
449  }
450  }
451 
452  template < int nDim, int nNodes >
454  double* P,
455  double* K,
456  const int elementFace,
457  const double* load,
458  const double* QTotal,
459  const double* time,
460  double dT )
461  {
462  Map< RhsSized > fU( P );
463 
464  switch ( loadType ) {
465 
467  const double p = load[0];
468 
469  FiniteElement::BoundaryElement boundaryEl( this->shape, elementFace, nDim, this->coordinates );
470 
471  VectorXd Pk = -p * boundaryEl.computeSurfaceNormalVectorialLoadVector();
472 
473  if ( nDim == 2 )
474  Pk *= elementProperties[0]; // thickness
475 
476  boundaryEl.assembleIntoParentVectorial( Pk, fU );
477 
478  break;
479  }
481 
482  FiniteElement::BoundaryElement boundaryEl( this->shape, elementFace, nDim, this->coordinates );
483 
484  const XiSized tractionVector( load );
485 
486  auto Pk = boundaryEl.computeVectorialLoadVector( tractionVector );
487  if ( nDim == 2 )
488  Pk *= elementProperties[0]; // thickness
489  boundaryEl.assembleIntoParentVectorial( Pk, fU );
490 
491  break;
492  }
493  default: {
494  throw std::invalid_argument( "Invalid Load Type specified" );
495  }
496  }
497  }
498 
499  template < int nDim, int nNodes >
501  double* K,
502  const double* load,
503  const double* QTotal,
504  const double* time,
505  double dT )
506  {
507  Map< RhsSized > Pe( P_ );
508  const Map< const Matrix< double, nDim, 1 > > f( load );
509 
510  for ( const auto& qp : qps )
511  Pe += this->NB( this->N( qp.xi ) ).transpose() * f * qp.J0xW;
512  }
513 
514  template < int nDim, int nNodes >
516  {
517  Map< KeSizedMatrix > Me( M );
518  Me.setZero();
519 
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;
524  }
525  }
526  template < int nDim, int nNodes >
528  {
529  Map< RhsSized > Me( M );
530  Me.setZero();
531 
532  KeSizedMatrix CMM;
533  CMM.setZero();
534  computeConsistentInertia( CMM.data() );
535 
536  Me = CMM.rowwise().sum();
537  }
538 
539  template < int nDim, int nNodes >
541  {
542  std::vector< double > coords( nDim );
543 
544  Eigen::Map< XiSized > coordsMap( &coords[0] );
545  const auto centerXi = XiSized::Zero();
546  coordsMap = this->NB( this->N( centerXi ) ) * this->coordinates;
547  return coords;
548  }
549 
550  template < int nDim, int nNodes >
552  {
553  std::vector< std::vector< double > > listedCoords;
554 
555  std::vector< double > coords( nDim );
556  Eigen::Map< XiSized > coordsMap( &coords[0] );
557 
558  for ( const auto& qp : qps ) {
559  coordsMap = this->NB( this->N( qp.xi ) ) * this->coordinates;
560  listedCoords.push_back( coords );
561  }
562 
563  return listedCoords;
564  }
565 
566  template < int nDim, int nNodes >
568  {
569  return qps.size();
570  }
571 } // namespace Marmot::Elements
Marmot::Elements::DisplacementFiniteElement::XiSized
typename ParentGeometryElement::XiSized XiSized
Definition: DisplacementFiniteElement.h:69
MarmotMaterialHypoElastic.h
MarmotConstants.h
Marmot::Elements::DisplacementFiniteElement::sectionType
const SectionType sectionType
Definition: DisplacementFiniteElement.h:77
Marmot::Elements::DisplacementFiniteElement::elementProperties
Map< const VectorXd > elementProperties
Definition: DisplacementFiniteElement.h:75
MarmotElement::GeostaticStress
@ GeostaticStress
Definition: MarmotElement.h:44
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::B
BSized B
Definition: DisplacementFiniteElement.h:86
Marmot::Elements::DisplacementFiniteElement::assignProperty
void assignProperty(const ElementProperties &marmotElementProperty)
Definition: DisplacementFiniteElement.h:283
ElementProperties
Definition: MarmotElementProperty.h:42
MarmotElement::MarmotMaterialStateVars
@ MarmotMaterialStateVars
Definition: MarmotElement.h:45
Marmot::Elements::DisplacementFiniteElement::UniaxialStress
@ UniaxialStress
Definition: DisplacementFiniteElement.h:56
Marmot::FiniteElement::Spatial1D::Bar2::dNdXiSized
Eigen::Matrix< double, 1, nNodes > dNdXiSized
Definition: MarmotFiniteElement.h:94
Marmot::Elements::DisplacementFiniteElement::initializeYourself
void initializeYourself()
Definition: DisplacementFiniteElement.h:320
Marmot::Elements::DisplacementFiniteElement::getCoordinatesAtCenter
std::vector< double > getCoordinatesAtCenter()
Definition: DisplacementFiniteElement.h:540
MarmotElement::MarmotMaterialInitialization
@ MarmotMaterialInitialization
Definition: MarmotElement.h:46
MarmotElement
Definition: MarmotElement.h:36
MarmotGeometryElement
Definition: MarmotGeometryElement.h:36
MarmotJournal.h
Marmot::Elements::DisplacementFiniteElement::getNDofPerElement
int getNDofPerElement()
Definition: DisplacementFiniteElement.h:152
MarmotTypedefs.h
MarmotMath.h
Marmot::Matrix6d
Eigen::Matrix< double, 6, 6 > Matrix6d
Definition: MarmotTypedefs.h:35
MarmotVoigt.h
Marmot::Elements::DisplacementFiniteElement::KeSizedMatrix
Matrix< double, sizeLoadVector, sizeLoadVector > KeSizedMatrix
Definition: DisplacementFiniteElement.h:71
Marmot::Elements::DisplacementFiniteElement::setInitialConditions
void setInitialConditions(StateTypes state, const double *values)
Definition: DisplacementFiniteElement.h:419
Marmot::FiniteElement::BoundaryElement::assembleIntoParentVectorial
void assembleIntoParentVectorial(const Eigen::VectorXd &boundaryVector, Eigen::Ref< Eigen::VectorXd > ParentVector)
Definition: MarmotFiniteElementBoundary.cpp:274
Marmot::FiniteElement::BoundaryElement
Definition: MarmotFiniteElement.h:297
Marmot::Elements::DisplacementFiniteElement
Definition: DisplacementFiniteElement.h:52
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::material
std::unique_ptr< MarmotMaterialHypoElastic > material
Definition: DisplacementFiniteElement.h:113
Marmot::Elements::DisplacementFiniteElement::getNumberOfQuadraturePoints
int getNumberOfQuadraturePoints()
Definition: DisplacementFiniteElement.h:567
Marmot::FiniteElement::Spatial2D::nDim
constexpr int nDim
Definition: MarmotFiniteElement.h:112
Marmot::Elements::DisplacementFiniteElement::assignStateVars
void assignStateVars(double *stateVars, int nStateVars)
Definition: DisplacementFiniteElement.h:271
Marmot::Elements::DisplacementFiniteElement::PlaneStrain
@ PlaneStrain
Definition: DisplacementFiniteElement.h:58
MarmotElementProperty.h
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::assignStateVars
void assignStateVars(double *stateVars, int nStateVars)
Definition: DisplacementFiniteElement.h:125
MarmotGeometryElement::BSized
Eigen::Matrix< double, voigtSize, nNodes *nDim > BSized
Definition: MarmotGeometryElement.h:59
MarmotMaterialSection::nMaterialProperties
int nMaterialProperties
Definition: MarmotElementProperty.h:34
MarmotStateVarVectorManager
A convenience auxiliary class for managing multiple statevars with arbitrary length in a single conse...
Definition: MarmotStateVarVectorManager.h:37
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::getNumberOfRequiredStateVarsQuadraturePointOnly
int getNumberOfRequiredStateVarsQuadraturePointOnly()
Definition: DisplacementFiniteElement.h:115
MarmotStateVarVectorManager.h
MarmotElement::DistributedLoadTypes
DistributedLoadTypes
Definition: MarmotElement.h:49
MarmotFiniteElement.h
Marmot::mVector6d
Eigen::Map< Vector6d > mVector6d
Definition: MarmotTypedefs.h:49
MarmotGeometryElement::XiSized
Eigen::Matrix< double, nDim, 1 > XiSized
Definition: MarmotGeometryElement.h:53
MarmotElement::SurfaceTraction
@ SurfaceTraction
Definition: MarmotElement.h:52
Marmot::FiniteElement::BoundaryElement::computeVectorialLoadVector
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
Marmot::Math::linearInterpolation
double linearInterpolation(double x, double x0, double x1, double y0, double y1)
Definition: MarmotMath.cpp:7
MarmotLibrary::MarmotMaterialFactory::createMaterial
static MarmotMaterial * createMaterial(int materialCode, const double *materialProperties, int nMaterialProperties, int materialNumber)
ElementProperties::elementProperties
const double * elementProperties
Definition: MarmotElementProperty.h:44
MarmotGeometryElement.h
StateView
Definition: MarmotUtils.h:29
Marmot::Elements::DisplacementFiniteElement::SectionType
SectionType
Definition: DisplacementFiniteElement.h:55
Marmot::Elements::DisplacementFiniteElement::computeDistributedLoad
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
Marmot::Elements::DisplacementFiniteElement::Solid
@ Solid
Definition: DisplacementFiniteElement.h:59
Marmot::ContinuumMechanics::PlaneStrain::getPlaneStrainTangent
Eigen::Matrix3d getPlaneStrainTangent(const Matrix6d &C)
Definition: MarmotLowerDimensionalStress.cpp:37
Marmot::Elements::DisplacementFiniteElement::getNumberOfRequiredStateVars
int getNumberOfRequiredStateVars()
Definition: DisplacementFiniteElement.h:239
Marmot::Elements
Definition: DisplacementFiniteElement.h:49
Marmot
This file includes functions needed for calculations with stress and strain tensors written in voigt ...
Definition: MarmotTesting.h:32
Marmot::Elements::DisplacementFiniteElement::elLabel
const int elLabel
Definition: DisplacementFiniteElement.h:76
Marmot::FiniteElement::BoundaryElement::computeSurfaceNormalVectorialLoadVector
Eigen::VectorXd computeSurfaceNormalVectorialLoadVector()
compute the element load vector for a unit vectorial load normal to the surface.
Definition: MarmotFiniteElementBoundary.cpp:147
Marmot::Elements::DisplacementFiniteElement::PlaneStress
@ PlaneStress
Definition: DisplacementFiniteElement.h:57
Marmot::FiniteElement::Spatial2D::B
Eigen::Matrix< double, voigtSize, nNodes *nDim > B(const Eigen::Matrix< double, nDim, nNodes > &dNdX)
Definition: MarmotFiniteElement.h:116
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::detJ
double detJ
Definition: DisplacementFiniteElement.h:84
Marmot::Elements::DisplacementFiniteElement::qps
std::vector< QuadraturePoint > qps
Definition: DisplacementFiniteElement.h:136
MarmotGeometryElement::dNdXiSized
Eigen::Matrix< double, nDim, nNodes > dNdXiSized
Definition: MarmotGeometryElement.h:58
Marmot::Elements::DisplacementFiniteElement::computeLumpedInertia
void computeLumpedInertia(double *M)
Definition: DisplacementFiniteElement.h:527
MarmotElement::StateTypes
StateTypes
Definition: MarmotElement.h:39
Marmot::ContinuumMechanics::VoigtNotation::P
const Marmot::Vector6d P
Definition: MarmotVoigt.cpp:16
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::QPStateVarManager::stress
mVector6d stress
Definition: DisplacementFiniteElement.h:97
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::J0xW
double J0xW
Definition: DisplacementFiniteElement.h:85
Marmot::Elements::DisplacementFiniteElement::Voigt
Matrix< double, ParentGeometryElement::voigtSize, 1 > Voigt
Definition: DisplacementFiniteElement.h:73
Marmot::Elements::DisplacementFiniteElement::getNodeFields
std::vector< std::vector< std::string > > getNodeFields()
Definition: DisplacementFiniteElement.h:245
Marmot::FiniteElement::NB
Eigen::MatrixXd NB(const Eigen::VectorXd &N, const int nDoFPerNode)
MarmotMaterialSection::materialProperties
const double * materialProperties
Definition: MarmotElementProperty.h:33
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint
Definition: DisplacementFiniteElement.h:79
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::QPStateVarManager::materialStateVars
Eigen::Map< Eigen::VectorXd > materialStateVars
Definition: DisplacementFiniteElement.h:99
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::xi
const XiSized xi
Definition: DisplacementFiniteElement.h:81
MarmotElement.h
Marmot::FiniteElement::Spatial1D::Bar2::nNodes
constexpr int nNodes
Definition: MarmotFiniteElement.h:92
Marmot::Vector6d
Eigen::Matrix< double, 6, 1 > Vector6d
Definition: MarmotTypedefs.h:43
Marmot::FiniteElement::Quadrature::getGaussPointInfo
const std::vector< QuadraturePointInfo > & getGaussPointInfo(Marmot::FiniteElement::ElementShapes shape, IntegrationTypes integrationType)
Definition: MarmotFiniteElementBasic.cpp:100
MarmotGeometryElement::shape
const Marmot::FiniteElement::ElementShapes shape
Definition: MarmotGeometryElement.h:63
ElementProperties::nElementProperties
int nElementProperties
Definition: MarmotElementProperty.h:45
Marmot::FiniteElement::Spatial1D::Bar2::dNdXi
dNdXiSized dNdXi(double xi)
Definition: MarmotFiniteElement1D.cpp:22
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::getNumberOfRequiredStateVars
int getNumberOfRequiredStateVars()
Definition: DisplacementFiniteElement.h:120
Marmot.h
Marmot::Elements::DisplacementFiniteElement::getCoordinatesAtQuadraturePoints
std::vector< std::vector< double > > getCoordinatesAtQuadraturePoints()
Definition: DisplacementFiniteElement.h:551
Marmot::ContinuumMechanics::VoigtNotation::planeVoigtToVoigt
Marmot::Vector6d planeVoigtToVoigt(const Eigen::Vector3d &voigtPlane)
Marmot::FiniteElement::Quadrature::IntegrationTypes
IntegrationTypes
Definition: MarmotFiniteElement.h:358
Marmot::Elements::DisplacementFiniteElement::getNSpatialDimensions
int getNSpatialDimensions()
Definition: DisplacementFiniteElement.h:150
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::QPStateVarManager::QPStateVarManager
QPStateVarManager(double *theStateVarVector, int nStateVars)
Definition: DisplacementFiniteElement.h:103
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::managedStateVars
std::unique_ptr< QPStateVarManager > managedStateVars
Definition: DisplacementFiniteElement.h:111
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::weight
const double weight
Definition: DisplacementFiniteElement.h:82
Marmot::Elements::DisplacementFiniteElement::getNNodes
int getNNodes()
Definition: DisplacementFiniteElement.h:148
MarmotMaterialSection::materialCode
int materialCode
Definition: MarmotElementProperty.h:32
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::QPStateVarManager::getNumberOfRequiredStateVarsQuadraturePointOnly
static int getNumberOfRequiredStateVarsQuadraturePointOnly()
Definition: DisplacementFiniteElement.h:101
MarmotMaterialSection
Definition: MarmotElementProperty.h:30
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::QuadraturePoint
QuadraturePoint(XiSized xi, double weight)
Definition: DisplacementFiniteElement.h:132
MarmotElement::Pressure
@ Pressure
Definition: MarmotElement.h:50
MarmotLowerDimensionalStress.h
Marmot::FiniteElement::Jacobian
Eigen::MatrixXd Jacobian(const Eigen::MatrixXd &dN_dXi, const Eigen::VectorXd &coordinates)
Marmot::Elements::DisplacementFiniteElement::computeBodyForce
void computeBodyForce(double *P, double *K, const double *load, const double *QTotal, const double *time, double dT)
Definition: DisplacementFiniteElement.h:500
Marmot::FiniteElement::Spatial1D::Bar2::N
NSized N(double xi)
Definition: MarmotFiniteElement1D.cpp:15
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::QPStateVarManager
Definition: DisplacementFiniteElement.h:88
MarmotGeometryElement::JacobianSized
Eigen::Matrix< double, nDim, nDim > JacobianSized
Definition: MarmotGeometryElement.h:55
Marmot::Elements::DisplacementFiniteElement::computeConsistentInertia
void computeConsistentInertia(double *M)
Definition: DisplacementFiniteElement.h:515
Marmot::Elements::DisplacementFiniteElement::computeYourself
void computeYourself(const double *QTotal, const double *dQ, double *Pe, double *Ke, const double *time, double dT, double &pNewdT)
Definition: DisplacementFiniteElement.h:345
Marmot::Elements::DisplacementFiniteElement::QuadraturePoint::QPStateVarManager::strain
mVector6d strain
Definition: DisplacementFiniteElement.h:98
Marmot::Elements::DisplacementFiniteElement::getDofIndicesPermutationPattern
std::vector< int > getDofIndicesPermutationPattern()
Definition: DisplacementFiniteElement.h:260
Marmot::Elements::DisplacementFiniteElement::RhsSized
Matrix< double, sizeLoadVector, 1 > RhsSized
Definition: DisplacementFiniteElement.h:70
Marmot::Elements::DisplacementFiniteElement::CSized
Matrix< double, ParentGeometryElement::voigtSize, ParentGeometryElement::voigtSize > CSized
Definition: DisplacementFiniteElement.h:72
Marmot::Elements::DisplacementFiniteElement::getElementShape
std::string getElementShape()
Definition: DisplacementFiniteElement.h:154
Marmot::Elements::DisplacementFiniteElement::getStateView
StateView getStateView(const std::string &stateName, int qpNumber)
Definition: DisplacementFiniteElement.h:196
MarmotMaterialHypoElastic
Definition: MarmotMaterialHypoElastic.h:54
Marmot::Elements::DisplacementFiniteElement::assignNodeCoordinates
void assignNodeCoordinates(const double *coordinates)
Definition: DisplacementFiniteElement.h:314
MakeString
Definition: MarmotJournal.h:32