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