v0.15.5
Loading...
Searching...
No Matches
AdolCElastic.cpp
Go to the documentation of this file.
1/**
2 * @file AdolCElastic.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
12#include <MoFEM.hpp>
13
14using namespace MoFEM;
15
16#include "AdolCOps.hpp"
17#include "AdolCElastic.hpp"
18
19namespace AdolCOps {
20
21template <int DIM> struct AdolCElasticImpl : public PhysicalEquations {
23
25 createOp(boost::shared_ptr<PhysicalEquations> physical_ptr, bool eval_stress,
26 bool eval_tangent) override;
27
28protected:
29};
30
31template <int DIM, typename DomainEleOp>
33
34 using OP = DomainEleOp;
35
37 boost::shared_ptr<PhysicalEquations> physical_ptr, bool eval_stress,
38 bool eval_tangent, bool add_diagonal = false)
39 : DomainEleOp(NOSPACE, DomainEleOp::OPSPACE), physicalPtr(physical_ptr),
40 evalStress(eval_stress), evalTangent(eval_tangent) {}
41
42 MoFEMErrorCode doWork(int side, EntityType type, EntData &data);
43
44protected:
45 boost::shared_ptr<PhysicalEquations> physicalPtr;
46 const bool evalStress;
47 const bool evalTangent;
48};
49
50template <int DIM, typename DomainEleOp>
52 int side, EntityType type, EntData &data) {
54
55 int nb_integration_pts = OP::getGaussPts().size2();
56
57 constexpr int adolc_return_value = 0;
58
59 auto physics_ptr = physicalPtr;
60
61 auto get_tag = [&]() {
62 if (physics_ptr->tagVsRangePtr) {
63 for (const auto &tag_range_pair : *physics_ptr->tagVsRangePtr) {
64 if (tag_range_pair.second.find(DomainEleOp::getFEEntityHandle()) !=
65 tag_range_pair.second.end()) {
66 return tag_range_pair.first;
67 }
68 }
69 }
70 return physics_ptr->tAg; // Default tag if no range matches
71 };
72
73 auto mat_grad_ptr = physics_ptr->adolcDataPtr->getCommonDataPtr("grad");
74 auto mat_P_ptr = physics_ptr->adolcDataPtr->getCommonDataPtr("P");
75 auto mat_P_dF_ptr = physics_ptr->adolcDataPtr->getCommonDataPtr("P_dF");
76
77#ifndef NDEBUG
78 if (!mat_grad_ptr || !mat_P_ptr || !mat_P_dF_ptr) {
79 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
80 "Missing common data for ADOL-C evaluation");
81 }
82 if (mat_grad_ptr->size1() != DIM * DIM) {
83 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
84 "Inconsistent size of gradient matrix for ADOL-C evaluation");
85 }
86 if (mat_grad_ptr->size2() != nb_integration_pts) {
87 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
88 "Inconsistent size of gradient matrix data for ADOL-C evaluation "
89 "%lu != %lu",
90 mat_grad_ptr->size2(), nb_integration_pts);
91 }
92#endif
93
94 if (evalStress) {
95 FTENSOR_INDEX(DIM, i);
96 FTENSOR_INDEX(DIM, J);
97
98 auto t_grad_at_pts = getFTensor2FromMat<DIM, DIM>(*mat_grad_ptr);
99 mat_P_ptr->resize(DIM * DIM, nb_integration_pts, false);
100 auto t_P_at_pts = getFTensor2FromMat<DIM, DIM>(*mat_P_ptr);
101
102 auto next = [&]() {
103 ++t_grad_at_pts;
104 ++t_P_at_pts;
105 };
106
108
109 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
110 auto t_F = getFTensor2FromPtr<DIM, DIM>(
111 physics_ptr->adolcDataPtr->getActiveDataPtr("F")->data().data());
112 t_F(i, J) = t_grad_at_pts(i, J);
113 CHKERR physics_ptr->setActiveContinuousVector();
114 CHKERR physics_ptr->setDependentContinuousVector();
115 CHKERR physics_ptr->setParams(this->getFEEntityHandle(), gg);
116 int r = ::function(get_tag(), physics_ptr->dependentVariables.size(),
117 physics_ptr->activeVariables.size(),
118 physics_ptr->activeVariables.data(),
119 physics_ptr->dependentVariables.data());
120 if (PetscUnlikely(r < adolc_return_value)) {
121 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
122 "ADOL-C function evaluation with error");
123 }
124 CHKERR physics_ptr->getDependentContinuousVector();
125 auto t_P = getFTensor2FromPtr<DIM, DIM>(
126 physics_ptr->adolcDataPtr->getDependentDataPtr("P")->data().data());
127 t_P_at_pts(i, J) = t_P(i, J);
128 next();
129 }
130 }
131
132 if (evalTangent) {
133 FTENSOR_INDEX(DIM, i);
134 FTENSOR_INDEX(DIM, J);
135 FTENSOR_INDEX(DIM, k);
136 FTENSOR_INDEX(DIM, L);
137
138 const int number_of_active_variables = physics_ptr->activeVariables.size();
139 const int number_of_dependent_variables =
140 physics_ptr->dependentVariables.size();
141 CHKERR physics_ptr->setDependentDerivativesContinuousVector();
142 std::vector<double *> jac_ptr(number_of_dependent_variables);
143 for (unsigned int n = 0; n != number_of_dependent_variables; ++n) {
144 jac_ptr[n] = &(
145 physics_ptr
146 ->dependentVariablesDerivatives[n * number_of_active_variables]);
147 }
148 auto t_grad_at_pts = getFTensor2FromMat<DIM, DIM>(*mat_grad_ptr);
149 mat_P_dF_ptr->resize(DIM * DIM * DIM * DIM, nb_integration_pts, false);
150 auto t_P_dF_at_pts =
151 getFTensor4FromMat<DIM, DIM, DIM, DIM, 1>(*mat_P_dF_ptr);
153
154 auto next = [&]() {
155 ++t_grad_at_pts;
156 ++t_P_dF_at_pts;
157 };
158
159 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
160 auto t_F = getFTensor2FromPtr<DIM, DIM>(
161 physics_ptr->adolcDataPtr->getActiveDataPtr("F")->data().data());
162 t_F(i, J) = t_grad_at_pts(i, J);
163 CHKERR physics_ptr->setActiveContinuousVector();
164 CHKERR physics_ptr->setDependentContinuousVector();
165 CHKERR physics_ptr->setParams(this->getFEEntityHandle(), gg);
166 int r = ::jacobian(get_tag(), number_of_dependent_variables,
167 number_of_active_variables,
168 physics_ptr->activeVariables.data(), jac_ptr.data());
169 if (PetscUnlikely(r < adolc_return_value)) {
170 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
171 "ADOL-C function evaluation with error");
172 }
173 CHKERR physics_ptr->getDependentDerivativesContinuousVector();
174 auto t_P_dF = getFTensor4FromPtr<DIM, DIM, DIM, DIM>(
175 physics_ptr->adolcDataPtr->getDependentDerivativesDataPtr("P_dF")
176 ->data()
177 .data());
178 t_P_dF_at_pts(i, J, k, L) = t_P_dF(i, J, k, L);
179 next();
180 }
181 }
182
184}
185
186template <int DIM, typename EleOp>
187static EleOp *createOpImpl(boost::shared_ptr<PhysicalEquations> physical_ptr,
188 bool eval_stress, bool eval_tangent) {
190 physical_ptr, eval_stress, eval_tangent);
191}
192
193template <>
195AdolCElasticImpl<3>::createOp(boost::shared_ptr<PhysicalEquations> physical_ptr,
196 bool eval_stress, bool eval_tangent) {
198 return createOpImpl<3, EleOp>(physical_ptr, eval_stress, eval_tangent);
199}
200
201template <>
203AdolCElasticImpl<2>::createOp(boost::shared_ptr<PhysicalEquations> physical_ptr,
204 bool eval_stress, bool eval_tangent) {
206 return createOpImpl<2, EleOp>(physical_ptr, eval_stress, eval_tangent);
207}
208
209} // namespace AdolCOps
210
211#include "AdolCNeohookean.cpp"
212#include "AdolCMetaElastic.cpp"
ADOL-C implementation of the volume-length quality material.
#define FTENSOR_INDEX(DIM, I)
Kronecker Delta class.
@ NOSPACE
Definition definitions.h:83
#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.
constexpr auto t_kd
FTensor::Index< 'i', SPACE_DIM > i
const double n
refractive index of diffusive medium
FTensor::Index< 'J', DIM1 > J
Definition level_set.cpp:30
FTensor::Index< 'k', 3 > k
static EleOp * createOpImpl(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
ForcesAndSourcesCore::UserDataOperator * createOp(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent) override
boost::shared_ptr< PhysicalEquations > physicalPtr
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpEvalAdolCSimpleMaterialImpl(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent, bool add_diagonal=false)
Data on single entity (This is passed as argument to DataOperator::doWork)