v0.16.0
Loading...
Searching...
No Matches
ElasticPostProc.hpp
Go to the documentation of this file.
1#ifndef __ELASTIC_POST_PROC_HPP__
2#define __ELASTIC_POST_PROC_HPP__
3
4#include <HookeOps.hpp>
5
6namespace ElasticPostProc {
7
8template <int SPACE_DIM, typename DomainEle, typename BoundaryEle,
9 typename SideEle>
11 MoFEM::Interface &mField, SmartPetscObj<DM> dm,
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;
18
19 auto simple = mField.getInterface<Simple>();
20 auto pip = mField.getInterface<PipelineManager>();
21
25
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);
31
32 using DataMapMat = std::map<std::string, boost::shared_ptr<MatrixDouble>>;
33
34 auto calculate_stress_ops = [&](auto &ops) {
36
37 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
38 mField, ops, "U", "MAT_ELASTIC", hooke_ops_sev);
39
40 auto u_ptr = boost::make_shared<MatrixDouble>();
41 ops.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
42 auto x_ptr = boost::make_shared<MatrixDouble>();
43 ops.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", x_ptr));
44
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;
52 }
53 }
54
55 DataMapMat sym_map = {{"STRAIN", common_ptr->getMatStrain()},
56 {"STRESS", common_ptr->getMatCauchyStress()}};
57
58 return boost::make_tuple(common_ptr->getMatCauchyStress(), vec_map, sym_map);
59 };
60
61 auto get_tags_on_pmesh = [&](bool post_proc_skin) {
62 int def_val_int = 0;
63 Tag tag_mat;
64 CHKERR mField.get_moab().tag_get_handle(
65 "MAT_ELASTIC", 1, MB_TYPE_INTEGER, tag_mat,
66 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val_int);
67
68 auto meshset_vec_ptr =
69 mField.getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
70 std::regex((boost::format("%s(.*)") % "MAT_ELASTIC").str()));
71
72 Range skin_ents;
73 std::unique_ptr<Skinner> skin_ptr;
74 if (post_proc_skin) {
75 skin_ptr = std::make_unique<Skinner>(&mField.get_moab());
76 auto boundary_meshset = simple->getBoundaryMeshSet();
77 CHKERR mField.get_moab().get_entities_by_handle(boundary_meshset,
78 skin_ents, true);
79 }
80
81 for (auto m : meshset_vec_ptr) {
82 Range ents_3d;
83 CHKERR mField.get_moab().get_entities_by_handle(m->getMeshset(), ents_3d,
84 true);
85 int const id = m->getMeshsetId();
86 ents_3d = ents_3d.subset_by_dimension(SPACE_DIM);
87 if (post_proc_skin) {
88 Range skin_faces;
89 CHKERR skin_ptr->find_skin(0, ents_3d, false, skin_faces);
90 ents_3d = intersect(skin_ents, skin_faces);
91 }
92 CHKERR mField.get_moab().tag_clear_data(tag_mat, ents_3d, &id);
93 }
94
95 std::vector<Tag> tags{tag_mat};
96 for (const auto &tag_name : tags_to_transfer) {
97 Tag tag = 0;
98 if (mField.get_moab().tag_get_handle(tag_name.c_str(), tag) ==
99 MB_SUCCESS) {
100 tags.push_back(tag);
101 }
102 }
103 return tags;
104 };
105
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);
111
112 post_proc_fe->getOpPtrVector().push_back(new OpPPMap(
113 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
114 vec_map, {}, sym_map));
115
116 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(false));
117 return post_proc_fe;
118 };
119
120 auto post_proc_boundary = [&](auto pmesh) {
121 auto post_proc_fe = boost::make_shared<PostProcEleBdy>(mField, pmesh);
123 post_proc_fe->getOpPtrVector(), {}, "GEOMETRY");
124
125 auto op_loop_side =
126 new OpLoopSide<SideEle>(mField, domain_fe_name, SPACE_DIM);
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);
130
131 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
132 post_proc_fe->getOpPtrVector().push_back(
133 new ElasticOps::OpCalculateTraction(mat_stress_ptr, mat_traction_ptr));
134 vec_map["T"] = mat_traction_ptr;
135
136 post_proc_fe->getOpPtrVector().push_back(new OpPPMap(
137 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
138 vec_map, {}, sym_map));
139
140 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(true));
141 return post_proc_fe;
142 };
143
144 PetscBool post_proc_skin_only = PETSC_FALSE;
145 if (SPACE_DIM == 3) {
146 post_proc_skin_only = PETSC_TRUE;
147 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, "", "-post_proc_skin_only",
148 &post_proc_skin_only, PETSC_NULLPTR);
149 }
150
151 if (post_proc_skin_only == PETSC_FALSE) {
152 pip->getDomainPostProcFE() = post_proc_domain(post_proc_mesh);
153 CHKERR DMoFEMPreProcessFiniteElements(dm, post_proc_begin->getFEMethod());
154 CHKERR pip->loopDomainPostProc();
155 CHKERR DMoFEMPostProcessFiniteElements(dm, post_proc_end->getFEMethod());
156 } else {
157 pip->getBoundaryPostProcFE() = post_proc_boundary(post_proc_mesh);
158 CHKERR DMoFEMPreProcessFiniteElements(dm, post_proc_begin->getFEMethod());
159 CHKERR pip->loopBoundaryPostProc();
160 CHKERR DMoFEMPostProcessFiniteElements(dm, post_proc_end->getFEMethod());
161 }
162
163 CHKERR post_proc_end->writeFile(out_file_name);
165}
166
167} // namespace ElasticPostProc
168
169#endif // __ELASTIC_POST_PROC_HPP__
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition acoustic.cpp:69
constexpr int SPACE_DIM
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
@ H1
continuous field
Definition definitions.h:85
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PostProcEleByDim< SPACE_DIM >::PostProcEleDomain PostProcEleDomain
PostProcEleByDim< SPACE_DIM >::PostProcEleBdy PostProcEleBdy
PetscErrorCode DMoFEMPostProcessFiniteElements(DM dm, MoFEM::FEMethod *method)
execute finite element method for each element in dm (problem)
Definition DMMoFEM.cpp:546
PetscErrorCode DMoFEMPreProcessFiniteElements(DM dm, MoFEM::FEMethod *method)
execute finite element method for each element in dm (problem)
Definition DMMoFEM.cpp:536
char out_file_name[255]
MoFEMErrorCode postProcessElasticResults(MoFEM::Interface &mField, SmartPetscObj< DM > dm, const std::string &domain_fe_name, const std::string &out_file_name, std::vector< std::pair< std::string, SmartPetscObj< Vec > > > extra_vectors={}, const std::vector< std::string > &tags_to_transfer={}, const Sev hooke_ops_sev=Sev::verbose)
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
MoFEM::LogManager::SeverityLevel Sev
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
FTensor::Index< 'm', 3 > m
virtual moab::Interface & get_moab()=0
Deprecated interface functions.
Interface for managing meshsets containing materials and boundary conditions.
Specialization for MatrixDouble vector field values calculation.
Element used to execute operators on side of the element.
Post post-proc data at points from hash maps.
PipelineManager interface.
Simple interface for fast problem set-up.
Definition Simple.hpp:27
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
ElementsAndOps< SPACE_DIM >::SideEle SideEle
Definition plastic.cpp:62
Implementation of Hookes operator Hookes for linear elastic problems in MoFEM.