3507 {
3509
3510#ifndef NDEBUG
3511 auto fe_mi_ptr = getFEMethod()->numeredEntFiniteElementPtr;
3512 auto pstatus = fe_mi_ptr->getPStatus();
3513 if (pstatus) {
3514 auto owner = fe_mi_ptr->getOwnerProc();
3516 << "OpFaceMaterialForce: owner proc is not 0, owner proc: " << owner
3517 << " " << getPtrFE()->mField.get_comm_rank();
3518 }
3519#endif
3520
3522
3525 double face_pressure = 0.;
3526 auto t_T = getFTensor1FromMat<SPACE_DIM>(
3528 auto t_p =
3530 auto t_w = getFTensor0IntegrationWeight();
3531 for (auto gg = 0; gg != getGaussPts().size2(); ++gg) {
3532 t_face_T(
I) += t_w * t_T(
I);
3533 face_pressure += t_w * t_p;
3534 ++t_w;
3535 ++t_T;
3536 ++t_p;
3537 }
3538 t_face_T(
I) *= getMeasure();
3539 face_pressure *= getMeasure();
3540
3541 auto get_tag = [&](auto name, auto dim) {
3542 auto &moab = getPtrFE()->mField.get_moab();
3544 double def_val[] = {0., 0., 0.};
3545 CHK_MOAB_THROW(moab.tag_get_handle(name, dim, MB_TYPE_DOUBLE, tag,
3546 MB_TAG_CREAT | MB_TAG_SPARSE, def_val),
3547 "create tag");
3548 return tag;
3549 };
3550
3551 auto set_tag = [&](auto &&tag, auto ptr) {
3552 auto &moab = getPtrFE()->mField.get_moab();
3553 auto face = getPtrFE()->getFEEntityHandle();
3554 CHK_MOAB_THROW(moab.tag_set_data(tag, &face, 1, ptr),
"set tag");
3555 };
3556
3557 set_tag(get_tag("MaterialForce", 3), &t_face_T(0));
3558 set_tag(get_tag("FacePressure", 1), &face_pressure);
3559
3561}
#define FTENSOR_INDEX(DIM, I)
constexpr int SPACE_DIM
[Define dimension]
#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.
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MOFEM_LOG(channel, severity)
Log.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
constexpr IntegrationType I