468 auto dm =
simple->getDM();
469 auto time_scale = boost::make_shared<TimeScale>();
472 auto create_post_proc_fe = [dm,
this,
simple]() {
476 auto post_proc_ele_domain = [
this](
auto &pip_domain,
auto &fe_name) {
483 auto grad_ptr = boost::make_shared<MatrixDouble>();
484 pip_domain.push_back(
494 pip_domain.push_back(op_this);
498 auto fe_physics = op_this->getThisFEPtr();
500 auto evaluate_stress_on_physical_element = [&]() {
502 fe_physics->getRuleHook =
cpPtr->integrationRule;
504 fe_physics->getOpPtrVector(), {H1});
505 auto common_data_ptr =
506 boost::make_shared<ADOLCPlasticity::CommonData>();
509 fe_physics->getOpPtrVector().push_back(
511 "U", common_data_ptr->getGardAtGaussPtsPtr()));
514 "ADOLCMAT", Sev::noisy);
515 fe_physics->getOpPtrVector().push_back(
516 getRawPtrOpCalculateStress<SPACE_DIM>(
mField, common_data_ptr,
518 return common_data_ptr;
521 auto dg_projection_froward_and_back = [&](
auto &common_data_ptr) {
524 auto entity_data_l2 =
525 boost::make_shared<EntitiesFieldData>(MBENTITYSET);
527 boost::make_shared<MatrixDouble>();
532 auto coeffs_ptr_stress = boost::make_shared<MatrixDouble>();
535 common_data_ptr->getStressMatrixPtr(), coeffs_ptr_stress, mass_ptr,
538 auto coeffs_ptr_plastic_strain = boost::make_shared<MatrixDouble>();
540 common_data_ptr->getPlasticStrainMatrixPtr(),
541 coeffs_ptr_plastic_strain, mass_ptr, entity_data_l2,
approxBase,
547 common_data_ptr->getStressMatrixPtr(), coeffs_ptr_stress,
550 common_data_ptr->getPlasticStrainMatrixPtr(),
551 coeffs_ptr_plastic_strain, entity_data_l2,
approxBase,
L2));
554 auto common_data_ptr = evaluate_stress_on_physical_element();
555 dg_projection_froward_and_back(common_data_ptr);
557 return boost::make_tuple(grad_ptr, common_data_ptr->getStressMatrixPtr(),
558 common_data_ptr->getPlasticStrainMatrixPtr());
564 auto add_post_proc_map = [&](
auto post_proc_fe,
auto u_ptr,
auto grad_ptr,
565 auto stress_ptr,
auto plastic_strain_ptr) {
567 post_proc_fe->getOpPtrVector().push_back(
569 new OpPPMapSPACE_DIM(
571 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
577 {{
"GRAD", grad_ptr}},
586 post_proc_fe->getOpPtrVector().push_back(
590 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
598 {{
"STRESS", stress_ptr}, {
"PLASTIC_STRAIN", plastic_strain_ptr}}
607 auto vol_post_proc = [
this,
simple, post_proc_ele_domain,
608 add_post_proc_map]() {
609 PetscBool post_proc_vol = PETSC_FALSE;
611 post_proc_vol = PETSC_TRUE;
614 &post_proc_vol, PETSC_NULL);
615 if (post_proc_vol == PETSC_FALSE)
616 return boost::shared_ptr<PostProcEleDomain>();
617 auto post_proc_fe = boost::make_shared<PostProcEleDomain>(
mField);
618 auto u_ptr = boost::make_shared<MatrixDouble>();
619 post_proc_fe->getOpPtrVector().push_back(
621 auto [grad_ptr, stress_ptr, plastic_strain_ptr] = post_proc_ele_domain(
622 post_proc_fe->getOpPtrVector(),
simple->getDomainFEName());
623 return add_post_proc_map(post_proc_fe, u_ptr, grad_ptr, stress_ptr,
627 auto skin_post_proc = [
this,
simple, post_proc_ele_domain,
628 add_post_proc_map]() {
631 PetscBool post_proc_skin = PETSC_TRUE;
633 post_proc_skin = PETSC_FALSE;
636 &post_proc_skin, PETSC_NULL);
638 if (post_proc_skin == PETSC_FALSE)
639 return boost::shared_ptr<PostProcEleBdy>();
641 auto post_proc_fe = boost::make_shared<PostProcEleBdy>(
mField);
642 auto u_ptr = boost::make_shared<MatrixDouble>();
643 post_proc_fe->getOpPtrVector().push_back(
647 auto [grad_ptr, stress_ptr, plastic_strain_ptr] = post_proc_ele_domain(
648 op_loop_side->getOpPtrVector(),
simple->getDomainFEName());
649 post_proc_fe->getOpPtrVector().push_back(op_loop_side);
650 return add_post_proc_map(post_proc_fe, u_ptr, grad_ptr, stress_ptr,
654 return std::make_pair(vol_post_proc(), skin_post_proc());
657 auto create_reaction_fe = [&]() {
658 auto fe_ptr = boost::make_shared<DomainEle>(
mField);
659 fe_ptr->getRuleHook =
cpPtr->integrationRule;
661 auto &pip = fe_ptr->getOpPtrVector();
663 auto common_data_ptr = boost::make_shared<ADOLCPlasticity::CommonData>();
665 "U", common_data_ptr->getGardAtGaussPtsPtr()));
666 CHKERR opFactoryDomainRhs<SPACE_DIM, PETSC, GAUSS, DomainEleOp>(
667 mField,
"U", pip,
"ADOLCMAT", common_data_ptr,
cpPtr, Sev::noisy);
672 auto add_extra_finite_elements_to_ksp_solver_pipelines = [&]() {
675 auto pre_proc_ptr = boost::make_shared<FEMethod>();
676 auto post_proc_rhs_ptr = boost::make_shared<FEMethod>();
677 auto post_proc_lhs_ptr = boost::make_shared<FEMethod>();
679 auto get_bc_hook_rhs = [
this, pre_proc_ptr, time_scale]() {
682 {time_scale},
false)();
686 pre_proc_ptr->preProcessHook = get_bc_hook_rhs;
688 auto get_post_proc_hook_rhs = [
this, post_proc_rhs_ptr]() {
691 mField, post_proc_rhs_ptr,
nullptr, Sev::verbose)();
693 mField, post_proc_rhs_ptr, 1.)();
696 auto get_post_proc_hook_lhs = [
this, post_proc_lhs_ptr]() {
699 mField, post_proc_lhs_ptr, 1.)();
702 post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs;
703 post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs;
707 ts_ctx_ptr->getPreProcessIFunction().push_front(pre_proc_ptr);
708 ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_ptr);
709 ts_ctx_ptr->getPostProcessIFunction().push_back(post_proc_rhs_ptr);
710 ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_lhs_ptr);
716 CHKERR add_extra_finite_elements_to_ksp_solver_pipelines();
718 auto create_monitor_fe = [dm, time_scale](
auto &&post_proc_fe,
719 auto &&reaction_fe) {
720 return boost::make_shared<Monitor>(
721 dm, post_proc_fe, reaction_fe,
722 std::vector<boost::shared_ptr<ScalingMethod>>{time_scale});
726 auto set_up_post_step = [&](
auto ts) {
731 auto create_update_ptr = [&]() {
732 auto fe_ptr = boost::make_shared<DomainEle>(
mField);
733 fe_ptr->getRuleHook =
cpPtr->integrationRule;
736 auto common_data_ptr = boost::make_shared<ADOLCPlasticity::CommonData>();
737 fe_ptr->getOpPtrVector().push_back(
739 "U", common_data_ptr->getGardAtGaussPtsPtr()));
741 opFactoryDomainUpdate<SPACE_DIM>(
mField, fe_ptr->getOpPtrVector(),
742 "ADOLCMAT", common_data_ptr,
cpPtr),
753 auto ts_step_post_proc = [](TS ts) {
762 CHKERR TSSetPostStep(ts, ts_step_post_proc);
768 auto set_up_monitor = [&](
auto ts) {
770 boost::shared_ptr<FEMethod> null_fe;
772 create_monitor_fe(create_post_proc_fe(), create_reaction_fe());
774 null_fe, monitor_ptr);
778 auto set_up_adapt = [&](
auto ts) {
782 CHKERR TSGetAdapt(ts, &adapt);
787 auto ts = pipeline_mng->createTSIM();
791 CHKERR TSSetMaxTime(ts, ftime);
792 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
797 CHKERR set_up_monitor(ts);
798 CHKERR set_up_post_step(ts);
800 CHKERR TSSetFromOptions(ts);
805 CHKERR TSGetTime(ts, &ftime);
807 PetscInt steps, snesfails, rejects, nonlinits, linits;
808 CHKERR TSGetStepNumber(ts, &steps);
809 CHKERR TSGetSNESFailures(ts, &snesfails);
810 CHKERR TSGetStepRejections(ts, &rejects);
811 CHKERR TSGetSNESIterations(ts, &nonlinits);
812 CHKERR TSGetKSPIterations(ts, &linits);
814 "steps %d (%d rejected, %d SNES fails), ftime %g, nonlinits "
816 steps, rejects, snesfails, ftime, nonlinits, linits);