estimate_speeds_minmax Subroutine

private subroutine estimate_speeds_minmax(uL, uR, xC, flux_dim, wL, wR)

Davis (1988) min/max wave speed estimates wL = min(v_n - c_f), wR = max(v_n + c_f) (fast magnetosonic) over left/right states; used in HLL flux estimation.

Arguments

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

Called by

proc~~estimate_speeds_minmax~3~~CalledByGraph proc~estimate_speeds_minmax~3 estimate_speeds_minmax proc~riemann_hll_prim~3 riemann_hll_prim proc~riemann_hll_prim~3->proc~estimate_speeds_minmax~3 proc~reconflux_muscl_hll_prim~3 reconflux_muscl_hll_prim proc~reconflux_muscl_hll_prim~3->proc~riemann_hll_prim~3 proc~finite_volume_local_muscl_hll~3 finite_volume_local_muscl_hll proc~finite_volume_local_muscl_hll~3->proc~reconflux_muscl_hll_prim~3 proc~finite_volume_local~3 finite_volume_local proc~finite_volume_local~3->proc~finite_volume_local_muscl_hll~3

Source Code

subroutine estimate_speeds_minmax(uL, uR, xC, flux_dim, wL, wR)
  
  real(dp), intent(in)  :: uL(nw_phys), uR(nw_phys)
  real(dp), intent(in)  :: xC(ndim)
  integer, intent(in)   :: flux_dim
  real(dp), intent(out) :: wL, wR

  real(dp) :: inv_rho, cs2, cA2, cAn2, sum2, discriminant, cfL, cfR

  ! Left state
  inv_rho = 1.0_dp / uL(iw_rho)
  cs2 = mhd_gamma * uL(iw_e) * inv_rho
  cA2 = (uL(iw_mag(1))**2 + uL(iw_mag(2))**2 + uL(iw_mag(3))**2) * inv_rho
  cAn2 = uL(iw_mag(flux_dim))**2 * inv_rho
  sum2 = cs2 + cA2
  discriminant = max(sum2**2 - 4.0_dp*cs2*cAn2, 0.0_dp)
  cfL = sqrt(0.5_dp * (sum2 + sqrt(discriminant)))

  ! Right state
  inv_rho = 1.0_dp / uR(iw_rho)
  cs2 = mhd_gamma * uR(iw_e) * inv_rho
  cA2 = (uR(iw_mag(1))**2 + uR(iw_mag(2))**2 + uR(iw_mag(3))**2) * inv_rho
  cAn2 = uR(iw_mag(flux_dim))**2 * inv_rho
  sum2 = cs2 + cA2
  discriminant = max(sum2**2 - 4.0_dp*cs2*cAn2, 0.0_dp)
  cfR = sqrt(0.5_dp * (sum2 + sqrt(discriminant)))
  
  wL = min(uL(iw_mom(flux_dim)) - cfL, uR(iw_mom(flux_dim)) - cfR)
  wR = max(uL(iw_mom(flux_dim)) + cfL, uR(iw_mom(flux_dim)) + cfR)

end subroutine estimate_speeds_minmax