12 const std::string &domain_fe_name,
const std::string &
out_file_name,
13 std::vector<std::pair<std::string, SmartPetscObj<Vec>>> extra_vectors = {},
14 const std::vector<std::string> &tags_to_transfer = {},
15 const Sev hooke_ops_sev = Sev::verbose) {
16 using namespace MoFEM;
26 auto post_proc_mesh = boost::make_shared<moab::Core>();
27 auto post_proc_begin = boost::make_shared<PostProcBrokenMeshInMoabBaseBegin>(
28 mField, post_proc_mesh);
29 auto post_proc_end = boost::make_shared<PostProcBrokenMeshInMoabBaseEnd>(
30 mField, post_proc_mesh);
32 using DataMapMat = std::map<std::string, boost::shared_ptr<MatrixDouble>>;
34 auto calculate_stress_ops = [&](
auto &ops) {
37 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
38 mField, ops,
"U",
"MAT_ELASTIC", hooke_ops_sev);
40 auto u_ptr = boost::make_shared<MatrixDouble>();
42 auto x_ptr = boost::make_shared<MatrixDouble>();
45 DataMapMat vec_map = {{
"U", u_ptr}, {
"GEOMETRY", x_ptr}};
46 if (!extra_vectors.empty()) {
47 for (
const auto &vec_pair : extra_vectors) {
48 auto extra_ptr = boost::make_shared<MatrixDouble>();
50 "U", extra_ptr, vec_pair.second));
51 vec_map[vec_pair.first] = extra_ptr;
55 DataMapMat sym_map = {{
"STRAIN", common_ptr->getMatStrain()},
56 {
"STRESS", common_ptr->getMatCauchyStress()}};
58 return boost::make_tuple(common_ptr->getMatCauchyStress(), vec_map, sym_map);
61 auto get_tags_on_pmesh = [&](
bool post_proc_skin) {
65 "MAT_ELASTIC", 1, MB_TYPE_INTEGER, tag_mat,
66 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val_int);
68 auto meshset_vec_ptr =
70 std::regex((boost::format(
"%s(.*)") %
"MAT_ELASTIC").str()));
73 std::unique_ptr<Skinner> skin_ptr;
75 skin_ptr = std::make_unique<Skinner>(&mField.
get_moab());
76 auto boundary_meshset =
simple->getBoundaryMeshSet();
81 for (
auto m : meshset_vec_ptr) {
83 CHKERR mField.
get_moab().get_entities_by_handle(
m->getMeshset(), ents_3d,
85 int const id =
m->getMeshsetId();
86 ents_3d = ents_3d.subset_by_dimension(
SPACE_DIM);
89 CHKERR skin_ptr->find_skin(0, ents_3d,
false, skin_faces);
90 ents_3d = intersect(skin_ents, skin_faces);
95 std::vector<Tag> tags{tag_mat};
96 for (
const auto &tag_name : tags_to_transfer) {
98 if (mField.
get_moab().tag_get_handle(tag_name.c_str(), tag) ==
106 auto post_proc_domain = [&](
auto pmesh) {
107 auto post_proc_fe = boost::make_shared<PostProcEleDomain>(mField, pmesh);
108 auto [mat_stress_ptr, vec_map, sym_map] =
109 calculate_stress_ops(post_proc_fe->getOpPtrVector());
110 static_cast<void>(mat_stress_ptr);
112 post_proc_fe->getOpPtrVector().push_back(
new OpPPMap(
113 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
114 vec_map, {}, sym_map));
116 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(
false));
120 auto post_proc_boundary = [&](
auto pmesh) {
121 auto post_proc_fe = boost::make_shared<PostProcEleBdy>(mField, pmesh);
123 post_proc_fe->getOpPtrVector(), {},
"GEOMETRY");
127 auto [mat_stress_ptr, vec_map, sym_map] =
128 calculate_stress_ops(op_loop_side->getOpPtrVector());
129 post_proc_fe->getOpPtrVector().push_back(op_loop_side);
131 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
132 post_proc_fe->getOpPtrVector().push_back(
134 vec_map[
"T"] = mat_traction_ptr;
136 post_proc_fe->getOpPtrVector().push_back(
new OpPPMap(
137 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
138 vec_map, {}, sym_map));
140 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(
true));
144 PetscBool post_proc_skin_only = PETSC_FALSE;
146 post_proc_skin_only = PETSC_TRUE;
148 &post_proc_skin_only, PETSC_NULLPTR);
151 if (post_proc_skin_only == PETSC_FALSE) {
152 pip->getDomainPostProcFE() = post_proc_domain(post_proc_mesh);
154 CHKERR pip->loopDomainPostProc();
157 pip->getBoundaryPostProcFE() = post_proc_boundary(post_proc_mesh);
159 CHKERR pip->loopBoundaryPostProc();