v0.16.3
Loading...
Searching...
No Matches
PostProcContact.hpp
Go to the documentation of this file.
1/**
2 * \file PostProcContact.hpp
3 *
4 *
5 * @copyright Copyright (c) 2023
6 */
7
8namespace ContactOps {
9
10template <int DIM> struct PostProcEleByDim;
11
12template <> struct PostProcEleByDim<2> {
13 using PostProcEleDomain = PostProcBrokenMeshInMoabBaseCont<DomainEle>;
14 using PostProcEleBdy = PostProcBrokenMeshInMoabBaseCont<BoundaryEle>;
15 using SideEle = PipelineManager::ElementsAndOpsByDim<2>::FaceSideEle;
16};
17
18template <> struct PostProcEleByDim<3> {
19 using PostProcEleDomain = PostProcBrokenMeshInMoabBaseCont<BoundaryEle>;
20 using PostProcEleBdy = PostProcBrokenMeshInMoabBaseCont<BoundaryEle>;
21 using SideEle = PipelineManager::ElementsAndOpsByDim<3>::FaceSideEle;
22};
23
27
28struct Monitor : public FEMethod {
29
30 Monitor(SmartPetscObj<DM> &dm, double scale,
31 boost::shared_ptr<MFrontInterface> mfront_interface_ptr = nullptr,
32 bool is_axisymmetric = false, bool is_large_strain = false)
34 mfrontInterfacePtr(mfront_interface_ptr),
36
37 MoFEM::Interface *m_field_ptr;
38 CHKERR DMoFEMGetInterfacePtr(dM, &m_field_ptr);
39
40 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
41
42 struct OpScale : public ForcesAndSourcesCore::UserDataOperator {
43 OpScale(boost::shared_ptr<MatrixDouble> m_ptr, double s)
44 : ForcesAndSourcesCore::UserDataOperator(NOSPACE, OPSPACE),
45 mPtr(m_ptr), scale(s) {}
46 MoFEMErrorCode doWork(int, EntityType, EntitiesFieldData::EntData &) {
47 *mPtr *= 1. / scale;
48 return 0;
49 }
50
51 private:
52 boost::shared_ptr<MatrixDouble> mPtr;
53 double scale;
54 };
55
56 auto push_domain_ops = [&](auto &pip) {
57 CHK_THROW_MESSAGE((AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
58 pip, {H1, HDIV}, "GEOMETRY")),
59 "Apply base transform");
60 // Define variant type that holds either HookeOps or HenckyOps
61 // CommonData.
62 using CommonDataVariant =
63 std::variant<boost::shared_ptr<HookeOps::CommonData>,
64 boost::shared_ptr<HenckyOps::CommonData>>;
65 auto contact_stress_ptr = boost::make_shared<MatrixDouble>();
66 pip.push_back(new OpCalculateHVecTensorField<SPACE_DIM, SPACE_DIM>(
67 "SIGMA", contact_stress_ptr));
68
69 if (!isLargeStrain) { // use HookeOps
70 auto hooke_common_data_ptr =
71 HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEleOp>(
72 *m_field_ptr, pip, "U", "MAT_ELASTIC", Sev::inform, scale);
73
74 pip.push_back(new OpScale(contact_stress_ptr, scale));
75 return std::make_tuple(CommonDataVariant(hooke_common_data_ptr),
76 contact_stress_ptr);
77 } else { // use HenckyOps
78 auto hencky_common_data_ptr =
79 HenckyOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEleOp>(
80 *m_field_ptr, pip, "U", "MAT_ELASTIC", Sev::inform, scale);
81 pip.push_back(new OpScale(contact_stress_ptr, scale));
82 return std::make_tuple(CommonDataVariant(hencky_common_data_ptr),
83 contact_stress_ptr);
84 }
85 };
86 auto push_bdy_ops = [&](auto &pip) {
87 // evaluate traction
88 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
89 pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>(
90 "U", common_data_ptr->contactDispPtr()));
91 pip.push_back(new OpCalculateHVecTensorTrace<SPACE_DIM, BoundaryEleOp>(
92 "SIGMA", common_data_ptr->contactTractionPtr()));
93 pip.push_back(new OpScale(common_data_ptr->contactTractionPtr(), scale));
95 pip.push_back(new typename C::template OpEvaluateSDF<SPACE_DIM, GAUSS>(
96 common_data_ptr));
97 return common_data_ptr;
98 };
99
100 auto get_domain_pip = [&](auto &pip)
101 -> boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> & {
102 if constexpr (SPACE_DIM == 3) {
103 auto op_loop_side = new OpLoopSide<SideEle>(
104 *m_field_ptr, "dFE", SPACE_DIM, Sev::noisy,
105 boost::make_shared<
106 ForcesAndSourcesCore::UserDataOperator::AdjCache>());
107 pip.push_back(op_loop_side);
108 return op_loop_side->getOpPtrVector();
109 } else {
110 return pip;
111 }
112 };
113
114 auto get_post_proc_domain_fe = [&]() {
115 auto post_proc_fe =
116 boost::make_shared<PostProcEleDomain>(*m_field_ptr, postProcMesh);
117 auto &pip = post_proc_fe->getOpPtrVector();
118 // Get common data pointer (either Hooke or Hencky)
119 auto [hencky_or_hooke_common_data_ptr, contact_stress_ptr] =
120 push_domain_ops(get_domain_pip(pip));
121
122 auto u_ptr = boost::make_shared<MatrixDouble>();
123 pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
124 auto X_ptr = boost::make_shared<MatrixDouble>();
125 pip.push_back(
126 new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", X_ptr));
127 /**
128 * @brief Adds operators for evaluating stress and strain based on the
129 * material model: i.e. Visit the variant to handle either
130 * HookeOps::CommonData or HenckyOps::CommonData. i.e.
131 * - For `HookeOps::CommonData`, maps Cauchy stress and small strain.
132 * - For `HenckyOps::CommonData`, maps first Piola-Kirchhoff stress and
133 * Hencky strain.
134 * @return A commod data pointer to the configured post-processing
135 * hencky_or_hooke_common_data_ptr.
136 */
137 std::visit(
138 [&](auto &common_data_ptr) {
139 if constexpr (std::is_same_v<
140 std::decay_t<decltype(common_data_ptr)>,
141 boost::shared_ptr<HookeOps::CommonData>>) {
142 pip.push_back(new OpPPMap(
143 post_proc_fe->getPostProcMesh(),
144 post_proc_fe->getMapGaussPts(), {},
145 {{"U", u_ptr}, {"GEOMETRY", X_ptr}},
146 {{"SIGMA", contact_stress_ptr},
147 {"G", common_data_ptr->matGradPtr}}, // Displacement gradient
148 {{"STRESS", common_data_ptr->getMatCauchyStress()},
149 {"STRAIN", common_data_ptr->getMatStrain()}}));
150 }
151 // Handle HenckyOps::CommonData
152 else if constexpr (std::is_same_v<
153 std::decay_t<decltype(common_data_ptr)>,
154 boost::shared_ptr<HenckyOps::CommonData>>) {
155
156 pip.push_back(new OpPPMap(
157 post_proc_fe->getPostProcMesh(),
158 post_proc_fe->getMapGaussPts(), {},
159 {{"U", u_ptr}, {"GEOMETRY", X_ptr}},
160 {{"SIGMA", contact_stress_ptr},
161 {"G", common_data_ptr->matGradPtr},
162 {"PK1", common_data_ptr->getMatFirstPiolaStress()}
163
164 },
165 {{"HENCKY_STRAIN", common_data_ptr->getMatLogC()}}));
166 }
167 },
168 hencky_or_hooke_common_data_ptr);
169
170 if (SPACE_DIM == 3) {
171
172 CHK_THROW_MESSAGE((AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
173 pip, {HDIV}, "GEOMETRY")),
174 "Apply transform");
175 auto common_data_ptr = push_bdy_ops(pip);
176
177 pip.push_back(
178
179 new OpPPMap(
180
181 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
182
183 {{"SDF", common_data_ptr->sdfPtr()},
184 {"CONSTRAINT_CONTACT", common_data_ptr->constraintPtr()}},
185
186 {
187
188 {"TRACTION_CONTACT", common_data_ptr->contactTractionPtr()},
189 {"GRAD_SDF", common_data_ptr->gradSdfPtr()}
190
191 },
192
193 {},
194
195 {{"HESS_SDF", common_data_ptr->hessSdfPtr()}}
196
197 )
198
199 );
200 }
201
202 return post_proc_fe;
203 };
204
205 auto get_post_proc_bdy_fe = [&]() {
206 auto post_proc_fe =
207 boost::make_shared<PostProcEleBdy>(*m_field_ptr, postProcMesh);
208 auto &pip = post_proc_fe->getOpPtrVector();
209
210 CHK_THROW_MESSAGE((AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
211 pip, {HDIV}, "GEOMETRY")),
212 "Apply transform");
213 auto common_data_ptr = push_bdy_ops(pip);
214
215 // create OP which run element on side
216 auto op_loop_side = new OpLoopSide<SideEle>(
217 *m_field_ptr, "dFE", SPACE_DIM, Sev::noisy,
218 boost::make_shared<
219 ForcesAndSourcesCore::UserDataOperator::AdjCache>());
220 pip.push_back(op_loop_side);
221
222 auto [hencky_or_hooke_common_data_ptr, contact_stress_ptr] =
223 push_domain_ops(op_loop_side->getOpPtrVector());
224
225 auto X_ptr = boost::make_shared<MatrixDouble>();
226 pip.push_back(
227 new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", X_ptr));
228
229 pip.push_back(
230
231 new OpPPMap(
232
233 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
234
235 {{"SDF", common_data_ptr->sdfPtr()},
236 {"CONSTRAINT_CONTACT", common_data_ptr->constraintPtr()}},
237
238 {{"U", common_data_ptr->contactDispPtr()},
239 {"GEOMETRY", X_ptr},
240 {"TRACTION_CONTACT", common_data_ptr->contactTractionPtr()},
241 {"GRAD_SDF", common_data_ptr->gradSdfPtr()}
242
243 },
244
245 {},
246
247 {{"HESS_SDF", common_data_ptr->hessSdfPtr()}}
248
249 )
250
251 );
252
253 return post_proc_fe;
254 };
255
256 auto get_integrate_traction = [&]() {
257 auto integrate_traction = boost::make_shared<BoundaryEle>(*m_field_ptr);
259 (AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
260 integrate_traction->getOpPtrVector(), {HDIV}, "GEOMETRY")),
261 "Apply transform");
262 // We have to integrate on curved face geometry, thus integration weight
263 // have to adjusted.
264 integrate_traction->getOpPtrVector().push_back(
265 new OpSetHOWeightsOnSubDim<SPACE_DIM>());
266 integrate_traction->getRuleHook = [](int, int, int approx_order) {
267 return 2 * approx_order + geom_order - 1;
268 };
269
271 (opFactoryCalculateTraction<SPACE_DIM, GAUSS, BoundaryEleOp>(
272 integrate_traction->getOpPtrVector(), "SIGMA", is_axisymmetric)),
273 "push operators to calculate traction");
274
275 return integrate_traction;
276 };
277
278 auto get_integrate_area = [&]() {
279 auto integrate_area = boost::make_shared<BoundaryEle>(*m_field_ptr);
280
282 (AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
283 integrate_area->getOpPtrVector(), {HDIV}, "GEOMETRY")),
284 "Apply transform");
285 // We have to integrate on curved face geometry, thus integration weight
286 // have to adjusted.
287 integrate_area->getOpPtrVector().push_back(
288 new OpSetHOWeightsOnSubDim<SPACE_DIM>());
289 integrate_area->getRuleHook = [](int, int, int approx_order) {
290 return 2 * approx_order + geom_order - 1;
291 };
292 Range contact_range;
293 for (auto m :
294 m_field_ptr->getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
295 std::regex((boost::format("%s(.*)") % "CONTACT").str()))) {
296 auto meshset = m->getMeshset();
297 Range contact_meshset_range;
298 CHKERR m_field_ptr->get_moab().get_entities_by_dimension(
299 meshset, SPACE_DIM - 1, contact_meshset_range, true);
300
301 CHKERR m_field_ptr->getInterface<CommInterface>()->synchroniseEntities(
302 contact_meshset_range);
303 contact_range.merge(contact_meshset_range);
304 }
305
306 auto contact_range_ptr = boost::make_shared<Range>(contact_range);
307
308 auto op_loop_side = new OpLoopSide<SideEle>(
309 *m_field_ptr, m_field_ptr->getInterface<Simple>()->getDomainFEName(),
310 SPACE_DIM);
311 CHKERR AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
312 op_loop_side->getOpPtrVector(), {H1}, "GEOMETRY");
313
315 (opFactoryCalculateArea<SPACE_DIM, GAUSS, BoundaryEleOp>(
316 integrate_area->getOpPtrVector(), op_loop_side, "SIGMA", "U",
317 is_axisymmetric, contact_range_ptr)),
318 "push operators to calculate area");
319
320 return integrate_area;
321 };
322
323 postProcDomainFe = get_post_proc_domain_fe();
324 if constexpr (SPACE_DIM == 2)
325 postProcBdyFe = get_post_proc_bdy_fe();
326
327 integrateTraction = get_integrate_traction();
328 integrateArea = get_integrate_area();
329 }
330
331 MoFEMErrorCode preProcess() { return 0; }
332 MoFEMErrorCode operator()() { return 0; }
333
334 MoFEMErrorCode postProcess() {
336 MoFEM::Interface *m_field_ptr;
337 CHKERR DMoFEMGetInterfacePtr(dM, &m_field_ptr);
338
339 auto post_proc = [&]() {
341
342 if (!mfrontInterfacePtr) {
343 auto post_proc_begin =
344 boost::make_shared<PostProcBrokenMeshInMoabBaseBegin>(*m_field_ptr,
345 postProcMesh);
346 auto post_proc_end =
347 boost::make_shared<PostProcBrokenMeshInMoabBaseEnd>(*m_field_ptr,
348 postProcMesh);
349
350 CHKERR DMoFEMPreProcessFiniteElements(dM,
351 post_proc_begin->getFEMethod());
352 if (!postProcBdyFe) {
353 postProcDomainFe->copyTs(*this); // this here is a Monitor
354 CHKERR DMoFEMLoopFiniteElements(dM, "bFE", postProcDomainFe);
355 } else {
356 postProcDomainFe->copyTs(*this); // this here is a Monitor
357 postProcBdyFe->copyTs(*this);
358 CHKERR DMoFEMLoopFiniteElements(dM, "dFE", postProcDomainFe);
359 CHKERR DMoFEMLoopFiniteElements(dM, "bFE", postProcBdyFe);
360 }
361 CHKERR DMoFEMPostProcessFiniteElements(dM,
362 post_proc_end->getFEMethod());
363
364 CHKERR post_proc_end->writeFile(
365 "out_contact_" + boost::lexical_cast<std::string>(sTEP) + ".h5m");
366 } else {
367 CHKERR mfrontInterfacePtr->postProcess(
368 ts_step, dM,
369 m_field_ptr->getInterface<Simple>()->getDomainFEName());
370 }
371
373 };
374
375 auto calculate_force = [&] {
377 CHKERR VecZeroEntries(CommonData::totalTractionAndArea);
378 CHKERR DMoFEMLoopFiniteElements(dM, "bFE", integrateTraction);
379 CHKERR VecAssemblyBegin(CommonData::totalTractionAndArea);
380 CHKERR VecAssemblyEnd(CommonData::totalTractionAndArea);
382 };
383
384 auto calculate_area = [&] {
386 integrateArea->copyTs(*this);
387 CHKERR DMoFEMLoopFiniteElements(dM, "bFE", integrateArea);
388 CHKERR VecAssemblyBegin(CommonData::totalTractionAndArea);
389 CHKERR VecAssemblyEnd(CommonData::totalTractionAndArea);
391 };
392
393 auto calculate_reactions = [&]() {
395
396 auto res = createDMVector(dM);
397
398 auto assemble_domain = [&]() {
400 auto fe_rhs = boost::make_shared<DomainEle>(*m_field_ptr);
401 auto &pip = fe_rhs->getOpPtrVector();
402 fe_rhs->f = res;
403
404 auto integration_rule = [](int, int, int approx_order) {
405 return 2 * approx_order + geom_order - 1;
406 };
407 fe_rhs->getRuleHook = integration_rule;
408
409 CHKERR AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(pip, {H1},
410 "GEOMETRY");
411 CHKERR
412 ContactOps::opFactoryDomainRhs<SPACE_DIM, PETSC, IT, DomainEleOp>(
413 pip, "SIGMA", "U", is_axisymmetric);
414
415 if (!mfrontInterfacePtr) {
416 CHKERR
417 HenckyOps::opFactoryDomainRhs<SPACE_DIM, PETSC, IT, DomainEleOp>(
418 *m_field_ptr, pip, "U", "MAT_ELASTIC", Sev::inform, scale);
419 } else {
420 CHKERR mfrontInterfacePtr->opFactoryDomainRhs(pip, "U");
421 }
422 CHKERR DMoFEMLoopFiniteElements(dM, "dFE", fe_rhs);
423
424 CHKERR VecAssemblyBegin(res);
425 CHKERR VecAssemblyEnd(res);
426 CHKERR VecGhostUpdateBegin(res, ADD_VALUES, SCATTER_REVERSE);
427 CHKERR VecGhostUpdateEnd(res, ADD_VALUES, SCATTER_REVERSE);
428
430 };
431
432 auto assemble_boundary = [&]() {
434 auto fe_rhs = boost::make_shared<BoundaryEle>(*m_field_ptr);
435 auto &pip = fe_rhs->getOpPtrVector();
436 fe_rhs->f = res;
437
438 auto integration_rule = [](int, int, int approx_order) {
439 return 2 * approx_order + geom_order - 1;
440 };
441 fe_rhs->getRuleHook = integration_rule;
442
443 CHKERR AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(pip, {},
444 "GEOMETRY");
445 // We have to integrate on curved face geometry, thus integration weight
446 // have to adjusted.
447 pip.push_back(new OpSetHOWeightsOnSubDim<SPACE_DIM>());
448
449 auto u_disp = boost::make_shared<MatrixDouble>();
450 pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_disp));
451 pip.push_back(
452 new OpSpringRhs("U", u_disp, [this](double, double, double) {
453 return spring_stiffness;
454 }));
455
456 CHKERR DMoFEMLoopFiniteElements(dM, "bFE", fe_rhs);
457
459 };
460
461 CHKERR assemble_domain();
462 CHKERR assemble_boundary();
463
464 auto fe_post_proc_ptr = boost::make_shared<FEMethod>();
465 auto get_post_proc_hook_rhs = [this, fe_post_proc_ptr, res,
466 m_field_ptr]() {
468 CHKERR EssentialPreProcReaction<DisplacementCubitBcData>(
469 *m_field_ptr, fe_post_proc_ptr, res)();
471 };
472 fe_post_proc_ptr->postProcessHook = get_post_proc_hook_rhs;
473 CHKERR DMoFEMPostProcessFiniteElements(dM, fe_post_proc_ptr.get());
474
476 };
477
478 auto print_max_min = [&](auto &tuple, const std::string msg) {
480 CHKERR VecScatterBegin(std::get<1>(tuple), ts_u, std::get<0>(tuple),
481 INSERT_VALUES, SCATTER_FORWARD);
482 CHKERR VecScatterEnd(std::get<1>(tuple), ts_u, std::get<0>(tuple),
483 INSERT_VALUES, SCATTER_FORWARD);
484 double max, min;
485 CHKERR VecMax(std::get<0>(tuple), PETSC_NULLPTR, &max);
486 CHKERR VecMin(std::get<0>(tuple), PETSC_NULLPTR, &min);
487 MOFEM_LOG_C("CONTACT", Sev::inform, "%s time %6.4e min %6.4e max %6.4e",
488 msg.c_str(), ts_t, min, max);
490 };
491
492 auto print_force_and_area = [&]() {
494 MoFEM::Interface *m_field_ptr;
495 CHKERR DMoFEMGetInterfacePtr(dM, &m_field_ptr);
496 if (!m_field_ptr->get_comm_rank()) {
497 const double *t_ptr;
498 CHKERR VecGetArrayRead(CommonData::totalTractionAndArea, &t_ptr);
499 MOFEM_LOG_C("CONTACT", Sev::inform,
500 "Contact force: time %6.3e Fx: %6.6e Fy: %6.6e Fz: %6.6e",
501 ts_t, t_ptr[TX], t_ptr[TY], t_ptr[TZ]);
502 MOFEM_LOG_C("CONTACT", Sev::inform,
503 "Contact area: time %6.3e Active: %6.6e Potential: %6.6e",
504 ts_t, t_ptr[AREA_ACTIVE], t_ptr[AREA_POTENTIAL]);
505 CHKERR VecRestoreArrayRead(CommonData::totalTractionAndArea, &t_ptr);
506 }
508 };
509
510 if (mfrontInterfacePtr) {
511 CHKERR mfrontInterfacePtr->updateInternalVariables(
512 dM, m_field_ptr->getInterface<Simple>()->getDomainFEName());
513 }
514
515 int se = 1;
516 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-save_every", &se,
517 PETSC_NULLPTR);
518
519 if (!(ts_step % se)) {
520 MOFEM_LOG("CONTACT", Sev::inform)
521 << "Write file at time " << ts_t << " write step " << sTEP;
522 CHKERR post_proc();
523 }
524 CHKERR calculate_force();
525 CHKERR calculate_area();
526
527 CHKERR calculate_reactions();
528
529 CHKERR print_max_min(uXScatter, "Ux");
530 CHKERR print_max_min(uYScatter, "Uy");
531 if (SPACE_DIM == 3)
532 CHKERR print_max_min(uZScatter, "Uz");
533 CHKERR print_force_and_area();
534 ++sTEP;
535
537 }
538
539 MoFEMErrorCode setScatterVectors(
540 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> ux_scatter,
541 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> uy_scatter,
542 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> uz_scatter) {
544 uXScatter = ux_scatter;
545 uYScatter = uy_scatter;
546 uZScatter = uz_scatter;
548 }
549
550private:
551 SmartPetscObj<DM> dM;
552 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> uXScatter;
553 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> uYScatter;
554 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> uZScatter;
555
556 boost::shared_ptr<moab::Core> postProcMesh = boost::make_shared<moab::Core>();
557
558 boost::shared_ptr<PostProcEleDomain> postProcDomainFe;
559 boost::shared_ptr<PostProcEleBdy> postProcBdyFe;
560
561 boost::shared_ptr<BoundaryEle> integrateTraction;
562 boost::shared_ptr<BoundaryEle> integrateArea;
563
565 moab::Interface &moabVertex;
566
567 double lastTime;
568 double deltaTime;
569 int sTEP;
571
572 boost::shared_ptr<MFrontInterface> mfrontInterfacePtr;
573};
574
575} // namespace ContactOps
SmartPetscObj< Mat > C
#define MOFEM_LOG_C(channel, severity, format,...)
constexpr int SPACE_DIM
double spring_stiffness
Definition contact.cpp:85
PetscBool is_large_strain
Definition contact.cpp:92
FormsIntegrators< BoundaryEleOp >::Assembly< AT >::LinearForm< IT >::OpBaseTimesVector< 1, SPACE_DIM, SPACE_DIM > OpSpringRhs
Definition contact.cpp:73
PetscBool is_axisymmetric
Definition contact.cpp:91
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
@ H1
continuous field
Definition definitions.h:85
@ NOSPACE
Definition definitions.h:83
@ HDIV
field with continuous normal traction
Definition definitions.h:87
#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.
auto integration_rule
#define MOFEM_LOG(channel, severity)
Log.
PostProcEleByDim< SPACE_DIM >::SideEle SideEle
PostProcEleByDim< SPACE_DIM >::PostProcEleBdy PostProcEleBdy
PostProcEleByDim< SPACE_DIM >::PostProcEleDomain PostProcEleDomain
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
double scale
Definition plastic.cpp:124
int geom_order
Order if fixed.
Definition plastic.cpp:142
static constexpr int approx_order
FTensor::Index< 'm', 3 > m
moab::Interface & moabVertex
MoFEMErrorCode setScatterVectors(std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > ux_scatter, std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uy_scatter, std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uz_scatter)
MoFEMErrorCode postProcess()
boost::shared_ptr< BoundaryEle > integrateTraction
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uYScatter
boost::shared_ptr< PostProcEleDomain > postProcDomainFe
SmartPetscObj< DM > dM
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uXScatter
boost::shared_ptr< moab::Core > postProcMesh
Monitor(SmartPetscObj< DM > &dm, double scale, boost::shared_ptr< MFrontInterface > mfront_interface_ptr=nullptr, bool is_axisymmetric=false, bool is_large_strain=false)
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uZScatter
MoFEMErrorCode preProcess()
boost::shared_ptr< PostProcEleBdy > postProcBdyFe
boost::shared_ptr< BoundaryEle > integrateArea
boost::shared_ptr< MFrontInterface > mfrontInterfacePtr
MoFEMErrorCode operator()()
PostProcBrokenMeshInMoabBaseCont< DomainEle > PostProcEleDomain
PipelineManager::ElementsAndOpsByDim< 2 >::FaceSideEle SideEle
PostProcBrokenMeshInMoabBaseCont< BoundaryEle > PostProcEleBdy
PipelineManager::ElementsAndOpsByDim< 3 >::FaceSideEle SideEle
PostProcBrokenMeshInMoabBaseCont< BoundaryEle > PostProcEleBdy
PostProcBrokenMeshInMoabBaseCont< BoundaryEle > PostProcEleDomain
virtual int get_comm_rank() const =0
Deprecated interface functions.
Post post-proc data at points from hash maps.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.