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)
| Type | Intent | Optional | 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) |
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