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 auto get_block_ents = [&]() {
56 Range ents;
57 CHK_MOAB_THROW(m_field_ptr->get_moab().get_entities_by_handle(
58 m->meshset, ents, true),
59 "can not get block entities");
60 return ents;
61 };
62
63 CHKERR addBlockParameters(*m_field_ptr, m->getName(),
64 m->getMeshsetId(), get_block_ents(),
65 block_data);
66 }
67
69 };
70
72 addBlockParameters(MoFEM::Interface &, const std::string &block_name, int,
73 const Range &block_entities,
74 const std::vector<double> &block_data) override {
76
77 if (block_data.size() < 4) {
79 "Expected that block has four attributes (alpha, "
80 "beta, lambda, epsilon), but given " +
81 std::to_string(block_data.size()));
82 }
83 std::vector<double> params = {block_data[0], block_data[1], block_data[2],
84 block_data[3]};
85
86 A::paramVecByRange.push_back({block_entities, params});
87
88 MOFEM_TAG_AND_LOG("WORLD", Sev::inform, "MatBlock for Mooney-Rivlin")
89 << block_name << " alpha = " << params[0] << " beta = " << params[1]
90 << " lambda = " << params[2] << " epsilon = " << params[3];
91
93 }
94
95 MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override {
96 (void)gg;
97 const auto ent = fe_ptr->getFEEntityHandle();
98 for (auto &[range, param_vec] : A::paramVecByRange) {
99 if (std::find(range.begin(), range.end(), ent) != range.end()) {
100 set_param_vec(A::tAg, param_vec.size(), param_vec.data());
101 return 0;
102 }
103 }
104 set_param_vec(A::tAg, defaultMaterialParameters.size(),
106 return 0;
107 }
108
111
112 A::matOpsDataPtr->insertCommonData("grad", MatrixDouble());
113 A::matOpsDataPtr->insertCommonData("P", MatrixDouble());
114 A::matOpsDataPtr->insertCommonData("P_dF", MatrixDouble());
115
116 A::matOpsDataPtr->insertActiveData("F", MatrixDouble());
117 A::matOpsDataPtr->insertDependentData("P", MatrixDouble());
118 A::matOpsDataPtr->insertDependentDerivativesData("P_dF", MatrixDouble());
119
120 A::matOpsDataPtr->getActiveDataPtr("F")->resize(DIM, DIM, false);
121 A::matOpsDataPtr->getDependentDataPtr("P")->resize(DIM, DIM, false);
122
123 auto t_F = getFTensor2FromPtr<DIM, DIM>(
124 A::matOpsDataPtr->getActiveDataPtr("F")->data().data());
125 auto t_P = getFTensor2FromPtr<DIM, DIM>(
126 A::matOpsDataPtr->getDependentDataPtr("P")->data().data());
127
129
130 FTENSOR_INDEX(DIM, i);
131 FTENSOR_INDEX(DIM, j);
132 FTENSOR_INDEX(DIM, I);
133 FTENSOR_INDEX(DIM, J);
134 FTENSOR_INDEX(DIM, k);
135 FTENSOR_INDEX(DIM, K);
136
137 t_F(i, J) = 0;
138
144 adouble ta_Bj, A, B;
145
146 adouble det_aF;
148
149 trace_on(A::tAg);
150 auto p_alpha = mkparam(alpha);
151 auto p_beta = mkparam(beta);
152 auto p_lambda = mkparam(lambda);
153 auto p_epsilon = mkparam(epsilon);
154
155 ta_F(i, J) <<= t_F(i, J);
156 // assume that gradient from approximated displacement, that why we add diagonal
158 ta_F(i, J) += t_kd(i, J);
159 }
160
161 det_aF = determinantTensor(ta_F);
162 CHKERR invertTensor(ta_F, det_aF, ta_invF);
163
164 ta_Cof(i, I) = det_aF * ta_invF(I, i);
165
166 A = ta_F(k, K) * ta_F(k, K);
167 B = ta_Cof(k, K) * ta_Cof(k, K);
168
169 ta_BF(i, I) = 4 * alpha * (A * ta_F(i, I));
170 ta_BCof(i, I) = 4 * beta * (B * ta_Cof(i, I));
171 ta_Bj = (-12 * alpha - 24 * beta) / det_aF +
172 0.5 * (lambda / epsilon) *
173 (pow(det_aF, epsilon - 1) - pow(det_aF, -epsilon - 1));
174
175 ta_P(i, I) = ta_BF(i, I);
176 ta_P(i, I) += (levi_civita(i, j, k) * ta_BCof(j, J)) *
177 (levi_civita(I, J, K) * ta_F(k, K));
178 ta_P(i, I) += ta_Cof(i, I) * ta_Bj;
179
180 // Set dependent variables to ADOL-C
181 ta_P(i, I) >>= t_P(i, I);
182
183 trace_off();
184
186 }
187
188protected:
189 double alpha = 1;
190 double beta = 1;
191 double lambda = 1;
192 double epsilon = 0;
193 std::vector<double> defaultMaterialParameters = {alpha, beta, lambda,
194 epsilon};
195};
196
197template <>
198boost::shared_ptr<PhysicalEquations>
200 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
201 return boost::make_shared<MatMooneyRivlinWriggersEq63<3>>(mat_ops_data_ptr,
202 tag);
203}
204
205template <>
206boost::shared_ptr<PhysicalEquations>
207createMatOpsPhysicalEquationsPtr<ELASTICITY::MOONEYRIVLINWRIGGERSEQ63,
209 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag) {
210 return boost::make_shared<MatMooneyRivlinWriggersEq63<2>>(mat_ops_data_ptr,
211 tag);
212}
213} // 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:182
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasMatrix< double > MatrixDouble
Definition Types.hpp:77
static MoFEMErrorCode invertTensor(FTensor::Tensor2< T1, DIM, DIM > &t, T2 &det, FTensor::Tensor2< T3, DIM, DIM > &inv_t)
static auto determinantTensor(FTensor::Tensor2< T, DIM, DIM > &t)
Calculate the determinant of a tensor of rank DIM.
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
MoFEMErrorCode addBlockParameters(MoFEM::Interface &, const std::string &block_name, int, const Range &block_entities, const std::vector< double > &block_data) override
std::vector< std::pair< Range, std::vector< double > > > paramVecByRange
Definition MatOps.hpp:162
boost::shared_ptr< MatOpsData > matOpsDataPtr
Definition MatOps.hpp:164
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.