diff --git a/src/config.f90 b/src/config.f90 index 187c4880f..0668fb5f0 100644 --- a/src/config.f90 +++ b/src/config.f90 @@ -12,6 +12,8 @@ module config use IO use debug use list + use YAML_parse + use YAML_types implicit none private @@ -24,9 +26,8 @@ module config config_crystallite type(tPartitionedStringList), public, protected :: & - config_numerics, & config_debug - + character(len=pStringLen), public, protected, allocatable, dimension(:) :: & config_name_phase, & !< name of each phase config_name_homogenization, & !< name of each homogenization @@ -109,13 +110,6 @@ subroutine config_init call IO_error(160,ext_msg='') - inquire(file='numerics.config', exist=fileExists) - if (fileExists) then - write(6,'(/,a)') ' reading numerics.config'; flush(6) - fileContent = IO_read_ASCII('numerics.config') - call parse_debugAndNumericsConfig(config_numerics,fileContent) - endif - inquire(file='debug.config', exist=fileExists) if (fileExists) then write(6,'(/,a)') ' reading debug.config'; flush(6) @@ -140,31 +134,16 @@ recursive function read_materialConfig(fileName,cnt) result(fileContent) character(len=pStringLen), parameter :: dummy = 'https://damask.mpie.de' !< to fill up remaining array character(len=:), allocatable :: rawData integer :: & - fileLength, & - fileUnit, & startPos, endPos, & myTotalLines, & !< # lines read from file without include statements - l,i, & - myStat + l,i logical :: warned if (present(cnt)) then if (cnt>10) call IO_error(106,ext_msg=trim(fileName)) endif -!-------------------------------------------------------------------------------------------------- -! read data as stream - inquire(file = fileName, size=fileLength) - if (fileLength == 0) then - allocate(fileContent(0)) - return - endif - open(newunit=fileUnit, file=fileName, access='stream',& - status='old', position='rewind', action='read',iostat=myStat) - if(myStat /= 0) call IO_error(100,ext_msg=trim(fileName)) - allocate(character(len=fileLength)::rawData) - read(fileUnit) rawData - close(fileUnit) + rawData = IO_read(fileName) ! read data as stream !-------------------------------------------------------------------------------------------------- ! count lines to allocate string array @@ -303,9 +282,6 @@ subroutine config_deallocate(what) case('debug.config') call config_debug%free - case('numerics.config') - call config_numerics%free - case default call IO_error(0,ext_msg='config_deallocate') diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 7b3265740..dae00cf5d 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -24,6 +24,7 @@ program DAMASK_grid use grid_damage_spectral use grid_thermal_spectral use results + use YAML_types implicit none @@ -88,10 +89,13 @@ program DAMASK_grid external :: & quit + class (tNode), pointer :: & + num_grid !-------------------------------------------------------------------------------------------------- ! init DAMASK (all modules) - call CPFEM_initAll + + call CPFEM_initAll write(6,'(/,a)') ' <<<+- DAMASK_spectral init -+>>>'; flush(6) write(6,'(/,a)') ' Shanthraj et al., Handbook of Mechanics of Materials, 2019' @@ -107,15 +111,18 @@ program DAMASK_grid !-------------------------------------------------------------------------------------------------- ! assign mechanics solver depending on selected type - select case (trim(config_numerics%getString('spectral_solver',defaultVal='basic'))) - case ('basic') + + num_grid => numerics_root%get('grid',defaultVal=emptyDict) + + select case (trim(num_grid%get_asString('solver', defaultVal = 'Basic'))) + case ('Basic') mech_init => grid_mech_spectral_basic_init mech_forward => grid_mech_spectral_basic_forward mech_solution => grid_mech_spectral_basic_solution mech_updateCoords => grid_mech_spectral_basic_updateCoords mech_restartWrite => grid_mech_spectral_basic_restartWrite - case ('polarisation') + case ('Polarisation') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & call IO_warning(42, ext_msg='debug Divergence') mech_init => grid_mech_spectral_polarisation_init @@ -124,7 +131,7 @@ program DAMASK_grid mech_updateCoords => grid_mech_spectral_polarisation_updateCoords mech_restartWrite => grid_mech_spectral_polarisation_restartWrite - case ('fem') + case ('FEM') if(iand(debug_level(debug_spectral),debug_levelBasic)/= 0) & call IO_warning(42, ext_msg='debug Divergence') mech_init => grid_mech_FEM_init @@ -134,13 +141,14 @@ program DAMASK_grid mech_restartWrite => grid_mech_FEM_restartWrite case default - call IO_error(error_ID = 891, ext_msg = config_numerics%getString('spectral_solver')) + call IO_error(error_ID = 891, ext_msg = trim(num_grid%get_asString('solver'))) end select !-------------------------------------------------------------------------------------------------- ! reading information from load case file and to sanity checks - fileContent = IO_read_ASCII(trim(loadCaseFile)) + fileContent = IO_readlines(trim(loadCaseFile)) + if(size(fileContent) == 0) call IO_error(307,ext_msg='No load case specified') allocate (loadCases(0)) ! array of load cases do currentLoadCase = 1, size(fileContent) diff --git a/src/grid/grid_mech_spectral_basic.f90 b/src/grid/grid_mech_spectral_basic.f90 index e04dd49f3..c69fcdc02 100644 --- a/src/grid/grid_mech_spectral_basic.f90 +++ b/src/grid/grid_mech_spectral_basic.f90 @@ -21,6 +21,7 @@ module grid_mech_spectral_basic use homogenization use discretization_grid use debug + use YAML_types implicit none private @@ -87,7 +88,9 @@ subroutine grid_mech_spectral_basic_init real(pReal), dimension(3,3,grid(1),grid(2),grid3) :: P real(pReal), dimension(3,3) :: & temp33_Real = 0.0_pReal - + class (tNode), pointer :: & + num_grid + PetscErrorCode :: ierr PetscScalar, pointer, dimension(:,:,:,:) :: & F ! pointer to solution data @@ -104,8 +107,9 @@ subroutine grid_mech_spectral_basic_init write(6,'(/,a)') ' Shanthraj et al., International Journal of Plasticity 66:31–45, 2015' write(6,'(a)') ' https://doi.org/10.1016/j.ijplas.2014.02.006' - num%update_gamma = config_numerics%getInt('update_gamma',defaultVal=0) > 0 - + num_grid => numerics_root%get('grid',defaultVal=emptyDict) + num%update_gamma = num_grid%get_asInt('update_gamma',defaultVal=0) > 0 !ToDo: Make boolean + !-------------------------------------------------------------------------------------------------- ! set default and user defined options for PETSc call PETScOptionsInsertString(PETSC_NULL_OPTIONS,'-mech_snes_type ngmres',ierr) diff --git a/src/grid/grid_mech_spectral_polarisation.f90 b/src/grid/grid_mech_spectral_polarisation.f90 index 80ed2e485..ce20c0e08 100644 --- a/src/grid/grid_mech_spectral_polarisation.f90 +++ b/src/grid/grid_mech_spectral_polarisation.f90 @@ -22,6 +22,7 @@ module grid_mech_spectral_polarisation use homogenization use discretization_grid use debug + use YAML_types implicit none private @@ -94,6 +95,8 @@ subroutine grid_mech_spectral_polarisation_init real(pReal), dimension(3,3,grid(1),grid(2),grid3) :: P real(pReal), dimension(3,3) :: & temp33_Real = 0.0_pReal + class (tNode), pointer :: & + num_grid PetscErrorCode :: ierr PetscScalar, pointer, dimension(:,:,:,:) :: & @@ -110,7 +113,8 @@ subroutine grid_mech_spectral_polarisation_init write(6,'(/,a)') ' Shanthraj et al., International Journal of Plasticity 66:31–45, 2015' write(6,'(a)') ' https://doi.org/10.1016/j.ijplas.2014.02.006' - num%update_gamma = config_numerics%getInt('update_gamma',defaultVal=0) > 0 + num_grid => numerics_root%get('grid',defaultVal=emptyDict) + num%update_gamma = num_grid%get_asInt('update_gamma',defaultVal=0) > 0 !-------------------------------------------------------------------------------------------------- ! set default and user defined options for PETSc diff --git a/src/grid/spectral_utilities.f90 b/src/grid/spectral_utilities.f90 index 66426fc9a..38627278d 100644 --- a/src/grid/spectral_utilities.f90 +++ b/src/grid/spectral_utilities.f90 @@ -19,6 +19,7 @@ module spectral_utilities use config use discretization use homogenization + use YAML_types implicit none private @@ -117,7 +118,7 @@ module spectral_utilities divergence_correction !< scale divergence/curl calculation: [0: no correction, 1: size scaled to 1, 2: size scaled to Npoints] logical :: & memory_efficient !< calculate gamma operator on the fly - character(len=pStringLen) :: & + character(len=:), allocatable :: & spectral_derivative, & !< approximation used for derivatives in Fourier space FFTW_plan_mode, & !< FFTW plan mode, see www.fftw.org PETSc_options @@ -188,6 +189,8 @@ subroutine utilities_init scalarSize = 1_C_INTPTR_T, & vecSize = 3_C_INTPTR_T, & tensorSize = 9_C_INTPTR_T + class (tNode) , pointer :: & + num_grid write(6,'(/,a)') ' <<<+- spectral_utilities init -+>>>' @@ -226,12 +229,14 @@ subroutine utilities_init write(6,'(/,a,3(i12 ))') ' grid a b c: ', grid write(6,'(a,3(es12.5))') ' size x y z: ', geomSize - - num%memory_efficient = config_numerics%getInt ('memory_efficient', defaultVal=1) > 0 - num%FFTW_timelimit = config_numerics%getFloat ('fftw_timelimit', defaultVal=-1.0_pReal) - num%divergence_correction = config_numerics%getInt ('divergence_correction', defaultVal=2) - num%spectral_derivative = config_numerics%getString('spectral_derivative', defaultVal='continuous') - num%FFTW_plan_mode = config_numerics%getString('fftw_plan_mode', defaultVal='FFTW_MEASURE') + + num_grid => numerics_root%get('grid',defaultVal=emptyDict) + + num%memory_efficient = num_grid%get_asInt ('memory_efficient', defaultVal=1) > 0 + num%FFTW_timelimit = num_grid%get_asFloat ('fftw_timelimit', defaultVal=-1.0_pReal) + num%divergence_correction = num_grid%get_asInt ('divergence_correction', defaultVal=2) + num%spectral_derivative = num_grid%get_asString('derivative', defaultVal='continuous') + num%FFTW_plan_mode = num_grid%get_asString('fftw_plan_mode', defaultVal='FFTW_MEASURE') if (num%divergence_correction < 0 .or. num%divergence_correction > 2) & call IO_error(301,ext_msg='divergence_correction') @@ -241,7 +246,7 @@ subroutine utilities_init spectral_derivative_ID = DERIVATIVE_CONTINUOUS_ID case ('central_difference') spectral_derivative_ID = DERIVATIVE_CENTRAL_DIFF_ID - case ('fwbw_difference') + case ('FWBW_difference') spectral_derivative_ID = DERIVATIVE_FWBW_DIFF_ID case default call IO_error(892,ext_msg=trim(num%spectral_derivative)) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 4fdded94e..e055c6f06 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -23,6 +23,7 @@ module homogenization use damage_local use damage_nonlocal use results + use YAML_types implicit none private @@ -59,7 +60,9 @@ module homogenization module subroutine mech_isostrain_init end subroutine mech_isostrain_init - module subroutine mech_RGC_init + module subroutine mech_RGC_init(num_homogMech) + class(tNode), pointer, intent(in) :: & + num_homogMech end subroutine mech_RGC_init @@ -131,9 +134,18 @@ contains !-------------------------------------------------------------------------------------------------- subroutine homogenization_init + class (tNode) , pointer :: & + num_homog, & + num_homogMech, & + num_homogGeneric + + num_homog => numerics_root%get('homogenization',defaultVal=emptyDict) + num_homogMech => num_homog%get('mech',defaultVal=emptyDict) + num_homogGeneric => num_homog%get('generic',defaultVal=emptyDict) + if (any(homogenization_type == HOMOGENIZATION_NONE_ID)) call mech_none_init if (any(homogenization_type == HOMOGENIZATION_ISOSTRAIN_ID)) call mech_isostrain_init - if (any(homogenization_type == HOMOGENIZATION_RGC_ID)) call mech_RGC_init + if (any(homogenization_type == HOMOGENIZATION_RGC_ID)) call mech_RGC_init(num_homogMech) if (any(thermal_type == THERMAL_isothermal_ID)) call thermal_isothermal_init if (any(thermal_type == THERMAL_adiabatic_ID)) call thermal_adiabatic_init @@ -157,10 +169,12 @@ subroutine homogenization_init if (debug_g < 1 .or. debug_g > homogenization_Ngrains(material_homogenizationAt(debug_e))) & call IO_error(602,ext_msg='constituent', el=debug_e, g=debug_g) - num%nMPstate = config_numerics%getInt( 'nmpstate', defaultVal=10) - num%subStepMinHomog = config_numerics%getFloat('substepminhomog', defaultVal=1.0e-3_pReal) - num%subStepSizeHomog = config_numerics%getFloat('substepsizehomog', defaultVal=0.25_pReal) - num%stepIncreaseHomog = config_numerics%getFloat('stepincreasehomog', defaultVal=1.5_pReal) + num%nMPstate = num_homogGeneric%get_asInt( 'nMPstate', defaultVal=10) + num%subStepMinHomog = num_homogGeneric%get_asFloat('subStepMin', defaultVal=1.0e-3_pReal) + num%subStepSizeHomog = num_homogGeneric%get_asFloat('subStepSize', defaultVal=0.25_pReal) + num%stepIncreaseHomog = num_homogGeneric%get_asFloat('stepIncrease', defaultVal=1.5_pReal) + + if (num%nMPstate < 1) call IO_error(301,ext_msg='nMPstate') if (num%subStepMinHomog <= 0.0_pReal) call IO_error(301,ext_msg='subStepMinHomog') if (num%subStepSizeHomog <= 0.0_pReal) call IO_error(301,ext_msg='subStepSizeHomog') diff --git a/src/homogenization_mech_RGC.f90 b/src/homogenization_mech_RGC.f90 index e10a0fef9..7ef73b130 100644 --- a/src/homogenization_mech_RGC.f90 +++ b/src/homogenization_mech_RGC.f90 @@ -75,13 +75,19 @@ contains !-------------------------------------------------------------------------------------------------- !> @brief allocates all necessary fields, reads information from material configuration file !-------------------------------------------------------------------------------------------------- -module subroutine mech_RGC_init +module subroutine mech_RGC_init(num_homogMech) + + class(tNode), pointer, intent(in) :: & + num_homogMech integer :: & Ninstance, & h, & NofMyHomog, & sizeState, nIntFaceTot + + class (tNode), pointer :: & + num_RGC write(6,'(/,a)') ' <<<+- homogenization_'//HOMOGENIZATION_RGC_label//' init -+>>>'; flush(6) @@ -99,20 +105,23 @@ module subroutine mech_RGC_init allocate(state(Ninstance)) allocate(state0(Ninstance)) allocate(dependentState(Ninstance)) + + num_RGC => num_homogMech%get('RGC',defaultVal=emptyDict) + + num%atol = num_RGC%get_asFloat('atol', defaultVal=1.0e+4_pReal) + num%rtol = num_RGC%get_asFloat('rtol', defaultVal=1.0e-3_pReal) + num%absMax = num_RGC%get_asFloat('amax', defaultVal=1.0e+10_pReal) + num%relMax = num_RGC%get_asFloat('rmax', defaultVal=1.0e+2_pReal) + num%pPert = num_RGC%get_asFloat('perturbpenalty', defaultVal=1.0e-7_pReal) + num%xSmoo = num_RGC%get_asFloat('relvantmismatch', defaultVal=1.0e-5_pReal) + num%viscPower = num_RGC%get_asFloat('viscositypower', defaultVal=1.0e+0_pReal) + num%viscModus = num_RGC%get_asFloat('viscositymodulus', defaultVal=0.0e+0_pReal) + num%refRelaxRate = num_RGC%get_asFloat('refrelaxationrate',defaultVal=1.0e-3_pReal) + num%maxdRelax = num_RGC%get_asFloat('maxrelaxationrate',defaultVal=1.0e+0_pReal) + num%maxVolDiscr = num_RGC%get_asFloat('maxvoldiscrepancy',defaultVal=1.0e-5_pReal) + num%volDiscrMod = num_RGC%get_asFloat('voldiscrepancymod',defaultVal=1.0e+12_pReal) + num%volDiscrPow = num_RGC%get_asFloat('dicrepancypower', defaultVal=5.0_pReal) - num%atol = config_numerics%getFloat('atol_rgc', defaultVal=1.0e+4_pReal) - num%rtol = config_numerics%getFloat('rtol_rgc', defaultVal=1.0e-3_pReal) - num%absMax = config_numerics%getFloat('amax_rgc', defaultVal=1.0e+10_pReal) - num%relMax = config_numerics%getFloat('rmax_rgc', defaultVal=1.0e+2_pReal) - num%pPert = config_numerics%getFloat('perturbpenalty_rgc', defaultVal=1.0e-7_pReal) - num%xSmoo = config_numerics%getFloat('relvantmismatch_rgc', defaultVal=1.0e-5_pReal) - num%viscPower = config_numerics%getFloat('viscositypower_rgc', defaultVal=1.0e+0_pReal) - num%viscModus = config_numerics%getFloat('viscositymodulus_rgc', defaultVal=0.0e+0_pReal) - num%refRelaxRate = config_numerics%getFloat('refrelaxationrate_rgc',defaultVal=1.0e-3_pReal) - num%maxdRelax = config_numerics%getFloat('maxrelaxationrate_rgc',defaultVal=1.0e+0_pReal) - num%maxVolDiscr = config_numerics%getFloat('maxvoldiscrepancy_rgc',defaultVal=1.0e-5_pReal) - num%volDiscrMod = config_numerics%getFloat('voldiscrepancymod_rgc',defaultVal=1.0e+12_pReal) - num%volDiscrPow = config_numerics%getFloat('dicrepancypower_rgc', defaultVal=5.0_pReal) if (num%atol <= 0.0_pReal) call IO_error(301,ext_msg='absTol_RGC') if (num%rtol <= 0.0_pReal) call IO_error(301,ext_msg='relTol_RGC') diff --git a/src/numerics.f90 b/src/numerics.f90 index c677ef888..9a005843c 100644 --- a/src/numerics.f90 +++ b/src/numerics.f90 @@ -111,6 +111,7 @@ subroutine numerics_init !$ endif !$ call omp_set_num_threads(DAMASK_NumThreadsInt) ! set number of threads for parallel execution + numerics_root => emptyDict inquire(file='numerics.yaml', exist=fexist) fileExists: if (fexist) then