INTERPOLATIONS: Fix MLP limiting.

We should take half of the TVD limited derivatives in order to compare
properly with the high order interpolated derivative. Fix it.

Also, TVD limit both states if the high order interpolation of any of
them overshoot.

Signed-off-by: Grzegorz Kowal <grzegorz@amuncode.org>
This commit is contained in:
Grzegorz Kowal 2017-04-05 10:23:15 -03:00
parent b4b72a783d
commit b41b5a000b

View File

@ -1136,16 +1136,16 @@ module interpolations
!
dql(1) = q(i ,j,k) - q(im1,j,k)
dqr(1) = q(ip1,j,k) - q(i ,j,k)
dq (1) = minmod(dql(1), dqr(1))
dq (1) = limiter_minmod(0.5d+00, dql(1), dqr(1))
dql(2) = q(i,j ,k) - q(i,jm1,k)
dqr(2) = q(i,jp1,k) - q(i,j ,k)
dq (2) = minmod(dql(2), dqr(2))
dq (2) = limiter_minmod(0.5d+00, dql(2), dqr(2))
#if NDIMS == 3
dql(3) = q(i,j,k ) - q(i,j,km1)
dqr(3) = q(i,j,kp1) - q(i,j,k )
dq (3) = minmod(dql(3), dqr(3))
dq (3) = limiter_minmod(0.5d+00, dql(3), dqr(3))
#endif /* NDIMS == 3 */
! calculate dqc
@ -1199,31 +1199,34 @@ module interpolations
do m = 1, NDIMS
dq(m) = sign(ap(m), dq(m))
end do
end if
! calculate the limited variable increments
!
dql(1) = minmod(dq(1), qi(i ,j,k,1,1) - q(i,j,k))
dqr(1) = minmod(dq(1), - qi(im1,j,k,2,1) + q(i,j,k))
dql(2) = minmod(dq(2), qi(i,j ,k,1,2) - q(i,j,k))
dqr(2) = minmod(dq(2), - qi(i,jm1,k,2,2) + q(i,j,k))
#if NDIMS == 3
dql(3) = minmod(dq(3), qi(i,j,k ,1,3) - q(i,j,k))
dqr(3) = minmod(dq(3), - qi(i,j,km1,2,3) + q(i,j,k))
#endif /* NDIMS == 3 */
! update the interpolated states
!
qi(i ,j,k,1,1) = q(i,j,k) + dql(1)
qi(im1,j,k,2,1) = q(i,j,k) - dqr(1)
dql(1) = qi(i ,j,k,1,1) - q(i,j,k)
dqr(1) = qi(im1,j,k,2,1) - q(i,j,k)
if (max(abs(dql(1)), abs(dqr(1))) > abs(dq(1))) then
qi(i ,j,k,1,1) = q(i,j,k) + dq(1)
qi(im1,j,k,2,1) = q(i,j,k) - dq(1)
end if
dql(2) = qi(i,j ,k,1,2) - q(i,j,k)
dqr(2) = qi(i,jm1,k,2,2) - q(i,j,k)
if (max(abs(dql(2)), abs(dqr(2))) > abs(dq(2))) then
qi(i,j ,k,1,2) = q(i,j,k) + dq(2)
qi(i,jm1,k,2,2) = q(i,j,k) - dq(2)
end if
qi(i,j ,k,1,2) = q(i,j,k) + dql(2)
qi(i,jm1,k,2,2) = q(i,j,k) - dqr(2)
#if NDIMS == 3
qi(i,j,k ,1,3) = q(i,j,k) + dql(3)
qi(i,j,km1,2,3) = q(i,j,k) - dqr(3)
dql(3) = qi(i,j,k ,1,3) - q(i,j,k))
dqr(3) = qi(i,j,km1,2,3) - q(i,j,k))
if (max(abs(dql(3)), abs(dqr(3))) > abs(dq(3))) then
qi(i,j,k ,1,3) = q(i,j,k) + dq(3)
qi(i,j,km1,2,3) = q(i,j,k) - dq(3)
end if
#endif /* NDIMS == 3 */
end if
end do ! i = ibl, ieu
end do ! j = jbl, jeu
end do ! k = kbl, keu