!-------------------------------------------------------------------------------------------------- !> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH !> @brief Read in the material and numerics configuration from their respective file. !-------------------------------------------------------------------------------------------------- module config use IO use misc use YAML_parse use YAML_types use result use parallelization #if defined(MESH) || defined(GRID) use CLI #endif implicit none(type,external) private type(tDict), pointer, public :: & config_material, & config_numerics public :: & config_init, & config_material_deallocate, & config_numerics_deallocate, & config_listReferences contains !-------------------------------------------------------------------------------------------------- !> @brief Read *.yaml configuration files. !-------------------------------------------------------------------------------------------------- subroutine config_init() print'(/,1x,a)', '<<<+- config init -+>>>'; flush(IO_STDOUT) call parse_material() call parse_numerics() end subroutine config_init !-------------------------------------------------------------------------------------------------- !> @brief Deallocate config_material. !-------------------------------------------------------------------------------------------------- subroutine config_material_deallocate() print'(/,1x,a)', 'deallocating material configuration'; flush(IO_STDOUT) deallocate(config_material) end subroutine config_material_deallocate !-------------------------------------------------------------------------------------------------- !> @brief Deallocate config_numerics if present. !-------------------------------------------------------------------------------------------------- subroutine config_numerics_deallocate() if (.not. associated(config_numerics, emptyDict)) then print'(/,1x,a)', 'deallocating numerics configuration'; flush(IO_STDOUT) deallocate(config_numerics) end if end subroutine config_numerics_deallocate !-------------------------------------------------------------------------------------------------- !> @brief Return string with references from dict. !-------------------------------------------------------------------------------------------------- function config_listReferences(config,indent) result(references) type(tDict), intent(in) :: config integer, intent(in), optional :: indent character(len=:), allocatable :: references type(tList), pointer :: ref character(len=:), allocatable :: filler integer :: r filler = repeat(' ',misc_optional(indent,0)) ref => config%get_list('references',emptyList) if (ref%length == 0) then references = '' else references = 'references:' do r = 1, ref%length references = references//IO_EOL//filler//'- '//IO_wrapLines(ref%get_asStr(r),filler=filler//' ') end do end if end function config_listReferences !-------------------------------------------------------------------------------------------------- !> @brief Read material.yaml. !-------------------------------------------------------------------------------------------------- subroutine parse_material() character(len=:), allocatable :: & fileContent, fname if (worldrank == 0) then print'(/,1x,a)', 'reading material configuration'; flush(IO_STDOUT) #if defined(MESH) || defined(GRID) fname = CLI_materialFile #else fname = 'material.yaml' #endif fileContent = IO_read(fname) if (scan(fname,'/') /= 0) fname = fname(scan(fname,'/',.true.)+1:) call result_openJobFile(parallel=.false.) call result_writeDataset_str(fileContent,'setup',fname,'material configuration') call result_closeJobFile() end if call parallelization_bcast_str(fileContent) config_material => YAML_parse_str_asDict(fileContent) end subroutine parse_material !-------------------------------------------------------------------------------------------------- !> @brief Read numerics.yaml. !-------------------------------------------------------------------------------------------------- subroutine parse_numerics() character(len=:), allocatable :: & fileContent, fname logical :: parse config_numerics => emptyDict #if defined(MESH) || defined(GRID) fname = CLI_numericsFile parse = len_trim(CLI_numericsFile) > 0 #else fname = 'numerics.yaml' inquire(file=fname, exist=parse) #endif if (parse) then if (worldrank == 0) then print'(1x,a)', 'reading numerics configuration'; flush(IO_STDOUT) fileContent = IO_read(fname) if (scan(fname,'/') /= 0) fname = fname(scan(fname,'/',.true.)+1:) call result_openJobFile(parallel=.false.) call result_writeDataset_str(fileContent,'setup',fname,'numerics configuration') call result_closeJobFile() end if call parallelization_bcast_str(fileContent) config_numerics => YAML_parse_str_asDict(fileContent) end if end subroutine parse_numerics end module config