changed handling of non-converged BVP solution: By default, exit if no solution is found to prevent "user errors"
Removed ambiguous "regridMode" keyword which was used to trigger this behavior in favor of "continueCalculation", Set this to 1 to get back old behavior, e.g. report non-converged increments.
This commit is contained in:
parent
7b27606000
commit
84ce6e429a
|
@ -49,7 +49,7 @@ program DAMASK_spectral_Driver
|
||||||
use numerics, only: &
|
use numerics, only: &
|
||||||
maxCutBack, &
|
maxCutBack, &
|
||||||
mySpectralSolver, &
|
mySpectralSolver, &
|
||||||
regridMode
|
continueCalculation
|
||||||
use homogenization, only: &
|
use homogenization, only: &
|
||||||
materialpoint_sizeResults, &
|
materialpoint_sizeResults, &
|
||||||
materialpoint_results
|
materialpoint_results
|
||||||
|
@ -505,12 +505,14 @@ program DAMASK_spectral_Driver
|
||||||
time = time - timeinc ! rewind time
|
time = time - timeinc ! rewind time
|
||||||
timeIncOld = timeinc
|
timeIncOld = timeinc
|
||||||
timeinc = timeinc/2.0_pReal
|
timeinc = timeinc/2.0_pReal
|
||||||
elseif (solres%termIll) then ! material point model cannot find a solution
|
elseif (solres%termIll) then ! material point model cannot find a solution, exit in any casy
|
||||||
if(regridMode > 0_pInt) call quit(-1_pInt*(lastRestartWritten+1_pInt)) ! regrid requested (mode 1 or 2)
|
call IO_warning(850_pInt)
|
||||||
call IO_error(850_pInt) ! no regrid (give up)
|
call quit(-1_pInt*(lastRestartWritten+1_pInt)) ! quit and provide information about last restart inc written (e.g. for regridding)
|
||||||
else
|
elseif (continueCalculation == 1_pInt) then
|
||||||
if(regridMode == 2_pInt) call quit(-1_pInt*(lastRestartWritten+1_pInt)) ! regrid also if BVP solver do not converge
|
guess = .true. ! accept non converged BVP solution
|
||||||
guess = .true. ! continue from non-converged solution and start guessing after accepted (sub)inc
|
else ! default behavior, exit if spectral solver does not converge
|
||||||
|
call IO_warning(850_pInt)
|
||||||
|
call quit(-1_pInt*(lastRestartWritten+1_pInt)) ! quit and provide information about last restart inc written (e.g. for regridding) ! continue from non-converged solution and start guessing after accepted (sub)inc
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
guess = .true. ! start guessing after first converged (sub)inc
|
guess = .true. ! start guessing after first converged (sub)inc
|
||||||
|
@ -570,6 +572,7 @@ program DAMASK_spectral_Driver
|
||||||
real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, &
|
real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, &
|
||||||
' %) increments converged!'
|
' %) increments converged!'
|
||||||
close(resUnit)
|
close(resUnit)
|
||||||
|
close(statUnit)
|
||||||
if (notConvergedCounter > 0_pInt) call quit(3_pInt) ! error if some are not converged
|
if (notConvergedCounter > 0_pInt) call quit(3_pInt) ! error if some are not converged
|
||||||
call quit(0_pInt) ! no complains ;)
|
call quit(0_pInt) ! no complains ;)
|
||||||
|
|
||||||
|
@ -602,7 +605,7 @@ subroutine quit(stop_id)
|
||||||
dateAndTime(7)
|
dateAndTime(7)
|
||||||
if (stop_id == 0_pInt) stop 0 ! normal termination
|
if (stop_id == 0_pInt) stop 0 ! normal termination
|
||||||
if (stop_id < 0_pInt) then ! trigger regridding
|
if (stop_id < 0_pInt) then ! trigger regridding
|
||||||
write(0,'(a,i6)') 'restart at ', stop_id*(-1_pInt)
|
write(0,'(a,i6)') 'restart information available at ', stop_id*(-1_pInt)
|
||||||
stop 2
|
stop 2
|
||||||
endif
|
endif
|
||||||
if (stop_id == 3_pInt) stop 3 ! not all incs converged
|
if (stop_id == 3_pInt) stop 3 ! not all incs converged
|
||||||
|
|
|
@ -1587,8 +1587,6 @@ subroutine IO_error(error_ID,el,ip,g,ext_msg)
|
||||||
msg = 'not a rotation defined for loadcase rotation'
|
msg = 'not a rotation defined for loadcase rotation'
|
||||||
case (847_pInt)
|
case (847_pInt)
|
||||||
msg = 'update of gamma operator not possible when pre-calculated'
|
msg = 'update of gamma operator not possible when pre-calculated'
|
||||||
case (850_pInt)
|
|
||||||
msg = 'max number of cut back exceeded'
|
|
||||||
case (880_pInt)
|
case (880_pInt)
|
||||||
msg = 'mismatch of microstructure count and a*b*c in geom file'
|
msg = 'mismatch of microstructure count and a*b*c in geom file'
|
||||||
case (890_pInt)
|
case (890_pInt)
|
||||||
|
@ -1713,6 +1711,8 @@ subroutine IO_warning(warning_ID,el,ip,g,ext_msg)
|
||||||
msg = 'polar decomposition failed'
|
msg = 'polar decomposition failed'
|
||||||
case (700_pInt)
|
case (700_pInt)
|
||||||
msg = 'unknown crystal symmetry'
|
msg = 'unknown crystal symmetry'
|
||||||
|
case (850_pInt)
|
||||||
|
msg = 'max number of cut back exceeded, terminating'
|
||||||
case default
|
case default
|
||||||
msg = 'unknown warning number'
|
msg = 'unknown warning number'
|
||||||
end select
|
end select
|
||||||
|
|
|
@ -90,7 +90,7 @@ module numerics
|
||||||
itmax = 250_pInt, & !< maximum number of iterations
|
itmax = 250_pInt, & !< maximum number of iterations
|
||||||
itmin = 2_pInt, & !< minimum number of iterations
|
itmin = 2_pInt, & !< minimum number of iterations
|
||||||
maxCutBack = 3_pInt, & !< max number of cut backs
|
maxCutBack = 3_pInt, & !< max number of cut backs
|
||||||
regridMode = 0_pInt, & !< 0: no regrid; 1: regrid if DAMASK doesn't converge; 2: regrid if DAMASK or BVP Solver doesn't converge
|
continueCalculation = 0_pInt, & !< 0: exit if BVP solver does not converge, 1: continue calculation if BVP solver does not converge
|
||||||
divergence_correction = 2_pInt !< correct divergence calculation in fourier space 0: no correction, 1: size scaled to 1, 2: size scaled to Npoints
|
divergence_correction = 2_pInt !< correct divergence calculation in fourier space 0: no correction, 1: size scaled to 1, 2: size scaled to Npoints
|
||||||
logical, protected, public :: &
|
logical, protected, public :: &
|
||||||
memory_efficient = .true., & !< for fast execution (pre calculation of gamma_hat), Default .true.: do not precalculate
|
memory_efficient = .true., & !< for fast execution (pre calculation of gamma_hat), Default .true.: do not precalculate
|
||||||
|
@ -276,8 +276,8 @@ subroutine numerics_init
|
||||||
itmin = IO_intValue(line,positions,2_pInt)
|
itmin = IO_intValue(line,positions,2_pInt)
|
||||||
case ('maxcutback')
|
case ('maxcutback')
|
||||||
maxCutBack = IO_intValue(line,positions,2_pInt)
|
maxCutBack = IO_intValue(line,positions,2_pInt)
|
||||||
case ('regridmode')
|
case ('continuecalculation')
|
||||||
regridMode = IO_intValue(line,positions,2_pInt)
|
continueCalculation = IO_intValue(line,positions,2_pInt)
|
||||||
case ('memory_efficient')
|
case ('memory_efficient')
|
||||||
memory_efficient = IO_intValue(line,positions,2_pInt) > 0_pInt
|
memory_efficient = IO_intValue(line,positions,2_pInt) > 0_pInt
|
||||||
case ('fftw_timelimit')
|
case ('fftw_timelimit')
|
||||||
|
@ -406,7 +406,7 @@ subroutine numerics_init
|
||||||
write(6,'(a24,1x,i8)') ' itmax: ',itmax
|
write(6,'(a24,1x,i8)') ' itmax: ',itmax
|
||||||
write(6,'(a24,1x,i8)') ' itmin: ',itmin
|
write(6,'(a24,1x,i8)') ' itmin: ',itmin
|
||||||
write(6,'(a24,1x,i8)') ' maxCutBack: ',maxCutBack
|
write(6,'(a24,1x,i8)') ' maxCutBack: ',maxCutBack
|
||||||
write(6,'(a24,1x,i8)') ' regridMode: ',regridMode
|
write(6,'(a24,1x,i8)') ' continueCalculation: ',continueCalculation
|
||||||
write(6,'(a24,1x,L8)') ' memory_efficient: ',memory_efficient
|
write(6,'(a24,1x,L8)') ' memory_efficient: ',memory_efficient
|
||||||
write(6,'(a24,1x,i8)') ' divergence_correction: ',divergence_correction
|
write(6,'(a24,1x,i8)') ' divergence_correction: ',divergence_correction
|
||||||
write(6,'(a24,1x,a)') ' myfilter: ',trim(myfilter)
|
write(6,'(a24,1x,a)') ' myfilter: ',trim(myfilter)
|
||||||
|
@ -474,6 +474,8 @@ subroutine numerics_init
|
||||||
#ifdef Spectral
|
#ifdef Spectral
|
||||||
if (itmax <= 1_pInt) call IO_error(301_pInt,ext_msg='itmax')
|
if (itmax <= 1_pInt) call IO_error(301_pInt,ext_msg='itmax')
|
||||||
if (itmin > itmax .or. itmin < 1_pInt) call IO_error(301_pInt,ext_msg='itmin')
|
if (itmin > itmax .or. itmin < 1_pInt) call IO_error(301_pInt,ext_msg='itmin')
|
||||||
|
if (continueCalculation /= 0_pInt .and. &
|
||||||
|
continueCalculation /= 1_pInt) call IO_error(301_pInt,ext_msg='continueCalculation')
|
||||||
if (divergence_correction < 0_pInt .or. &
|
if (divergence_correction < 0_pInt .or. &
|
||||||
divergence_correction > 2_pInt) call IO_error(301_pInt,ext_msg='divergence_correction')
|
divergence_correction > 2_pInt) call IO_error(301_pInt,ext_msg='divergence_correction')
|
||||||
if (maxCutBack < 0_pInt) call IO_error(301_pInt,ext_msg='maxCutBack')
|
if (maxCutBack < 0_pInt) call IO_error(301_pInt,ext_msg='maxCutBack')
|
||||||
|
|
Loading…
Reference in New Issue