spx_configuration.f90 Source File


Contents

Source Code


Source Code

!> 配置参数
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