v0.16.3
Loading...
Searching...
No Matches
MatElastic.hpp
Go to the documentation of this file.
1/**
2 * @file MatElastic.hpp
3 * @brief
4 * @version 0.1
5 * @date 2026-04-02
6 *
7 * @copyright Copyright (c) 2026
8 *
9 */
10
11#ifndef MAT_ELASTIC_HPP
12#define MAT_ELASTIC_HPP
13
14#include <MatUmat.hpp>
15#include <MatAxisymmetric.hpp>
16
17namespace MatOps {
18
21 inline static bool useDeformationGradient =
22 false; // by default use common data pass gradient of displacement
23};
24
25struct ELASTICITY {
26 ELASTICITY() = delete;
27 // Behaviors
28 struct META {};
29 struct NEOHOOKEAN {};
33};
34
35/** \name Elasticity Operator Factory */
36/**@{*/
37template <int MODEL_TYPE> struct OpMaterialFactory<ELASTICITY, MODEL_TYPE> {
39
40 static void
41 addKinematics(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
42 const std::string &field_name,
43 boost::shared_ptr<MatrixDouble> m_grad) {
44 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
45 if constexpr (MODEL_TYPE == MODEL_AXISYMMETRIC) {
46 auto m_disp = boost::make_shared<MatrixDouble>();
47 auto m_grad_2d = boost::make_shared<MatrixDouble>();
48 pip.push_back(new OpCalculateVectorFieldValues<2>(field_name, m_disp));
49 pip.push_back(
51 pip.push_back(
52 new OpCalculateAxisymmetricGradient(m_disp, m_grad_2d, m_grad));
53 } else {
54 pip.push_back(
56 }
57 }
58
59 template <AssemblyType A, IntegrationType I, typename DomainEleOp>
60 static MoFEMErrorCode
62 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
63 std::string field_name,
64 boost::shared_ptr<PhysicalEquations> physical_equations_ptr) {
66 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
67 using B = typename FormsIntegrators<DomainEleOp>::template Assembly<
68 A>::template LinearForm<I>;
69 using OpInternalForce = typename B::template OpGradTimesTensor<1, DIM, DIM>;
70 auto m_grad =
71 physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("grad");
72 auto m_P = physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("P");
73 addKinematics(pip, field_name, m_grad);
74 pip.push_back(physical_equations_ptr->createOp(physical_equations_ptr, true,
75 false, false));
76 if constexpr (MODEL_TYPE == MODEL_AXISYMMETRIC) {
77 auto data = boost::make_shared<AxisymmetricAssemblyData>();
78 auto jacobian = [](double r, double, double) { return 2 * M_PI * r; };
79 pip.push_back(new OpCalculateAxisymmetricStress(m_P, data));
80 pip.push_back(
81 new OpInternalForce(field_name, data->inPlaneStress, jacobian));
82 pip.push_back(new OpAxisymmetricRhs<A, DomainEleOp>(field_name, m_P));
83 } else {
84 pip.push_back(new OpInternalForce(field_name, m_P));
85 }
87 }
88
89 template <AssemblyType A, IntegrationType I, typename DomainEleOp>
90 static MoFEMErrorCode
92 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
93 std::string field_name,
94 boost::shared_ptr<PhysicalEquations> physical_equations_ptr) {
96 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
97 using B = typename FormsIntegrators<DomainEleOp>::template Assembly<
98 A>::template BiLinearForm<I>;
99 using OpKPiola = typename B::template OpGradTensorGrad<1, DIM, DIM, -1>;
100 auto m_grad =
101 physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("grad");
102 auto m_P_dF =
103 physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("P_dF");
104 addKinematics(pip, field_name, m_grad);
105 pip.push_back(physical_equations_ptr->createOp(physical_equations_ptr,
106 false, true, false));
107 if constexpr (MODEL_TYPE == MODEL_AXISYMMETRIC) {
108 auto data = boost::make_shared<AxisymmetricAssemblyData>();
109 auto jacobian = [](double r, double, double) { return 2 * M_PI * r; };
110 pip.push_back(new OpCalculateAxisymmetricTangent(m_P_dF, data));
111 pip.push_back(new OpKPiola(field_name, field_name, data->inPlaneTangent,
112 jacobian));
113 pip.push_back(
115 } else {
116 pip.push_back(new OpKPiola(field_name, field_name, m_P_dF));
117 }
119 }
120
121 static MoFEMErrorCode
123 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
124 std::string field_name,
125 boost::shared_ptr<PhysicalEquations> physical_equations_ptr) {
127 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
128 auto m_grad =
129 physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("grad");
130 auto m_P = physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("P");
131 addKinematics(pip, field_name, m_grad);
132 pip.push_back(physical_equations_ptr->createOp(physical_equations_ptr,
133 false, false, true));
135 }
136
138 MoFEM::Interface &m_field,
139 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
140 std::string field_name,
141 boost::shared_ptr<PhysicalEquations> physical_equations_ptr) {
143 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
144 auto m_grad =
145 physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("grad");
146 auto m_P = physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("P");
147 addKinematics(pip, field_name, m_grad);
148 pip.push_back(physical_equations_ptr->createOp(physical_equations_ptr, true,
149 false, false));
151 }
152};
153/**@}*/
154
155/** \name Elasticity Material Models Creators */
156/**@{*/
157
158std::map<int, boost::shared_ptr<PhysicalEquations>> &
159getMetaElasticMap(boost::shared_ptr<PhysicalEquations> meta_ptr);
160
161template <>
162boost::shared_ptr<PhysicalEquations>
164 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
165
166template <>
167boost::shared_ptr<PhysicalEquations>
169 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
170
171template <>
172boost::shared_ptr<PhysicalEquations>
174 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
175
176template <>
177boost::shared_ptr<PhysicalEquations>
179 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
180
181template <>
182boost::shared_ptr<PhysicalEquations>
184 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
185
186template <>
187boost::shared_ptr<PhysicalEquations>
189 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
190
191template <>
192boost::shared_ptr<PhysicalEquations>
194 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
195
196template <>
197boost::shared_ptr<PhysicalEquations>
198createMatOpsPhysicalEquationsPtr<ELASTICITY::MOONEYRIVLINWRIGGERSEQ63,
200 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
201
202template <>
203boost::shared_ptr<PhysicalEquations>
204createMatOpsPhysicalEquationsPtr<ELASTICITY::MOONEYRIVLINWRIGGERSEQ63,
206 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
207
208template <>
209boost::shared_ptr<PhysicalEquations>
211 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
212
213template <>
214boost::shared_ptr<PhysicalEquations>
215createMatOpsPhysicalEquationsPtr<ELASTICITY::STVENANTKIRCHHOFF,
217 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
218
219template <>
220boost::shared_ptr<PhysicalEquations>
221createMatOpsPhysicalEquationsPtr<ELASTICITY::STVENANTKIRCHHOFF,
223 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
224
232
233template <>
234boost::shared_ptr<PhysicalEquations>
236 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag);
237
238/**@}*/
239
240} // namespace MatOps
241
242#endif // MAT_ELASTIC_HPP
#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()
std::map< int, boost::shared_ptr< PhysicalEquations > > & getMetaElasticMap(boost::shared_ptr< PhysicalEquations > meta_ptr)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::MOONEYRIVLINWRIGGERSEQ63, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::NEOHOOKEAN, MODEL_AXISYMMETRIC >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::META, MODEL_AXISYMMETRIC >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::NEOHOOKEAN, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
@ MODEL_AXISYMMETRIC
Definition MatOps.hpp:196
@ MODEL_3D
Definition MatOps.hpp:193
@ MODEL_2D_PLANE_STRAIN
Definition MatOps.hpp:194
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::META, MODEL_2D_PLANE_STRAIN >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::STVENANTKIRCHHOFF, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
VolumeLengthQualityType
@ BARRIER_AND_CHANGE_QUALITY_SCALED_BY_VOLUME
@ BARRIER_AND_QUALITY
@ LASTOP_VOLUMELENGTHQUALITYTYPE
@ BARRIER_AND_CHANGE_QUALITY
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::VOLUMELENGTHQUALITY, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::NEOHOOKEAN, MODEL_2D_PLANE_STRAIN >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::META, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
FormsIntegrators< DomainEleOp >::Assembly< A >::LinearForm< I >::OpGradTimesTensor< 1, FIELD_DIM, SPACE_DIM > OpGradTimesTensor
constexpr AssemblyType A
constexpr auto field_name
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradTensorGrad< 1, SPACE_DIM, SPACE_DIM, -1 > OpKPiola
[Only used for dynamics]
Definition seepage.cpp:63
static bool useDeformationGradient
static MoFEMErrorCode opUpdateFactory(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< PhysicalEquations > physical_equations_ptr)
static void addKinematics(boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, const std::string &field_name, boost::shared_ptr< MatrixDouble > m_grad)
static MoFEMErrorCode opRhsFactory(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< PhysicalEquations > physical_equations_ptr)
static MoFEMErrorCode opPostProcFactory(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< PhysicalEquations > physical_equations_ptr)
static MoFEMErrorCode opLhsFactory(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< PhysicalEquations > physical_equations_ptr)
Deprecated interface functions.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Specialization for MatrixDouble vector field values calculation.