v0.16.0
Loading...
Searching...
No Matches
MatMetaElastic.cpp
Go to the documentation of this file.
1/**
2 * @file MatMetaElastic.cpp
3 * @brief
4 * @version 0.1
5 * @date 2026-03-28
6 *
7 * @copyright Copyright (c) 2026
8 *
9 */
10
11namespace MatOps {
12
13template <int DIM> struct MatMetaElastic : public MatElasticImpl<DIM> {
14 using MatElasticImpl<DIM>::MatElasticImpl;
15
17
18 MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr = nullptr) override {
20 for (auto &m : metaElasticAtPts) {
21 CHKERR m.second->getOptions(m_field_ptr);
22 }
23 A::tagVsRangePtr = boost::make_shared<std::map<int, Range>>();
24 for (const auto &m : metaElasticAtPts) {
25 A::tagVsRangePtr->insert(
26 {m.first, Range()}); // Initialize with empty range
27 for (auto &rp : m.second->paramVecByRange) {
28 A::tagVsRangePtr->at(m.first).merge(
29 rp.first); // Merge ranges for the same tag
30 }
31 }
33 }
34
35 MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override {
37 for (auto &m : metaElasticAtPts) {
38 CHKERR m.second->setParams(fe_ptr, gg);
39 }
41 }
42
43 MoFEMErrorCode recordTape() override {
45 for (auto &m : metaElasticAtPts) {
46 CHKERR m.second->recordTape();
47 }
49 }
50
51 MoFEMErrorCode evaluateVariable(int tag, EntityHandle entity,
52 int gg) override {
53 return metaElasticAtPts.at(tag)->evaluateVariable(tag, entity, gg);
54 }
55
56 MoFEMErrorCode evaluateDerivatives(int tag, EntityHandle entity,
57 int gg) override {
58 return metaElasticAtPts.at(tag)->evaluateDerivatives(tag, entity, gg);
59 }
60
61 MoFEMErrorCode updateState(int tag, EntityHandle entity, int gg) override {
62 return metaElasticAtPts.at(tag)->updateState(tag, entity, gg);
63 }
64
65 std::map<int, boost::shared_ptr<PhysicalEquations>> &getMetaElasticMap() {
66 return metaElasticAtPts;
67 }
68
69protected:
70 static inline constexpr int modelType =
72
73 std::map<int, boost::shared_ptr<PhysicalEquations>> metaElasticAtPts = {
74
75 {
76
77 // First tag is always MetaElastic tag
79 createMatOpsPhysicalEquationsPtr<ELASTICITY::NEOHOOKEAN, modelType>(
80 this->matOpsDataPtr,
82
83 },
84
85 {
86
87 MatOps::MatOpsTagsRegistry::setTagName("MooneyRivlinWriggersEq63"),
89 modelType>(
91 "MooneyRivlinWriggersEq63"))
92
93 },
94
95 {
96
97 MatOps::MatOpsTagsRegistry::setTagName("StVenantKirchhoff"),
99 modelType>(
100 this->matOpsDataPtr,
101 MatOps::MatOpsTagsRegistry::setTagName("StVenantKirchhoff"))
102
103 }
104
105 };
106};
107
108std::map<int, boost::shared_ptr<PhysicalEquations>> &
109getMetaElasticMap(boost::shared_ptr<PhysicalEquations> meta_ptr) {
110 auto meta_elastic_3d_ptr =
111 boost::dynamic_pointer_cast<MatMetaElastic<3>>(meta_ptr);
112 if (meta_elastic_3d_ptr) {
113 return meta_elastic_3d_ptr->getMetaElasticMap();
114 }
115 auto meta_elastic_2d_ptr =
116 boost::dynamic_pointer_cast<MatMetaElastic<2>>(meta_ptr);
117 if (meta_elastic_2d_ptr) {
118 return meta_elastic_2d_ptr->getMetaElasticMap();
119 }
122 "Provided PhysicalEquations pointer is not of type MatMetaElastic");
123 static std::map<int, boost::shared_ptr<PhysicalEquations>> empty_map;
124 return empty_map;
125}
126
127template <>
128boost::shared_ptr<PhysicalEquations>
130 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
131 return boost::make_shared<MatMetaElastic<3>>(mat_ops_data_ptr, tag);
132}
133
134template <>
135boost::shared_ptr<PhysicalEquations>
137 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
138 return boost::make_shared<MatMetaElastic<2>>(mat_ops_data_ptr, tag);
139}
140} // namespace MatOps
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#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
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
std::map< int, boost::shared_ptr< PhysicalEquations > > & getMetaElasticMap(boost::shared_ptr< PhysicalEquations > meta_ptr)
@ MODEL_3D
Definition MatOps.hpp:171
@ MODEL_2D_PLANE_STRAIN
Definition MatOps.hpp:172
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(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)
FTensor::Index< 'm', 3 > m
MoFEMErrorCode updateState(int tag, EntityHandle entity, int gg) override
MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr=nullptr) override
MoFEMErrorCode recordTape() override
std::map< int, boost::shared_ptr< PhysicalEquations > > & getMetaElasticMap()
std::map< int, boost::shared_ptr< PhysicalEquations > > metaElasticAtPts
static constexpr int modelType
MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override
MoFEMErrorCode evaluateVariable(int tag, EntityHandle entity, int gg) override
MoFEMErrorCode evaluateDerivatives(int tag, EntityHandle entity, int gg) override
static int setTagName(std::string name, int tag=-1)
Definition MatOps.cpp:30
boost::shared_ptr< std::map< int, Range > > tagVsRangePtr
Definition MatOps.hpp:151
boost::shared_ptr< MatOpsData > matOpsDataPtr
Definition MatOps.hpp:154
Deprecated interface functions.