* now able to choose method for state integration (integrator and integratorStiffness in numerics.config); standard is "Fixed Point Iteration", which is basically the same as before; others available are "Explicit Euler", "AdaptiveEuler", "Classical Runge-Kutta" and "Runge-Kutta Cash-Karp"
* now remembering stiffness similar to how we do it for Lp etc.; avoids undefined stiffness values for nonconverged stiffness calculation * non-local stuff: * changed non-local kinetics (Gilman2002) * enforce zero shearrate for overall carrrier density below relevant density * enforce zero density for those states that become negative and were below relevant density before * dislocation velocity is not limited by V^(1/3) / dt anymore
This commit is contained in:
parent
9927cd7adb
commit
fce7590c17
|
@ -118,6 +118,8 @@ subroutine CPFEM_general(mode, ffn, ffn1, Temperature, dt, element, IP, cauchySt
|
|||
crystallite_Fp, &
|
||||
crystallite_Lp0, &
|
||||
crystallite_Lp, &
|
||||
crystallite_dPdF0, &
|
||||
crystallite_dPdF, &
|
||||
crystallite_Tstar0_v, &
|
||||
crystallite_Tstar_v
|
||||
use homogenization, only: homogenization_init, &
|
||||
|
@ -242,6 +244,7 @@ subroutine CPFEM_general(mode, ffn, ffn1, Temperature, dt, element, IP, cauchySt
|
|||
crystallite_F0 = crystallite_partionedF ! crystallite deformation (_subF is perturbed...)
|
||||
crystallite_Fp0 = crystallite_Fp ! crystallite plastic deformation
|
||||
crystallite_Lp0 = crystallite_Lp ! crystallite plastic velocity
|
||||
crystallite_dPdF0 = crystallite_dPdF ! crystallite stiffness
|
||||
crystallite_Tstar0_v = crystallite_Tstar_v ! crystallite 2nd Piola Kirchhoff stress
|
||||
forall ( i = 1:homogenization_maxNgrains, &
|
||||
j = 1:mesh_maxNips, &
|
||||
|
|
|
@ -1189,6 +1189,8 @@ endfunction
|
|||
case (294)
|
||||
msg = 'Non-positive tolerance for deformation gradient'
|
||||
|
||||
case (298)
|
||||
msg = 'Chosen integration method does not exist'
|
||||
case (299)
|
||||
msg = 'Chosen perturbation method does not exist'
|
||||
|
||||
|
|
|
@ -19,10 +19,12 @@ MODULE constitutive
|
|||
constitutive_state, & ! pointer array to current microstructure (end of converged time step)
|
||||
constitutive_state_backup, & ! pointer array to backed up microstructure (end of converged time step)
|
||||
constitutive_dotState, & ! pointer array to evolution of current microstructure
|
||||
constitutive_dotState_backup, & ! pointer array to backed up evolution of current microstructure
|
||||
constitutive_previousDotState,& ! pointer array to previous evolution of current microstructure
|
||||
constitutive_previousDotState2,&! pointer array to 2nd previous evolution of current microstructure
|
||||
constitutive_dotState_backup, & ! pointer array to backed up evolution of current microstructure
|
||||
constitutive_RK4dotState, & ! pointer array to evolution of microstructure defined by classical Runge-Kutta method
|
||||
constitutive_relevantState ! relevant state values
|
||||
type(p_vec), dimension(:,:,:,:), allocatable :: constitutive_RKCK45dotState ! pointer array to evolution of microstructure used by Cash-Karp Runge-Kutta method
|
||||
integer(pInt), dimension(:,:,:), allocatable :: constitutive_sizeDotState, & ! size of dotState array
|
||||
constitutive_sizeState, & ! size of state array per grain
|
||||
constitutive_sizePostResults ! size of postResults array per grain
|
||||
|
@ -48,6 +50,7 @@ subroutine constitutive_init()
|
|||
!**************************************
|
||||
use prec, only: pReal,pInt
|
||||
use debug, only: debugger, selectiveDebugger, debug_e, debug_i, debug_g
|
||||
use numerics, only: integrator, integratorStiffness
|
||||
use IO, only: IO_error, IO_open_file, IO_open_jobFile
|
||||
use mesh, only: mesh_maxNips,mesh_NcpElems,mesh_element,FE_Nips
|
||||
use material
|
||||
|
@ -58,7 +61,7 @@ subroutine constitutive_init()
|
|||
use constitutive_nonlocal
|
||||
|
||||
integer(pInt), parameter :: fileunit = 200
|
||||
integer(pInt) e,i,g,p,myInstance,myNgrains
|
||||
integer(pInt) e,i,g,p,s,myInstance,myNgrains
|
||||
integer(pInt), dimension(:,:), pointer :: thisSize
|
||||
character(len=64), dimension(:,:), pointer :: thisOutput
|
||||
logical knownConstitution
|
||||
|
@ -71,7 +74,6 @@ subroutine constitutive_init()
|
|||
call constitutive_dislotwin_init(fileunit)
|
||||
call constitutive_nonlocal_init(fileunit)
|
||||
|
||||
|
||||
close(fileunit)
|
||||
|
||||
! write description file for constitutive phase output
|
||||
|
@ -123,12 +125,18 @@ subroutine constitutive_init()
|
|||
allocate(constitutive_state_backup(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
allocate(constitutive_dotState(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
allocate(constitutive_dotState_backup(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
allocate(constitutive_previousDotState(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
allocate(constitutive_previousDotState2(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
allocate(constitutive_relevantState(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
allocate(constitutive_sizeDotState(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems)) ; constitutive_sizeDotState = 0_pInt
|
||||
allocate(constitutive_sizeState(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems)) ; constitutive_sizeState = 0_pInt
|
||||
allocate(constitutive_sizePostResults(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems)); constitutive_sizePostResults = 0_pInt
|
||||
if (integrator == 1 .or. integratorStiffness == 1) then
|
||||
allocate(constitutive_previousDotState(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
allocate(constitutive_previousDotState2(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
endif
|
||||
if (integrator == 3 .or. integratorStiffness == 3) &
|
||||
allocate(constitutive_RK4dotState(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
if (integrator == 4 .or. integratorStiffness == 4) &
|
||||
allocate(constitutive_RKCK45dotState(6,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems))
|
||||
|
||||
do e = 1,mesh_NcpElems ! loop over elements
|
||||
myNgrains = homogenization_Ngrains(mesh_element(3,e))
|
||||
|
@ -147,8 +155,17 @@ subroutine constitutive_init()
|
|||
allocate(constitutive_relevantState(g,i,e)%p(constitutive_j2_sizeState(myInstance)))
|
||||
allocate(constitutive_dotState(g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
allocate(constitutive_dotState_backup(g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
if (integrator == 1 .or. integratorStiffness == 1) then
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
endif
|
||||
if (integrator == 3 .or. integratorStiffness == 3) &
|
||||
allocate(constitutive_RK4dotState(g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
if (integrator == 4 .or. integratorStiffness == 4) then
|
||||
do s = 1,6
|
||||
allocate(constitutive_RKCK45dotState(s,g,i,e)%p(constitutive_j2_sizeDotState(myInstance)))
|
||||
enddo
|
||||
endif
|
||||
constitutive_state0(g,i,e)%p = constitutive_j2_stateInit(myInstance)
|
||||
constitutive_relevantState(g,i,e)%p = constitutive_j2_relevantState(myInstance)
|
||||
constitutive_sizeState(g,i,e) = constitutive_j2_sizeState(myInstance)
|
||||
|
@ -164,8 +181,17 @@ subroutine constitutive_init()
|
|||
allocate(constitutive_relevantState(g,i,e)%p(constitutive_phenopowerlaw_sizeState(myInstance)))
|
||||
allocate(constitutive_dotState(g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
allocate(constitutive_dotState_backup(g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
if (integrator == 1 .or. integratorStiffness == 1) then
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
endif
|
||||
if (integrator == 3 .or. integratorStiffness == 3) &
|
||||
allocate(constitutive_RK4dotState(g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
if (integrator == 4 .or. integratorStiffness == 4) then
|
||||
do s = 1,6
|
||||
allocate(constitutive_RKCK45dotState(s,g,i,e)%p(constitutive_phenopowerlaw_sizeDotState(myInstance)))
|
||||
enddo
|
||||
endif
|
||||
constitutive_state0(g,i,e)%p = constitutive_phenopowerlaw_stateInit(myInstance)
|
||||
constitutive_relevantState(g,i,e)%p = constitutive_phenopowerlaw_relevantState(myInstance)
|
||||
constitutive_sizeState(g,i,e) = constitutive_phenopowerlaw_sizeState(myInstance)
|
||||
|
@ -181,8 +207,17 @@ subroutine constitutive_init()
|
|||
allocate(constitutive_relevantState(g,i,e)%p(constitutive_titanmod_sizeState(myInstance)))
|
||||
allocate(constitutive_dotState(g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
allocate(constitutive_dotState_backup(g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
if (integrator == 1 .or. integratorStiffness == 1) then
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
endif
|
||||
if (integrator == 3 .or. integratorStiffness == 3) &
|
||||
allocate(constitutive_RK4dotState(g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
if (integrator == 4 .or. integratorStiffness == 4) then
|
||||
do s = 1,6
|
||||
allocate(constitutive_RKCK45dotState(s,g,i,e)%p(constitutive_titanmod_sizeDotState(myInstance)))
|
||||
enddo
|
||||
endif
|
||||
constitutive_state0(g,i,e)%p = constitutive_titanmod_stateInit(myInstance)
|
||||
constitutive_relevantState(g,i,e)%p = constitutive_titanmod_relevantState(myInstance)
|
||||
constitutive_sizeState(g,i,e) = constitutive_titanmod_sizeState(myInstance)
|
||||
|
@ -198,8 +233,17 @@ subroutine constitutive_init()
|
|||
allocate(constitutive_relevantState(g,i,e)%p(constitutive_dislotwin_sizeState(myInstance)))
|
||||
allocate(constitutive_dotState(g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
allocate(constitutive_dotState_backup(g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
if (integrator == 1 .or. integratorStiffness == 1) then
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
endif
|
||||
if (integrator == 3 .or. integratorStiffness == 3) &
|
||||
allocate(constitutive_RK4dotState(g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
if (integrator == 4 .or. integratorStiffness == 4) then
|
||||
do s = 1,6
|
||||
allocate(constitutive_RKCK45dotState(s,g,i,e)%p(constitutive_dislotwin_sizeDotState(myInstance)))
|
||||
enddo
|
||||
endif
|
||||
constitutive_state0(g,i,e)%p = constitutive_dislotwin_stateInit(myInstance)
|
||||
constitutive_relevantState(g,i,e)%p = constitutive_dislotwin_relevantState(myInstance)
|
||||
constitutive_sizeState(g,i,e) = constitutive_dislotwin_sizeState(myInstance)
|
||||
|
@ -215,8 +259,17 @@ subroutine constitutive_init()
|
|||
allocate(constitutive_relevantState(g,i,e)%p(constitutive_nonlocal_sizeState(myInstance)))
|
||||
allocate(constitutive_dotState(g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
allocate(constitutive_dotState_backup(g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
if (integrator == 1 .or. integratorStiffness == 1) then
|
||||
allocate(constitutive_previousDotState(g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
allocate(constitutive_previousDotState2(g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
endif
|
||||
if (integrator == 3 .or. integratorStiffness == 3) &
|
||||
allocate(constitutive_RK4dotState(g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
if (integrator == 4 .or. integratorStiffness == 4) then
|
||||
do s = 1,6
|
||||
allocate(constitutive_RKCK45dotState(s,g,i,e)%p(constitutive_nonlocal_sizeDotState(myInstance)))
|
||||
enddo
|
||||
endif
|
||||
constitutive_state0(g,i,e)%p = constitutive_nonlocal_stateInit(myInstance)
|
||||
constitutive_relevantState(g,i,e)%p = constitutive_nonlocal_relevantState(myInstance)
|
||||
constitutive_sizeState(g,i,e) = constitutive_nonlocal_sizeState(myInstance)
|
||||
|
@ -247,7 +300,6 @@ subroutine constitutive_init()
|
|||
write(6,'(a32,x,7(i5,x))') 'constitutive_state: ', shape(constitutive_state)
|
||||
write(6,'(a32,x,7(i5,x))') 'constitutive_relevantState: ', shape(constitutive_relevantState)
|
||||
write(6,'(a32,x,7(i5,x))') 'constitutive_dotState: ', shape(constitutive_dotState)
|
||||
write(6,'(a32,x,7(i5,x))') 'constitutive_previousDotState:', shape(constitutive_previousDotState)
|
||||
write(6,'(a32,x,7(i5,x))') 'constitutive_sizeState: ', shape(constitutive_sizeState)
|
||||
write(6,'(a32,x,7(i5,x))') 'constitutive_sizeDotState: ', shape(constitutive_sizeDotState)
|
||||
write(6,'(a32,x,7(i5,x))') 'constitutive_sizePostResults: ', shape(constitutive_sizePostResults)
|
||||
|
@ -448,7 +500,8 @@ subroutine constitutive_LpAndItsTangent(Lp, dLp_dTstar, Tstar_v, Temperature, ip
|
|||
call constitutive_dislotwin_LpAndItsTangent(Lp,dLp_dTstar,Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
|
||||
case (constitutive_nonlocal_label)
|
||||
call constitutive_nonlocal_LpAndItsTangent(Lp, dLp_dTstar, Tstar_v, Temperature, constitutive_state, ipc, ip, el)
|
||||
call constitutive_nonlocal_LpAndItsTangent(Lp, dLp_dTstar, Tstar_v, Temperature, constitutive_state, &
|
||||
constitutive_relevantState, ipc, ip, el)
|
||||
|
||||
end select
|
||||
|
||||
|
@ -478,11 +531,16 @@ use mesh, only: mesh_NcpElems, &
|
|||
use material, only: phase_constitution, &
|
||||
material_phase, &
|
||||
homogenization_maxNgrains
|
||||
use constitutive_j2
|
||||
use constitutive_phenopowerlaw
|
||||
use constitutive_titanmod
|
||||
use constitutive_dislotwin
|
||||
use constitutive_nonlocal
|
||||
use constitutive_j2, only: constitutive_j2_dotState, &
|
||||
constitutive_j2_label
|
||||
use constitutive_phenopowerlaw, only: constitutive_phenopowerlaw_dotState, &
|
||||
constitutive_phenopowerlaw_label
|
||||
use constitutive_titanmod, only: constitutive_titanmod_dotState, &
|
||||
constitutive_titanmod_label
|
||||
use constitutive_dislotwin, only: constitutive_dislotwin_dotState, &
|
||||
constitutive_dislotwin_label
|
||||
use constitutive_nonlocal, only: constitutive_nonlocal_dotState, &
|
||||
constitutive_nonlocal_label
|
||||
|
||||
implicit none
|
||||
|
||||
|
@ -548,40 +606,59 @@ function constitutive_dotTemperature(Tstar_v,Temperature,ipc,ip,el)
|
|||
!* OUTPUT: *
|
||||
!* - constitutive_dotTemperature : evolution of temperature *
|
||||
!*********************************************************************
|
||||
use prec, only: pReal,pInt
|
||||
use material, only: phase_constitution,material_phase
|
||||
use constitutive_j2
|
||||
use constitutive_phenopowerlaw
|
||||
use constitutive_titanmod
|
||||
use constitutive_dislotwin
|
||||
use constitutive_nonlocal
|
||||
implicit none
|
||||
use prec, only: pReal,pInt
|
||||
use debug, only: debug_cumDotTemperatureCalls, &
|
||||
debug_cumDotTemperatureTicks
|
||||
use material, only: phase_constitution,material_phase
|
||||
use constitutive_j2, only: constitutive_j2_dotTemperature, &
|
||||
constitutive_j2_label
|
||||
use constitutive_phenopowerlaw, only: constitutive_phenopowerlaw_dotTemperature, &
|
||||
constitutive_phenopowerlaw_label
|
||||
use constitutive_titanmod, only: constitutive_titanmod_dotTemperature, &
|
||||
constitutive_titanmod_label
|
||||
use constitutive_dislotwin, only: constitutive_dislotwin_dotTemperature, &
|
||||
constitutive_dislotwin_label
|
||||
use constitutive_nonlocal, only: constitutive_nonlocal_dotTemperature, &
|
||||
constitutive_nonlocal_label
|
||||
implicit none
|
||||
|
||||
!* Definition of variables
|
||||
integer(pInt) ipc,ip,el
|
||||
real(pReal) Temperature
|
||||
real(pReal) constitutive_dotTemperature
|
||||
real(pReal), dimension(6) :: Tstar_v
|
||||
integer(pInt) ipc, ip, el
|
||||
real(pReal) Temperature
|
||||
real(pReal) constitutive_dotTemperature
|
||||
real(pReal), dimension(6) :: Tstar_v
|
||||
integer(pLongInt) tick, &
|
||||
tock, &
|
||||
tickrate, &
|
||||
maxticks
|
||||
|
||||
select case (phase_constitution(material_phase(ipc,ip,el)))
|
||||
call system_clock(count=tick,count_rate=tickrate,count_max=maxticks)
|
||||
|
||||
case (constitutive_j2_label)
|
||||
constitutive_dotTemperature = constitutive_j2_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
select case (phase_constitution(material_phase(ipc,ip,el)))
|
||||
|
||||
case (constitutive_phenopowerlaw_label)
|
||||
constitutive_dotTemperature = constitutive_phenopowerlaw_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
case (constitutive_j2_label)
|
||||
constitutive_dotTemperature = constitutive_j2_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
|
||||
case (constitutive_titanmod_label)
|
||||
constitutive_dotTemperature = constitutive_titanmod_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
case (constitutive_phenopowerlaw_label)
|
||||
constitutive_dotTemperature = constitutive_phenopowerlaw_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
|
||||
case (constitutive_dislotwin_label)
|
||||
constitutive_dotTemperature = constitutive_dislotwin_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
case (constitutive_titanmod_label)
|
||||
constitutive_dotTemperature = constitutive_titanmod_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
|
||||
case (constitutive_nonlocal_label)
|
||||
constitutive_dotTemperature = constitutive_nonlocal_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
case (constitutive_dislotwin_label)
|
||||
constitutive_dotTemperature = constitutive_dislotwin_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
|
||||
end select
|
||||
return
|
||||
case (constitutive_nonlocal_label)
|
||||
constitutive_dotTemperature = constitutive_nonlocal_dotTemperature(Tstar_v,Temperature,constitutive_state,ipc,ip,el)
|
||||
|
||||
end select
|
||||
|
||||
call system_clock(count=tock,count_rate=tickrate,count_max=maxticks)
|
||||
debug_cumDotTemperatureCalls = debug_cumDotTemperatureCalls + 1_pInt
|
||||
debug_cumDotTemperatureTicks = debug_cumDotTemperatureTicks + tock-tick
|
||||
if (tock < tick) debug_cumDotTemperatureTicks = debug_cumDotTemperatureTicks + maxticks
|
||||
|
||||
return
|
||||
endfunction
|
||||
|
||||
|
||||
|
|
|
@ -257,7 +257,6 @@ constitutive_nonlocal_interactionSlipSlip = 0.0_pReal
|
|||
constitutive_nonlocal_dLowerEdgePerSlipFamily = 0.0_pReal
|
||||
constitutive_nonlocal_dLowerScrewPerSlipFamily = 0.0_pReal
|
||||
|
||||
|
||||
!*** readout data from material.config file
|
||||
|
||||
rewind(file)
|
||||
|
@ -973,7 +972,7 @@ endsubroutine
|
|||
!*********************************************************************
|
||||
!* calculates kinetics *
|
||||
!*********************************************************************
|
||||
subroutine constitutive_nonlocal_kinetics(Tstar_v, Temperature, state, g, ip, el)
|
||||
subroutine constitutive_nonlocal_kinetics(Tstar_v, Temperature, state, g, ip, el, dv_dtau)
|
||||
|
||||
use prec, only: pReal, &
|
||||
pInt, &
|
||||
|
@ -1003,6 +1002,8 @@ type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), in
|
|||
real(pReal), dimension(6), intent(in) :: Tstar_v ! 2nd Piola-Kirchhoff stress in Mandel notation
|
||||
|
||||
!*** output variables
|
||||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el)))), &
|
||||
intent(out), optional :: dv_dtau ! velocity derivative with respect to resolved shear stress
|
||||
|
||||
!*** local variables
|
||||
integer(pInt) myInstance, & ! current instance of this constitution
|
||||
|
@ -1013,31 +1014,42 @@ integer(pInt) myInstance, & ! curren
|
|||
real(pReal), dimension(6) :: Tdislocation_v ! dislocation stress (resulting from the neighboring excess dislocation densities) as 2nd Piola-Kirchhoff stress
|
||||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el)))) :: &
|
||||
tauThreshold, & ! threshold shear stress
|
||||
tau ! resolved shear stress
|
||||
tau, & ! resolved shear stress
|
||||
rhoForest ! forest dislocation density
|
||||
real(pReal) boltzmannProbability
|
||||
|
||||
|
||||
myInstance = phase_constitutionInstance(material_phase(g,ip,el))
|
||||
myStructure = constitutive_nonlocal_structure(myInstance)
|
||||
ns = constitutive_nonlocal_totalNslip(myInstance)
|
||||
|
||||
rhoForest = state(g,ip,el)%p(10*ns+1:11*ns)
|
||||
tauThreshold = state(g,ip,el)%p(11*ns+1:12*ns)
|
||||
Tdislocation_v = state(g,ip,el)%p(12*ns+1:12*ns+6)
|
||||
|
||||
tau = 0.0_pReal
|
||||
constitutive_nonlocal_v(:,:,g,ip,el) = 0.0_pReal
|
||||
if (present(dv_dtau)) dv_dtau = 0.0_pReal
|
||||
|
||||
do s = 1,ns
|
||||
if ((tauThreshold(s) > 0.0_pReal) .and. (Temperature > 0.0_pReal)) then
|
||||
if ( Temperature > 0.0_pReal ) then
|
||||
do s = 1,ns
|
||||
|
||||
tau(s) = math_mul6x6( Tstar_v + Tdislocation_v, &
|
||||
lattice_Sslip_v(:,constitutive_nonlocal_slipSystemLattice(s,myInstance),myStructure) )
|
||||
lattice_Sslip_v(:,constitutive_nonlocal_slipSystemLattice(s,myInstance),myStructure) )
|
||||
|
||||
constitutive_nonlocal_v(s,:,g,ip,el) = constitutive_nonlocal_v0PerSlipSystem(s,myInstance) &
|
||||
* exp( - constitutive_nonlocal_Q0(myInstance) / ( kB * Temperature) * (1.0_pReal - (abs(tau(s))/tauThreshold(s)) ) ) &
|
||||
* sign(1.0_pReal,tau(s))
|
||||
if ( abs(tau(s)) > 0.0_pReal ) then
|
||||
boltzmannProbability = dexp( -constitutive_nonlocal_Q0(myInstance) * dsqrt(rhoForest(s)) / ( abs(tau(s)) * kB * Temperature) )
|
||||
constitutive_nonlocal_v(s,:,g,ip,el) = constitutive_nonlocal_v0PerSlipSystem(s,myInstance) &
|
||||
/ ( constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) * dsqrt(rhoForest(s)) ) &
|
||||
* boltzmannProbability * sign(1.0_pReal,tau(s))
|
||||
|
||||
endif
|
||||
enddo
|
||||
if (present(dv_dtau)) &
|
||||
dv_dtau(s) = constitutive_nonlocal_Q0(myInstance) * constitutive_nonlocal_v0PerSlipSystem(s,myInstance) &
|
||||
/ ( constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) * tau(s)**2.0_pReal * kB * Temperature ) &
|
||||
* boltzmannProbability
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
|
||||
if (verboseDebugger .and. selectiveDebugger) then
|
||||
!$OMP CRITICAL (write2out)
|
||||
|
@ -1058,7 +1070,7 @@ endsubroutine
|
|||
!*********************************************************************
|
||||
!* calculates plastic velocity gradient and its tangent *
|
||||
!*********************************************************************
|
||||
subroutine constitutive_nonlocal_LpAndItsTangent(Lp, dLp_dTstar99, Tstar_v, Temperature, state, g, ip, el)
|
||||
subroutine constitutive_nonlocal_LpAndItsTangent(Lp, dLp_dTstar99, Tstar_v, Temperature, state, relevantState, g, ip, el)
|
||||
|
||||
use prec, only: pReal, &
|
||||
pInt, &
|
||||
|
@ -1085,7 +1097,8 @@ integer(pInt), intent(in) :: g, & ! curren
|
|||
el ! current element number
|
||||
real(pReal), intent(in) :: Temperature ! temperature
|
||||
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
||||
state ! microstructural state
|
||||
state, & ! microstructural state
|
||||
relevantState ! relevant microstructural state
|
||||
real(pReal), dimension(6), intent(in) :: Tstar_v ! 2nd Piola-Kirchhoff stress in Mandel notation
|
||||
|
||||
!*** output variables
|
||||
|
@ -1111,7 +1124,9 @@ real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstan
|
|||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el)))) :: &
|
||||
tauThreshold, & ! threshold shear stress
|
||||
gdotTotal, & ! shear rate
|
||||
dgdotTotal_dtau ! derivative of the shear rate with respect to the shear stress
|
||||
dv_dtau, & ! velocity derivative with respect to the shear stress
|
||||
dgdotTotal_dtau, & ! derivative of the shear rate with respect to the shear stress
|
||||
rhoForest ! forest dislocation density
|
||||
|
||||
|
||||
!*** initialize local variables
|
||||
|
@ -1131,17 +1146,18 @@ forall (t = 1:8) &
|
|||
forall (s = 1:ns, t = 5:8, rhoSgl(s,t) * constitutive_nonlocal_v(s,t-4,g,ip,el) < 0.0_pReal) & ! contribution of used rho for changing sign of v
|
||||
rhoSgl(s,t-4) = rhoSgl(s,t-4) + abs(rhoSgl(s,t))
|
||||
|
||||
rhoForest = state(g,ip,el)%p(10*ns+1:11*ns)
|
||||
tauThreshold = state(g,ip,el)%p(11*ns+1:12*ns)
|
||||
|
||||
call constitutive_nonlocal_kinetics(Tstar_v, Temperature, state, g, ip, el) ! update dislocation velocity
|
||||
call constitutive_nonlocal_kinetics(Tstar_v, Temperature, state, g, ip, el, dv_dtau) ! update dislocation velocity
|
||||
|
||||
!*** Calculation of gdot and its tangent
|
||||
|
||||
forall (t = 1:4 ) &
|
||||
gdot(:,t) = rhoSgl(:,t) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) * constitutive_nonlocal_v(:,t,g,ip,el)
|
||||
forall (s = 1:ns, t = 1:4, rhoSgl(s,t) > relevantState(g,ip,el)%p((t-1)*ns+s)) & ! no shear rate contribution for densities below relevant state
|
||||
gdot(s,t) = rhoSgl(s,t) * constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) * constitutive_nonlocal_v(s,t,g,ip,el)
|
||||
gdotTotal = sum(gdot,2)
|
||||
|
||||
dgdotTotal_dtau = abs(gdotTotal) * constitutive_nonlocal_Q0(myInstance) / ( kB * Temperature * tauThreshold )
|
||||
dgdotTotal_dtau = sum(rhoSgl,2) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) * dv_dtau
|
||||
|
||||
!*** Calculation of Lp and its tangent
|
||||
|
||||
|
@ -1217,6 +1233,7 @@ use lattice, only: lattice_Sslip, &
|
|||
lattice_st, &
|
||||
lattice_maxNslipFamily, &
|
||||
lattice_NslipSystem
|
||||
use FEsolving, only:theInc
|
||||
implicit none
|
||||
|
||||
!*** input variables
|
||||
|
@ -1352,16 +1369,16 @@ if (timestep <= 0.0_pReal) then
|
|||
return
|
||||
endif
|
||||
|
||||
if (any(constitutive_nonlocal_v(:,:,g,ip,el)*timestep > mesh_ipVolume(ip,el)**(1.0_pReal/3.0_pReal))) then ! if timestep is too large,...
|
||||
dotState(1,ip,el)%p(1:10*ns) = NaN ! ...assign NaN and enforce a cutback
|
||||
if (verboseDebugger) then
|
||||
!$OMP CRITICAL (write2out)
|
||||
write(6,*) 'exceeded maximum allowed dislocation velocity at ',g,ip,el
|
||||
write(6,*)
|
||||
!$OMPEND CRITICAL (write2out)
|
||||
endif
|
||||
return
|
||||
endif
|
||||
!if (any(constitutive_nonlocal_v(:,:,g,ip,el)*timestep > mesh_ipVolume(ip,el)**(1.0_pReal/3.0_pReal))) then ! if timestep is too large,...
|
||||
! dotState(1,ip,el)%p(1:10*ns) = NaN ! ...assign NaN and enforce a cutback
|
||||
! if (verboseDebugger) then
|
||||
! !$OMP CRITICAL (write2out)
|
||||
! write(6,*) 'exceeded maximum allowed dislocation velocity at ',g,ip,el
|
||||
! write(6,*)
|
||||
! !$OMPEND CRITICAL (write2out)
|
||||
! endif
|
||||
! return
|
||||
!endif
|
||||
|
||||
|
||||
!****************************************************************************
|
||||
|
@ -1604,19 +1621,22 @@ forall (t = 1:10) &
|
|||
+ rhoDotRemobilization(:,t) &
|
||||
+ rhoDotMultiplication(:,t) &
|
||||
+ rhoDotThermalAnnihilation(:,t)
|
||||
! + rhoDotDipole2SingleStressChange(:,t) &
|
||||
! + rhoDotDipole2SingleStressChange(:,t)
|
||||
! + rhoDotSingle2DipoleStressChange(:,t)
|
||||
|
||||
dotState(g,ip,el)%p(1:10*ns) = dotState(g,ip,el)%p(1:10*ns) + reshape(rhoDot,(/10*ns/))
|
||||
dotState(g,ip,el)%p(1:10*ns) = reshape(rhoDot,(/10*ns/))
|
||||
|
||||
do i = 1,4*ns
|
||||
do i = 1,10*ns
|
||||
if (i > 4*ns .and. i <= 8*ns) & ! skip immobile densities
|
||||
continue
|
||||
if (previousState(g,ip,el)%p(i) + dotState(g,ip,el)%p(i)*timestep < 0.0_pReal) then ! if single mobile densities become negative...
|
||||
if (previousState(g,ip,el)%p(i) < relevantState(g,ip,el)%p(i)) then ! ... and density is already below relevance...
|
||||
dotState(g,ip,el)%p(i) = 0.0_pReal ! ... set dotState to zero
|
||||
dotState(g,ip,el)%p(i) = - previousState(g,ip,el)%p(i) / timestep ! ... set dotState to zero
|
||||
else ! ... otherwise...
|
||||
if (verboseDebugger) then
|
||||
!$OMP CRITICAL (write2out)
|
||||
write(6,*) 'negative dislocation density at ',g,ip,el
|
||||
write(6,*) 'negative dislocation density: enforced cutback at ',g,ip,el,i
|
||||
write(6,'(a12,x,e15.8)') 'dotState was',dotState(g,ip,el)%p(i)
|
||||
write(6,*)
|
||||
!$OMPEND CRITICAL (write2out)
|
||||
endif
|
||||
|
@ -1671,7 +1691,7 @@ disorientationAxisAngle = math_QuaternionToAxisAngle(disorientation)
|
|||
disorientationAxis = disorientationAxisAngle(1:3)
|
||||
disorientationAngle = disorientationAxisAngle(4)
|
||||
|
||||
if (disorientationAngle < 3.0_pReal) then
|
||||
if (disorientationAngle < 5.0_pReal) then
|
||||
constitutive_nonlocal_transmissivity = 1.0_pReal
|
||||
else
|
||||
constitutive_nonlocal_transmissivity = 0.5_pReal
|
||||
|
|
2133
code/crystallite.f90
2133
code/crystallite.f90
File diff suppressed because it is too large
Load Diff
|
@ -3,7 +3,7 @@
|
|||
|
||||
debug 1 # >0 true to switch on debugging
|
||||
verbose 1 # >0 true to switch on verbose output
|
||||
selective 1 # >0 true to switch on e,i,g seelctive debugging
|
||||
element 123 # selected element for debugging (synonymous: "el", "e")
|
||||
ip 3 # selected integration point for debugging (synonymous: "integrationpoint", "i")
|
||||
grain 5 # selected grain at ip for debugging (synonymous: "gr", "g")
|
||||
selective 1 # >0 true to switch on e,i,g selective debugging
|
||||
element 1 # selected element for debugging (synonymous: "el", "e")
|
||||
ip 1 # selected integration point for debugging (synonymous: "integrationpoint", "i")
|
||||
grain 1 # selected grain at ip for debugging (synonymous: "gr", "g")
|
||||
|
|
|
@ -9,8 +9,7 @@
|
|||
|
||||
integer(pInt), dimension(:,:), allocatable :: debug_StressLoopDistribution
|
||||
integer(pInt), dimension(:,:), allocatable :: debug_LeapfrogBreakDistribution
|
||||
integer(pInt), dimension(:), allocatable :: debug_CrystalliteStateLoopDistribution
|
||||
integer(pInt), dimension(:), allocatable :: debug_StiffnessStateLoopDistribution
|
||||
integer(pInt), dimension(:,:), allocatable :: debug_StateLoopDistribution
|
||||
integer(pInt), dimension(:), allocatable :: debug_CrystalliteLoopDistribution
|
||||
integer(pInt), dimension(:), allocatable :: debug_MaterialpointStateLoopDistribution
|
||||
integer(pInt), dimension(:), allocatable :: debug_MaterialpointLoopDistribution
|
||||
|
@ -70,8 +69,7 @@ subroutine debug_init()
|
|||
|
||||
allocate(debug_StressLoopDistribution(nStress,2)) ; debug_StressLoopDistribution = 0_pInt
|
||||
allocate(debug_LeapfrogBreakDistribution(nStress,2)) ; debug_LeapfrogBreakDistribution = 0_pInt
|
||||
allocate(debug_CrystalliteStateLoopDistribution(nState)) ; debug_CrystalliteStateLoopDistribution = 0_pInt
|
||||
allocate(debug_StiffnessStateLoopDistribution(nState)) ; debug_StiffnessStateLoopDistribution = 0_pInt
|
||||
allocate(debug_StateLoopDistribution(nState,2)) ; debug_StateLoopDistribution = 0_pInt
|
||||
allocate(debug_CrystalliteLoopDistribution(nCryst+1)) ; debug_CrystalliteLoopDistribution = 0_pInt
|
||||
allocate(debug_MaterialpointStateLoopDistribution(nMPstate)) ; debug_MaterialpointStateLoopDistribution = 0_pInt
|
||||
allocate(debug_MaterialpointLoopDistribution(nHomog+1)) ; debug_MaterialpointLoopDistribution = 0_pInt
|
||||
|
@ -141,8 +139,7 @@ subroutine debug_reset()
|
|||
|
||||
debug_StressLoopDistribution = 0_pInt ! initialize debugging data
|
||||
debug_LeapfrogBreakDistribution = 0_pInt
|
||||
debug_CrystalliteStateLoopDistribution = 0_pInt
|
||||
debug_StiffnessStateLoopDistribution = 0_pInt
|
||||
debug_StateLoopDistribution = 0_pInt
|
||||
debug_CrystalliteLoopDistribution = 0_pInt
|
||||
debug_MaterialpointStateLoopDistribution = 0_pInt
|
||||
debug_MaterialpointLoopDistribution = 0_pInt
|
||||
|
@ -216,12 +213,14 @@ endsubroutine
|
|||
write(6,*)
|
||||
write(6,*) 'distribution_CrystalliteStateLoop :'
|
||||
do i=1,nState
|
||||
if (debug_CrystalliteStateLoopDistribution(i) /= 0) then
|
||||
integral = integral + i*debug_CrystalliteStateLoopDistribution(i)
|
||||
write(6,'(i25,x,i10)') i,debug_CrystalliteStateLoopDistribution(i)
|
||||
if (any(debug_StateLoopDistribution(i,:) /= 0)) then
|
||||
integral = integral + i*debug_StateLoopDistribution(i,1) + i*debug_StateLoopDistribution(i,2)
|
||||
write(6,'(i25,x,i10,12x,i10)') i,debug_StateLoopDistribution(i,1),debug_StateLoopDistribution(i,2)
|
||||
endif
|
||||
enddo
|
||||
write(6,'(a15,i10,x,i10)') ' total',integral,sum(debug_CrystalliteStateLoopDistribution)
|
||||
write(6,'(a15,i10,x,i10,12x,i10)') ' total',integral,&
|
||||
sum(debug_StateLoopDistribution(:,1)), &
|
||||
sum(debug_StateLoopDistribution(:,2))
|
||||
|
||||
integral = 0_pInt
|
||||
write(6,*)
|
||||
|
@ -238,18 +237,6 @@ endsubroutine
|
|||
enddo
|
||||
write(6,'(a15,i10,x,i10)') ' total',integral,sum(debug_CrystalliteLoopDistribution)
|
||||
|
||||
integral = 0_pInt
|
||||
write(6,*)
|
||||
write(6,*) 'distribution_StiffnessStateLoop :'
|
||||
do i=1,nState
|
||||
if (debug_StiffnessStateLoopDistribution(i) /= 0) then
|
||||
integral = integral + i*debug_StiffnessStateLoopDistribution(i)
|
||||
write(6,'(i25,x,i10)') i,debug_StiffnessStateLoopDistribution(i)
|
||||
endif
|
||||
enddo
|
||||
write(6,'(a15,i10,x,i10)') ' total',integral,sum(debug_StiffnessStateLoopDistribution)
|
||||
|
||||
!* Material point loop counter <<<updated 31.07.2009>>>
|
||||
integral = 0_pInt
|
||||
write(6,*)
|
||||
write(6,*)
|
||||
|
|
|
@ -229,6 +229,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
|||
stepIncreaseHomog, &
|
||||
nHomog, &
|
||||
nMPstate
|
||||
use math, only: math_det3x3
|
||||
use FEsolving, only: FEsolving_execElem, &
|
||||
FEsolving_execIP, &
|
||||
terminallyIll
|
||||
|
@ -243,6 +244,8 @@ subroutine materialpoint_stressAndItsTangent(&
|
|||
crystallite_Fp, &
|
||||
crystallite_Lp0, &
|
||||
crystallite_Lp, &
|
||||
crystallite_dPdF, &
|
||||
crystallite_dPdF0, &
|
||||
crystallite_Tstar0_v, &
|
||||
crystallite_Tstar_v, &
|
||||
crystallite_partionedTemperature0, &
|
||||
|
@ -250,6 +253,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
|||
crystallite_partionedF, &
|
||||
crystallite_partionedFp0, &
|
||||
crystallite_partionedLp0, &
|
||||
crystallite_partioneddPdF0, &
|
||||
crystallite_partionedTstar0_v, &
|
||||
crystallite_dt, &
|
||||
crystallite_requested, &
|
||||
|
@ -296,6 +300,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
|||
crystallite_partionedTemperature0(1:myNgrains,i,e) = materialpoint_Temperature(i,e) ! ...temperatures
|
||||
crystallite_partionedFp0(:,:,1:myNgrains,i,e) = crystallite_Fp0(:,:,1:myNgrains,i,e) ! ...plastic def grads
|
||||
crystallite_partionedLp0(:,:,1:myNgrains,i,e) = crystallite_Lp0(:,:,1:myNgrains,i,e) ! ...plastic velocity grads
|
||||
crystallite_partioneddPdF0(:,:,:,:,1:myNgrains,i,e) = crystallite_dPdF0(:,:,:,:,1:myNgrains,i,e) ! ...stiffness
|
||||
crystallite_partionedF0(:,:,1:myNgrains,i,e) = crystallite_F0(:,:,1:myNgrains,i,e) ! ...def grads
|
||||
crystallite_partionedTstar0_v(:,1:myNgrains,i,e)= crystallite_Tstar0_v(:,1:myNgrains,i,e) ! ...2nd PK stress
|
||||
|
||||
|
@ -348,6 +353,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
|||
crystallite_partionedF0(:,:,1:myNgrains,i,e) = crystallite_partionedF(:,:,1:myNgrains,i,e) ! ...def grads
|
||||
crystallite_partionedFp0(:,:,1:myNgrains,i,e) = crystallite_Fp(:,:,1:myNgrains,i,e) ! ...plastic def grads
|
||||
crystallite_partionedLp0(:,:,1:myNgrains,i,e) = crystallite_Lp(:,:,1:myNgrains,i,e) ! ...plastic velocity grads
|
||||
crystallite_partioneddPdF0(:,:,:,:,1:myNgrains,i,e) = crystallite_dPdF(:,:,:,:,1:myNgrains,i,e)! ...stiffness
|
||||
crystallite_partionedTstar0_v(:,1:myNgrains,i,e) = crystallite_Tstar_v(:,1:myNgrains,i,e) ! ...2nd PK stress
|
||||
forall (g = 1:myNgrains) constitutive_partionedState0(g,i,e)%p = constitutive_state(g,i,e)%p ! ...microstructures
|
||||
if (homogenization_sizeState(i,e) > 0_pInt) &
|
||||
|
@ -382,6 +388,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
|||
! ...initial def grad unchanged
|
||||
crystallite_Fp(:,:,1:myNgrains,i,e) = crystallite_partionedFp0(:,:,1:myNgrains,i,e) ! ...plastic def grads
|
||||
crystallite_Lp(:,:,1:myNgrains,i,e) = crystallite_partionedLp0(:,:,1:myNgrains,i,e) ! ...plastic velocity grads
|
||||
crystallite_dPdF(:,:,:,:,1:myNgrains,i,e) = crystallite_partioneddPdF0(:,:,:,:,1:myNgrains,i,e) ! ...stiffness
|
||||
crystallite_Tstar_v(:,1:myNgrains,i,e) = crystallite_partionedTstar0_v(:,1:myNgrains,i,e) ! ...2nd PK stress
|
||||
forall (g = 1:myNgrains) constitutive_state(g,i,e)%p = constitutive_partionedState0(g,i,e)%p ! ...microstructures
|
||||
if (homogenization_sizeState(i,e) > 0_pInt) &
|
||||
|
@ -478,7 +485,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
|||
|
||||
enddo ! homogenization convergence loop
|
||||
|
||||
NiterationHomog = NiterationHomog +1_pInt
|
||||
NiterationHomog = NiterationHomog + 1_pInt
|
||||
|
||||
enddo ! cutback loop
|
||||
|
||||
|
|
|
@ -26,6 +26,9 @@ integer(pInt), parameter :: lattice_maxNslip = 48 ! max # of sli
|
|||
integer(pInt), parameter :: lattice_maxNtwin = 24 ! max # of twin systems over lattice structures
|
||||
integer(pInt), parameter :: lattice_maxNinteraction = 20 ! max # of interaction types (in hardening matrix part)
|
||||
|
||||
integer(pInt), parameter, dimension(3) :: lattice_symmetryTypes =(/1, 1, 2/) ! maps crystal structures to symmetry tpyes
|
||||
|
||||
|
||||
integer(pInt), pointer, dimension(:,:) :: interactionSlipSlip, &
|
||||
interactionSlipTwin, &
|
||||
interactionTwinSlip, &
|
||||
|
@ -429,37 +432,37 @@ integer(pInt), allocatable, dimension(:,:,:) :: lattice_interactionSlipSlip, &
|
|||
integer(pInt), parameter :: lattice_hex_Ntwin = 24 ! sum(lattice_hex_NtwinSystem)
|
||||
integer(pInt) :: lattice_hex_Nstructure = 0_pInt
|
||||
|
||||
!* sorted by A. Alankar & P. Eisenlohr
|
||||
!* sorted by YJ.Ro and Philip
|
||||
real(pReal), dimension(4+4,lattice_hex_Nslip), parameter :: lattice_hex_systemSlip = &
|
||||
reshape((/&
|
||||
! Basal systems <1120>{0001} (independent of c/a-ratio, Bravais notation (4 coordinate base))
|
||||
2, -1, -1, 0, 0, 0, 0, 1, & !A1
|
||||
-1, 2, -1, 0, 0, 0, 0, 1, & !A2
|
||||
-1, -1, 2, 0, 0, 0, 0, 1, & !A3
|
||||
2, -1, -1, 0, 0, 0, 0, 1, &
|
||||
1, 1, -2, 0, 0, 0, 0, 1, &
|
||||
-1, 2, -1, 0, 0, 0, 0, 1, &
|
||||
! 1st type prismatic systems <1120>{1010} (independent of c/a-ratio)
|
||||
2, -1, -1, 0, 0, 1, -1, 0, & !B1
|
||||
-1, 2, -1, 0, -1, 0, 1, 0, & !C2
|
||||
-1, -1, 2, 0, 1, -1, 0, 0, & !D3
|
||||
! 1st type 1st order pyramidal systems <1120>{1011} -- plane normals depend on the c/a-ratio
|
||||
2, -1, -1, 0, 0, 1, -1, 1, & !E1
|
||||
1, 1, -2, 0, -1, 1, 0, 1, & !F(-3)
|
||||
-1, 2, -1, 0, -1, 0, 1, 1, & !G2
|
||||
-2, 1, 1, 0, 0, -1, 1, 1, & !H(-1)
|
||||
-1, -1, 2, 0, 1, -1, 0, 1, & !I3
|
||||
1, -2, 1, 0, 1, 0, -1, 1, & !J(-2)
|
||||
2, -1, -1, 0, 0, -1, 1, 0, &
|
||||
1, 1, 2, 0, 1, -1, 0, 0, &
|
||||
-1, 2, -1, 0, 1, 0, -1, 0, &
|
||||
! 1st type 1st order pyramidal systems <1120>{1011}
|
||||
2, -1, -1, 0, 0, -1, 1, 1, &
|
||||
1, 1, -2, 0, 1, -1, 0, 1, &
|
||||
-1, 2, -1, 0, 1, 0, -1, 1, &
|
||||
-2, 1, 1, 0, 0, 1, -1, 1, &
|
||||
-1, -1, 2, 0, -1, 1, 0, 1, &
|
||||
1, -2, 1, 0, -1, 0, 1, 1, &
|
||||
! pyramidal system: c+a slip <2113>{1011} -- plane normals depend on the c/a-ratio
|
||||
-1, 2, -1, 3, 0, 1, -1, 1, & !E4
|
||||
1, 1, -2, 3, 0, 1, -1, 1, & !E5
|
||||
-2, 1, 1, 3, -1, 1, 0, 1, & !F6
|
||||
-1, 2, -1, 3, -1, 1, 0, 1, & !F4
|
||||
-1, -1, 2, 3, -1, 0, 1, 1, & !G7
|
||||
-2, 1, 1, 3, -1, 0, 1, 1, & !G6
|
||||
1, -2, 1, 3, 0, -1, 1, 1, & !H8
|
||||
-1, -1, 2, 3, 0, -1, 1, 1, & !H7
|
||||
2, -1, -1, 3, 1, -1, 0, 1, & !I9
|
||||
1, -2, 1, 3, 1, -1, 0, 1, & !I8
|
||||
1, 1, -2, 3, 1, 0, -1, 1, & !J5
|
||||
2, -1, -1, 3, 1, 0, -1, 1 & !J9
|
||||
2, -1, -1, -3, 1, -1, 0, 1, &
|
||||
1, 1, -2, -3, 1, 0, -1, 1, &
|
||||
-1, 2, -1, -3, 1, -1, 0, 1, &
|
||||
-2, 1, 1, -3, 1, 0, -1, 1, &
|
||||
-1, -1, 2, -3, 0, 1, -1, 1, &
|
||||
1, -2, 1, -3, 0, -1, 1, 1, &
|
||||
-2, 1, 1, -3, -1, 0, 1, 1, &
|
||||
-1, -1, 2, -3, 0, -1, 1, 1, &
|
||||
1, -2, 1, -3, 0, 1, -1, 1, &
|
||||
2, -1, -1, -3, -1, 1, 0, 1, &
|
||||
1, 1, -2, -3, -1, 0, 1, 1, &
|
||||
-1, 2, -1, -3, -1, 1, 0, 1 &
|
||||
/),(/4+4,lattice_hex_Nslip/))
|
||||
|
||||
real(pReal), dimension(4+4,lattice_hex_Ntwin), parameter :: lattice_hex_systemTwin = &
|
||||
|
@ -658,30 +661,6 @@ CONTAINS
|
|||
!* - lattice_initializeStructure
|
||||
!****************************************
|
||||
|
||||
pure function lattice_symmetryType(structID)
|
||||
!**************************************
|
||||
!* maps structure to symmetry type *
|
||||
!* fcc(1) and bcc(2) are cubic(1) *
|
||||
!* hex(3+) is hexagonal(2) *
|
||||
!**************************************
|
||||
implicit none
|
||||
|
||||
integer(pInt), intent(in) :: structID
|
||||
integer(pInt) lattice_symmetryType
|
||||
|
||||
select case(structID)
|
||||
case (1,2)
|
||||
lattice_symmetryType = 1_pInt
|
||||
case (3:)
|
||||
lattice_symmetryType = 2_pInt
|
||||
case default
|
||||
lattice_symmetryType = 0_pInt
|
||||
end select
|
||||
|
||||
return
|
||||
|
||||
end function
|
||||
|
||||
|
||||
subroutine lattice_init()
|
||||
!**************************************
|
||||
|
|
|
@ -230,9 +230,9 @@ rhoSglScrewPos0 1e11 0 0 0 # Initial positive screw single
|
|||
rhoSglScrewNeg0 1e11 0 0 0 # Initial negative screw single dislocation density in m/m**3
|
||||
rhoDipEdge0 1e8 0 0 0 # Initial edge dipole dislocation density in m/m**3
|
||||
rhoDipScrew0 1e8 0 0 0 # Initial screw dipole dislocation density in m/m**3
|
||||
r 1e-5 # cutoff radius for dislocation stress in m
|
||||
v0 1e-4 0 0 0 # prefactor for dislocation velocity
|
||||
Q0 3e-19 # activation energy for dislocation glide
|
||||
r 10e-6 # cutoff radius for dislocation stress in m
|
||||
v0 3500 0 0 0 # maximum dislocation velocity (velocity of sound)
|
||||
Q0 5e-19 # activation energy for dislocation glide
|
||||
dDipMinEdge 1e-9 0 0 0 # minimum distance for stable edge dipoles in m
|
||||
dDipMinScrew 1e-9 0 0 0 # minimum distance for stable screw dipoles in m
|
||||
lambda0 100 0 0 0 # prefactor for mean free path
|
||||
|
|
|
@ -7,6 +7,8 @@ iJacoStiffness 1 # frequency of stiffness update
|
|||
iJacoLpresiduum 1 # frequency of Jacobian update of residuum in Lp
|
||||
pert_Fg 1.0e-7 # deformation gradient perturbation for grain tangent
|
||||
pert_method 1 # perturbation method (1 = forward, 2 = backward or 3 = central)
|
||||
integrator 1 # integration method (1 = Fixed Point Iteration, 2 = Euler, 3 = Adaptive Euler, 4 = classical 4th order Runge-Kutta, 5 = 5th order Runge-Kutta Cash-Karp)
|
||||
integratorStiffness 1 # integration method used for stiffness (1 = Fixed Point Iteration, 2 = Euler, 3 = Adaptive Euler, 4 = classical 4th order Runge-Kutta, 5 = 5th order Runge-Kutta Cash-Karp)
|
||||
|
||||
## crystallite numerical parameters ##
|
||||
nCryst 20 # crystallite loop limit (only for debugging info, loop limit is determined by "subStepMinCryst")
|
||||
|
|
|
@ -14,7 +14,9 @@ integer(pInt) iJacoStiffness, & ! freque
|
|||
nCryst, & ! crystallite loop limit (only for debugging info, loop limit is determined by "subStepMinCryst")
|
||||
nState, & ! state loop limit
|
||||
nStress, & ! stress loop limit
|
||||
pert_method ! method used in perturbation technique for tangent
|
||||
pert_method, & ! method used in perturbation technique for tangent
|
||||
integrator, & ! method used for state integration
|
||||
integratorStiffness ! method used for stiffness state integration
|
||||
real(pReal) relevantStrain, & ! strain increment considered significant (used by crystallite to determine whether strain inc is considered significant)
|
||||
defgradTolerance, & ! deviation of deformation gradient that is still allowed (used by CPFEM to determine outdated ffn1)
|
||||
pert_Fg, & ! strain perturbation for FEM Jacobi
|
||||
|
@ -106,6 +108,8 @@ subroutine numerics_init()
|
|||
rTol_crystalliteTemperature = 1.0e-6_pReal
|
||||
rTol_crystalliteStress = 1.0e-6_pReal
|
||||
aTol_crystalliteStress = 1.0e-8_pReal ! residuum is in Lp (hence strain on the order of 1e-8 here)
|
||||
integrator = 1
|
||||
integratorStiffness = 1
|
||||
|
||||
!* RGC parameters: added <<<updated 17.12.2009>>> with moderate setting
|
||||
absTol_RGC = 1.0e+4
|
||||
|
@ -181,6 +185,10 @@ subroutine numerics_init()
|
|||
rTol_crystalliteStress = IO_floatValue(line,positions,2)
|
||||
case ('atol_crystallitestress')
|
||||
aTol_crystalliteStress = IO_floatValue(line,positions,2)
|
||||
case ('integrator')
|
||||
integrator = IO_intValue(line,positions,2)
|
||||
case ('integratorstiffness')
|
||||
integratorStiffness = IO_intValue(line,positions,2)
|
||||
|
||||
!* RGC parameters: added <<<updated 17.12.2009>>>
|
||||
case ('atol_rgc')
|
||||
|
@ -242,6 +250,8 @@ subroutine numerics_init()
|
|||
write(6,'(a24,x,e8.1)') 'rTol_crystalliteTemp: ',rTol_crystalliteTemperature
|
||||
write(6,'(a24,x,e8.1)') 'rTol_crystalliteStress: ',rTol_crystalliteStress
|
||||
write(6,'(a24,x,e8.1)') 'aTol_crystalliteStress: ',aTol_crystalliteStress
|
||||
write(6,'(a24,x,i8)') 'integrator: ',integrator
|
||||
write(6,'(a24,x,i8)') 'integratorStiffness: ',integratorStiffness
|
||||
write(6,*)
|
||||
|
||||
write(6,'(a24,x,i8)') 'nHomog: ',nHomog
|
||||
|
@ -252,23 +262,23 @@ subroutine numerics_init()
|
|||
write(6,*)
|
||||
|
||||
!* RGC parameters: added <<<updated 17.12.2009>>>
|
||||
write(6,'(a24,x,e8.1)') 'aTol_RGC: ',absTol_RGC
|
||||
write(6,'(a24,x,e8.1)') 'rTol_RGC: ',relTol_RGC
|
||||
write(6,'(a24,x,e8.1)') 'aMax_RGC: ',absMax_RGC
|
||||
write(6,'(a24,x,e8.1)') 'rMax_RGC: ',relMax_RGC
|
||||
write(6,'(a24,x,e8.1)') 'perturbPenalty_RGC: ',pPert_RGC
|
||||
write(6,'(a24,x,e8.1)') 'relevantMismatch_RGC: ',xSmoo_RGC
|
||||
write(6,'(a24,x,e8.1)') 'viscosityrate_RGC: ',viscPower_RGC
|
||||
write(6,'(a24,x,e8.1)') 'viscositymodulus_RGC: ',viscModus_RGC
|
||||
write(6,'(a24,x,e8.1)') 'maxrelaxation_RGC: ',maxdRelax_RGC
|
||||
write(6,'(a24,x,e8.1)') 'maxVolDiscrepancy_RGC:',maxVolDiscr_RGC
|
||||
write(6,'(a24,x,e8.1)') 'volDiscrepancyMod_RGC:',volDiscrMod_RGC
|
||||
write(6,'(a24,x,e8.1)') 'discrepancyPower_RGC: ',volDiscrPow_RGC
|
||||
write(6,'(a24,x,e8.1)') 'aTol_RGC: ',absTol_RGC
|
||||
write(6,'(a24,x,e8.1)') 'rTol_RGC: ',relTol_RGC
|
||||
write(6,'(a24,x,e8.1)') 'aMax_RGC: ',absMax_RGC
|
||||
write(6,'(a24,x,e8.1)') 'rMax_RGC: ',relMax_RGC
|
||||
write(6,'(a24,x,e8.1)') 'perturbPenalty_RGC: ',pPert_RGC
|
||||
write(6,'(a24,x,e8.1)') 'relevantMismatch_RGC: ',xSmoo_RGC
|
||||
write(6,'(a24,x,e8.1)') 'viscosityrate_RGC: ',viscPower_RGC
|
||||
write(6,'(a24,x,e8.1)') 'viscositymodulus_RGC: ',viscModus_RGC
|
||||
write(6,'(a24,x,e8.1)') 'maxrelaxation_RGC: ',maxdRelax_RGC
|
||||
write(6,'(a24,x,e8.1)') 'maxVolDiscrepancy_RGC: ',maxVolDiscr_RGC
|
||||
write(6,'(a24,x,e8.1)') 'volDiscrepancyMod_RGC: ',volDiscrMod_RGC
|
||||
write(6,'(a24,x,e8.1)') 'discrepancyPower_RGC: ',volDiscrPow_RGC
|
||||
|
||||
write(6,*)
|
||||
|
||||
!* Random seeding parameters: added <<<updated 27.08.2009>>>
|
||||
write(6,'(a24,x,i8)') 'fixed_seed: ',fixedSeed
|
||||
write(6,'(a24,x,i8)') 'fixed_seed: ',fixedSeed
|
||||
write(6,*)
|
||||
|
||||
! sanity check
|
||||
|
@ -294,6 +304,10 @@ subroutine numerics_init()
|
|||
if (rTol_crystalliteTemperature <= 0.0_pReal) call IO_error(276) !! oops !!
|
||||
if (rTol_crystalliteStress <= 0.0_pReal) call IO_error(270)
|
||||
if (aTol_crystalliteStress <= 0.0_pReal) call IO_error(271)
|
||||
if (integrator <= 0_pInt .or. integrator >= 6_pInt) &
|
||||
call IO_error(298)
|
||||
if (integratorStiffness <= 0_pInt .or. integratorStiffness >= 6_pInt) &
|
||||
call IO_error(298)
|
||||
|
||||
!* RGC parameters: added <<<updated 17.11.2009>>>
|
||||
if (absTol_RGC <= 0.0_pReal) call IO_error(272)
|
||||
|
|
Loading…
Reference in New Issue