527 {
529
532
535 };
536
541
542#ifdef WITH_ADOL_C
544
545#ifdef WITH_ADOL_C_UMAT
546 {
547 constexpr int umat_model_type =
549 auto umat_physical_equations_ptr =
551 umat_model_type>(
553
554 CHKERR umat_physical_equations_ptr->getOptions(&
mField);
555 CHKERR umat_physical_equations_ptr->recordTape();
556
558 }
559#else
564 mat_ops_data_ptr,
566 }
567
568 #ifdef WITH_ADOL_C_GENERIC_ELASTIC
569 {
570 auto generic_physical_equations_ptr =
573 mat_ops_data_ptr,
575
577
578 generic_physical_equations_ptr->hookEvaluateVariable =
580 generic_physical_equations_ptr->hookEvaluateDerivatives =
582 generic_physical_equations_ptr->hookUpdateState =
584
585 CHKERR generic_physical_equations_ptr->getOptions(&
mField);
586 CHKERR generic_physical_equations_ptr->recordTape();
587
589 material_map[generic_physical_equations_ptr->tAg] =
590 generic_physical_equations_ptr;
592 }
593 #endif
594
595 #ifdef WITH_ADOL_C_SIMPLE_DAMAGE
596 {
597 auto generic_physical_equations_ptr =
601 "GenericElasticSimpleDamage"));
602
604 mField, boost::dynamic_pointer_cast<MatOps::GenericElastic>(
605 generic_physical_equations_ptr));
606
607 CHKERR generic_physical_equations_ptr->getOptions(&
mField);
608 CHKERR generic_physical_equations_ptr->recordTape();
609
611 material_map[generic_physical_equations_ptr->tAg] =
612 generic_physical_equations_ptr;
614 }
615 #endif
616
620 }
621
624 ->getCubitMeshsetPtr(std::regex("MAT_HUHU(.*)"))
625 .empty()) {
628 MatOps::createMatOpsPhysicalEquationsPtr<MatOps::HUHU, modelType>(
632 }
633#endif
634
635 auto add_domain_ops_lhs = [&](auto &pip) {
638 "GEOMETRY");
641 template opLhsFactory<PETSC, GAUSS, DomainEleOp>(
643 }
646 template opLhsFactory<PETSC, GAUSS, DomainEleOp>(
648 }
650 };
651
652 auto add_domain_ops_rhs = [&](auto &pip) {
655 "GEOMETRY");
658 template opRhsFactory<PETSC, GAUSS, DomainEleOp>(
660 }
663 template opRhsFactory<PETSC, GAUSS, DomainEleOp>(
665 }
667 };
668
669 auto add_domain_ops_update = [&](auto &pip) {
672 "GEOMETRY");
676 }
678 };
679
680 CHKERR add_domain_ops_lhs(pipeline_mng->getOpDomainLhsPipeline());
681 CHKERR add_domain_ops_rhs(pipeline_mng->getOpDomainRhsPipeline());
682
686
687 CHKERR add_domain_ops_rhs(pipeline_mng->getOpEvaluationPipeline());
688 auto &domain_reaction_fe = pipeline_mng->getEvaluationFE();
689 domain_reaction_fe->postProcessHook =
690 EssentialPreProcReaction<DisplacementCubitBcData>(
mField,
691 domain_reaction_fe);
692
693 PetscBool post_proc_vol;
694 PetscBool post_proc_skin;
695
697 post_proc_vol = PETSC_TRUE;
698 post_proc_skin = PETSC_FALSE;
699 } else {
700 post_proc_vol = PETSC_FALSE;
701 post_proc_skin = PETSC_TRUE;
702 }
703
705 &post_proc_vol, PETSC_NULLPTR);
707 &post_proc_skin, PETSC_NULLPTR);
708
709
710 auto create_post_proc_fe = [&]() {
711 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
712
713 auto post_proc_ele_domain = [&](auto &pip_domain) {
716 "GEOMETRY");
720 }
722 };
723
724 auto post_proc_map = [&](auto &pip, auto u_ptr) {
727 auto grad_ptr =
729 auto first_piola_ptr =
731 pip->getOpPtrVector().push_back(
new OpPPMap(
732 pip->getPostProcMesh(), pip->getMapGaussPts(), {}, {{"U", u_ptr}},
733 {}, {}));
734 pip->getOpPtrVector().push_back(
735 new OpPostProcMapInMoab<MAT_DIM, MAT_DIM>(
736 pip->getPostProcMesh(), pip->getMapGaussPts(), {}, {},
737 {{"GRAD", grad_ptr}, {"FIRST_PIOLA", first_piola_ptr}}, {}));
738 }
740 };
741
742 auto push_post_proc_bdy = [&](auto &pip_bdy) {
743 if (post_proc_skin == PETSC_FALSE)
744 return boost::shared_ptr<PostProcEleBdy>();
746 auto domain_fe_name =
simple->getDomainFEName();
747 auto u_ptr = boost::make_shared<MatrixDouble>();
748 pip_bdy->getOpPtrVector().push_back(
749 new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
750 auto op_loop_side =
752 CHKERR post_proc_ele_domain(op_loop_side->getOpPtrVector());
753 pip_bdy->getOpPtrVector().push_back(op_loop_side);
754 CHKERR post_proc_map(pip_bdy, u_ptr);
755 return pip_bdy;
756 };
757
758 auto push_post_proc_domain = [&](auto &pip_domain) {
759 if (post_proc_vol == PETSC_FALSE)
760 return boost::shared_ptr<PostProcEleDomain>();
761 auto u_ptr = boost::make_shared<MatrixDouble>();
762 pip_domain->getOpPtrVector().push_back(
763 new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
764 CHKERR post_proc_ele_domain(pip_domain->getOpPtrVector());
765
768 if (!state_tags.empty()) {
771 selected_state_tags.reserve(state_tags.size());
772 statev_tags.reserve(state_tags.size());
773
774 constexpr auto statev_prefix = "UMAT_STATEV_";
775 constexpr auto statev_prefix_len = sizeof("UMAT_STATEV_") - 1;
776 auto get_statev_index = [&](const std::string &name) {
777 return std::stoi(name.substr(statev_prefix_len));
778 };
779
780 for (const auto &state_tag : state_tags) {
781 const auto &name = state_tag.name;
782
783 if (name == "UMAT_DFGRD0" || name == "UMAT_STRESS") {
784 selected_state_tags.push_back(state_tag);
785 continue;
786 }
787
788 if (name.rfind(statev_prefix, 0) == 0) {
789 statev_tags.push_back(state_tag);
790 }
791 }
792
793 std::sort(statev_tags.begin(), statev_tags.end(),
794 [&](const auto &lhs, const auto &rhs) {
795 return get_statev_index(lhs.name) <
796 get_statev_index(rhs.name);
797 });
798 if (statev_tags.size() > 10)
799 statev_tags.resize(10);
800 selected_state_tags.insert(selected_state_tags.end(),
801 statev_tags.begin(), statev_tags.end());
802
803 if (selected_state_tags.empty())
804 return pip_domain;
805
807 int state_order = 2;
809 PETSC_NULLPTR);
810 auto op_loop_this = new OpLoopThis<DomainEle>(
813 pip_domain->getOpPtrVector().push_back(op_loop_this);
814 CHKERR addTagDGProjectionOps<SPACE_DIM, SPACE_DIM>(
816 op_loop_this->getThisFEPtr()->getOpPtrVector(),
817 pip_domain->getPostProcMesh(), pip_domain->getMapGaussPts(),
819 }
820 }
821
822 CHKERR post_proc_map(pip_domain, u_ptr);
823
824 return pip_domain;
825 };
826
827 auto post_proc_fe_domain = boost::make_shared<PostProcEleDomain>(
mField);
828 auto post_proc_fe_bdy = boost::make_shared<PostProcEleBdy>(
mField);
829
830 return std::make_pair(push_post_proc_domain(post_proc_fe_domain),
831 push_post_proc_bdy(post_proc_fe_bdy));
832 };
833
834 auto post_proc_pair = create_post_proc_fe();
837
838#else
840 "ADOL-C support is not enabled. Please reconfigure with "
841 "-DWITH_ADOL_C=ON and recompile to use AdolC material model.");
842
843#endif
845}
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