1) added distribution of leapfrog breaks
2) lattice_symmetryType is now a function (former lookup array was buggy) 3) stricter check of state var values (>0!) and memory deallocation done
This commit is contained in:
parent
e562df35a9
commit
b259fbd9c6
|
@ -95,7 +95,7 @@ subroutine crystallite_init(Temperature)
|
||||||
mesh_maxNipNeighbors
|
mesh_maxNipNeighbors
|
||||||
use IO
|
use IO
|
||||||
use material
|
use material
|
||||||
use lattice, only: lattice_symmetryTypes
|
use lattice, only: lattice_symmetryType
|
||||||
use constitutive_phenopowerlaw, only: constitutive_phenopowerlaw_label, &
|
use constitutive_phenopowerlaw, only: constitutive_phenopowerlaw_label, &
|
||||||
constitutive_phenopowerlaw_structure
|
constitutive_phenopowerlaw_structure
|
||||||
use constitutive_titanmod, only: constitutive_titanmod_label, &
|
use constitutive_titanmod, only: constitutive_titanmod_label, &
|
||||||
|
@ -302,7 +302,7 @@ subroutine crystallite_init(Temperature)
|
||||||
myStructure = -1_pInt ! does this happen for j2 material?
|
myStructure = -1_pInt ! does this happen for j2 material?
|
||||||
end select
|
end select
|
||||||
if (myStructure>0_pInt) then
|
if (myStructure>0_pInt) then
|
||||||
crystallite_symmetryID(g,i,e)=lattice_symmetryTypes(myStructure) ! structure = 1(fcc) or 2(bcc) => 1; 3(hex)=>2
|
crystallite_symmetryID(g,i,e) = lattice_symmetryType(myStructure) ! structure = 1(fcc) or 2(bcc) => 1; 3+(hex)=>2
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
@ -1257,7 +1257,8 @@ endsubroutine
|
||||||
verboseDebugger, &
|
verboseDebugger, &
|
||||||
debug_cumLpCalls, &
|
debug_cumLpCalls, &
|
||||||
debug_cumLpTicks, &
|
debug_cumLpTicks, &
|
||||||
debug_StressLoopDistribution
|
debug_StressLoopDistribution, &
|
||||||
|
debug_LeapfrogBreakDistribution
|
||||||
use constitutive, only: constitutive_homogenizedC, &
|
use constitutive, only: constitutive_homogenizedC, &
|
||||||
constitutive_LpAndItsTangent
|
constitutive_LpAndItsTangent
|
||||||
use math, only: math_mul33x33, &
|
use math, only: math_mul33x33, &
|
||||||
|
@ -1421,9 +1422,11 @@ LpLoop: do
|
||||||
|
|
||||||
! NaN occured at regular speed?
|
! NaN occured at regular speed?
|
||||||
if (any(residuum/=residuum) .and. leapfrog == 1.0) then
|
if (any(residuum/=residuum) .and. leapfrog == 1.0) then
|
||||||
if (verboseDebugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,i3,x,i2,x,i5,x,a,x,i3)') '::: integrateStress encountered NaN at ',g,i,e,' ; iteration ', NiterationStress
|
write(6,'(a,i3,x,i2,x,i5,x,a,i3,x,a)') '::: integrateStress encountered NaN at ',g,i,e,&
|
||||||
|
'; iteration ', NiterationStress, &
|
||||||
|
'>> returning..!'
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -1437,8 +1440,8 @@ LpLoop: do
|
||||||
) then
|
) then
|
||||||
if (verboseDebugger) then
|
if (verboseDebugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,i3,x,i2,x,i5,x,a,x,i3)') '::: integrateStress encountered high-speed crash at ',g,i,e,' ; iteration ', &
|
write(6,'(a,i3,x,i2,x,i5,x,a,i3)') '::: integrateStress encountered high-speed crash at ',g,i,e,&
|
||||||
NiterationStress
|
'; iteration ', NiterationStress
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
maxleap = 0.5_pReal * leapfrog ! limit next acceleration
|
maxleap = 0.5_pReal * leapfrog ! limit next acceleration
|
||||||
|
@ -1449,6 +1452,8 @@ LpLoop: do
|
||||||
Lpguess = Lpguess_old
|
Lpguess = Lpguess_old
|
||||||
residuum = residuum_old
|
residuum = residuum_old
|
||||||
|
|
||||||
|
debug_LeapfrogBreakDistribution(NiterationStress,mode) = debug_LeapfrogBreakDistribution(NiterationStress,mode) + 1
|
||||||
|
|
||||||
! residuum got better
|
! residuum got better
|
||||||
else
|
else
|
||||||
! calculate Jacobian for correction term
|
! calculate Jacobian for correction term
|
||||||
|
@ -1465,8 +1470,8 @@ LpLoop: do
|
||||||
if (error) then
|
if (error) then
|
||||||
if (verboseDebugger .and. selectiveDebugger) then
|
if (verboseDebugger .and. selectiveDebugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,i3,x,i2,x,i5,x,a,x,i3)') '::: integrateStress failed on dR/dLp inversion at ',g,i,e, &
|
write(6,'(a,i3,x,i2,x,i5,x,a,i3)') '::: integrateStress failed on dR/dLp inversion at ',g,i,e, &
|
||||||
' ; iteration ', NiterationStress
|
'; iteration ', NiterationStress
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,'(a,/,9(9(e15.3,x)/))') 'dRdLp',dRdLp
|
write(6,'(a,/,9(9(e15.3,x)/))') 'dRdLp',dRdLp
|
||||||
write(6,'(a,/,9(9(e15.3,x)/))') 'dLpdT_constitutive',dLpdT_constitutive
|
write(6,'(a,/,9(9(e15.3,x)/))') 'dLpdT_constitutive',dLpdT_constitutive
|
||||||
|
@ -1476,10 +1481,10 @@ LpLoop: do
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
if (.false. .and. verboseDebugger .and. selectiveDebugger) then
|
if (verboseDebugger .and. selectiveDebugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,i3,x,i2,x,i5,x,a,x,i3)') '::: integrateStress did dR/dLp inversion at ',g,i,e, &
|
write(6,'(a,i3,x,i2,x,i5,x,a,i3)') '::: integrateStress did dR/dLp inversion at ',g,i,e, &
|
||||||
' ; iteration ', NiterationStress
|
'; iteration ', NiterationStress
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,'(a,/,9(9(e15.3,x)/))') 'dRdLp',dRdLp
|
write(6,'(a,/,9(9(e15.3,x)/))') 'dRdLp',dRdLp
|
||||||
write(6,'(a,/,9(9(e15.3,x)/))') 'dLpdT_constitutive',dLpdT_constitutive
|
write(6,'(a,/,9(9(e15.3,x)/))') 'dLpdT_constitutive',dLpdT_constitutive
|
||||||
|
@ -1499,7 +1504,6 @@ LpLoop: do
|
||||||
|
|
||||||
! leapfrog to updated Lp
|
! leapfrog to updated Lp
|
||||||
do k=1,3; do l=1,3; do m=1,3; do n=1,3
|
do k=1,3; do l=1,3; do m=1,3; do n=1,3
|
||||||
! forall (k=1:3,l=1:3,m=1:3,n=1:3) &
|
|
||||||
Lpguess(k,l) = Lpguess(k,l) - leapfrog*invdRdLp(3*(k-1)+l,3*(m-1)+n)*residuum(m,n)
|
Lpguess(k,l) = Lpguess(k,l) - leapfrog*invdRdLp(3*(k-1)+l,3*(m-1)+n)*residuum(m,n)
|
||||||
enddo; enddo; enddo; enddo
|
enddo; enddo; enddo; enddo
|
||||||
enddo LpLoop
|
enddo LpLoop
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
character(len=64), parameter :: debug_configFile = 'debug.config' ! name of configuration file
|
character(len=64), parameter :: debug_configFile = 'debug.config' ! name of configuration file
|
||||||
|
|
||||||
integer(pInt), dimension(:,:), allocatable :: debug_StressLoopDistribution
|
integer(pInt), dimension(:,:), allocatable :: debug_StressLoopDistribution
|
||||||
|
integer(pInt), dimension(:,:), allocatable :: debug_LeapfrogBreakDistribution
|
||||||
integer(pInt), dimension(:), allocatable :: debug_CrystalliteStateLoopDistribution
|
integer(pInt), dimension(:), allocatable :: debug_CrystalliteStateLoopDistribution
|
||||||
integer(pInt), dimension(:), allocatable :: debug_StiffnessStateLoopDistribution
|
integer(pInt), dimension(:), allocatable :: debug_StiffnessStateLoopDistribution
|
||||||
integer(pInt), dimension(:), allocatable :: debug_CrystalliteLoopDistribution
|
integer(pInt), dimension(:), allocatable :: debug_CrystalliteLoopDistribution
|
||||||
|
@ -22,8 +23,8 @@
|
||||||
integer(pInt) :: debug_e = 1_pInt
|
integer(pInt) :: debug_e = 1_pInt
|
||||||
integer(pInt) :: debug_i = 1_pInt
|
integer(pInt) :: debug_i = 1_pInt
|
||||||
integer(pInt) :: debug_g = 1_pInt
|
integer(pInt) :: debug_g = 1_pInt
|
||||||
logical :: selectiveDebugger = .false.
|
logical :: selectiveDebugger = .true.
|
||||||
logical :: verboseDebugger = .true.
|
logical :: verboseDebugger = .false.
|
||||||
logical :: debugger = .true.
|
logical :: debugger = .true.
|
||||||
logical :: distribution_init = .false.
|
logical :: distribution_init = .false.
|
||||||
|
|
||||||
|
@ -68,6 +69,7 @@ subroutine debug_init()
|
||||||
write(6,*)
|
write(6,*)
|
||||||
|
|
||||||
allocate(debug_StressLoopDistribution(nStress,2)) ; debug_StressLoopDistribution = 0_pInt
|
allocate(debug_StressLoopDistribution(nStress,2)) ; debug_StressLoopDistribution = 0_pInt
|
||||||
|
allocate(debug_LeapfrogBreakDistribution(nStress,2)) ; debug_LeapfrogBreakDistribution = 0_pInt
|
||||||
allocate(debug_CrystalliteStateLoopDistribution(nState)) ; debug_CrystalliteStateLoopDistribution = 0_pInt
|
allocate(debug_CrystalliteStateLoopDistribution(nState)) ; debug_CrystalliteStateLoopDistribution = 0_pInt
|
||||||
allocate(debug_StiffnessStateLoopDistribution(nState)) ; debug_StiffnessStateLoopDistribution = 0_pInt
|
allocate(debug_StiffnessStateLoopDistribution(nState)) ; debug_StiffnessStateLoopDistribution = 0_pInt
|
||||||
allocate(debug_CrystalliteLoopDistribution(nCryst+1)) ; debug_CrystalliteLoopDistribution = 0_pInt
|
allocate(debug_CrystalliteLoopDistribution(nCryst+1)) ; debug_CrystalliteLoopDistribution = 0_pInt
|
||||||
|
@ -120,6 +122,10 @@ subroutine debug_init()
|
||||||
write(6,'(a24,x,i8)') ' element: ',debug_e
|
write(6,'(a24,x,i8)') ' element: ',debug_e
|
||||||
write(6,'(a24,x,i8)') ' ip: ',debug_i
|
write(6,'(a24,x,i8)') ' ip: ',debug_i
|
||||||
write(6,'(a24,x,i8)') ' grain: ',debug_g
|
write(6,'(a24,x,i8)') ' grain: ',debug_g
|
||||||
|
else
|
||||||
|
debug_e = 0_pInt ! switch off selective debugging
|
||||||
|
debug_i = 0_pInt
|
||||||
|
debug_g = 0_pInt
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,6 +140,7 @@ subroutine debug_reset()
|
||||||
implicit none
|
implicit none
|
||||||
|
|
||||||
debug_StressLoopDistribution = 0_pInt ! initialize debugging data
|
debug_StressLoopDistribution = 0_pInt ! initialize debugging data
|
||||||
|
debug_LeapfrogBreakDistribution = 0_pInt
|
||||||
debug_CrystalliteStateLoopDistribution = 0_pInt
|
debug_CrystalliteStateLoopDistribution = 0_pInt
|
||||||
debug_StiffnessStateLoopDistribution = 0_pInt
|
debug_StiffnessStateLoopDistribution = 0_pInt
|
||||||
debug_CrystalliteLoopDistribution = 0_pInt
|
debug_CrystalliteLoopDistribution = 0_pInt
|
||||||
|
@ -192,14 +199,16 @@ endsubroutine
|
||||||
|
|
||||||
integral = 0_pInt
|
integral = 0_pInt
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,*) 'distribution_StressLoop :'
|
write(6,*) 'distribution_StressLoop : stress frogbreak stiffness frogbreak'
|
||||||
do i=1,nStress
|
do i=1,nStress
|
||||||
if (debug_StressLoopDistribution(i,1) /= 0 .or. debug_StressLoopDistribution(i,2) /= 0) then
|
if (any(debug_StressLoopDistribution(i,:) /= 0_pInt ) .or. &
|
||||||
|
any(debug_LeapfrogBreakDistribution(i,:) /= 0_pInt ) ) then
|
||||||
integral = integral + i*debug_StressLoopDistribution(i,1) + i*debug_StressLoopDistribution(i,2)
|
integral = integral + i*debug_StressLoopDistribution(i,1) + i*debug_StressLoopDistribution(i,2)
|
||||||
write(6,'(i25,x,i10,x,i10)') i,debug_StressLoopDistribution(i,1),debug_StressLoopDistribution(i,2)
|
write(6,'(i25,x,i10,x,i10,x,i10,x,i10)') i,debug_StressLoopDistribution(i,1),debug_LeapfrogBreakDistribution(i,1), &
|
||||||
|
debug_StressLoopDistribution(i,2),debug_LeapfrogBreakDistribution(i,2)
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
write(6,'(a15,i10,x,i10,x,i10)') ' total',integral,&
|
write(6,'(a15,i10,x,i10,12x,i10)') ' total',integral,&
|
||||||
sum(debug_StressLoopDistribution(:,1)), &
|
sum(debug_StressLoopDistribution(:,1)), &
|
||||||
sum(debug_StressLoopDistribution(:,2))
|
sum(debug_StressLoopDistribution(:,2))
|
||||||
|
|
||||||
|
|
|
@ -26,9 +26,6 @@ integer(pInt), parameter :: lattice_maxNslip = 48 ! max # of sli
|
||||||
integer(pInt), parameter :: lattice_maxNtwin = 24 ! max # of twin systems over lattice structures
|
integer(pInt), parameter :: lattice_maxNtwin = 24 ! max # of twin systems over lattice structures
|
||||||
integer(pInt), parameter :: lattice_maxNinteraction = 20 ! max # of interaction types (in hardening matrix part)
|
integer(pInt), parameter :: lattice_maxNinteraction = 20 ! max # of interaction types (in hardening matrix part)
|
||||||
|
|
||||||
integer(pInt), parameter, dimension(3) :: lattice_symmetryTypes =(/1, 1, 2/) ! maps crystal structures to symmetry tpyes
|
|
||||||
|
|
||||||
|
|
||||||
integer(pInt), pointer, dimension(:,:) :: interactionSlipSlip, &
|
integer(pInt), pointer, dimension(:,:) :: interactionSlipSlip, &
|
||||||
interactionSlipTwin, &
|
interactionSlipTwin, &
|
||||||
interactionTwinSlip, &
|
interactionTwinSlip, &
|
||||||
|
@ -661,6 +658,30 @@ CONTAINS
|
||||||
!* - lattice_initializeStructure
|
!* - lattice_initializeStructure
|
||||||
!****************************************
|
!****************************************
|
||||||
|
|
||||||
|
pure function lattice_symmetryType(structID)
|
||||||
|
!**************************************
|
||||||
|
!* maps structure to symmetry type *
|
||||||
|
!* fcc(1) and bcc(2) are cubic(1) *
|
||||||
|
!* hex(3+) is hexagonal(2) *
|
||||||
|
!**************************************
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer(pInt), intent(in) :: structID
|
||||||
|
integer(pInt) lattice_symmetryType
|
||||||
|
|
||||||
|
select case(structID)
|
||||||
|
case (1,2)
|
||||||
|
lattice_symmetryType = 1_pInt
|
||||||
|
case (3:)
|
||||||
|
lattice_symmetryType = 2_pInt
|
||||||
|
case default
|
||||||
|
lattice_symmetryType = 0_pInt
|
||||||
|
end select
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
end function
|
||||||
|
|
||||||
|
|
||||||
subroutine lattice_init()
|
subroutine lattice_init()
|
||||||
!**************************************
|
!**************************************
|
||||||
|
|
|
@ -2522,8 +2522,8 @@ subroutine mesh_marc_count_cpSizes (unit)
|
||||||
pos = IO_stringPos(line,maxNchunks) ! limit to 64 nodes max (plus ID, type)
|
pos = IO_stringPos(line,maxNchunks) ! limit to 64 nodes max (plus ID, type)
|
||||||
e = mesh_FEasCP('elem',IO_intValue(line,pos,1))
|
e = mesh_FEasCP('elem',IO_intValue(line,pos,1))
|
||||||
if (e /= 0) then ! disregard non CP elems
|
if (e /= 0) then ! disregard non CP elems
|
||||||
mesh_element (1,e) = IO_IntValue (line,pos,1) ! FE id
|
mesh_element(1,e) = IO_IntValue (line,pos,1) ! FE id
|
||||||
mesh_element (2,e) = FE_mapElemtype(IO_StringValue(line,pos,2)) ! elem type
|
mesh_element(2,e) = FE_mapElemtype(IO_StringValue(line,pos,2)) ! elem type
|
||||||
forall (j = 1:FE_Nnodes(mesh_element(2,e))) &
|
forall (j = 1:FE_Nnodes(mesh_element(2,e))) &
|
||||||
mesh_element(j+4,e) = IO_IntValue(line,pos,j+2) ! copy FE ids of nodes
|
mesh_element(j+4,e) = IO_IntValue(line,pos,j+2) ! copy FE ids of nodes
|
||||||
call IO_skipChunks(unit,FE_NoriginalNodes(mesh_element(2,e))-(pos(1)-2)) ! read on if FE_Nnodes exceeds node count present on current line
|
call IO_skipChunks(unit,FE_NoriginalNodes(mesh_element(2,e))-(pos(1)-2)) ! read on if FE_Nnodes exceeds node count present on current line
|
||||||
|
@ -2978,18 +2978,19 @@ subroutine mesh_marc_count_cpSizes (unit)
|
||||||
|
|
||||||
integer(pInt) i,e,n,f,t
|
integer(pInt) i,e,n,f,t
|
||||||
|
|
||||||
if (mesh_maxValStateVar(1) == 0) call IO_error(110) ! no materials specified
|
if (mesh_maxValStateVar(1) < 1_pInt) call IO_error(110) ! no homogenization specified
|
||||||
if (mesh_maxValStateVar(2) == 0) call IO_error(120) ! no textures specified
|
if (mesh_maxValStateVar(2) < 1_pInt) call IO_error(120) ! no microstructure specified
|
||||||
|
|
||||||
allocate (mesh_HomogMicro(mesh_maxValStateVar(1),mesh_maxValStateVar(2))); mesh_HomogMicro = 0_pInt
|
allocate (mesh_HomogMicro(mesh_maxValStateVar(1),mesh_maxValStateVar(2))); mesh_HomogMicro = 0_pInt
|
||||||
do i=1,mesh_NcpElems
|
do e = 1,mesh_NcpElems
|
||||||
mesh_HomogMicro(mesh_element(3,i),mesh_element(4,i)) = &
|
if (mesh_element(3,e) < 1_pInt) call IO_error(110,e) ! no homogenization specified
|
||||||
mesh_HomogMicro(mesh_element(3,i),mesh_element(4,i)) + 1 ! count combinations of homogenization and microstructure
|
if (mesh_element(4,e) < 1_pInt) call IO_error(120,e) ! no homogenization specified
|
||||||
|
mesh_HomogMicro(mesh_element(3,e),mesh_element(4,e)) = &
|
||||||
|
mesh_HomogMicro(mesh_element(3,e),mesh_element(4,e)) + 1 ! count combinations of homogenization and microstructure
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
if (verboseDebugger) then
|
if (verboseDebugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
|
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,*) 'Input Parser: IP COORDINATES'
|
write(6,*) 'Input Parser: IP COORDINATES'
|
||||||
write(6,'(a5,x,a5,3(x,a12))') 'elem','IP','x','y','z'
|
write(6,'(a5,x,a5,3(x,a12))') 'elem','IP','x','y','z'
|
||||||
|
@ -3041,12 +3042,11 @@ subroutine mesh_marc_count_cpSizes (unit)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
!$OMP END CRITICAL (write2out)
|
!$OMP END CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
|
|
||||||
write (6,*)
|
write (6,*)
|
||||||
write (6,*) "Input Parser: STATISTICS"
|
write (6,*) "Input Parser: STATISTICS"
|
||||||
write (6,*)
|
write (6,*)
|
||||||
|
@ -3072,8 +3072,9 @@ endif
|
||||||
enddo
|
enddo
|
||||||
write (6,*)
|
write (6,*)
|
||||||
call flush(6)
|
call flush(6)
|
||||||
!$OMP END CRITICAL (write2out)
|
!$OMP END CRITICAL (write2out)
|
||||||
|
|
||||||
|
deallocate(mesh_HomogMicro)
|
||||||
return
|
return
|
||||||
|
|
||||||
endsubroutine
|
endsubroutine
|
||||||
|
|
Loading…
Reference in New Issue