v0.16.0
Loading...
Searching...
No Matches
PostProcHookStresses.hpp
Go to the documentation of this file.
1/**
2 * \file PostProcHookStress.hpp
3 * \brief Post-proc stresses for linear Hooke isotropic material
4 *
5 * \ingroup nonlinear_elastic_elem
6 */
7
8
9
10/**
11 * \brief Operator post-procesing stresses for Hook isotropic material
12
13 * Example how to use it
14
15 \code
16 PostProcBrokenMeshInMoab<VolumeElementForcesAndSourcesCore> post_proc(m_field);
17 {
18 auto disp_ptr = boost::make_shared<MatrixDouble>();
19 auto disp_grad_ptr = boost::make_shared<MatrixDouble>();
20 post_proc.getOpPtrVector().push_back(
21 new OpCalculateVectorFieldValues<3>("DISPLACEMENT", disp_ptr));
22 post_proc.getOpPtrVector().push_back(
23 new OpCalculateVectorFieldGradient<3, 3>(
24 "DISPLACEMENT", disp_grad_ptr));
25 //add postprocessing for stresses
26 post_proc.getOpPtrVector().push_back(
27 new PostProcHookStress(
28 m_field,
29 post_proc.getPostProcMesh(),
30 post_proc.getMapGaussPts(),
31 post_proc.getPostProcElements(),
32 "DISPLACEMENT",
33 disp_grad_ptr,
34 &elastic.setOfBlocks
35 )
36 );
37 using OpPPMap = OpPostProcMapInMoab<3, 3>;
38 post_proc.getOpPtrVector().push_back(
39 new OpPPMap(post_proc.getPostProcMesh(), post_proc.getMapGaussPts(),
40 {}, {{"DISPLACEMENT", disp_ptr}},
41 {{"DISPLACEMENT_GRAD", disp_grad_ptr}}, {}));
42 CHKERR DMoFEMLoopFiniteElements(dm,"ELASTIC",&post_proc);
43 CHKERR post_proc.writeFile("out.h5m");
44 }
45
46 \endcode
47
48 */
51
53 moab::Interface &postProcMesh;
54 std::vector<EntityHandle> &mapGaussPts;
57
58#ifdef __NONLINEAR_ELASTIC_HPP
59 /// Material block data, ket is block id
60 const std::map<int, NonlinearElasticElement::BlockData>
61 *setOfBlocksMaterialDataPtr;
62#endif //__NONLINEAR_ELASTIC_HPP
63
64 boost::shared_ptr<MatrixDouble> fieldGradientPtr;
65
66 /**
67 * Constructor
68 */
69 PostProcHookStress(MoFEM::Interface &m_field, moab::Interface &post_proc_mesh,
70 std::vector<EntityHandle> &map_gauss_pts,
71 Range &post_proc_elements,
72 const std::string field_name,
73 boost::shared_ptr<MatrixDouble> field_gradient_ptr,
74#ifdef __NONLINEAR_ELASTIC_HPP
75 const std::map<int, NonlinearElasticElement::BlockData>
76 *set_of_block_data_ptr = NULL,
77#endif
78 const bool is_field_disp = true)
79 : MoFEM::VolumeElementForcesAndSourcesCore::UserDataOperator(
81 mField(m_field), postProcMesh(post_proc_mesh),
82 mapGaussPts(map_gauss_pts), postProcElements(post_proc_elements),
83#ifdef __NONLINEAR_ELASTIC_HPP
84 setOfBlocksMaterialDataPtr(set_of_block_data_ptr),
85#endif //__NONLINEAR_ELASTIC_HPP
86 fieldGradientPtr(field_gradient_ptr), isFieldDisp(is_field_disp) {
87 }
88
89 /**
90 * \brief get material parameter
91
92 * Material parameters are read form BlockSet, however if block data are
93 present,
94 * use data how are set for elastic element operators.
95
96 * @param _lambda elastic material constant
97 * @param _mu elastic material constant
98 * @param _block_id block id
99 * @return error code
100
101 */
102 MoFEMErrorCode getMatParameters(double *_lambda, double *_mu,
103 int *_block_id) {
105
106 *_lambda = 1;
107 *_mu = 1;
108
109 EntityHandle ent = getNumeredEntFiniteElementPtr()->getEnt();
112 Mat_Elastic mydata;
113 CHKERR it->getAttributeDataStructure(mydata);
114
115 Range meshsets;
116 CHKERR mField.get_moab().get_entities_by_type(it->meshset, MBENTITYSET,
117 meshsets, false);
118 meshsets.insert(it->meshset);
119 for (Range::iterator mit = meshsets.begin(); mit != meshsets.end();
120 mit++) {
121 if (mField.get_moab().contains_entities(*mit, &ent, 1)) {
122 *_lambda = LAMBDA(mydata.data.Young, mydata.data.Poisson);
123 *_mu = MU(mydata.data.Young, mydata.data.Poisson);
124 *_block_id = it->getMeshsetId();
125#ifdef __NONLINEAR_ELASTIC_HPP
126 if (setOfBlocksMaterialDataPtr) {
127 *_lambda =
128 LAMBDA(setOfBlocksMaterialDataPtr->at(*_block_id).E,
129 setOfBlocksMaterialDataPtr->at(*_block_id).PoissonRatio);
130 *_mu = MU(setOfBlocksMaterialDataPtr->at(*_block_id).E,
131 setOfBlocksMaterialDataPtr->at(*_block_id).PoissonRatio);
132 }
133#endif //__NONLINEAR_ELASTIC_HPP
135 }
136 }
137 }
138
139 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
140 "Element is not in elastic block, however you run linear elastic "
141 "analysis with that element\n"
142 "top tip: check if you update block sets after mesh refinements or "
143 "interface insertion");
144
146 }
147
148 /**
149 * \brief Here real work is done
150 */
151 MoFEMErrorCode doWork(int side, EntityType type,
152 EntitiesFieldData::EntData &data) {
154
155 if (type != MBVERTEX)
157 if (data.getFieldData().size() == 0)
159
160 int id;
161 double lambda, mu;
163
164 MatrixDouble D_lambda, D_mu, D;
165 D_lambda.resize(6, 6);
166 D_lambda.clear();
167 for (int rr = 0; rr < 3; rr++) {
168 for (int cc = 0; cc < 3; cc++) {
169 D_lambda(rr, cc) = 1;
170 }
171 }
172 D_mu.resize(6, 6);
173 D_mu.clear();
174 for (int rr = 0; rr < 6; rr++) {
175 D_mu(rr, rr) = rr < 3 ? 2 : 1;
176 }
177 D = lambda * D_lambda + mu * D_mu;
178
179 int tag_length = 9;
180 double def_VAL[tag_length];
181 bzero(def_VAL, tag_length * sizeof(double));
182 Tag th_stress;
183 CHKERR postProcMesh.tag_get_handle("STRESS", 9, MB_TYPE_DOUBLE, th_stress,
184 MB_TAG_CREAT | MB_TAG_SPARSE, def_VAL);
185
186 Tag th_id;
187 int def_block_id = -1;
188 CHKERR postProcMesh.tag_get_handle("BLOCK_ID", 1, MB_TYPE_INTEGER, th_id,
189 MB_TAG_CREAT | MB_TAG_SPARSE,
190 &def_block_id);
191 CHKERR postProcMesh.tag_clear_data(th_id, postProcElements, &id);
192
193 VectorDouble strain;
194 VectorDouble stress;
195 MatrixDouble Stress;
196
197 int nb_gauss_pts = data.getN().size1();
198 if (mapGaussPts.size() != (unsigned int)nb_gauss_pts)
199 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "data inconsistency");
200
201 if (!fieldGradientPtr ||
202 fieldGradientPtr->size1() != (unsigned int)nb_gauss_pts ||
203 fieldGradientPtr->size2() != 9) {
204 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
205 "Gradient of field %s is not available", rowFieldName.c_str());
206 }
207 const auto &gradient = *fieldGradientPtr;
208
209 for (int gg = 0; gg != nb_gauss_pts; ++gg) {
210
211 strain.resize(6);
212 strain[0] = gradient(gg, 0);
213 strain[1] = gradient(gg, 4);
214 strain[2] = gradient(gg, 8);
215 strain[3] = gradient(gg, 1) + gradient(gg, 3);
216 strain[4] = gradient(gg, 5) + gradient(gg, 7);
217 strain[5] = gradient(gg, 2) + gradient(gg, 6);
218
219 if (!isFieldDisp) {
220 strain[0] -= 1.0;
221 strain[1] -= 1.0;
222 strain[2] -= 1.0;
223 }
224
225 stress.resize(6);
226 noalias(stress) = prod(D, strain);
227
228 Stress.resize(3, 3);
229 Stress(0, 0) = stress[0];
230 Stress(1, 1) = stress[1];
231 Stress(2, 2) = stress[2];
232 Stress(0, 1) = Stress(1, 0) = stress[3];
233 Stress(1, 2) = Stress(2, 1) = stress[4];
234 Stress(2, 0) = Stress(0, 2) = stress[5];
235
236 CHKERR postProcMesh.tag_set_data(th_stress, &mapGaussPts[gg], 1,
237 &Stress(0, 0));
238 }
239
241 }
242};
243
244/// \deprecated Class name with spelling mistake
ForcesAndSourcesCore::UserDataOperator UserDataOperator
std::string type
DEPRECATED typedef PostProcHookStress PostPorcHookStress
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MAT_ELASTICSET
block name is "MAT_ELASTIC"
@ BLOCKSET
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define DEPRECATED
Definition definitions.h:17
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MU(E, NU)
Definition fem_tools.h:23
#define LAMBDA(E, NU)
Definition fem_tools.h:22
#define _IT_CUBITMESHSETS_BY_BCDATA_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet in a moFEM field.
static double lambda
double D
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
constexpr auto field_name
virtual moab::Interface & get_moab()=0
Deprecated interface functions.
boost::shared_ptr< const NumeredEntFiniteElement > getNumeredEntFiniteElementPtr() const
Return raw pointer to NumeredEntFiniteElement.
@ OPROW
operator doWork function is executed on FE rows
Operator post-procesing stresses for Hook isotropic material.
boost::shared_ptr< MatrixDouble > fieldGradientPtr
moab::Interface & postProcMesh
MoFEM::Interface & mField
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Here real work is done.
MoFEMErrorCode getMatParameters(double *_lambda, double *_mu, int *_block_id)
get material parameter
PostProcHookStress(MoFEM::Interface &m_field, moab::Interface &post_proc_mesh, std::vector< EntityHandle > &map_gauss_pts, Range &post_proc_elements, const std::string field_name, boost::shared_ptr< MatrixDouble > field_gradient_ptr, const bool is_field_disp=true)
std::vector< EntityHandle > & mapGaussPts