diff --git a/examples/config/numerics.yaml b/examples/config/numerics.yaml index dcf330073..ac37e7e08 100644 --- a/examples/config/numerics.yaml +++ b/examples/config/numerics.yaml @@ -73,23 +73,24 @@ mesh: phase: mechanical: - step_min: 1.0e-3 # minimum (relative) size of step allowed during cutback in crystallite - step_size: 0.25 # size of step when cutback introduced in crystallite (value between 0 and 1) - step_increase: 1.5 # increase of next step size when previous step converged in crystallite (value higher than 1) - eps_rel_state: 1.0e-6 # relative tolerance in crystallite state loop (abs tol provided by constitutive law) + step_min: 1.0e-3 # minimum (relative) size of step allowed during cutback in phase state calculation + r_cutback_step: 0.25 # factor to decrease size of step when cutback introduced in phase state calculation (value between 0 and 1) + r_increase_step: 1.5 # factor to increase size of next step when previous step converged in phase state calculation + eps_rel_state: 1.0e-6 # relative tolerance in phase state loop (abs tol provided by constitutive law) N_iter_state_max: 10 # state loop limit - N_iter_stress_max: 40 # stress loop limit plastic: - step_size_Lp: 0.5 # size of first substep when cutback in Lp calculation - eps_rel_Lp: 1.0e-6 # relative tolerance in crystallite stress loop (Lp residuum) - eps_abs_Lp: 1.0e-8 # absolute tolerance in crystallite stress loop (Lp residuum!) + r_cutback_step_Lp: 0.5 # factor to decrease the step when cutback in Lp calculation + eps_rel_Lp: 1.0e-6 # relative tolerance in phase stress loop (Lp residuum) + eps_abs_Lp: 1.0e-8 # absolute tolerance in phase stress loop (Lp residuum) + N_iter_Lp_max: 40 # stress loop limit for Lp f_update_jacobi_Lp: 1 # frequency of Jacobian update of residuum in Lp integrator_state: FPI # integration method (FPI = Fixed Point Iteration, Euler = Euler, AdaptiveEuler = Adaptive Euler, RK4 = classical 4th order Runge-Kutta, RKCK45 = 5th order Runge-Kutta Cash-Karp) eigen: - step_size_Li: 0.5 # size of first substep when cutback in Li calculation - eps_rel_Li: 1.0e-6 # relative tolerance in crystallite stress loop (Li residuum) - eps_abs_Li: 1.0e-8 # absolute tolerance in crystallite stress loop (Li residuum!) + r_cutback_step_Li: 0.5 # factor to decrease the step when cutback in Li calculation + eps_rel_Li: 1.0e-6 # relative tolerance in phase stress loop (Li residuum) + eps_abs_Li: 1.0e-8 # absolute tolerance in phase stress loop (Li residuum) + N_iter_Li_max: 40 # stress loop limit for Li f_update_jacobi_Li: 1 # frequency of Jacobian update of residuum in Li commercialFEM: diff --git a/src/phase.f90 b/src/phase.f90 index c233049f5..4b01c6ef0 100644 --- a/src/phase.f90 +++ b/src/phase.f90 @@ -86,7 +86,8 @@ module phase iJacoLpresiduum, & !< frequency of Jacobian update of residuum in Lp iJacoLiresiduum, & !< frequency of Jacobian update of residuum in Li nState, & !< state loop limit - nStress !< stress loop limit + nStress_Lp, & !< stress loop limit for Lp + nStress_Li !< stress loop limit for Li real(pREAL) :: & stepMinCryst, & !< minimum (relative) size of sub-step allowed during cutback stepSizeCryst, & !< size of first substep when cutback diff --git a/src/phase_mechanical.f90 b/src/phase_mechanical.f90 index e65745121..ddd31cbcc 100644 --- a/src/phase_mechanical.f90 +++ b/src/phase_mechanical.f90 @@ -278,34 +278,36 @@ module subroutine mechanical_init(phases, num_mech) num_mech_eigen => num_mech%get_dict('eigen', defaultVal=emptyDict) num%stepMinCryst = num_mech%get_asReal ('step_min', defaultVal=1.0e-3_pREAL) - num%stepSizeCryst = num_mech%get_asReal ('step_size', defaultVal=0.25_pREAL) - num%stepIncreaseCryst = num_mech%get_asReal ('step_increase', defaultVal=1.5_pREAL) + num%stepSizeCryst = num_mech%get_asReal ('r_cutback_step', defaultVal=0.25_pREAL) + num%stepIncreaseCryst = num_mech%get_asReal ('r_increase_step', defaultVal=1.5_pREAL) num%rtol_crystalliteState = num_mech%get_asReal ('eps_rel_state', defaultVal=1.0e-6_pREAL) num%nState = num_mech%get_asInt ('N_iter_state_max', defaultVal=20) - num%nStress = num_mech%get_asInt ('N_iter_stress_max', defaultVal=40) - num%stepSizeLp = num_mech_plastic%get_asReal ('step_size_Lp', defaultVal=0.5_pREAL) + num%nStress_Lp = num_mech_plastic%get_asInt ('N_iter_Lp_max', defaultVal=40) + num%stepSizeLp = num_mech_plastic%get_asReal ('r_cutback_step_Lp', defaultVal=0.5_pREAL) num%rtol_Lp = num_mech_plastic%get_asReal ('eps_rel_Lp', defaultVal=1.0e-6_pREAL) num%atol_Lp = num_mech_plastic%get_asReal ('eps_abs_Lp', defaultVal=1.0e-8_pREAL) num%iJacoLpresiduum = num_mech_plastic%get_asInt ('f_update_jacobi_Lp', defaultVal=1) - num%stepSizeLi = num_mech_eigen%get_asReal ('step_size_Li', defaultVal=0.5_pREAL) + num%nStress_Li = num_mech_eigen%get_asInt ('N_iter_Li_max', defaultVal=40) + num%stepSizeLi = num_mech_eigen%get_asReal ('r_cutback_step_Li', defaultVal=0.5_pREAL) num%rtol_Li = num_mech_eigen%get_asReal ('eps_rel_Li', defaultVal=num%rtol_Lp) num%atol_Li = num_mech_eigen%get_asReal ('eps_abs_Li', defaultVal=num%atol_Lp) num%iJacoLiresiduum = num_mech_eigen%get_asInt ('f_update_jacobi_Li', defaultVal=num%iJacoLpresiduum) extmsg = '' if (num%stepMinCryst <= 0.0_pREAL) extmsg = trim(extmsg)//' sub_step_min' - if (num%stepSizeCryst <= 0.0_pREAL) extmsg = trim(extmsg)//' sub_step_size' - if (num%stepIncreaseCryst <= 0.0_pREAL) extmsg = trim(extmsg)//' step_increase' - if (num%stepSizeLp <= 0.0_pREAL) extmsg = trim(extmsg)//' sub_step_size_Lp' - if (num%stepSizeLi <= 0.0_pREAL) extmsg = trim(extmsg)//' sub_step_size_Li' + if (num%stepSizeCryst <= 0.0_pREAL) extmsg = trim(extmsg)//' r_cutback_step' + if (num%stepIncreaseCryst <= 0.0_pREAL) extmsg = trim(extmsg)//' r_increase_step' + if (num%stepSizeLp <= 0.0_pREAL) extmsg = trim(extmsg)//' r_cutback_step_Lp' + if (num%stepSizeLi <= 0.0_pREAL) extmsg = trim(extmsg)//' r_cutback_step_Li' if (num%rtol_Lp <= 0.0_pREAL) extmsg = trim(extmsg)//' epl_rel_Lp' if (num%atol_Lp <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_Lp' if (num%rtol_Li <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_Li' if (num%atol_Li <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_Li' - if (num%iJacoLpresiduum < 1) extmsg = trim(extmsg)//' f_jacobi_residuum_update_Lp' - if (num%iJacoLiresiduum < 1) extmsg = trim(extmsg)//' f_jacobi_residuum_update_Li' + if (num%iJacoLpresiduum < 1) extmsg = trim(extmsg)//' f_update_jacobi_Lp' + if (num%iJacoLiresiduum < 1) extmsg = trim(extmsg)//' f_update_jacobi_Li' if (num%nState < 1) extmsg = trim(extmsg)//' N_iter_state_max' - if (num%nStress < 1) extmsg = trim(extmsg)//' N_iter_stress_max' + if (num%nStress_Lp < 1) extmsg = trim(extmsg)//' N_iter_Lp_max' + if (num%nStress_Li < 1) extmsg = trim(extmsg)//' N_iter_Li_max' if (extmsg /= '') call IO_error(301,ext_msg=trim(extmsg)) @@ -452,7 +454,7 @@ function integrateStress(F,subFp0,subFi0,Delta_t,ph,en) result(broken) NiterationStressLi = 0 LiLoop: do NiterationStressLi = NiterationStressLi + 1 - if (NiterationStressLi>num%nStress) return ! error + if (NiterationStressLi>num%nStress_Li) return ! error invFi_new = matmul(invFi_current,math_I3 - Delta_t*Liguess) Fi_new = math_inv33(invFi_new) @@ -465,7 +467,7 @@ function integrateStress(F,subFp0,subFi0,Delta_t,ph,en) result(broken) NiterationStressLp = 0 LpLoop: do NiterationStressLp = NiterationStressLp + 1 - if (NiterationStressLp>num%nStress) return ! error + if (NiterationStressLp>num%nStress_Lp) return ! error B = math_I3 - Delta_t*Lpguess Fe = matmul(matmul(A,B), invFi_new)