in preguess of FPintegrator: resetting of previous dotstates can be done in same loop as collectdotstate

polishing: indentation level and capitalization
This commit is contained in:
Christoph Kords 2013-11-21 10:58:41 +00:00
parent 0337b4f319
commit 883669bd77
1 changed files with 638 additions and 536 deletions

View File

@ -411,7 +411,7 @@ subroutine crystallite_init(temperature)
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
! debug output ! debug output
if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then
write(6,'(a35,1x,7(i8,1x))') 'crystallite_Temperature: ', shape(crystallite_temperature) write(6,'(a35,1x,7(i8,1x))') 'crystallite_temperature: ', shape(crystallite_temperature)
write(6,'(a35,1x,7(i8,1x))') 'crystallite_heat: ', shape(crystallite_heat) write(6,'(a35,1x,7(i8,1x))') 'crystallite_heat: ', shape(crystallite_heat)
write(6,'(a35,1x,7(i8,1x))') 'crystallite_Fe: ', shape(crystallite_Fe) write(6,'(a35,1x,7(i8,1x))') 'crystallite_Fe: ', shape(crystallite_Fe)
write(6,'(a35,1x,7(i8,1x))') 'crystallite_Fp: ', shape(crystallite_Fp) write(6,'(a35,1x,7(i8,1x))') 'crystallite_Fp: ', shape(crystallite_Fp)
@ -1047,6 +1047,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
! --+>> CHECK FOR NON-CONVERGED CRYSTALLITES <<+-- ! --+>> CHECK FOR NON-CONVERGED CRYSTALLITES <<+--
elementLooping5: do e = FEsolving_execElem(1),FEsolving_execElem(2) elementLooping5: do e = FEsolving_execElem(1),FEsolving_execElem(2)
myNgrains = homogenization_Ngrains(mesh_element(3,e)) 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 i = FEsolving_execIP(1,e),FEsolving_execIP(2,e) ! iterate over IPs of this element to be processed
@ -1084,6 +1085,9 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
computeJacobian: if(updateJaco) then computeJacobian: if(updateJaco) then
jacobianMethod: if (analyticJaco) then jacobianMethod: if (analyticJaco) then
! --- ANALYTIC JACOBIAN ---
!$OMP PARALLEL DO PRIVATE(dFedF,dSdF,dSdFe,myNgrains) !$OMP PARALLEL DO PRIVATE(dFedF,dSdF,dSdFe,myNgrains)
elementLooping6: do e = FEsolving_execElem(1),FEsolving_execElem(2) elementLooping6: do e = FEsolving_execElem(1),FEsolving_execElem(2)
myNgrains = homogenization_Ngrains(mesh_element(3,e)) myNgrains = homogenization_Ngrains(mesh_element(3,e))
@ -1103,9 +1107,16 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
enddo; enddo enddo; enddo
enddo elementLooping6 enddo elementLooping6
!$OMP END PARALLEL DO !$OMP END PARALLEL DO
else jacobianMethod else jacobianMethod
! --- STANDARD (PERTURBATION METHOD) FOR JACOBIAN ---
numerics_integrationMode = 2_pInt numerics_integrationMode = 2_pInt
! --- BACKUP --- ! --- BACKUP ---
elementLooping7: do e = FEsolving_execElem(1),FEsolving_execElem(2) elementLooping7: do e = FEsolving_execElem(1),FEsolving_execElem(2)
myNgrains = homogenization_Ngrains(mesh_element(3,e)) myNgrains = homogenization_Ngrains(mesh_element(3,e))
forall (i = FEsolving_execIP(1,e):FEsolving_execIP(2,e), g = 1:myNgrains) forall (i = FEsolving_execIP(1,e):FEsolving_execIP(2,e), g = 1:myNgrains)
@ -1124,8 +1135,8 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
P_backup = crystallite_P P_backup = crystallite_P
convergenceFlag_backup = crystallite_converged convergenceFlag_backup = crystallite_converged
! --- CALCULATE STATE AND STRESS FOR PERTURBATION --- ! --- CALCULATE STATE AND STRESS FOR PERTURBATION ---
dPdF_perturbation1 = crystallite_dPdF0 ! initialize stiffness with known good values from last increment dPdF_perturbation1 = crystallite_dPdF0 ! initialize stiffness with known good values from last increment
dPdF_perturbation2 = crystallite_dPdF0 ! initialize stiffness with known good values from last increment dPdF_perturbation2 = crystallite_dPdF0 ! initialize stiffness with known good values from last increment
do perturbation = 1,2 ! forward and backward perturbation do perturbation = 1,2 ! forward and backward perturbation
@ -1139,6 +1150,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
endif endif
! --- INITIALIZE UNPERTURBED STATE --- ! --- INITIALIZE UNPERTURBED STATE ---
select case(numerics_integrator(numerics_integrationMode)) select case(numerics_integrator(numerics_integrationMode))
case(1_pInt) ! Fix-point method: restore to last converged state at end of subinc, since this is probably closest to perturbed state case(1_pInt) ! Fix-point method: restore to last converged state at end of subinc, since this is probably closest to perturbed state
do e = FEsolving_execElem(1),FEsolving_execElem(2) do e = FEsolving_execElem(1),FEsolving_execElem(2)
@ -1172,7 +1184,6 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
crystallite_Tstar_v = crystallite_subTstar0_v crystallite_Tstar_v = crystallite_subTstar0_v
end select end select
! --- PERTURB EITHER FORWARD OR BACKWARD --- ! --- PERTURB EITHER FORWARD OR BACKWARD ---
crystallite_subF = F_backup crystallite_subF = F_backup
@ -1214,8 +1225,8 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
endif endif
enddo ! perturbation direction enddo ! perturbation direction
! --- STIFFNESS ACCORDING TO PERTURBATION METHOD AND CONVERGENCE --- ! --- STIFFNESS ACCORDING TO PERTURBATION METHOD AND CONVERGENCE ---
elementLooping9: do e = FEsolving_execElem(1),FEsolving_execElem(2) elementLooping9: do e = FEsolving_execElem(1),FEsolving_execElem(2)
myNgrains = homogenization_Ngrains(mesh_element(3,e)) myNgrains = homogenization_Ngrains(mesh_element(3,e))
select case(pert_method) select case(pert_method)
@ -1239,6 +1250,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
enddo elementLooping9 enddo elementLooping9
! --- RESTORE --- ! --- RESTORE ---
elementLooping10: do e = FEsolving_execElem(1),FEsolving_execElem(2) elementLooping10: do e = FEsolving_execElem(1),FEsolving_execElem(2)
myNgrains = homogenization_Ngrains(mesh_element(3,e)) myNgrains = homogenization_Ngrains(mesh_element(3,e))
forall (i = FEsolving_execIP(1,e):FEsolving_execIP(2,e), g = 1:myNgrains) forall (i = FEsolving_execIP(1,e):FEsolving_execIP(2,e), g = 1:myNgrains)
@ -1258,6 +1270,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco,rate_sensitivity)
crystallite_converged = convergenceFlag_backup crystallite_converged = convergenceFlag_backup
endif jacobianMethod endif jacobianMethod
rateSensitivity: if (rate_sensitivity) then rateSensitivity: if (rate_sensitivity) then
!$OMP PARALLEL DO PRIVATE(dFedFdot,dSdFdot,dSdFe,Fpinv_rate,FDot_inv,counter,dFp_invdFdot,myNgrains) !$OMP PARALLEL DO PRIVATE(dFedFdot,dSdFdot,dSdFe,Fpinv_rate,FDot_inv,counter,dFp_invdFdot,myNgrains)
elementLooping11: do e = FEsolving_execElem(1),FEsolving_execElem(2) elementLooping11: do e = FEsolving_execElem(1),FEsolving_execElem(2)
@ -1380,8 +1393,9 @@ subroutine crystallite_integrateStateRK4()
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
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_Temperature(i,e), crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e) crystallite_Fp, crystallite_temperature(i,e), &
crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -1416,10 +1430,11 @@ subroutine crystallite_integrateStateRK4()
if (crystallite_todo(g,i,e)) then if (crystallite_todo(g,i,e)) then
mySizeDotState = constitutive_sizeDotState(g,i,e) mySizeDotState = constitutive_sizeDotState(g,i,e)
if (n < 4) then if (n < 4) then
constitutive_RK4dotState(g,i,e)%p = constitutive_RK4dotState(g,i,e)%p + weight(n)*constitutive_dotState(g,i,e)%p constitutive_RK4dotState(g,i,e)%p = constitutive_RK4dotState(g,i,e)%p &
+ weight(n)*constitutive_dotState(g,i,e)%p
elseif (n == 4) then elseif (n == 4) then
constitutive_dotState(g,i,e)%p = (constitutive_RK4dotState(g,i,e)%p + & constitutive_dotState(g,i,e)%p = (constitutive_RK4dotState(g,i,e)%p &
weight(n)*constitutive_dotState(g,i,e)%p) / 6.0_pReal ! use weighted RKdotState for final integration + weight(n)*constitutive_dotState(g,i,e)%p) / 6.0_pReal ! use weighted RKdotState for final integration
endif endif
endif endif
enddo; enddo; enddo enddo; enddo; enddo
@ -1429,7 +1444,8 @@ subroutine crystallite_integrateStateRK4()
if (crystallite_todo(g,i,e)) then if (crystallite_todo(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_subState0(g,i,e)%p(1:mySizeDotState) & constitutive_state(g,i,e)%p(1:mySizeDotState) = constitutive_subState0(g,i,e)%p(1:mySizeDotState) &
+ constitutive_dotState(g,i,e)%p(1:mySizeDotState) * crystallite_subdt(g,i,e) * timeStepFraction(n) + constitutive_dotState(g,i,e)%p(1:mySizeDotState) &
* crystallite_subdt(g,i,e) * timeStepFraction(n)
if (n == 4) then ! final integration step if (n == 4) then ! final integration step
#ifndef _OPENMP #ifndef _OPENMP
if (iand(debug_level(debug_crystallite), debug_levelExtensive) /= 0_pInt & if (iand(debug_level(debug_crystallite), debug_levelExtensive) /= 0_pInt &
@ -1470,7 +1486,7 @@ subroutine crystallite_integrateStateRK4()
!$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)) then
call constitutive_microstructure(crystallite_Temperature(i,e), crystallite_Fe(1:3,1:3,g,i,e), & call constitutive_microstructure(crystallite_temperature(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
enddo; enddo; enddo enddo; enddo; enddo
@ -1501,8 +1517,9 @@ subroutine crystallite_integrateStateRK4()
!$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)) 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_Temperature(i,e), timeStepFraction(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep crystallite_Fp, crystallite_temperature(i,e), &
timeStepFraction(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep
crystallite_subFrac, g,i,e) crystallite_subFrac, g,i,e)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
@ -1560,7 +1577,8 @@ end subroutine crystallite_integrateStateRK4
!> adaptive step size (use 5th order solution to advance = "local extrapolation") !> adaptive step size (use 5th order solution to advance = "local extrapolation")
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine crystallite_integrateStateRKCK45() subroutine crystallite_integrateStateRKCK45()
use debug, only: debug_level, & use debug, only: &
debug_level, &
debug_crystallite, & debug_crystallite, &
debug_levelBasic, & debug_levelBasic, &
debug_levelExtensive, & debug_levelExtensive, &
@ -1569,16 +1587,21 @@ subroutine crystallite_integrateStateRKCK45()
debug_i, & debug_i, &
debug_g, & debug_g, &
debug_StateLoopDistribution debug_StateLoopDistribution
use numerics, only: rTol_crystalliteState, & use numerics, only: &
rTol_crystalliteState, &
numerics_integrationMode numerics_integrationMode
use FEsolving, only: FEsolving_execElem, & 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
use material, only: homogenization_Ngrains, & use material, only: &
homogenization_Ngrains, &
homogenization_maxNgrains homogenization_maxNgrains
use constitutive, only: constitutive_sizeDotState, & use constitutive, only: &
constitutive_sizeDotState, &
constitutive_maxSizeDotState, & constitutive_maxSizeDotState, &
constitutive_state, & constitutive_state, &
constitutive_aTolState, & constitutive_aTolState, &
@ -1591,17 +1614,9 @@ subroutine crystallite_integrateStateRKCK45()
constitutive_microstructure constitutive_microstructure
implicit none implicit none
integer(pInt) :: &
e, & ! element index in element loop real(pReal), dimension(5,5), parameter :: &
i, & ! integration point index in ip loop A = reshape([&
g, & ! grain index in grain loop
n, & ! stage index in integration stage loop
mySizeDotState, & ! size of dot State
s ! state index
integer(pInt), dimension(2) :: eIter ! bounds for element iteration
integer(pInt), dimension(2,mesh_NcpElems) :: iIter, & ! bounds for ip iteration
gIter ! bounds for grain iteration
real(pReal), dimension(5,5), parameter :: A = reshape([&
.2_pReal, .075_pReal, .3_pReal, -11.0_pReal/54.0_pReal, 1631.0_pReal/55296.0_pReal, & .2_pReal, .075_pReal, .3_pReal, -11.0_pReal/54.0_pReal, 1631.0_pReal/55296.0_pReal, &
.0_pReal, .225_pReal, -.9_pReal, 2.5_pReal, 175.0_pReal/512.0_pReal, & .0_pReal, .225_pReal, -.9_pReal, 2.5_pReal, 175.0_pReal/512.0_pReal, &
.0_pReal, .0_pReal, 1.2_pReal, -70.0_pReal/27.0_pReal, 575.0_pReal/13824.0_pReal, & .0_pReal, .0_pReal, 1.2_pReal, -70.0_pReal/27.0_pReal, 575.0_pReal/13824.0_pReal, &
@ -1609,20 +1624,34 @@ subroutine crystallite_integrateStateRKCK45()
.0_pReal, .0_pReal, .0_pReal, .0_pReal, 253.0_pReal/4096.0_pReal], & .0_pReal, .0_pReal, .0_pReal, .0_pReal, 253.0_pReal/4096.0_pReal], &
[5,5], order=[2,1]) !< coefficients in Butcher tableau (used for preliminary integration in stages 2 to 6) [5,5], order=[2,1]) !< coefficients in Butcher tableau (used for preliminary integration in stages 2 to 6)
real(pReal), dimension(6), parameter :: B = & real(pReal), dimension(6), parameter :: &
B = &
[37.0_pReal/378.0_pReal, .0_pReal, 250.0_pReal/621.0_pReal, & [37.0_pReal/378.0_pReal, .0_pReal, 250.0_pReal/621.0_pReal, &
125.0_pReal/594.0_pReal, .0_pReal, 512.0_pReal/1771.0_pReal], & !< coefficients in Butcher tableau (used for final integration and error estimate) 125.0_pReal/594.0_pReal, .0_pReal, 512.0_pReal/1771.0_pReal], & !< coefficients in Butcher tableau (used for final integration and error estimate)
DB = B - & DB = B - &
[2825.0_pReal/27648.0_pReal, .0_pReal, 18575.0_pReal/48384.0_pReal,& [2825.0_pReal/27648.0_pReal, .0_pReal, 18575.0_pReal/48384.0_pReal,&
13525.0_pReal/55296.0_pReal,277.0_pReal/14336.0_pReal, 0.25_pReal] !< coefficients in Butcher tableau (used for final integration and error estimate) 13525.0_pReal/55296.0_pReal, 277.0_pReal/14336.0_pReal, 0.25_pReal] !< coefficients in Butcher tableau (used for final integration and error estimate)
real(pReal), dimension(5), parameter :: &
C = [0.2_pReal, 0.3_pReal, 0.6_pReal, 1.0_pReal, 0.875_pReal] !< coefficients in Butcher tableau (fractions of original time step in stages 2 to 6)
real(pReal), dimension(5), parameter :: C = & integer(pInt) :: &
[0.2_pReal, 0.3_pReal, 0.6_pReal, 1.0_pReal, 0.875_pReal] !< coefficients in Butcher tableau (fractions of original time step in stages 2 to 6) e, & ! element index in element loop
i, & ! integration point index in ip loop
g, & ! grain index in grain loop
n, & ! stage index in integration stage loop
mySizeDotState, & ! size of dot State
s ! state index
integer(pInt), dimension(2) :: &
eIter ! bounds for element iteration
integer(pInt), dimension(2,mesh_NcpElems) :: &
iIter, & ! bounds for ip iteration
gIter ! bounds for grain iteration
real(pReal), dimension(constitutive_maxSizeDotState,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: & real(pReal), dimension(constitutive_maxSizeDotState,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: &
stateResiduum, & ! residuum from evolution in micrstructure stateResiduum, & ! residuum from evolution in micrstructure
relStateResiduum ! relative residuum from evolution in microstructure relStateResiduum ! relative residuum from evolution in microstructure
logical :: singleRun ! flag indicating computation for single (g,i,e) triple logical :: &
singleRun ! flag indicating computation for single (g,i,e) triple
! --- LOOP ITERATOR FOR ELEMENT, GRAIN, IP --- ! --- LOOP ITERATOR FOR ELEMENT, GRAIN, IP ---
eIter = FEsolving_execElem(1:2) eIter = FEsolving_execElem(1:2)
@ -1646,8 +1675,9 @@ subroutine crystallite_integrateStateRKCK45()
!$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)) 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_Temperature(i,e), crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e) crystallite_Fp, crystallite_temperature(i,e), &
crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -1689,25 +1719,25 @@ subroutine crystallite_integrateStateRKCK45()
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
if (n == 1) then ! NEED TO DO THE ADDITION IN THIS LENGTHY WAY BECAUSE OF PARALLELIZATION (CAN'T USE A REDUCTION CLAUSE ON A POINTER OR USER DEFINED TYPE) if (n == 1) then ! NEED TO DO THE ADDITION IN THIS LENGTHY WAY BECAUSE OF PARALLELIZATION (CAN'T USE A REDUCTION CLAUSE ON A POINTER OR USER DEFINED TYPE)
constitutive_dotState(g,i,e)%p = a(1,1) * constitutive_RKCK45dotState(1,g,i,e)%p constitutive_dotState(g,i,e)%p = A(1,1) * constitutive_RKCK45dotState(1,g,i,e)%p
elseif (n == 2) then elseif (n == 2) then
constitutive_dotState(g,i,e)%p = a(1,2) * constitutive_RKCK45dotState(1,g,i,e)%p & constitutive_dotState(g,i,e)%p = A(1,2) * constitutive_RKCK45dotState(1,g,i,e)%p &
+ a(2,2) * constitutive_RKCK45dotState(2,g,i,e)%p + A(2,2) * constitutive_RKCK45dotState(2,g,i,e)%p
elseif (n == 3) then elseif (n == 3) then
constitutive_dotState(g,i,e)%p = a(1,3) * constitutive_RKCK45dotState(1,g,i,e)%p & constitutive_dotState(g,i,e)%p = A(1,3) * constitutive_RKCK45dotState(1,g,i,e)%p &
+ a(2,3) * constitutive_RKCK45dotState(2,g,i,e)%p & + A(2,3) * constitutive_RKCK45dotState(2,g,i,e)%p &
+ a(3,3) * constitutive_RKCK45dotState(3,g,i,e)%p + A(3,3) * constitutive_RKCK45dotState(3,g,i,e)%p
elseif (n == 4) then elseif (n == 4) then
constitutive_dotState(g,i,e)%p = a(1,4) * constitutive_RKCK45dotState(1,g,i,e)%p & constitutive_dotState(g,i,e)%p = A(1,4) * constitutive_RKCK45dotState(1,g,i,e)%p &
+ a(2,4) * constitutive_RKCK45dotState(2,g,i,e)%p & + A(2,4) * constitutive_RKCK45dotState(2,g,i,e)%p &
+ a(3,4) * constitutive_RKCK45dotState(3,g,i,e)%p & + A(3,4) * constitutive_RKCK45dotState(3,g,i,e)%p &
+ a(4,4) * constitutive_RKCK45dotState(4,g,i,e)%p + A(4,4) * constitutive_RKCK45dotState(4,g,i,e)%p
elseif (n == 5) then elseif (n == 5) then
constitutive_dotState(g,i,e)%p = a(1,5) * constitutive_RKCK45dotState(1,g,i,e)%p & constitutive_dotState(g,i,e)%p = A(1,5) * constitutive_RKCK45dotState(1,g,i,e)%p &
+ a(2,5) * constitutive_RKCK45dotState(2,g,i,e)%p & + A(2,5) * constitutive_RKCK45dotState(2,g,i,e)%p &
+ a(3,5) * constitutive_RKCK45dotState(3,g,i,e)%p & + A(3,5) * constitutive_RKCK45dotState(3,g,i,e)%p &
+ a(4,5) * constitutive_RKCK45dotState(4,g,i,e)%p & + A(4,5) * constitutive_RKCK45dotState(4,g,i,e)%p &
+ a(5,5) * constitutive_RKCK45dotState(5,g,i,e)%p + A(5,5) * constitutive_RKCK45dotState(5,g,i,e)%p
endif endif
endif endif
enddo; enddo; enddo enddo; enddo; enddo
@ -1717,7 +1747,8 @@ subroutine crystallite_integrateStateRKCK45()
if (crystallite_todo(g,i,e)) then if (crystallite_todo(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_subState0(g,i,e)%p(1:mySizeDotState) & constitutive_state(g,i,e)%p(1:mySizeDotState) = constitutive_subState0(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)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -1746,7 +1777,7 @@ subroutine crystallite_integrateStateRKCK45()
!$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)) then
call constitutive_microstructure(crystallite_Temperature(i,e), crystallite_Fe(1:3,1:3,g,i,e), & call constitutive_microstructure(crystallite_temperature(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
enddo; enddo; enddo enddo; enddo; enddo
@ -1780,8 +1811,9 @@ subroutine crystallite_integrateStateRKCK45()
!$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)) 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_Temperature(i,e), c(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep crystallite_Fp, crystallite_temperature(i,e), &
C(n)*crystallite_subdt(g,i,e), & ! fraction of original timestep
crystallite_subFrac, g,i,e) crystallite_subFrac, g,i,e)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
@ -1831,22 +1863,22 @@ subroutine crystallite_integrateStateRKCK45()
! CAN'T USE A REDUCTION CLAUSE ON A POINTER OR USER DEFINED TYPE ! CAN'T USE A REDUCTION CLAUSE ON A POINTER OR USER DEFINED TYPE
stateResiduum(1:mySizeDotState,g,i,e) = & stateResiduum(1:mySizeDotState,g,i,e) = &
( db(1) * constitutive_RKCK45dotState(1,g,i,e)%p(1:mySizeDotState) & ( DB(1) * constitutive_RKCK45dotState(1,g,i,e)%p(1:mySizeDotState) &
+ db(2) * constitutive_RKCK45dotState(2,g,i,e)%p(1:mySizeDotState) & + DB(2) * constitutive_RKCK45dotState(2,g,i,e)%p(1:mySizeDotState) &
+ db(3) * constitutive_RKCK45dotState(3,g,i,e)%p(1:mySizeDotState) & + DB(3) * constitutive_RKCK45dotState(3,g,i,e)%p(1:mySizeDotState) &
+ db(4) * constitutive_RKCK45dotState(4,g,i,e)%p(1:mySizeDotState) & + DB(4) * constitutive_RKCK45dotState(4,g,i,e)%p(1:mySizeDotState) &
+ db(5) * constitutive_RKCK45dotState(5,g,i,e)%p(1:mySizeDotState) & + DB(5) * constitutive_RKCK45dotState(5,g,i,e)%p(1:mySizeDotState) &
+ db(6) * constitutive_RKCK45dotState(6,g,i,e)%p(1:mySizeDotState)) & + DB(6) * constitutive_RKCK45dotState(6,g,i,e)%p(1:mySizeDotState)) &
* crystallite_subdt(g,i,e) * crystallite_subdt(g,i,e)
! --- dot state --- ! --- dot state ---
constitutive_dotState(g,i,e)%p = b(1) * constitutive_RKCK45dotState(1,g,i,e)%p & constitutive_dotState(g,i,e)%p = B(1) * constitutive_RKCK45dotState(1,g,i,e)%p &
+ b(2) * constitutive_RKCK45dotState(2,g,i,e)%p & + B(2) * constitutive_RKCK45dotState(2,g,i,e)%p &
+ b(3) * constitutive_RKCK45dotState(3,g,i,e)%p & + B(3) * constitutive_RKCK45dotState(3,g,i,e)%p &
+ b(4) * constitutive_RKCK45dotState(4,g,i,e)%p & + B(4) * constitutive_RKCK45dotState(4,g,i,e)%p &
+ b(5) * constitutive_RKCK45dotState(5,g,i,e)%p & + B(5) * constitutive_RKCK45dotState(5,g,i,e)%p &
+ b(6) * constitutive_RKCK45dotState(6,g,i,e)%p + B(6) * constitutive_RKCK45dotState(6,g,i,e)%p
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -1858,7 +1890,8 @@ subroutine crystallite_integrateStateRKCK45()
if (crystallite_todo(g,i,e)) then if (crystallite_todo(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_subState0(g,i,e)%p(1:mySizeDotState) & constitutive_state(g,i,e)%p(1:mySizeDotState) = constitutive_subState0(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)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -1872,7 +1905,6 @@ subroutine crystallite_integrateStateRKCK45()
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)
!$OMP FLUSH(relStateResiduum) !$OMP FLUSH(relStateResiduum)
crystallite_todo(g,i,e) = & crystallite_todo(g,i,e) = &
( all( abs(relStateResiduum(:,g,i,e)) < rTol_crystalliteState & ( all( abs(relStateResiduum(:,g,i,e)) < rTol_crystalliteState &
.or. abs(stateResiduum(1:mySizeDotState,g,i,e)) < constitutive_aTolState(g,i,e)%p(1:mySizeDotState) )) .or. abs(stateResiduum(1:mySizeDotState,g,i,e)) < constitutive_aTolState(g,i,e)%p(1:mySizeDotState) ))
@ -1918,7 +1950,7 @@ subroutine crystallite_integrateStateRKCK45()
!$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)) then
call constitutive_microstructure(crystallite_Temperature(i,e), crystallite_Fe(1:3,1:3,g,i,e), & call constitutive_microstructure(crystallite_temperature(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
enddo; enddo; enddo enddo; enddo; enddo
@ -1981,7 +2013,8 @@ end subroutine crystallite_integrateStateRKCK45
!> @brief integrate stress, state with 1st order Euler method with adaptive step size !> @brief integrate stress, state with 1st order Euler method with adaptive step size
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine crystallite_integrateStateAdaptiveEuler() subroutine crystallite_integrateStateAdaptiveEuler()
use debug, only: debug_level, & use debug, only: &
debug_level, &
debug_crystallite, & debug_crystallite, &
debug_levelBasic, & debug_levelBasic, &
debug_levelExtensive, & debug_levelExtensive, &
@ -1990,16 +2023,21 @@ subroutine crystallite_integrateStateAdaptiveEuler()
debug_i, & debug_i, &
debug_g, & debug_g, &
debug_StateLoopDistribution debug_StateLoopDistribution
use numerics, only: rTol_crystalliteState, & use numerics, only: &
rTol_crystalliteState, &
numerics_integrationMode numerics_integrationMode
use FEsolving, only: FEsolving_execElem, & 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
use material, only: homogenization_Ngrains, & use material, only: &
homogenization_Ngrains, &
homogenization_maxNgrains homogenization_maxNgrains
use constitutive, only: constitutive_sizeDotState, & use constitutive, only: &
constitutive_sizeDotState, &
constitutive_maxSizeDotState, & constitutive_maxSizeDotState, &
constitutive_state, & constitutive_state, &
constitutive_aTolState, & constitutive_aTolState, &
@ -2009,19 +2047,23 @@ subroutine crystallite_integrateStateAdaptiveEuler()
constitutive_microstructure constitutive_microstructure
implicit none implicit none
!*** local variables ***!
integer(pInt) e, & ! element index in element loop integer(pInt) :: &
e, & ! element index in element loop
i, & ! integration point index in ip loop i, & ! integration point index in ip loop
g, & ! grain index in grain loop g, & ! grain index in grain loop
mySizeDotState, & ! size of dot State mySizeDotState, & ! size of dot State
s ! state index s ! state index
integer(pInt), dimension(2) :: eIter ! bounds for element iteration integer(pInt), dimension(2) :: &
integer(pInt), dimension(2,mesh_NcpElems) :: iIter, & ! bounds for ip iteration eIter ! bounds for element iteration
integer(pInt), dimension(2,mesh_NcpElems) :: &
iIter, & ! bounds for ip iteration
gIter ! bounds for grain iteration gIter ! bounds for grain iteration
real(pReal), dimension(constitutive_maxSizeDotState,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: & real(pReal), dimension(constitutive_maxSizeDotState,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: &
stateResiduum, & ! residuum from evolution in micrstructure stateResiduum, & ! residuum from evolution in micrstructure
relStateResiduum ! relative residuum from evolution in microstructure relStateResiduum ! relative residuum from evolution in microstructure
logical :: singleRun ! flag indicating computation for single (g,i,e) triple logical :: &
singleRun ! flag indicating computation for single (g,i,e) triple
! --- LOOP ITERATOR FOR ELEMENT, GRAIN, IP --- ! --- LOOP ITERATOR FOR ELEMENT, GRAIN, IP ---
@ -2045,8 +2087,9 @@ subroutine crystallite_integrateStateAdaptiveEuler()
!$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)) 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_Temperature(i,e), crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e) crystallite_Fp, crystallite_temperature(i,e), &
crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -2074,9 +2117,11 @@ subroutine crystallite_integrateStateAdaptiveEuler()
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
mySizeDotState = constitutive_sizeDotState(g,i,e) mySizeDotState = constitutive_sizeDotState(g,i,e)
stateResiduum(1:mySizeDotState,g,i,e) = - 0.5_pReal * constitutive_dotState(g,i,e)%p * crystallite_subdt(g,i,e) ! contribution to absolute residuum in state stateResiduum(1:mySizeDotState,g,i,e) = - 0.5_pReal * constitutive_dotState(g,i,e)%p &
* crystallite_subdt(g,i,e) ! contribution to absolute residuum in state
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)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -2105,7 +2150,7 @@ subroutine crystallite_integrateStateAdaptiveEuler()
!$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)) & if (crystallite_todo(g,i,e)) &
call constitutive_microstructure(crystallite_Temperature(i,e), crystallite_Fe(1:3,1:3,g,i,e), & call constitutive_microstructure(crystallite_temperature(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
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -2137,8 +2182,9 @@ subroutine crystallite_integrateStateAdaptiveEuler()
!$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)) & if (crystallite_todo(g,i,e)) &
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_Temperature(i,e), crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e) crystallite_Fp, crystallite_temperature(i,e), &
crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
!$OMP DO !$OMP DO
@ -2173,7 +2219,8 @@ subroutine crystallite_integrateStateAdaptiveEuler()
! --- contribution of heun step to absolute residui --- ! --- contribution of heun step to absolute residui ---
stateResiduum(1:mySizeDotState,g,i,e) = stateResiduum(1:mySizeDotState,g,i,e) & stateResiduum(1:mySizeDotState,g,i,e) = stateResiduum(1:mySizeDotState,g,i,e) &
+ 0.5_pReal * constitutive_dotState(g,i,e)%p * crystallite_subdt(g,i,e) ! contribution to absolute residuum in state + 0.5_pReal * constitutive_dotState(g,i,e)%p &
* crystallite_subdt(g,i,e) ! contribution to absolute residuum in state
!$OMP FLUSH(stateResiduum) !$OMP FLUSH(stateResiduum)
! --- relative residui --- ! --- relative residui ---
@ -2259,9 +2306,8 @@ end subroutine crystallite_integrateStateAdaptiveEuler
!> @brief integrate stress, and state with 1st order explicit Euler method !> @brief integrate stress, and state with 1st order explicit Euler method
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine crystallite_integrateStateEuler() subroutine crystallite_integrateStateEuler()
use numerics, only: numerics_integrationMode, & use debug, only: &
numerics_timeSyncing debug_level, &
use debug, only: debug_level, &
debug_crystallite, & debug_crystallite, &
debug_levelBasic, & debug_levelBasic, &
debug_levelExtensive, & debug_levelExtensive, &
@ -2270,12 +2316,19 @@ subroutine crystallite_integrateStateEuler()
debug_i, & debug_i, &
debug_g, & debug_g, &
debug_StateLoopDistribution debug_StateLoopDistribution
use FEsolving, only: FEsolving_execElem, & use numerics, only: &
numerics_integrationMode, &
numerics_timeSyncing
use FEsolving, only: &
FEsolving_execElem, &
FEsolving_execIP FEsolving_execIP
use mesh, only: mesh_element, & use mesh, only: &
mesh_element, &
mesh_NcpElems mesh_NcpElems
use material, only: homogenization_Ngrains use material, only: &
use constitutive, only: constitutive_sizeDotState, & homogenization_Ngrains
use constitutive, only: &
constitutive_sizeDotState, &
constitutive_state, & constitutive_state, &
constitutive_subState0, & constitutive_subState0, &
constitutive_dotState, & constitutive_dotState, &
@ -2283,15 +2336,20 @@ subroutine crystallite_integrateStateEuler()
constitutive_microstructure constitutive_microstructure
implicit none implicit none
!*** local variables ***!
integer(pInt) e, & ! element index in element loop integer(pInt) :: &
e, & ! element index in element loop
i, & ! integration point index in ip loop i, & ! integration point index in ip loop
g, & ! grain index in grain loop g, & ! grain index in grain loop
mySizeDotState mySizeDotState ! size of dot State
integer(pInt), dimension(2) :: eIter ! bounds for element iteration integer(pInt), dimension(2) :: &
integer(pInt), dimension(2,mesh_NcpElems) :: iIter, & ! bounds for ip iteration eIter ! bounds for element iteration
integer(pInt), dimension(2,mesh_NcpElems) :: &
iIter, & ! bounds for ip iteration
gIter ! bounds for grain iteration gIter ! bounds for grain iteration
logical singleRun ! flag indicating computation for single (g,i,e) triple logical :: &
singleRun ! flag indicating computation for single (g,i,e) triple
eIter = FEsolving_execElem(1:2) eIter = FEsolving_execElem(1:2)
do e = eIter(1),eIter(2) do e = eIter(1),eIter(2)
@ -2311,8 +2369,9 @@ eIter = FEsolving_execElem(1:2)
!$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) .and. .not. crystallite_converged(g,i,e)) & if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) &
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_Temperature(i,e), crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e) crystallite_Fp, crystallite_temperature(i,e), &
crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
!$OMP DO !$OMP DO
@ -2340,7 +2399,8 @@ eIter = FEsolving_execElem(1:2)
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
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)
#ifndef _OPENMP #ifndef _OPENMP
if (iand(debug_level(debug_crystallite), debug_levelExtensive) /= 0_pInt & if (iand(debug_level(debug_crystallite), debug_levelExtensive) /= 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) &
@ -2379,7 +2439,7 @@ eIter = FEsolving_execElem(1:2)
!$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) .and. .not. crystallite_converged(g,i,e)) & if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) &
call constitutive_microstructure(crystallite_Temperature(i,e), crystallite_Fe(1:3,1:3,g,i,e), & call constitutive_microstructure(crystallite_temperature(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
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -2441,7 +2501,8 @@ end subroutine crystallite_integrateStateEuler
!> using Fixed Point Iteration to adapt the stepsize !> using Fixed Point Iteration to adapt the stepsize
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine crystallite_integrateStateFPI() subroutine crystallite_integrateStateFPI()
use debug, only: debug_e, & use debug, only: &
debug_e, &
debug_i, & debug_i, &
debug_g, & debug_g, &
debug_level,& debug_level,&
@ -2450,15 +2511,20 @@ subroutine crystallite_integrateStateFPI()
debug_levelExtensive, & debug_levelExtensive, &
debug_levelSelective, & debug_levelSelective, &
debug_StateLoopDistribution debug_StateLoopDistribution
use numerics, only: nState, & use numerics, only: &
nState, &
numerics_integrationMode, & numerics_integrationMode, &
rTol_crystalliteState rTol_crystalliteState
use FEsolving, only: FEsolving_execElem, & use FEsolving, only: &
FEsolving_execElem, &
FEsolving_execIP FEsolving_execIP
use mesh, only: mesh_element, & use mesh, only: &
mesh_element, &
mesh_NcpElems mesh_NcpElems
use material, only: homogenization_Ngrains use material, only: &
use constitutive, only: constitutive_subState0, & homogenization_Ngrains
use constitutive, only: &
constitutive_subState0, &
constitutive_state, & constitutive_state, &
constitutive_sizeDotState, & constitutive_sizeDotState, &
constitutive_maxSizeDotState, & constitutive_maxSizeDotState, &
@ -2477,16 +2543,20 @@ subroutine crystallite_integrateStateFPI()
i, & !< integration point index in ip loop i, & !< integration point index in ip loop
g, & !< grain index in grain loop g, & !< grain index in grain loop
mySizeDotState mySizeDotState
integer(pInt), dimension(2) :: eIter ! bounds for element iteration integer(pInt), dimension(2) :: &
integer(pInt), dimension(2,mesh_NcpElems) :: iIter, & ! bounds for ip iteration eIter ! bounds for element iteration
integer(pInt), dimension(2,mesh_NcpElems) :: &
iIter, & ! bounds for ip iteration
gIter ! bounds for grain iteration gIter ! bounds for grain iteration
real(pReal) dot_prod12, & real(pReal) :: &
dot_prod12, &
dot_prod22, & dot_prod22, &
stateDamper ! damper for integration of state stateDamper ! damper for integration of state
real(pReal), dimension(constitutive_maxSizeDotState) :: & real(pReal), dimension(constitutive_maxSizeDotState) :: &
stateResiduum, & stateResiduum, &
tempState tempState
logical :: singleRun ! flag indicating computation for single (g,i,e) triple logical :: &
singleRun ! flag indicating computation for single (g,i,e) triple
eIter = FEsolving_execElem(1:2) eIter = FEsolving_execElem(1:2)
do e = eIter(1),eIter(2) do e = eIter(1),eIter(2)
@ -2499,23 +2569,19 @@ subroutine crystallite_integrateStateFPI()
! --+>> PREGUESS FOR STATE <<+-- ! --+>> PREGUESS FOR STATE <<+--
! --- DOT STATES ---
!$OMP PARALLEL !$OMP PARALLEL
!$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
constitutive_previousDotState(g,i,e)%p = 0.0_pReal constitutive_previousDotState(g,i,e)%p = 0.0_pReal
constitutive_previousDotState2(g,i,e)%p = 0.0_pReal constitutive_previousDotState2(g,i,e)%p = 0.0_pReal
enddo; enddo; enddo if (crystallite_todo(g,i,e)) then
!$OMP ENDDO call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, &
crystallite_Fp, crystallite_temperature(i,e), &
crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
! --- DOT STATES --- endif
!$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
if (crystallite_todo(g,i,e)) & ! ToDo: Put in loop above?
call constitutive_collectDotState(crystallite_Tstar_v(1:6,g,i,e), crystallite_Fe, crystallite_Fp, &
crystallite_Temperature(i,e), crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
!$OMP DO !$OMP DO
@ -2525,7 +2591,7 @@ subroutine crystallite_integrateStateFPI()
if ( any(constitutive_dotState(g,i,e)%p/=constitutive_dotState(g,i,e)%p) ) then ! NaN occured in dotState if ( any(constitutive_dotState(g,i,e)%p/=constitutive_dotState(g,i,e)%p) ) then ! NaN occured in dotState
if (.not. crystallite_localPlasticity(g,i,e)) then ! if broken is a non-local... if (.not. crystallite_localPlasticity(g,i,e)) then ! if broken is a non-local...
!$OMP CRITICAL (checkTodo) !$OMP CRITICAL (checkTodo)
crystallite_todo = crystallite_todo .and. crystallite_localPlasticity !< @ToDo: no (g,i,e) index here? ...all non-locals done (and broken) crystallite_todo = crystallite_todo .and. crystallite_localPlasticity ! ...all non-locals done (and broken)
!$OMP END CRITICAL (checkTodo) !$OMP END CRITICAL (checkTodo)
else ! broken one was local... else ! broken one was local...
crystallite_todo(g,i,e) = .false. ! ... done (and broken) crystallite_todo(g,i,e) = .false. ! ... done (and broken)
@ -2543,7 +2609,8 @@ subroutine crystallite_integrateStateFPI()
if (crystallite_todo(g,i,e)) then if (crystallite_todo(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_subState0(g,i,e)%p(1:mySizeDotState) & constitutive_state(g,i,e)%p(1:mySizeDotState) = constitutive_subState0(g,i,e)%p(1:mySizeDotState) &
+ constitutive_dotState(g,i,e)%p * crystallite_subdt(g,i,e) + constitutive_dotState(g,i,e)%p &
* crystallite_subdt(g,i,e)
endif endif
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
@ -2565,7 +2632,7 @@ subroutine crystallite_integrateStateFPI()
!$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) .and. .not. crystallite_converged(g,i,e)) & if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) &
call constitutive_microstructure(crystallite_Temperature(i,e), crystallite_Fe(1:3,1:3,g,i,e), & call constitutive_microstructure(crystallite_temperature(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
constitutive_previousDotState2(g,i,e)%p = constitutive_previousDotState(g,i,e)%p ! remember previous dotState constitutive_previousDotState2(g,i,e)%p = constitutive_previousDotState(g,i,e)%p ! remember previous dotState
constitutive_previousDotState(g,i,e)%p = constitutive_dotState(g,i,e)%p ! remember current dotState constitutive_previousDotState(g,i,e)%p = constitutive_dotState(g,i,e)%p ! remember current dotState
@ -2604,8 +2671,9 @@ subroutine crystallite_integrateStateFPI()
!$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) .and. .not. crystallite_converged(g,i,e)) & if (crystallite_todo(g,i,e) .and. .not. crystallite_converged(g,i,e)) &
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_Temperature(i,e), crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e) crystallite_Fp, crystallite_temperature(i,e), &
crystallite_subdt(g,i,e), crystallite_subFrac, g,i,e)
enddo; enddo; enddo enddo; enddo; enddo
!$OMP ENDDO !$OMP ENDDO
!$OMP DO !$OMP DO
@ -2651,10 +2719,12 @@ subroutine crystallite_integrateStateFPI()
stateResiduum(1:mySizeDotState) = constitutive_state(g,i,e)%p(1:mySizeDotState) & stateResiduum(1:mySizeDotState) = constitutive_state(g,i,e)%p(1:mySizeDotState) &
- constitutive_subState0(g,i,e)%p(1:mySizeDotState) & - constitutive_subState0(g,i,e)%p(1:mySizeDotState) &
- (constitutive_dotState(g,i,e)%p * statedamper & - (constitutive_dotState(g,i,e)%p * statedamper &
+ constitutive_previousDotState(g,i,e)%p * (1.0_pReal - statedamper)) * crystallite_subdt(g,i,e) + constitutive_previousDotState(g,i,e)%p &
* (1.0_pReal - statedamper)) * crystallite_subdt(g,i,e)
! --- correct state with residuum --- ! --- correct state with residuum ---
tempState(1:mySizeDotState) = constitutive_state(g,i,e)%p(1:mySizeDotState) - stateResiduum(1:mySizeDotState) ! need to copy to local variable, since we cant flush a pointer in openmp tempState(1:mySizeDotState) = constitutive_state(g,i,e)%p(1:mySizeDotState) &
- stateResiduum(1:mySizeDotState) ! need to copy to local variable, since we cant flush a pointer in openmp
#ifndef _OPENMP #ifndef _OPENMP
if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt & if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt &
@ -2670,7 +2740,8 @@ subroutine crystallite_integrateStateFPI()
! --- store corrected dotState --- (cannot do this before state update, because not sure how to flush pointers in openmp) ! --- store corrected dotState --- (cannot do this before state update, because not sure how to flush pointers in openmp)
constitutive_dotState(g,i,e)%p = constitutive_dotState(g,i,e)%p * statedamper & constitutive_dotState(g,i,e)%p = constitutive_dotState(g,i,e)%p * statedamper &
+ constitutive_previousDotState(g,i,e)%p * (1.0_pReal - statedamper) + constitutive_previousDotState(g,i,e)%p &
* (1.0_pReal - statedamper)
! --- converged ? --- ! --- converged ? ---
@ -2756,23 +2827,28 @@ logical function crystallite_stateJump(g,i,e)
debug_e, & debug_e, &
debug_i, & debug_i, &
debug_g debug_g
use FEsolving, only: FEsolving_execElem, & use FEsolving, only: &
FEsolving_execElem, &
FEsolving_execIP FEsolving_execIP
use mesh, only: mesh_element, & use mesh, only: &
mesh_element, &
mesh_NcpElems mesh_NcpElems
use material, only: homogenization_Ngrains use material, only: &
use constitutive, only: constitutive_sizeDotState, & homogenization_Ngrains
use constitutive, only: &
constitutive_sizeDotState, &
constitutive_state, & constitutive_state, &
constitutive_deltaState, & constitutive_deltaState, &
constitutive_collectDeltaState, & constitutive_collectDeltaState, &
constitutive_microstructure constitutive_microstructure
implicit none implicit none
integer(pInt), intent(in):: e, & ! element index integer(pInt), intent(in):: &
e, & ! element index
i, & ! integration point index i, & ! integration point index
g ! grain index g ! grain index
integer(pInt) :: &
integer(pInt) :: mySizeDotState mySizeDotState
crystallite_stateJump = .false. crystallite_stateJump = .false.
@ -2780,8 +2856,10 @@ logical function crystallite_stateJump(g,i,e)
call constitutive_collectDeltaState(crystallite_Tstar_v(1:6,g,i,e), g,i,e) call constitutive_collectDeltaState(crystallite_Tstar_v(1:6,g,i,e), g,i,e)
mySizeDotState = constitutive_sizeDotState(g,i,e) mySizeDotState = constitutive_sizeDotState(g,i,e)
if (any(constitutive_deltaState(g,i,e)%p(1:mySizeDotState) /= constitutive_deltaState(g,i,e)%p(1:mySizeDotState))) & if (any(constitutive_deltaState(g,i,e)%p(1:mySizeDotState) &
/= constitutive_deltaState(g,i,e)%p(1:mySizeDotState))) then
return return
endif
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_deltaState(g,i,e)%p(1:mySizeDotState) + constitutive_deltaState(g,i,e)%p(1:mySizeDotState)
@ -2923,7 +3001,8 @@ logical function crystallite_integrateStress(&
if (present(timeFraction)) then if (present(timeFraction)) then
dt = crystallite_subdt(g,i,e) * timeFraction dt = crystallite_subdt(g,i,e) * timeFraction
Fg_new = 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)) * timeFraction Fg_new = 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)) * timeFraction
else else
dt = crystallite_subdt(g,i,e) dt = crystallite_subdt(g,i,e)
Fg_new = crystallite_subF(1:3,1:3,g,i,e) Fg_new = crystallite_subF(1:3,1:3,g,i,e)
@ -2984,10 +3063,12 @@ logical function crystallite_integrateStress(&
!* calculate plastic velocity gradient and its tangent from constitutive law !* calculate plastic velocity gradient and its tangent from constitutive law
if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) & if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then
call system_clock(count=tick,count_rate=tickrate,count_max=maxticks) call system_clock(count=tick,count_rate=tickrate,count_max=maxticks)
endif
call constitutive_LpAndItsTangent(Lp_constitutive, dLp_dT_constitutive, Tstar_v, crystallite_Temperature(i,e), g, i, e) call constitutive_LpAndItsTangent(Lp_constitutive, dLp_dT_constitutive, Tstar_v, &
crystallite_temperature(i,e), g, i, e)
if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then
call system_clock(count=tock,count_rate=tickrate,count_max=maxticks) call system_clock(count=tock,count_rate=tickrate,count_max=maxticks)
@ -3089,9 +3170,9 @@ logical function crystallite_integrateStress(&
!* calculate new plastic and elastic deformation gradient !* calculate new plastic and elastic deformation gradient
invFp_new = math_mul33x33(invFp_current,B) invFp_new = math_mul33x33(invFp_current,B)
invFp_new = invFp_new/math_det33(invFp_new)**(1.0_pReal/3.0_pReal) ! regularize by det invFp_new = invFp_new / math_det33(invFp_new)**(1.0_pReal/3.0_pReal) ! regularize by det
call math_invert33(invFp_new,Fp_new,det,error) call math_invert33(invFp_new,Fp_new,det,error)
if (error .or. any(Fp_new/=Fp_new)) then if (error .or. any(Fp_new /= Fp_new)) then
#ifndef _OPENMP #ifndef _OPENMP
if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then if (iand(debug_level(debug_crystallite), debug_levelBasic) /= 0_pInt) then
write(6,'(a,i8,1x,i2,1x,i3,a,i3)') '<< CRYST >> integrateStress failed on invFp_new inversion at el ip g ',& write(6,'(a,i8,1x,i2,1x,i3,a,i3)') '<< CRYST >> integrateStress failed on invFp_new inversion at el ip g ',&
@ -3110,7 +3191,8 @@ logical function crystallite_integrateStress(&
!* add volumetric component to 2nd Piola-Kirchhoff stress and calculate 1st Piola-Kirchhoff stress !* add volumetric component to 2nd Piola-Kirchhoff stress and calculate 1st Piola-Kirchhoff stress
forall (n=1_pInt:3_pInt) Tstar_v(n) = Tstar_v(n) + p_hydro forall (n=1_pInt:3_pInt) Tstar_v(n) = Tstar_v(n) + p_hydro
crystallite_P(1:3,1:3,g,i,e) = math_mul33x33(Fe_new, math_mul33x33(math_Mandel6to33(Tstar_v), math_transpose33(invFp_new))) crystallite_P(1:3,1:3,g,i,e) = math_mul33x33(Fe_new, math_mul33x33(math_Mandel6to33(Tstar_v), &
math_transpose33(invFp_new)))
!* store local values in global variables !* store local values in global variables
@ -3152,27 +3234,34 @@ end function crystallite_integrateStress
!> @brief calculates orientations and disorientations (in case of single grain ips) !> @brief calculates orientations and disorientations (in case of single grain ips)
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine crystallite_orientations subroutine crystallite_orientations
use math, only: math_pDecomposition, & use math, only: &
math_pDecomposition, &
math_RtoQ, & math_RtoQ, &
math_qDisorientation, & math_qDisorientation, &
math_qConj math_qConj
use FEsolving, only: FEsolving_execElem, & use FEsolving, only: &
FEsolving_execElem, &
FEsolving_execIP FEsolving_execIP
use IO, only: IO_warning use IO, only: &
use material, only: material_phase, & IO_warning
use material, only: &
material_phase, &
homogenization_Ngrains, & homogenization_Ngrains, &
phase_localPlasticity, & phase_localPlasticity, &
phase_plasticityInstance phase_plasticityInstance
use mesh, only: mesh_element, & use mesh, only: &
mesh_element, &
mesh_ipNeighborhood, & mesh_ipNeighborhood, &
FE_NipNeighbors, & FE_NipNeighbors, &
FE_geomtype, & FE_geomtype, &
FE_celltype FE_celltype
use constitutive_nonlocal, only: constitutive_nonlocal_structure, & use constitutive_nonlocal, only: &
constitutive_nonlocal_structure, &
constitutive_nonlocal_updateCompatibility constitutive_nonlocal_updateCompatibility
implicit none implicit none
integer(pInt) e, & ! element index integer(pInt) &
e, & ! element index
i, & ! integration point index i, & ! integration point index
g, & ! grain index g, & ! grain index
n, & ! neighbor index n, & ! neighbor index
@ -3184,9 +3273,13 @@ subroutine crystallite_orientations
neighboringInstance, & neighboringInstance, &
myStructure, & ! lattice structure myStructure, & ! lattice structure
neighboringStructure neighboringStructure
real(pReal), dimension(3,3) :: U, R real(pReal), dimension(3,3) :: &
real(pReal), dimension(4) :: orientation U, &
logical error R
real(pReal), dimension(4) :: &
orientation
logical &
error
! --- CALCULATE ORIENTATION AND LATTICE ROTATION --- ! --- CALCULATE ORIENTATION AND LATTICE ROTATION ---
@ -3303,17 +3396,26 @@ function crystallite_postResults(ipc, ip, el)
constitutive_homogenizedC constitutive_homogenizedC
implicit none implicit none
integer(pInt), intent(in):: el, & !< element index integer(pInt), intent(in):: &
el, & !< element index
ip, & !< integration point index ip, & !< integration point index
ipc !< grain index ipc !< grain index
real(pReal), dimension(1+crystallite_sizePostResults(microstructure_crystallite(mesh_element(4,el)))+ & real(pReal), dimension(1+crystallite_sizePostResults(microstructure_crystallite(mesh_element(4,el)))+ &
1+constitutive_sizePostResults(ipc,ip,el)) :: crystallite_postResults 1+constitutive_sizePostResults(ipc,ip,el)) :: &
crystallite_postResults
real(pReal), dimension(3,3) :: Ee real(pReal), dimension(3,3) :: &
real(pReal), dimension(4) :: rotation Ee
real(pReal) :: detF real(pReal), dimension(4) :: &
integer(pInt) :: o,c,crystID,mySize,n rotation
real(pReal) :: &
detF
integer(pInt) :: &
o, &
c, &
crystID, &
mySize, &
n
crystID = microstructure_crystallite(mesh_element(4,el)) crystID = microstructure_crystallite(mesh_element(4,el))
@ -3334,8 +3436,8 @@ function crystallite_postResults(ipc, ip, el)
case ('volume') case ('volume')
mySize = 1_pInt mySize = 1_pInt
detF = math_det33(crystallite_partionedF(1:3,1:3,ipc,ip,el)) ! V_current = det(F) * V_reference detF = math_det33(crystallite_partionedF(1:3,1:3,ipc,ip,el)) ! V_current = det(F) * V_reference
crystallite_postResults(c+1) = detF * mesh_ipVolume(ip,el) / & crystallite_postResults(c+1) = detF * mesh_ipVolume(ip,el) &
homogenization_Ngrains(mesh_element(3,el)) ! grain volume (not fraction but absolute) / homogenization_Ngrains(mesh_element(3,el)) ! grain volume (not fraction but absolute)
case ('heat') case ('heat')
mySize = 1_pInt mySize = 1_pInt
crystallite_postResults(c+1) = crystallite_heat(ipc,ip,el) ! heat production crystallite_postResults(c+1) = crystallite_heat(ipc,ip,el) ! heat production
@ -3344,8 +3446,8 @@ function crystallite_postResults(ipc, ip, el)
crystallite_postResults(c+1:c+mySize) = crystallite_orientation(1:4,ipc,ip,el) ! grain orientation as quaternion crystallite_postResults(c+1:c+mySize) = crystallite_orientation(1:4,ipc,ip,el) ! grain orientation as quaternion
case ('eulerangles') case ('eulerangles')
mySize = 3_pInt mySize = 3_pInt
crystallite_postResults(c+1:c+mySize) = inDeg * & crystallite_postResults(c+1:c+mySize) = inDeg &
math_qToEuler(crystallite_orientation(1:4,ipc,ip,el)) ! grain orientation as Euler angles in degree * math_qToEuler(crystallite_orientation(1:4,ipc,ip,el)) ! grain orientation as Euler angles in degree
case ('grainrotation') case ('grainrotation')
mySize = 4_pInt mySize = 4_pInt
crystallite_postResults(c+1:c+mySize) = & crystallite_postResults(c+1:c+mySize) = &
@ -3423,7 +3525,7 @@ function crystallite_postResults(ipc, ip, el)
if (constitutive_sizePostResults(ipc,ip,el) > 0_pInt) & if (constitutive_sizePostResults(ipc,ip,el) > 0_pInt) &
crystallite_postResults(c+1:c+constitutive_sizePostResults(ipc,ip,el)) = & crystallite_postResults(c+1:c+constitutive_sizePostResults(ipc,ip,el)) = &
constitutive_postResults(crystallite_Tstar_v(1:6,ipc,ip,el), crystallite_Fe, & constitutive_postResults(crystallite_Tstar_v(1:6,ipc,ip,el), crystallite_Fe, &
crystallite_Temperature(ip,el), ipc, ip, el) crystallite_temperature(ip,el), ipc, ip, el)
c = c + constitutive_sizePostResults(ipc,ip,el) c = c + constitutive_sizePostResults(ipc,ip,el)
end function crystallite_postResults end function crystallite_postResults