222 {
224
225 int nb_integration_pts = OP::getGaussPts().size2();
226
227 auto get_tag = [&]() {
229 for (
const auto &tag_range_pair : *(
physicalPtr->tagVsRangePtr)) {
230 if (tag_range_pair.second.find(DomainEleOp::getFEEntityHandle()) !=
231 tag_range_pair.second.end()) {
232 return tag_range_pair.first;
233 }
234 }
235 }
236#ifndef NDEBUG
239 "ADOL-C tag not found " +
241 }
242#endif
244 };
245
246 const int current_tag = get_tag();
247 auto *fe_ptr =
const_cast<FEMethod *
>(this->getFEMethod());
249
250 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"Jac")->resize(DIM, DIM,
false);
251 physicalPtr->matOpsDataPtr->getDependentDataPtr(
"Obj")->resize(1,
false);
252 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr(
"dObj")->resize(
253 DIM, DIM, false);
254 auto mat_jac_ptr =
physicalPtr->matOpsDataPtr->getCommonDataPtr(
"Jac");
255 auto mat_grad_ptr =
physicalPtr->matOpsDataPtr->getCommonDataPtr(
"grad");
256 auto mat_var_grad_ptr =
physicalPtr->matOpsDataPtr->getCommonDataPtr(
"var_grad");
257 auto mat_obj_ptr =
physicalPtr->matOpsDataPtr->getCommonDataPtr(
"Obj");
258 auto mat_dObj_ptr =
physicalPtr->matOpsDataPtr->getCommonDataPtr(
"dObj");
259
260#ifndef NDEBUG
261 if (!mat_jac_ptr || !mat_grad_ptr || !mat_var_grad_ptr || !mat_obj_ptr ||
262 !mat_dObj_ptr) {
264 "Missing common data for ADOL-C evaluation");
265 }
266#endif
267
269 auto get_jac_at_pts =
271 *mat_jac_ptr, nb_integration_pts);
272 [[maybe_unused]] auto get_grad_at_pts =
274 *mat_grad_ptr, nb_integration_pts);
275 [[maybe_unused]] auto get_var_grad_at_pts =
277 *mat_var_grad_ptr, nb_integration_pts);
278 auto get_obj_at_pts =
280 *mat_obj_ptr, nb_integration_pts);
281 auto get_dObj_at_pts =
283 *mat_dObj_ptr, nb_integration_pts);
284
288
289 auto t_jac_at_pts = get_jac_at_pts();
290 auto t_obj_at_pts = get_obj_at_pts();
291
292 auto next = [&]() {
293 ++t_jac_at_pts;
294 ++t_obj_at_pts;
295 };
296
297 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
298 auto t_jac = getFTensor2FromPtr<DIM, DIM>(
299 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"Jac")->data().data());
300 t_jac(
i,
J) = t_jac_at_pts(
i,
J);
303 auto t_obj = getFTensor1FromPtr<1, 1>(
304 physicalPtr->matOpsDataPtr->getDependentDataPtr(
"Obj")
305 ->data()
306 .data());
307 t_obj_at_pts(0) = t_obj(0);
308 next();
309 }
310 }
311
317
318 auto t_jac_at_pts = get_jac_at_pts();
319 auto t_dObj_at_pts = get_dObj_at_pts();
320 auto next = [&]() {
321 ++t_jac_at_pts;
322 ++t_dObj_at_pts;
323 };
324
325 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
326 auto t_jac = getFTensor2FromPtr<DIM, DIM>(
327 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"Jac")->data().data());
328 t_jac(
i,
J) = t_jac_at_pts(
i,
J);
331 auto t_dObj = getFTensor2FromPtr<DIM, DIM>(
332 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr(
"dObj")
333 ->data()
334 .data());
335 t_dObj_at_pts(
i,
J) = t_dObj(
i,
J);
336 next();
337 }
338 }
339
341 }
342
344}
#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
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
decltype(GetFTensor2FromMatImpl< Tensor_Dim0, Tensor_Dim1, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2FromMatType
Structure for user loop methods on finite elements.
EntityHandle getFEEntityHandle() const
Get the entity handle of the current finite element.