331 {
335 auto det_ptr = boost::make_shared<VectorDouble>();
336 auto jac_ptr = boost::make_shared<MatrixDouble>();
337 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
338
339 pip->getDomainRhsFE().reset();
340 pip->getDomainLhsFE().reset();
341 pip->getBoundaryRhsFE().reset();
342 pip->getBoundaryLhsFE().reset();
343
344
345
346 auto post_proc_mesh = boost::make_shared<moab::Core>();
347 auto post_proc_begin = boost::make_shared<PostProcBrokenMeshInMoabBaseBegin>(
348 mField, post_proc_mesh);
349 auto post_proc_end = boost::make_shared<PostProcBrokenMeshInMoabBaseEnd>(
350 mField, post_proc_mesh);
351
352
353
354 auto calculate_stress_ops = [&](auto &pip) {
355
357
358
359 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
360 mField, pip, "U", "MAT_ELASTIC", Sev::verbose);
361
362
363 auto u_ptr = boost::make_shared<MatrixDouble>();
364 pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
365 auto x_ptr = boost::make_shared<MatrixDouble>();
366 pip.push_back(
367 new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", x_ptr));
368
369
370 return boost::make_tuple(u_ptr, x_ptr, common_ptr->getMatStrain(),
371 common_ptr->getMatCauchyStress());
372 };
373
374 auto get_tag_id_on_pmesh = [&](bool post_proc_skin) {
375 int def_val_int = 0;
378 "MAT_ELASTIC", 1, MB_TYPE_INTEGER, tag_mat,
379 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val_int);
380 if (rval == MB_ALREADY_ALLOCATED) {
381 return std::vector<Tag>{};
382 } else {
384 }
385 auto meshset_vec_ptr =
387 std::regex((boost::format("%s(.*)") % "MAT_ELASTIC").str()));
388
390 std::unique_ptr<Skinner> skin_ptr;
391 if (post_proc_skin) {
393 auto boundary_meshset =
simple->getBoundaryMeshSet();
395 skin_ents, true);
396 }
397
398 for (
auto m : meshset_vec_ptr) {
401 true);
402 int const id =
m->getMeshsetId();
403 ents_3d = ents_3d.subset_by_dimension(
SPACE_DIM);
404 if (post_proc_skin) {
406 CHKERR skin_ptr->find_skin(0, ents_3d,
false, skin_faces);
407 ents_3d = intersect(skin_ents, skin_faces);
408 }
410 }
411
412 return std::vector<Tag>{tag_mat};
413 };
414
415 auto post_proc_domain = [&](auto post_proc_mesh) {
416 auto post_proc_fe =
417 boost::make_shared<PostProcEleDomain>(mField, post_proc_mesh);
418 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
419
420 auto [u_ptr, x_ptr, mat_strain_ptr, mat_stress_ptr] =
421 calculate_stress_ops(post_proc_fe->getOpPtrVector());
422
423 post_proc_fe->getOpPtrVector().push_back(
424
426
427 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
428
429 {},
430
431 {{"U", u_ptr}, {"GEOMETRY", x_ptr}},
432
433 {},
434
435 {{"STRAIN", mat_strain_ptr}, {"STRESS", mat_stress_ptr}}
436
437 )
438
439 );
440
441 post_proc_fe->setTagsToTransfer(get_tag_id_on_pmesh(false));
442 return post_proc_fe;
443 };
444
445 auto post_proc_boundary = [&](auto post_proc_mesh) {
446 auto post_proc_fe =
447 boost::make_shared<PostProcEleBdy>(mField, post_proc_mesh);
449 post_proc_fe->getOpPtrVector(), {}, "GEOMETRY");
450 auto op_loop_side =
452
453 auto [u_ptr, x_ptr, mat_strain_ptr, mat_stress_ptr] =
454 calculate_stress_ops(op_loop_side->getOpPtrVector());
455 post_proc_fe->getOpPtrVector().push_back(op_loop_side);
456 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
457 post_proc_fe->getOpPtrVector().push_back(
459
460 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
461
462 post_proc_fe->getOpPtrVector().push_back(
463
465
466 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
467
468 {},
469
470 {{"U", u_ptr}, {"GEOMETRY", x_ptr}, {"T", mat_traction_ptr}},
471
472 {},
473
474 {{"STRAIN", mat_strain_ptr}, {"STRESS", mat_stress_ptr}}
475
476 )
477
478 );
479
480 post_proc_fe->setTagsToTransfer(get_tag_id_on_pmesh(true));
481 return post_proc_fe;
482 };
483
484 PetscBool post_proc_skin_only = PETSC_FALSE;
486 post_proc_skin_only = PETSC_TRUE;
488 &post_proc_skin_only, PETSC_NULLPTR);
489 }
490 if (post_proc_skin_only == PETSC_FALSE) {
491 pip->getDomainRhsFE() = post_proc_domain(post_proc_mesh);
492 } else {
493 pip->getBoundaryRhsFE() = post_proc_boundary(post_proc_mesh);
494 }
495
497 post_proc_begin->getFEMethod());
498 CHKERR pip->loopFiniteElements();
500 post_proc_end->getFEMethod());
501
502 CHKERR post_proc_end->writeFile(
"out_elastic.h5m");
504}
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
PetscErrorCode DMoFEMPreProcessFiniteElements(DM dm, MoFEM::FEMethod *method)
execute finite element method for each element in dm (problem)
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
FTensor::Index< 'm', 3 > m
virtual moab::Interface & get_moab()=0