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 pip->getDomainRhsFE().reset();
27 pip->getDomainLhsFE().reset();
28 pip->getBoundaryRhsFE().reset();
29 pip->getBoundaryLhsFE().reset();
30
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);
36
37 using DataMapMat = std::map<std::string, boost::shared_ptr<MatrixDouble>>;
38
39 auto calculate_stress_ops = [&](auto &ops) {
41
42 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
43 mField, ops, "U", "MAT_ELASTIC", hooke_ops_sev);
44
45 auto u_ptr = boost::make_shared<MatrixDouble>();
46 ops.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
47 auto x_ptr = boost::make_shared<MatrixDouble>();
48 ops.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", x_ptr));
49
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;
57 }
58 }
59
60 DataMapMat sym_map = {{"STRAIN", common_ptr->getMatStrain()},
61 {"STRESS", common_ptr->getMatCauchyStress()}};
62
63 return boost::make_tuple(common_ptr->getMatCauchyStress(), vec_map, sym_map);
64 };
65
66 auto get_tags_on_pmesh = [&](bool post_proc_skin) {
67 int def_val_int = 0;
68 Tag tag_mat;
69 CHKERR mField.get_moab().tag_get_handle(
70 "MAT_ELASTIC", 1, MB_TYPE_INTEGER, tag_mat,
71 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val_int);
72
73 auto meshset_vec_ptr =
74 mField.getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
75 std::regex((boost::format("%s(.*)") % "MAT_ELASTIC").str()));
76
77 Range skin_ents;
78 std::unique_ptr<Skinner> skin_ptr;
79 if (post_proc_skin) {
80 skin_ptr = std::make_unique<Skinner>(&mField.get_moab());
81 auto boundary_meshset = simple->getBoundaryMeshSet();
82 CHKERR mField.get_moab().get_entities_by_handle(boundary_meshset,
83 skin_ents, true);
84 }
85
86 for (auto m : meshset_vec_ptr) {
87 Range ents_3d;
88 CHKERR mField.get_moab().get_entities_by_handle(m->getMeshset(), ents_3d,
89 true);
90 int const id = m->getMeshsetId();
91 ents_3d = ents_3d.subset_by_dimension(SPACE_DIM);
92 if (post_proc_skin) {
93 Range skin_faces;
94 CHKERR skin_ptr->find_skin(0, ents_3d, false, skin_faces);
95 ents_3d = intersect(skin_ents, skin_faces);
96 }
97 CHKERR mField.get_moab().tag_clear_data(tag_mat, ents_3d, &id);
98 }
99
100 std::vector<Tag> tags{tag_mat};
101 for (const auto &tag_name : tags_to_transfer) {
102 Tag tag = 0;
103 if (mField.get_moab().tag_get_handle(tag_name.c_str(), tag) ==
104 MB_SUCCESS) {
105 tags.push_back(tag);
106 }
107 }
108 return tags;
109 };
110
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);
116
117 post_proc_fe->getOpPtrVector().push_back(new OpPPMap(
118 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
119 vec_map, {}, sym_map));
120
121 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(false));
122 return post_proc_fe;
123 };
124
125 auto post_proc_boundary = [&](auto pmesh) {
126 auto post_proc_fe = boost::make_shared<PostProcEleBdy>(mField, pmesh);
128 post_proc_fe->getOpPtrVector(), {}, "GEOMETRY");
129
130 auto op_loop_side =
131 new OpLoopSide<SideEle>(mField, domain_fe_name, SPACE_DIM);
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);
135
136 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
137 post_proc_fe->getOpPtrVector().push_back(
138 new ElasticOps::OpCalculateTraction(mat_stress_ptr, mat_traction_ptr));
139 vec_map["T"] = mat_traction_ptr;
140
141 post_proc_fe->getOpPtrVector().push_back(new OpPPMap(
142 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
143 vec_map, {}, sym_map));
144
145 post_proc_fe->setTagsToTransfer(get_tags_on_pmesh(true));
146 return post_proc_fe;
147 };
148
149 PetscBool post_proc_skin_only = PETSC_FALSE;
150 if (SPACE_DIM == 3) {
151 post_proc_skin_only = PETSC_TRUE;
152 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, "", "-post_proc_skin_only",
153 &post_proc_skin_only, PETSC_NULLPTR);
154 }
155
156 if (post_proc_skin_only == PETSC_FALSE) {
157 pip->getDomainRhsFE() = post_proc_domain(post_proc_mesh);
158 } else {
159 pip->getBoundaryRhsFE() = post_proc_boundary(post_proc_mesh);
160 }
161
162 CHKERR DMoFEMPreProcessFiniteElements(dm, post_proc_begin->getFEMethod());
163 CHKERR pip->loopFiniteElements();
164 CHKERR DMoFEMPostProcessFiniteElements(dm, post_proc_end->getFEMethod());
165
166 CHKERR post_proc_end->writeFile(out_file_name);
168}
169
170} // namespace ElasticPostProc
171
172#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.