blob: 4939942ebb1c0ed9c8e43f9788cbbb98bd3b0fb8 [file] [log] [blame]
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine exact_rhs
c---------------------------------------------------------------------
c---------------------------------------------------------------------
c---------------------------------------------------------------------
c compute the right hand side based on exact solution
c---------------------------------------------------------------------
include 'header.h'
double precision dtemp(5), xi, eta, zeta, dtpp
integer m, i, j, k, ip1, im1, jp1,
> jm1, km1, kp1
c---------------------------------------------------------------------
c initialize
c---------------------------------------------------------------------
do k= 0, grid_points(3)-1
do j = 0, grid_points(2)-1
do i = 0, grid_points(1)-1
do m = 1, 5
forcing(m,i,j,k) = 0.0d0
end do
end do
end do
end do
c---------------------------------------------------------------------
c xi-direction flux differences
c---------------------------------------------------------------------
do k = 1, grid_points(3)-2
zeta = dble(k) * dnzm1
do j = 1, grid_points(2)-2
eta = dble(j) * dnym1
do i=0, grid_points(1)-1
xi = dble(i) * dnxm1
call exact_solution(xi, eta, zeta, dtemp)
do m = 1, 5
ue(i,m) = dtemp(m)
end do
dtpp = 1.0d0 / dtemp(1)
do m = 2, 5
buf(i,m) = dtpp * dtemp(m)
end do
cuf(i) = buf(i,2) * buf(i,2)
buf(i,1) = cuf(i) + buf(i,3) * buf(i,3) +
> buf(i,4) * buf(i,4)
q(i) = 0.5d0*(buf(i,2)*ue(i,2) + buf(i,3)*ue(i,3) +
> buf(i,4)*ue(i,4))
end do
do i = 1, grid_points(1)-2
im1 = i-1
ip1 = i+1
forcing(1,i,j,k) = forcing(1,i,j,k) -
> tx2*( ue(ip1,2)-ue(im1,2) )+
> dx1tx1*(ue(ip1,1)-2.0d0*ue(i,1)+ue(im1,1))
forcing(2,i,j,k) = forcing(2,i,j,k) - tx2 * (
> (ue(ip1,2)*buf(ip1,2)+c2*(ue(ip1,5)-q(ip1)))-
> (ue(im1,2)*buf(im1,2)+c2*(ue(im1,5)-q(im1))))+
> xxcon1*(buf(ip1,2)-2.0d0*buf(i,2)+buf(im1,2))+
> dx2tx1*( ue(ip1,2)-2.0d0* ue(i,2)+ue(im1,2))
forcing(3,i,j,k) = forcing(3,i,j,k) - tx2 * (
> ue(ip1,3)*buf(ip1,2)-ue(im1,3)*buf(im1,2))+
> xxcon2*(buf(ip1,3)-2.0d0*buf(i,3)+buf(im1,3))+
> dx3tx1*( ue(ip1,3)-2.0d0*ue(i,3) +ue(im1,3))
forcing(4,i,j,k) = forcing(4,i,j,k) - tx2*(
> ue(ip1,4)*buf(ip1,2)-ue(im1,4)*buf(im1,2))+
> xxcon2*(buf(ip1,4)-2.0d0*buf(i,4)+buf(im1,4))+
> dx4tx1*( ue(ip1,4)-2.0d0* ue(i,4)+ ue(im1,4))
forcing(5,i,j,k) = forcing(5,i,j,k) - tx2*(
> buf(ip1,2)*(c1*ue(ip1,5)-c2*q(ip1))-
> buf(im1,2)*(c1*ue(im1,5)-c2*q(im1)))+
> 0.5d0*xxcon3*(buf(ip1,1)-2.0d0*buf(i,1)+
> buf(im1,1))+
> xxcon4*(cuf(ip1)-2.0d0*cuf(i)+cuf(im1))+
> xxcon5*(buf(ip1,5)-2.0d0*buf(i,5)+buf(im1,5))+
> dx5tx1*( ue(ip1,5)-2.0d0* ue(i,5)+ ue(im1,5))
end do
c---------------------------------------------------------------------
c Fourth-order dissipation
c---------------------------------------------------------------------
do m = 1, 5
i = 1
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (5.0d0*ue(i,m) - 4.0d0*ue(i+1,m) +ue(i+2,m))
i = 2
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (-4.0d0*ue(i-1,m) + 6.0d0*ue(i,m) -
> 4.0d0*ue(i+1,m) + ue(i+2,m))
end do
do m = 1, 5
do i = 3, grid_points(1)-4
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp*
> (ue(i-2,m) - 4.0d0*ue(i-1,m) +
> 6.0d0*ue(i,m) - 4.0d0*ue(i+1,m) + ue(i+2,m))
end do
end do
do m = 1, 5
i = grid_points(1)-3
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (ue(i-2,m) - 4.0d0*ue(i-1,m) +
> 6.0d0*ue(i,m) - 4.0d0*ue(i+1,m))
i = grid_points(1)-2
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (ue(i-2,m) - 4.0d0*ue(i-1,m) + 5.0d0*ue(i,m))
end do
end do
end do
c---------------------------------------------------------------------
c eta-direction flux differences
c---------------------------------------------------------------------
do k = 1, grid_points(3)-2
zeta = dble(k) * dnzm1
do i=1, grid_points(1)-2
xi = dble(i) * dnxm1
do j=0, grid_points(2)-1
eta = dble(j) * dnym1
call exact_solution(xi, eta, zeta, dtemp)
do m = 1, 5
ue(j,m) = dtemp(m)
end do
dtpp = 1.0d0/dtemp(1)
do m = 2, 5
buf(j,m) = dtpp * dtemp(m)
end do
cuf(j) = buf(j,3) * buf(j,3)
buf(j,1) = cuf(j) + buf(j,2) * buf(j,2) +
> buf(j,4) * buf(j,4)
q(j) = 0.5d0*(buf(j,2)*ue(j,2) + buf(j,3)*ue(j,3) +
> buf(j,4)*ue(j,4))
end do
do j = 1, grid_points(2)-2
jm1 = j-1
jp1 = j+1
forcing(1,i,j,k) = forcing(1,i,j,k) -
> ty2*( ue(jp1,3)-ue(jm1,3) )+
> dy1ty1*(ue(jp1,1)-2.0d0*ue(j,1)+ue(jm1,1))
forcing(2,i,j,k) = forcing(2,i,j,k) - ty2*(
> ue(jp1,2)*buf(jp1,3)-ue(jm1,2)*buf(jm1,3))+
> yycon2*(buf(jp1,2)-2.0d0*buf(j,2)+buf(jm1,2))+
> dy2ty1*( ue(jp1,2)-2.0* ue(j,2)+ ue(jm1,2))
forcing(3,i,j,k) = forcing(3,i,j,k) - ty2*(
> (ue(jp1,3)*buf(jp1,3)+c2*(ue(jp1,5)-q(jp1)))-
> (ue(jm1,3)*buf(jm1,3)+c2*(ue(jm1,5)-q(jm1))))+
> yycon1*(buf(jp1,3)-2.0d0*buf(j,3)+buf(jm1,3))+
> dy3ty1*( ue(jp1,3)-2.0d0*ue(j,3) +ue(jm1,3))
forcing(4,i,j,k) = forcing(4,i,j,k) - ty2*(
> ue(jp1,4)*buf(jp1,3)-ue(jm1,4)*buf(jm1,3))+
> yycon2*(buf(jp1,4)-2.0d0*buf(j,4)+buf(jm1,4))+
> dy4ty1*( ue(jp1,4)-2.0d0*ue(j,4)+ ue(jm1,4))
forcing(5,i,j,k) = forcing(5,i,j,k) - ty2*(
> buf(jp1,3)*(c1*ue(jp1,5)-c2*q(jp1))-
> buf(jm1,3)*(c1*ue(jm1,5)-c2*q(jm1)))+
> 0.5d0*yycon3*(buf(jp1,1)-2.0d0*buf(j,1)+
> buf(jm1,1))+
> yycon4*(cuf(jp1)-2.0d0*cuf(j)+cuf(jm1))+
> yycon5*(buf(jp1,5)-2.0d0*buf(j,5)+buf(jm1,5))+
> dy5ty1*(ue(jp1,5)-2.0d0*ue(j,5)+ue(jm1,5))
end do
c---------------------------------------------------------------------
c Fourth-order dissipation
c---------------------------------------------------------------------
do m = 1, 5
j = 1
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (5.0d0*ue(j,m) - 4.0d0*ue(j+1,m) +ue(j+2,m))
j = 2
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (-4.0d0*ue(j-1,m) + 6.0d0*ue(j,m) -
> 4.0d0*ue(j+1,m) + ue(j+2,m))
end do
do m = 1, 5
do j = 3, grid_points(2)-4
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp*
> (ue(j-2,m) - 4.0d0*ue(j-1,m) +
> 6.0d0*ue(j,m) - 4.0d0*ue(j+1,m) + ue(j+2,m))
end do
end do
do m = 1, 5
j = grid_points(2)-3
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (ue(j-2,m) - 4.0d0*ue(j-1,m) +
> 6.0d0*ue(j,m) - 4.0d0*ue(j+1,m))
j = grid_points(2)-2
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (ue(j-2,m) - 4.0d0*ue(j-1,m) + 5.0d0*ue(j,m))
end do
end do
end do
c---------------------------------------------------------------------
c zeta-direction flux differences
c---------------------------------------------------------------------
do j=1, grid_points(2)-2
eta = dble(j) * dnym1
do i = 1, grid_points(1)-2
xi = dble(i) * dnxm1
do k=0, grid_points(3)-1
zeta = dble(k) * dnzm1
call exact_solution(xi, eta, zeta, dtemp)
do m = 1, 5
ue(k,m) = dtemp(m)
end do
dtpp = 1.0d0/dtemp(1)
do m = 2, 5
buf(k,m) = dtpp * dtemp(m)
end do
cuf(k) = buf(k,4) * buf(k,4)
buf(k,1) = cuf(k) + buf(k,2) * buf(k,2) +
> buf(k,3) * buf(k,3)
q(k) = 0.5d0*(buf(k,2)*ue(k,2) + buf(k,3)*ue(k,3) +
> buf(k,4)*ue(k,4))
end do
do k=1, grid_points(3)-2
km1 = k-1
kp1 = k+1
forcing(1,i,j,k) = forcing(1,i,j,k) -
> tz2*( ue(kp1,4)-ue(km1,4) )+
> dz1tz1*(ue(kp1,1)-2.0d0*ue(k,1)+ue(km1,1))
forcing(2,i,j,k) = forcing(2,i,j,k) - tz2 * (
> ue(kp1,2)*buf(kp1,4)-ue(km1,2)*buf(km1,4))+
> zzcon2*(buf(kp1,2)-2.0d0*buf(k,2)+buf(km1,2))+
> dz2tz1*( ue(kp1,2)-2.0d0* ue(k,2)+ ue(km1,2))
forcing(3,i,j,k) = forcing(3,i,j,k) - tz2 * (
> ue(kp1,3)*buf(kp1,4)-ue(km1,3)*buf(km1,4))+
> zzcon2*(buf(kp1,3)-2.0d0*buf(k,3)+buf(km1,3))+
> dz3tz1*(ue(kp1,3)-2.0d0*ue(k,3)+ue(km1,3))
forcing(4,i,j,k) = forcing(4,i,j,k) - tz2 * (
> (ue(kp1,4)*buf(kp1,4)+c2*(ue(kp1,5)-q(kp1)))-
> (ue(km1,4)*buf(km1,4)+c2*(ue(km1,5)-q(km1))))+
> zzcon1*(buf(kp1,4)-2.0d0*buf(k,4)+buf(km1,4))+
> dz4tz1*( ue(kp1,4)-2.0d0*ue(k,4) +ue(km1,4))
forcing(5,i,j,k) = forcing(5,i,j,k) - tz2 * (
> buf(kp1,4)*(c1*ue(kp1,5)-c2*q(kp1))-
> buf(km1,4)*(c1*ue(km1,5)-c2*q(km1)))+
> 0.5d0*zzcon3*(buf(kp1,1)-2.0d0*buf(k,1)
> +buf(km1,1))+
> zzcon4*(cuf(kp1)-2.0d0*cuf(k)+cuf(km1))+
> zzcon5*(buf(kp1,5)-2.0d0*buf(k,5)+buf(km1,5))+
> dz5tz1*( ue(kp1,5)-2.0d0*ue(k,5)+ ue(km1,5))
end do
c---------------------------------------------------------------------
c Fourth-order dissipation
c---------------------------------------------------------------------
do m = 1, 5
k = 1
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (5.0d0*ue(k,m) - 4.0d0*ue(k+1,m) +ue(k+2,m))
k = 2
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (-4.0d0*ue(k-1,m) + 6.0d0*ue(k,m) -
> 4.0d0*ue(k+1,m) + ue(k+2,m))
end do
do m = 1, 5
do k = 3, grid_points(3)-4
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp*
> (ue(k-2,m) - 4.0d0*ue(k-1,m) +
> 6.0d0*ue(k,m) - 4.0d0*ue(k+1,m) + ue(k+2,m))
end do
end do
do m = 1, 5
k = grid_points(3)-3
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (ue(k-2,m) - 4.0d0*ue(k-1,m) +
> 6.0d0*ue(k,m) - 4.0d0*ue(k+1,m))
k = grid_points(3)-2
forcing(m,i,j,k) = forcing(m,i,j,k) - dssp *
> (ue(k-2,m) - 4.0d0*ue(k-1,m) + 5.0d0*ue(k,m))
end do
end do
end do
c---------------------------------------------------------------------
c now change the sign of the forcing function,
c---------------------------------------------------------------------
do k = 1, grid_points(3)-2
do j = 1, grid_points(2)-2
do i = 1, grid_points(1)-2
do m = 1, 5
forcing(m,i,j,k) = -1.d0 * forcing(m,i,j,k)
end do
end do
end do
end do
return
end