v0.16.0
Loading...
Searching...
No Matches
MatNeohookean.cpp
Go to the documentation of this file.
1/**
2 * @file MatNeohookean.cpp
3 * @author your name (you@domain.com)
4 * @brief
5 * @version 0.1
6 * @date 2026-03-26
7 *
8 * @copyright Copyright (c) 2026
9 *
10 */
11
12namespace MatOps {
13template <typename M> struct MatNeohookeanOptions {
14 static constexpr auto optionsPrefix = "neo_hookean_";
15 static constexpr auto defaultLogTag = "Default Neohookean parameters:";
16 static constexpr auto blockLogTag = "MatBlock for Neohookean";
17};
18
19template <int DIM> struct MatNeohookeanOptions<TopoMatElasticImpl<DIM>> {
20 static constexpr auto optionsPrefix = "topo_neo_hookean_";
21 static constexpr auto defaultLogTag = "Default Topo Neohookean parameters:";
22 static constexpr auto blockLogTag = "MatBlock for Topo Neohookean";
23};
24
25template <typename M> struct MatNeohookeanGeneric : public M {
26 using A = M;
27 using A::A;
28
29 MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr = nullptr) override {
31
32 MOFEM_LOG_CHANNEL("WORLD");
33
34 using Options = MatNeohookeanOptions<A>;
35
36 PetscOptionsBegin(PETSC_COMM_WORLD, Options::optionsPrefix, "", "none");
37 CHKERR PetscOptionsScalar("-c10", "C10", "", C10, &C10, PETSC_NULLPTR);
38 CHKERR PetscOptionsScalar("-K", "Bulk modulus K", "", K, &K, PETSC_NULLPTR);
39 PetscOptionsEnd();
40
41 MOFEM_TAG_AND_LOG("WORLD", Sev::inform, Options::defaultLogTag)
42 << " C10 = " << C10 << " K = " << K;
44
45 std::string block_name = "MAT_NEOHOOKEAN";
46
47 for (auto &m :
48
49 m_field_ptr->getInterface<MeshsetsManager>()->
50
51 getCubitMeshsetPtr(
52 std::regex((boost::format("%s(.*)") % block_name).str()))
53
54 ) {
55
56 std::vector<double> block_data;
57 CHKERR m->getAttributes(block_data);
58 if (block_data.size() < 2) {
60 "Expected that block has two attribute");
61 }
62 auto get_block_ents = [&]() {
63 Range ents;
64 CHK_MOAB_THROW(m_field_ptr->get_moab().get_entities_by_handle(
65 m->meshset, ents, true),
66 "can not get block entities");
67 return ents;
68 };
69
70 A::paramVecByRange.push_back(
71 {get_block_ents(), {block_data[0], block_data[1]}});
72
73 MOFEM_TAG_AND_LOG("WORLD", Sev::inform, Options::blockLogTag)
74 << *m << " C10 = " << block_data[0] << " K = " << block_data[1];
75 }
76
78 };
79
80protected:
81 double C10 = 1;
82 double K = 1;
83 std::vector<double> defaultMaterialParameters = {C10, K};
84};
85
86template <int DIM>
87struct MatNeohookean : public MatNeohookeanGeneric<MatElasticImpl<DIM>> {
89 using A::A;
90
91 MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override {
92 (void)gg;
93 const auto ent = fe_ptr->getFEEntityHandle();
94 for (auto &[range, param_vec] : A::paramVecByRange) {
95 if (std::find(range.begin(), range.end(), ent) != range.end()) {
96 set_param_vec(A::tAg, param_vec.size(), param_vec.data());
97 return 0;
98 }
99 }
100 set_param_vec(A::tAg, this->defaultMaterialParameters.size(),
101 this->defaultMaterialParameters.data());
102 return 0;
103 }
104
105 MoFEMErrorCode recordTape() override {
107
108 A::matOpsDataPtr->insertCommonData("grad", MatrixDouble());
109 A::matOpsDataPtr->insertCommonData("P", MatrixDouble());
110 A::matOpsDataPtr->insertCommonData("P_dF", MatrixDouble());
111
112 A::matOpsDataPtr->insertActiveData("F", MatrixDouble());
113 A::matOpsDataPtr->insertDependentData("P", MatrixDouble());
114 A::matOpsDataPtr->insertDependentDerivativesData("P_dF", MatrixDouble());
115
116 A::matOpsDataPtr->getActiveDataPtr("F")->resize(DIM, DIM, false);
117 A::matOpsDataPtr->getDependentDataPtr("P")->resize(DIM, DIM, false);
118
119 auto t_F = getFTensor2FromPtr<DIM, DIM>(
120 A::matOpsDataPtr->getActiveDataPtr("F")->data().data());
121 auto t_P = getFTensor2FromPtr<DIM, DIM>(
122 A::matOpsDataPtr->getDependentDataPtr("P")->data().data());
123
125
126 FTENSOR_INDEX(DIM, i);
127 FTENSOR_INDEX(DIM, j);
128 FTENSOR_INDEX(DIM, I);
129 FTENSOR_INDEX(DIM, J);
130
131 t_F(i, J) = 0;
132
135
136 adouble det_aF;
138
139 trace_on(A::tAg);
140 auto p_c10 = mkparam(this->C10);
141 auto p_K = mkparam(this->K);
142
143 ta_F(i, J) <<= t_F(i, J);
144 // assume that gradient from approximated displacement, that why we add diagonal
146 ta_F(i, J) += t_kd(i, J);
147 }
148
149 det_aF = determinantTensor(ta_F);
150 CHKERR invertTensor(ta_F, det_aF, ta_invF);
151
152 ta_P(i, I) = 2. * p_c10 * (ta_F(i, I) - ta_invF(i, I)) +
153 p_K * log(det_aF) * ta_invF(i, I);
154
155 ta_P(i, I) >>= t_P(i, I);
156
157 trace_off();
158
160 }
161
162};
163
164template <int DIM>
166 : public MatNeohookeanGeneric<TopoMatElasticImpl<DIM>> {
168 using A::A;
169
170 MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override {
171 (void)gg;
172 std::vector<double> adolc_c_param_vec;
173 auto grad = A::matOpsDataPtr->getCommonDataPtr("grad");
174 auto var_grad = A::matOpsDataPtr->getCommonDataPtr("var_grad");
175 adolc_c_param_vec.reserve(grad->size2() + var_grad->size2() +
176 this->defaultMaterialParameters.size());
177
178 for (auto cc = 0; cc < grad->size2(); ++cc) {
179 adolc_c_param_vec.push_back((*grad)(gg, cc));
180 }
181 for (auto cc = 0; cc < var_grad->size2(); ++cc) {
182 adolc_c_param_vec.push_back((*var_grad)(gg, cc));
183 }
184 const auto ent = fe_ptr->getFEEntityHandle();
185 for (auto &[range, param_vec] : A::paramVecByRange) {
186 if (std::find(range.begin(), range.end(), ent) != range.end()) {
187 adolc_c_param_vec.insert(adolc_c_param_vec.end(), param_vec.begin(),
188 param_vec.end());
189 set_param_vec(A::tAg, adolc_c_param_vec.size(),
190 adolc_c_param_vec.data());
191 return 0;
192 }
193 }
194 adolc_c_param_vec.insert(adolc_c_param_vec.end(),
195 this->defaultMaterialParameters.begin(),
196 this->defaultMaterialParameters.end());
197 set_param_vec(A::tAg, adolc_c_param_vec.size(), adolc_c_param_vec.data());
198 return 0;
199 }
200
201 MoFEMErrorCode recordTape() override {
203
204 A::matOpsDataPtr->insertCommonData("Jac", MatrixDouble());
205 A::matOpsDataPtr->insertCommonData("grad", MatrixDouble());
206 A::matOpsDataPtr->insertCommonData("var_grad", MatrixDouble());
207 A::matOpsDataPtr->insertActiveData("Jac", MatrixDouble(DIM, DIM));
208 A::matOpsDataPtr->insertDependentData("Obj", MatrixDouble(1, 1));
209 A::matOpsDataPtr->insertDependentDerivativesData("dObj",
210 MatrixDouble(DIM, DIM));
211
212 auto t_jac = getFTensor2FromPtr<DIM, DIM>(
213 A::matOpsDataPtr->getActiveDataPtr("Jac")->data().data());
214 auto &obj = (*A::matOpsDataPtr->getDependentDataPtr("Obj"))(0, 0);
215
217
218 FTENSOR_INDEXES(DIM, i, J);
219 t_jac(i, J) = t_kd(i, J);
220
226 adouble det_aF;
228
229 adouble ta_obj;
230 adouble det;
231
232 trace_on(A::tAg);
233
234 for (int ii = 0; ii < DIM; ++ii) {
235 for (int JJ = 0; JJ < DIM; ++JJ) {
236 tp_F(ii, JJ) = mkparam(0.);
237 }
238 }
239 for (int ii = 0; ii < DIM; ++ii) {
240 for (int JJ = 0; JJ < DIM; ++JJ) {
241 tp_var_F(ii, JJ) = mkparam(0.);
242 }
243 }
244 auto p_c10 = mkparam(this->C10);
245 auto p_K = mkparam(this->K);
246
247 FTENSOR_INDEX(DIM, I);
248 FTENSOR_INDEX(DIM, K);
249
250 ta_jac(i, J) <<= t_jac(i, J);
251 det = determinantTensor(ta_jac);
252
254 ta_F(i, J) = ta_jac(J, K) * tp_F(i, K);
255 } else {
256 ta_F(i, J) = ta_jac(J, K) * (tp_F(i, K) + t_kd(i, K));
257 }
258
259 det_aF = determinantTensor(ta_F);
260 CHKERR invertTensor(ta_F, det_aF, ta_invF);
261 ta_P(i, I) = 2. * p_c10 * (ta_F(i, I) - ta_invF(i, I)) +
262 p_K * log(det_aF) * ta_invF(i, I);
263 ta_obj = det * ta_P(i, I) * ta_jac(I, K) * tp_var_F(i, K);
264 ta_obj >>= obj;
265
266 trace_off();
267
269 }
270
271};
272
273template <>
274boost::shared_ptr<PhysicalEquations>
276 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
277 return boost::make_shared<MatNeohookean<3>>(mat_ops_data_ptr, tag);
278}
279
280template <>
281boost::shared_ptr<PhysicalEquations>
283 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
284 return boost::make_shared<MatNeohookean<2>>(mat_ops_data_ptr, tag);
285}
286
287template <>
288boost::shared_ptr<PhysicalEquations>
290 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
291 return boost::make_shared<TopoDerivativeMatElasticImpl<3>>(mat_ops_data_ptr,
292 tag);
293}
294
295template <>
296boost::shared_ptr<PhysicalEquations>
297createMatOpsPhysicalEquationsPtr<ELASTICITY::TOPO_NEOHOOKEAN,
299 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
300 return boost::make_shared<TopoDerivativeMatElasticImpl<2>>(mat_ops_data_ptr,
301 tag);
302}
303} // namespace MatOps
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
#define FTENSOR_INDEXES(DIM,...)
#define FTENSOR_INDEX(DIM, I)
Kronecker Delta class.
#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 ...
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ 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.
constexpr auto t_kd
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
Definition level_set.cpp:30
FTensor::Index< 'j', 3 > j
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::NEOHOOKEAN, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
@ MODEL_2D_PLANE_STRAIN
Definition MatOps.hpp:172
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::TOPO_NEOHOOKEAN, 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)
constexpr IntegrationType I
FTensor::Index< 'm', 3 > m
static bool useDeformationGradient
std::vector< double > defaultMaterialParameters
MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr=nullptr) override
static constexpr auto defaultLogTag
static constexpr auto blockLogTag
static constexpr auto optionsPrefix
MoFEMErrorCode recordTape() override
MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override
std::vector< std::pair< Range, std::vector< double > > > paramVecByRange
Definition MatOps.hpp:152
boost::shared_ptr< MatOpsData > matOpsDataPtr
Definition MatOps.hpp:154
MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override
MoFEMErrorCode recordTape() override
Deprecated interface functions.