!> 配置参数 module spx_configuration use spx_kinds, only: rk use spx_command_line, only: cli_obj use spx_logger, only: lgr_obj use fffc_module, only: operator(.join.) implicit none private public :: spc_obj, ioc_obj, tic_obj !> sph 参数 type sph_configuration character(64) :: eos_water !! 水的状态方程 character(64) :: eos_air !! 空气的状态方程 logical :: has_gravity !! 是否有重力 logical :: has_viscosity !! 是否有粘性 logical :: has_surface_tension!! 是否有表面张力 logical :: has_artificial_viscosity!! 是否有人工粘性 character(64) :: smoothed_kernel_function !! 平滑核函数 character(64) :: density_summation_method !! 密度求和方法 real(rk) :: c0 !! 人工声速, m/s real(rk) :: k !! 求解域系数 contains procedure :: read => spc_read procedure, private :: print => spc_print end type sph_configuration !> 时间积分参数 type time_integration_configuration real(rk) :: cfl !! CFL 数 real(rk) :: stop_time !! 停止计算时间 real(rk) :: dt !! 输出时间间隔 contains procedure :: read => tic_read procedure, private :: print => tic_print end type time_integration_configuration !> 输入输出控制参数 type io_configuration logical :: is_save_acceleration !! 是否保存加速度 character(64) :: input_file !! 输入文件 character(64) :: output_file !! 输出文件 contains procedure :: read => ioc_read procedure, private :: print => ioc_print end type io_configuration type(sph_configuration) :: spc_obj !! sph 参数 type(time_integration_configuration) :: tic_obj !! 时间积分参数 type(io_configuration) :: ioc_obj !! 输入输出参数 contains !> 读取sph参数 subroutine spc_read(self) class(sph_configuration), intent(inout) :: self integer :: iunit character(64) :: eos_water !! 水的状态方程 character(64) :: eos_air !! 空气的状态方程 logical :: has_gravity !! 是否有重力 logical :: has_viscosity !! 是否有粘性 logical :: has_surface_tension!! 是否有表面张力 logical :: has_artificial_viscosity!! 是否有人工粘性 character(64) :: smoothed_kernel_function !! 平滑核函数 character(64) :: density_summation_method !! 密度求和方法 real(rk) :: c0 !! 人工声速, m/s real(rk) :: k !! 求解域系数 namelist /sph/ eos_water, eos_air, has_gravity, has_viscosity, has_surface_tension, & has_artificial_viscosity, smoothed_kernel_function, density_summation_method, c0, k ! 默认值 eos_water = 'tait' eos_air = 'ideal' has_gravity = .true. has_viscosity = .true. has_surface_tension = .true. has_artificial_viscosity = .true. smoothed_kernel_function = 'cubic-spline' density_summation_method = 'denormalized' k = 3.0_rk ! 读取配置文件 open (newunit=iunit, file=cli_obj%working_directory.join.cli_obj%file, & status='old', action='read') read (iunit, nml=sph) close (iunit) ! 赋值 self%eos_water = eos_water self%eos_air = eos_air self%has_gravity = has_gravity self%has_viscosity = has_viscosity self%has_surface_tension = has_surface_tension self%has_artificial_viscosity = has_artificial_viscosity self%smoothed_kernel_function = smoothed_kernel_function self%density_summation_method = density_summation_method self%c0 = c0 self%k = k if (cli_obj%debug_mode) call self%print() end subroutine spc_read !> 读取时间积分参数 subroutine tic_read(self) class(time_integration_configuration), intent(inout) :: self integer :: iunit real(rk) :: cfl !! CFL 数 real(rk) :: stop_time !! 停止计算时间 real(rk) :: dt !! 输出时间间隔 namelist /time_integration/ cfl, stop_time, dt ! 默认值 cfl = 0.3_rk stop_time = 1.0_rk dt = 0.5_rk open (newunit=iunit, file=cli_obj%working_directory.join.cli_obj%file, & status='old', action='read') read (iunit, nml=time_integration) close (iunit) self%cfl = cfl self%stop_time = stop_time self%dt = dt if (cli_obj%debug_mode) call self%print() end subroutine tic_read !> 读取输入输出参数 subroutine ioc_read(self) class(io_configuration), intent(inout) :: self integer :: iunit logical :: is_save_acceleration !! 是否保存加速度 character(64) :: input_file !! 输入文件 character(64) :: output_file !! 输出文件 namelist /io/ is_save_acceleration, input_file, output_file is_save_acceleration = .false. input_file = 'pif.h5part' output_file = 'pif--out.h5part' open (newunit=iunit, file=cli_obj%working_directory.join.cli_obj%file, & status='old', action='read') read (iunit, nml=io) close (iunit) self%is_save_acceleration = is_save_acceleration self%input_file = input_file self%output_file = output_file if (cli_obj%debug_mode) call self%print() end subroutine ioc_read !> 打印sph参数 subroutine spc_print(self) class(sph_configuration), intent(in) :: self write (lgr_obj%unit, lgr_obj%fmt) 'eos_water', trim(self%eos_water) write (lgr_obj%unit, lgr_obj%fmt) 'eos_air', trim(self%eos_air) write (lgr_obj%unit, lgr_obj%fmt) 'has_gravity', self%has_gravity write (lgr_obj%unit, lgr_obj%fmt) 'has_viscosity', self%has_viscosity write (lgr_obj%unit, lgr_obj%fmt) 'has_surface_tension', self%has_surface_tension write (lgr_obj%unit, lgr_obj%fmt) 'has_artificial_viscosity', self%has_artificial_viscosity write (lgr_obj%unit, lgr_obj%fmt) 'smoothed_kernel_function', trim(self%smoothed_kernel_function) write (lgr_obj%unit, lgr_obj%fmt) 'density_summation_method', trim(self%density_summation_method) write (lgr_obj%unit, lgr_obj%fmt) 'c0', self%c0 write (lgr_obj%unit, lgr_obj%fmt) 'k', self%k end subroutine spc_print !> 打印时间积分参数 subroutine tic_print(self) class(time_integration_configuration), intent(in) :: self write (lgr_obj%unit, lgr_obj%fmt) 'cfl', self%cfl write (lgr_obj%unit, lgr_obj%fmt) 'stop_time', self%stop_time write (lgr_obj%unit, lgr_obj%fmt) 'dt', self%dt end subroutine tic_print !> 打印输入输出参数 subroutine ioc_print(self) class(io_configuration), intent(in) :: self write (lgr_obj%unit, lgr_obj%fmt) 'is_save_acceleration', self%is_save_acceleration write (lgr_obj%unit, lgr_obj%fmt) 'input_file', self%input_file write (lgr_obj%unit, lgr_obj%fmt) 'output_file', self%output_file end subroutine ioc_print end module spx_configuration