v0.15.0
Loading...
Searching...
No Matches
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 Types

typedef DEPRECATED typedef OpRhsEshelbyStress OpRhsEshelbyStrees
 

Public Member Functions

MyVolumeFEgetLoopFeRhs ()
 get rhs volume element
 
MyVolumeFEgetLoopFeLhs ()
 get lhs volume element
 
MyVolumeFEgetLoopFeEnergy ()
 get energy fe
 
 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.
 

Public Attributes

MyVolumeFE feRhs
 calculate right hand side for tetrahedral elements
 
MyVolumeFE feLhs
 
MyVolumeFE feEnergy
 calculate elastic energy
 
MoFEM::InterfacemField
 
short int tAg
 
std::map< int, BlockDatasetOfBlocks
 maps block set id with appropriate BlockData
 
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, and nonlinear_dynamics.cpp.

Definition at line 27 of file HookeElement.hpp.

Member Typedef Documentation

◆ OpRhsEshelbyStrees

Constructor & Destructor Documentation

◆ NonlinearElasticElement()

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

Definition at line 79 of file NonLinearElasticElement.cpp.

81 : feRhs(m_field), feLhs(m_field), feEnergy(m_field), mField(m_field),
82 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 )

Definition at line 1119 of file NonLinearElasticElement.cpp.

1122 {
1124
1125 CHKERR mField.add_finite_element(element_name, MF_ZERO);
1127 element_name, spatial_position_field_name);
1129 element_name, spatial_position_field_name);
1131 element_name, spatial_position_field_name);
1132 if (mField.check_field(material_position_field_name)) {
1133 if (ale) {
1135 element_name, material_position_field_name);
1137 element_name, material_position_field_name);
1138 }
1140 element_name, material_position_field_name);
1141 }
1142
1143 std::map<int, BlockData>::iterator sit = setOfBlocks.begin();
1144 for (; sit != setOfBlocks.end(); sit++) {
1145 CHKERR mField.add_ents_to_finite_element_by_type(sit->second.tEts, MBTET,
1146 element_name);
1147 }
1148
1150}
@ MF_ZERO
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
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 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 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_row(const std::string &fe_name, const std::string name_row)=0
set field row which finite element use
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_field)=0
set finite element field data
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 ( )
inline

get energy fe

Definition at line 71 of file NonLinearElasticElement.hpp.

◆ getLoopFeLhs()

MyVolumeFE & NonlinearElasticElement::getLoopFeLhs ( )
inline

get lhs volume element

Definition at line 68 of file NonLinearElasticElement.hpp.

◆ getLoopFeRhs()

MyVolumeFE & NonlinearElasticElement::getLoopFeRhs ( )
inline

get rhs volume element

Definition at line 66 of file NonLinearElasticElement.hpp.

◆ setBlocks()

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

Definition at line 1085 of file NonLinearElasticElement.cpp.

1089 {
1091
1092 if (!materialDoublePtr) {
1094 "Pointer for materialDoublePtr not allocated");
1095 }
1096 if (!materialAdoublePtr) {
1098 "Pointer for materialAdoublePtr not allocated");
1099 }
1100
1102 mField, BLOCKSET | MAT_ELASTICSET, it)) {
1103 Mat_Elastic mydata;
1104 CHKERR it->getAttributeDataStructure(mydata);
1105 int id = it->getMeshsetId();
1106 EntityHandle meshset = it->getMeshset();
1107 CHKERR mField.get_moab().get_entities_by_type(meshset, MBTET,
1108 setOfBlocks[id].tEts, true);
1109 setOfBlocks[id].iD = id;
1110 setOfBlocks[id].E = mydata.data.Young;
1111 setOfBlocks[id].PoissonRatio = mydata.data.Poisson;
1112 setOfBlocks[id].materialDoublePtr = materialDoublePtr;
1113 setOfBlocks[id].materialAdoublePtr = materialAdoublePtr;
1114 }
1115
1117}
@ MAT_ELASTICSET
block name is "MAT_ELASTIC"
@ BLOCKSET
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#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

Definition at line 1152 of file NonLinearElasticElement.cpp.

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

Member Data Documentation

◆ commonData

CommonData NonlinearElasticElement::commonData

Definition at line 121 of file NonLinearElasticElement.hpp.

◆ feEnergy

MyVolumeFE NonlinearElasticElement::feEnergy

calculate elastic energy

Definition at line 70 of file NonLinearElasticElement.hpp.

◆ feLhs

MyVolumeFE NonlinearElasticElement::feLhs

Definition at line 67 of file NonLinearElasticElement.hpp.

◆ feRhs

MyVolumeFE NonlinearElasticElement::feRhs

calculate right hand side for tetrahedral elements

Definition at line 65 of file NonLinearElasticElement.hpp.

◆ i

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

Definition at line 123 of file NonLinearElasticElement.hpp.

◆ j

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

Definition at line 124 of file NonLinearElasticElement.hpp.

◆ k

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

Definition at line 125 of file NonLinearElasticElement.hpp.

◆ mField

MoFEM::Interface& NonlinearElasticElement::mField

Definition at line 73 of file NonLinearElasticElement.hpp.

◆ setOfBlocks

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

maps block set id with appropriate BlockData

Definition at line 100 of file NonLinearElasticElement.hpp.

◆ tAg

short int NonlinearElasticElement::tAg

Definition at line 74 of file NonLinearElasticElement.hpp.


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