foreseer_test_shock_tube Program

program~~foreseer_test_shock_tube~~UsesGraph program~foreseer_test_shock_tube foreseer_test_shock_tube module~foreseer_euler_1d foreseer_euler_1d module~foreseer_euler_1d->program~foreseer_test_shock_tube foodie foodie foodie->program~foreseer_test_shock_tube foodie->module~foreseer_euler_1d module~foreseer foreseer module~foreseer->program~foreseer_test_shock_tube module~foreseer->module~foreseer_euler_1d flap flap flap->program~foreseer_test_shock_tube penf penf penf->program~foreseer_test_shock_tube penf->module~foreseer_euler_1d module~foreseer_eos_object foreseer_eos_object penf->module~foreseer_eos_object module~foreseer_riemann_solver_compressible_hllc foreseer_riemann_solver_compressible_hllc penf->module~foreseer_riemann_solver_compressible_hllc module~foreseer_primitive_object foreseer_primitive_object penf->module~foreseer_primitive_object module~foreseer_riemann_solver_compressible_llf foreseer_riemann_solver_compressible_llf penf->module~foreseer_riemann_solver_compressible_llf module~foreseer_compressible_transformations foreseer_compressible_transformations penf->module~foreseer_compressible_transformations module~foreseer_riemann_solver_object foreseer_riemann_solver_object penf->module~foreseer_riemann_solver_object module~foreseer_eos_compressible foreseer_eos_compressible penf->module~foreseer_eos_compressible module~foreseer_conservative_object foreseer_conservative_object penf->module~foreseer_conservative_object module~foreseer_riemann_solver_compressible_exact foreseer_riemann_solver_compressible_exact penf->module~foreseer_riemann_solver_compressible_exact module~foreseer_conservative_compressible foreseer_conservative_compressible penf->module~foreseer_conservative_compressible module~foreseer_riemann_pattern_compressible_pvl foreseer_riemann_pattern_compressible_pvl penf->module~foreseer_riemann_pattern_compressible_pvl module~foreseer_riemann_solver_compressible_roe foreseer_riemann_solver_compressible_roe penf->module~foreseer_riemann_solver_compressible_roe module~foreseer_primitive_compressible foreseer_primitive_compressible penf->module~foreseer_primitive_compressible module~foreseer_riemann_solver_compressible_pvl foreseer_riemann_solver_compressible_pvl penf->module~foreseer_riemann_solver_compressible_pvl module~foreseer_riemann_pattern_compressible_object foreseer_riemann_pattern_compressible_object penf->module~foreseer_riemann_pattern_compressible_object vecfor vecfor vecfor->program~foreseer_test_shock_tube vecfor->module~foreseer_euler_1d vecfor->module~foreseer_riemann_solver_compressible_hllc vecfor->module~foreseer_primitive_object vecfor->module~foreseer_riemann_solver_compressible_llf vecfor->module~foreseer_compressible_transformations vecfor->module~foreseer_riemann_solver_object module~foreseer_riemann_pattern_object foreseer_riemann_pattern_object vecfor->module~foreseer_riemann_pattern_object vecfor->module~foreseer_conservative_object vecfor->module~foreseer_riemann_solver_compressible_exact vecfor->module~foreseer_conservative_compressible vecfor->module~foreseer_riemann_pattern_compressible_pvl vecfor->module~foreseer_riemann_solver_compressible_roe vecfor->module~foreseer_primitive_compressible vecfor->module~foreseer_riemann_solver_compressible_pvl vecfor->module~foreseer_riemann_pattern_compressible_object wenoof wenoof wenoof->module~foreseer_euler_1d iso_fortran_env iso_fortran_env iso_fortran_env->module~foreseer_euler_1d iso_fortran_env->module~foreseer_eos_compressible iso_fortran_env->module~foreseer_conservative_compressible iso_fortran_env->module~foreseer_primitive_compressible module~foreseer_eos_object->module~foreseer module~foreseer_eos_object->module~foreseer_riemann_solver_compressible_hllc module~foreseer_eos_object->module~foreseer_primitive_object module~foreseer_eos_object->module~foreseer_riemann_solver_compressible_llf module~foreseer_eos_object->module~foreseer_compressible_transformations module~foreseer_eos_object->module~foreseer_riemann_solver_object module~foreseer_eos_object->module~foreseer_riemann_pattern_object module~foreseer_eos_object->module~foreseer_eos_compressible module~foreseer_eos_object->module~foreseer_conservative_object module~foreseer_eos_object->module~foreseer_riemann_solver_compressible_exact module~foreseer_eos_object->module~foreseer_conservative_compressible module~foreseer_eos_object->module~foreseer_riemann_pattern_compressible_pvl module~foreseer_eos_object->module~foreseer_riemann_solver_compressible_roe module~foreseer_eos_object->module~foreseer_primitive_compressible module~foreseer_eos_object->module~foreseer_riemann_solver_compressible_pvl module~foreseer_eos_object->module~foreseer_riemann_pattern_compressible_object module~foreseer_riemann_solver_compressible_hllc->module~foreseer module~foreseer_primitive_object->module~foreseer module~foreseer_primitive_object->module~foreseer_primitive_compressible module~foreseer_riemann_solver_compressible_llf->module~foreseer module~foreseer_compressible_transformations->module~foreseer module~foreseer_riemann_solver_object->module~foreseer module~foreseer_riemann_solver_object->module~foreseer_riemann_solver_compressible_hllc module~foreseer_riemann_solver_object->module~foreseer_riemann_solver_compressible_llf module~foreseer_riemann_solver_object->module~foreseer_riemann_solver_compressible_exact module~foreseer_riemann_solver_object->module~foreseer_riemann_solver_compressible_roe module~foreseer_riemann_solver_object->module~foreseer_riemann_solver_compressible_pvl module~foreseer_riemann_pattern_object->module~foreseer module~foreseer_riemann_pattern_object->module~foreseer_riemann_pattern_compressible_object module~foreseer_eos_compressible->module~foreseer module~foreseer_eos_compressible->module~foreseer_riemann_solver_compressible_roe module~foreseer_eos_compressible->module~foreseer_riemann_pattern_compressible_object module~foreseer_conservative_object->module~foreseer module~foreseer_conservative_object->module~foreseer_riemann_solver_compressible_hllc module~foreseer_conservative_object->module~foreseer_riemann_solver_compressible_llf module~foreseer_conservative_object->module~foreseer_riemann_solver_object module~foreseer_conservative_object->module~foreseer_riemann_pattern_object module~foreseer_conservative_object->module~foreseer_riemann_solver_compressible_exact module~foreseer_conservative_object->module~foreseer_conservative_compressible module~foreseer_conservative_object->module~foreseer_riemann_pattern_compressible_pvl module~foreseer_conservative_object->module~foreseer_riemann_solver_compressible_roe module~foreseer_conservative_object->module~foreseer_riemann_solver_compressible_pvl module~foreseer_conservative_object->module~foreseer_riemann_pattern_compressible_object module~foreseer_riemann_solver_compressible_exact->module~foreseer module~foreseer_conservative_compressible->module~foreseer module~foreseer_conservative_compressible->module~foreseer_riemann_solver_compressible_hllc module~foreseer_conservative_compressible->module~foreseer_riemann_solver_compressible_llf module~foreseer_conservative_compressible->module~foreseer_compressible_transformations module~foreseer_conservative_compressible->module~foreseer_riemann_solver_compressible_exact module~foreseer_conservative_compressible->module~foreseer_riemann_solver_compressible_roe module~foreseer_conservative_compressible->module~foreseer_riemann_solver_compressible_pvl module~foreseer_conservative_compressible->module~foreseer_riemann_pattern_compressible_object module~foreseer_riemann_pattern_compressible_pvl->module~foreseer module~foreseer_riemann_pattern_compressible_pvl->module~foreseer_riemann_solver_compressible_hllc module~foreseer_riemann_pattern_compressible_pvl->module~foreseer_riemann_solver_compressible_llf module~foreseer_riemann_pattern_compressible_pvl->module~foreseer_riemann_solver_compressible_exact module~foreseer_riemann_pattern_compressible_pvl->module~foreseer_riemann_solver_compressible_roe module~foreseer_riemann_pattern_compressible_pvl->module~foreseer_riemann_solver_compressible_pvl module~foreseer_riemann_solver_compressible_roe->module~foreseer module~foreseer_primitive_compressible->module~foreseer module~foreseer_primitive_compressible->module~foreseer_compressible_transformations module~foreseer_riemann_solver_compressible_pvl->module~foreseer module~foreseer_riemann_pattern_compressible_object->module~foreseer module~foreseer_riemann_pattern_compressible_object->module~foreseer_riemann_pattern_compressible_pvl
Help


FORESEER test: shock tube tester, 1D Euler equation.

Calls

program~~foreseer_test_shock_tube~~CallsGraph program~foreseer_test_shock_tube foreseer_test_shock_tube proc~parse_command_line_interface parse_command_line_interface program~foreseer_test_shock_tube->proc~parse_command_line_interface str str program~foreseer_test_shock_tube->str proc~initialize~10 initialize program~foreseer_test_shock_tube->proc~initialize~10 proc~save_time_serie save_time_serie program~foreseer_test_shock_tube->proc~save_time_serie cton cton proc~parse_command_line_interface->cton proc~save_time_serie->str proc~conservative_to_primitive_compressible conservative_to_primitive_compressible proc~save_time_serie->proc~conservative_to_primitive_compressible
Help


Variables

Type AttributesNameInitial
character(len=3) :: BC_L

Left boundary condition type.

character(len=3) :: BC_R

Right boundary condition type.

real(kind=R8P) :: CFL

CFL value.

real(kind=R8P) :: Dx

Space step discretization.

integer(kind=I4P) :: Ni

Number of grid cells.

type(euler_1d) :: domain

Domain of Euler equations.

real(kind=R8P) :: dt

Time step.

logical :: results

Flag for activating results saving.

character(len=99), allocatable:: riemann_solver_schemes(:)

Riemann Problem solver scheme(s).

type(tvd_runge_kutta_integrator) :: rk_integrator

Runge-Kutta integrator.

type(euler_1d), allocatable:: rk_stage(:)

Runge-Kutta stages.

integer(kind=I4P) :: rk_stages_number

Runge-Kutta stages number.

integer(kind=I4P) :: s

Schemes counter.

character(len=99) :: s_scheme

Space integration scheme.

integer(kind=I4P) :: step

Time steps counter.

integer(kind=I4P) :: steps_max

Maximum number of time steps.

real(kind=R8P) :: t

Time.

real(kind=R8P) :: t_max

Maximum integration time.

character(len=99) :: t_scheme

Time integration scheme.

logical :: time_serie

Flag for activating time serie-results saving.

logical :: verbose

Flag for activating more verbose output.

integer(kind=I4P) :: weno_order

WENO reconstruction order.

character(len=:), allocatable:: weno_variables

Variables set on which WENO reconstruction is done.

real(kind=R8P), allocatable:: x(:)

Cell center x-abscissa values.


Subroutines

subroutine initialize(riemann_solver_scheme)

Initialize the test.

Arguments

Type IntentOptional AttributesName
character(len=*), intent(in) :: riemann_solver_scheme

Riemann Problem solver scheme.

Parse Command Line Interface (CLI).

Arguments

None

subroutine save_time_serie(filename, finish, t)

Save time-serie results.

Arguments

Type IntentOptional AttributesName
character(len=*), intent(in), optional :: filename

Output filename.

logical, intent(in), optional :: finish

Flag for triggering the file closing.

real(kind=R8P), intent(in) :: t

Current integration time.

Source Code

program foreseer_test_shock_tube
!< FORESEER test: shock tube tester, 1D Euler equation.

use flap, only : command_line_interface
use foodie, only : tvd_runge_kutta_integrator
use foreseer, only : conservative_compressible, primitive_compressible,         &
                     conservative_to_primitive_compressible, primitive_to_conservative_compressible, &
                     eos_compressible
use foreseer_euler_1d, only : euler_1d
use penf, only : cton, FR8P, I4P, R8P, str
use vecfor, only : ex, vector

implicit none
integer(I4P)                     :: weno_order                !< WENO reconstruction order.
character(len=:), allocatable    :: weno_variables            !< Variables set on which WENO reconstruction is done.
type(tvd_runge_kutta_integrator) :: rk_integrator             !< Runge-Kutta integrator.
integer(I4P)                     :: rk_stages_number          !< Runge-Kutta stages number.
type(euler_1d), allocatable      :: rk_stage(:)               !< Runge-Kutta stages.
real(R8P)                        :: dt                        !< Time step.
real(R8P)                        :: t                         !< Time.
integer(I4P)                     :: step                      !< Time steps counter.
type(euler_1d)                   :: domain                    !< Domain of Euler equations.
real(R8P)                        :: CFL                       !< CFL value.
character(3)                     :: BC_L                      !< Left boundary condition type.
character(3)                     :: BC_R                      !< Right boundary condition type.
integer(I4P)                     :: Ni                        !< Number of grid cells.
real(R8P)                        :: Dx                        !< Space step discretization.
real(R8P), allocatable           :: x(:)                      !< Cell center x-abscissa values.
integer(I4P)                     :: steps_max                 !< Maximum number of time steps.
real(R8P)                        :: t_max                     !< Maximum integration time.
character(99), allocatable       :: riemann_solver_schemes(:) !< Riemann Problem solver scheme(s).
character(99)                    :: s_scheme                  !< Space integration scheme.
character(99)                    :: t_scheme                  !< Time integration scheme.
logical                          :: results                   !< Flag for activating results saving.
logical                          :: time_serie                !< Flag for activating time serie-results saving.
logical                          :: verbose                   !< Flag for activating more verbose output.
integer(I4P)                     :: s                         !< Schemes counter.

call parse_command_line_interface
do s=1, size(riemann_solver_schemes, dim=1)
   if (verbose) print "(A)", 'Use Riemann Problem solver "'//trim(adjustl(riemann_solver_schemes(s)))//'"'
   call initialize(riemann_solver_scheme=riemann_solver_schemes(s))
   call save_time_serie(filename='euler_1D-'//&
                                 trim(adjustl(s_scheme))//'-'//&
                                 trim(adjustl(t_scheme))//'-'//&
                                 trim(adjustl(riemann_solver_schemes(s)))//'.dat', t=t)
   step = 0
   time_loop: do
      step = step + 1
      dt = domain%dt(steps_max=steps_max, t_max=t_max, t=t, CFL=CFL)
      call rk_integrator%integrate(U=domain, stage=rk_stage, dt=dt, t=t)
      t = t + dt
      call save_time_serie(t=t)
      if (verbose) print "(A)", 'step = '//str(n=step)//', time step = '//str(n=dt)//', time = '//str(n=t)
      if ((t == t_max).or.(step == steps_max)) exit time_loop
   enddo time_loop
enddo

contains
   subroutine initialize(riemann_solver_scheme)
   !< Initialize the test.
   character(*), intent(in)                  :: riemann_solver_scheme !< Riemann Problem solver scheme.
   type(primitive_compressible), allocatable :: initial_state(:)      !< Initial state of primitive variables.
   integer(I4P)                              :: i                     !< Space counter.

   if (allocated(rk_stage)) deallocate(rk_stage) ; allocate(rk_stage(1:rk_stages_number))
   call rk_integrator%init(stages=rk_stages_number)
   t = 0._R8P
   if (allocated(x)) deallocate(x) ; allocate(x(1:Ni))
   if (allocated(initial_state)) deallocate(initial_state) ; allocate(initial_state(1:Ni))
   Dx = 1._R8P / Ni
   ! Sod's problem
   BC_L = 'TRA'
   BC_R = 'TRA'
   do i=1, Ni / 2
      x(i) = Dx * i - 0.5_R8P * Dx
      initial_state(i)%density  = 1._R8P
      initial_state(i)%velocity = 0._R8P
      initial_state(i)%pressure = 1._R8P
   enddo
   do i=Ni / 2 + 1, Ni
      x(i) = Dx * i - 0.5_R8P * Dx
      initial_state(i)%density  = 0.125_R8P
      initial_state(i)%velocity = 0._R8P
      initial_state(i)%pressure = 0.1_R8P
   enddo
   call domain%initialize(Ni=Ni, Dx=Dx,                                         &
                          BC_L=BC_L, BC_R=BC_R,                                 &
                          initial_state=initial_state,                          &
                          eos=eos_compressible(cp=1040.004_R8P, cv=742.86_R8P), &
                          weno_order=weno_order,                                &
                          weno_variables=weno_variables,                        &
                          riemann_solver_scheme=riemann_solver_scheme)
   endsubroutine initialize

   subroutine parse_command_line_interface()
   !< Parse Command Line Interface (CLI).
   type(command_line_interface)  :: cli                   !< Command line interface handler.
   character(99)                 :: riemann_solver_scheme !< Riemann Problem solver scheme.
   integer(I4P)                  :: error                 !< Error handler.
   character(len=:), allocatable :: buffer                !< String buffer.

   call cli%init(description = 'FORESEER test: shock tube tester, 1D Euler equations', &
                 examples    = ["foreseer_test_shock_tube         ",                   &
                                "foreseer_test_shock_tube --tserie"])
   call cli%add(switch='--Ni', help='Number finite volumes used', required=.false., act='store', def='100')
   call cli%add(switch='--steps', help='Number time steps performed', required=.false., act='store', def='60')
   call cli%add(switch='--t-max', help='Maximum integration time', required=.false., act='store', def='0.')
   call cli%add(switch='--riemann', help='Riemann Problem solver', required=.false., act='store', def='all', &
                choices='all,exact,hllc,llf,pvl,roe')
   call cli%add(switch='--s-scheme', help='Space intergation scheme', required=.false., act='store', def='weno-char-1',           &
     choices='weno-char-1,weno-char-3,weno-char-5,weno-char-7,weno-char-9,weno-char-11,weno-char-13,weno-char-15,weno-char-17,'// &
             'weno-cons-1,weno-cons-3,weno-cons-5,weno-cons-7,weno-cons-9,weno-cons-11,weno-cons-13,weno-cons-15,weno-cons-17,'// &
             'weno-prim-1,weno-prim-3,weno-prim-5,weno-prim-7,weno-prim-9,weno-prim-11,weno-prim-13,weno-prim-15,weno-prim-17')
   call cli%add(switch='--t-scheme', help='Time intergation scheme', required=.false., act='store', def='tvd-rk-1', &
                choices='tvd-rk-1,tvd-rk-2,tvd-rk-3,tvd-rk-5')
   call cli%add(switch='--cfl', help='CFL value', required=.false., act='store', def='0.7')
   call cli%add(switch='--tserie', switch_ab='-t', help='Save time-serie-result', required=.false., act='store_true', def='.false.')
   call cli%add(switch='--verbose', help='Verbose output', required=.false., act='store_true', def='.false.')
   call cli%parse(error=error)
   call cli%get(switch='--Ni',       val=Ni,                    error=error) ; if (error/=0) stop
   call cli%get(switch='--steps',    val=steps_max,             error=error) ; if (error/=0) stop
   call cli%get(switch='--t-max',    val=t_max,                 error=error) ; if (error/=0) stop
   call cli%get(switch='--riemann',  val=riemann_solver_scheme, error=error) ; if (error/=0) stop
   call cli%get(switch='--s-scheme', val=s_scheme,              error=error) ; if (error/=0) stop
   call cli%get(switch='--t-scheme', val=t_scheme,              error=error) ; if (error/=0) stop
   call cli%get(switch='--cfl',      val=CFL,                   error=error) ; if (error/=0) stop
   call cli%get(switch='--tserie',   val=time_serie,            error=error) ; if (error/=0) stop
   call cli%get(switch='--verbose',  val=verbose,               error=error) ; if (error/=0) stop

   if (t_max > 0._R8P) steps_max = 0

   buffer = trim(adjustl(s_scheme))
   select case(buffer(6:9))
   case('char')
      weno_variables = 'characteristic'
   case('cons')
      weno_variables = 'conservative'
   case('prim')
      weno_variables = 'primitive'
   endselect
   weno_order = cton(buffer(11:), knd=1_I4P)

   select case(trim(adjustl(t_scheme)))
   case('tvd-rk-1')
      rk_stages_number = 1
   case('tvd-rk-2')
      rk_stages_number = 2
   case('tvd-rk-3')
      rk_stages_number = 3
   case('tvd-rk-5')
      rk_stages_number = 5
   endselect

   if (trim(adjustl(riemann_solver_scheme))=='all') then
      riemann_solver_schemes = ['exact', 'hllc ', 'llf  ', 'pvl  ', 'roe  ']
   else
      riemann_solver_schemes = [trim(adjustl(riemann_solver_scheme))]
   endif
   endsubroutine parse_command_line_interface

   subroutine save_time_serie(filename, finish, t)
   !< Save time-serie results.
   character(*), intent(in), optional :: filename  !< Output filename.
   logical,      intent(in), optional :: finish    !< Flag for triggering the file closing.
   real(R8P),    intent(in)           :: t         !< Current integration time.
   integer(I4P), save                 :: tsfile    !< File unit for saving time serie results.
   type(primitive_compressible)       :: primitive !< Primitive variables.
   integer(I4P)                       :: i         !< Counter.

   if (time_serie) then
      if (present(filename)) then
         open(newunit=tsfile, file=filename)
      endif
      write(tsfile, '(A)')'VARIABLES = "x" "rho" "u" "p"'
      write(tsfile, '(A)')'ZONE T="'//str(n=t)//'"'
      do i=1, Ni
         primitive = conservative_to_primitive_compressible(conservative=domain%U(i), eos=domain%eos)
         write(tsfile, '(4'//'('//FR8P//',1X))')x(i), primitive%density, primitive%velocity%x, primitive%pressure
      enddo
      if (present(finish)) then
         if (finish) close(tsfile)
      endif
   endif
   endsubroutine save_time_serie
endprogram foreseer_test_shock_tube