v0.15.5
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, typename SideEle>
10 MoFEM::Interface &mField, SmartPetscObj<DM> dm,
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;
16
17 auto simple = mField.getInterface<Simple>();
18 auto pip = mField.getInterface<PipelineManager>();
19
23
24 pip->getDomainRhsFE().reset();
25 pip->getDomainLhsFE().reset();
26 pip->getBoundaryRhsFE().reset();
27 pip->getBoundaryLhsFE().reset();
28
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);
34
35 using DataMapMat = std::map<std::string, boost::shared_ptr<MatrixDouble>>;
36
37 auto calculate_stress_ops = [&](auto &ops) {
39
40 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
41 mField, ops, "U", "MAT_ELASTIC", hooke_ops_sev);
42
43 auto u_ptr = boost::make_shared<MatrixDouble>();
44 ops.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
45 auto x_ptr = boost::make_shared<MatrixDouble>();
46 ops.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", x_ptr));
47
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;
54 }
55
56 DataMapMat sym_map = {{"STRAIN", common_ptr->getMatStrain()},
57 {"STRESS", common_ptr->getMatCauchyStress()}};
58
59 return boost::make_tuple(common_ptr->getMatCauchyStress(), vec_map, sym_map);
60 };
61
62 auto get_tag_id_on_pmesh = [&](bool post_proc_skin) {
63 int def_val_int = 0;
64 Tag tag_mat;
65 CHKERR mField.get_moab().tag_get_handle(
66 "MAT_ELASTIC", 1, MB_TYPE_INTEGER, tag_mat,
67 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val_int);
68
69 auto meshset_vec_ptr =
70 mField.getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
71 std::regex((boost::format("%s(.*)") % "MAT_ELASTIC").str()));
72
73 Range skin_ents;
74 std::unique_ptr<Skinner> skin_ptr;
75 if (post_proc_skin) {
76 skin_ptr = std::make_unique<Skinner>(&mField.get_moab());
77 auto boundary_meshset = simple->getBoundaryMeshSet();
78 CHKERR mField.get_moab().get_entities_by_handle(boundary_meshset,
79 skin_ents, true);
80 }
81
82 for (auto m : meshset_vec_ptr) {
83 Range ents_3d;
84 CHKERR mField.get_moab().get_entities_by_handle(m->getMeshset(), ents_3d,
85 true);
86 int const id = m->getMeshsetId();
87 ents_3d = ents_3d.subset_by_dimension(SPACE_DIM);
88 if (post_proc_skin) {
89 Range skin_faces;
90 CHKERR skin_ptr->find_skin(0, ents_3d, false, skin_faces);
91 ents_3d = intersect(skin_ents, skin_faces);
92 }
93 CHKERR mField.get_moab().tag_clear_data(tag_mat, ents_3d, &id);
94 }
95
96 return std::vector<Tag>{tag_mat};
97 };
98
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);
104
105 post_proc_fe->getOpPtrVector().push_back(new OpPPMap(
106 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
107 vec_map, {}, sym_map));
108
109 post_proc_fe->setTagsToTransfer(get_tag_id_on_pmesh(false));
110 return post_proc_fe;
111 };
112
113 auto post_proc_boundary = [&](auto pmesh) {
114 auto post_proc_fe = boost::make_shared<PostProcEleBdy>(mField, pmesh);
116 post_proc_fe->getOpPtrVector(), {}, "GEOMETRY");
117
118 auto op_loop_side =
119 new OpLoopSide<SideEle>(mField, domain_fe_name, SPACE_DIM);
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);
123
124 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
125 post_proc_fe->getOpPtrVector().push_back(
126 new ElasticOps::OpCalculateTraction(mat_stress_ptr, mat_traction_ptr));
127 vec_map["T"] = mat_traction_ptr;
128
129 post_proc_fe->getOpPtrVector().push_back(new OpPPMap(
130 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(), {},
131 vec_map, {}, sym_map));
132
133 post_proc_fe->setTagsToTransfer(get_tag_id_on_pmesh(true));
134 return post_proc_fe;
135 };
136
137 PetscBool post_proc_skin_only = PETSC_FALSE;
138 if (SPACE_DIM == 3) {
139 post_proc_skin_only = PETSC_TRUE;
140 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, "", "-post_proc_skin_only",
141 &post_proc_skin_only, PETSC_NULLPTR);
142 }
143
144 if (post_proc_skin_only == PETSC_FALSE) {
145 pip->getDomainRhsFE() = post_proc_domain(post_proc_mesh);
146 } else {
147 pip->getBoundaryRhsFE() = post_proc_boundary(post_proc_mesh);
148 }
149
150 CHKERR DMoFEMPreProcessFiniteElements(dm, post_proc_begin->getFEMethod());
151 CHKERR pip->loopFiniteElements();
152 CHKERR DMoFEMPostProcessFiniteElements(dm, post_proc_end->getFEMethod());
153
154 CHKERR post_proc_end->writeFile(out_file_name);
156}
157
158} // namespace ElasticPostProc
159
160#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
@ 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
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, SmartPetscObj< Vec > extra_vector=nullptr, const std::string &extra_vector_name="", const Sev hooke_ops_sev=Sev::verbose)
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
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 double precision 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.
Implementation of Hookes operator Hookes for linear elastic problems in MoFEM.