v0.16.3
Loading...
Searching...
No Matches
MatMetaPiolaResponse.cpp
Go to the documentation of this file.
1/**
2 * @file MatMetaPiolaResponse.cpp
3 * @brief Dispatch first-Piola responses without implying stored energy
4 * @version 0.1
5 * @date 2026-03-28
6 *
7 * @copyright Copyright (c) 2026
8 *
9 */
10
11namespace MatOps {
12
13template <int DIM,
14 int MODEL_TYPE =
18 using ResponsePtr = boost::shared_ptr<MatPiolaResponse>;
19
20 MatMetaPiolaResponse(boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag)
21 : A(mat_ops_data_ptr, tag) {
22 const int default_tag = MatOpsTagsRegistry::setTagName("MetaPiolaResponse");
23 metaPiolaResponses.emplace(
24 default_tag,
25 boost::static_pointer_cast<MatPiolaResponse>(
26 createMatOpsPhysicalEquationsPtr<ELASTICITY::NEOHOOKEAN, modelType>(
27 this->matOpsDataPtr, default_tag)));
28
29 if constexpr (DIM == 3) {
30 const int mooney_tag =
31 MatOpsTagsRegistry::setTagName("MooneyRivlinWriggersEq63");
32 metaPiolaResponses.emplace(
33 mooney_tag, boost::static_pointer_cast<MatPiolaResponse>(
36 this->matOpsDataPtr, mooney_tag)));
37 }
38
39 const int stvenant_tag =
40 MatOpsTagsRegistry::setTagName("StVenantKirchhoff");
41 metaPiolaResponses.emplace(
42 stvenant_tag,
43 boost::static_pointer_cast<MatPiolaResponse>(
45 modelType>(this->matOpsDataPtr,
46 stvenant_tag)));
47 }
48
49 MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr = nullptr) override {
51
52 // Activate UMAT only for an explicit library or material block.
53 char umat_library[PETSC_MAX_PATH_LEN] = "";
54 CHKERR PetscOptionsGetString(PETSC_NULLPTR, PETSC_NULLPTR, "-umat_library",
55 umat_library, sizeof(umat_library),
56 PETSC_NULLPTR);
57
58 if (umat_library[0] ||
59 (m_field_ptr &&
60 !m_field_ptr->getInterface<MeshsetsManager>()
61 ->getCubitMeshsetPtr(std::regex("MAT_UMAT(.*)"))
62 .empty())) {
63 const int umat_tag = MatOpsTagsRegistry::setTagName("Umat");
64 metaPiolaResponses.insert(
65 {umat_tag, boost::static_pointer_cast<MatPiolaResponse>(
66 createMatOpsPhysicalEquationsPtr<UMAT, modelType>(
67 this->matOpsDataPtr, umat_tag))});
68 }
69
70 for (auto &m : metaPiolaResponses) {
71 CHKERR m.second->getOptions(m_field_ptr);
72 }
73 A::tagVsRangePtr = boost::make_shared<std::map<int, Range>>();
74 for (const auto &m : metaPiolaResponses) {
75 A::tagVsRangePtr->insert(
76 {m.first, Range()}); // Initialize with empty range
77 for (auto &rp : m.second->paramVecByRange) {
78 A::tagVsRangePtr->at(m.first).merge(
79 rp.first); // Merge ranges for the same tag
80 }
81 }
83 }
84
85 MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override {
87 const auto ent = fe_ptr->getFEEntityHandle();
88
89 bool has_ranges = false;
90 if (A::tagVsRangePtr) {
91 for (const auto &tag_range : *A::tagVsRangePtr) {
92 has_ranges = has_ranges || !tag_range.second.empty();
93 }
94 }
95
96 if (!has_ranges) {
97 for (auto &m : metaPiolaResponses) {
98 CHKERR m.second->setParams(fe_ptr, gg);
99 }
101 }
102
103 for (auto &m : metaPiolaResponses) {
104 if (A::tagVsRangePtr->at(m.first).find(ent) !=
105 A::tagVsRangePtr->at(m.first).end()) {
106 CHKERR m.second->setParams(fe_ptr, gg);
108 }
109 }
110
111 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
112 "Meta Piola-response parameters not found for entity %lu",
113 static_cast<unsigned long>(ent));
115 }
116
119 for (auto &m : metaPiolaResponses) {
120 CHKERR m.second->recordTape();
121 }
123 }
124
125 MoFEMErrorCode evaluateVariable(int tag, EntityHandle entity,
126 int gg) override {
127 return metaPiolaResponses.at(tag)->evaluateVariable(tag, entity, gg);
128 }
129
130 MoFEMErrorCode evaluateDerivatives(int tag, EntityHandle entity,
131 int gg) override {
132 return metaPiolaResponses.at(tag)->evaluateDerivatives(tag, entity, gg);
133 }
134
135 MoFEMErrorCode updateState(int tag, EntityHandle entity, int gg) override {
136 return metaPiolaResponses.at(tag)->updateState(tag, entity, gg);
137 }
138
139 std::map<int, ResponsePtr> &getMetaPiolaResponseMap() {
140 return metaPiolaResponses;
141 }
142
143protected:
144 static inline constexpr int modelType = MODEL_TYPE;
145
146 std::map<int, ResponsePtr> metaPiolaResponses;
147};
148
149std::map<int, boost::shared_ptr<MatPiolaResponse>> &
150getMetaPiolaResponseMap(boost::shared_ptr<MatPiolaResponse> meta_ptr) {
151 auto meta_response_3d_ptr =
152 boost::dynamic_pointer_cast<MatMetaPiolaResponse<3>>(meta_ptr);
153 if (meta_response_3d_ptr) {
154 return meta_response_3d_ptr->getMetaPiolaResponseMap();
155 }
156 auto meta_response_2d_ptr =
157 boost::dynamic_pointer_cast<MatMetaPiolaResponse<2>>(meta_ptr);
158 if (meta_response_2d_ptr) {
159 return meta_response_2d_ptr->getMetaPiolaResponseMap();
160 }
161 auto meta_response_axisymmetric_ptr = boost::dynamic_pointer_cast<
163 if (meta_response_axisymmetric_ptr) {
164 return meta_response_axisymmetric_ptr->getMetaPiolaResponseMap();
165 }
167 "Provided response pointer is not a MatMetaPiolaResponse");
168 static std::map<int, boost::shared_ptr<MatPiolaResponse>> empty_map;
169 return empty_map;
170}
171
172template <>
173boost::shared_ptr<PhysicalEquations>
175 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
176 return boost::make_shared<MatMetaPiolaResponse<3>>(mat_ops_data_ptr, tag);
177}
178
179template <>
180boost::shared_ptr<PhysicalEquations>
182 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
183 return boost::make_shared<MatMetaPiolaResponse<2>>(mat_ops_data_ptr, tag);
184}
185
186template <>
187boost::shared_ptr<PhysicalEquations>
189 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
190 return boost::make_shared<MatMetaPiolaResponse<3, MODEL_AXISYMMETRIC>>(
191 mat_ops_data_ptr, tag);
192}
193} // namespace MatOps
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition definitions.h:34
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< PIOLA_RESPONSE::META, MODEL_AXISYMMETRIC >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< PIOLA_RESPONSE::META, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
@ MODEL_3D
Definition MatOps.hpp:209
@ MODEL_2D_PLANE_STRAIN
Definition MatOps.hpp:210
std::map< int, boost::shared_ptr< MatPiolaResponse > > & getMetaPiolaResponseMap(boost::shared_ptr< MatPiolaResponse > meta_ptr)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< PIOLA_RESPONSE::META, MODEL_2D_PLANE_STRAIN >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
FTensor::Index< 'm', 3 > m
MoFEMErrorCode evaluateDerivatives(int tag, EntityHandle entity, int gg) override
MatMetaPiolaResponse(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
std::map< int, ResponsePtr > metaPiolaResponses
boost::shared_ptr< MatPiolaResponse > ResponsePtr
MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override
MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr=nullptr) override
std::map< int, ResponsePtr > & getMetaPiolaResponseMap()
MoFEMErrorCode evaluateVariable(int tag, EntityHandle entity, int gg) override
MoFEMErrorCode recordTape() override
MoFEMErrorCode updateState(int tag, EntityHandle entity, int gg) override
static int setTagName(std::string name, int tag=-1)
Definition MatOps.cpp:29
Deprecated interface functions.
Structure for user loop methods on finite elements.
EntityHandle getFEEntityHandle() const
Get the entity handle of the current finite element.
Interface for managing meshsets containing materials and boundary conditions.