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 pip->getDomainRhsFE().reset();
27 pip->getDomainLhsFE().reset();
28 pip->getBoundaryRhsFE().reset();
29 pip->getBoundaryLhsFE().reset();
31 auto post_proc_mesh = boost::make_shared<moab::Core>();
32 auto post_proc_begin = boost::make_shared<PostProcBrokenMeshInMoabBaseBegin>(
33 mField, post_proc_mesh);
34 auto post_proc_end = boost::make_shared<PostProcBrokenMeshInMoabBaseEnd>(
35 mField, post_proc_mesh);
37 using DataMapMat = std::map<std::string, boost::shared_ptr<MatrixDouble>>;
39 auto calculate_stress_ops = [&](
auto &ops) {
42 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
43 mField, ops,
"U",
"MAT_ELASTIC", hooke_ops_sev);
45 auto u_ptr = boost::make_shared<MatrixDouble>();
47 auto x_ptr = boost::make_shared<MatrixDouble>();
50 DataMapMat vec_map = {{
"U", u_ptr}, {
"GEOMETRY", x_ptr}};
51 if (!extra_vectors.empty()) {
52 for (
const auto &vec_pair : extra_vectors) {
53 auto extra_ptr = boost::make_shared<MatrixDouble>();
55 "U", extra_ptr, vec_pair.second));
56 vec_map[vec_pair.first] = extra_ptr;
60 DataMapMat sym_map = {{
"STRAIN", common_ptr->getMatStrain()},
61 {
"STRESS", common_ptr->getMatCauchyStress()}};
63 return boost::make_tuple(common_ptr->getMatCauchyStress(), vec_map, sym_map);
66 auto get_tags_on_pmesh = [&](
bool post_proc_skin) {
70 "MAT_ELASTIC", 1, MB_TYPE_INTEGER, tag_mat,
71 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val_int);
73 auto meshset_vec_ptr =
75 std::regex((boost::format(
"%s(.*)") %
"MAT_ELASTIC").str()));
78 std::unique_ptr<Skinner> skin_ptr;
80 skin_ptr = std::make_unique<Skinner>(&mField.
get_moab());
81 auto boundary_meshset =
simple->getBoundaryMeshSet();
86 for (
auto m : meshset_vec_ptr) {
88 CHKERR mField.
get_moab().get_entities_by_handle(
m->getMeshset(), ents_3d,
90 int const id =
m->getMeshsetId();
91 ents_3d = ents_3d.subset_by_dimension(
SPACE_DIM);
94 CHKERR skin_ptr->find_skin(0, ents_3d,
false, skin_faces);
95 ents_3d = intersect(skin_ents, skin_faces);
100 std::vector<Tag> tags{tag_mat};
101 for (
const auto &tag_name : tags_to_transfer) {
103 if (mField.
get_moab().tag_get_handle(tag_name.c_str(), tag) ==
111 auto post_proc_domain = [&](
auto pmesh) {
112 auto post_proc_fe = boost::make_shared<PostProcEleDomain>(mField, pmesh);
113 auto [mat_stress_ptr, vec_map, sym_map] =
114 calculate_stress_ops(post_proc_fe->getOpPtrVector());
115 static_cast<void>(mat_stress_ptr);
117 post_proc_fe->getOpPtrVector().push_back(
new OpPPMap(
118 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
119 vec_map, {}, sym_map));
121 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(
false));
125 auto post_proc_boundary = [&](
auto pmesh) {
126 auto post_proc_fe = boost::make_shared<PostProcEleBdy>(mField, pmesh);
128 post_proc_fe->getOpPtrVector(), {},
"GEOMETRY");
132 auto [mat_stress_ptr, vec_map, sym_map] =
133 calculate_stress_ops(op_loop_side->getOpPtrVector());
134 post_proc_fe->getOpPtrVector().push_back(op_loop_side);
136 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
137 post_proc_fe->getOpPtrVector().push_back(
139 vec_map[
"T"] = mat_traction_ptr;
141 post_proc_fe->getOpPtrVector().push_back(
new OpPPMap(
142 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
143 vec_map, {}, sym_map));
145 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(
true));
149 PetscBool post_proc_skin_only = PETSC_FALSE;
151 post_proc_skin_only = PETSC_TRUE;
153 &post_proc_skin_only, PETSC_NULLPTR);
156 if (post_proc_skin_only == PETSC_FALSE) {
157 pip->getDomainRhsFE() = post_proc_domain(post_proc_mesh);
159 pip->getBoundaryRhsFE() = post_proc_boundary(post_proc_mesh);
163 CHKERR pip->loopFiniteElements();