koren Function

private pure function koren(a, b)

Modified implementation of Koren limiter, to avoid division and the min/max functions, which can be problematic / expensive. In most literature, you have r = a / b (ratio of gradients). Then the limiter phi(r) is multiplied with b. With this implementation, you get phi(r) * b

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: a

Density gradient (numerator)

real(kind=dp), intent(in) :: b

Density gradient (denominator)

Return Value real(kind=dp)


Called by

proc~~koren~~CalledByGraph proc~koren koren proc~muscl_reconstruct_prim muscl_reconstruct_prim proc~muscl_reconstruct_prim->proc~koren proc~reconflux_muscl_hll_prim reconflux_muscl_hll_prim proc~reconflux_muscl_hll_prim->proc~muscl_reconstruct_prim proc~reconflux_muscl_hllc_prim reconflux_muscl_hllc_prim proc~reconflux_muscl_hllc_prim->proc~muscl_reconstruct_prim proc~reconflux_muscl_llf_prim reconflux_muscl_llf_prim proc~reconflux_muscl_llf_prim->proc~muscl_reconstruct_prim proc~finite_volume_local_muscl_hll finite_volume_local_muscl_hll proc~finite_volume_local_muscl_hll->proc~reconflux_muscl_hll_prim proc~finite_volume_local_muscl_hllc finite_volume_local_muscl_hllc proc~finite_volume_local_muscl_hllc->proc~reconflux_muscl_hllc_prim proc~finite_volume_local_muscl_llf finite_volume_local_muscl_llf proc~finite_volume_local_muscl_llf->proc~reconflux_muscl_llf_prim proc~finite_volume_local finite_volume_local proc~finite_volume_local->proc~finite_volume_local_muscl_hll proc~finite_volume_local->proc~finite_volume_local_muscl_hllc proc~finite_volume_local->proc~finite_volume_local_muscl_llf

Source Code

  pure real(dp) function koren(a, b)
    
    real(dp), intent(in) :: a
    !< Density gradient (numerator)
    real(dp), intent(in) :: b
    !< Density gradient (denominator)
    real(dp), parameter  :: third = 1/3.0_dp
    real(dp)             :: aa, ab

    aa = a * a
    ab = a * b

    if (ab <= 0) then
       ! a and b have different sign or one of them is zero, so r is either 0,
       ! inf or negative (special case a == b == 0 is ignored)
       koren = 0
    else if (aa <= 0.25_dp * ab) then
       ! 0 < a/b <= 1/4, limiter has value 2*a/b
       koren = 2*a
    else if (aa <= 2.5_dp * ab) then
       ! 1/4 < a/b <= 2.5, limiter has value (1+2*a/b)/3
       koren = third * (b + 2*a)
    else
       ! (1+2*a/b)/6 >= 1, limiter has value 2
       koren = 2*b
    end if
    
  end function koren