v0.15.0
Loading...
Searching...
No Matches
EshelbianMonitor.cpp
Go to the documentation of this file.
1/** @file
2 @brief Contains definition of EshelbianMonitor class.
3 @ingroup EshelbianPlasticty
4*/
5
6struct EshelbianMonitor : public FEMethod {
7
9 using VolEle = VolumeElementForcesAndSourcesCore;
10 using VolOp = VolumeElementForcesAndSourcesCore::UserDataOperator;
11 using SetPtsData = FieldEvaluatorInterface::SetPtsData;
12 using PtsHashMap = std::map<std::string, std::array<double, 3>>;
14 PipelineManager::ElementsAndOpsByDim<SPACE_DIM>::FaceSideEle;
15
17 boost::shared_ptr<SetPtsData> dataFieldEval;
18 boost::shared_ptr<VolEle> volPostProcEnergy;
19 boost::shared_ptr<double> gEnergy;
21 PetscBool writeRestart = PETSC_FALSE;
22
24 : eP(ep), dataFieldEval(ep.mField.getInterface<FieldEvaluatorInterface>()
25 ->getData<VolEle>()),
26 volPostProcEnergy(new VolEle(ep.mField)), gEnergy(new double) {
28 ep.mField.getInterface<FieldEvaluatorInterface>()->buildTree<SPACE_DIM>(
29 dataFieldEval, "EP"),
30 "build field evaluator tree");
31
32 auto no_rule = [](int, int, int) { return -1; };
33
34 auto set_element_for_field_eval = [&]() {
36 boost::shared_ptr<Ele> vol_ele(dataFieldEval->feMethodPtr.lock());
37 vol_ele->getRuleHook = no_rule;
38 vol_ele->getUserPolynomialBase() =
39 boost::make_shared<CGGUserPolynomialBase>();
40 EshelbianPlasticity::AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
41 vol_ele->getOpPtrVector(), {HDIV, H1, L2}, eP.materialH1Positions,
42 ep.frontAdjEdges);
43
44 auto piola_scale_ptr = boost::make_shared<double>(1.0);
45 vol_ele->getOpPtrVector().push_back(
46 eP.physicalEquations->returnOpSetScale(piola_scale_ptr,
48 vol_ele->getOpPtrVector().push_back(new OpCalculateHVecTensorField<3, 3>(
49 eP.piolaStress, eP.dataAtPts->getApproxPAtPts(), piola_scale_ptr));
50 vol_ele->getOpPtrVector().push_back(
51 new OpCalculateHTensorTensorField<3, 3>(
52 eP.bubbleField, eP.dataAtPts->getApproxPAtPts(), piola_scale_ptr,
53 SmartPetscObj<Vec>(), MBMAXTYPE));
55 vol_ele->getOpPtrVector().push_back(
56 eP.physicalEquations->returnOpCalculateStretchFromStress(
58 } else {
59 vol_ele->getOpPtrVector().push_back(
60 new OpCalculateTensor2SymmetricFieldValues<3>(
61 eP.stretchTensor, eP.dataAtPts->getLogStretchTensorAtPts(),
62 MBTET));
63 }
64 vol_ele->getOpPtrVector().push_back(new OpCalculateVectorFieldValues<3>(
65 eP.rotAxis, eP.dataAtPts->getRotAxisAtPts(), MBTET));
66 vol_ele->getOpPtrVector().push_back(new OpCalculateVectorFieldValues<3>(
67 eP.rotAxis, eP.dataAtPts->getRotAxis0AtPts(), eP.solTSStep, MBTET));
68 vol_ele->getOpPtrVector().push_back(new OpCalculateVectorFieldValues<3>(
69 eP.spatialL2Disp, eP.dataAtPts->getSmallWL2AtPts(), MBTET));
70
71 // H1 displacements
72 vol_ele->getOpPtrVector().push_back(new OpCalculateVectorFieldValues<3>(
73 eP.spatialH1Disp, eP.dataAtPts->getSmallWH1AtPts()));
74 vol_ele->getOpPtrVector().push_back(
75 new OpCalculateVectorFieldGradient<3, 3>(
76 eP.spatialH1Disp, eP.dataAtPts->getSmallWGradH1AtPts()));
77
78 vol_ele->getOpPtrVector().push_back(
81 };
82
83 auto set_element_for_post_process_energy = [&]() {
85
87 1, false, false, false, SmartPetscObj<Vec>(), volPostProcEnergy);
88
89 if (auto op = eP.physicalEquations->returnOpCalculateEnergy(eP.dataAtPts,
90 gEnergy)) {
91
92 if (eP.noStretch ||
94 // We have to use actual strains to evaluate J integral and energy,
95 // in this case. Note actual stresses, and actual energy can only
96 // drive crack growth
97
98 // Note: Calling this bellow we overwrite the stretch calculation
99 // from setBaseVolumeElementOps
100
101 volPostProcEnergy->getOpPtrVector().push_back(
102 eP.physicalEquations->returnOpCalculateStretchFromStress(
104 }
105
106 volPostProcEnergy->getOpPtrVector().push_back(op);
107 }
108
110 };
111
112 auto reads_post_proc_data = [](PtsHashMap &pts_hash_map) {
114 std::ifstream file(
115 "points.txt"); // Open the file with the name "data.txt"
116
117 if (!file.is_open()) {
119 }
120
121 std::string line;
122
123 while (std::getline(file, line)) {
124 std::istringstream iss(line);
125 std::string col1;
126 double col2, col3, col4;
127
128 if (iss >> col1 >> col2 >> col3 >> col4) {
129 MOFEM_LOG("EP", Sev::verbose) << "Read: " << col1 << ", " << col2
130 << ", " << col3 << ", " << col4;
131 pts_hash_map[col1] = {col2, col3, col4};
132 } else {
133 MOFEM_LOG("EP", Sev::error) << "Error parsing line: " << line;
134 }
135 }
136
137 file.close(); // Close the file
139 };
140
141 CHK_THROW_MESSAGE(set_element_for_field_eval(), "set element for field");
142 CHK_THROW_MESSAGE(set_element_for_post_process_energy(),
143 "set element for post energy");
144
145 PetscBool test_cook_flg = PETSC_FALSE;
146 CHK_THROW_MESSAGE(PetscOptionsGetBool(PETSC_NULLPTR, "", "-test_cook_pts",
147 &test_cook_flg, PETSC_NULLPTR),
148 "get post proc points");
149 if (test_cook_flg) {
150 ptsHashMap["Point A"] = {48., 60., 4.999};
151 ptsHashMap["Point B"] = {48. / 2., 44. + (60. - 44.) / 2., 0.};
152 ptsHashMap["Point C"] = {48. / 2., (44. - 0.) / 2., 0.};
153 }
154
155 PetscInt atom_test = 0;
156
157 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-atom_test", &atom_test,
158 PETSC_NULLPTR);
159 if (atom_test == 14) {
160 // Points for atom test 14: check external strain
161 ptsHashMap["Point (2.5, 0., 0.)"] = {2.5, 0, 0.};
162 }
163 CHK_MOAB_THROW(reads_post_proc_data(ptsHashMap), "read post proc points");
164
165 CHK_THROW_MESSAGE(PetscOptionsGetBool(PETSC_NULLPTR, "", "-write_restart",
166 &writeRestart, PETSC_NULLPTR),
167 "get write restart option");
168
169 MOFEM_LOG("EP", Sev::inform)
170 << "EshelbianMonitor writeRestart " << writeRestart
171 ? " true"
172 : " false";
173 }
174
175 MoFEMErrorCode preProcess() { return 0; }
176
177 MoFEMErrorCode operator()() { return 0; }
178
179 MoFEMErrorCode postProcess() {
181
182 MOFEM_LOG("EP", Sev::inform) << "Monitor postProcess";
183
184 // Get boundary faces marked in blocks name "SPATIAL_DISP_...".
185 auto get_ents_on_mesh_skin = [&]() {
186
187 std::map<std::string, Range> boundary_entities_vec;
188
189 auto get_block_vec_impl = [&](auto block_name) {
190 return eP.mField.getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
191 std::regex(
192
193 (boost::format("%s(.*)") % block_name).str()
194
195 ));
196 };
197
198 auto add_blockset_ents_impl = [&](auto &&vec) {
200 for (auto it : vec) {
201 Range boundary_entities;
202 CHKERR it->getMeshsetIdEntitiesByDimension(eP.mField.get_moab(), 2,
203 boundary_entities, true);
204 std::string meshset_name = it->getName();
205 boundary_entities_vec[meshset_name] = boundary_entities;
206 boundary_entities.clear();
207 }
209 };
210
211 for (auto block_name : {"SPATIAL_DISP", "FIX", "CONTACT",
212 "SPATIAL_ROTATION", "NORMAL_DISPLACEMENT"}) {
213 CHK_THROW_MESSAGE(add_blockset_ents_impl(get_block_vec_impl(block_name)),
214 "add blockset entities");
215 }
216
217 return boundary_entities_vec;
218 };
219
220 auto boundary_entities_vec = get_ents_on_mesh_skin();
221
222 std::vector<std::tuple<std::string, Range, std::array<double, 6>>>
223 reactionForces;
224 for (const auto &pair : boundary_entities_vec) {
225 reactionForces.push_back(
226 std::make_tuple(pair.first, pair.second,
227 std::array<double, 6>{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}));
228 }
229
230 auto integration_rule_face = [](int, int, int approx_order) {
231 return 2 * approx_order + 1;
232 };
233 auto face_fe =
234 boost::make_shared<FaceElementForcesAndSourcesCore>(eP.mField);
235 auto no_rule = [](int, int, int) { return -1; };
236 face_fe->getRuleHook = integration_rule_face;
237 CHKERR
238 EshelbianPlasticity::AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
239 face_fe->getOpPtrVector(), {L2}, eP.materialH1Positions,
241
242 auto op_side =
243 new OpLoopSide<FaceSideEle>(eP.mField, "EP", SPACE_DIM, Sev::noisy);
244 face_fe->getOpPtrVector().push_back(op_side);
245 auto side_fe_ptr = op_side->getSideFEPtr();
246 auto base_ptr =
247 boost::make_shared<EshelbianPlasticity::CGGUserPolynomialBase>();
248 side_fe_ptr->getUserPolynomialBase() = base_ptr;
249 CHKERR EshelbianPlasticity::AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
250 side_fe_ptr->getOpPtrVector(), {H1, HDIV, L2}, eP.materialH1Positions,
252 auto piola_scale_ptr = boost::make_shared<double>(1.0);
253 side_fe_ptr->getOpPtrVector().push_back(
254 eP.physicalEquations->returnOpSetScale(piola_scale_ptr,
256 side_fe_ptr->getOpPtrVector().push_back(
257 new OpCalculateHVecTensorField<SPACE_DIM, SPACE_DIM>(
258 eP.piolaStress, eP.dataAtPts->getApproxPAtPts(), piola_scale_ptr));
259 side_fe_ptr->getOpPtrVector().push_back(
260 new OpCalculateHTensorTensorField<3, 3>(
261 eP.bubbleField, eP.dataAtPts->getApproxPAtPts(), MBMAXTYPE));
262 side_fe_ptr->getOpPtrVector().push_back(
264 side_fe_ptr->getOpPtrVector().push_back(new OpCalculateVectorFieldValues<3>(
265 eP.spatialL2Disp, eP.dataAtPts->getSmallWL2AtPts(), MBTET));
266 for (auto &[name, ents, reaction_vec] : reactionForces) {
267 face_fe->getOpPtrVector().push_back(new OpCalculateReactionForces(
268 eP.dataAtPts, name, ents, reaction_vec));
269 }
270
271 CHKERR eP.mField.loop_finite_elements(problemPtr->getName(), eP.skinElement,
272 *face_fe);
273
274 for (auto &[name, ents, reaction_vec] : reactionForces) {
275 std::array<double, 6> block_reaction_force{0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
276
277 MPI_Allreduce(reaction_vec.data(), &block_reaction_force, 6, MPI_DOUBLE,
278 MPI_SUM, eP.mField.get_comm());
279
280 for (auto &force : block_reaction_force) {
281 if (std::abs(force) < 1e-12) {
282 force = 0.0;
283 }
284 }
286 "EP", Sev::inform,
287 "Step %d time %3.4g Block %s Reaction force [%3.6e, %3.6e, %3.6e]",
288 ts_step, ts_t, name.c_str(), block_reaction_force[0],
289 block_reaction_force[1], block_reaction_force[2]);
290 MOFEM_LOG_C("EP", Sev::inform,
291 "Step %d time %3.4g Block %s Moment [%3.6e, %3.6e, %3.6e]",
292 ts_step, ts_t, name.c_str(), block_reaction_force[3],
293 block_reaction_force[4], block_reaction_force[5]);
294 }
295
296 auto get_step = [](auto ts_step) {
297 std::ostringstream ss;
298 ss << boost::str(boost::format("%d") % static_cast<int>(ts_step));
299 std::string s = ss.str();
300 return s;
301 };
302
303 if (writeRestart && ts_u) {
304 PetscViewer viewer;
305 CHKERR PetscViewerBinaryOpen(
306 PETSC_COMM_WORLD, ("restart_" + get_step(ts_step) + ".dat").c_str(),
307 FILE_MODE_WRITE, &viewer);
308 CHKERR VecView(ts_u, viewer);
309 CHKERR PetscViewerDestroy(&viewer);
310 }
311
312 CHKERR eP.postProcessResults(1, "out_sol_elastic_" + get_step(ts_step) +
313 ".h5m");
314
315
316
317 // Function to get material force tags
318 auto get_material_force_tags = [&]() {
319 auto &moab = eP.mField.get_moab();
320 std::vector<Tag> tag(2);
321 CHK_MOAB_THROW(moab.tag_get_handle("MaterialForce", tag[0]),
322 "can't get tag");
323 CHK_MOAB_THROW(moab.tag_get_handle("FacePressure", tag[1]),
324 "can't get tag");
325 return tag;
326 };
328
329 // Post-process skeleton elements
330 bool post_process_skeleton = true;
331#ifndef NDEBUG
332 post_process_skeleton = true;
333#endif
334 if (post_process_skeleton) {
336 1, "out_skeleton_" + get_step(ts_step) + ".h5m", PETSC_NULLPTR,
337 get_material_force_tags());
338 }
339
340 // Loop boundary elements with traction boundary conditions
341 *gEnergy = 0;
342 TetPolynomialBase::switchCacheBaseOn<HDIV>({volPostProcEnergy.get()});
343 CHKERR eP.mField.loop_finite_elements(problemPtr->getName(), "EP",
345 TetPolynomialBase::switchCacheBaseOff<HDIV>({volPostProcEnergy.get()});
346
347 double body_energy = 0;
348 MPI_Allreduce(gEnergy.get(), &body_energy, 1, MPI_DOUBLE, MPI_SUM,
349 eP.mField.get_comm());
351 auto crack_area_ptr = boost::make_shared<double>(0.0);
352 CHKERR eP.calculateCrackArea(crack_area_ptr);
353 MOFEM_LOG_C("EP", Sev::inform,
354 "Step %d time %3.4g strain energy %3.6e crack "
355 "area %3.6e",
356 ts_step, ts_t, body_energy, *crack_area_ptr);
357 if (eP.mField.get_comm_rank() == 0) {
358 auto crack_faces = *eP.crackFaces;
359 if (crack_faces.empty()) {
360 crack_faces = *eP.frontEdges;
361 }
364 (boost::format("crack_faces_step_%d.vtk") % ts_step).str(),
365 crack_faces);
368 (boost::format("front_edges_step_%d.vtk") % ts_step).str(),
369 *eP.frontEdges);
370 }
371
372 } else {
373 MOFEM_LOG_C("EP", Sev::inform, "Step %d time %3.4g strain energy %3.6e",
374 ts_step, ts_t, body_energy);
375 }
376
377 auto post_proc_at_points = [&](std::array<double, 3> point,
378 std::string str) {
380
381 dataFieldEval->setEvalPoints(point.data(), point.size() / 3);
382
383 struct OpPrint : public VolOp {
384
385 EshelbianCore &eP;
386 std::array<double, 3> point;
387 std::string str;
388
389 OpPrint(EshelbianCore &ep, std::array<double, 3> &point,
390 std::string &str)
391 : VolOp(ep.spatialL2Disp, VolOp::OPROW), eP(ep), point(point),
392 str(str) {}
393
394 MoFEMErrorCode doWork(int side, EntityType type,
395 EntitiesFieldData::EntData &data) {
397 if (type == MBTET) {
398 if (getGaussPts().size2()) {
399
400 auto t_h = getFTensor2FromMat<3, 3>(eP.dataAtPts->hAtPts);
401 auto t_approx_P =
402 getFTensor2FromMat<3, 3>(eP.dataAtPts->approxPAtPts);
403
404 FTensor::Index<'i', 3> i;
405 FTensor::Index<'j', 3> j;
406 FTensor::Index<'k', 3> k;
407 const double jac = determinantTensor3by3(t_h);
409 t_cauchy(i, j) = (1. / jac) * (t_approx_P(i, k) * t_h(j, k));
410
411 auto add = [&]() {
412 std::ostringstream s;
413 s << str << " elem " << getFEEntityHandle() << " ";
414 return s.str();
415 };
416
417 auto print_tensor = [](auto &t) {
418 std::ostringstream s;
419 s << t;
420 return s.str();
421 };
422
423 std::ostringstream print;
424 MOFEM_LOG("EPSYNC", Sev::inform)
425 << add() << "comm rank " << eP.mField.get_comm_rank();
426 MOFEM_LOG("EPSYNC", Sev::inform)
427 << add() << "point " << getVectorAdaptor(point.data(), 3);
428 MOFEM_LOG("EPSYNC", Sev::inform)
429 << add() << "coords at gauss pts " << getCoordsAtGaussPts();
430 MOFEM_LOG("EPSYNC", Sev::inform)
431 << add() << "w " << eP.dataAtPts->wL2AtPts;
432 MOFEM_LOG("EPSYNC", Sev::inform)
433 << add() << "Piola " << eP.dataAtPts->approxPAtPts;
434 MOFEM_LOG("EPSYNC", Sev::inform)
435 << add() << "Cauchy " << print_tensor(t_cauchy);
436 }
437 }
439 }
440 };
441
442 if (auto fe_ptr = dataFieldEval->feMethodPtr.lock()) {
443
444 fe_ptr->getOpPtrVector().push_back(new OpPrint(eP, point, str));
445 CHKERR eP.mField.getInterface<FieldEvaluatorInterface>()
446 ->evalFEAtThePoint<SPACE_DIM>(
447 point.data(), 1e-12, problemPtr->getName(), "EP", dataFieldEval,
449 MF_EXIST, QUIET);
450 fe_ptr->getOpPtrVector().pop_back();
451 }
452
454 };
455
456 auto check_external_strain = [&](std::array<double, 3> point,
457 std::string str, PetscInt atom_test) {
459
460 dataFieldEval->setEvalPoints(point.data(), point.size() / 3);
461 auto vec = createVectorMPI(eP.mField.get_comm(), 1, 1);
462 eP.dataAtPts->wL2AtPts.resize(0, 0, false);
463
464 if (auto fe_ptr = dataFieldEval->feMethodPtr.lock()) {
465 CHKERR eP.mField.getInterface<FieldEvaluatorInterface>()
466 ->evalFEAtThePoint<SPACE_DIM>(
467 point.data(), 1e-12, problemPtr->getName(), "EP", dataFieldEval,
469 MF_EXIST, QUIET);
470 }
471 if (eP.dataAtPts->wL2AtPts.size2() == 0) {
472 VecSetValue(vec, 0, 0.0, ADD_VALUES);
473 } else if (eP.dataAtPts->wL2AtPts.size2() == 1) {
474 auto add = [&]() {
475 std::ostringstream s;
476 s << str << " elem " << getFEEntityHandle() << " ";
477 return s.str();
478 };
479 MOFEM_LOG("EPSYNC", Sev::inform)
480 << add() << "comm rank " << eP.mField.get_comm_rank();
481 MOFEM_LOG("EPSYNC", Sev::inform)
482 << add() << "point " << getVectorAdaptor(point.data(), 3);
483 MOFEM_LOG("EPSYNC", Sev::inform)
484 << add() << "w " << eP.dataAtPts->wL2AtPts;
485 double disp_at_point = eP.dataAtPts->wL2AtPts(0);
486 VecSetValue(vec, 0, disp_at_point, ADD_VALUES);
487 }
488
490 if (ts_t > 0.0) {
491 CHKERR VecAssemblyBegin(vec);
492 CHKERR VecAssemblyEnd(vec);
493 double error;
494 PetscInt idx = 0;
495 if (eP.mField.get_comm_rank() == 0) {
496 CHKERR VecGetValues(vec, 1, &idx, &error);
497 }
498 MPI_Bcast(&error, 1, MPI_DOUBLE, 0, PETSC_COMM_WORLD);
499 // Check if the displacement is correct for the applied external
500 // strain For the bar problem, we expect a displacement of 0.25 at
501 // point A
502 if (std::abs(error - 0.25) > 1e-5) {
503 SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
504 "Atom test %d failed: wrong displacement.", atom_test);
505 }
506 }
508 };
509
510 PetscInt atom_test = 0;
511 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-atom_test", &atom_test,
512 PETSC_NULLPTR);
513
514 if (atom_test == 14) {
515 // Points for external strain
516 for (auto &pts : ptsHashMap) {
517 CHKERR check_external_strain(pts.second, pts.first, atom_test);
518 }
519 } else {
520 // Points for Cook beam
521 for (auto &pts : ptsHashMap) {
522 CHKERR post_proc_at_points(pts.second, pts.first);
524 }
525 }
526
527 if (eP.crackingOn) {
528 }
529
531 }
532};
#define MOFEM_LOG_SEVERITY_SYNC(comm, severity)
Synchronise "SYNC" on curtain severity level.
#define MOFEM_LOG_C(channel, severity, format,...)
constexpr int SPACE_DIM
[Define dimension]
@ QUIET
@ MF_EXIST
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#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 ...
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ MOFEM_ATOM_TEST_INVALID
Definition definitions.h:40
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MOFEM_LOG(channel, severity)
Log.
virtual MoFEMErrorCode loop_finite_elements(const std::string problem_name, const std::string &fe_name, FEMethod &method, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)=0
Make a loop over finite elements.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
constexpr double t
plate stiffness
Definition plate.cpp:58
static constexpr int approx_order
boost::shared_ptr< Range > frontAdjEdges
MoFEM::Interface & mField
const std::string spatialL2Disp
const std::string materialH1Positions
static PetscBool crackingOn
MoFEMErrorCode setBaseVolumeElementOps(const int tag, const bool do_rhs, const bool do_lhs, const bool calc_rates, SmartPetscObj< Vec > ver_vec, boost::shared_ptr< VolumeElementForcesAndSourcesCore > fe)
MoFEMErrorCode calculateFaceMaterialForce(const int tag, TS ts)
MoFEMErrorCode calculateCrackArea(boost::shared_ptr< double > area_ptr)
const std::string spatialH1Disp
static enum MaterialModel materialModel
const std::string piolaStress
const std::string bubbleField
static PetscBool noStretch
MoFEMErrorCode postProcessSkeletonResults(const int tag, const std::string file, Vec f_residual=PETSC_NULLPTR, std::vector< Tag > tags_to_transfer={})
boost::shared_ptr< PhysicalEquations > physicalEquations
const std::string rotAxis
const std::string skinElement
MoFEMErrorCode postProcessResults(const int tag, const std::string file, Vec f_residual=PETSC_NULLPTR, Vec var_vec=PETSC_NULLPTR, std::vector< Tag > tags_to_transfer={})
boost::shared_ptr< DataAtIntegrationPts > dataAtPts
boost::shared_ptr< Range > crackFaces
SmartPetscObj< Vec > solTSStep
boost::shared_ptr< Range > frontEdges
const std::string stretchTensor
boost::shared_ptr< double > gEnergy
MoFEMErrorCode preProcess()
boost::shared_ptr< VolEle > volPostProcEnergy
PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::FaceSideEle FaceSideEle
MoFEMErrorCode operator()()
boost::shared_ptr< SetPtsData > dataFieldEval
EshelbianMonitor(EshelbianCore &ep)
EshelbianCore & eP
std::map< std::string, std::array< double, 3 > > PtsHashMap
VolumeElementForcesAndSourcesCore VolEle
VolumeElementForcesAndSourcesCore::UserDataOperator VolOp
MoFEMErrorCode postProcess()
FieldEvaluatorInterface::SetPtsData SetPtsData
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
@ OPROW
operator doWork function is executed on FE rows
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
VolEle::UserDataOperator VolOp
int atom_test
Atom test.
Definition plastic.cpp:121
auto save_range