riemann_hll_prim Subroutine

private subroutine riemann_hll_prim(uL, uR, xC, flux_dim, F)

One-face HLL numerical flux from primitive L/R states. takes flux_type(flux_dim,nw_flux) into account (fallback to LLF for selected variables)

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(inout) :: uL(nw_phys)
real(kind=dp), intent(inout) :: uR(nw_phys)
real(kind=dp), intent(in) :: xC(ndim)
integer, intent(in) :: flux_dim
real(kind=dp), intent(out) :: F(nw_flux)

Calls

proc~~riemann_hll_prim~2~~CallsGraph proc~riemann_hll_prim~2 riemann_hll_prim flux_type flux_type proc~riemann_hll_prim~2->flux_type proc~estimate_speeds_minmax~2 estimate_speeds_minmax proc~riemann_hll_prim~2->proc~estimate_speeds_minmax~2 proc~get_flux~2 get_flux proc~riemann_hll_prim~2->proc~get_flux~2 proc~to_conservative~6 to_conservative proc~riemann_hll_prim~2->proc~to_conservative~6 tracer tracer proc~get_flux~2->tracer

Called by

proc~~riemann_hll_prim~2~~CalledByGraph proc~riemann_hll_prim~2 riemann_hll_prim proc~reconflux_muscl_hll_prim~2 reconflux_muscl_hll_prim proc~reconflux_muscl_hll_prim~2->proc~riemann_hll_prim~2 proc~finite_volume_local_muscl_hll~2 finite_volume_local_muscl_hll proc~finite_volume_local_muscl_hll~2->proc~reconflux_muscl_hll_prim~2 proc~finite_volume_local~2 finite_volume_local proc~finite_volume_local~2->proc~finite_volume_local_muscl_hll~2

Source Code

  subroutine riemann_hll_prim(uL, uR, xC, flux_dim, F)
    
    real(dp), intent(inout) :: uL(nw_phys), uR(nw_phys)
    real(dp), intent(in)    :: xC(ndim)
    integer,  intent(in)    :: flux_dim
    real(dp), intent(out)   :: F(nw_flux)

    real(dp) :: flux_l(nw_flux), flux_r(nw_flux)
    real(dp) :: sL, sR, ds, wmax
    real(dp), parameter :: eps = 1e-14_dp
    integer  :: iw

    call get_flux(uL, xC, flux_dim, flux_l)
    call get_flux(uR, xC, flux_dim, flux_r)

    call estimate_speeds_minmax(uL, uR, xC, flux_dim, sL, sR)
    wmax = max(abs(sL), abs(sR))  ! for fallback

    call to_conservative(uL)
    call to_conservative(uR)

    if (sL .ge. 0._dp) then
       F = flux_l
    else if (sR .le. 0._dp) then
       F = flux_r
    else
       ds = sR - sL
       if (ds > eps * (abs(sL) + abs(sR))) then
          F = (sR*flux_l - sL*flux_r + sL*sR*(uR(1:nw_flux) - uL(1:nw_flux))) / ds
       else  ! Fall back to LLF
          F = 0.5_dp * ((flux_l + flux_r) - wmax * (uR(1:nw_flux) - uL(1:nw_flux)))
       end if
    end if
    
    ! overwrite with tvdlf flux if requested (faster this way)
    if ( any(flux_type(flux_dim,:) == flux_tvdlf) ) then
       do iw = 1, nw_flux
          if (flux_type(flux_dim,iw) == flux_tvdlf) then
             F(iw) = 0.5_dp * ((flux_l(iw) + flux_r(iw)) - wmax * (uR(iw) - uL(iw)))
          end if
       end do
    end if

  end subroutine riemann_hll_prim