384 {
386
387 auto getMaterialParams = [&](
double E,
double nu) {
390 }
391
397 };
398
399 auto fe_ent = op_ptr->getNumeredEntFiniteElementPtr()->getEnt();
400 int nb_integration_pts = op_ptr->getGaussPts().size2();
401
402 dataAtGaussPts->muAtPts.resize(nb_integration_pts, false);
403 dataAtGaussPts->lambdaAtPts.resize(nb_integration_pts, false);
404 dataAtGaussPts->muAtPts.clear();
405 dataAtGaussPts->lambdaAtPts.clear();
406
407 dataAtGaussPts->youngModulusAtPts.resize(nb_integration_pts, false);
408 dataAtGaussPts->youngModulusAtPts.clear();
409
410 auto t_young_modulus =
411 getFTensor0FromVec(dataAtGaussPts->youngModulusAtPts);
412 auto t_mu = getFTensor0FromVec(dataAtGaussPts->muAtPts);
413 auto t_lambda = getFTensor0FromVec(dataAtGaussPts->lambdaAtPts);
414
415 MatrixSizeHelper<
416 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
417 DL>::size(dataAtGaussPts->matD, nb_integration_pts);
418 MatrixSizeHelper<
419 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
420 DL>::size(dataAtGaussPts->matAxiatorD, nb_integration_pts);
421 MatrixSizeHelper<
422 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
423 DL>::size(dataAtGaussPts->matDeviatorD, nb_integration_pts);
424 MatrixSizeHelper<
425 GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, STRIDEMATD, DL>,
426 DL>::size(dataAtGaussPts->matInvD, nb_integration_pts);
427
428 dataAtGaussPts->matD.clear();
429 dataAtGaussPts->matAxiatorD.clear();
430 dataAtGaussPts->matDeviatorD.clear();
431 dataAtGaussPts->matInvD.clear();
432
438
439 auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
440 dataAtGaussPts->matD);
441 auto t_axiator_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
442 dataAtGaussPts->matAxiatorD);
443 auto t_deviator_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
444 dataAtGaussPts->matDeviatorD);
445 auto t_inv_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, STRIDEMATD>(
446 dataAtGaussPts->matInvD);
447
448 auto next = [&]() {
449 ++t_young_modulus;
450 ++t_mu;
451 ++t_lambda;
452 ++t_D;
453 ++t_axiator_D;
454 ++t_deviator_D;
455 ++t_inv_D;
456 };
457
462 t_deviator_D(
i,
j,
k,
l) =
464 t_D(
i,
j,
k,
l) = t_axiator_D(
i,
j,
k,
l) + t_deviator_D(
i,
j,
k,
l);
466 };
467
473 t_inv_D(
i,
j,
k,
l) =
476 };
477
478
479
481 if (b.blockEnts.find(op_ptr->getFEEntityHandle()) != b.blockEnts.end()) {
482
486
487 auto t_analytical_elastic = getFTensor0FromVec(analytical_elastic);
488
489 for (int gg = 0; gg != nb_integration_pts; ++gg) {
490 const auto material_params =
491 getMaterialParams(t_analytical_elastic, b.poissonRatio);
492 t_young_modulus = material_params.youngModulus;
493 t_mu = material_params.shearModulusG;
494 t_lambda = material_params.lambda;
495
496 CHKERR evalMatD(material_params.bulkModulusK,
497 material_params.shearModulusG);
498 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
499 material_params.shearModulusG);
500 ++t_analytical_elastic;
501 next();
502 }
503
505 Tag tag_heterogenous_mat;
506 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_handle(
508 tag_heterogenous_mat);
509 int tag_length;
510 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_length(
511 tag_heterogenous_mat, tag_length);
512 if (tag_length != 1) {
514 "heterogeneous Young's modulus tag should be 1 but is %d",
515 tag_length);
516 }
518
519 double elem_young_mod = 0.0;
520 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_data(
521 tag_heterogenous_mat, &fe_ent, 1, &elem_young_mod);
522
523 for (int gg = 0; gg != nb_integration_pts; ++gg) {
524 const auto material_params =
525 getMaterialParams(elem_young_mod, b.poissonRatio);
526 t_young_modulus = material_params.youngModulus;
527 t_mu = material_params.shearModulusG;
528 t_lambda = material_params.lambda;
529
530 CHKERR evalMatD(material_params.bulkModulusK,
531 material_params.shearModulusG);
532 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
533 material_params.shearModulusG);
534 next();
535 }
537
538 const EntityHandle *vert_conn;
539 int vert_num;
540 CHKERR op_ptr->getPtrFE()->mField.get_moab().get_connectivity(
541 fe_ent, vert_conn, vert_num, true);
542
544 CHKERR op_ptr->getPtrFE()->mField.get_moab().tag_get_data(
545 tag_heterogenous_mat, vert_conn, vert_num, &vert_young_mod[0]);
546
547 auto t_shape_n = data.getFTensor0N();
548 int nb_shape_fn = data.getN(
NOBASE).size2();
549
550 for (int gg = 0; gg != nb_integration_pts; ++gg) {
551 t_young_modulus = 0;
552 auto t_vert_young_mod = getFTensor0FromVec(vert_young_mod);
553 for (int bb = 0; bb != nb_shape_fn; ++bb) {
554 t_young_modulus += t_vert_young_mod * t_shape_n;
555 ++t_vert_young_mod;
556 ++t_shape_n;
557 }
558 const auto material_params =
559 getMaterialParams(t_young_modulus, b.poissonRatio);
560 t_young_modulus = material_params.youngModulus;
561 t_mu = material_params.shearModulusG;
562 t_lambda = material_params.lambda;
563
564 CHKERR evalMatD(material_params.bulkModulusK,
565 material_params.shearModulusG);
566 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
567 material_params.shearModulusG);
568 next();
569 }
570 } else {
572 "Unsupported heterogeneous Young's modulus interpolation "
573 "order %d",
575 }
576 } else {
577
578 for (int gg = 0; gg != nb_integration_pts; ++gg) {
579 t_young_modulus = b.youngModulus;
580 t_mu = b.shearModulusG;
581 t_lambda = b.bulkModulusK - 2 * b.shearModulusG / 3;
582
583 CHKERR evalMatD(b.bulkModulusK, b.shearModulusG);
584 CHKERR evalInvMatDPtr(b.bulkModulusK, b.shearModulusG);
585 next();
586 }
587 }
589 }
590 }
591
592
593 const auto material_params = getMaterialParams(this->E, this->
nu);
594
595 for (int gg = 0; gg != nb_integration_pts; ++gg) {
596 t_young_modulus = material_params.youngModulus;
597 t_mu = material_params.shearModulusG;
598 t_lambda = material_params.lambda;
599 CHKERR evalMatD(material_params.bulkModulusK,
600 material_params.shearModulusG);
601 CHKERR evalInvMatDPtr(material_params.bulkModulusK,
602 material_params.shearModulusG);
603 next();
604 }
605
607 }
#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
double effectiveDiagonalStrain