517 {
519
522
525 };
526
531
532#ifdef WITH_ADOL_C
534
535#ifdef WITH_ADOL_C_UMAT
536 {
537 constexpr int umat_model_type =
539 auto umat_physical_equations_ptr =
541 umat_model_type>(
543
544 CHKERR umat_physical_equations_ptr->getOptions(&
mField);
545 CHKERR umat_physical_equations_ptr->recordTape();
546
548 }
549#else
554 mat_ops_data_ptr,
556 }
557
558 #ifdef WITH_ADOL_C_GENERIC_ELASTIC
559 {
560 auto generic_physical_equations_ptr =
563 mat_ops_data_ptr,
565
567
568 generic_physical_equations_ptr->hookEvaluateVariable =
570 generic_physical_equations_ptr->hookEvaluateDerivatives =
572 generic_physical_equations_ptr->hookUpdateState =
574
575 CHKERR generic_physical_equations_ptr->getOptions(&
mField);
576 CHKERR generic_physical_equations_ptr->recordTape();
577
579 material_map[generic_physical_equations_ptr->tAg] =
580 generic_physical_equations_ptr;
582 }
583 #endif
584
585 #ifdef WITH_ADOL_C_SIMPLE_DAMAGE
586 {
587 auto generic_physical_equations_ptr =
591 "GenericElasticSimpleDamage"));
592
594 mField, boost::dynamic_pointer_cast<MatOps::GenericElastic>(
595 generic_physical_equations_ptr));
596
597 CHKERR generic_physical_equations_ptr->getOptions(&
mField);
598 CHKERR generic_physical_equations_ptr->recordTape();
599
601 material_map[generic_physical_equations_ptr->tAg] =
602 generic_physical_equations_ptr;
604 }
605 #endif
606
610 }
611
615 MatOps::createMatOpsPhysicalEquationsPtr<MatOps::HUHU, modelType>(
619 }
620#endif
621
622 auto add_domain_ops_lhs = [&](auto &pip) {
625 "GEOMETRY");
628 template opLhsFactory<PETSC, GAUSS, DomainEleOp>(
630 }
633 template opLhsFactory<PETSC, GAUSS, DomainEleOp>(
635 }
637 };
638
639 auto add_domain_ops_rhs = [&](auto &pip) {
642 "GEOMETRY");
645 template opRhsFactory<PETSC, GAUSS, DomainEleOp>(
647 }
650 template opRhsFactory<PETSC, GAUSS, DomainEleOp>(
652 }
654 };
655
656 auto add_domain_ops_update = [&](auto &pip) {
659 "GEOMETRY");
663 }
665 };
666
667 CHKERR add_domain_ops_lhs(pipeline_mng->getOpDomainLhsPipeline());
668 CHKERR add_domain_ops_rhs(pipeline_mng->getOpDomainRhsPipeline());
669
673
674 CHKERR add_domain_ops_rhs(pipeline_mng->getOpEvaluationPipeline());
675 auto &domain_reaction_fe = pipeline_mng->getEvaluationFE();
676 domain_reaction_fe->postProcessHook =
677 EssentialPreProcReaction<DisplacementCubitBcData>(
mField,
678 domain_reaction_fe);
679
680 PetscBool post_proc_vol;
681 PetscBool post_proc_skin;
682
684 post_proc_vol = PETSC_TRUE;
685 post_proc_skin = PETSC_FALSE;
686 } else {
687 post_proc_vol = PETSC_FALSE;
688 post_proc_skin = PETSC_TRUE;
689 }
690
692 &post_proc_vol, PETSC_NULLPTR);
694 &post_proc_skin, PETSC_NULLPTR);
695
696
697 auto create_post_proc_fe = [&]() {
698 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
699
700 auto post_proc_ele_domain = [&](auto &pip_domain) {
703 "GEOMETRY");
707 }
709 };
710
711 auto post_proc_map = [&](auto &pip, auto u_ptr) {
714 auto grad_ptr =
716 auto first_piola_ptr =
718 pip->getOpPtrVector().push_back(
new OpPPMap(
719 pip->getPostProcMesh(), pip->getMapGaussPts(), {}, {{"U", u_ptr}},
720 {{"GRAD", grad_ptr}, {"FIRST_PIOLA", first_piola_ptr}}, {}));
721 }
723 };
724
725 auto push_post_proc_bdy = [&](auto &pip_bdy) {
726 if (post_proc_skin == PETSC_FALSE)
727 return boost::shared_ptr<PostProcEleBdy>();
729 auto domain_fe_name =
simple->getDomainFEName();
730 auto u_ptr = boost::make_shared<MatrixDouble>();
731 pip_bdy->getOpPtrVector().push_back(
732 new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
733 auto op_loop_side =
735 CHKERR post_proc_ele_domain(op_loop_side->getOpPtrVector());
736 pip_bdy->getOpPtrVector().push_back(op_loop_side);
737 CHKERR post_proc_map(pip_bdy, u_ptr);
738 return pip_bdy;
739 };
740
741 auto push_post_proc_domain = [&](auto &pip_domain) {
742 if (post_proc_vol == PETSC_FALSE)
743 return boost::shared_ptr<PostProcEleDomain>();
744 auto u_ptr = boost::make_shared<MatrixDouble>();
745 pip_domain->getOpPtrVector().push_back(
746 new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
747 CHKERR post_proc_ele_domain(pip_domain->getOpPtrVector());
748
751 if (!state_tags.empty()) {
754 selected_state_tags.reserve(state_tags.size());
755 statev_tags.reserve(state_tags.size());
756
757 constexpr auto statev_prefix = "UMAT_STATEV_";
758 constexpr auto statev_prefix_len = sizeof("UMAT_STATEV_") - 1;
759 auto get_statev_index = [&](const std::string &name) {
760 return std::stoi(name.substr(statev_prefix_len));
761 };
762
763 for (const auto &state_tag : state_tags) {
764 const auto &name = state_tag.name;
765
766 if (name == "UMAT_DFGRD0" || name == "UMAT_STRESS") {
767 selected_state_tags.push_back(state_tag);
768 continue;
769 }
770
771 if (name.rfind(statev_prefix, 0) == 0) {
772 statev_tags.push_back(state_tag);
773 }
774 }
775
776 std::sort(statev_tags.begin(), statev_tags.end(),
777 [&](const auto &lhs, const auto &rhs) {
778 return get_statev_index(lhs.name) <
779 get_statev_index(rhs.name);
780 });
781 if (statev_tags.size() > 10)
782 statev_tags.resize(10);
783 selected_state_tags.insert(selected_state_tags.end(),
784 statev_tags.begin(), statev_tags.end());
785
786 if (selected_state_tags.empty())
787 return pip_domain;
788
790 int state_order = 2;
792 PETSC_NULLPTR);
793 auto op_loop_this = new OpLoopThis<DomainEle>(
796 pip_domain->getOpPtrVector().push_back(op_loop_this);
797 CHKERR addTagDGProjectionOps<SPACE_DIM, SPACE_DIM>(
799 op_loop_this->getThisFEPtr()->getOpPtrVector(),
800 pip_domain->getPostProcMesh(), pip_domain->getMapGaussPts(),
802 }
803 }
804
805 CHKERR post_proc_map(pip_domain, u_ptr);
806
807 return pip_domain;
808 };
809
810 auto post_proc_fe_domain = boost::make_shared<PostProcEleDomain>(
mField);
811 auto post_proc_fe_bdy = boost::make_shared<PostProcEleBdy>(
mField);
812
813 return std::make_pair(push_post_proc_domain(post_proc_fe_domain),
814 push_post_proc_bdy(post_proc_fe_bdy));
815 };
816
817 auto post_proc_pair = create_post_proc_fe();
820
821#else
823 "ADOL-C support is not enabled. Please reconfigure with "
824 "-DWITH_ADOL_C=ON and recompile to use AdolC material model.");
825
826#endif
828}
void simple(double P1[], double P2[], double P3[], double c[], const int N)
#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.
MoFEMErrorCode configureSimpleDamage(MoFEM::Interface &m_field, boost::shared_ptr< MatOps::GenericElastic > physical_ptr)
std::map< int, boost::shared_ptr< PhysicalEquations > > & getMetaElasticMap(boost::shared_ptr< PhysicalEquations > meta_ptr)
std::vector< StateTag > StateTags
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< MatOpsData > createMatOpsDataPtr()
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
static constexpr int approx_order
static MoFEMErrorCode hookEvaluateVariable(boost::shared_ptr< MatOps::MatOpsData > mat_ops_data_ptr, int, EntityHandle, int)
static MoFEMErrorCode hookEvaluateDerivatives(boost::shared_ptr< MatOps::MatOpsData > mat_ops_data_ptr, int, EntityHandle, int)
static MoFEMErrorCode hookUpdateState(boost::shared_ptr< MatOps::MatOpsData >, int, EntityHandle, int)
virtual moab::Interface & get_moab()=0
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
FieldApproximationBase approximationBase
boost::shared_ptr< PostProcEleBdy > postProcBdyFe
boost::shared_ptr< MatOps::PhysicalEquations > physicalEquationsPtr
static constexpr int modelType
boost::shared_ptr< PostProcEleDomain > postProcDomainFe
boost::shared_ptr< MatOps::PhysicalEquations > physicalHuHuPtr
boost::shared_ptr< DomainEle > updateFe