Introduced an alternative cutback scheme for the nonlocal model, that allows to keep the results of most of the ips that immediately converged, and only do cutbacks in regions where some ips are in big trouble. Only works for nonlocal model and state integrator 2.
This commit is contained in:
parent
05507a6240
commit
e10000a338
|
@ -94,6 +94,7 @@ subroutine constitutive_init
|
||||||
mesh_NcpElems, &
|
mesh_NcpElems, &
|
||||||
mesh_element, &
|
mesh_element, &
|
||||||
mesh_ipNeighborhood, &
|
mesh_ipNeighborhood, &
|
||||||
|
mesh_maxNipNeighbors, &
|
||||||
FE_Nips, &
|
FE_Nips, &
|
||||||
FE_NipNeighbors, &
|
FE_NipNeighbors, &
|
||||||
FE_geomtype
|
FE_geomtype
|
||||||
|
@ -123,6 +124,7 @@ integer(pInt) g, &
|
||||||
gMax, & ! maximum number of grains
|
gMax, & ! maximum number of grains
|
||||||
iMax, & ! maximum number of integration points
|
iMax, & ! maximum number of integration points
|
||||||
eMax, & ! maximum number of elements
|
eMax, & ! maximum number of elements
|
||||||
|
n, &
|
||||||
p, &
|
p, &
|
||||||
s, &
|
s, &
|
||||||
myInstance,&
|
myInstance,&
|
||||||
|
@ -763,7 +765,7 @@ end subroutine constitutive_hooke_TandItsTangent
|
||||||
!* This subroutine contains the constitutive equation for *
|
!* This subroutine contains the constitutive equation for *
|
||||||
!* calculating the rate of change of microstructure *
|
!* calculating the rate of change of microstructure *
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
subroutine constitutive_collectDotState(Tstar_v, Fe, Fp, Temperature, subdt, orientation, ipc, ip, el)
|
subroutine constitutive_collectDotState(Tstar_v, Fe, Fp, Temperature, subdt, subfrac, orientation, ipc, ip, el)
|
||||||
|
|
||||||
use prec, only: pReal, pLongInt
|
use prec, only: pReal, pLongInt
|
||||||
use debug, only: debug_cumDotStateCalls, &
|
use debug, only: debug_cumDotStateCalls, &
|
||||||
|
@ -772,7 +774,8 @@ use debug, only: debug_cumDotStateCalls, &
|
||||||
debug_constitutive, &
|
debug_constitutive, &
|
||||||
debug_levelBasic
|
debug_levelBasic
|
||||||
use mesh, only: mesh_NcpElems, &
|
use mesh, only: mesh_NcpElems, &
|
||||||
mesh_maxNips
|
mesh_maxNips, &
|
||||||
|
mesh_maxNipNeighbors
|
||||||
use material, only: phase_plasticity, &
|
use material, only: phase_plasticity, &
|
||||||
material_phase, &
|
material_phase, &
|
||||||
homogenization_maxNgrains
|
homogenization_maxNgrains
|
||||||
|
@ -796,6 +799,8 @@ integer(pInt), intent(in) :: ipc, & ! component-ID of current integrat
|
||||||
el ! current element
|
el ! current element
|
||||||
real(pReal), intent(in) :: Temperature, &
|
real(pReal), intent(in) :: Temperature, &
|
||||||
subdt ! timestep
|
subdt ! timestep
|
||||||
|
real(pReal), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
||||||
|
subfrac ! subfraction of timestep
|
||||||
real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
||||||
Fe, & ! elastic deformation gradient
|
Fe, & ! elastic deformation gradient
|
||||||
Fp ! plastic deformation gradient
|
Fp ! plastic deformation gradient
|
||||||
|
@ -831,8 +836,8 @@ select case (phase_plasticity(material_phase(ipc,ip,el)))
|
||||||
|
|
||||||
case (constitutive_nonlocal_label)
|
case (constitutive_nonlocal_label)
|
||||||
constitutive_dotState(ipc,ip,el)%p = constitutive_nonlocal_dotState(Tstar_v, Fe, Fp, Temperature, constitutive_state, &
|
constitutive_dotState(ipc,ip,el)%p = constitutive_nonlocal_dotState(Tstar_v, Fe, Fp, Temperature, constitutive_state, &
|
||||||
subdt, orientation, ipc, ip, el)
|
constitutive_state0, subdt, subfrac, orientation, ipc, ip, el)
|
||||||
|
|
||||||
end select
|
end select
|
||||||
|
|
||||||
if (iand(debug_level(debug_constitutive), debug_levelBasic) /= 0_pInt) then
|
if (iand(debug_level(debug_constitutive), debug_levelBasic) /= 0_pInt) then
|
||||||
|
|
|
@ -2020,13 +2020,14 @@ endsubroutine
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
!* rate of change of microstructure *
|
!* rate of change of microstructure *
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
function constitutive_nonlocal_dotState(Tstar_v, Fe, Fp, Temperature, state, timestep, orientation, g,ip,el)
|
function constitutive_nonlocal_dotState(Tstar_v, Fe, Fp, Temperature, state, state0, timestep, subfrac, orientation, g,ip,el)
|
||||||
|
|
||||||
use prec, only: pReal, &
|
use prec, only: pReal, &
|
||||||
pInt, &
|
pInt, &
|
||||||
p_vec, &
|
p_vec, &
|
||||||
DAMASK_NaN
|
DAMASK_NaN
|
||||||
use numerics, only: numerics_integrationMode
|
use numerics, only: numerics_integrationMode, &
|
||||||
|
numerics_timeSyncing
|
||||||
use IO, only: IO_error
|
use IO, only: IO_error
|
||||||
use debug, only: debug_level, &
|
use debug, only: debug_level, &
|
||||||
debug_constitutive, &
|
debug_constitutive, &
|
||||||
|
@ -2048,6 +2049,7 @@ use math, only: math_norm3, &
|
||||||
use mesh, only: mesh_NcpElems, &
|
use mesh, only: mesh_NcpElems, &
|
||||||
mesh_maxNips, &
|
mesh_maxNips, &
|
||||||
mesh_element, &
|
mesh_element, &
|
||||||
|
mesh_maxNipNeighbors, &
|
||||||
mesh_ipNeighborhood, &
|
mesh_ipNeighborhood, &
|
||||||
mesh_ipVolume, &
|
mesh_ipVolume, &
|
||||||
mesh_ipArea, &
|
mesh_ipArea, &
|
||||||
|
@ -2072,13 +2074,17 @@ integer(pInt), intent(in) :: g, & ! current
|
||||||
real(pReal), intent(in) :: Temperature, & ! temperature
|
real(pReal), intent(in) :: Temperature, & ! temperature
|
||||||
timestep ! substepped crystallite time increment
|
timestep ! substepped crystallite time increment
|
||||||
real(pReal), dimension(6), intent(in) :: Tstar_v ! current 2nd Piola-Kirchhoff stress in Mandel notation
|
real(pReal), dimension(6), intent(in) :: Tstar_v ! current 2nd Piola-Kirchhoff stress in Mandel notation
|
||||||
|
real(pReal), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
||||||
|
subfrac ! fraction of timestep at the beginning of the substepped crystallite time increment
|
||||||
real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
||||||
Fe, & ! elastic deformation gradient
|
Fe, & ! elastic deformation gradient
|
||||||
Fp ! plastic deformation gradient
|
Fp ! plastic deformation gradient
|
||||||
real(pReal), dimension(4,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
real(pReal), dimension(4,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
||||||
orientation ! crystal lattice orientation
|
orientation ! crystal lattice orientation
|
||||||
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: &
|
||||||
state ! current microstructural state
|
state, & ! current microstructural state
|
||||||
|
state0 ! microstructural state at beginning of crystallite increment
|
||||||
|
|
||||||
!*** input/output variables
|
!*** input/output variables
|
||||||
|
|
||||||
!*** output variables
|
!*** output variables
|
||||||
|
@ -2111,11 +2117,15 @@ real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_plasticityInstance
|
||||||
rhoDotAthermalAnnihilation, & ! density evolution by athermal annihilation
|
rhoDotAthermalAnnihilation, & ! density evolution by athermal annihilation
|
||||||
rhoDotThermalAnnihilation ! density evolution by thermal annihilation
|
rhoDotThermalAnnihilation ! density evolution by thermal annihilation
|
||||||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_plasticityInstance(material_phase(g,ip,el))),8) :: &
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_plasticityInstance(material_phase(g,ip,el))),8) :: &
|
||||||
neighboring_rhoSgl, & ! current single dislocation densities (positive/negative screw and edge without dipoles)
|
rhoSgl, & ! current single dislocation densities (positive/negative screw and edge without dipoles)
|
||||||
rhoSgl ! current single dislocation densities (positive/negative screw and edge without dipoles)
|
rhoSgl0, & ! single dislocation densities at start of cryst inc (positive/negative screw and edge without dipoles)
|
||||||
|
rhoSglMe, & ! single dislocation densities of central ip (positive/negative screw and edge without dipoles)
|
||||||
|
neighboring_rhoSgl ! current single dislocation densities of neighboring ip (positive/negative screw and edge without dipoles)
|
||||||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_plasticityInstance(material_phase(g,ip,el))),4) :: &
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_plasticityInstance(material_phase(g,ip,el))),4) :: &
|
||||||
v, & ! dislocation glide velocity
|
v, & ! current dislocation glide velocity
|
||||||
neighboring_v, & ! dislocation glide velocity
|
v0, & ! dislocation glide velocity at start of cryst inc
|
||||||
|
vMe, & ! dislocation glide velocity of central ip
|
||||||
|
neighboring_v, & ! dislocation glide velocity of enighboring ip
|
||||||
gdot ! shear rates
|
gdot ! shear rates
|
||||||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_plasticityInstance(material_phase(g,ip,el)))) :: &
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_plasticityInstance(material_phase(g,ip,el)))) :: &
|
||||||
rhoForest, & ! forest dislocation density
|
rhoForest, & ! forest dislocation density
|
||||||
|
@ -2188,7 +2198,6 @@ where (abs(rhoDip) * mesh_ipVolume(ip,el) ** 0.667_pReal < constitutive_nonlocal
|
||||||
rhoDip = 0.0_pReal
|
rhoDip = 0.0_pReal
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!*** sanity check for timestep
|
!*** sanity check for timestep
|
||||||
|
|
||||||
if (timestep <= 0.0_pReal) then ! if illegal timestep...
|
if (timestep <= 0.0_pReal) then ! if illegal timestep...
|
||||||
|
@ -2305,6 +2314,17 @@ if (.not. phase_localPlasticity(material_phase(g,ip,el))) then
|
||||||
constitutive_nonlocal_dotState = DAMASK_NaN ! -> return NaN and, hence, enforce cutback
|
constitutive_nonlocal_dotState = DAMASK_NaN ! -> return NaN and, hence, enforce cutback
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
if (numerics_timeSyncing) then
|
||||||
|
forall (t = 1_pInt:4_pInt) &
|
||||||
|
v0(1_pInt:ns,t) = state0(g,ip,el)%p((12_pInt+t)*ns+1_pInt:(13_pInt+t)*ns)
|
||||||
|
forall (t = 1_pInt:8_pInt) &
|
||||||
|
rhoSgl0(1_pInt:ns,t) = state0(g,ip,el)%p((t-1_pInt)*ns+1_pInt:t*ns)
|
||||||
|
where (abs(rhoSgl0) * mesh_ipVolume(ip,el) ** 0.667_pReal < constitutive_nonlocal_significantN(myInstance) &
|
||||||
|
.or. abs(rhoSgl0) < constitutive_nonlocal_significantRho(myInstance)) &
|
||||||
|
rhoSgl0 = 0.0_pReal
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
!*** be aware of the definition of lattice_st = lattice_sd x lattice_sn !!!
|
!*** be aware of the definition of lattice_st = lattice_sd x lattice_sn !!!
|
||||||
|
@ -2352,12 +2372,18 @@ if (.not. phase_localPlasticity(material_phase(g,ip,el))) then
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if (considerEnteringFlux) then
|
if (considerEnteringFlux) then
|
||||||
forall (t = 1_pInt:4_pInt) &
|
if(numerics_timeSyncing .and. (subfrac(g,neighboring_ip,neighboring_el) == 0.0_pReal &
|
||||||
neighboring_v(1_pInt:ns,t) = state(g,neighboring_ip,neighboring_el)%p((12_pInt+t)*ns+1_pInt:(13_pInt+t)*ns)
|
.or. subfrac(g,ip,el) == 0.0_pReal)) then
|
||||||
forall (t = 1_pInt:4_pInt) &
|
forall (t = 1_pInt:4_pInt) &
|
||||||
neighboring_rhoSgl(1_pInt:ns,t) = max(state(g,neighboring_ip,neighboring_el)%p((t-1_pInt)*ns+1_pInt:t*ns), 0.0_pReal)
|
neighboring_v(1_pInt:ns,t) = state0(g,neighboring_ip,neighboring_el)%p((12_pInt+t)*ns+1_pInt:(13_pInt+t)*ns)
|
||||||
forall (t = 5_pInt:8_pInt) &
|
forall (t = 1_pInt:8_pInt) &
|
||||||
neighboring_rhoSgl(1_pInt:ns,t) = state(g,neighboring_ip,neighboring_el)%p((t-1_pInt)*ns+1_pInt:t*ns)
|
neighboring_rhoSgl(1_pInt:ns,t) = state0(g,neighboring_ip,neighboring_el)%p((t-1_pInt)*ns+1_pInt:t*ns)
|
||||||
|
else
|
||||||
|
forall (t = 1_pInt:4_pInt) &
|
||||||
|
neighboring_v(1_pInt:ns,t) = state(g,neighboring_ip,neighboring_el)%p((12_pInt+t)*ns+1_pInt:(13_pInt+t)*ns)
|
||||||
|
forall (t = 1_pInt:8_pInt) &
|
||||||
|
neighboring_rhoSgl(1_pInt:ns,t) = state(g,neighboring_ip,neighboring_el)%p((t-1_pInt)*ns+1_pInt:t*ns)
|
||||||
|
endif
|
||||||
where (abs(neighboring_rhoSgl) * mesh_ipVolume(neighboring_ip,neighboring_el) ** 0.667_pReal &
|
where (abs(neighboring_rhoSgl) * mesh_ipVolume(neighboring_ip,neighboring_el) ** 0.667_pReal &
|
||||||
< constitutive_nonlocal_significantN(myInstance) &
|
< constitutive_nonlocal_significantN(myInstance) &
|
||||||
.or. abs(neighboring_rhoSgl) < constitutive_nonlocal_significantRho(myInstance)) &
|
.or. abs(neighboring_rhoSgl) < constitutive_nonlocal_significantRho(myInstance)) &
|
||||||
|
@ -2404,6 +2430,14 @@ if (.not. phase_localPlasticity(material_phase(g,ip,el))) then
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if (considerLeavingFlux) then
|
if (considerLeavingFlux) then
|
||||||
|
if(numerics_timeSyncing .and. (subfrac(g,neighboring_ip,neighboring_el) == 0.0_pReal &
|
||||||
|
.or. subfrac(g,ip,el) == 0.0_pReal)) then
|
||||||
|
rhoSglMe = rhoSgl0
|
||||||
|
vMe = v0
|
||||||
|
else
|
||||||
|
rhoSglMe = rhoSgl
|
||||||
|
vMe = v
|
||||||
|
endif
|
||||||
normal_me2neighbor_defConf = math_det33(Favg) * math_mul33x3(math_inv33(math_transpose33(Favg)), &
|
normal_me2neighbor_defConf = math_det33(Favg) * math_mul33x3(math_inv33(math_transpose33(Favg)), &
|
||||||
mesh_ipAreaNormal(1:3,n,ip,el)) ! calculate the normal of the interface in (average) deformed configuration (pointing from me to my neighbor!!!)
|
mesh_ipAreaNormal(1:3,n,ip,el)) ! calculate the normal of the interface in (average) deformed configuration (pointing from me to my neighbor!!!)
|
||||||
normal_me2neighbor = math_mul33x3(math_transpose33(my_Fe), normal_me2neighbor_defConf) / math_det33(my_Fe) ! interface normal in my lattice configuration
|
normal_me2neighbor = math_mul33x3(math_transpose33(my_Fe), normal_me2neighbor_defConf) / math_det33(my_Fe) ! interface normal in my lattice configuration
|
||||||
|
@ -2411,18 +2445,18 @@ if (.not. phase_localPlasticity(material_phase(g,ip,el))) then
|
||||||
normal_me2neighbor = normal_me2neighbor / math_norm3(normal_me2neighbor) ! normalize the surface normal to unit length
|
normal_me2neighbor = normal_me2neighbor / math_norm3(normal_me2neighbor) ! normalize the surface normal to unit length
|
||||||
do s = 1_pInt,ns
|
do s = 1_pInt,ns
|
||||||
do t = 1_pInt,4_pInt
|
do t = 1_pInt,4_pInt
|
||||||
c = (t + 1_pInt) / 2_pInt
|
c = (t + 1_pInt) / 2_pInt
|
||||||
if (v(s,t) * math_mul3x3(m(1:3,s,t), normal_me2neighbor) > 0.0_pReal ) then ! flux from me to my neighbor == leaving flux for me (might also be a pure flux from my mobile density to dead density if interface not at all transmissive)
|
if (vMe(s,t) * math_mul3x3(m(1:3,s,t), normal_me2neighbor) > 0.0_pReal ) then ! flux from me to my neighbor == leaving flux for me (might also be a pure flux from my mobile density to dead density if interface not at all transmissive)
|
||||||
if (v(s,t) * neighboring_v(s,t) >= 0.0_pReal) then ! no sign change in flux density
|
if (vMe(s,t) * neighboring_v(s,t) >= 0.0_pReal) then ! no sign change in flux density
|
||||||
transmissivity = sum(constitutive_nonlocal_compatibility(c,1_pInt:ns,s,n,ip,el)**2.0_pReal) ! overall transmissivity from this slip system to my neighbor
|
transmissivity = sum(constitutive_nonlocal_compatibility(c,1_pInt:ns,s,n,ip,el)**2.0_pReal) ! overall transmissivity from this slip system to my neighbor
|
||||||
else ! sign change in flux density means sign change in stress which does not allow for dislocations to arive at the neighbor
|
else ! sign change in flux density means sign change in stress which does not allow for dislocations to arive at the neighbor
|
||||||
transmissivity = 0.0_pReal
|
transmissivity = 0.0_pReal
|
||||||
endif
|
endif
|
||||||
lineLength = rhoSgl(s,t) * v(s,t) * math_mul3x3(m(1:3,s,t), normal_me2neighbor) * area ! positive line length of mobiles that wants to leave through this interface
|
lineLength = rhoSglMe(s,t) * vMe(s,t) * math_mul3x3(m(1:3,s,t), normal_me2neighbor) * area ! positive line length of mobiles that wants to leave through this interface
|
||||||
rhoDotFlux(s,t) = rhoDotFlux(s,t) - lineLength / mesh_ipVolume(ip,el) ! subtract dislocation flux from current type
|
rhoDotFlux(s,t) = rhoDotFlux(s,t) - lineLength / mesh_ipVolume(ip,el) ! subtract dislocation flux from current type
|
||||||
rhoDotFlux(s,t+4_pInt) = rhoDotFlux(s,t+4_pInt) + lineLength / mesh_ipVolume(ip,el) * (1.0_pReal - transmissivity) &
|
rhoDotFlux(s,t+4_pInt) = rhoDotFlux(s,t+4_pInt) + lineLength / mesh_ipVolume(ip,el) * (1.0_pReal - transmissivity) &
|
||||||
* sign(1.0_pReal, v(s,t)) ! dislocation flux that is not able to leave through interface (because of low transmissivity) will remain as immobile single density at the material point
|
* sign(1.0_pReal, vMe(s,t)) ! dislocation flux that is not able to leave through interface (because of low transmissivity) will remain as immobile single density at the material point
|
||||||
lineLength = rhoSgl(s,t+4_pInt) * v(s,t) * math_mul3x3(m(1:3,s,t), normal_me2neighbor) * area ! positive line length of deads that wants to leave through this interface
|
lineLength = rhoSglMe(s,t+4_pInt) * vMe(s,t) * math_mul3x3(m(1:3,s,t), normal_me2neighbor) * area ! positive line length of deads that wants to leave through this interface
|
||||||
rhoDotFlux(s,t+4_pInt) = rhoDotFlux(s,t+4_pInt) - lineLength / mesh_ipVolume(ip,el) * transmissivity ! dead dislocations leaving through this interface
|
rhoDotFlux(s,t+4_pInt) = rhoDotFlux(s,t+4_pInt) - lineLength / mesh_ipVolume(ip,el) * transmissivity ! dead dislocations leaving through this interface
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
|
@ -3583,6 +3617,7 @@ do o = 1_pInt,phase_Noutput(material_phase(g,ip,el))
|
||||||
|
|
||||||
case('accumulatedshear')
|
case('accumulatedshear')
|
||||||
constitutive_nonlocal_accumulatedShear(1:ns,g,ip,el) = constitutive_nonlocal_accumulatedShear(1:ns,g,ip,el) + sum(gdot,2)*dt
|
constitutive_nonlocal_accumulatedShear(1:ns,g,ip,el) = constitutive_nonlocal_accumulatedShear(1:ns,g,ip,el) + sum(gdot,2)*dt
|
||||||
|
!$OMP FLUSH(constitutive_nonlocal_accumulatedShear)
|
||||||
constitutive_nonlocal_postResults(cs+1_pInt:cs+ns) = constitutive_nonlocal_accumulatedShear(1:ns,g,ip,el)
|
constitutive_nonlocal_postResults(cs+1_pInt:cs+ns) = constitutive_nonlocal_accumulatedShear(1:ns,g,ip,el)
|
||||||
cs = cs + ns
|
cs = cs + ns
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,12 @@ module crystallite
|
||||||
crystallite_requested, & !< flag to request crystallite calculation
|
crystallite_requested, & !< flag to request crystallite calculation
|
||||||
crystallite_todo, & !< flag to indicate need for further computation
|
crystallite_todo, & !< flag to indicate need for further computation
|
||||||
crystallite_converged !< convergence flag
|
crystallite_converged !< convergence flag
|
||||||
|
logical, dimension (:,:), allocatable :: &
|
||||||
|
crystallite_clearToWindForward, &
|
||||||
|
crystallite_clearToCutback, &
|
||||||
|
crystallite_syncSubFrac, &
|
||||||
|
crystallite_syncSubFracCompleted, &
|
||||||
|
crystallite_neighborEnforcedCutback
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -225,6 +231,11 @@ subroutine crystallite_init(Temperature)
|
||||||
allocate(crystallite_requested(gMax,iMax,eMax)); crystallite_requested = .false.
|
allocate(crystallite_requested(gMax,iMax,eMax)); crystallite_requested = .false.
|
||||||
allocate(crystallite_todo(gMax,iMax,eMax)); crystallite_todo = .false.
|
allocate(crystallite_todo(gMax,iMax,eMax)); crystallite_todo = .false.
|
||||||
allocate(crystallite_converged(gMax,iMax,eMax)); crystallite_converged = .true.
|
allocate(crystallite_converged(gMax,iMax,eMax)); crystallite_converged = .true.
|
||||||
|
allocate(crystallite_clearToWindForward(iMax,eMax)); crystallite_clearToWindForward = .true.
|
||||||
|
allocate(crystallite_syncSubFrac(iMax,eMax)); crystallite_syncSubFrac = .false.
|
||||||
|
allocate(crystallite_syncSubFracCompleted(iMax,eMax)); crystallite_syncSubFracCompleted = .false.
|
||||||
|
allocate(crystallite_clearToCutback(iMax,eMax)); crystallite_clearToCutback = .true.
|
||||||
|
allocate(crystallite_neighborEnforcedCutback(iMax,eMax)); crystallite_neighborEnforcedCutback = .false.
|
||||||
allocate(crystallite_output(maxval(crystallite_Noutput), &
|
allocate(crystallite_output(maxval(crystallite_Noutput), &
|
||||||
material_Ncrystallite)) ; crystallite_output = ''
|
material_Ncrystallite)) ; crystallite_output = ''
|
||||||
allocate(crystallite_sizePostResults(material_Ncrystallite)) ; crystallite_sizePostResults = 0_pInt
|
allocate(crystallite_sizePostResults(material_Ncrystallite)) ; crystallite_sizePostResults = 0_pInt
|
||||||
|
@ -449,6 +460,7 @@ use numerics, only: subStepMinCryst, &
|
||||||
nCryst, &
|
nCryst, &
|
||||||
numerics_integrator, &
|
numerics_integrator, &
|
||||||
numerics_integrationMode, &
|
numerics_integrationMode, &
|
||||||
|
numerics_timeSyncing, &
|
||||||
relevantStrain, &
|
relevantStrain, &
|
||||||
analyticJaco
|
analyticJaco
|
||||||
use debug, only: debug_level, &
|
use debug, only: debug_level, &
|
||||||
|
@ -474,7 +486,9 @@ use FEsolving, only: FEsolving_execElem, &
|
||||||
FEsolving_execIP
|
FEsolving_execIP
|
||||||
use mesh, only: mesh_element, &
|
use mesh, only: mesh_element, &
|
||||||
mesh_NcpElems, &
|
mesh_NcpElems, &
|
||||||
mesh_maxNips
|
mesh_maxNips, &
|
||||||
|
mesh_ipNeighborhood, &
|
||||||
|
FE_NipNeighbors
|
||||||
use material, only: homogenization_Ngrains, &
|
use material, only: homogenization_Ngrains, &
|
||||||
homogenization_maxNgrains
|
homogenization_maxNgrains
|
||||||
use constitutive, only: constitutive_sizeState, &
|
use constitutive, only: constitutive_sizeState, &
|
||||||
|
@ -488,12 +502,14 @@ use constitutive, only: constitutive_sizeState, &
|
||||||
constitutive_dotState_backup, &
|
constitutive_dotState_backup, &
|
||||||
constitutive_TandItsTangent
|
constitutive_TandItsTangent
|
||||||
|
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
!*** input variables ***!
|
!*** input variables ***!
|
||||||
logical, intent(in) :: updateJaco, rate_sensitivity ! flag indicating wehther we want to update the Jacobian (stiffness) or not
|
logical, intent(in) :: updateJaco, rate_sensitivity ! flag indicating wehther we want to update the Jacobian (stiffness) or not
|
||||||
!*** local variables ***!
|
!*** local variables ***!
|
||||||
real(pReal) myPert, & ! perturbation with correct sign
|
real(pReal) myPert, & ! perturbation with correct sign
|
||||||
formerSubStep
|
formerSubStep, &
|
||||||
|
subFracIntermediate
|
||||||
real(pReal), dimension(3,3) :: invFp, & ! inverse of the plastic deformation gradient
|
real(pReal), dimension(3,3) :: invFp, & ! inverse of the plastic deformation gradient
|
||||||
Fe_guess, & ! guess for elastic deformation gradient
|
Fe_guess, & ! guess for elastic deformation gradient
|
||||||
Tstar ! 2nd Piola-Kirchhoff stress tensor
|
Tstar ! 2nd Piola-Kirchhoff stress tensor
|
||||||
|
@ -517,6 +533,9 @@ integer(pInt) NiterationCrystallite, &
|
||||||
g, & ! grain index
|
g, & ! grain index
|
||||||
k, &
|
k, &
|
||||||
l, &
|
l, &
|
||||||
|
n, &
|
||||||
|
neighboring_e, &
|
||||||
|
neighboring_i, &
|
||||||
o, &
|
o, &
|
||||||
p, &
|
p, &
|
||||||
perturbation , & ! loop counter for forward,backward perturbation mode
|
perturbation , & ! loop counter for forward,backward perturbation mode
|
||||||
|
@ -583,32 +602,207 @@ NiterationCrystallite = 0_pInt
|
||||||
numerics_integrationMode = 1_pInt
|
numerics_integrationMode = 1_pInt
|
||||||
do while (any(crystallite_todo(:,:,FEsolving_execELem(1):FEsolving_execElem(2)))) ! cutback loop for crystallites
|
do while (any(crystallite_todo(:,:,FEsolving_execELem(1):FEsolving_execElem(2)))) ! cutback loop for crystallites
|
||||||
|
|
||||||
!$OMP PARALLEL DO PRIVATE(myNgrains,formerSubStep)
|
if (any(.not. crystallite_localPlasticity) .and. numerics_timeSyncing) then
|
||||||
do e = FEsolving_execElem(1),FEsolving_execElem(2) ! iterate over elements to be processed
|
|
||||||
myNgrains = homogenization_Ngrains(mesh_element(3,e))
|
! Time synchronization can only be used for nonlocal calculations, and only there it makes sense.
|
||||||
do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e) ! iterate over IPs of this element to be processed
|
! The idea is that in nonlocal calculations often the vast amjority of the ips
|
||||||
do g = 1,myNgrains
|
! converges in one iteration whereas a small fraction of ips has to do a lot of cutbacks.
|
||||||
|
! Hence, we try to minimize the computational effort by just doing a lot of cutbacks
|
||||||
! --- wind forward ---
|
! in the vicinity of the "bad" ips and leave the easily converged volume more or less as it is.
|
||||||
|
! However, some synchronization of the time step has to be done at the border between "bad" ips
|
||||||
if (crystallite_converged(g,i,e)) then
|
! and the ones that immediately converged.
|
||||||
|
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,i6)') '<< CRYST >> crystallite iteration ',NiterationCrystallite
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (any(crystallite_syncSubFrac)) then
|
||||||
|
|
||||||
|
! Just did a time synchronization.
|
||||||
|
! Dont do anything else than winding the synchronizers forward.
|
||||||
|
|
||||||
|
crystallite_clearToWindForward = crystallite_localPlasticity(1,:,:) .or. crystallite_syncSubFrac
|
||||||
|
crystallite_clearToCutback = crystallite_localPlasticity(1,:,:)
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,i6)') '<< CRYST >> time synchronization: wind forward'
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
|
elseif (any(crystallite_syncSubFracCompleted)) then
|
||||||
|
|
||||||
|
! Just completed a time synchronization.
|
||||||
|
! Make sure that the ips that synchronized their time step start non-converged
|
||||||
|
|
||||||
|
where(crystallite_syncSubFracCompleted) &
|
||||||
|
crystallite_converged(1,:,:) = .false.
|
||||||
|
crystallite_syncSubFracCompleted = .false.
|
||||||
|
crystallite_clearToWindForward = crystallite_localPlasticity(1,:,:)
|
||||||
|
crystallite_clearToCutback = crystallite_localPlasticity(1,:,:) .or. .not. crystallite_converged(1,:,:)
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,i6)') '<< CRYST >> time synchronization: done, proceed with cutback'
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
! Normal calculation.
|
||||||
|
! If all converged and are at the end of the time increment, then just do a final wind forward.
|
||||||
|
! If all converged, but not all reached the end of the time increment, then we only wind
|
||||||
|
! those forward that are still on their way, all others have to wait.
|
||||||
|
! If some did not converge and all are still at the start of the time increment,
|
||||||
|
! then all non-convergers force their converged neighbors to also do a cutback.
|
||||||
|
! In case that some ips have already wound forward to an intermediate time (subfrac),
|
||||||
|
! then all those ips that converged in the first iteration, but now have a non-converged neighbor
|
||||||
|
! have to synchronize their time step to the same intermediate time. If such a synchronization
|
||||||
|
! takes place, all other ips have to wait and only the synchronizers do a cutback. In the next
|
||||||
|
! iteration those will do a wind forward while all others still wait.
|
||||||
|
|
||||||
|
crystallite_clearToWindForward = crystallite_localPlasticity(1,:,:)
|
||||||
|
crystallite_clearToCutback = crystallite_localPlasticity(1,:,:)
|
||||||
|
if (all(crystallite_localPlasticity .or. crystallite_converged)) then
|
||||||
|
if (all(crystallite_localPlasticity .or. crystallite_subStep + crystallite_subFrac >= 1.0_pReal)) then
|
||||||
|
crystallite_clearToWindForward = .true. ! final wind forward
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,i6)') '<< CRYST >> final wind forward'
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
crystallite_clearToWindForward = crystallite_localPlasticity(1,:,:) .or. crystallite_subStep(1,:,:) < 1.0_pReal
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,i6)') '<< CRYST >> wind forward'
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
subFracIntermediate = maxval(crystallite_subFrac, mask=.not.crystallite_localPlasticity)
|
||||||
|
if (subFracIntermediate == 0.0_pReal) then
|
||||||
|
crystallite_neighborEnforcedCutback = .false. ! look for ips that require a cutback because of a nonconverged neighbor
|
||||||
|
!$OMP PARALLEL DO PRIVATE(neighboring_e,neighboring_i)
|
||||||
|
do e = FEsolving_execElem(1),FEsolving_execElem(2)
|
||||||
|
do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e)
|
||||||
|
if (.not. crystallite_localPlasticity(1,i,e) .and. crystallite_converged(1,i,e)) then
|
||||||
|
do n = 1_pInt,FE_NipNeighbors(mesh_element(2,e))
|
||||||
|
neighboring_e = mesh_ipNeighborhood(1,n,i,e)
|
||||||
|
neighboring_i = mesh_ipNeighborhood(2,n,i,e)
|
||||||
|
if (neighboring_e > 0_pInt .and. neighboring_i > 0_pInt) then
|
||||||
|
if (.not. crystallite_localPlasticity(1,neighboring_i,neighboring_e) &
|
||||||
|
.and. .not. crystallite_converged(1,neighboring_i,neighboring_e)) then
|
||||||
|
crystallite_neighborEnforcedCutback(i,e) = .true.
|
||||||
|
#ifndef _OPENMP
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) &
|
||||||
|
write(6,'(a12,i5,1x,i2,a,i5,1x,i2)') '<< CRYST >> ', neighboring_e,neighboring_i, &
|
||||||
|
' enforced cutback at ',e,i
|
||||||
|
#endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
!$OMP END PARALLEL DO
|
||||||
|
where(crystallite_neighborEnforcedCutback) &
|
||||||
|
crystallite_converged(1,:,:) = .false.
|
||||||
|
else
|
||||||
|
crystallite_syncSubFrac = .false. ! look for ips that have to do a time synchronization because of a nonconverged neighbor
|
||||||
|
!$OMP PARALLEL DO PRIVATE(neighboring_e,neighboring_i)
|
||||||
|
do e = FEsolving_execElem(1),FEsolving_execElem(2)
|
||||||
|
do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e)
|
||||||
|
if (.not. crystallite_localPlasticity(1,i,e) .and. crystallite_subFrac(1,i,e) == 0.0_pReal) then
|
||||||
|
do n = 1_pInt,FE_NipNeighbors(mesh_element(2,e))
|
||||||
|
neighboring_e = mesh_ipNeighborhood(1,n,i,e)
|
||||||
|
neighboring_i = mesh_ipNeighborhood(2,n,i,e)
|
||||||
|
if (neighboring_e > 0_pInt .and. neighboring_i > 0_pInt) then
|
||||||
|
if (.not. crystallite_localPlasticity(1,neighboring_i,neighboring_e) &
|
||||||
|
.and. .not. crystallite_converged(1,neighboring_i,neighboring_e)) then
|
||||||
|
crystallite_syncSubFrac(i,e) = .true.
|
||||||
|
#ifndef _OPENMP
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) &
|
||||||
|
write(6,'(a12,i5,1x,i2,a,i5,1x,i2)') '<< CRYST >> ',neighboring_e,neighboring_i, &
|
||||||
|
' enforced time synchronization at ',e,i
|
||||||
|
#endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
!$OMP END PARALLEL DO
|
||||||
|
where(crystallite_syncSubFrac) &
|
||||||
|
crystallite_converged(1,:,:) = .false.
|
||||||
|
endif
|
||||||
|
where(.not. crystallite_localPlasticity .and. crystallite_subStep < 1.0_pReal) &
|
||||||
|
crystallite_converged = .false.
|
||||||
|
if (any(crystallite_syncSubFrac)) then ! have to do syncing now, so all wait except for the synchronizers which do a cutback
|
||||||
|
crystallite_clearToWindForward = crystallite_localPlasticity(1,:,:)
|
||||||
|
crystallite_clearToCutback = crystallite_localPlasticity(1,:,:) .or. crystallite_syncSubFrac
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,i6)') '<< CRYST >> time synchronization: cutback'
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
where(.not. crystallite_converged(1,:,:)) &
|
||||||
|
crystallite_clearToCutback = .true.
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,i6)') '<< CRYST >> cutback'
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
! Make sure that all cutbackers start with the same substep
|
||||||
|
|
||||||
|
where(.not. crystallite_localPlasticity .and. .not. crystallite_converged) &
|
||||||
|
crystallite_subStep = minval(crystallite_subStep, mask=.not. crystallite_localPlasticity &
|
||||||
|
.and. .not. crystallite_converged)
|
||||||
|
|
||||||
|
! Those that do neither wind forward nor cutback are not to do
|
||||||
|
|
||||||
|
where(.not. crystallite_clearToWindForward .and. .not. crystallite_clearToCutback) &
|
||||||
|
crystallite_todo(1,:,:) = .false.
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
!$OMP PARALLEL DO PRIVATE(myNgrains,formerSubStep)
|
||||||
|
do e = FEsolving_execElem(1),FEsolving_execElem(2) ! iterate over elements to be processed
|
||||||
|
myNgrains = homogenization_Ngrains(mesh_element(3,e))
|
||||||
|
do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e) ! iterate over IPs of this element to be processed
|
||||||
|
do g = 1,myNgrains
|
||||||
|
|
||||||
|
! --- wind forward ---
|
||||||
|
|
||||||
|
if (crystallite_converged(g,i,e) .and. crystallite_clearToWindForward(i,e)) then
|
||||||
formerSubStep = crystallite_subStep(g,i,e)
|
formerSubStep = crystallite_subStep(g,i,e)
|
||||||
crystallite_subFrac(g,i,e) = crystallite_subFrac(g,i,e) + crystallite_subStep(g,i,e)
|
crystallite_subFrac(g,i,e) = crystallite_subFrac(g,i,e) + crystallite_subStep(g,i,e)
|
||||||
!$OMP FLUSH(crystallite_subFrac)
|
!$OMP FLUSH(crystallite_subFrac)
|
||||||
crystallite_subStep(g,i,e) = min( 1.0_pReal - crystallite_subFrac(g,i,e), &
|
crystallite_subStep(g,i,e) = min(1.0_pReal - crystallite_subFrac(g,i,e), &
|
||||||
stepIncreaseCryst * crystallite_subStep(g,i,e) )
|
stepIncreaseCryst * crystallite_subStep(g,i,e))
|
||||||
!$OMP FLUSH(crystallite_subStep)
|
!$OMP FLUSH(crystallite_subStep)
|
||||||
if (crystallite_subStep(g,i,e) > 0.0_pReal) then
|
if (crystallite_subStep(g,i,e) > 0.0_pReal) then
|
||||||
crystallite_subTemperature0(g,i,e) = crystallite_Temperature(g,i,e) ! wind forward...
|
crystallite_subTemperature0(g,i,e) = crystallite_Temperature(g,i,e) ! wind forward...
|
||||||
crystallite_subF0(1:3,1:3,g,i,e) = crystallite_subF(1:3,1:3,g,i,e) ! ...def grad
|
crystallite_subF0(1:3,1:3,g,i,e) = crystallite_subF(1:3,1:3,g,i,e) ! ...def grad
|
||||||
!$OMP FLUSH(crystallite_subF0)
|
!$OMP FLUSH(crystallite_subF0)
|
||||||
crystallite_subFp0(1:3,1:3,g,i,e) = crystallite_Fp(1:3,1:3,g,i,e) ! ...plastic def grad
|
crystallite_subFp0(1:3,1:3,g,i,e) = crystallite_Fp(1:3,1:3,g,i,e) ! ...plastic def grad
|
||||||
crystallite_subFe0(1:3,1:3,g,i,e) = math_mul33x33(crystallite_subF(1:3,1:3,g,i,e), crystallite_invFp(1:3,1:3,g,i,e)) ! only needed later on for stiffness calculation
|
crystallite_subFe0(1:3,1:3,g,i,e) = math_mul33x33(crystallite_subF(1:3,1:3,g,i,e), crystallite_invFp(1:3,1:3,g,i,e)) ! only needed later on for stiffness calculation
|
||||||
crystallite_subLp0(1:3,1:3,g,i,e) = crystallite_Lp(1:3,1:3,g,i,e) ! ...plastic velocity gradient
|
crystallite_subLp0(1:3,1:3,g,i,e) = crystallite_Lp(1:3,1:3,g,i,e) ! ...plastic velocity gradient
|
||||||
constitutive_subState0(g,i,e)%p = constitutive_state(g,i,e)%p ! ...microstructure
|
constitutive_subState0(g,i,e)%p = constitutive_state(g,i,e)%p ! ...microstructure
|
||||||
crystallite_subTstar0_v(1:6,g,i,e) = crystallite_Tstar_v(1:6,g,i,e) ! ...2nd PK stress
|
crystallite_subTstar0_v(1:6,g,i,e) = crystallite_Tstar_v(1:6,g,i,e) ! ...2nd PK stress
|
||||||
crystallite_todo(g,i,e) = .true.
|
if (crystallite_syncSubFrac(i,e)) then ! if we just did a synchronization of states, then we wind forward without any further time integration
|
||||||
!$OMP FLUSH(crystallite_todo)
|
crystallite_syncSubFracCompleted(i,e) = .true.
|
||||||
|
crystallite_syncSubFrac(i,e) = .false.
|
||||||
|
crystallite_todo(g,i,e) = .false.
|
||||||
|
else
|
||||||
|
crystallite_todo(g,i,e) = .true.
|
||||||
|
endif
|
||||||
|
!$OMP FLUSH(crystallite_todo)
|
||||||
#ifndef _OPENMP
|
#ifndef _OPENMP
|
||||||
if (iand(debug_level(debug_crystallite),debug_levelBasic) /= 0_pInt &
|
if (iand(debug_level(debug_crystallite),debug_levelBasic) /= 0_pInt &
|
||||||
.and. ((e == debug_e .and. i == debug_i .and. g == debug_g) &
|
.and. ((e == debug_e .and. i == debug_i .and. g == debug_g) &
|
||||||
|
@ -619,33 +813,37 @@ do while (any(crystallite_todo(:,:,FEsolving_execELem(1):FEsolving_execElem(2)))
|
||||||
write(6,*)
|
write(6,*)
|
||||||
endif
|
endif
|
||||||
#endif
|
#endif
|
||||||
elseif (formerSubStep > 0.0_pReal) then ! this crystallite just converged
|
elseif (formerSubStep > 0.0_pReal) then ! this crystallite just converged for the entire timestep
|
||||||
crystallite_todo(g,i,e) = .false. ! so done here
|
crystallite_todo(g,i,e) = .false. ! so done here
|
||||||
!$OMP FLUSH(crystallite_todo)
|
!$OMP FLUSH(crystallite_todo)
|
||||||
if (iand(debug_level(debug_crystallite),debug_levelBasic) /= 0_pInt) then
|
if (iand(debug_level(debug_crystallite),debug_levelBasic) /= 0_pInt) then
|
||||||
!$OMP CRITICAL (distributionCrystallite)
|
!$OMP CRITICAL (distributionCrystallite)
|
||||||
debug_CrystalliteLoopDistribution(min(nCryst+1_pInt,NiterationCrystallite)) = &
|
debug_CrystalliteLoopDistribution(min(nCryst+1_pInt,NiterationCrystallite)) = &
|
||||||
debug_CrystalliteLoopDistribution(min(nCryst+1_pInt,NiterationCrystallite)) + 1_pInt
|
debug_CrystalliteLoopDistribution(min(nCryst+1_pInt,NiterationCrystallite)) + 1_pInt
|
||||||
!$OMP END CRITICAL (distributionCrystallite)
|
!$OMP END CRITICAL (distributionCrystallite)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
|
! --- cutback ---
|
||||||
! --- cutback ---
|
|
||||||
|
elseif (.not. crystallite_converged(g,i,e) .and. crystallite_clearToCutback(i,e)) then
|
||||||
else
|
if (crystallite_syncSubFrac(i,e)) then ! synchronize time
|
||||||
crystallite_subStep(g,i,e) = subStepSizeCryst * crystallite_subStep(g,i,e) ! cut step in half and restore...
|
crystallite_subStep(g,i,e) = subFracIntermediate
|
||||||
!$OMP FLUSH(crystallite_subStep)
|
else
|
||||||
crystallite_Temperature(g,i,e) = crystallite_subTemperature0(g,i,e) ! ...temperature
|
crystallite_subStep(g,i,e) = subStepSizeCryst * crystallite_subStep(g,i,e) ! cut step in half and restore...
|
||||||
crystallite_Fp(1:3,1:3,g,i,e) = crystallite_subFp0(1:3,1:3,g,i,e) ! ...plastic def grad
|
endif
|
||||||
!$OMP FLUSH(crystallite_Fp)
|
!$OMP FLUSH(crystallite_subStep)
|
||||||
|
crystallite_Temperature(g,i,e) = crystallite_subTemperature0(g,i,e) ! ...temperature
|
||||||
|
crystallite_Fp(1:3,1:3,g,i,e) = crystallite_subFp0(1:3,1:3,g,i,e) ! ...plastic def grad
|
||||||
|
!$OMP FLUSH(crystallite_Fp)
|
||||||
crystallite_invFp(1:3,1:3,g,i,e) = math_inv33(crystallite_Fp(1:3,1:3,g,i,e))
|
crystallite_invFp(1:3,1:3,g,i,e) = math_inv33(crystallite_Fp(1:3,1:3,g,i,e))
|
||||||
!$OMP FLUSH(crystallite_invFp)
|
!$OMP FLUSH(crystallite_invFp)
|
||||||
crystallite_Lp(1:3,1:3,g,i,e) = crystallite_subLp0(1:3,1:3,g,i,e) ! ...plastic velocity grad
|
crystallite_Lp(1:3,1:3,g,i,e) = crystallite_subLp0(1:3,1:3,g,i,e) ! ...plastic velocity grad
|
||||||
constitutive_state(g,i,e)%p = constitutive_subState0(g,i,e)%p ! ...microstructure
|
constitutive_state(g,i,e)%p = constitutive_subState0(g,i,e)%p ! ...microstructure
|
||||||
crystallite_Tstar_v(1:6,g,i,e) = crystallite_subTstar0_v(1:6,g,i,e) ! ...2nd PK stress
|
crystallite_Tstar_v(1:6,g,i,e) = crystallite_subTstar0_v(1:6,g,i,e) ! ...2nd PK stress
|
||||||
! cant restore dotState here, since not yet calculated in first cutback after initialization
|
! cant restore dotState here, since not yet calculated in first cutback after initialization
|
||||||
crystallite_todo(g,i,e) = crystallite_subStep(g,i,e) > subStepMinCryst ! still on track or already done (beyond repair)
|
crystallite_todo(g,i,e) = crystallite_subStep(g,i,e) > subStepMinCryst ! still on track or already done (beyond repair)
|
||||||
!$OMP FLUSH(crystallite_todo)
|
!$OMP FLUSH(crystallite_todo)
|
||||||
#ifndef _OPENMP
|
#ifndef _OPENMP
|
||||||
if (crystallite_todo(g,i,e) &
|
if (crystallite_todo(g,i,e) &
|
||||||
.and. iand(debug_level(debug_crystallite),debug_levelBasic) /= 0_pInt &
|
.and. iand(debug_level(debug_crystallite),debug_levelBasic) /= 0_pInt &
|
||||||
|
@ -659,15 +857,15 @@ do while (any(crystallite_todo(:,:,FEsolving_execELem(1):FEsolving_execElem(2)))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
! --- prepare for integration ---
|
! --- prepare for integration ---
|
||||||
|
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. (crystallite_clearToWindForward(i,e) .or. crystallite_clearToCutback(i,e))) then
|
||||||
crystallite_subF(1:3,1:3,g,i,e) = crystallite_subF0(1:3,1:3,g,i,e) &
|
crystallite_subF(1:3,1:3,g,i,e) = crystallite_subF0(1:3,1:3,g,i,e) &
|
||||||
+ crystallite_subStep(g,i,e) &
|
+ crystallite_subStep(g,i,e) &
|
||||||
* (crystallite_partionedF(1:3,1:3,g,i,e) - crystallite_partionedF0(1:3,1:3,g,i,e))
|
* (crystallite_partionedF(1:3,1:3,g,i,e) - crystallite_partionedF0(1:3,1:3,g,i,e))
|
||||||
!$OMP FLUSH(crystallite_subF)
|
!$OMP FLUSH(crystallite_subF)
|
||||||
crystallite_Fe(1:3,1:3,g,i,e) = math_mul33x33(crystallite_subF(1:3,1:3,g,i,e), crystallite_invFp(1:3,1:3,g,i,e))
|
crystallite_Fe(1:3,1:3,g,i,e) = math_mul33x33(crystallite_subF(1:3,1:3,g,i,e), crystallite_invFp(1:3,1:3,g,i,e))
|
||||||
crystallite_subdt(g,i,e) = crystallite_subStep(g,i,e) * crystallite_dt(g,i,e)
|
crystallite_subdt(g,i,e) = crystallite_subStep(g,i,e) * crystallite_dt(g,i,e)
|
||||||
crystallite_converged(g,i,e) = .false. ! start out non-converged
|
crystallite_converged(g,i,e) = .false. ! start out non-converged
|
||||||
endif
|
endif
|
||||||
|
|
||||||
enddo ! grains
|
enddo ! grains
|
||||||
|
@ -675,8 +873,29 @@ do while (any(crystallite_todo(:,:,FEsolving_execELem(1):FEsolving_execElem(2)))
|
||||||
enddo ! elements
|
enddo ! elements
|
||||||
!$OMP END PARALLEL DO
|
!$OMP END PARALLEL DO
|
||||||
|
|
||||||
|
if(numerics_timeSyncing) then
|
||||||
|
if (any(.not. crystallite_localPlasticity .and. .not. crystallite_todo .and. .not. crystallite_converged &
|
||||||
|
.and. crystallite_subStep <= subStepMinCryst)) then ! no way of rescuing a nonlocal ip that violated the lower time step limit, ...
|
||||||
|
where(.not. crystallite_localPlasticity)
|
||||||
|
crystallite_todo = .false. ! ... so let all nonlocal ips die peacefully
|
||||||
|
crystallite_subStep = 0.0_pReal
|
||||||
|
endwhere
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (iand(debug_level(debug_crystallite),debug_levelExtensive) /= 0_pInt) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,*)
|
||||||
|
write(6,'(a,e12.5)') '<< CRYST >> min(subStep) ',minval(crystallite_subStep)
|
||||||
|
write(6,'(a,e12.5)') '<< CRYST >> max(subStep) ',maxval(crystallite_subStep)
|
||||||
|
write(6,'(a,e12.5)') '<< CRYST >> min(subFrac) ',minval(crystallite_subFrac)
|
||||||
|
write(6,'(a,e12.5)') '<< CRYST >> max(subFrac) ',maxval(crystallite_subFrac)
|
||||||
|
write(6,*)
|
||||||
|
!$OMP END CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
! --- integrate --- requires fully defined state array (basic + dependent state)
|
! --- integrate --- requires fully defined state array (basic + dependent state)
|
||||||
|
|
||||||
if (any(crystallite_todo)) then
|
if (any(crystallite_todo)) then
|
||||||
select case(numerics_integrator(numerics_integrationMode))
|
select case(numerics_integrator(numerics_integrationMode))
|
||||||
case(1_pInt)
|
case(1_pInt)
|
||||||
|
@ -1068,7 +1287,8 @@ RK4dotTemperature = 0.0_pReal
|
||||||
constitutive_RK4dotState(g,i,e)%p = 0.0_pReal ! initialize Runge-Kutta dotState
|
constitutive_RK4dotState(g,i,e)%p = 0.0_pReal ! initialize Runge-Kutta dotState
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_orientation, g,i,e)
|
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_subFrac, &
|
||||||
|
crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -1193,7 +1413,7 @@ do n = 1_pInt,4_pInt
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), timeStepFraction(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep
|
crystallite_Temperature(g,i,e), timeStepFraction(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep
|
||||||
crystallite_orientation, g,i,e)
|
crystallite_subFrac, crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -1390,7 +1610,8 @@ endif
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_orientation, g,i,e)
|
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_subFrac, &
|
||||||
|
crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -1539,7 +1760,7 @@ do n = 1_pInt,5_pInt
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), c(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep
|
crystallite_Temperature(g,i,e), c(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep
|
||||||
crystallite_orientation, g,i,e)
|
crystallite_subFrac, crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -1644,9 +1865,9 @@ relTemperatureResiduum = 0.0_pReal
|
||||||
mySizeDotState = constitutive_sizeDotState(g,i,e)
|
mySizeDotState = constitutive_sizeDotState(g,i,e)
|
||||||
forall (s = 1_pInt:mySizeDotState, abs(constitutive_state(g,i,e)%p(s)) > 0.0_pReal) &
|
forall (s = 1_pInt:mySizeDotState, abs(constitutive_state(g,i,e)%p(s)) > 0.0_pReal) &
|
||||||
relStateResiduum(s,g,i,e) = stateResiduum(s,g,i,e) / constitutive_state(g,i,e)%p(s)
|
relStateResiduum(s,g,i,e) = stateResiduum(s,g,i,e) / constitutive_state(g,i,e)%p(s)
|
||||||
if (crystallite_Temperature(g,i,e) > 0) &
|
if (crystallite_Temperature(g,i,e) > 0) then
|
||||||
relTemperatureResiduum(g,i,e) = temperatureResiduum(g,i,e) / crystallite_Temperature(g,i,e)
|
relTemperatureResiduum(g,i,e) = temperatureResiduum(g,i,e) / crystallite_Temperature(g,i,e)
|
||||||
|
endif
|
||||||
!$OMP FLUSH(relStateResiduum,relTemperatureResiduum)
|
!$OMP FLUSH(relStateResiduum,relTemperatureResiduum)
|
||||||
|
|
||||||
crystallite_todo(g,i,e) = &
|
crystallite_todo(g,i,e) = &
|
||||||
|
@ -1848,7 +2069,8 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_orientation, g,i,e)
|
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_subFrac, &
|
||||||
|
crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -1942,7 +2164,8 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_orientation, g,i,e)
|
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_subFrac, &
|
||||||
|
crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -1988,8 +2211,9 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
|
|
||||||
forall (s = 1_pInt:mySizeDotState, abs(constitutive_state(g,i,e)%p(s)) > 0.0_pReal) &
|
forall (s = 1_pInt:mySizeDotState, abs(constitutive_state(g,i,e)%p(s)) > 0.0_pReal) &
|
||||||
relStateResiduum(s,g,i,e) = stateResiduum(s,g,i,e) / constitutive_state(g,i,e)%p(s)
|
relStateResiduum(s,g,i,e) = stateResiduum(s,g,i,e) / constitutive_state(g,i,e)%p(s)
|
||||||
if (crystallite_Temperature(g,i,e) > 0_pInt) &
|
if (crystallite_Temperature(g,i,e) > 0_pInt) then
|
||||||
relTemperatureResiduum(g,i,e) = temperatureResiduum(g,i,e) / crystallite_Temperature(g,i,e)
|
relTemperatureResiduum(g,i,e) = temperatureResiduum(g,i,e) / crystallite_Temperature(g,i,e)
|
||||||
|
endif
|
||||||
!$OMP FLUSH(relStateResiduum,relTemperatureResiduum)
|
!$OMP FLUSH(relStateResiduum,relTemperatureResiduum)
|
||||||
|
|
||||||
#ifndef _OPENMP
|
#ifndef _OPENMP
|
||||||
|
@ -2076,7 +2300,8 @@ end subroutine crystallite_integrateStateAdaptiveEuler
|
||||||
subroutine crystallite_integrateStateEuler(gg,ii,ee)
|
subroutine crystallite_integrateStateEuler(gg,ii,ee)
|
||||||
|
|
||||||
!*** variables and functions from other modules ***!
|
!*** variables and functions from other modules ***!
|
||||||
use numerics, only: numerics_integrationMode
|
use numerics, only: numerics_integrationMode, &
|
||||||
|
numerics_timeSyncing
|
||||||
use debug, only: debug_level, &
|
use debug, only: debug_level, &
|
||||||
debug_crystallite, &
|
debug_crystallite, &
|
||||||
debug_levelBasic, &
|
debug_levelBasic, &
|
||||||
|
@ -2138,9 +2363,10 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
|
|
||||||
!$OMP DO
|
!$OMP DO
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_orientation, g,i,e)
|
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_subFrac, &
|
||||||
|
crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -2148,10 +2374,10 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
!$OMP ENDDO
|
!$OMP ENDDO
|
||||||
!$OMP DO
|
!$OMP DO
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
if ( any(constitutive_dotState(g,i,e)%p/=constitutive_dotState(g,i,e)%p) & ! NaN occured in dotState
|
if ( any(constitutive_dotState(g,i,e)%p/=constitutive_dotState(g,i,e)%p) & ! NaN occured in dotState
|
||||||
.or. crystallite_dotTemperature(g,i,e)/=crystallite_dotTemperature(g,i,e) ) then ! NaN occured in dotTemperature
|
.or. crystallite_dotTemperature(g,i,e)/=crystallite_dotTemperature(g,i,e) ) then ! NaN occured in dotTemperature
|
||||||
if (.not. crystallite_localPlasticity(g,i,e)) then ! if broken non-local...
|
if (.not. crystallite_localPlasticity(g,i,e) .and. .not. numerics_timeSyncing) then ! if broken non-local...
|
||||||
!$OMP CRITICAL (checkTodo)
|
!$OMP CRITICAL (checkTodo)
|
||||||
crystallite_todo = crystallite_todo .and. crystallite_localPlasticity ! ...all non-locals skipped
|
crystallite_todo = crystallite_todo .and. crystallite_localPlasticity ! ...all non-locals skipped
|
||||||
!$OMP END CRITICAL (checkTodo)
|
!$OMP END CRITICAL (checkTodo)
|
||||||
|
@ -2168,7 +2394,7 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
|
|
||||||
!$OMP DO PRIVATE(mySizeDotState)
|
!$OMP DO PRIVATE(mySizeDotState)
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
mySizeDotState = constitutive_sizeDotState(g,i,e)
|
mySizeDotState = constitutive_sizeDotState(g,i,e)
|
||||||
constitutive_state(g,i,e)%p(1:mySizeDotState) = constitutive_state(g,i,e)%p(1:mySizeDotState) &
|
constitutive_state(g,i,e)%p(1:mySizeDotState) = constitutive_state(g,i,e)%p(1:mySizeDotState) &
|
||||||
+ constitutive_dotState(g,i,e)%p(1:mySizeDotState) * crystallite_subdt(g,i,e)
|
+ constitutive_dotState(g,i,e)%p(1:mySizeDotState) * crystallite_subdt(g,i,e)
|
||||||
|
@ -2190,14 +2416,15 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
!$OMP ENDDO
|
!$OMP ENDDO
|
||||||
|
|
||||||
|
|
||||||
! --- STATE JUMP ---
|
|
||||||
|
|
||||||
|
! --- STATE JUMP ---
|
||||||
|
|
||||||
!$OMP DO
|
!$OMP DO
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
crystallite_todo(g,i,e) = crystallite_stateJump(g,i,e)
|
crystallite_todo(g,i,e) = crystallite_stateJump(g,i,e)
|
||||||
if (.not. crystallite_todo(g,i,e) .and. .not. crystallite_localPlasticity(g,i,e)) then ! if broken non-local...
|
if (.not. crystallite_todo(g,i,e) .and. .not. crystallite_localPlasticity(g,i,e) & ! if broken non-local...
|
||||||
|
.and. .not. numerics_timeSyncing) then
|
||||||
!$OMP CRITICAL (checkTodo)
|
!$OMP CRITICAL (checkTodo)
|
||||||
crystallite_todo = crystallite_todo .and. crystallite_localPlasticity ! ...all non-locals skipped
|
crystallite_todo = crystallite_todo .and. crystallite_localPlasticity ! ...all non-locals skipped
|
||||||
!$OMP END CRITICAL (checkTodo)
|
!$OMP END CRITICAL (checkTodo)
|
||||||
|
@ -2211,7 +2438,7 @@ if (numerics_integrationMode == 1_pInt) then
|
||||||
|
|
||||||
!$OMP DO
|
!$OMP DO
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
call constitutive_microstructure(crystallite_Temperature(g,i,e), crystallite_Fe(1:3,1:3,g,i,e), &
|
call constitutive_microstructure(crystallite_Temperature(g,i,e), crystallite_Fe(1:3,1:3,g,i,e), &
|
||||||
crystallite_Fp(1:3,1:3,g,i,e), g, i, e) ! update dependent state variables to be consistent with basic states
|
crystallite_Fp(1:3,1:3,g,i,e), g, i, e) ! update dependent state variables to be consistent with basic states
|
||||||
endif
|
endif
|
||||||
|
@ -2225,9 +2452,10 @@ endif
|
||||||
|
|
||||||
!$OMP DO
|
!$OMP DO
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
crystallite_todo(g,i,e) = crystallite_integrateStress(g,i,e)
|
crystallite_todo(g,i,e) = crystallite_integrateStress(g,i,e)
|
||||||
if (.not. crystallite_todo(g,i,e) .and. .not. crystallite_localPlasticity(g,i,e)) then ! if broken non-local...
|
if (.not. crystallite_todo(g,i,e) .and. .not. crystallite_localPlasticity(g,i,e) & ! if broken non-local...
|
||||||
|
.and. .not. numerics_timeSyncing) then
|
||||||
!$OMP CRITICAL (checkTodo)
|
!$OMP CRITICAL (checkTodo)
|
||||||
crystallite_todo = crystallite_todo .and. crystallite_localPlasticity ! ...all non-locals skipped
|
crystallite_todo = crystallite_todo .and. crystallite_localPlasticity ! ...all non-locals skipped
|
||||||
!$OMP END CRITICAL (checkTodo)
|
!$OMP END CRITICAL (checkTodo)
|
||||||
|
@ -2241,7 +2469,7 @@ endif
|
||||||
|
|
||||||
!$OMP DO
|
!$OMP DO
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
crystallite_converged(g,i,e) = .true. ! if still "to do" then converged per definitionem
|
crystallite_converged(g,i,e) = .true. ! if still "to do" then converged per definitionem
|
||||||
if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then
|
if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then
|
||||||
!$OMP CRITICAL (distributionState)
|
!$OMP CRITICAL (distributionState)
|
||||||
|
@ -2259,7 +2487,8 @@ endif
|
||||||
! --- CHECK NON-LOCAL CONVERGENCE ---
|
! --- CHECK NON-LOCAL CONVERGENCE ---
|
||||||
|
|
||||||
if (.not. singleRun) then ! if not requesting Integration of just a single IP
|
if (.not. singleRun) then ! if not requesting Integration of just a single IP
|
||||||
if (any(.not. crystallite_converged .and. .not. crystallite_localPlasticity)) then ! any non-local not yet converged (or broken)...
|
if (any(.not. crystallite_converged .and. .not. crystallite_localPlasticity) & ! any non-local not yet converged (or broken)...
|
||||||
|
.and. .not. numerics_timeSyncing) then
|
||||||
crystallite_converged = crystallite_converged .and. crystallite_localPlasticity ! ...restart all non-local as not converged
|
crystallite_converged = crystallite_converged .and. crystallite_localPlasticity ! ...restart all non-local as not converged
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -2365,7 +2594,8 @@ endif
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e)) then
|
if (crystallite_todo(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_orientation, g,i,e)
|
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_subFrac, &
|
||||||
|
crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
@ -2457,7 +2687,8 @@ do while (any(crystallite_todo .and. .not. crystallite_converged) .and. Niterati
|
||||||
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
do e = eIter(1),eIter(2); do i = iIter(1,e),iIter(2,e); do g = gIter(1,e),gIter(2,e) ! iterate over elements, ips and grains
|
||||||
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_orientation, g,i,e)
|
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), crystallite_subFrac, &
|
||||||
|
crystallite_orientation, g,i,e)
|
||||||
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
crystallite_dotTemperature(g,i,e) = constitutive_dotTemperature(crystallite_Tstar_v(1:6,g,i,e), &
|
||||||
crystallite_Temperature(g,i,e),g,i,e)
|
crystallite_Temperature(g,i,e),g,i,e)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -72,7 +72,8 @@ real(pReal), protected, public :: &
|
||||||
volDiscrMod_RGC = 1.0e+12_pReal, & !< stiffness of RGC volume discrepancy (zero = without volume discrepancy constraint)
|
volDiscrMod_RGC = 1.0e+12_pReal, & !< stiffness of RGC volume discrepancy (zero = without volume discrepancy constraint)
|
||||||
volDiscrPow_RGC = 5.0_pReal !< powerlaw penalty for volume discrepancy
|
volDiscrPow_RGC = 5.0_pReal !< powerlaw penalty for volume discrepancy
|
||||||
logical, protected, public :: &
|
logical, protected, public :: &
|
||||||
analyticJaco = .false. !< use analytic Jacobian or perturbation, Default .false.: calculate Jacobian using perturbations
|
analyticJaco = .false., & !< use analytic Jacobian or perturbation, Default .false.: calculate Jacobian using perturbations
|
||||||
|
numerics_timeSyncing = .false. !< flag indicating if time synchronization in crystallite is used for nonlocal plasticity
|
||||||
!* Random seeding parameters
|
!* Random seeding parameters
|
||||||
integer(pInt), protected, public :: &
|
integer(pInt), protected, public :: &
|
||||||
fixedSeed = 0_pInt !< fixed seeding for pseudo-random number generator, Default 0: use random seed
|
fixedSeed = 0_pInt !< fixed seeding for pseudo-random number generator, Default 0: use random seed
|
||||||
|
@ -222,6 +223,8 @@ subroutine numerics_init
|
||||||
numerics_integrator(2) = IO_intValue(line,positions,2_pInt)
|
numerics_integrator(2) = IO_intValue(line,positions,2_pInt)
|
||||||
case ('analyticjaco')
|
case ('analyticjaco')
|
||||||
analyticJaco = IO_intValue(line,positions,2_pInt) > 0_pInt
|
analyticJaco = IO_intValue(line,positions,2_pInt) > 0_pInt
|
||||||
|
case ('timesyncing')
|
||||||
|
numerics_timeSyncing = IO_intValue(line,positions,2_pInt) > 0_pInt
|
||||||
case ('unitlength')
|
case ('unitlength')
|
||||||
numerics_unitlength = IO_floatValue(line,positions,2_pInt)
|
numerics_unitlength = IO_floatValue(line,positions,2_pInt)
|
||||||
|
|
||||||
|
@ -337,6 +340,9 @@ subroutine numerics_init
|
||||||
write(6,'(a)') ' Initializing PETSc'
|
write(6,'(a)') ' Initializing PETSc'
|
||||||
CHKERRQ(ierr)
|
CHKERRQ(ierr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
numerics_timeSyncing = numerics_timeSyncing .and. all(numerics_integrator==2_pInt) ! timeSyncing only allowed for explicit Euler integrator
|
||||||
|
|
||||||
!* writing parameters to output file
|
!* writing parameters to output file
|
||||||
|
|
||||||
write(6,'(a24,1x,es8.1)') ' relevantStrain: ',relevantStrain
|
write(6,'(a24,1x,es8.1)') ' relevantStrain: ',relevantStrain
|
||||||
|
@ -356,6 +362,7 @@ subroutine numerics_init
|
||||||
write(6,'(a24,1x,es8.1)') ' rTol_crystalliteStress: ',rTol_crystalliteStress
|
write(6,'(a24,1x,es8.1)') ' rTol_crystalliteStress: ',rTol_crystalliteStress
|
||||||
write(6,'(a24,1x,es8.1)') ' aTol_crystalliteStress: ',aTol_crystalliteStress
|
write(6,'(a24,1x,es8.1)') ' aTol_crystalliteStress: ',aTol_crystalliteStress
|
||||||
write(6,'(a24,2(1x,i8))') ' integrator: ',numerics_integrator
|
write(6,'(a24,2(1x,i8))') ' integrator: ',numerics_integrator
|
||||||
|
write(6,'(a24,1x,L8)') ' timeSyncing: ',numerics_timeSyncing
|
||||||
write(6,'(a24,1x,L8)') ' analytic Jacobian: ',analyticJaco
|
write(6,'(a24,1x,L8)') ' analytic Jacobian: ',analyticJaco
|
||||||
write(6,'(a24,1x,es8.1,/)')' unitlength: ',numerics_unitlength
|
write(6,'(a24,1x,es8.1,/)')' unitlength: ',numerics_unitlength
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue