11 const std::string &domain_fe_name,
const std::string &
out_file_name,
12 SmartPetscObj<Vec> extra_vector =
nullptr,
13 const std::string &extra_vector_name =
"",
const Sev hooke_ops_sev = Sev::verbose) {
14 using namespace MoFEM;
24 pip->getDomainRhsFE().reset();
25 pip->getDomainLhsFE().reset();
26 pip->getBoundaryRhsFE().reset();
27 pip->getBoundaryLhsFE().reset();
29 auto post_proc_mesh = boost::make_shared<moab::Core>();
30 auto post_proc_begin = boost::make_shared<PostProcBrokenMeshInMoabBaseBegin>(
31 mField, post_proc_mesh);
32 auto post_proc_end = boost::make_shared<PostProcBrokenMeshInMoabBaseEnd>(
33 mField, post_proc_mesh);
35 using DataMapMat = std::map<std::string, boost::shared_ptr<MatrixDouble>>;
37 auto calculate_stress_ops = [&](
auto &ops) {
40 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
41 mField, ops,
"U",
"MAT_ELASTIC", hooke_ops_sev);
43 auto u_ptr = boost::make_shared<MatrixDouble>();
45 auto x_ptr = boost::make_shared<MatrixDouble>();
48 DataMapMat vec_map = {{
"U", u_ptr}, {
"GEOMETRY", x_ptr}};
49 if (extra_vector && !extra_vector_name.empty()) {
50 auto extra_ptr = boost::make_shared<MatrixDouble>();
52 "U", extra_ptr, extra_vector));
53 vec_map[extra_vector_name] = extra_ptr;
56 DataMapMat sym_map = {{
"STRAIN", common_ptr->getMatStrain()},
57 {
"STRESS", common_ptr->getMatCauchyStress()}};
59 return boost::make_tuple(common_ptr->getMatCauchyStress(), vec_map, sym_map);
62 auto get_tag_id_on_pmesh = [&](
bool post_proc_skin) {
66 "MAT_ELASTIC", 1, MB_TYPE_INTEGER, tag_mat,
67 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val_int);
69 auto meshset_vec_ptr =
71 std::regex((boost::format(
"%s(.*)") %
"MAT_ELASTIC").str()));
74 std::unique_ptr<Skinner> skin_ptr;
76 skin_ptr = std::make_unique<Skinner>(&mField.
get_moab());
77 auto boundary_meshset =
simple->getBoundaryMeshSet();
82 for (
auto m : meshset_vec_ptr) {
84 CHKERR mField.
get_moab().get_entities_by_handle(
m->getMeshset(), ents_3d,
86 int const id =
m->getMeshsetId();
87 ents_3d = ents_3d.subset_by_dimension(
SPACE_DIM);
90 CHKERR skin_ptr->find_skin(0, ents_3d,
false, skin_faces);
91 ents_3d = intersect(skin_ents, skin_faces);
96 return std::vector<Tag>{tag_mat};
99 auto post_proc_domain = [&](
auto pmesh) {
100 auto post_proc_fe = boost::make_shared<PostProcEleDomain>(mField, pmesh);
101 auto [mat_stress_ptr, vec_map, sym_map] =
102 calculate_stress_ops(post_proc_fe->getOpPtrVector());
103 static_cast<void>(mat_stress_ptr);
105 post_proc_fe->getOpPtrVector().push_back(
new OpPPMap(
106 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
107 vec_map, {}, sym_map));
109 post_proc_fe->setTagsToTransfer(get_tag_id_on_pmesh(
false));
113 auto post_proc_boundary = [&](
auto pmesh) {
114 auto post_proc_fe = boost::make_shared<PostProcEleBdy>(mField, pmesh);
116 post_proc_fe->getOpPtrVector(), {},
"GEOMETRY");
120 auto [mat_stress_ptr, vec_map, sym_map] =
121 calculate_stress_ops(op_loop_side->getOpPtrVector());
122 post_proc_fe->getOpPtrVector().push_back(op_loop_side);
124 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
125 post_proc_fe->getOpPtrVector().push_back(
127 vec_map[
"T"] = mat_traction_ptr;
129 post_proc_fe->getOpPtrVector().push_back(
new OpPPMap(
130 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
131 vec_map, {}, sym_map));
133 post_proc_fe->setTagsToTransfer(get_tag_id_on_pmesh(
true));
137 PetscBool post_proc_skin_only = PETSC_FALSE;
139 post_proc_skin_only = PETSC_TRUE;
140 CHKERR PetscOptionsGetBool(PETSC_NULLPTR,
"",
"-post_proc_skin_only",
141 &post_proc_skin_only, PETSC_NULLPTR);
144 if (post_proc_skin_only == PETSC_FALSE) {
145 pip->getDomainRhsFE() = post_proc_domain(post_proc_mesh);
147 pip->getBoundaryRhsFE() = post_proc_boundary(post_proc_mesh);
150 CHKERR DMoFEMPreProcessFiniteElements(dm, post_proc_begin->getFEMethod());
151 CHKERR pip->loopFiniteElements();
152 CHKERR DMoFEMPostProcessFiniteElements(dm, post_proc_end->getFEMethod());