Merge branch 'restructure-numerics' into 'development'
grid solver related changes See merge request damask/DAMASK!775
This commit is contained in:
commit
aab5412180
2
PRIVATE
2
PRIVATE
|
@ -1 +1 @@
|
|||
Subproject commit 1a592253655a79ca26e29059339ed2bcb34eff9d
|
||||
Subproject commit 162106e6379d484ee101981c66e3f159d2f8821a
|
|
@ -25,30 +25,40 @@ homogenization:
|
|||
stepIncrease: 1.5 # increase of next substep size when previous substep converged in homogenization (value higher than 1)
|
||||
nMPstate: 10 # materialpoint state loop limit
|
||||
|
||||
grid:
|
||||
eps_div_atol: 1.0e-3 # absolute tolerance for fulfillment of stress equilibrium
|
||||
eps_div_rtol: 5.0e-4 # relative tolerance for fulfillment of stress equilibrium
|
||||
eps_curl_atol: 1.0e-12 # absolute tolerance for fulfillment of strain compatibility
|
||||
eps_curl_rtol: 5.0e-4 # relative tolerance for fulfillment of strain compatibility
|
||||
eps_stress_atol: 1.0e+3 # absolute tolerance for fulfillment of stress BC
|
||||
eps_stress_rtol: 0.01 # relative tolerance for fulfillment of stress BC
|
||||
eps_damage_atol: 1.0e-2 # absolute tolerance for damage evolution
|
||||
eps_damage_rtol: 1.0e-6 # relative tolerance for damage evolution
|
||||
eps_thermal_atol: 1.0e-2 # absolute tolerance for thermal equilibrium
|
||||
eps_thermal_rtol: 1.0e-6 # relative tolerance for thermal equilibrium
|
||||
itmax: 250 # Maximum iteration number
|
||||
itmin: 2 # Minimum iteration number
|
||||
fftw_timelimit: -1.0 # timelimit of plan creation for FFTW, see manual on www.fftw.org, Default -1.0: disable timelimit
|
||||
fftw_plan_mode: FFTW_PATIENT # reads the planing-rigor flag, see manual on www.fftw.org, Default FFTW_PATIENT: use patient planner flag
|
||||
maxCutBack: 3 # maximum cut back level (0: 1, 1: 0.5, 2: 0.25, etc)
|
||||
maxStaggeredIter: 10 # max number of field level staggered iterations
|
||||
memory_efficient: 1 # Precalculate Gamma-operator (81 double per point)
|
||||
update_gamma: false # Update Gamma-operator with current dPdF (not possible if memory_efficient=1)
|
||||
divergence_correction: 2 # Use size-independent divergence criterion
|
||||
derivative: continuous # Approximation used for derivatives in Fourier space
|
||||
petsc_options: -snes_type ngmres -snes_ngmres_anderson # PetSc solver options
|
||||
alpha: 1.0 # polarization scheme parameter 0.0 < alpha < 2.0. alpha = 1.0 ==> AL scheme, alpha = 2.0 ==> accelerated scheme
|
||||
beta: 1.0 # polarization scheme parameter 0.0 < beta < 2.0. beta = 1.0 ==> AL scheme, beta = 2.0 ==> accelerated scheme
|
||||
solver:
|
||||
grid:
|
||||
N_staggered_iter_max: 10 # max number of field level staggered iterations
|
||||
N_cutback_max: 3 # maximum cut back level (0: 1, 1: 0.5, 2: 0.25, etc)
|
||||
|
||||
damage:
|
||||
N_iter_max: 100 # maximum iteration number
|
||||
eps_abs_phi: 1.0e-2 # absolute tolerance for damage evolution
|
||||
eps_rel_phi: 1.0e-6 # relative tolerance for damage evolution
|
||||
thermal:
|
||||
N_iter_max: 100 # maximum iteration number
|
||||
eps_abs_T: 1.0e-2 # absolute tolerance for thermal equilibrium
|
||||
eps_rel_T: 1.0e-6 # relative tolerance for thermal equilibrium
|
||||
|
||||
mechanical:
|
||||
eps_abs_div(P): 1.0e-4 # absolute tolerance for fulfillment of stress equilibrium
|
||||
eps_rel_div(P): 5.0e-4 # relative tolerance for fulfillment of stress equilibrium
|
||||
eps_abs_P: 1.0e3 # absolute tolerance for fulfillment of stress BC
|
||||
eps_rel_P: 1.0e-3 # relative tolerance for fulfillment of stress BC
|
||||
N_iter_min: 1 # minimum iteration number
|
||||
N_iter_max: 100 # maximum iteration number
|
||||
update_gamma: false # Update Gamma-operator with current dPdF (not possible if memory_efficient=1)
|
||||
|
||||
FFT:
|
||||
memory_efficient: True # Precalculate Gamma-operator (81 double per point)
|
||||
divergence_correction: size+grid # Use size-independent divergence criterion
|
||||
derivative: continuous # Approximation used for derivatives in Fourier space
|
||||
FFTW_plan_mode: FFTW_MEASURE # planing-rigor flag, see manual on www.fftw.org
|
||||
FFTW_timelimit: -1.0 # timelimit of plan creation for FFTW, see manual on www.fftw.org. -1.0: disable timelimit
|
||||
PETSc_options: -snes_type ngmres -snes_ngmres_anderson # PETSc solver options
|
||||
alpha: 1.0 # polarization scheme parameter 0.0 < alpha < 2.0. alpha = 1.0 ==> AL scheme, alpha = 2.0 ==> accelerated scheme
|
||||
beta: 1.0 # polarization scheme parameter 0.0 < beta < 2.0. beta = 1.0 ==> AL scheme, beta = 2.0 ==> accelerated scheme
|
||||
eps_abs_curl(F): 1.0e-10 # absolute tolerance for fulfillment of strain compatibility
|
||||
eps_rel_curl(F): 5.0e-4 # relative tolerance for fulfillment of strain compatibility
|
||||
|
||||
mesh:
|
||||
maxCutBack: 3 # maximum cut back level (0: 1, 1: 0.5, 2: 0.25, etc)
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
grid:
|
||||
itmin: 4
|
||||
itmax: 40
|
||||
solver:
|
||||
grid:
|
||||
mechanical:
|
||||
N_iter_min: 4
|
||||
N_iter_max: 40
|
||||
|
|
|
@ -11,6 +11,7 @@ module IO
|
|||
IO_STDERR => ERROR_UNIT
|
||||
|
||||
use prec
|
||||
use constants
|
||||
use misc
|
||||
|
||||
implicit none(type,external)
|
||||
|
@ -20,11 +21,8 @@ module IO
|
|||
IO_WHITESPACE = achar(44)//achar(32)//achar(9)//achar(10)//achar(13), & !< whitespace characters
|
||||
IO_QUOTES = "'"//'"'
|
||||
character, parameter, public :: &
|
||||
IO_EOL = new_line('DAMASK'), & !< end of line character
|
||||
IO_EOL = LF, & !< end of line character
|
||||
IO_COMMENT = '#'
|
||||
character, parameter :: &
|
||||
CR = achar(13), &
|
||||
LF = IO_EOL
|
||||
|
||||
public :: &
|
||||
IO_init, &
|
||||
|
@ -294,9 +292,6 @@ pure function IO_lc(str)
|
|||
character(len=*), intent(in) :: str !< string to convert
|
||||
character(len=len(str)) :: IO_lc
|
||||
|
||||
character(len=*), parameter :: LOWER = 'abcdefghijklmnopqrstuvwxyz'
|
||||
character(len=len(LOWER)), parameter :: UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
|
||||
integer :: i,n
|
||||
|
||||
|
||||
|
|
|
@ -142,8 +142,8 @@ end function solverIsSymmetric
|
|||
end module DAMASK_interface
|
||||
|
||||
#include "../parallelization.f90"
|
||||
#include "../misc.f90"
|
||||
#include "../constants.f90"
|
||||
#include "../misc.f90"
|
||||
#include "../IO.f90"
|
||||
#include "../YAML_types.f90"
|
||||
#include "../YAML_parse.f90"
|
||||
|
|
|
@ -13,4 +13,11 @@ module constants
|
|||
K_B = 1.380649e-23_pREAL, & !< Boltzmann constant in J/Kelvin (https://doi.org/10.1351/goldbook)
|
||||
N_A = 6.02214076e23_pREAL !< Avogadro constant in 1/mol (https://doi.org/10.1351/goldbook)
|
||||
|
||||
character, parameter :: &
|
||||
CR = achar(13), &
|
||||
LF = new_line('DAMASK')
|
||||
|
||||
character(len=*), parameter :: LOWER = 'abcdefghijklmnopqrstuvwxyz'
|
||||
character(len=len(LOWER)), parameter :: UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
|
||||
end module constants
|
||||
|
|
|
@ -24,7 +24,7 @@ program DAMASK_grid
|
|||
use material
|
||||
use spectral_utilities
|
||||
use grid_mechanical_spectral_basic
|
||||
use grid_mechanical_spectral_polarisation
|
||||
use grid_mechanical_spectral_polarization
|
||||
use grid_mechanical_FEM
|
||||
use grid_damage_spectral
|
||||
use grid_thermal_spectral
|
||||
|
@ -107,7 +107,8 @@ program DAMASK_grid
|
|||
external :: &
|
||||
quit
|
||||
type(tDict), pointer :: &
|
||||
config_load, &
|
||||
load, &
|
||||
num_solver, &
|
||||
num_grid, &
|
||||
load_step, &
|
||||
solver, &
|
||||
|
@ -122,6 +123,7 @@ program DAMASK_grid
|
|||
character(len=:), allocatable :: &
|
||||
fileContent, fname
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! init DAMASK (all modules)
|
||||
|
||||
|
@ -134,12 +136,16 @@ program DAMASK_grid
|
|||
|
||||
!-------------------------------------------------------------------------------------------------
|
||||
! read (and check) field parameters from numerics file
|
||||
num_grid => config_numerics%get_dict('grid', defaultVal=emptyDict)
|
||||
stagItMax = num_grid%get_asInt('maxStaggeredIter',defaultVal=10)
|
||||
maxCutBack = num_grid%get_asInt('maxCutBack',defaultVal=3)
|
||||
|
||||
if (stagItMax < 0) call IO_error(301,ext_msg='maxStaggeredIter')
|
||||
if (maxCutBack < 0) call IO_error(301,ext_msg='maxCutBack')
|
||||
num_solver => config_numerics%get_dict('solver',defaultVal=emptyDict)
|
||||
num_grid => num_solver%get_dict('grid',defaultVal=emptyDict)
|
||||
|
||||
stagItMax = num_grid%get_asInt('N_staggered_iter_max',defaultVal=10)
|
||||
maxCutBack = num_grid%get_asInt('N_cutback_max',defaultVal=3)
|
||||
|
||||
if (stagItMax < 0) call IO_error(301,ext_msg='N_staggered_iter_max')
|
||||
if (maxCutBack < 0) call IO_error(301,ext_msg='N_cutback_max')
|
||||
|
||||
|
||||
if (worldrank == 0) then
|
||||
fileContent = IO_read(CLI_loadFile)
|
||||
|
@ -151,8 +157,8 @@ program DAMASK_grid
|
|||
end if
|
||||
|
||||
call parallelization_bcast_str(fileContent)
|
||||
config_load => YAML_parse_str_asDict(fileContent)
|
||||
solver => config_load%get_dict('solver')
|
||||
load => YAML_parse_str_asDict(fileContent)
|
||||
solver => load%get_dict('solver')
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! assign mechanics solver depending on selected type
|
||||
|
@ -167,11 +173,11 @@ program DAMASK_grid
|
|||
mechanical_restartWrite => grid_mechanical_spectral_basic_restartWrite
|
||||
|
||||
case ('spectral_polarization')
|
||||
mechanical_init => grid_mechanical_spectral_polarisation_init
|
||||
mechanical_forward => grid_mechanical_spectral_polarisation_forward
|
||||
mechanical_solution => grid_mechanical_spectral_polarisation_solution
|
||||
mechanical_updateCoords => grid_mechanical_spectral_polarisation_updateCoords
|
||||
mechanical_restartWrite => grid_mechanical_spectral_polarisation_restartWrite
|
||||
mechanical_init => grid_mechanical_spectral_polarization_init
|
||||
mechanical_forward => grid_mechanical_spectral_polarization_forward
|
||||
mechanical_solution => grid_mechanical_spectral_polarization_solution
|
||||
mechanical_updateCoords => grid_mechanical_spectral_polarization_updateCoords
|
||||
mechanical_restartWrite => grid_mechanical_spectral_polarization_restartWrite
|
||||
|
||||
case ('FEM')
|
||||
mechanical_init => grid_mechanical_FEM_init
|
||||
|
@ -206,7 +212,7 @@ program DAMASK_grid
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
load_steps => config_load%get_list('loadstep')
|
||||
load_steps => load%get_list('loadstep')
|
||||
allocate(loadCases(load_steps%length)) ! array of load cases
|
||||
|
||||
do l = 1, load_steps%length
|
||||
|
@ -313,21 +319,21 @@ program DAMASK_grid
|
|||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! doing initialization depending on active solvers
|
||||
call spectral_Utilities_init()
|
||||
call spectral_utilities_init()
|
||||
|
||||
do field = 2, nActiveFields
|
||||
select case (ID(field))
|
||||
|
||||
case (FIELD_THERMAL_ID)
|
||||
call grid_thermal_spectral_init()
|
||||
call grid_thermal_spectral_init(num_grid)
|
||||
|
||||
case (FIELD_DAMAGE_ID)
|
||||
call grid_damage_spectral_init()
|
||||
call grid_damage_spectral_init(num_grid)
|
||||
|
||||
end select
|
||||
end do
|
||||
|
||||
call mechanical_init()
|
||||
call mechanical_init(num_grid)
|
||||
call config_numerics_deallocate()
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -16,6 +16,7 @@ module grid_damage_spectral
|
|||
use prec
|
||||
use parallelization
|
||||
use IO
|
||||
use misc
|
||||
use CLI
|
||||
use HDF5_utilities
|
||||
use HDF5
|
||||
|
@ -68,9 +69,11 @@ module grid_damage_spectral
|
|||
contains
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief allocates all neccessary fields and fills them with data
|
||||
!> @brief Allocate all necessary fields and fill them with data, potentially from restart file.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_damage_spectral_init()
|
||||
subroutine grid_damage_spectral_init(num_grid)
|
||||
|
||||
type(tDict), pointer, intent(in) :: num_grid
|
||||
|
||||
PetscInt, dimension(0:worldsize-1) :: localK
|
||||
integer :: i, j, k, ce
|
||||
|
@ -82,10 +85,13 @@ subroutine grid_damage_spectral_init()
|
|||
integer(HID_T) :: fileHandle, groupHandle
|
||||
real(pREAL), dimension(1,product(cells(1:2))*cells3) :: tempN
|
||||
type(tDict), pointer :: &
|
||||
num_grid, &
|
||||
num_generic
|
||||
num_grid_damage
|
||||
character(len=pSTRLEN) :: &
|
||||
snes_type
|
||||
character(len=:), allocatable :: &
|
||||
extmsg, &
|
||||
petsc_options
|
||||
|
||||
|
||||
print'(/,1x,a)', '<<<+- grid_spectral_damage init -+>>>'
|
||||
|
||||
|
@ -96,26 +102,27 @@ subroutine grid_damage_spectral_init()
|
|||
|
||||
!-------------------------------------------------------------------------------------------------
|
||||
! read numerical parameters and do sanity checks
|
||||
num_grid => config_numerics%get_dict('grid',defaultVal=emptyDict)
|
||||
num%itmax = num_grid%get_asInt ('itmax',defaultVal=250)
|
||||
num%eps_damage_atol = num_grid%get_asReal ('eps_damage_atol',defaultVal=1.0e-2_pREAL)
|
||||
num%eps_damage_rtol = num_grid%get_asReal ('eps_damage_rtol',defaultVal=1.0e-6_pREAL)
|
||||
num_grid_damage => num_grid%get_dict('damage',defaultVal=emptyDict)
|
||||
|
||||
num_generic => config_numerics%get_dict('generic',defaultVal=emptyDict)
|
||||
num%phi_min = num_generic%get_asReal('phi_min', defaultVal=1.0e-6_pREAL)
|
||||
num%itmax = num_grid_damage%get_asInt('N_iter_max', defaultVal=100)
|
||||
num%eps_damage_atol = num_grid_damage%get_asReal('eps_abs_phi',defaultVal=1.0e-2_pREAL)
|
||||
num%eps_damage_rtol = num_grid_damage%get_asReal('eps_rel_phi',defaultVal=1.0e-6_pREAL)
|
||||
num%phi_min = num_grid_damage%get_asReal('phi_min', defaultVal=1.0e-6_pREAL)
|
||||
|
||||
if (num%phi_min < 0.0_pREAL) call IO_error(301,ext_msg='phi_min')
|
||||
if (num%itmax <= 1) call IO_error(301,ext_msg='itmax')
|
||||
if (num%eps_damage_atol <= 0.0_pREAL) call IO_error(301,ext_msg='eps_damage_atol')
|
||||
if (num%eps_damage_rtol <= 0.0_pREAL) call IO_error(301,ext_msg='eps_damage_rtol')
|
||||
extmsg = ''
|
||||
if (num%eps_damage_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_phi'
|
||||
if (num%eps_damage_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_phi'
|
||||
if (num%phi_min < 0.0_pREAL) extmsg = trim(extmsg)//' phi_min'
|
||||
if (num%itmax < 1) extmsg = trim(extmsg)//' N_iter_max'
|
||||
|
||||
if (extmsg /= '') call IO_error(301,ext_msg=trim(extmsg))
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! set default and user defined options for PETSc
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,'-damage_snes_type newtonls -damage_snes_mf &
|
||||
&-damage_snes_ksp_ew -damage_ksp_type fgmres',err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,num_grid%get_asStr('petsc_options',defaultVal=''),err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
petsc_options = misc_prefixOptions('-snes_type newtonls -snes_mf -snes_ksp_ew -ksp_type fgmres '// &
|
||||
num_grid_damage%get_asStr('PETSc_options',defaultVal=''),'damage_')
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,petsc_options,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! init fields
|
||||
|
|
|
@ -15,8 +15,9 @@ module grid_mechanical_FEM
|
|||
|
||||
use prec
|
||||
use parallelization
|
||||
use CLI
|
||||
use IO
|
||||
use misc
|
||||
use CLI
|
||||
use HDF5
|
||||
use HDF5_utilities
|
||||
use math
|
||||
|
@ -94,9 +95,11 @@ module grid_mechanical_FEM
|
|||
contains
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief allocates all necessary fields and fills them with data, potentially from restart info
|
||||
!> @brief Allocate all necessary fields and fill them with data, potentially from restart info.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_mechanical_FEM_init
|
||||
subroutine grid_mechanical_FEM_init(num_grid)
|
||||
|
||||
type(tDict), pointer, intent(in) :: num_grid
|
||||
|
||||
real(pREAL), parameter :: HGCoeff = 0.0e-2_pREAL
|
||||
real(pREAL), parameter, dimension(4,8) :: &
|
||||
|
@ -118,41 +121,41 @@ subroutine grid_mechanical_FEM_init
|
|||
PetscInt, dimension(0:worldsize-1) :: localK
|
||||
integer(HID_T) :: fileHandle, groupHandle
|
||||
type(tDict), pointer :: &
|
||||
num_grid
|
||||
character(len=pSTRLEN) :: &
|
||||
extmsg = ''
|
||||
num_grid_mech
|
||||
character(len=:), allocatable :: &
|
||||
extmsg, &
|
||||
petsc_options
|
||||
|
||||
|
||||
print'(/,1x,a)', '<<<+- grid_mechanical_FEM init -+>>>'; flush(IO_STDOUT)
|
||||
|
||||
!-------------------------------------------------------------------------------------------------
|
||||
! read numerical parameters and do sanity checks
|
||||
num_grid => config_numerics%get_dict('grid',defaultVal=emptyDict)
|
||||
num_grid_mech => num_grid%get_dict('mechanical',defaultVal=emptyDict)
|
||||
|
||||
num%eps_div_atol = num_grid%get_asReal('eps_div_atol', defaultVal=1.0e-4_pREAL)
|
||||
num%eps_div_rtol = num_grid%get_asReal('eps_div_rtol', defaultVal=5.0e-4_pREAL)
|
||||
num%eps_stress_atol = num_grid%get_asReal('eps_stress_atol',defaultVal=1.0e3_pREAL)
|
||||
num%eps_stress_rtol = num_grid%get_asReal('eps_stress_rtol',defaultVal=1.0e-3_pREAL)
|
||||
num%itmin = num_grid%get_asInt ('itmin',defaultVal=1)
|
||||
num%itmax = num_grid%get_asInt ('itmax',defaultVal=250)
|
||||
num%itmin = num_grid_mech%get_asInt('N_iter_min',defaultVal=1)
|
||||
num%itmax = num_grid_mech%get_asInt('N_iter_max',defaultVal=100)
|
||||
num%eps_div_atol = num_grid_mech%get_asReal('eps_abs_div(P)',defaultVal=1.0e-4_pREAL)
|
||||
num%eps_div_rtol = num_grid_mech%get_asReal('eps_rel_div(P)',defaultVal=5.0e-4_pREAL)
|
||||
num%eps_stress_atol = num_grid_mech%get_asReal('eps_abs_P', defaultVal=1.0e3_pREAL)
|
||||
num%eps_stress_rtol = num_grid_mech%get_asReal('eps_rel_P', defaultVal=1.0e-3_pREAL)
|
||||
|
||||
if (num%eps_div_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_div_atol'
|
||||
if (num%eps_div_rtol < 0.0_pREAL) extmsg = trim(extmsg)//' eps_div_rtol'
|
||||
if (num%eps_stress_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_stress_atol'
|
||||
if (num%eps_stress_rtol < 0.0_pREAL) extmsg = trim(extmsg)//' eps_stress_rtol'
|
||||
if (num%itmax <= 1) extmsg = trim(extmsg)//' itmax'
|
||||
if (num%itmin > num%itmax .or. num%itmin < 1) extmsg = trim(extmsg)//' itmin'
|
||||
extmsg = ''
|
||||
if (num%eps_div_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_div(P)'
|
||||
if (num%eps_div_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_div(P)'
|
||||
if (num%eps_stress_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_P'
|
||||
if (num%eps_stress_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_P'
|
||||
if (num%itmax < 1) extmsg = trim(extmsg)//' N_iter_max'
|
||||
if (num%itmin > num%itmax .or. num%itmin < 1) extmsg = trim(extmsg)//' N_iter_min'
|
||||
|
||||
if (extmsg /= '') call IO_error(301,ext_msg=trim(extmsg))
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! set default and user defined options for PETSc
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS, &
|
||||
'-mechanical_snes_type newtonls -mechanical_ksp_type fgmres &
|
||||
&-mechanical_ksp_max_it 25', &
|
||||
err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,num_grid%get_asStr('petsc_options',defaultVal=''),err_PETSc)
|
||||
|
||||
petsc_options = misc_prefixOptions('-snes_type newtonls -ksp_type fgmres -ksp_max_it 25 '// &
|
||||
num_grid_mech%get_asStr('PETSc_options',defaultVal='') ,'mechanical_')
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,petsc_options,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -16,13 +16,13 @@ module grid_mechanical_spectral_basic
|
|||
use prec
|
||||
use parallelization
|
||||
use CLI
|
||||
use misc
|
||||
use IO
|
||||
use HDF5
|
||||
use HDF5_utilities
|
||||
use math
|
||||
use rotations
|
||||
use spectral_utilities
|
||||
use config
|
||||
use homogenization
|
||||
use discretization_grid
|
||||
|
||||
|
@ -101,9 +101,11 @@ module grid_mechanical_spectral_basic
|
|||
contains
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief allocates all necessary fields and fills them with data, potentially from restart info
|
||||
!> @brief Allocate all necessary fields and fill them with data, potentially from restart info.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_mechanical_spectral_basic_init()
|
||||
subroutine grid_mechanical_spectral_basic_init(num_grid)
|
||||
|
||||
type(tDict), pointer, intent(in) :: num_grid
|
||||
|
||||
real(pREAL), dimension(3,3,cells(1),cells(2),cells3) :: P
|
||||
PetscErrorCode :: err_PETSc
|
||||
|
@ -114,9 +116,11 @@ subroutine grid_mechanical_spectral_basic_init()
|
|||
real(pREAL), dimension(3,3,product(cells(1:2))*cells3) :: temp33n
|
||||
integer(HID_T) :: fileHandle, groupHandle
|
||||
type(tDict), pointer :: &
|
||||
num_grid
|
||||
character(len=pSTRLEN) :: &
|
||||
extmsg = ''
|
||||
num_grid_fft, &
|
||||
num_grid_mech
|
||||
character(len=:), allocatable :: &
|
||||
extmsg, &
|
||||
petsc_options
|
||||
|
||||
|
||||
print'(/,1x,a)', '<<<+- grid_mechanical_spectral_basic init -+>>>'; flush(IO_STDOUT)
|
||||
|
@ -129,30 +133,32 @@ subroutine grid_mechanical_spectral_basic_init()
|
|||
|
||||
!-------------------------------------------------------------------------------------------------
|
||||
! read numerical parameters and do sanity checks
|
||||
num_grid => config_numerics%get_dict('grid',defaultVal=emptyDict)
|
||||
num_grid_fft => num_grid%get_dict('FFT',defaultVal=emptyDict)
|
||||
num_grid_mech => num_grid%get_dict('mechanical',defaultVal=emptyDict)
|
||||
|
||||
num%update_gamma = num_grid%get_asBool('update_gamma', defaultVal=.false.)
|
||||
num%eps_div_atol = num_grid%get_asReal('eps_div_atol', defaultVal=1.0e-4_pREAL)
|
||||
num%eps_div_rtol = num_grid%get_asReal('eps_div_rtol', defaultVal=5.0e-4_pREAL)
|
||||
num%eps_stress_atol = num_grid%get_asReal('eps_stress_atol',defaultVal=1.0e3_pREAL)
|
||||
num%eps_stress_rtol = num_grid%get_asReal('eps_stress_rtol',defaultVal=1.0e-3_pREAL)
|
||||
num%itmin = num_grid%get_asInt ('itmin',defaultVal=1)
|
||||
num%itmax = num_grid%get_asInt ('itmax',defaultVal=250)
|
||||
num%itmin = num_grid_mech%get_asInt('N_iter_min',defaultVal=1)
|
||||
num%itmax = num_grid_mech%get_asInt('N_iter_max',defaultVal=100)
|
||||
num%update_gamma = num_grid_mech%get_asBool('update_gamma',defaultVal=.false.)
|
||||
num%eps_div_atol = num_grid_mech%get_asReal('eps_abs_div(P)', defaultVal=1.0e-4_pREAL)
|
||||
num%eps_div_rtol = num_grid_mech%get_asReal('eps_rel_div(P)', defaultVal=5.0e-4_pREAL)
|
||||
num%eps_stress_atol = num_grid_mech%get_asReal('eps_abs_P', defaultVal=1.0e3_pREAL)
|
||||
num%eps_stress_rtol = num_grid_mech%get_asReal('eps_rel_P', defaultVal=1.0e-3_pREAL)
|
||||
|
||||
if (num%eps_div_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_div_atol'
|
||||
if (num%eps_div_rtol < 0.0_pREAL) extmsg = trim(extmsg)//' eps_div_rtol'
|
||||
if (num%eps_stress_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_stress_atol'
|
||||
if (num%eps_stress_rtol < 0.0_pREAL) extmsg = trim(extmsg)//' eps_stress_rtol'
|
||||
if (num%itmax <= 1) extmsg = trim(extmsg)//' itmax'
|
||||
if (num%itmin > num%itmax .or. num%itmin < 1) extmsg = trim(extmsg)//' itmin'
|
||||
extmsg = ''
|
||||
if (num%eps_div_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_div(P)'
|
||||
if (num%eps_div_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_div(P)'
|
||||
if (num%eps_stress_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_P'
|
||||
if (num%eps_stress_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_P'
|
||||
if (num%itmax < 1) extmsg = trim(extmsg)//' N_iter_max'
|
||||
if (num%itmin > num%itmax .or. num%itmin < 1) extmsg = trim(extmsg)//' N_iter_min'
|
||||
|
||||
if (extmsg /= '') call IO_error(301,ext_msg=trim(extmsg))
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! set default and user defined options for PETSc
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,'-mechanical_snes_type ngmres',err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,num_grid%get_asStr('petsc_options',defaultVal=''),err_PETSc)
|
||||
petsc_options = misc_prefixOptions('-snes_type ngmres '//num_grid_mech%get_asStr('PETSc_options',defaultVal=''), &
|
||||
'mechanical_')
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,petsc_options,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
|
||||
!> @brief Grid solver for mechanics: Spectral Polarisation
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
module grid_mechanical_spectral_polarisation
|
||||
module grid_mechanical_spectral_polarization
|
||||
#include <petsc/finclude/petscsnes.h>
|
||||
#include <petsc/finclude/petscdmda.h>
|
||||
use PETScDMDA
|
||||
|
@ -16,6 +16,7 @@ module grid_mechanical_spectral_polarisation
|
|||
use prec
|
||||
use parallelization
|
||||
use CLI
|
||||
use misc
|
||||
use IO
|
||||
use HDF5
|
||||
use HDF5_utilities
|
||||
|
@ -103,18 +104,20 @@ module grid_mechanical_spectral_polarisation
|
|||
totalIter = 0 !< total iteration in current increment
|
||||
|
||||
public :: &
|
||||
grid_mechanical_spectral_polarisation_init, &
|
||||
grid_mechanical_spectral_polarisation_solution, &
|
||||
grid_mechanical_spectral_polarisation_forward, &
|
||||
grid_mechanical_spectral_polarisation_updateCoords, &
|
||||
grid_mechanical_spectral_polarisation_restartWrite
|
||||
grid_mechanical_spectral_polarization_init, &
|
||||
grid_mechanical_spectral_polarization_solution, &
|
||||
grid_mechanical_spectral_polarization_forward, &
|
||||
grid_mechanical_spectral_polarization_updateCoords, &
|
||||
grid_mechanical_spectral_polarization_restartWrite
|
||||
|
||||
contains
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief allocates all necessary fields and fills them with data, potentially from restart info
|
||||
!> @brief Allocate all necessary fields and fill them with data, potentially from restart info.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_mechanical_spectral_polarisation_init()
|
||||
subroutine grid_mechanical_spectral_polarization_init(num_grid)
|
||||
|
||||
type(tDict), pointer, intent(in) :: num_grid
|
||||
|
||||
real(pREAL), dimension(3,3,cells(1),cells(2),cells3) :: P
|
||||
PetscErrorCode :: err_PETSc
|
||||
|
@ -127,9 +130,11 @@ subroutine grid_mechanical_spectral_polarisation_init()
|
|||
real(pREAL), dimension(3,3,product(cells(1:2))*cells3) :: temp33n
|
||||
integer(HID_T) :: fileHandle, groupHandle
|
||||
type(tDict), pointer :: &
|
||||
num_grid
|
||||
character(len=pSTRLEN) :: &
|
||||
extmsg = ''
|
||||
num_grid_fft,&
|
||||
num_grid_mech
|
||||
character(len=:), allocatable :: &
|
||||
extmsg, &
|
||||
petsc_options
|
||||
|
||||
|
||||
print '(/,1x,a)', '<<<+- grid_mechanical_spectral_polarization init -+>>>'; flush(IO_STDOUT)
|
||||
|
@ -137,41 +142,42 @@ subroutine grid_mechanical_spectral_polarisation_init()
|
|||
print '(/,1x,a)', 'P. Shanthraj et al., International Journal of Plasticity 66:31–45, 2015'
|
||||
print '( 1x,a)', 'https://doi.org/10.1016/j.ijplas.2014.02.006'
|
||||
|
||||
|
||||
!-------------------------------------------------------------------------------------------------
|
||||
! read numerical parameters and do sanity checks
|
||||
num_grid => config_numerics%get_dict('grid',defaultVal=emptyDict)
|
||||
num_grid_fft => num_grid%get_dict('FFT',defaultVal=emptyDict)
|
||||
num_grid_mech => num_grid%get_dict('mechanical',defaultVal=emptyDict)
|
||||
|
||||
num%update_gamma = num_grid%get_asBool('update_gamma', defaultVal=.false.)
|
||||
num%eps_div_atol = num_grid%get_asReal('eps_div_atol', defaultVal=1.0e-4_pREAL)
|
||||
num%eps_div_rtol = num_grid%get_asReal('eps_div_rtol', defaultVal=5.0e-4_pREAL)
|
||||
num%eps_curl_atol = num_grid%get_asReal('eps_curl_atol', defaultVal=1.0e-10_pREAL)
|
||||
num%eps_curl_rtol = num_grid%get_asReal('eps_curl_rtol', defaultVal=5.0e-4_pREAL)
|
||||
num%eps_stress_atol = num_grid%get_asReal('eps_stress_atol',defaultVal=1.0e3_pREAL)
|
||||
num%eps_stress_rtol = num_grid%get_asReal('eps_stress_rtol',defaultVal=1.0e-3_pREAL)
|
||||
num%itmin = num_grid%get_asInt ('itmin', defaultVal=1)
|
||||
num%itmax = num_grid%get_asInt ('itmax', defaultVal=250)
|
||||
num%alpha = num_grid%get_asReal('alpha', defaultVal=1.0_pREAL)
|
||||
num%beta = num_grid%get_asReal('beta', defaultVal=1.0_pREAL)
|
||||
num%itmin = num_grid_mech%get_asInt('N_iter_min',defaultVal=1)
|
||||
num%itmax = num_grid_mech%get_asInt('N_iter_max',defaultVal=100)
|
||||
num%update_gamma = num_grid_mech%get_asBool('update_gamma',defaultVal=.false.)
|
||||
num%eps_div_atol = num_grid_mech%get_asReal('eps_abs_div(P)', defaultVal=1.0e-4_pREAL)
|
||||
num%eps_div_rtol = num_grid_mech%get_asReal('eps_rel_div(P)', defaultVal=5.0e-4_pREAL)
|
||||
num%eps_curl_atol = num_grid_mech%get_asReal('eps_abs_curl(F)',defaultVal=1.0e-10_pREAL)
|
||||
num%eps_curl_rtol = num_grid_mech%get_asReal('eps_rel_curl(F)',defaultVal=5.0e-4_pREAL)
|
||||
num%eps_stress_atol = num_grid_mech%get_asReal('eps_abs_P', defaultVal=1.0e3_pREAL)
|
||||
num%eps_stress_rtol = num_grid_mech%get_asReal('eps_rel_P', defaultVal=1.0e-3_pREAL)
|
||||
num%alpha = num_grid_mech%get_asReal('alpha', defaultVal=1.0_pREAL)
|
||||
num%beta = num_grid_mech%get_asReal('beta', defaultVal=1.0_pREAL)
|
||||
|
||||
if (num%eps_div_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_div_atol'
|
||||
if (num%eps_div_rtol < 0.0_pREAL) extmsg = trim(extmsg)//' eps_div_rtol'
|
||||
if (num%eps_curl_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_curl_atol'
|
||||
if (num%eps_curl_rtol < 0.0_pREAL) extmsg = trim(extmsg)//' eps_curl_rtol'
|
||||
if (num%eps_stress_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_stress_atol'
|
||||
if (num%eps_stress_rtol < 0.0_pREAL) extmsg = trim(extmsg)//' eps_stress_rtol'
|
||||
if (num%itmax <= 1) extmsg = trim(extmsg)//' itmax'
|
||||
if (num%itmin > num%itmax .or. num%itmin < 1) extmsg = trim(extmsg)//' itmin'
|
||||
extmsg = ''
|
||||
if (num%eps_div_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_div(P)'
|
||||
if (num%eps_div_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_div(P)'
|
||||
if (num%eps_curl_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_curl(F)'
|
||||
if (num%eps_curl_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_curl(F)'
|
||||
if (num%eps_stress_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_P'
|
||||
if (num%eps_stress_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_P'
|
||||
if (num%alpha <= 0.0_pREAL .or. num%alpha > 2.0_pREAL) extmsg = trim(extmsg)//' alpha'
|
||||
if (num%beta < 0.0_pREAL .or. num%beta > 2.0_pREAL) extmsg = trim(extmsg)//' beta'
|
||||
if (num%itmax < 1) extmsg = trim(extmsg)//' N_iter_max'
|
||||
if (num%itmin > num%itmax .or. num%itmin < 1) extmsg = trim(extmsg)//' N_iter_min'
|
||||
|
||||
if (extmsg /= '') call IO_error(301,ext_msg=trim(extmsg))
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! set default and user defined options for PETSc
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,'-mechanical_snes_type ngmres',err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,num_grid%get_asStr('petsc_options',defaultVal=''),err_PETSc)
|
||||
petsc_options = misc_prefixOptions('-snes_type ngmres '//num_grid_mech%get_asStr('PETSc_options',defaultVal=''), &
|
||||
'mechanical_')
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,petsc_options,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
@ -286,13 +292,13 @@ subroutine grid_mechanical_spectral_polarisation_init()
|
|||
C_scale = C_minMaxAvg
|
||||
S_scale = math_invSym3333(C_minMaxAvg)
|
||||
|
||||
end subroutine grid_mechanical_spectral_polarisation_init
|
||||
end subroutine grid_mechanical_spectral_polarization_init
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief solution for the Polarisation scheme with internal iterations
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function grid_mechanical_spectral_polarisation_solution(incInfoIn) result(solution)
|
||||
function grid_mechanical_spectral_polarization_solution(incInfoIn) result(solution)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! input data for solution
|
||||
|
@ -327,14 +333,14 @@ function grid_mechanical_spectral_polarisation_solution(incInfoIn) result(soluti
|
|||
terminallyIll = .false.
|
||||
P_aim = merge(P_av,P_aim,params%stress_mask)
|
||||
|
||||
end function grid_mechanical_spectral_polarisation_solution
|
||||
end function grid_mechanical_spectral_polarization_solution
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief forwarding routine
|
||||
!> @details find new boundary conditions and best F estimate for end of current timestep
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_mechanical_spectral_polarisation_forward(cutBack,guess,Delta_t,Delta_t_old,t_remaining,&
|
||||
subroutine grid_mechanical_spectral_polarization_forward(cutBack,guess,Delta_t,Delta_t_old,t_remaining,&
|
||||
deformation_BC,stress_BC,rotation_BC)
|
||||
|
||||
logical, intent(in) :: &
|
||||
|
@ -428,13 +434,13 @@ subroutine grid_mechanical_spectral_polarisation_forward(cutBack,guess,Delta_t,D
|
|||
params%rotation_BC = rotation_BC
|
||||
params%Delta_t = Delta_t
|
||||
|
||||
end subroutine grid_mechanical_spectral_polarisation_forward
|
||||
end subroutine grid_mechanical_spectral_polarization_forward
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Update coordinates.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_mechanical_spectral_polarisation_updateCoords()
|
||||
subroutine grid_mechanical_spectral_polarization_updateCoords()
|
||||
|
||||
PetscErrorCode :: err_PETSc
|
||||
real(pREAL), dimension(:,:,:,:), pointer :: FandF_tau
|
||||
|
@ -445,13 +451,13 @@ subroutine grid_mechanical_spectral_polarisation_updateCoords()
|
|||
call DMDAVecRestoreArrayReadF90(da,solution_vec,FandF_tau,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
|
||||
end subroutine grid_mechanical_spectral_polarisation_updateCoords
|
||||
end subroutine grid_mechanical_spectral_polarization_updateCoords
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Write current solver and constitutive data for restart to file.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_mechanical_spectral_polarisation_restartWrite()
|
||||
subroutine grid_mechanical_spectral_polarization_restartWrite()
|
||||
|
||||
PetscErrorCode :: err_PETSc
|
||||
integer(HID_T) :: fileHandle, groupHandle
|
||||
|
@ -492,7 +498,7 @@ subroutine grid_mechanical_spectral_polarisation_restartWrite()
|
|||
call DMDAVecRestoreArrayReadF90(da,solution_vec,FandF_tau,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
|
||||
end subroutine grid_mechanical_spectral_polarisation_restartWrite
|
||||
end subroutine grid_mechanical_spectral_polarization_restartWrite
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
@ -645,4 +651,4 @@ subroutine formResidual(residual_subdomain, FandF_tau, &
|
|||
|
||||
end subroutine formResidual
|
||||
|
||||
end module grid_mechanical_spectral_polarisation
|
||||
end module grid_mechanical_spectral_polarization
|
|
@ -16,6 +16,7 @@ module grid_thermal_spectral
|
|||
use prec
|
||||
use parallelization
|
||||
use IO
|
||||
use misc
|
||||
use CLI
|
||||
use HDF5_utilities
|
||||
use HDF5
|
||||
|
@ -67,9 +68,11 @@ module grid_thermal_spectral
|
|||
contains
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief allocates all neccessary fields and fills them with data
|
||||
!> @brief Allocate all necessary fields and fill them with data, potentially from restart info.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine grid_thermal_spectral_init()
|
||||
subroutine grid_thermal_spectral_init(num_grid)
|
||||
|
||||
type(tDict), pointer, intent(in) :: num_grid
|
||||
|
||||
PetscInt, dimension(0:worldsize-1) :: localK
|
||||
integer :: i, j, k, ce
|
||||
|
@ -80,7 +83,11 @@ subroutine grid_thermal_spectral_init()
|
|||
integer(HID_T) :: fileHandle, groupHandle
|
||||
real(pREAL), dimension(1,product(cells(1:2))*cells3) :: tempN
|
||||
type(tDict), pointer :: &
|
||||
num_grid
|
||||
num_grid_thermal
|
||||
character(len=:), allocatable :: &
|
||||
extmsg, &
|
||||
petsc_options
|
||||
|
||||
|
||||
print'(/,1x,a)', '<<<+- grid_thermal_spectral init -+>>>'
|
||||
|
||||
|
@ -91,22 +98,24 @@ subroutine grid_thermal_spectral_init()
|
|||
|
||||
!-------------------------------------------------------------------------------------------------
|
||||
! read numerical parameters and do sanity checks
|
||||
num_grid => config_numerics%get_dict('grid',defaultVal=emptyDict)
|
||||
num%itmax = num_grid%get_asInt ('itmax', defaultVal=250)
|
||||
num%eps_thermal_atol = num_grid%get_asReal('eps_thermal_atol',defaultVal=1.0e-2_pREAL)
|
||||
num%eps_thermal_rtol = num_grid%get_asReal('eps_thermal_rtol',defaultVal=1.0e-6_pREAL)
|
||||
num_grid_thermal => num_grid%get_dict('thermal',defaultVal=emptyDict)
|
||||
|
||||
if (num%itmax <= 1) call IO_error(301,ext_msg='itmax')
|
||||
if (num%eps_thermal_atol <= 0.0_pREAL) call IO_error(301,ext_msg='eps_thermal_atol')
|
||||
if (num%eps_thermal_rtol <= 0.0_pREAL) call IO_error(301,ext_msg='eps_thermal_rtol')
|
||||
num%itmax = num_grid_thermal%get_asInt('N_iter_max', defaultVal=100)
|
||||
num%eps_thermal_atol = num_grid_thermal%get_asReal('eps_abs_T', defaultVal=1.0e-2_pREAL)
|
||||
num%eps_thermal_rtol = num_grid_thermal%get_asReal('eps_rel_T', defaultVal=1.0e-6_pREAL)
|
||||
|
||||
extmsg = ''
|
||||
if (num%eps_thermal_atol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_abs_T'
|
||||
if (num%eps_thermal_rtol <= 0.0_pREAL) extmsg = trim(extmsg)//' eps_rel_T'
|
||||
if (num%itmax < 1) extmsg = trim(extmsg)//' N_iter_max'
|
||||
|
||||
if (extmsg /= '') call IO_error(301,ext_msg=trim(extmsg))
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! set default and user defined options for PETSc
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,'-thermal_snes_type newtonls -thermal_snes_mf &
|
||||
&-thermal_snes_ksp_ew -thermal_ksp_type fgmres',err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,num_grid%get_asStr('petsc_options',defaultVal=''),err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
petsc_options = misc_prefixOptions('-snes_type newtonls -snes_mf -snes_ksp_ew -ksp_type fgmres '// &
|
||||
num_grid_thermal%get_asStr('PETSc_options',defaultVal=''), 'thermal_')
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,petsc_options,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! init fields
|
||||
|
|
|
@ -100,12 +100,18 @@ module spectral_utilities
|
|||
enum, bind(c); enumerator :: &
|
||||
DERIVATIVE_CONTINUOUS_ID, &
|
||||
DERIVATIVE_CENTRAL_DIFF_ID, &
|
||||
DERIVATIVE_FWBW_DIFF_ID
|
||||
DERIVATIVE_FWBW_DIFF_ID, &
|
||||
DIVERGENCE_CORRECTION_NONE_ID, &
|
||||
DIVERGENCE_CORRECTION_SIZE_ID, &
|
||||
DIVERGENCE_CORRECTION_SIZE_GRID_ID
|
||||
end enum
|
||||
|
||||
integer(kind(DERIVATIVE_CONTINUOUS_ID)) :: &
|
||||
spectral_derivative_ID
|
||||
|
||||
integer(kind(DIVERGENCE_CORRECTION_NONE_ID)) :: &
|
||||
divergence_correction_ID
|
||||
|
||||
public :: &
|
||||
spectral_utilities_init, &
|
||||
utilities_updateGamma, &
|
||||
|
@ -146,8 +152,9 @@ subroutine spectral_utilities_init()
|
|||
vectorSize = 3_C_INTPTR_T, &
|
||||
tensorSize = 9_C_INTPTR_T
|
||||
type(tDict) , pointer :: &
|
||||
num_grid
|
||||
|
||||
num_solver, &
|
||||
num_grid, &
|
||||
num_grid_fft
|
||||
|
||||
print'(/,1x,a)', '<<<+- spectral_utilities init -+>>>'
|
||||
|
||||
|
@ -163,8 +170,10 @@ subroutine spectral_utilities_init()
|
|||
print'( 1x,a)', 'P. Shanthraj et al., Handbook of Mechanics of Materials, 2019'
|
||||
print'( 1x,a)', 'https://doi.org/10.1007/978-981-10-6855-3_80'
|
||||
|
||||
num_solver => config_numerics%get_dict('solver',defaultVal=emptyDict)
|
||||
num_grid => num_solver%get_dict('grid',defaultVal=emptyDict)
|
||||
num_grid_fft => num_grid%get_dict('FFT',defaultVal=emptyDict)
|
||||
|
||||
num_grid => config_numerics%get_dict('grid',defaultVal=emptyDict)
|
||||
call PetscOptionsClear(PETSC_NULL_OPTIONS,err_PETSc)
|
||||
CHKERRQ(err_PETSc)
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,&
|
||||
|
@ -174,13 +183,21 @@ subroutine spectral_utilities_init()
|
|||
cells1Red = cells(1)/2 + 1
|
||||
wgt = real(product(cells),pREAL)**(-1)
|
||||
|
||||
num%memory_efficient = num_grid%get_asInt('memory_efficient', defaultVal=1) > 0 ! ToDo: should be logical in YAML file
|
||||
num%divergence_correction = num_grid%get_asInt('divergence_correction', defaultVal=2)
|
||||
num%memory_efficient = num_grid_fft%get_asBool('memory_efficient', defaultVal=.true.)
|
||||
|
||||
if (num%divergence_correction < 0 .or. num%divergence_correction > 2) &
|
||||
call IO_error(301,ext_msg='divergence_correction')
|
||||
select case (num_grid_fft%get_asStr('divergence_correction',defaultVal='grid+size'))
|
||||
case ('none')
|
||||
divergence_correction_ID = DIVERGENCE_CORRECTION_NONE_ID
|
||||
case ('size')
|
||||
divergence_correction_ID = DIVERGENCE_CORRECTION_SIZE_ID
|
||||
case ('grid+size', 'size+grid')
|
||||
divergence_correction_ID = DIVERGENCE_CORRECTION_SIZE_GRID_ID
|
||||
case default
|
||||
call IO_error(301,ext_msg=trim(num_grid_fft%get_asStr('divergence_correction')))
|
||||
end select
|
||||
|
||||
select case (num_grid%get_asStr('derivative',defaultVal='continuous'))
|
||||
|
||||
select case (num_grid_fft%get_asStr('derivative',defaultVal='continuous'))
|
||||
case ('continuous')
|
||||
spectral_derivative_ID = DERIVATIVE_CONTINUOUS_ID
|
||||
case ('central_difference')
|
||||
|
@ -188,18 +205,18 @@ subroutine spectral_utilities_init()
|
|||
case ('FWBW_difference')
|
||||
spectral_derivative_ID = DERIVATIVE_FWBW_DIFF_ID
|
||||
case default
|
||||
call IO_error(892,ext_msg=trim(num_grid%get_asStr('derivative')))
|
||||
call IO_error(892,ext_msg=trim(num_grid_fft%get_asStr('derivative')))
|
||||
end select
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! scale dimension to calculate either uncorrected, dimension-independent, or dimension- and
|
||||
! resolution-independent divergence
|
||||
if (num%divergence_correction == 1) then
|
||||
if (divergence_correction_ID == DIVERGENCE_CORRECTION_NONE_ID) then
|
||||
do j = 1, 3
|
||||
if (j /= minloc(geomSize,1) .and. j /= maxloc(geomSize,1)) &
|
||||
scaledGeomSize = geomSize/geomSize(j)
|
||||
end do
|
||||
elseif (num%divergence_correction == 2) then
|
||||
elseif (divergence_correction_ID == DIVERGENCE_CORRECTION_SIZE_GRID_ID) then
|
||||
do j = 1, 3
|
||||
if ( j /= int(minloc(geomSize/real(cells,pREAL),1)) &
|
||||
.and. j /= int(maxloc(geomSize/real(cells,pREAL),1))) &
|
||||
|
@ -209,24 +226,24 @@ subroutine spectral_utilities_init()
|
|||
scaledGeomSize = geomSize
|
||||
end if
|
||||
|
||||
select case(IO_lc(num_grid%get_asStr('fftw_plan_mode',defaultVal='FFTW_MEASURE')))
|
||||
case('fftw_estimate') ! ordered from slow execution (but fast plan creation) to fast execution
|
||||
select case(IO_lc(num_grid_fft%get_asStr('FFTW_plan_mode',defaultVal='FFTW_MEASURE')))
|
||||
case('fftw_estimate', 'FFTW_ESTIMATE') ! ordered from slow execution (but fast plan creation) to fast execution
|
||||
FFTW_planner_flag = FFTW_ESTIMATE
|
||||
case('fftw_measure')
|
||||
case('fftw_measure', 'FFTW_MEASURE')
|
||||
FFTW_planner_flag = FFTW_MEASURE
|
||||
case('fftw_patient')
|
||||
case('fftw_patient', 'FFTW_PATIENT')
|
||||
FFTW_planner_flag = FFTW_PATIENT
|
||||
case('fftw_exhaustive')
|
||||
case('fftw_exhaustive', 'FFTW_EXHAUSTIVE')
|
||||
FFTW_planner_flag = FFTW_EXHAUSTIVE
|
||||
case default
|
||||
call IO_warning(47,'using default FFTW_MEASURE instead of "'//trim(num_grid%get_asStr('fftw_plan_mode'))//'"')
|
||||
call IO_warning(47,'using default FFTW_MEASURE instead of "'//trim(num_grid_fft%get_asStr('plan_mode'))//'"')
|
||||
FFTW_planner_flag = FFTW_MEASURE
|
||||
end select
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! general initialization of FFTW (see manual on fftw.org for more details)
|
||||
if (pREAL /= C_DOUBLE .or. kind(1) /= C_INT) error stop 'C and Fortran datatypes do not match'
|
||||
call fftw_set_timelimit(num_grid%get_asReal('fftw_timelimit',defaultVal=300.0_pREAL))
|
||||
call fftw_set_timelimit(num_grid_fft%get_asReal('FFTW_timelimit',defaultVal=300.0_pREAL))
|
||||
|
||||
print'(/,1x,a)', 'FFTW initialized'; flush(IO_STDOUT)
|
||||
|
||||
|
|
32
src/misc.f90
32
src/misc.f90
|
@ -5,6 +5,7 @@
|
|||
!--------------------------------------------------------------------------------------------------
|
||||
module misc
|
||||
use prec
|
||||
use constants
|
||||
|
||||
implicit none(type,external)
|
||||
private
|
||||
|
@ -18,7 +19,8 @@ module misc
|
|||
|
||||
public :: &
|
||||
misc_init, &
|
||||
misc_optional
|
||||
misc_optional, &
|
||||
misc_prefixOptions
|
||||
|
||||
contains
|
||||
|
||||
|
@ -110,6 +112,28 @@ pure function misc_optional_str(given,default) result(var)
|
|||
|
||||
end function misc_optional_str
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Add prefix to options in string.
|
||||
!> @detail An option starts with a dash followed by at least one letter.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function misc_prefixOptions(string,prefix) result(prefixed)
|
||||
|
||||
character(len=*), intent(in) :: string,prefix
|
||||
character(len=:), allocatable :: prefixed
|
||||
|
||||
integer :: i,N
|
||||
|
||||
|
||||
prefixed = ''
|
||||
N = len(string)
|
||||
do i = 1, N
|
||||
prefixed = prefixed//string(i:i)
|
||||
if (string(i:i) == '-' .and. verify(string(min(i+1,N):min(i+1,N)),LOWER//UPPER) == 0) &
|
||||
prefixed = prefixed//prefix
|
||||
end do
|
||||
|
||||
end function misc_prefixOptions
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Check correctness of some misc functions.
|
||||
|
@ -117,6 +141,8 @@ end function misc_optional_str
|
|||
subroutine misc_selfTest()
|
||||
|
||||
real(pREAL) :: r
|
||||
character(len=:), allocatable :: str,out
|
||||
|
||||
|
||||
call random_number(r)
|
||||
if (test_str('DAMASK') /= 'DAMASK') error stop 'optional_str, present'
|
||||
|
@ -132,6 +158,10 @@ subroutine misc_selfTest()
|
|||
if (.not. test_bool()) error stop 'optional_bool, not present'
|
||||
if (misc_optional(default=r>0.5_pREAL) .neqv. r>0.5_pREAL) error stop 'optional_bool, default only'
|
||||
|
||||
str='-a -1 -more 123 -flag -'
|
||||
out=misc_prefixOptions(str,'p_')
|
||||
if (out /= '-p_a -1 -p_more 123 -p_flag -') error stop 'misc_prefixOptions'
|
||||
|
||||
contains
|
||||
|
||||
function test_str(str_in) result(str_out)
|
||||
|
|
Loading…
Reference in New Issue