431 {
433
434 auto getMaterialParams = [&](
double E,
double nu) {
437 }
438
444 };
445
446 auto fe_ent = op_ptr->getNumeredEntFiniteElementPtr()->getEnt();
447 int nb_integration_pts = op_ptr->getGaussPts().size2();
448
449 dataAtGaussPts->muAtPts.resize(nb_integration_pts, false);
450 dataAtGaussPts->lambdaAtPts.resize(nb_integration_pts, false);
451 dataAtGaussPts->muAtPts.clear();
452 dataAtGaussPts->lambdaAtPts.clear();
453
454 dataAtGaussPts->youngModulusAtPts.resize(nb_integration_pts, false);
455 dataAtGaussPts->youngModulusAtPts.clear();
456
457 auto t_young_modulus =
458 getFTensor0FromVec(dataAtGaussPts->youngModulusAtPts);
459 auto t_mu = getFTensor0FromVec(dataAtGaussPts->muAtPts);
460 auto t_lambda = getFTensor0FromVec(dataAtGaussPts->lambdaAtPts);
461
462 MatrixSizeHelper<
463 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
464 DL>::size(dataAtGaussPts->matD, nb_integration_pts);
465 MatrixSizeHelper<
466 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
467 DL>::size(dataAtGaussPts->matAxiatorD, nb_integration_pts);
468 MatrixSizeHelper<
469 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
470 DL>::size(dataAtGaussPts->matDeviatorD, nb_integration_pts);
471 MatrixSizeHelper<
472 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
473 DL>::size(dataAtGaussPts->matInvD, nb_integration_pts);
474
475 dataAtGaussPts->matD.clear();
476 dataAtGaussPts->matAxiatorD.clear();
477 dataAtGaussPts->matDeviatorD.clear();
478 dataAtGaussPts->matInvD.clear();
479
485
486 auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
487 dataAtGaussPts->matD);
488 auto t_axiator_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
489 dataAtGaussPts->matAxiatorD);
490 auto t_deviator_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
491 dataAtGaussPts->matDeviatorD);
492 auto t_inv_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
493 dataAtGaussPts->matInvD);
494
495 auto next = [&]() {
496 ++t_young_modulus;
497 ++t_mu;
498 ++t_lambda;
499 ++t_D;
500 ++t_axiator_D;
501 ++t_deviator_D;
502 ++t_inv_D;
503 };
504
509 t_deviator_D(
i,
j,
k,
l) =
511 t_D(
i,
j,
k,
l) = t_axiator_D(
i,
j,
k,
l) + t_deviator_D(
i,
j,
k,
l);
513 };
514
520 t_inv_D(
i,
j,
k,
l) =
523 };
524
525
526
528 if (b.blockEnts.find(op_ptr->getFEEntityHandle()) != b.blockEnts.end()) {
529
533
534 auto t_analytical_elastic = getFTensor0FromVec(analytical_elastic);
535
536 for (int gg = 0; gg != nb_integration_pts; ++gg) {
537 const auto material_params =
538 getMaterialParams(t_analytical_elastic, b.poissonRatio);
539 t_young_modulus = material_params.youngModulus;
540 t_mu = material_params.shearModulusG;
541 t_lambda = material_params.lambda;
542
543 CHKERR evalMatD(material_params.bulkModulusK,
544 material_params.shearModulusG);
545 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
546 material_params.shearModulusG);
547 ++t_analytical_elastic;
548 next();
549 }
550
552 Tag tag_heterogenous_mat;
553 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_handle(
555 tag_heterogenous_mat);
556 int tag_length;
557 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_length(
558 tag_heterogenous_mat, tag_length);
559 if (tag_length != 1) {
561 "heterogeneous Young's modulus tag should be 1 but is %d",
562 tag_length);
563 }
565
566 double elem_young_mod = 0.0;
567 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_data(
568 tag_heterogenous_mat, &fe_ent, 1, &elem_young_mod);
569
570 for (int gg = 0; gg != nb_integration_pts; ++gg) {
571 const auto material_params =
572 getMaterialParams(elem_young_mod, b.poissonRatio);
573 t_young_modulus = material_params.youngModulus;
574 t_mu = material_params.shearModulusG;
575 t_lambda = material_params.lambda;
576
577 CHKERR evalMatD(material_params.bulkModulusK,
578 material_params.shearModulusG);
579 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
580 material_params.shearModulusG);
581 next();
582 }
584
585 const EntityHandle *vert_conn;
586 int vert_num;
587 CHKERR op_ptr->getPtrFE()->mField.get_moab().get_connectivity(
588 fe_ent, vert_conn, vert_num, true);
589
591 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_data(
592 tag_heterogenous_mat, vert_conn, vert_num, &vert_young_mod[0]);
593
594 auto t_shape_n = data.getFTensor0N();
595 int nb_shape_fn = data.getN(
NOBASE).size2();
596
597 for (int gg = 0; gg != nb_integration_pts; ++gg) {
598 t_young_modulus = 0;
599 auto t_vert_young_mod = getFTensor0FromVec(vert_young_mod);
600 for (int bb = 0; bb != nb_shape_fn; ++bb) {
601 t_young_modulus += t_vert_young_mod * t_shape_n;
602 ++t_vert_young_mod;
603 ++t_shape_n;
604 }
605 const auto material_params =
606 getMaterialParams(t_young_modulus, b.poissonRatio);
607 t_young_modulus = material_params.youngModulus;
608 t_mu = material_params.shearModulusG;
609 t_lambda = material_params.lambda;
610
611 CHKERR evalMatD(material_params.bulkModulusK,
612 material_params.shearModulusG);
613 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
614 material_params.shearModulusG);
615 next();
616 }
617 } else {
619 "Unsupported heterogeneous Young's modulus interpolation "
620 "order %d",
622 }
623 } else {
624
625 for (int gg = 0; gg != nb_integration_pts; ++gg) {
626 t_young_modulus = b.youngModulus;
627 t_mu = b.shearModulusG;
628 t_lambda = b.bulkModulusK - 2 * b.shearModulusG / 3;
629
630 CHKERR evalMatD(b.bulkModulusK, b.shearModulusG);
631 CHKERR evalInvMatDPtr(b.bulkModulusK, b.shearModulusG);
632 next();
633 }
634 }
636 }
637 }
638
639
640 const auto material_params = getMaterialParams(this->E, this->
nu);
641
642
643 dataAtGaussPts->mu = material_params.shearModulusG;
644 dataAtGaussPts->lambda = material_params.lambda;
645
646 for (int gg = 0; gg != nb_integration_pts; ++gg) {
647 t_young_modulus = material_params.youngModulus;
648 t_mu = material_params.shearModulusG;
649 t_lambda = material_params.lambda;
650 CHKERR evalMatD(material_params.bulkModulusK,
651 material_params.shearModulusG);
652 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
653 material_params.shearModulusG);
654 next();
655 }
656
658 }
#define FTENSOR_INDEX(DIM, I)
Kronecker Delta class symmetric.
#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 ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
static auto calc_effective_elastic_params(double E, double nu, double diagonal_strain)
VectorDouble getAnalyticalElastic(OP_PTR op_ptr, const std::string block_name)
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
UBlasVector< double > VectorDouble
analytical_elastic(delta_t, t, x, y, z, block_name)
static std::string heterogeneousYoungModTagName
static int meshTransferInterpOrder
PetscBool effectiveNehookeanStiffness
std::vector< BlockData > blockData
double effectiveDiagonalStrain