DisplacementFiniteStrainULElement.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  * Alexander Dummer alexander.dummer@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 
30 #include "Marmot/Marmot.h"
31 #include "Marmot/MarmotConstants.h"
32 #include "Marmot/MarmotElement.h"
38 #include "Marmot/MarmotJournal.h"
40 #include "Marmot/MarmotMath.h"
42 #include "Marmot/MarmotTensor.h"
43 #include "Marmot/MarmotTypedefs.h"
44 #include <iostream>
45 #include <memory>
46 #include <type_traits>
47 #include <vector>
48 
49 namespace Marmot::Elements {
50 
51  template < int nDim, int nNodes >
53 
54  public:
55  enum SectionType {
59  };
60 
61  static constexpr int nDofPerNodeU = nDim; // Displacement field U
62  static constexpr int nCoordinates = nNodes * nDim;
63 
64  // block sizes
65 
66  static constexpr int bsU = nNodes * nDofPerNodeU;
67 
68  static constexpr int sizeLoadVector = bsU;
69 
70  static constexpr int idxU = 0;
71 
74 
80  using RhsSized = Eigen::Matrix< double, sizeLoadVector, 1 >;
81  using KSizedMatrix = Eigen::Matrix< double, sizeLoadVector, sizeLoadVector >;
82  using USizedVector = Eigen::Matrix< double, bsU, 1 >;
83 
84  using ForceSized = Eigen::Matrix< double, nDim, 1 >;
85 
86  Eigen::Map< const Eigen::VectorXd > elementProperties;
87  const int elLabel;
89 
91 
92  struct QuadraturePoint {
93 
94  const XiSized xi;
95  const double weight;
96 
98  double J0xW;
99 
101 
102  inline const static auto layout = makeLayout( {
103  { .name = "stress", .length = 9 },
104  { .name = "F0 XX", .length = 1 },
105  { .name = "F0 YY", .length = 1 },
106  { .name = "F0 ZZ", .length = 1 },
107  { .name = "begin of material state", .length = 0 },
108  } );
109 
110  public:
111  Eigen::Map< Marmot::Vector9d > stress;
112  double& F0_XX;
113  double& F0_YY;
114  double& F0_ZZ;
115  Eigen::Map< Eigen::VectorXd > materialStateVars;
116 
117  static int getNumberOfRequiredStateVarsQuadraturePointOnly() { return layout.nRequiredStateVars; };
118 
119  QPStateVarManager( double* theStateVarVector, int nStateVars )
120  : MarmotStateVarVectorManager( theStateVarVector, layout ),
121  stress( &find( "stress" ) ),
122  F0_XX( find( "F0 XX" ) ),
123  F0_YY( find( "F0 YY" ) ),
124  F0_ZZ( find( "F0 ZZ" ) ),
125  materialStateVars( &find( "begin of material state" ),
127  };
128 
129  std::unique_ptr< QPStateVarManager > managedStateVars;
130 
131  std::unique_ptr< Material > material;
132 
134  {
136  };
137 
139  {
140  return getNumberOfRequiredStateVarsQuadraturePointOnly() + material->getNumberOfRequiredStateVars();
141  };
142 
143  void assignStateVars( double* stateVars, int nStateVars )
144  {
145  managedStateVars = std::make_unique< QPStateVarManager >( stateVars, nStateVars );
146  material->assignStateVars( managedStateVars->materialStateVars.data(),
147  managedStateVars->materialStateVars.size() );
148  }
149 
151  : xi( xi ), weight( weight ), dNdX( dNdXiSized::Zero() ), J0xW( 0.0 ){};
152  };
153 
154  std::vector< QuadraturePoint > qps;
155 
159 
161 
162  std::vector< std::vector< std::string > > getNodeFields();
163 
164  std::vector< int > getDofIndicesPermutationPattern();
165 
166  int getNNodes() { return nNodes; }
167 
168  int getNSpatialDimensions() { return nDim; }
169 
171 
173 
174  void assignStateVars( double* managedStateVars, int nStateVars );
175 
176  void assignProperty( const ElementProperties& MarmotElementProperty );
177 
178  void assignProperty( const MarmotMaterialSection& MarmotElementProperty );
179 
180  void assignNodeCoordinates( const double* coordinates );
181 
183 
184  void setInitialConditions( StateTypes state, const double* values );
185 
187  double* P,
188  double* K,
189  const int elementFace,
190  const double* load,
191  const double* QTotal,
192  const double* time,
193  double dT );
194 
195  void computeBodyForce( double* P,
196  double* K,
197  const double* load,
198  const double* QTotal,
199  const double* time,
200  double dT );
201 
202  void computeYourself( const double* QTotal,
203  const double* dQ,
204  double* Pe,
205  double* Ke,
206  const double* time,
207  double dT,
208  double& pNewdT );
209 
210  StateView getStateView( const std::string& stateName, int qpNumber );
211 
212  std::vector< double > getCoordinatesAtCenter();
213 
214  std::vector< std::vector< double > > getCoordinatesAtQuadraturePoints();
215 
217  };
218 
219  template < int nDim, int nNodes >
221  int qpNumber )
222  {
223  const auto& qp = qps[qpNumber];
224  if ( qp.managedStateVars->contains( stateName ) ) {
225  return qp.managedStateVars->getStateView( stateName );
226  }
227  else {
228  return qp.material->getStateView( stateName );
229  }
230  }
231 
232  template < int nDim, int nNodes >
234  int elementID,
236  SectionType sectionType )
238  elementProperties( Eigen::Map< const Eigen::VectorXd >( nullptr, 0 ) ),
239  elLabel( elementID ),
240  sectionType( sectionType ),
241  hasEigenDeformation( false )
242  {
243  for ( const auto& qpInfo : Marmot::FiniteElement::Quadrature::getGaussPointInfo( this->shape, integrationType ) ) {
244  QuadraturePoint qp( qpInfo.xi, qpInfo.weight );
245  qps.push_back( std::move( qp ) );
246  }
247  }
248 
249  template < int nDim, int nNodes >
251  {
252  return qps[0].getNumberOfRequiredStateVars() * qps.size();
253  }
254 
255  template < int nDim, int nNodes >
256  std::vector< std::vector< std::string > > DisplacementFiniteStrainULElement< nDim, nNodes >::getNodeFields()
257  {
258  using namespace std;
259 
260  static vector< vector< string > > nodeFields;
261  if ( nodeFields.empty() )
262  for ( int i = 0; i < nNodes; i++ ) {
263  nodeFields.push_back( vector< string >() );
264  nodeFields[i].push_back( "displacement" );
265  }
266 
267  return nodeFields;
268  }
269 
270  template < int nDim, int nNodes >
272  {
273  static std::vector< int > permutationPattern;
274  if ( permutationPattern.empty() ) {
275  for ( int i = 0; i < nNodes; i++ )
276  for ( int j = 0; j < nDim; j++ )
277  permutationPattern.push_back( i * nDim + j );
278  }
279 
280  return permutationPattern;
281  }
282 
283  template < int nDim, int nNodes >
284  void DisplacementFiniteStrainULElement< nDim, nNodes >::assignStateVars( double* managedStateVars, int nStateVars )
285  {
286  const int nQpStateVars = nStateVars / qps.size();
287 
288  for ( size_t i = 0; i < qps.size(); i++ ) {
289  auto& qp = qps[i];
290  double* qpStateVars = &managedStateVars[i * nQpStateVars];
291  qp.assignStateVars( qpStateVars, nQpStateVars );
292  }
293  }
294 
295  template < int nDim, int nNodes >
297  const ElementProperties& elementPropertiesInfo )
298  {
299  new ( &elementProperties ) Eigen::Map< const Eigen::VectorXd >( elementPropertiesInfo.elementProperties,
300  elementPropertiesInfo.nElementProperties );
301  }
302 
303  template < int nDim, int nNodes >
305  {
306 
307  for ( auto& qp : qps ) {
308  qp.material = std::unique_ptr< Material >(
310  section.materialProperties,
311  section.nMaterialProperties,
312  elLabel ) ) );
313  }
314  }
315 
316  template < int nDim, int nNodes >
318  {
319  ParentGeometryElement::assignNodeCoordinates( coordinates );
320  }
321 
322  template < int nDim, int nNodes >
324  {
325  for ( QuadraturePoint& qp : qps ) {
326 
327  const dNdXiSized dNdXi_ = this->dNdXi( qp.xi );
328 
329  const JacobianSized J = this->Jacobian( dNdXi_ );
330  const JacobianSized JInv = J.inverse();
331  const double detJ = J.determinant();
332 
333  qp.dNdX = this->dNdX( dNdXi_, JInv );
334 
335  if constexpr ( nDim == 3 ) {
336  qp.J0xW = qp.weight * detJ;
337  }
338  if constexpr ( nDim == 2 ) {
339  const double& thickness = elementProperties[0];
340  qp.J0xW = qp.weight * detJ * thickness;
341  }
342  if constexpr ( nDim == 1 ) {
343  const double& crossSection = elementProperties[0];
344  qp.J0xW = qp.weight * detJ * crossSection;
345  }
346  }
347  }
348 
349  template < int nDim, int nNodes >
351  const double* dQ,
352  double* rightHandSide,
353  double* stiffnessMatrix,
354  const double* time,
355  double dT,
356  double& pNewDT )
357  {
358  using namespace Fastor;
359 
360  const static Tensor< double, nDim, nDim > I(
361  ( Eigen::Matrix< double, nDim, nDim >() << Eigen::Matrix< double, nDim, nDim >::Identity() ).finished().data() );
362 
363  // in ...
364  const auto qU_np = TensorMap< const double, nNodes, nDim >( qTotal );
365 
366  // ... and out: residuals and stiffness
367  TensorMap< double, nNodes, nDim > r_U( rightHandSide );
368 
369  // temporary stiffness matrices, which are assembled into the large one at the end of the method
370  Tensor< double, nDim, nNodes, nDim, nNodes > k_UU( 0.0 );
371 
372  Eigen::Map< Eigen::VectorXd > rhs( rightHandSide, sizeLoadVector );
373 
374  for ( auto& qp : qps ) {
375 
376  using namespace Marmot::FastorIndices;
377 
378  const auto& dNdX_ = qp.dNdX;
379 
380  const auto dNdX = Tensor< double, nDim, nNodes >( dNdX_.data(), ColumnMajor );
381 
382  const auto F_np = evaluate( einsum< Ai, jA >( qU_np, dNdX ) + I );
383 
384  const Material::Deformation< nDim > deformation = { F_np };
385 
386  const Material::TimeIncrement timeIncrement{ time[0], dT };
387 
390  try {
391  if constexpr ( nDim == 2 ) {
392 
393  if ( sectionType == SectionType::PlaneStrain ) {
394 
395  using namespace Marmot;
396 
398  response3D{ FastorStandardTensors::Tensor33d( qp.managedStateVars->stress.data(), Fastor::ColumnMajor ),
399  -1.0,
400  -1.0 };
401 
402  Material::AlgorithmicModuli< 3 > algorithmicModuli3D;
403 
404  Material::Deformation< 3 > deformation3D{
405  expandTo3D( deformation.F ),
406  };
407 
408  deformation3D.F( 2, 2 ) = 1.0;
409 
410  if ( hasEigenDeformation )
411  qp.material->computePlaneStrain( response3D,
412  algorithmicModuli3D,
413  deformation3D,
414  timeIncrement,
415  { qp.managedStateVars->F0_XX,
416  qp.managedStateVars->F0_YY,
417  qp.managedStateVars->F0_ZZ } );
418  else
419  qp.material->computePlaneStrain( response3D, algorithmicModuli3D, deformation3D, timeIncrement );
420 
421  response = { reduceTo2D< U, U >( response3D.tau ), response3D.rho, response3D.elasticEnergyDensity };
422 
423  tangents = {
424  reduceTo2D< U, U, U, U >( algorithmicModuli3D.dTau_dF ),
425  };
426 
427  qp.managedStateVars->stress = Marmot::mapEigenToFastor( response3D.tau ).reshaped();
428  }
429  }
430  else {
431  response = { Marmot::FastorStandardTensors::Tensor33d( qp.managedStateVars->stress.data(), ColumnMajor ),
432  -1.0,
433  -1.0 };
434 
435  qp.material->computeStress( response, tangents, deformation, timeIncrement );
436 
437  // implicit conversion to col major
438  qp.managedStateVars->stress = Marmot::mapEigenToFastor( response.tau ).reshaped();
439  }
440  }
441  catch ( const std::runtime_error& ) {
442  pNewDT = 0.25;
443  return;
444  }
445  const auto dNdx = evaluate( einsum< ji, jA >( inv( F_np ), dNdX ) );
446 
447  const double& J0xW = qp.J0xW;
448 
449  const auto& tau = response.tau;
450 
451  const auto& t = tangents;
452 
453  // aux stiffness tensors
454  const auto dTau_dqU = evaluate( +einsum< ijkl, lB >( t.dTau_dF, dNdX ) );
455 
456  // r[ node, dim ] (swap to abuse directly colmajor layout)
457  // directly operate via TensorMap
458  r_U -= ( +einsum< iA, ij >( dNdx, tau ) ) * J0xW;
459 
460  // K [dim, node, dim, node ]
461  k_UU += ( +einsum< iA, ijkB, to_jAkB >( dNdx, dTau_dqU ) ) * J0xW;
462 
463  // geometric contribution
464  k_UU += ( -einsum< kA, ij, iB, to_jAkB >( dNdx, tau, dNdx ) ) * J0xW;
465  }
466  // copy back to the subblocks using mighty Eigen block access,
467  // note the layout swap rowmajor -> colmajor
468  // Fastor offers similar functionality, but performancy is (slightly) inferior
469 
470  using namespace Eigen;
471 
472  Map< KSizedMatrix > K( stiffnessMatrix );
473 
474  K.template block< bsU, bsU >( idxU, idxU ) += Map< Matrix< double, bsU, bsU > >( torowmajor( k_UU ).data() );
475  }
476 
477  template < int nDim, int nNodes >
480  double* rightHandSide,
481  double* stiffnessMatrix,
482  const int elementFace,
483  const double* load,
484  const double* QTotal_,
485  const double* time,
486  double dT )
487  {
488 
489  Eigen::Map< USizedVector > r_U( rightHandSide );
490 
491  switch ( loadType ) {
492 
494  const double p = load[0];
495  const Eigen::Map< const RhsSized > QTotal( QTotal_ );
496  const Eigen::Ref< const USizedVector > qU( QTotal.head( bsU ) );
497  Eigen::Map< Eigen::Matrix< double, sizeLoadVector, sizeLoadVector > > K( stiffnessMatrix );
498  Eigen::Ref< Eigen::Matrix< double, bsU, bsU > > kUU( K.topLeftCorner( bsU, bsU ) );
499 
500  const USizedVector coordinates_np = this->coordinates + qU;
501  FiniteElement::BoundaryElement boundaryEl( this->shape, elementFace, nDim, coordinates_np );
502 
503  Eigen::VectorXd Pb = -p * boundaryEl.computeSurfaceNormalVectorialLoadVector();
504  Eigen::MatrixXd Kb = -p * boundaryEl.computeDSurfaceNormalVectorialLoadVector_dCoordinates();
505 
506  if ( nDim == 2 ) {
507  Pb *= elementProperties[0]; // thickness
508  Kb *= elementProperties[0];
509  }
510 
511  boundaryEl.assembleIntoParentVectorial( Pb, r_U );
512  boundaryEl.assembleIntoParentStiffnessVectorial( Kb, K );
513 
514  break;
515  }
517 
518  FiniteElement::BoundaryElement boundaryEl( this->shape, elementFace, nDim, this->coordinates );
519 
520  const XiSized tractionVector( load );
521 
522  auto Pk = boundaryEl.computeVectorialLoadVector( tractionVector );
523  if ( nDim == 2 )
524  Pk *= elementProperties[0]; // thickness
525  boundaryEl.assembleIntoParentVectorial( Pk, r_U );
526 
527  break;
528  }
529  default: {
530  throw std::invalid_argument( "Invalid Load Type specified" );
531  }
532  }
533  }
534 
535  template < int nDim, int nNodes >
537  StateTypes state,
538  const double* initialConditionDefinition )
539  {
540  if constexpr ( nDim > 1 ) {
541  switch ( state ) {
542 
544  for ( QuadraturePoint& qp : qps ) {
545 
546  qp.managedStateVars->F0_XX = 1.0;
547  qp.managedStateVars->F0_YY = 1.0;
548  qp.managedStateVars->F0_ZZ = 1.0;
549 
550  qp.material->initializeYourself();
551  }
552  break;
553  }
554 
556 
557  for ( QuadraturePoint& qp : qps ) {
558 
559  XiSized coordAtGauss = this->NB( this->N( qp.xi ) ) * this->coordinates;
560 
561  const auto geostaticNormalStressComponents = Marmot::GeostaticStress::
562  getGeostaticStressFromLinearDistribution( initialConditionDefinition, coordAtGauss[1] );
563 
564  const auto [F0_XX,
565  F0_YY,
566  F0_ZZ] = qp.material->findEigenDeformationForEigenStress( { qp.managedStateVars->F0_XX,
567  qp.managedStateVars->F0_YY,
568  qp.managedStateVars->F0_ZZ },
569  geostaticNormalStressComponents );
570 
571  qp.managedStateVars->F0_XX = F0_XX;
572  qp.managedStateVars->F0_YY = F0_YY;
573  qp.managedStateVars->F0_ZZ = F0_ZZ;
574 
575  hasEigenDeformation = true;
576  }
577  break;
578  }
579  default: throw std::invalid_argument( MakeString() << __PRETTY_FUNCTION__ << ": invalid initial condition" );
580  }
581  }
582  }
583 
584  template < int nDim, int nNodes >
586  double* stiffnessMatrix,
587  const double* load,
588 
589  const double* qTotal,
590  const double* time,
591  double dT )
592  {
593  Eigen::Map< RhsSized > r( rightHandSide );
594  Eigen::Ref< USizedVector > r_U( r.head( bsU ) );
595  const Eigen::Map< const Eigen::Matrix< double, nDim, 1 > > f( load );
596 
597  for ( const auto& qp : qps )
598  r_U += this->NB( this->N( qp.xi ) ).transpose() * f * qp.J0xW;
599  }
600 
601  template < int nDim, int nNodes >
603  {
604  std::vector< double > coords( nDim );
605 
606  Eigen::Map< XiSized > coordsMap( &coords[0] );
607  const auto centerXi = XiSized::Zero();
608  coordsMap = this->NB( this->N( centerXi ) ) * this->coordinates;
609  return coords;
610  }
611 
612  template < int nDim, int nNodes >
613  std::vector< std::vector< double > > DisplacementFiniteStrainULElement< nDim,
614  nNodes >::getCoordinatesAtQuadraturePoints()
615  {
616  std::vector< std::vector< double > > listedCoords;
617 
618  std::vector< double > coords( nDim );
619  Eigen::Map< XiSized > coordsMap( &coords[0] );
620 
621  for ( const auto& qp : qps ) {
622  coordsMap = this->NB( this->N( qp.xi ) ) * this->coordinates;
623  listedCoords.push_back( coords );
624  }
625 
626  return listedCoords;
627  }
628 
629  template < int nDim, int nNodes >
631  {
632  return qps.size();
633  }
634 
635  template < int nNodes >
637 
639 
640  void computeYourself( const double* QTotal,
641  const double* dQ,
642  double* Pe,
643  double* Ke,
644  const double* time,
645  double dT,
646  double& pNewdT );
647  };
648 
649  template < int nNodes >
651  const double* dQ,
652  double* rightHandSide,
653  double* stiffnessMatrix,
654  const double* time,
655  double dT,
656  double& pNewDT )
657  {
658  constexpr int nDim = 2;
659 
661  const auto idxU = Parent::idxU;
664 
665  using namespace Fastor;
666 
667  const static Tensor< double, nDim, nDim > I(
668  ( Eigen::Matrix< double, nDim, nDim >() << Eigen::Matrix< double, nDim, nDim >::Identity() ).finished().data() );
669 
670  // in ...
671  const auto qU_np = TensorMap< const double, nNodes, nDim >( qTotal );
672 
673  // ... and out: residuals and stiffness
674  TensorMap< double, nNodes, nDim > r_U( rightHandSide );
675 
676  // temporary stiffness matrices, which are assembled into the large one at the end of the method
677  Tensor< double, nDim, nNodes, nDim, nNodes > k_UU( 0.0 );
678 
679  Eigen::Map< Eigen::VectorXd > rhs( rightHandSide, sizeLoadVector );
680 
681  for ( auto& qp : Parent::qps ) {
682 
683  using namespace Marmot::FastorIndices;
684 
685  auto N_ = this->N( qp.xi );
686  const auto& dNdX_ = qp.dNdX;
687 
688  Eigen::Vector2d coords = this->NB( N_ ) * this->coordinates;
689  const double r = coords[0];
690 
691  const auto N = Tensor< double, nNodes >( N_.data() );
692  const auto dNdX = Tensor< double, nDim, nNodes >( dNdX_.data(), ColumnMajor );
693 
694  const auto u_np = evaluate( einsum< A, Ai >( N, qU_np ) );
695 
696  const auto F_np = evaluate( einsum< Ai, jA >( qU_np, dNdX ) + I );
697 
698  const Material::Deformation< nDim > deformation = {
699  F_np,
700  };
701 
702  const Material ::TimeIncrement timeIncrement{ time[0], dT };
703 
706 
707  using namespace Marmot;
709  response3D{ FastorStandardTensors::Tensor33d( qp.managedStateVars->stress.data(), Fastor::ColumnMajor ),
710  -1.0,
711  -1.0 };
712 
713  Material::AlgorithmicModuli< 3 > algorithmicModuli3D;
714 
715  Material::Deformation< 3 > deformation3D{ expandTo3D( deformation.F ) };
716 
717  deformation3D.F( 2, 2 ) = 1 + u_np[0] / r;
718 
719  try {
720  qp.material->computePlaneStrain( response3D, algorithmicModuli3D, deformation3D, timeIncrement );
721  }
722  catch ( const std::runtime_error& ) {
723  pNewDT = 0.25;
724  return;
725  }
726  response = { reduceTo2D< U, U >( response3D.tau ), response3D.rho, response3D.elasticEnergyDensity };
727 
728  tangents = {
729  reduceTo2D< U, U, U, U >( algorithmicModuli3D.dTau_dF ),
730  };
731 
732  qp.managedStateVars->stress = Marmot::mapEigenToFastor( response3D.tau ).reshaped();
733 
734  const auto dNdx = evaluate( einsum< ji, jA >( inv( F_np ), dNdX ) );
735 
736  const double J0xWxRx2Pi = qp.J0xW * 2 * Constants::Pi * r;
737 
738  const auto& tau = response.tau;
739 
740  const auto& t = tangents;
741 
742  // aux stiffness tensors
743  auto dTau_dqU = evaluate( +einsum< ijkl, lB >( t.dTau_dF, dNdX ) );
744 
745  Fastor::Tensor< double, 2, 2 > dTau33_dF_2D( 0.0 );
746  for ( int i = 0; i < 2; i++ )
747  for ( int j = 0; j < 2; j++ ) {
748  dTau33_dF_2D( i, j ) = algorithmicModuli3D.dTau_dF( 2, 2, i, j );
749  }
750  auto dTau33_dqU = evaluate( +einsum< kl, lB >( dTau33_dF_2D, dNdX ) );
751 
752  // additional terms due to axisymmetry:
753 
754  for ( int B = 0; B < nNodes; B++ ) {
755  for ( int i = 0; i < 2; i++ )
756  for ( int j = 0; j < 2; j++ ) {
757  dTau_dqU( i, j, 0, B ) += algorithmicModuli3D.dTau_dF( i, j, 2, 2 ) * N( B ) / r;
758  }
759  dTau33_dqU( 0, B ) += algorithmicModuli3D.dTau_dF( 2, 2, 2, 2 ) * N( B ) / r;
760  }
761 
762  // r[ node, dim ] (swap to abuse directly colmajor layout)
763  // directly operate via TensorMap
764  r_U -= ( +einsum< iA, ij >( dNdx, tau ) ) * J0xWxRx2Pi;
765 
766  const double F33 = 1 + u_np[0] / r;
767  const double invF33 = 1. / F33;
768  const double dInvF33_dF33 = -1. / ( F33 * F33 );
769 
770  for ( int A = 0; A < nNodes; A++ ) {
771  r_U( A, 0 ) -= ( +N( A ) * invF33 * response3D.tau( 2, 2 ) / r ) * J0xWxRx2Pi;
772 
773  for ( int B = 0; B < nNodes; B++ ) {
774  for ( int j = 0; j < 2; j++ ) {
775  k_UU( 0, A, j, B ) += ( +N( A ) * invF33 * dTau33_dqU( j, B ) / r ) * J0xWxRx2Pi;
776  }
777  const double dF33_dN_qU_0 = ( N( B ) / r );
778  k_UU( 0, A, 0, B ) += ( +N( A ) * dInvF33_dF33 * dF33_dN_qU_0 * response3D.tau( 2, 2 ) / r ) * J0xWxRx2Pi;
779  }
780  }
781 
782  // K [dim, node, dim, node ]
783  k_UU += ( +einsum< iA, ijkB, to_jAkB >( dNdx, dTau_dqU ) ) * J0xWxRx2Pi;
784  }
785  // copy back to the subblocks using mighty Eigen block access,
786  // note the layout swap rowmajor -> colmajor
787  // Fastor offers similar functionality, but performancy is (slightly) inferior
788 
789  using namespace Eigen;
790 
791  Map< typename Parent::KSizedMatrix > K( stiffnessMatrix );
792 
793  K.template block< Parent::bsU, Parent::bsU >( idxU, idxU ) += Map< Matrix< double, Parent::bsU, Parent::bsU > >(
794  torowmajor( k_UU ).data() );
795  }
796 
797 } // namespace Marmot::Elements
Marmot::Elements::DisplacementFiniteStrainULElement::assignProperty
void assignProperty(const MarmotMaterialSection &MarmotElementProperty)
Definition: DisplacementFiniteStrainULElement.h:304
Marmot::FastorIndices::i
Fastor::Index< i_ > i
Definition: MarmotFastorTensorBasics.h:137
MarmotConstants.h
Marmot::Elements::DisplacementFiniteStrainULElement::getElementShape
std::string getElementShape()
Definition: DisplacementFiniteStrainULElement.h:172
MarmotElement::GeostaticStress
@ GeostaticStress
Definition: MarmotElement.h:44
Marmot::Elements::DisplacementFiniteStrainULElement::sectionType
const SectionType sectionType
Definition: DisplacementFiniteStrainULElement.h:88
Marmot::FiniteElement::BoundaryElement::computeDSurfaceNormalVectorialLoadVector_dCoordinates
Eigen::MatrixXd computeDSurfaceNormalVectorialLoadVector_dCoordinates()
Definition: MarmotFiniteElementBoundary.cpp:162
Marmot::Elements::DisplacementFiniteStrainULElement::PlaneStrain
@ PlaneStrain
Definition: DisplacementFiniteStrainULElement.h:57
MarmotGeostaticStress.h
MarmotFastorTensorBasics.h
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::weight
const double weight
Definition: DisplacementFiniteStrainULElement.h:95
Marmot::Elements::DisplacementFiniteStrainULElement::getCoordinatesAtQuadraturePoints
std::vector< std::vector< double > > getCoordinatesAtQuadraturePoints()
Definition: DisplacementFiniteStrainULElement.h:614
ElementProperties
Definition: MarmotElementProperty.h:42
Marmot::Elements::DisplacementFiniteStrainULElement< 2, nNodes >::RhsSized
Eigen::Matrix< double, sizeLoadVector, 1 > RhsSized
Definition: DisplacementFiniteStrainULElement.h:80
Marmot::FastorIndices::N_
@ N_
Definition: MarmotFastorTensorBasics.h:90
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint
Definition: DisplacementFiniteStrainULElement.h:92
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::dNdX
dNdXiSized dNdX
Definition: DisplacementFiniteStrainULElement.h:97
MarmotElement::MarmotMaterialInitialization
@ MarmotMaterialInitialization
Definition: MarmotElement.h:46
MarmotElement
Definition: MarmotElement.h:36
Marmot::Elements::DisplacementFiniteStrainULElement::hasEigenDeformation
bool hasEigenDeformation
Definition: DisplacementFiniteStrainULElement.h:90
MarmotGeometryElement
Definition: MarmotGeometryElement.h:36
MarmotMaterialFiniteStrain
Definition: MarmotMaterialFiniteStrain.h:33
MarmotMaterialFiniteStrain::Deformation::F
Fastor::Tensor< double, nDim, nDim > F
Definition: MarmotMaterialFiniteStrain.h:53
MarmotJournal.h
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::getNumberOfRequiredStateVars
int getNumberOfRequiredStateVars()
Definition: DisplacementFiniteStrainULElement.h:138
MarmotMaterialFiniteStrain::AlgorithmicModuli::dTau_dF
Fastor::Tensor< double, nDim, nDim, nDim, nDim > dTau_dF
Definition: MarmotMaterialFiniteStrain.h:48
MarmotTypedefs.h
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::getNumberOfRequiredStateVarsQuadraturePointOnly
static int getNumberOfRequiredStateVarsQuadraturePointOnly()
Definition: DisplacementFiniteStrainULElement.h:117
MarmotMath.h
Marmot::Elements::DisplacementFiniteStrainULElement::elementProperties
Eigen::Map< const Eigen::VectorXd > elementProperties
Definition: DisplacementFiniteStrainULElement.h:86
Marmot::Elements::DisplacementFiniteStrainULElement::Solid
@ Solid
Definition: DisplacementFiniteStrainULElement.h:58
Marmot::Elements::DisplacementFiniteStrainULElement::getCoordinatesAtCenter
std::vector< double > getCoordinatesAtCenter()
Definition: DisplacementFiniteStrainULElement.h:602
Marmot::Elements::AxiSymmetricDisplacementFiniteStrainULElement
Definition: DisplacementFiniteStrainULElement.h:636
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::F0_ZZ
double & F0_ZZ
Definition: DisplacementFiniteStrainULElement.h:114
Marmot::Elements::DisplacementFiniteStrainULElement::getNNodes
int getNNodes()
Definition: DisplacementFiniteStrainULElement.h:166
Marmot::FiniteElement::BoundaryElement::assembleIntoParentVectorial
void assembleIntoParentVectorial(const Eigen::VectorXd &boundaryVector, Eigen::Ref< Eigen::VectorXd > ParentVector)
Definition: MarmotFiniteElementBoundary.cpp:274
Marmot::Elements::AxiSymmetricDisplacementFiniteStrainULElement::computeYourself
void computeYourself(const double *QTotal, const double *dQ, double *Pe, double *Ke, const double *time, double dT, double &pNewdT)
Definition: DisplacementFiniteStrainULElement.h:650
Marmot::FastorStandardTensors::Spatial3D::I
const Tensor33d I
Definition: MarmotFastorTensorBasics.h:57
MarmotMaterialFiniteStrain::ConstitutiveResponse
Definition: MarmotMaterialFiniteStrain.h:40
Marmot::FastorStandardTensors::Tensor33d
Fastor::Tensor< double, 3, 3 > Tensor33d
Definition: MarmotFastorTensorBasics.h:38
Marmot::FiniteElement::BoundaryElement
Definition: MarmotFiniteElement.h:297
Marmot::Elements::DisplacementFiniteStrainULElement::getDofIndicesPermutationPattern
std::vector< int > getDofIndicesPermutationPattern()
Definition: DisplacementFiniteStrainULElement.h:271
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::material
std::unique_ptr< Material > material
Definition: DisplacementFiniteStrainULElement.h:131
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager
Definition: DisplacementFiniteStrainULElement.h:100
Marmot::FiniteElement::Spatial2D::nDim
constexpr int nDim
Definition: MarmotFiniteElement.h:112
Marmot::GeostaticStress::getGeostaticStressFromLinearDistribution
std::tuple< double, double, double > getGeostaticStressFromLinearDistribution(const double *geostaticStressDefintion, double coordinate_y)
Definition: MarmotGeostaticStress.cpp:7
MarmotElementProperty.h
MarmotGeometryElement::BSized
Eigen::Matrix< double, voigtSize, nNodes *nDim > BSized
Definition: MarmotGeometryElement.h:59
MarmotMaterialSection::nMaterialProperties
int nMaterialProperties
Definition: MarmotElementProperty.h:34
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QuadraturePoint
QuadraturePoint(XiSized xi, double weight)
Definition: DisplacementFiniteStrainULElement.h:150
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::assignStateVars
void assignStateVars(double *stateVars, int nStateVars)
Definition: DisplacementFiniteStrainULElement.h:143
MarmotStateVarVectorManager
A convenience auxiliary class for managing multiple statevars with arbitrary length in a single conse...
Definition: MarmotStateVarVectorManager.h:37
MarmotMaterialFiniteStrain::Deformation
Definition: MarmotMaterialFiniteStrain.h:52
Marmot::FastorIndices
Definition: MarmotFastorTensorBasics.h:89
MarmotStateVarVectorManager.h
MarmotElement::DistributedLoadTypes
DistributedLoadTypes
Definition: MarmotElement.h:49
MarmotFiniteElement.h
Marmot::Elements::DisplacementFiniteStrainULElement::SectionType
SectionType
Definition: DisplacementFiniteStrainULElement.h:55
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::F0_YY
double & F0_YY
Definition: DisplacementFiniteStrainULElement.h:113
MarmotMaterialFiniteStrain::ConstitutiveResponse::rho
double rho
Definition: MarmotMaterialFiniteStrain.h:42
Marmot::Elements::DisplacementFiniteStrainULElement< 2, nNodes >::KSizedMatrix
Eigen::Matrix< double, sizeLoadVector, sizeLoadVector > KSizedMatrix
Definition: DisplacementFiniteStrainULElement.h:81
Marmot::Elements::DisplacementFiniteStrainULElement::initializeYourself
void initializeYourself()
Definition: DisplacementFiniteStrainULElement.h:323
MarmotGeometryElement::XiSized
Eigen::Matrix< double, nDim, 1 > XiSized
Definition: MarmotGeometryElement.h:53
Marmot::Elements::DisplacementFiniteStrainULElement::DisplacementFiniteStrainULElement
DisplacementFiniteStrainULElement(int elementID, Marmot::FiniteElement::Quadrature::IntegrationTypes integrationType, SectionType sectionType)
Definition: DisplacementFiniteStrainULElement.h:233
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::mapEigenToFastor
auto mapEigenToFastor(const Fastor::Tensor< T, nRows, nCols > &fastor)
Definition: MarmotFastorTensorBasics.h:259
Marmot::Elements::DisplacementFiniteStrainULElement::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: DisplacementFiniteStrainULElement.h:478
Marmot::Elements::DisplacementFiniteStrainULElement::getNumberOfRequiredStateVars
int getNumberOfRequiredStateVars()
Definition: DisplacementFiniteStrainULElement.h:250
MarmotLibrary::MarmotMaterialFactory::createMaterial
static MarmotMaterial * createMaterial(int materialCode, const double *materialProperties, int nMaterialProperties, int materialNumber)
ElementProperties::elementProperties
const double * elementProperties
Definition: MarmotElementProperty.h:44
Marmot::Elements::DisplacementFiniteStrainULElement::assignProperty
void assignProperty(const ElementProperties &MarmotElementProperty)
Definition: DisplacementFiniteStrainULElement.h:296
MarmotGeometryElement.h
StateView
Definition: MarmotUtils.h:29
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::materialStateVars
Eigen::Map< Eigen::VectorXd > materialStateVars
Definition: DisplacementFiniteStrainULElement.h:115
MarmotMaterialFiniteStrain::TimeIncrement
Definition: MarmotMaterialFiniteStrain.h:56
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::F0_XX
double & F0_XX
Definition: DisplacementFiniteStrainULElement.h:112
MarmotMaterialFiniteStrain::AlgorithmicModuli
Definition: MarmotMaterialFiniteStrain.h:47
Marmot::Elements
Definition: DisplacementFiniteElement.h:49
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::getNumberOfRequiredStateVarsQuadraturePointOnly
int getNumberOfRequiredStateVarsQuadraturePointOnly()
Definition: DisplacementFiniteStrainULElement.h:133
Marmot::FastorIndices::j
Fastor::Index< j_ > j
Definition: MarmotFastorTensorBasics.h:182
Marmot::Elements::DisplacementFiniteStrainULElement::getStateView
StateView getStateView(const std::string &stateName, int qpNumber)
Definition: DisplacementFiniteStrainULElement.h:220
Marmot
This file includes functions needed for calculations with stress and strain tensors written in voigt ...
Definition: MarmotTesting.h:37
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::DisplacementFiniteStrainULElement::assignNodeCoordinates
void assignNodeCoordinates(const double *coordinates)
Definition: DisplacementFiniteStrainULElement.h:317
MarmotGeometryElement::getElementShape
std::string getElementShape() const
Definition: MarmotGeometryElement.h:69
MarmotGeometryElement::dNdXiSized
Eigen::Matrix< double, nDim, nNodes > dNdXiSized
Definition: MarmotGeometryElement.h:58
Marmot::Elements::DisplacementFiniteStrainULElement::elLabel
const int elLabel
Definition: DisplacementFiniteStrainULElement.h:87
MarmotGeometryElement::NSized
Eigen::Matrix< double, 1, nNodes > NSized
Definition: MarmotGeometryElement.h:56
MarmotElement::StateTypes
StateTypes
Definition: MarmotElement.h:39
Marmot::ContinuumMechanics::VoigtNotation::P
const Marmot::Vector6d P
Definition: MarmotVoigt.cpp:15
Marmot::Elements::DisplacementFiniteStrainULElement::nDofPerNodeU
static constexpr int nDofPerNodeU
Definition: DisplacementFiniteStrainULElement.h:61
Marmot::FiniteElement::NB
Eigen::MatrixXd NB(const Eigen::VectorXd &N, const int nDoFPerNode)
MarmotMaterialSection::materialProperties
const double * materialProperties
Definition: MarmotElementProperty.h:33
MarmotGeometryElement::coordinates
Eigen::Map< const CoordinateVector > coordinates
Definition: MarmotGeometryElement.h:62
MarmotElement.h
Marmot::Elements::DisplacementFiniteStrainULElement::computeBodyForce
void computeBodyForce(double *P, double *K, const double *load, const double *QTotal, const double *time, double dT)
Definition: DisplacementFiniteStrainULElement.h:585
Marmot::Elements::DisplacementFiniteStrainULElement< 2, nNodes >::ForceSized
Eigen::Matrix< double, nDim, 1 > ForceSized
Definition: DisplacementFiniteStrainULElement.h:84
MarmotStateVarVectorManager::makeLayout
static StateVarVectorLayout makeLayout(const std::vector< StateVarEntryDefinition > &theEntries)
generate the statevar vector layout from a list of entries, defined by name and length
Definition: MarmotStateVarVectorManager.h:74
Marmot::FiniteElement::Spatial1D::Bar2::nNodes
constexpr int nNodes
Definition: MarmotFiniteElement.h:92
Marmot::Elements::DisplacementFiniteStrainULElement::nCoordinates
static constexpr int nCoordinates
Definition: DisplacementFiniteStrainULElement.h:62
Marmot::Elements::DisplacementFiniteStrainULElement::assignStateVars
void assignStateVars(double *managedStateVars, int nStateVars)
Definition: DisplacementFiniteStrainULElement.h:284
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
Marmot::Elements::DisplacementFiniteStrainULElement::setInitialConditions
void setInitialConditions(StateTypes state, const double *values)
Definition: DisplacementFiniteStrainULElement.h:536
Marmot::Elements::DisplacementFiniteStrainULElement
Definition: DisplacementFiniteStrainULElement.h:52
ElementProperties::nElementProperties
int nElementProperties
Definition: MarmotElementProperty.h:45
Marmot::Elements::DisplacementFiniteStrainULElement::getNSpatialDimensions
int getNSpatialDimensions()
Definition: DisplacementFiniteStrainULElement.h:168
Marmot::FiniteElement::Spatial1D::Bar2::dNdXi
dNdXiSized dNdXi(double xi)
Definition: MarmotFiniteElement1D.cpp:22
MarmotMaterialFiniteStrain.h
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::layout
static const auto layout
Definition: DisplacementFiniteStrainULElement.h:102
Marmot::Elements::DisplacementFiniteStrainULElement::bsU
static constexpr int bsU
Definition: DisplacementFiniteStrainULElement.h:66
Marmot::Elements::DisplacementFiniteStrainULElement< 2, nNodes >::USizedVector
Eigen::Matrix< double, bsU, 1 > USizedVector
Definition: DisplacementFiniteStrainULElement.h:82
Marmot::expandTo3D
auto expandTo3D(const Fastor::Tensor< T, dims2D... > &theTensor2D)
Definition: MarmotFastorTensorBasics.h:318
Marmot::Elements::DisplacementFiniteStrainULElement::computeYourself
void computeYourself(const double *QTotal, const double *dQ, double *Pe, double *Ke, const double *time, double dT, double &pNewdT)
Definition: DisplacementFiniteStrainULElement.h:350
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::J0xW
double J0xW
Definition: DisplacementFiniteStrainULElement.h:98
Marmot.h
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::stress
Eigen::Map< Marmot::Vector9d > stress
Definition: DisplacementFiniteStrainULElement.h:111
Marmot::FiniteElement::Quadrature::IntegrationTypes
IntegrationTypes
Definition: MarmotFiniteElement.h:358
Marmot::Elements::DisplacementFiniteStrainULElement::PlaneStress
@ PlaneStress
Definition: DisplacementFiniteStrainULElement.h:56
Marmot::FiniteElement::BoundaryElement::assembleIntoParentStiffnessVectorial
void assembleIntoParentStiffnessVectorial(const Eigen::MatrixXd &KBoundary, Eigen::Ref< Eigen::MatrixXd > KParent)
Definition: MarmotFiniteElementBoundary.cpp:284
MarmotMaterialSection::materialCode
int materialCode
Definition: MarmotElementProperty.h:32
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::QPStateVarManager::QPStateVarManager
QPStateVarManager(double *theStateVarVector, int nStateVars)
Definition: DisplacementFiniteStrainULElement.h:119
Marmot::Elements::DisplacementFiniteStrainULElement::getNumberOfQuadraturePoints
int getNumberOfQuadraturePoints()
Definition: DisplacementFiniteStrainULElement.h:630
MarmotMaterialSection
Definition: MarmotElementProperty.h:30
MarmotTensor.h
Marmot::FastorIndices::A
Fastor::Index< A_ > A
Definition: MarmotFastorTensorBasics.h:92
Marmot::Constants::Pi
constexpr double Pi
Definition: MarmotConstants.h:34
MarmotElement::Pressure
@ Pressure
Definition: MarmotElement.h:50
Marmot::Elements::DisplacementFiniteStrainULElement::XiSized
typename ParentGeometryElement::XiSized XiSized
Definition: DisplacementFiniteStrainULElement.h:79
Marmot::FiniteElement::Jacobian
Eigen::MatrixXd Jacobian(const Eigen::MatrixXd &dN_dXi, const Eigen::VectorXd &coordinates)
Marmot::FiniteElement::Spatial1D::Bar2::N
NSized N(double xi)
Definition: MarmotFiniteElement1D.cpp:15
MarmotGeometryElement::JacobianSized
Eigen::Matrix< double, nDim, nDim > JacobianSized
Definition: MarmotGeometryElement.h:55
Marmot::Elements::DisplacementFiniteStrainULElement::sizeLoadVector
static constexpr int sizeLoadVector
Definition: DisplacementFiniteStrainULElement.h:68
Marmot::Elements::DisplacementFiniteStrainULElement::idxU
static constexpr int idxU
Definition: DisplacementFiniteStrainULElement.h:70
Marmot::Elements::DisplacementFiniteStrainULElement::qps
std::vector< QuadraturePoint > qps
Definition: DisplacementFiniteStrainULElement.h:154
MarmotStateVarVectorManager::find
double & find(const std::string &name) const
get the reference to the first array element of an entry in the statevar vector
Definition: MarmotStateVarVectorManager.h:48
Marmot::Elements::DisplacementFiniteStrainULElement::getNodeFields
std::vector< std::vector< std::string > > getNodeFields()
Definition: DisplacementFiniteStrainULElement.h:256
Marmot::FastorIndices::B
Fastor::Index< B_ > B
Definition: MarmotFastorTensorBasics.h:95
Marmot::Elements::DisplacementFiniteStrainULElement::getNDofPerElement
int getNDofPerElement()
Definition: DisplacementFiniteStrainULElement.h:170
MakeString
Definition: MarmotJournal.h:32
MarmotMaterialFiniteStrain::ConstitutiveResponse::tau
Fastor::Tensor< double, nDim, nDim > tau
Definition: MarmotMaterialFiniteStrain.h:41
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::managedStateVars
std::unique_ptr< QPStateVarManager > managedStateVars
Definition: DisplacementFiniteStrainULElement.h:129
Marmot::Elements::DisplacementFiniteStrainULElement::QuadraturePoint::xi
const XiSized xi
Definition: DisplacementFiniteStrainULElement.h:94