v0.13.0
Classes | Public Member Functions | Public Attributes | List of all members
NonlinearElasticElement Struct Reference

structure grouping operators and data used for calculation of nonlinear elastic element More...

#include <users_modules/basic_finite_elements/src/HookeElement.hpp>

Collaboration diagram for NonlinearElasticElement:
[legend]

Classes

struct  BlockData
 data for calculation heat conductivity and heat capacity elements More...
 
struct  CommonData
 common data used by volume elements More...
 
struct  FunctionsToCalculatePiolaKirchhoffI
 Implementation of elastic (non-linear) St. Kirchhoff equation. More...
 
struct  MyVolumeFE
 definition of volume element More...
 
struct  OpEnergy
 
struct  OpGetCommonDataAtGaussPts
 
struct  OpGetDataAtGaussPts
 
struct  OpJacobianEnergy
 Calculate explicit derivative of free energy. More...
 
struct  OpJacobianEshelbyStress
 
struct  OpJacobianPiolaKirchhoffStress
 Operator performs automatic differentiation. More...
 
struct  OpLhsEshelby_dx
 
struct  OpLhsEshelby_dX
 
struct  OpLhsPiolaKirchhoff_dx
 
struct  OpLhsPiolaKirchhoff_dX
 
struct  OpRhsEshelbyStress
 
struct  OpRhsPiolaKirchhoff
 

Public Member Functions

MyVolumeFEgetLoopFeRhs ()
 get rhs volume element More...
 
MyVolumeFEgetLoopFeLhs ()
 get lhs volume element More...
 
MyVolumeFEgetLoopFeEnergy ()
 get energy fe More...
 
 NonlinearElasticElement (MoFEM::Interface &m_field, short int tag)
 
virtual ~NonlinearElasticElement ()=default
 
MoFEMErrorCode setBlocks (boost::shared_ptr< FunctionsToCalculatePiolaKirchhoffI< double >> materialDoublePtr, boost::shared_ptr< FunctionsToCalculatePiolaKirchhoffI< adouble >> materialAdoublePtr)
 
MoFEMErrorCode addElement (const std::string element_name, const std::string spatial_position_field_name, const std::string material_position_field_name="MESH_NODE_POSITIONS", const bool ale=false)
 
MoFEMErrorCode setOperators (const std::string spatial_position_field_name, const std::string material_position_field_name="MESH_NODE_POSITIONS", const bool ale=false, const bool field_disp=false)
 Set operators to calculate left hand tangent matrix and right hand residual. More...
 

Public Attributes

DEPRECATED typedef OpRhsEshelbyStress OpRhsEshelbyStrees
 
MyVolumeFE feRhs
 calculate right hand side for tetrahedral elements More...
 
MyVolumeFE feLhs
 
MyVolumeFE feEnergy
 calculate elastic energy More...
 
MoFEM::InterfacemField
 
short int tAg
 
std::map< int, BlockDatasetOfBlocks
 maps block set id with appropriate BlockData More...
 
CommonData commonData
 
FTensor::Index< 'i', 3 > i
 
FTensor::Index< 'j', 3 > j
 
FTensor::Index< 'k', 3 > k
 

Detailed Description

structure grouping operators and data used for calculation of nonlinear elastic element

In order to assemble matrices and right hand vectors, the loops over elements, entities over that elements and finally loop over integration points are executed.

Following implementation separate those three categories of loops and to each loop attach operator.

Examples
HookeElement.hpp, Remodeling.cpp, cell_forces.cpp, nonlinear_dynamics.cpp, and simple_contact.cpp.

Definition at line 40 of file HookeElement.hpp.

Constructor & Destructor Documentation

◆ NonlinearElasticElement()

NonlinearElasticElement::NonlinearElasticElement ( MoFEM::Interface m_field,
short int  tag 
)

Definition at line 92 of file NonLinearElasticElement.cpp.

94  : feRhs(m_field), feLhs(m_field), feEnergy(m_field), mField(m_field),
95  tAg(tag) {}
MyVolumeFE feRhs
calculate right hand side for tetrahedral elements
MyVolumeFE feEnergy
calculate elastic energy

◆ ~NonlinearElasticElement()

virtual NonlinearElasticElement::~NonlinearElasticElement ( )
virtualdefault

Member Function Documentation

◆ addElement()

MoFEMErrorCode NonlinearElasticElement::addElement ( const std::string  element_name,
const std::string  spatial_position_field_name,
const std::string  material_position_field_name = "MESH_NODE_POSITIONS",
const bool  ale = false 
)
Examples
simple_contact.cpp.

Definition at line 1131 of file NonLinearElasticElement.cpp.

1134  {
1136 
1137  CHKERR mField.add_finite_element(element_name, MF_ZERO);
1139  element_name, spatial_position_field_name);
1141  element_name, spatial_position_field_name);
1143  element_name, spatial_position_field_name);
1144  if (mField.check_field(material_position_field_name)) {
1145  if (ale) {
1147  element_name, material_position_field_name);
1149  element_name, material_position_field_name);
1150  }
1152  element_name, material_position_field_name);
1153  }
1154 
1155  std::map<int, BlockData>::iterator sit = setOfBlocks.begin();
1156  for (; sit != setOfBlocks.end(); sit++) {
1157  CHKERR mField.add_ents_to_finite_element_by_type(sit->second.tEts, MBTET,
1158  element_name);
1159  }
1160 
1162 }
@ MF_ZERO
Definition: definitions.h:111
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:429
#define CHKERR
Inline error check.
Definition: definitions.h:548
virtual MoFEMErrorCode modify_finite_element_add_field_row(const std::string &fe_name, const std::string &name_row)=0
set field row which finite element use
virtual MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
add finite element
virtual MoFEMErrorCode add_ents_to_finite_element_by_type(const EntityHandle entities, const EntityType type, const std::string &name, const bool recursive=true)=0
add entities to finite element
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string &name_filed)=0
set finite element field data
virtual MoFEMErrorCode modify_finite_element_add_field_col(const std::string &fe_name, const std::string &name_row)=0
set field col which finite element use
virtual bool check_field(const std::string &name) const =0
check if field is in database
std::map< int, BlockData > setOfBlocks
maps block set id with appropriate BlockData

◆ getLoopFeEnergy()

MyVolumeFE& NonlinearElasticElement::getLoopFeEnergy ( )

get energy fe

Examples
simple_contact.cpp.

Definition at line 84 of file NonLinearElasticElement.hpp.

◆ getLoopFeLhs()

MyVolumeFE& NonlinearElasticElement::getLoopFeLhs ( )

get lhs volume element

Examples
simple_contact.cpp.

Definition at line 81 of file NonLinearElasticElement.hpp.

◆ getLoopFeRhs()

MyVolumeFE& NonlinearElasticElement::getLoopFeRhs ( )

get rhs volume element

Examples
simple_contact.cpp.

Definition at line 79 of file NonLinearElasticElement.hpp.

◆ setBlocks()

MoFEMErrorCode NonlinearElasticElement::setBlocks ( boost::shared_ptr< FunctionsToCalculatePiolaKirchhoffI< double >>  materialDoublePtr,
boost::shared_ptr< FunctionsToCalculatePiolaKirchhoffI< adouble >>  materialAdoublePtr 
)
Examples
simple_contact.cpp.

Definition at line 1097 of file NonLinearElasticElement.cpp.

1101  {
1103 
1104  if (!materialDoublePtr) {
1106  "Pointer for materialDoublePtr not allocated");
1107  }
1108  if (!materialAdoublePtr) {
1110  "Pointer for materialAdoublePtr not allocated");
1111  }
1112 
1114  mField, BLOCKSET | MAT_ELASTICSET, it)) {
1115  Mat_Elastic mydata;
1116  CHKERR it->getAttributeDataStructure(mydata);
1117  int id = it->getMeshsetId();
1118  EntityHandle meshset = it->getMeshset();
1119  CHKERR mField.get_moab().get_entities_by_type(meshset, MBTET,
1120  setOfBlocks[id].tEts, true);
1121  setOfBlocks[id].iD = id;
1122  setOfBlocks[id].E = mydata.data.Young;
1123  setOfBlocks[id].PoissonRatio = mydata.data.Poisson;
1124  setOfBlocks[id].materialDoublePtr = materialDoublePtr;
1125  setOfBlocks[id].materialAdoublePtr = materialAdoublePtr;
1126  }
1127 
1129 }
@ MAT_ELASTICSET
block name is "MAT_ELASTIC"
Definition: definitions.h:172
@ BLOCKSET
Definition: definitions.h:161
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:44
#define _IT_CUBITMESHSETS_BY_BCDATA_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet in a moFEM field.
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
Elastic material data structure.

◆ setOperators()

MoFEMErrorCode NonlinearElasticElement::setOperators ( const std::string  spatial_position_field_name,
const std::string  material_position_field_name = "MESH_NODE_POSITIONS",
const bool  ale = false,
const bool  field_disp = false 
)

Set operators to calculate left hand tangent matrix and right hand residual.

Parameters
funclass needed to calculate Piola Kirchhoff I Stress tensor
spatial_position_field_namename of approximation field
material_position_field_namename of field to define geometry
aletrue if arbitrary Lagrangian Eulerian formulation
field_disptrue if approximation field represents displacements otherwise it is field of spatial positions
Examples
simple_contact.cpp.

Definition at line 1164 of file NonLinearElasticElement.cpp.

1167  {
1169 
1170  commonData.spatialPositions = spatial_position_field_name;
1171  commonData.meshPositions = material_position_field_name;
1172 
1173  // Rhs
1174  feRhs.getOpPtrVector().push_back(
1175  new OpGetCommonDataAtGaussPts(spatial_position_field_name, commonData));
1176  if (mField.check_field(material_position_field_name)) {
1177  feRhs.getOpPtrVector().push_back(new OpGetCommonDataAtGaussPts(
1178  material_position_field_name, commonData));
1179  }
1180  std::map<int, BlockData>::iterator sit = setOfBlocks.begin();
1181  for (; sit != setOfBlocks.end(); sit++) {
1182  feRhs.getOpPtrVector().push_back(new OpJacobianPiolaKirchhoffStress(
1183  spatial_position_field_name, sit->second, commonData, tAg, false, ale,
1184  field_disp));
1185  feRhs.getOpPtrVector().push_back(new OpRhsPiolaKirchhoff(
1186  spatial_position_field_name, sit->second, commonData));
1187  }
1188 
1189  // Energy
1190  feEnergy.getOpPtrVector().push_back(
1191  new OpGetCommonDataAtGaussPts(spatial_position_field_name, commonData));
1192  if (mField.check_field(material_position_field_name)) {
1193  feEnergy.getOpPtrVector().push_back(new OpGetCommonDataAtGaussPts(
1194  material_position_field_name, commonData));
1195  }
1196  sit = setOfBlocks.begin();
1197  for (; sit != setOfBlocks.end(); sit++) {
1198  feEnergy.getOpPtrVector().push_back(
1199  new OpEnergy(spatial_position_field_name, sit->second, commonData,
1200  feEnergy.V, field_disp));
1201  }
1202 
1203  // Lhs
1204  feLhs.getOpPtrVector().push_back(
1205  new OpGetCommonDataAtGaussPts(spatial_position_field_name, commonData));
1206  if (mField.check_field(material_position_field_name)) {
1207  feLhs.getOpPtrVector().push_back(new OpGetCommonDataAtGaussPts(
1208  material_position_field_name, commonData));
1209  }
1210  sit = setOfBlocks.begin();
1211  for (; sit != setOfBlocks.end(); sit++) {
1212  feLhs.getOpPtrVector().push_back(new OpJacobianPiolaKirchhoffStress(
1213  spatial_position_field_name, sit->second, commonData, tAg, true, ale,
1214  field_disp));
1215  feLhs.getOpPtrVector().push_back(new OpLhsPiolaKirchhoff_dx(
1216  spatial_position_field_name, spatial_position_field_name, sit->second,
1217  commonData));
1218  }
1219 
1221 }
boost::ptr_vector< UserDataOperator > & getOpPtrVector()
Use to push back operator for row operator.

Member Data Documentation

◆ commonData

CommonData NonlinearElasticElement::commonData

Definition at line 134 of file NonLinearElasticElement.hpp.

◆ feEnergy

MyVolumeFE NonlinearElasticElement::feEnergy

calculate elastic energy

Definition at line 83 of file NonLinearElasticElement.hpp.

◆ feLhs

MyVolumeFE NonlinearElasticElement::feLhs

Definition at line 80 of file NonLinearElasticElement.hpp.

◆ feRhs

MyVolumeFE NonlinearElasticElement::feRhs

calculate right hand side for tetrahedral elements

Definition at line 78 of file NonLinearElasticElement.hpp.

◆ i

FTensor::Index<'i', 3> NonlinearElasticElement::i

Definition at line 136 of file NonLinearElasticElement.hpp.

◆ j

FTensor::Index<'j', 3> NonlinearElasticElement::j

Definition at line 137 of file NonLinearElasticElement.hpp.

◆ k

FTensor::Index<'k', 3> NonlinearElasticElement::k

Definition at line 138 of file NonLinearElasticElement.hpp.

◆ mField

MoFEM::Interface& NonlinearElasticElement::mField

Definition at line 86 of file NonLinearElasticElement.hpp.

◆ OpRhsEshelbyStrees

DEPRECATED typedef OpRhsEshelbyStress NonlinearElasticElement::OpRhsEshelbyStrees
Deprecated:
name with spelling mistake

Definition at line 644 of file NonLinearElasticElement.hpp.

◆ setOfBlocks

std::map<int, BlockData> NonlinearElasticElement::setOfBlocks

maps block set id with appropriate BlockData

Examples
simple_contact.cpp.

Definition at line 113 of file NonLinearElasticElement.hpp.

◆ tAg

short int NonlinearElasticElement::tAg

Definition at line 87 of file NonLinearElasticElement.hpp.


The documentation for this struct was generated from the following files: