diff --git a/PRIVATE b/PRIVATE index 1a5922536..162106e63 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 1a592253655a79ca26e29059339ed2bcb34eff9d +Subproject commit 162106e6379d484ee101981c66e3f159d2f8821a diff --git a/examples/config/numerics.yaml b/examples/config/numerics.yaml index e2759ab92..a0c7cb6b0 100644 --- a/examples/config/numerics.yaml +++ b/examples/config/numerics.yaml @@ -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) diff --git a/examples/grid/numerics.yaml b/examples/grid/numerics.yaml index 1a069cb76..4f8eaba2f 100644 --- a/examples/grid/numerics.yaml +++ b/examples/grid/numerics.yaml @@ -1,3 +1,5 @@ -grid: - itmin: 4 - itmax: 40 +solver: + grid: + mechanical: + N_iter_min: 4 + N_iter_max: 40 diff --git a/src/IO.f90 b/src/IO.f90 index b928171c4..ba33a8a5c 100644 --- a/src/IO.f90 +++ b/src/IO.f90 @@ -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 diff --git a/src/Marc/DAMASK_Marc.f90 b/src/Marc/DAMASK_Marc.f90 index fc63a8ab1..f2f6488f1 100644 --- a/src/Marc/DAMASK_Marc.f90 +++ b/src/Marc/DAMASK_Marc.f90 @@ -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" diff --git a/src/constants.f90 b/src/constants.f90 index 29d5ac69a..1402154c7 100644 --- a/src/constants.f90 +++ b/src/constants.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 diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 443f69f9c..272fcf4f7 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -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() !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_damage_spectral.f90 b/src/grid/grid_damage_spectral.f90 index 90680daea..47809a04e 100644 --- a/src/grid/grid_damage_spectral.f90 +++ b/src/grid/grid_damage_spectral.f90 @@ -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 diff --git a/src/grid/grid_mech_FEM.f90 b/src/grid/grid_mech_FEM.f90 index 17bf01ac0..424f60c07 100644 --- a/src/grid/grid_mech_FEM.f90 +++ b/src/grid/grid_mech_FEM.f90 @@ -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) !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index 4bd9c5a96..03dbfdbf0 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -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) !-------------------------------------------------------------------------------------------------- diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarization.f90 similarity index 90% rename from src/grid/grid_mech_spectral_polarisation.f90 rename to src/grid/grid_mech_spectral_polarization.f90 index 60e7d676e..a5a5f4809 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarization.f90 @@ -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 #include 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 diff --git a/src/grid/grid_thermal_spectral.f90 b/src/grid/grid_thermal_spectral.f90 index 1c3f2129a..cc5d79e1b 100644 --- a/src/grid/grid_thermal_spectral.f90 +++ b/src/grid/grid_thermal_spectral.f90 @@ -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 diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 5f82b5a8f..453723a9b 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -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) diff --git a/src/misc.f90 b/src/misc.f90 index 0ba3d6970..47c23757f 100644 --- a/src/misc.f90 +++ b/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)