option_registry.f90 Source File


Source Code

!> @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