v0.16.0
Loading...
Searching...
No Matches
MatMooneyRivlinWriggersEq63.cpp
Go to the documentation of this file.
1/**
2 * @file MatMooneyRivlinWriggersEq63.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 {
13
14template <int DIM>
16 using MatElasticImpl<DIM>::MatElasticImpl;
17
19
20 MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr = nullptr) override {
22
23 MOFEM_LOG_CHANNEL("WORLD");
24
25 PetscOptionsBegin(PETSC_COMM_WORLD, "mooneyrivlin_", "", "none");
26 CHKERR PetscOptionsScalar("-alpha", "Alpha", "", alpha, &alpha,
27 PETSC_NULLPTR);
28 CHKERR PetscOptionsScalar("-beta", "Beta", "", beta, &beta, PETSC_NULLPTR);
29
30 CHKERR PetscOptionsScalar("-lambda", "Lambda", "", lambda, &lambda,
31 PETSC_NULLPTR);
32
33 CHKERR PetscOptionsScalar("-epsilon", "Epsilon", "", epsilon, &epsilon,
34 PETSC_NULLPTR);
35 PetscOptionsEnd();
36
37 MOFEM_TAG_AND_LOG("WORLD", Sev::inform, "Default Mooney-Rivlin parameters:")
38 << " alpha = " << alpha << " beta = " << beta << " lambda = " << lambda
39 << " epsilon = " << epsilon;
41
42 std::string block_name = "MAT_MOONEY_RIVLIN";
43
44 for (auto &m :
45
46 m_field_ptr->getInterface<MeshsetsManager>()->
47
48 getCubitMeshsetPtr(
49 std::regex((boost::format("%s(.*)") % block_name).str()))
50
51 ) {
52
53 std::vector<double> block_data;
54 CHKERR m->getAttributes(block_data);
55 if (block_data.size() < 4) {
57 "Expected that block has four attributes (alpha, "
58 "beta, lambda, epsilon), but given " +
59 std::to_string(block_data.size()));
60 }
61 auto get_block_ents = [&]() {
62 Range ents;
63 CHK_MOAB_THROW(m_field_ptr->get_moab().get_entities_by_handle(
64 m->meshset, ents, true),
65 "can not get block entities");
66 return ents;
67 };
68
69 A::paramVecByRange.push_back(
70 {get_block_ents(),
71 {block_data[0], block_data[1], block_data[2], block_data[3]}});
72
73 MOFEM_TAG_AND_LOG("WORLD", Sev::inform, "MatBlock for Mooney-Rivlin")
74 << *m << " alpha = " << block_data[0] << " beta = " << block_data[1]
75 << " lambda = " << block_data[2] << " epsilon = " << block_data[3];
76 }
77
79 };
80
81 MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override {
82 (void)gg;
83 const auto ent = fe_ptr->getFEEntityHandle();
84 for (auto &[range, param_vec] : A::paramVecByRange) {
85 if (std::find(range.begin(), range.end(), ent) != range.end()) {
86 set_param_vec(A::tAg, param_vec.size(), param_vec.data());
87 return 0;
88 }
89 }
90 set_param_vec(A::tAg, defaultMaterialParameters.size(),
92 return 0;
93 }
94
95 MoFEMErrorCode recordTape() override {
97
98 A::matOpsDataPtr->insertCommonData("grad", MatrixDouble());
99 A::matOpsDataPtr->insertCommonData("P", MatrixDouble());
100 A::matOpsDataPtr->insertCommonData("P_dF", MatrixDouble());
101
102 A::matOpsDataPtr->insertActiveData("F", MatrixDouble());
103 A::matOpsDataPtr->insertDependentData("P", MatrixDouble());
104 A::matOpsDataPtr->insertDependentDerivativesData("P_dF", MatrixDouble());
105
106 A::matOpsDataPtr->getActiveDataPtr("F")->resize(DIM, DIM, false);
107 A::matOpsDataPtr->getDependentDataPtr("P")->resize(DIM, DIM, false);
108
109 auto t_F = getFTensor2FromPtr<DIM, DIM>(
110 A::matOpsDataPtr->getActiveDataPtr("F")->data().data());
111 auto t_P = getFTensor2FromPtr<DIM, DIM>(
112 A::matOpsDataPtr->getDependentDataPtr("P")->data().data());
113
115
116 FTENSOR_INDEX(DIM, i);
117 FTENSOR_INDEX(DIM, j);
118 FTENSOR_INDEX(DIM, I);
119 FTENSOR_INDEX(DIM, J);
120 FTENSOR_INDEX(DIM, k);
121 FTENSOR_INDEX(DIM, K);
122
123 t_F(i, J) = 0;
124
130 adouble ta_Bj, A, B;
131
132 adouble det_aF;
134
135 trace_on(A::tAg);
136 auto p_alpha = mkparam(alpha);
137 auto p_beta = mkparam(beta);
138 auto p_lambda = mkparam(lambda);
139 auto p_epsilon = mkparam(epsilon);
140
141 ta_F(i, J) <<= t_F(i, J);
142 // assume that gradient from approximated displacement, that why we add diagonal
144 ta_F(i, J) += t_kd(i, J);
145 }
146
147 det_aF = determinantTensor(ta_F);
148 CHKERR invertTensor(ta_F, det_aF, ta_invF);
149
150 ta_Cof(i, I) = det_aF * ta_invF(I, i);
151
152 A = ta_F(k, K) * ta_F(k, K);
153 B = ta_Cof(k, K) * ta_Cof(k, K);
154
155 ta_BF(i, I) = 4 * alpha * (A * ta_F(i, I));
156 ta_BCof(i, I) = 4 * beta * (B * ta_Cof(i, I));
157 ta_Bj = (-12 * alpha - 24 * beta) / det_aF +
158 0.5 * (lambda / epsilon) *
159 (pow(det_aF, epsilon - 1) - pow(det_aF, -epsilon - 1));
160
161 ta_P(i, I) = ta_BF(i, I);
162 ta_P(i, I) += (levi_civita(i, j, k) * ta_BCof(j, J)) *
163 (levi_civita(I, J, K) * ta_F(k, K));
164 ta_P(i, I) += ta_Cof(i, I) * ta_Bj;
165
166 // Set dependent variables to ADOL-C
167 ta_P(i, I) >>= t_P(i, I);
168
169 trace_off();
170
172 }
173
174protected:
175 double alpha = 1;
176 double beta = 1;
177 double lambda = 1;
178 double epsilon = 0;
179 std::vector<double> defaultMaterialParameters = {alpha, beta, lambda,
180 epsilon};
181};
182
183template <>
184boost::shared_ptr<PhysicalEquations>
186 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
187 return boost::make_shared<MatMooneyRivlinWriggersEq63<3>>(mat_ops_data_ptr,
188 tag);
189}
190
191template <>
192boost::shared_ptr<PhysicalEquations>
193createMatOpsPhysicalEquationsPtr<ELASTICITY::MOONEYRIVLINWRIGGERSEQ63,
195 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
196 return boost::make_shared<MatMooneyRivlinWriggersEq63<2>>(mat_ops_data_ptr,
197 tag);
198}
199} // namespace MatOps
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
#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
FTensor::Index< 'k', 3 > k
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::MOONEYRIVLINWRIGGERSEQ63, 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)
constexpr IntegrationType I
FTensor::Index< 'm', 3 > m
static bool useDeformationGradient
MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr=nullptr) 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
Deprecated interface functions.