!> @file option_registry.f90 !> @brief Canonical string tokens for runtime-selectable solver options. !! !! Centralises the valid scheme, limiter, boundary-condition, and config-enum !! names that are accepted throughout the solver. Modules that dispatch on a !! string token should import the corresponding named constants from here !! instead of duplicating string literals locally. module option_registry implicit none private ! Flux schemes character(len=*), parameter, public :: flux_lax_friedrichs = 'lax_friedrichs' character(len=*), parameter, public :: flux_steger_warming = 'steger_warming' character(len=*), parameter, public :: flux_van_leer = 'van_leer' character(len=*), parameter, public :: flux_ausm_plus = 'ausm_plus' character(len=*), parameter, public :: flux_hll = 'hll' character(len=*), parameter, public :: flux_hllc = 'hllc' character(len=*), parameter, public :: flux_roe = 'roe' ! Reconstruction schemes character(len=*), parameter, public :: recon_weno5 = 'weno5' character(len=*), parameter, public :: recon_weno5z = 'weno5z' character(len=*), parameter, public :: recon_weno_cu6 = 'weno_cu6' character(len=*), parameter, public :: recon_weno7 = 'weno7' character(len=*), parameter, public :: recon_weno9 = 'weno9' character(len=*), parameter, public :: recon_weno11 = 'weno11' character(len=*), parameter, public :: recon_eno3 = 'eno3' character(len=*), parameter, public :: recon_muscl = 'muscl' character(len=*), parameter, public :: recon_mp5 = 'mp5' character(len=*), parameter, public :: recon_teno5 = 'teno5' character(len=*), parameter, public :: recon_upwind1 = 'upwind1' character(len=*), parameter, public :: recon_upwind2 = 'upwind2' character(len=*), parameter, public :: recon_central2 = 'central2' ! Time integrators character(len=*), parameter, public :: time_euler = 'euler' character(len=*), parameter, public :: time_ssprk22 = 'ssprk22' character(len=*), parameter, public :: time_rk3 = 'rk3' character(len=*), parameter, public :: time_rk4 = 'rk4' character(len=*), parameter, public :: time_ssprk54 = 'ssprk54' character(len=*), parameter, public :: time_beuler = 'beuler' character(len=*), parameter, public :: time_bdf2 = 'bdf2' ! MUSCL limiters character(len=*), parameter, public :: limiter_minmod = 'minmod' character(len=*), parameter, public :: limiter_superbee = 'superbee' character(len=*), parameter, public :: limiter_mc = 'mc' character(len=*), parameter, public :: limiter_van_leer = 'van_leer' character(len=*), parameter, public :: limiter_koren = 'koren' ! Problem types character(len=*), parameter, public :: problem_sod = 'sod' character(len=*), parameter, public :: problem_shu_osher = 'shu_osher' character(len=*), parameter, public :: problem_smooth_wave = 'smooth_wave' character(len=*), parameter, public :: problem_linear_advection = 'linear_advection' character(len=*), parameter, public :: problem_woodward_colella = 'woodward_colella' character(len=*), parameter, public :: problem_lax = 'lax' character(len=*), parameter, public :: problem_from_file = 'from_file' character(len=*), parameter, public :: problem_udf = 'udf' character(len=*), parameter, public :: problem_acoustic_pulse = 'acoustic_pulse' ! Boundary conditions character(len=*), parameter, public :: bc_dirichlet = 'dirichlet' character(len=*), parameter, public :: bc_inflow = 'inflow' character(len=*), parameter, public :: bc_outflow = 'outflow' character(len=*), parameter, public :: bc_reflecting = 'reflecting' character(len=*), parameter, public :: bc_periodic = 'periodic' character(len=*), parameter, public :: bc_nonreflecting = 'nonreflecting' character(len=*), parameter, public :: bc_supersonic_inlet = 'supersonic_inlet' character(len=*), parameter, public :: bc_subsonic_inlet = 'subsonic_inlet' character(len=*), parameter, public :: bc_supersonic_outlet = 'supersonic_outlet' character(len=*), parameter, public :: bc_subsonic_outlet = 'subsonic_outlet' character(len=*), parameter, public :: bc_neumann = 'neumann' character(len=*), parameter, public :: bc_neumann_gradient = 'neumann_gradient' ! Enum-like mode values character(len=*), parameter, public :: char_proj_auto = 'auto' character(len=*), parameter, public :: char_proj_yes = 'yes' character(len=*), parameter, public :: char_proj_no = 'no' character(len=*), parameter, public :: nrbc_mode_pressure = 'pressure' character(len=*), parameter, public :: nrbc_mode_characteristic = 'characteristic' character(len=*), parameter, public :: hybrid_sensor_jameson = 'jameson' character(len=*), parameter, public :: hybrid_sensor_density_gradient = 'density_gradient' character(len=*), parameter, public :: hybrid_sensor_weno_beta = 'weno_beta' character(len=32), parameter, public :: flux_scheme_names(7) = [character(len=32) :: & flux_lax_friedrichs, flux_steger_warming, flux_van_leer, & flux_ausm_plus, flux_hll, flux_hllc, flux_roe] character(len=32), parameter, public :: recon_scheme_names(13) = [character(len=32) :: & recon_weno5, recon_weno5z, recon_weno_cu6, recon_weno7, & recon_weno9, recon_weno11, recon_eno3, recon_muscl, & recon_mp5, recon_teno5, recon_upwind1, recon_upwind2, & recon_central2] character(len=16), parameter, public :: time_scheme_names(7) = [character(len=16) :: & time_euler, time_ssprk22, time_rk3, time_rk4, time_ssprk54, & time_beuler, time_bdf2] character(len=16), parameter, public :: limiter_names(5) = [character(len=16) :: & limiter_minmod, limiter_superbee, limiter_mc, limiter_van_leer, & limiter_koren] character(len=32), parameter, public :: problem_type_names(9) = [character(len=32) :: & problem_sod, problem_shu_osher, problem_smooth_wave, & problem_linear_advection, & problem_woodward_colella, problem_lax, problem_from_file, & problem_udf, problem_acoustic_pulse] character(len=32), parameter, public :: boundary_condition_names(12) = [character(len=32) :: & bc_dirichlet, bc_inflow, bc_outflow, bc_reflecting, & bc_periodic, bc_nonreflecting, & bc_supersonic_inlet, bc_subsonic_inlet, & bc_supersonic_outlet, bc_subsonic_outlet, & bc_neumann, bc_neumann_gradient] character(len=8), parameter, public :: char_proj_mode_names(3) = [character(len=8) :: & char_proj_auto, char_proj_yes, char_proj_no] character(len=16), parameter, public :: nrbc_mode_names(2) = [character(len=16) :: & nrbc_mode_pressure, nrbc_mode_characteristic] character(len=32), parameter, public :: hybrid_sensor_names(3) = [character(len=32) :: & hybrid_sensor_jameson, hybrid_sensor_density_gradient, & hybrid_sensor_weno_beta] public :: is_valid_flux_scheme, is_valid_recon_scheme, is_valid_time_scheme public :: is_valid_limiter, is_valid_problem_type, is_valid_boundary_condition public :: is_valid_char_proj_mode, is_valid_nrbc_mode, is_valid_hybrid_sensor public :: join_token_list, recon_uses_char_proj_by_default, is_fds_flux_scheme contains pure logical function is_valid_flux_scheme(scheme) character(len=*), intent(in) :: scheme is_valid_flux_scheme = token_in_list(scheme, flux_scheme_names) end function is_valid_flux_scheme pure logical function is_valid_recon_scheme(scheme) character(len=*), intent(in) :: scheme is_valid_recon_scheme = token_in_list(scheme, recon_scheme_names) end function is_valid_recon_scheme pure logical function is_valid_time_scheme(scheme) character(len=*), intent(in) :: scheme is_valid_time_scheme = token_in_list(scheme, time_scheme_names) end function is_valid_time_scheme pure logical function is_valid_limiter(limiter) character(len=*), intent(in) :: limiter is_valid_limiter = token_in_list(limiter, limiter_names) end function is_valid_limiter pure logical function is_valid_problem_type(problem_type) character(len=*), intent(in) :: problem_type is_valid_problem_type = token_in_list(problem_type, problem_type_names) end function is_valid_problem_type pure logical function is_valid_boundary_condition(bc_type) character(len=*), intent(in) :: bc_type is_valid_boundary_condition = token_in_list(bc_type, boundary_condition_names) end function is_valid_boundary_condition pure logical function is_valid_char_proj_mode(mode) character(len=*), intent(in) :: mode is_valid_char_proj_mode = token_in_list(mode, char_proj_mode_names) end function is_valid_char_proj_mode pure logical function is_valid_nrbc_mode(mode) character(len=*), intent(in) :: mode is_valid_nrbc_mode = token_in_list(mode, nrbc_mode_names) end function is_valid_nrbc_mode pure logical function is_valid_hybrid_sensor(sensor_name) character(len=*), intent(in) :: sensor_name is_valid_hybrid_sensor = token_in_list(sensor_name, hybrid_sensor_names) end function is_valid_hybrid_sensor pure logical function recon_uses_char_proj_by_default(scheme) character(len=*), intent(in) :: scheme select case (trim(scheme)) case (recon_weno5, recon_weno5z, recon_weno_cu6, recon_weno7, recon_weno9, & recon_weno11, recon_eno3, recon_mp5, recon_teno5) recon_uses_char_proj_by_default = .true. case default recon_uses_char_proj_by_default = .false. end select end function recon_uses_char_proj_by_default pure logical function is_fds_flux_scheme(scheme) character(len=*), intent(in) :: scheme select case (trim(scheme)) case (flux_ausm_plus, flux_hll, flux_hllc, flux_roe) is_fds_flux_scheme = .true. case default is_fds_flux_scheme = .false. end select end function is_fds_flux_scheme function join_token_list(valid_values) result(joined) character(len=*), intent(in) :: valid_values(:) character(len=512) :: joined integer :: i joined = '' do i = 1, size(valid_values) if (i > 1) joined = trim(joined)//' ' joined = trim(joined)//trim(valid_values(i)) end do end function join_token_list pure logical function token_in_list(token, valid_values) character(len=*), intent(in) :: token character(len=*), intent(in) :: valid_values(:) integer :: i token_in_list = .false. do i = 1, size(valid_values) if (trim(token) == trim(valid_values(i))) then token_in_list = .true. return end if end do end function token_in_list end module option_registry