blob: ebb91a409441e9d30472ced82fd694186158f6fb [file] [log] [blame]
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine rhs
c---------------------------------------------------------------------
c---------------------------------------------------------------------
c---------------------------------------------------------------------
c compute the right hand sides
c---------------------------------------------------------------------
implicit none
include 'applu.incl'
c---------------------------------------------------------------------
c local variables
c---------------------------------------------------------------------
integer i, j, k, m
double precision q
double precision tmp, utmp(6,isiz3), rtmp(5,isiz3)
double precision u21, u31, u41
double precision u21i, u31i, u41i, u51i
double precision u21j, u31j, u41j, u51j
double precision u21k, u31k, u41k, u51k
double precision u21im1, u31im1, u41im1, u51im1
double precision u21jm1, u31jm1, u41jm1, u51jm1
double precision u21km1, u31km1, u41km1, u51km1
if (timeron) call timer_start(t_rhs)
do k = 1, nz
do j = 1, ny
do i = 1, nx
do m = 1, 5
rsd(m,i,j,k) = - frct(m,i,j,k)
end do
tmp = 1.0d+00 / u(1,i,j,k)
rho_i(i,j,k) = tmp
qs(i,j,k) = 0.50d+00 * ( u(2,i,j,k) * u(2,i,j,k)
> + u(3,i,j,k) * u(3,i,j,k)
> + u(4,i,j,k) * u(4,i,j,k) )
> * tmp
end do
end do
end do
if (timeron) call timer_start(t_rhsx)
c---------------------------------------------------------------------
c xi-direction flux differences
c---------------------------------------------------------------------
do k = 2, nz - 1
do j = jst, jend
do i = 1, nx
flux(1,i) = u(2,i,j,k)
u21 = u(2,i,j,k) * rho_i(i,j,k)
q = qs(i,j,k)
flux(2,i) = u(2,i,j,k) * u21 + c2 *
> ( u(5,i,j,k) - q )
flux(3,i) = u(3,i,j,k) * u21
flux(4,i) = u(4,i,j,k) * u21
flux(5,i) = ( c1 * u(5,i,j,k) - c2 * q ) * u21
end do
do i = ist, iend
do m = 1, 5
rsd(m,i,j,k) = rsd(m,i,j,k)
> - tx2 * ( flux(m,i+1) - flux(m,i-1) )
end do
end do
do i = ist, nx
tmp = rho_i(i,j,k)
u21i = tmp * u(2,i,j,k)
u31i = tmp * u(3,i,j,k)
u41i = tmp * u(4,i,j,k)
u51i = tmp * u(5,i,j,k)
tmp = rho_i(i-1,j,k)
u21im1 = tmp * u(2,i-1,j,k)
u31im1 = tmp * u(3,i-1,j,k)
u41im1 = tmp * u(4,i-1,j,k)
u51im1 = tmp * u(5,i-1,j,k)
flux(2,i) = (4.0d+00/3.0d+00) * tx3 * (u21i-u21im1)
flux(3,i) = tx3 * ( u31i - u31im1 )
flux(4,i) = tx3 * ( u41i - u41im1 )
flux(5,i) = 0.50d+00 * ( 1.0d+00 - c1*c5 )
> * tx3 * ( ( u21i **2 + u31i **2 + u41i **2 )
> - ( u21im1**2 + u31im1**2 + u41im1**2 ) )
> + (1.0d+00/6.0d+00)
> * tx3 * ( u21i**2 - u21im1**2 )
> + c1 * c5 * tx3 * ( u51i - u51im1 )
end do
do i = ist, iend
rsd(1,i,j,k) = rsd(1,i,j,k)
> + dx1 * tx1 * ( u(1,i-1,j,k)
> - 2.0d+00 * u(1,i,j,k)
> + u(1,i+1,j,k) )
rsd(2,i,j,k) = rsd(2,i,j,k)
> + tx3 * c3 * c4 * ( flux(2,i+1) - flux(2,i) )
> + dx2 * tx1 * ( u(2,i-1,j,k)
> - 2.0d+00 * u(2,i,j,k)
> + u(2,i+1,j,k) )
rsd(3,i,j,k) = rsd(3,i,j,k)
> + tx3 * c3 * c4 * ( flux(3,i+1) - flux(3,i) )
> + dx3 * tx1 * ( u(3,i-1,j,k)
> - 2.0d+00 * u(3,i,j,k)
> + u(3,i+1,j,k) )
rsd(4,i,j,k) = rsd(4,i,j,k)
> + tx3 * c3 * c4 * ( flux(4,i+1) - flux(4,i) )
> + dx4 * tx1 * ( u(4,i-1,j,k)
> - 2.0d+00 * u(4,i,j,k)
> + u(4,i+1,j,k) )
rsd(5,i,j,k) = rsd(5,i,j,k)
> + tx3 * c3 * c4 * ( flux(5,i+1) - flux(5,i) )
> + dx5 * tx1 * ( u(5,i-1,j,k)
> - 2.0d+00 * u(5,i,j,k)
> + u(5,i+1,j,k) )
end do
c---------------------------------------------------------------------
c Fourth-order dissipation
c---------------------------------------------------------------------
do m = 1, 5
rsd(m,2,j,k) = rsd(m,2,j,k)
> - dssp * ( + 5.0d+00 * u(m,2,j,k)
> - 4.0d+00 * u(m,3,j,k)
> + u(m,4,j,k) )
rsd(m,3,j,k) = rsd(m,3,j,k)
> - dssp * ( - 4.0d+00 * u(m,2,j,k)
> + 6.0d+00 * u(m,3,j,k)
> - 4.0d+00 * u(m,4,j,k)
> + u(m,5,j,k) )
end do
do i = 4, nx - 3
do m = 1, 5
rsd(m,i,j,k) = rsd(m,i,j,k)
> - dssp * ( u(m,i-2,j,k)
> - 4.0d+00 * u(m,i-1,j,k)
> + 6.0d+00 * u(m,i,j,k)
> - 4.0d+00 * u(m,i+1,j,k)
> + u(m,i+2,j,k) )
end do
end do
do m = 1, 5
rsd(m,nx-2,j,k) = rsd(m,nx-2,j,k)
> - dssp * ( u(m,nx-4,j,k)
> - 4.0d+00 * u(m,nx-3,j,k)
> + 6.0d+00 * u(m,nx-2,j,k)
> - 4.0d+00 * u(m,nx-1,j,k) )
rsd(m,nx-1,j,k) = rsd(m,nx-1,j,k)
> - dssp * ( u(m,nx-3,j,k)
> - 4.0d+00 * u(m,nx-2,j,k)
> + 5.0d+00 * u(m,nx-1,j,k) )
end do
end do
end do
if (timeron) call timer_stop(t_rhsx)
if (timeron) call timer_start(t_rhsy)
c---------------------------------------------------------------------
c eta-direction flux differences
c---------------------------------------------------------------------
do k = 2, nz - 1
do i = ist, iend
do j = 1, ny
flux(1,j) = u(3,i,j,k)
u31 = u(3,i,j,k) * rho_i(i,j,k)
q = qs(i,j,k)
flux(2,j) = u(2,i,j,k) * u31
flux(3,j) = u(3,i,j,k) * u31 + c2 * (u(5,i,j,k)-q)
flux(4,j) = u(4,i,j,k) * u31
flux(5,j) = ( c1 * u(5,i,j,k) - c2 * q ) * u31
end do
do j = jst, jend
do m = 1, 5
rsd(m,i,j,k) = rsd(m,i,j,k)
> - ty2 * ( flux(m,j+1) - flux(m,j-1) )
end do
end do
do j = jst, ny
tmp = rho_i(i,j,k)
u21j = tmp * u(2,i,j,k)
u31j = tmp * u(3,i,j,k)
u41j = tmp * u(4,i,j,k)
u51j = tmp * u(5,i,j,k)
tmp = rho_i(i,j-1,k)
u21jm1 = tmp * u(2,i,j-1,k)
u31jm1 = tmp * u(3,i,j-1,k)
u41jm1 = tmp * u(4,i,j-1,k)
u51jm1 = tmp * u(5,i,j-1,k)
flux(2,j) = ty3 * ( u21j - u21jm1 )
flux(3,j) = (4.0d+00/3.0d+00) * ty3 * (u31j-u31jm1)
flux(4,j) = ty3 * ( u41j - u41jm1 )
flux(5,j) = 0.50d+00 * ( 1.0d+00 - c1*c5 )
> * ty3 * ( ( u21j **2 + u31j **2 + u41j **2 )
> - ( u21jm1**2 + u31jm1**2 + u41jm1**2 ) )
> + (1.0d+00/6.0d+00)
> * ty3 * ( u31j**2 - u31jm1**2 )
> + c1 * c5 * ty3 * ( u51j - u51jm1 )
end do
do j = jst, jend
rsd(1,i,j,k) = rsd(1,i,j,k)
> + dy1 * ty1 * ( u(1,i,j-1,k)
> - 2.0d+00 * u(1,i,j,k)
> + u(1,i,j+1,k) )
rsd(2,i,j,k) = rsd(2,i,j,k)
> + ty3 * c3 * c4 * ( flux(2,j+1) - flux(2,j) )
> + dy2 * ty1 * ( u(2,i,j-1,k)
> - 2.0d+00 * u(2,i,j,k)
> + u(2,i,j+1,k) )
rsd(3,i,j,k) = rsd(3,i,j,k)
> + ty3 * c3 * c4 * ( flux(3,j+1) - flux(3,j) )
> + dy3 * ty1 * ( u(3,i,j-1,k)
> - 2.0d+00 * u(3,i,j,k)
> + u(3,i,j+1,k) )
rsd(4,i,j,k) = rsd(4,i,j,k)
> + ty3 * c3 * c4 * ( flux(4,j+1) - flux(4,j) )
> + dy4 * ty1 * ( u(4,i,j-1,k)
> - 2.0d+00 * u(4,i,j,k)
> + u(4,i,j+1,k) )
rsd(5,i,j,k) = rsd(5,i,j,k)
> + ty3 * c3 * c4 * ( flux(5,j+1) - flux(5,j) )
> + dy5 * ty1 * ( u(5,i,j-1,k)
> - 2.0d+00 * u(5,i,j,k)
> + u(5,i,j+1,k) )
end do
end do
c---------------------------------------------------------------------
c fourth-order dissipation
c---------------------------------------------------------------------
do i = ist, iend
do m = 1, 5
rsd(m,i,2,k) = rsd(m,i,2,k)
> - dssp * ( + 5.0d+00 * u(m,i,2,k)
> - 4.0d+00 * u(m,i,3,k)
> + u(m,i,4,k) )
rsd(m,i,3,k) = rsd(m,i,3,k)
> - dssp * ( - 4.0d+00 * u(m,i,2,k)
> + 6.0d+00 * u(m,i,3,k)
> - 4.0d+00 * u(m,i,4,k)
> + u(m,i,5,k) )
end do
end do
do j = 4, ny - 3
do i = ist, iend
do m = 1, 5
rsd(m,i,j,k) = rsd(m,i,j,k)
> - dssp * ( u(m,i,j-2,k)
> - 4.0d+00 * u(m,i,j-1,k)
> + 6.0d+00 * u(m,i,j,k)
> - 4.0d+00 * u(m,i,j+1,k)
> + u(m,i,j+2,k) )
end do
end do
end do
do i = ist, iend
do m = 1, 5
rsd(m,i,ny-2,k) = rsd(m,i,ny-2,k)
> - dssp * ( u(m,i,ny-4,k)
> - 4.0d+00 * u(m,i,ny-3,k)
> + 6.0d+00 * u(m,i,ny-2,k)
> - 4.0d+00 * u(m,i,ny-1,k) )
rsd(m,i,ny-1,k) = rsd(m,i,ny-1,k)
> - dssp * ( u(m,i,ny-3,k)
> - 4.0d+00 * u(m,i,ny-2,k)
> + 5.0d+00 * u(m,i,ny-1,k) )
end do
end do
end do
if (timeron) call timer_stop(t_rhsy)
if (timeron) call timer_start(t_rhsz)
c---------------------------------------------------------------------
c zeta-direction flux differences
c---------------------------------------------------------------------
do j = jst, jend
do i = ist, iend
do k = 1, nz
utmp(1,k) = u(1,i,j,k)
utmp(2,k) = u(2,i,j,k)
utmp(3,k) = u(3,i,j,k)
utmp(4,k) = u(4,i,j,k)
utmp(5,k) = u(5,i,j,k)
utmp(6,k) = rho_i(i,j,k)
end do
do k = 1, nz
flux(1,k) = utmp(4,k)
u41 = utmp(4,k) * utmp(6,k)
q = qs(i,j,k)
flux(2,k) = utmp(2,k) * u41
flux(3,k) = utmp(3,k) * u41
flux(4,k) = utmp(4,k) * u41 + c2 * (utmp(5,k)-q)
flux(5,k) = ( c1 * utmp(5,k) - c2 * q ) * u41
end do
do k = 2, nz - 1
do m = 1, 5
rtmp(m,k) = rsd(m,i,j,k)
> - tz2 * ( flux(m,k+1) - flux(m,k-1) )
end do
end do
do k = 2, nz
tmp = utmp(6,k)
u21k = tmp * utmp(2,k)
u31k = tmp * utmp(3,k)
u41k = tmp * utmp(4,k)
u51k = tmp * utmp(5,k)
tmp = utmp(6,k-1)
u21km1 = tmp * utmp(2,k-1)
u31km1 = tmp * utmp(3,k-1)
u41km1 = tmp * utmp(4,k-1)
u51km1 = tmp * utmp(5,k-1)
flux(2,k) = tz3 * ( u21k - u21km1 )
flux(3,k) = tz3 * ( u31k - u31km1 )
flux(4,k) = (4.0d+00/3.0d+00) * tz3 * (u41k-u41km1)
flux(5,k) = 0.50d+00 * ( 1.0d+00 - c1*c5 )
> * tz3 * ( ( u21k **2 + u31k **2 + u41k **2 )
> - ( u21km1**2 + u31km1**2 + u41km1**2 ) )
> + (1.0d+00/6.0d+00)
> * tz3 * ( u41k**2 - u41km1**2 )
> + c1 * c5 * tz3 * ( u51k - u51km1 )
end do
do k = 2, nz - 1
rtmp(1,k) = rtmp(1,k)
> + dz1 * tz1 * ( utmp(1,k-1)
> - 2.0d+00 * utmp(1,k)
> + utmp(1,k+1) )
rtmp(2,k) = rtmp(2,k)
> + tz3 * c3 * c4 * ( flux(2,k+1) - flux(2,k) )
> + dz2 * tz1 * ( utmp(2,k-1)
> - 2.0d+00 * utmp(2,k)
> + utmp(2,k+1) )
rtmp(3,k) = rtmp(3,k)
> + tz3 * c3 * c4 * ( flux(3,k+1) - flux(3,k) )
> + dz3 * tz1 * ( utmp(3,k-1)
> - 2.0d+00 * utmp(3,k)
> + utmp(3,k+1) )
rtmp(4,k) = rtmp(4,k)
> + tz3 * c3 * c4 * ( flux(4,k+1) - flux(4,k) )
> + dz4 * tz1 * ( utmp(4,k-1)
> - 2.0d+00 * utmp(4,k)
> + utmp(4,k+1) )
rtmp(5,k) = rtmp(5,k)
> + tz3 * c3 * c4 * ( flux(5,k+1) - flux(5,k) )
> + dz5 * tz1 * ( utmp(5,k-1)
> - 2.0d+00 * utmp(5,k)
> + utmp(5,k+1) )
end do
c---------------------------------------------------------------------
c fourth-order dissipation
c---------------------------------------------------------------------
do m = 1, 5
rsd(m,i,j,2) = rtmp(m,2)
> - dssp * ( + 5.0d+00 * utmp(m,2)
> - 4.0d+00 * utmp(m,3)
> + utmp(m,4) )
rsd(m,i,j,3) = rtmp(m,3)
> - dssp * ( - 4.0d+00 * utmp(m,2)
> + 6.0d+00 * utmp(m,3)
> - 4.0d+00 * utmp(m,4)
> + utmp(m,5) )
end do
do k = 4, nz - 3
do m = 1, 5
rsd(m,i,j,k) = rtmp(m,k)
> - dssp * ( utmp(m,k-2)
> - 4.0d+00 * utmp(m,k-1)
> + 6.0d+00 * utmp(m,k)
> - 4.0d+00 * utmp(m,k+1)
> + utmp(m,k+2) )
end do
end do
do m = 1, 5
rsd(m,i,j,nz-2) = rtmp(m,nz-2)
> - dssp * ( utmp(m,nz-4)
> - 4.0d+00 * utmp(m,nz-3)
> + 6.0d+00 * utmp(m,nz-2)
> - 4.0d+00 * utmp(m,nz-1) )
rsd(m,i,j,nz-1) = rtmp(m,nz-1)
> - dssp * ( utmp(m,nz-3)
> - 4.0d+00 * utmp(m,nz-2)
> + 5.0d+00 * utmp(m,nz-1) )
end do
end do
end do
if (timeron) call timer_stop(t_rhsz)
if (timeron) call timer_stop(t_rhs)
return
end