15template <
int DIM,
typename EleOp>
17 bool eval_stress,
bool eval_tangent,
bool update);
19template <
int DIM,
int MODEL_TYPE>
22 boost::shared_ptr<PhysicalEquations> physical_ptr,
bool eval_stress,
23 bool eval_tangent,
bool update) {
25 return createOpImpl<DIM, EleOp>(physical_ptr, eval_stress, eval_tangent,
30boost::shared_ptr<PhysicalEquations>
32 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
33 return boost::make_shared<MatUmatImpl<3, MODEL_3D>>(mat_ops_data_ptr, tag);
37boost::shared_ptr<PhysicalEquations>
39 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
40 return boost::make_shared<MatUmatImpl<2, MODEL_2D_PLANE_STRAIN>>(
41 mat_ops_data_ptr, tag);
45boost::shared_ptr<PhysicalEquations>
47 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
48 return boost::make_shared<MatUmatImpl<2, MODEL_2D_PLANE_STRESS>>(
49 mat_ops_data_ptr, tag);
52template <
int DIM,
typename DomainEleOp>
58 bool eval_stress,
bool eval_tangent,
bool update)
72template <
int DIM,
typename DomainEleOp>
78 int nb_integration_pts = OP::getGaussPts().size2();
80 auto get_tag = [&]() {
81 if (physicalPtr->tagVsRangePtr) {
82 for (
const auto &tag_range_pair : *(physicalPtr->tagVsRangePtr)) {
83 if (tag_range_pair.second.find(DomainEleOp::getFEEntityHandle()) !=
84 tag_range_pair.second.end()) {
85 return tag_range_pair.first;
92 "ADOL-C tag not found " +
93 std::to_string(physicalPtr->tAg));
96 return physicalPtr->tAg;
99 const int current_tag = get_tag();
100 auto *fe_ptr =
const_cast<FEMethod *
>(this->getFEMethod());
103 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->resize(DIM, DIM,
false);
104 physicalPtr->matOpsDataPtr->getDependentDataPtr(
"P")->resize(DIM, DIM,
false);
105 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr(
"P_dF")->resize(
106 DIM * DIM, DIM * DIM,
false);
107 auto mat_grad_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"grad");
108 auto mat_P_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"P");
109 auto mat_P_dF_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"P_dF");
112 if (!mat_grad_ptr || !mat_P_ptr || !mat_P_dF_ptr) {
114 "Missing common data for ADOL-C evaluation");
116 if (mat_grad_ptr->size2() != DIM * DIM) {
118 "Inconsistent size of gradient matrix for ADOL-C evaluation");
120 if (mat_grad_ptr->size1() != nb_integration_pts) {
122 "Inconsistent size of gradient matrix data for ADOL-C evaluation "
124 mat_grad_ptr->size1(), nb_integration_pts);
129 auto get_grad_at_pts =
131 *mat_grad_ptr, nb_integration_pts);
134 *mat_P_ptr, nb_integration_pts);
135 auto get_P_dF_at_pts =
137 DL>::size(*mat_P_dF_ptr, nb_integration_pts);
143 auto t_grad_at_pts = get_grad_at_pts();
144 auto t_P_at_pts = get_P_at_pts();
153 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
154 auto t_F = getFTensor2FromPtr<DIM, DIM>(
155 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->data().data());
156 t_F(
i,
J) = t_grad_at_pts(
i,
J);
157 CHKERR physicalPtr->setParams(fe_ptr, gg);
158 CHKERR physicalPtr->evaluateVariable(current_tag, ent, gg);
159 auto t_P = getFTensor2FromPtr<DIM, DIM>(
160 physicalPtr->matOpsDataPtr->getDependentDataPtr(
"P")->data().data());
161 t_P_at_pts(
i,
J) = t_P(
i,
J);
172 auto t_grad_at_pts = get_grad_at_pts();
173 auto t_P_dF_at_pts = get_P_dF_at_pts();
181 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
182 auto t_F = getFTensor2FromPtr<DIM, DIM>(
183 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->data().data());
184 t_F(
i,
J) = t_grad_at_pts(
i,
J);
185 CHKERR physicalPtr->setParams(fe_ptr, gg);
186 CHKERR physicalPtr->evaluateDerivatives(current_tag, ent, gg);
187 auto t_P_dF = getFTensor4FromPtr<DIM, DIM, DIM, DIM>(
188 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr(
"P_dF")
191 t_P_dF_at_pts(
i,
J,
k,
L) = t_P_dF(
i,
J,
k,
L);
200 auto t_grad_at_pts = get_grad_at_pts();
201 auto next = [&]() { ++t_grad_at_pts; };
203 for (
int gg = 0; gg != nb_integration_pts; ++gg) {
204 auto t_F = getFTensor2FromPtr<DIM, DIM>(
205 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->data().data());
206 t_F(
i,
J) = t_grad_at_pts(
i,
J);
207 CHKERR physicalPtr->setParams(fe_ptr, gg);
208 CHKERR physicalPtr->updateState(current_tag, ent, gg);
216template <
int DIM,
typename EleOp>
218 bool eval_stress,
bool eval_tangent,
bool update) {
220 eval_tangent, update);
225 boost::shared_ptr<PhysicalEquations> physical_ptr,
bool eval_stress,
226 bool eval_tangent,
bool update);
230 boost::shared_ptr<PhysicalEquations> physical_ptr,
bool eval_stress,
231 bool eval_tangent,
bool update);
235 boost::shared_ptr<PhysicalEquations> physical_ptr,
bool eval_stress,
236 bool eval_tangent,
bool update);
Shared UMAT implementation details for built-in and user-defined UMATs.
#define FTENSOR_INDEX(DIM, I)
#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
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
FTensor::Index< 'k', 3 > k
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< UMAT, MODEL_2D_PLANE_STRESS >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< UMAT, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< UMAT, MODEL_2D_PLANE_STRAIN >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
static EleOp * createOpImpl(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent, bool update)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
decltype(GetFTensor4FromMatImpl< Tensor_Dim0, Tensor_Dim1, Tensor_Dim2, Tensor_Dim3, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor4FromMatType
decltype(GetFTensor2FromMatImpl< Tensor_Dim0, Tensor_Dim1, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2FromMatType
ForcesAndSourcesCore::UserDataOperator * createOp(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent, bool update) override
OpEvalMatUmatMaterialImpl(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent, bool update)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
boost::shared_ptr< PhysicalEquations > physicalPtr
Data on single entity (This is passed as argument to DataOperator::doWork)
Structure for user loop methods on finite elements.
EntityHandle getFEEntityHandle() const
Get the entity handle of the current finite element.