compute_tvd_limited_correction Function

private function compute_tvd_limited_correction(limiter, phi_cell, phi_nb, grad_corr) result(corr)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: limiter
real(kind=rk), intent(in) :: phi_cell
real(kind=rk), intent(in) :: phi_nb
real(kind=rk), intent(in) :: grad_corr

Return Value real(kind=rk)


Source Code

   real(rk) function compute_tvd_limited_correction(limiter, phi_cell, phi_nb, grad_corr) result(corr)
      character(len=*), intent(in) :: limiter
      real(rk), intent(in) :: phi_cell, phi_nb, grad_corr

      real(rk) :: theta, psi, eps, denom

      eps = 1.0e-14_rk
      denom = 2.0_rk * grad_corr
      
      if (abs(denom) < eps) then
         corr = 0.0_rk
         return
      end if
      
      theta = (phi_nb - phi_cell) / denom
      
      select case (trim(limiter))
      case ('minmod')
         psi = max(0.0_rk, min(1.0_rk, theta))
      case ('vanleer', 'van_leer')
         psi = (theta + abs(theta)) / (1.0_rk + abs(theta))
      case ('superbee')
         psi = max(0.0_rk, max(min(2.0_rk*theta, 1.0_rk), min(theta, 2.0_rk)))
      case ('mc', 'monotonized_central')
         psi = max(0.0_rk, min(2.0_rk, min(2.0_rk*theta, 0.5_rk*(1.0_rk + theta))))
      case default
         psi = 1.0_rk
      end select
      
      corr = psi * grad_corr
   end function compute_tvd_limited_correction