subroutine read_solver_input(filename, params)
character(len=*), intent(in) :: filename
type(case_params_t), intent(inout) :: params
integer :: pressure_max_iter
real(rk) :: pressure_tol
real(rk) :: pressure_abs_tol
real(rk) :: body_force_x, body_force_y, body_force_z
character(len=name_len) :: convection_scheme
character(len=name_len) :: momentum_convection_scheme
character(len=name_len) :: species_convection_scheme
character(len=name_len) :: energy_convection_scheme
character(len=name_len) :: scalar_limiter
character(len=name_len) :: species_time_scheme
character(len=name_len) :: energy_time_scheme
integer :: unit_id, ios
namelist /solver_input/ pressure_max_iter, pressure_tol, pressure_abs_tol, &
body_force_x, body_force_y, body_force_z, &
convection_scheme, momentum_convection_scheme, &
species_convection_scheme, energy_convection_scheme, &
scalar_limiter, species_time_scheme, energy_time_scheme
pressure_max_iter = params%pressure_max_iter
pressure_tol = params%pressure_tol
pressure_abs_tol = params%pressure_abs_tol
body_force_x = params%body_force(1)
body_force_y = params%body_force(2)
body_force_z = params%body_force(3)
convection_scheme = params%convection_scheme
momentum_convection_scheme = params%momentum_convection_scheme
species_convection_scheme = params%species_convection_scheme
energy_convection_scheme = params%energy_convection_scheme
scalar_limiter = params%scalar_limiter
species_time_scheme = params%species_time_scheme
energy_time_scheme = params%energy_time_scheme
call open_namelist_file(filename, unit_id, ios)
if (ios == 0) then
read(unit_id, nml=solver_input, iostat=ios)
close(unit_id)
end if
if (ios > 0) call fatal_error('input', 'failed reading &solver_input')
params%pressure_max_iter = pressure_max_iter
params%pressure_tol = pressure_tol
params%pressure_abs_tol = pressure_abs_tol
params%body_force = [body_force_x, body_force_y, body_force_z]
params%convection_scheme = trim(lowercase(convection_scheme))
params%momentum_convection_scheme = trim(lowercase(momentum_convection_scheme))
if (len_trim(params%momentum_convection_scheme) == 0) then
params%momentum_convection_scheme = params%convection_scheme
end if
! The legacy field remains the value consumed by the existing projection solver.
params%convection_scheme = params%momentum_convection_scheme
params%species_convection_scheme = trim(lowercase(species_convection_scheme))
params%energy_convection_scheme = trim(lowercase(energy_convection_scheme))
params%scalar_limiter = trim(lowercase(scalar_limiter))
params%species_time_scheme = trim(lowercase(species_time_scheme))
params%energy_time_scheme = trim(lowercase(energy_time_scheme))
end subroutine read_solver_input