changed first elastic guess for small Tstar

changed residuum to only consider deviatoric part of Tstar
changed scaling when dTstar becomes too large to proportionally scaling all components of dTstar
This commit is contained in:
Franz Roters 2007-07-20 13:32:44 +00:00
parent a1c3df84ab
commit a5f49a0578
2 changed files with 24 additions and 12 deletions

View File

@ -301,7 +301,6 @@
Fg_pert = Fg_new+matmul(E_pert,Fg_old) ! perturbated Fg Fg_pert = Fg_new+matmul(E_pert,Fg_old) ! perturbated Fg
Tstar_v_pert = Tstar_v ! initial guess from end of time step Tstar_v_pert = Tstar_v ! initial guess from end of time step
state_pert = state_new ! initial guess from end of time step state_pert = state_new ! initial guess from end of time step
call CPFEM_timeIntegration(msg,Fp_pert,Fe_pert,Tstar_v_pert,state_pert, & call CPFEM_timeIntegration(msg,Fp_pert,Fe_pert,Tstar_v_pert,state_pert, &
dt,cp_en,CPFEM_in,grain,Fg_pert,Fp_old,state_old) dt,cp_en,CPFEM_in,grain,Fg_pert,Fp_old,state_old)
if (msg /= 'ok') then if (msg /= 'ok') then
@ -336,7 +335,7 @@
Fp_old,& ! former plastic def gradient Fp_old,& ! former plastic def gradient
state_old) ! former microstructure state_old) ! former microstructure
use prec, only: pReal,pInt, nState,tol_State,nStress,tol_Stress, crite, nReg use prec
use constitutive, only: constitutive_Nstatevars,& use constitutive, only: constitutive_Nstatevars,&
constitutive_homogenizedC,constitutive_dotState,constitutive_LpAndItsTangent constitutive_homogenizedC,constitutive_dotState,constitutive_LpAndItsTangent
use math use math
@ -345,8 +344,8 @@
character(len=*) msg character(len=*) msg
integer(pInt) cp_en, CPFEM_in, grain integer(pInt) cp_en, CPFEM_in, grain
integer(pInt) iState,iStress,dummy, i,j,k,l,m integer(pInt) iState,iStress,dummy, i,j,k,l,m
real(pReal) dt,det real(pReal) dt,det, max_E, p_hydro
real(pReal), dimension(6) :: Tstar_v,dTstar_v,Rstress real(pReal), dimension(6) :: Tstar_v,dTstar_v,Rstress, E, T_elastic
real(pReal), dimension(6,6) :: C_66,Jacobi,invJacobi real(pReal), dimension(6,6) :: C_66,Jacobi,invJacobi
real(pReal), dimension(3,3) :: Fg_new,Fp_old,Fp_new,Fe_new,invFp_old,invFp_new,Lp,A,B,AB real(pReal), dimension(3,3) :: Fg_new,Fp_old,Fp_new,Fe_new,invFp_old,invFp_new,Lp,A,B,AB
real(pReal), dimension(3,3,3,3) :: dLp, LTL real(pReal), dimension(3,3,3,3) :: dLp, LTL
@ -369,8 +368,13 @@
if (all(state_new == 0.0_pReal)) state_new = state_old if (all(state_new == 0.0_pReal)) state_new = state_old
RstateS = state_new RstateS = state_new
iState = 0_pInt iState = 0_pInt
! fully elastic guess (Lp = 0), if none specified, however somewhat reduced ie. 0.3 instead of 0.5 ! elastic guess for small Tstar, however reduced to prec_max_e
if (all(Tstar_v == 0.0_pReal)) Tstar_v = 0.3_pReal*matmul(C_66,math_Mandel33to6(A-math_I3)) if (all(Tstar_v < 0.1_pReal)) then
E = math_Mandel33to6(A-math_I3)
max_E = maxval(E)
if (max_E > prec_max_e) E = prec_max_e * E / max_E
Tstar_v = 0.5_pReal*matmul(C_66, E)
endif
! QUESTION follow former plastic slope to guess better? ! QUESTION follow former plastic slope to guess better?
Rstress = Tstar_v Rstress = Tstar_v
@ -387,10 +391,16 @@ stress: do ! inner iteration: stress
msg = 'limit stress iteration' msg = 'limit stress iteration'
return return
endif endif
p_hydro=(Tstar_v(1)+Tstar_v(2)+Tstar_v(3))/3.0_pReal
forall(i=1:3) Tstar_v(i)=Tstar_v(i)-p_hydro
call constitutive_LpAndItsTangent(Lp,dLp, Tstar_v,state_new,grain,CPFEM_in,cp_en) call constitutive_LpAndItsTangent(Lp,dLp, Tstar_v,state_new,grain,CPFEM_in,cp_en)
B = math_I3-dt*Lp B = math_I3-dt*Lp
! B = B / math_det3x3(B)**(1.0_pReal/3.0_pReal)
AB = matmul(A,B) AB = matmul(A,B)
Rstress = Tstar_v - 0.5_pReal*matmul(C_66,math_Mandel33to6(matmul(transpose(B),AB)-math_I3)) T_elastic= 0.5_pReal*matmul(C_66,math_Mandel33to6(matmul(transpose(B),AB)-math_I3))
p_hydro=(T_elastic(1)+T_elastic(2)+T_elastic(3))/3.0_pReal
forall(i=1:3) T_elastic(i)=T_elastic(i)-p_hydro
Rstress = Tstar_v - T_elastic
if (maxval(abs(Tstar_v)) == 0.0_pReal .or. maxval(abs(Rstress/maxval(abs(Tstar_v)))) < tol_Stress) exit stress if (maxval(abs(Tstar_v)) == 0.0_pReal .or. maxval(abs(Rstress/maxval(abs(Tstar_v)))) < tol_Stress) exit stress
! update stress guess using inverse of dRes/dTstar (Newton--Raphson) ! update stress guess using inverse of dRes/dTstar (Newton--Raphson)
@ -419,10 +429,10 @@ stress: do ! inner iteration: stress
msg = 'regularization Jacobi' msg = 'regularization Jacobi'
return return
endif endif
dTstar_v = matmul(invJacobi,Rstress) ! correction to Tstar dTstar_v = matmul(invJacobi,Rstress) ! correction to Tstar
forall(i=1:6, abs(dTstar_v(i)) > crite*maxval(abs(Tstar_v))) & ! limit correction of Tstar
dTstar_v(i) = sign(crite*maxval(abs(Tstar_v)),dTstar_v(i)) ! cap to maximum correction if(maxval(abs(dTstar_v)) > crite*maxval(abs(Tstar_v))) &
dTstar_v=dTstar_v*crite*maxval(abs(Tstar_v))/maxval(abs(dTstar_v))
Tstar_v = Tstar_v-dTstar_v Tstar_v = Tstar_v-dTstar_v
enddo stress enddo stress

View File

@ -21,10 +21,12 @@
! *** Convergence criteria for outer (state variables) loop *** ! *** Convergence criteria for outer (state variables) loop ***
real(pReal), parameter :: tol_State = 1.0e-6_pReal real(pReal), parameter :: tol_State = 1.0e-6_pReal
! *** Maximum number of iterations in inner (stress) loop *** ! *** Maximum number of iterations in inner (stress) loop ***
integer(pInt), parameter :: nStress = 2000_pInt integer(pInt), parameter :: nStress = 100_pInt
! *** Convergence criteria for inner (stress) loop *** ! *** Convergence criteria for inner (stress) loop ***
real(pReal), parameter :: tol_Stress = 1.0e-6_pReal real(pReal), parameter :: tol_Stress = 1.0e-6_pReal
! *** Factor for maximum stress correction in inner (stress) loop *** ! *** Factor for maximum stress correction in inner (stress) loop ***
real(pReal), parameter :: crite = 1.0e-1_pReal real(pReal), parameter :: crite = 0.1_pReal
! *** Maximum strain used in elastic guess in inner (stress) loop ***
real(pReal), parameter :: prec_max_e = 1.0e-3_pReal
END MODULE prec END MODULE prec