c--------------------------------------------------------------------- c--------------------------------------------------------------------- subroutine initialize c--------------------------------------------------------------------- c--------------------------------------------------------------------- c--------------------------------------------------------------------- c This subroutine initializes the field variable u using c tri-linear transfinite interpolation of the boundary values c--------------------------------------------------------------------- include 'header.h' integer c, i, j, k, m, ii, jj, kk, ix, iy, iz double precision xi, eta, zeta, Pface(5,3,2), Pxi, Peta, > Pzeta, temp(5) c--------------------------------------------------------------------- c Later (in compute_rhs) we compute 1/u for every element. A few of c the corner elements are not used, but it convenient (and faster) c to compute the whole thing with a simple loop. Make sure those c values are nonzero by initializing the whole thing here. c--------------------------------------------------------------------- do c = 1, ncells do kk = -1, IMAX do jj = -1, IMAX do ii = -1, IMAX u(ii, jj, kk, 1, c) = 1.0 u(ii, jj, kk, 2, c) = 0.0 u(ii, jj, kk, 3, c) = 0.0 u(ii, jj, kk, 4, c) = 0.0 u(ii, jj, kk, 5, c) = 1.0 end do end do end do end do c--------------------------------------------------------------------- c first store the "interpolated" values everywhere on the grid c--------------------------------------------------------------------- do c=1, ncells kk = 0 do k = cell_low(3,c), cell_high(3,c) zeta = dble(k) * dnzm1 jj = 0 do j = cell_low(2,c), cell_high(2,c) eta = dble(j) * dnym1 ii = 0 do i = cell_low(1,c), cell_high(1,c) xi = dble(i) * dnxm1 do ix = 1, 2 call exact_solution(dble(ix-1), eta, zeta, > Pface(1,1,ix)) end do do iy = 1, 2 call exact_solution(xi, dble(iy-1) , zeta, > Pface(1,2,iy)) end do do iz = 1, 2 call exact_solution(xi, eta, dble(iz-1), > Pface(1,3,iz)) end do do m = 1, 5 Pxi = xi * Pface(m,1,2) + > (1.0d0-xi) * Pface(m,1,1) Peta = eta * Pface(m,2,2) + > (1.0d0-eta) * Pface(m,2,1) Pzeta = zeta * Pface(m,3,2) + > (1.0d0-zeta) * Pface(m,3,1) u(ii,jj,kk,m,c) = Pxi + Peta + Pzeta - > Pxi*Peta - Pxi*Pzeta - Peta*Pzeta + > Pxi*Peta*Pzeta end do ii = ii + 1 end do jj = jj + 1 end do kk = kk+1 end do end do c--------------------------------------------------------------------- c now store the exact values on the boundaries c--------------------------------------------------------------------- c--------------------------------------------------------------------- c west face c--------------------------------------------------------------------- c = slice(1,1) ii = 0 xi = 0.0d0 kk = 0 do k = cell_low(3,c), cell_high(3,c) zeta = dble(k) * dnzm1 jj = 0 do j = cell_low(2,c), cell_high(2,c) eta = dble(j) * dnym1 call exact_solution(xi, eta, zeta, temp) do m = 1, 5 u(ii,jj,kk,m,c) = temp(m) end do jj = jj + 1 end do kk = kk + 1 end do c--------------------------------------------------------------------- c east face c--------------------------------------------------------------------- c = slice(1,ncells) ii = cell_size(1,c)-1 xi = 1.0d0 kk = 0 do k = cell_low(3,c), cell_high(3,c) zeta = dble(k) * dnzm1 jj = 0 do j = cell_low(2,c), cell_high(2,c) eta = dble(j) * dnym1 call exact_solution(xi, eta, zeta, temp) do m = 1, 5 u(ii,jj,kk,m,c) = temp(m) end do jj = jj + 1 end do kk = kk + 1 end do c--------------------------------------------------------------------- c south face c--------------------------------------------------------------------- c = slice(2,1) jj = 0 eta = 0.0d0 kk = 0 do k = cell_low(3,c), cell_high(3,c) zeta = dble(k) * dnzm1 ii = 0 do i = cell_low(1,c), cell_high(1,c) xi = dble(i) * dnxm1 call exact_solution(xi, eta, zeta, temp) do m = 1, 5 u(ii,jj,kk,m,c) = temp(m) end do ii = ii + 1 end do kk = kk + 1 end do c--------------------------------------------------------------------- c north face c--------------------------------------------------------------------- c = slice(2,ncells) jj = cell_size(2,c)-1 eta = 1.0d0 kk = 0 do k = cell_low(3,c), cell_high(3,c) zeta = dble(k) * dnzm1 ii = 0 do i = cell_low(1,c), cell_high(1,c) xi = dble(i) * dnxm1 call exact_solution(xi, eta, zeta, temp) do m = 1, 5 u(ii,jj,kk,m,c) = temp(m) end do ii = ii + 1 end do kk = kk + 1 end do c--------------------------------------------------------------------- c bottom face c--------------------------------------------------------------------- c = slice(3,1) kk = 0 zeta = 0.0d0 jj = 0 do j = cell_low(2,c), cell_high(2,c) eta = dble(j) * dnym1 ii = 0 do i =cell_low(1,c), cell_high(1,c) xi = dble(i) *dnxm1 call exact_solution(xi, eta, zeta, temp) do m = 1, 5 u(ii,jj,kk,m,c) = temp(m) end do ii = ii + 1 end do jj = jj + 1 end do c--------------------------------------------------------------------- c top face c--------------------------------------------------------------------- c = slice(3,ncells) kk = cell_size(3,c)-1 zeta = 1.0d0 jj = 0 do j = cell_low(2,c), cell_high(2,c) eta = dble(j) * dnym1 ii = 0 do i =cell_low(1,c), cell_high(1,c) xi = dble(i) * dnxm1 call exact_solution(xi, eta, zeta, temp) do m = 1, 5 u(ii,jj,kk,m,c) = temp(m) end do ii = ii + 1 end do jj = jj + 1 end do return end subroutine lhsinit include 'header.h' integer i, j, k, d, c, n c--------------------------------------------------------------------- c loop over all cells c--------------------------------------------------------------------- do c = 1, ncells c--------------------------------------------------------------------- c first, initialize the start and end arrays c--------------------------------------------------------------------- do d = 1, 3 if (cell_coord(d,c) .eq. 1) then start(d,c) = 1 else start(d,c) = 0 endif if (cell_coord(d,c) .eq. ncells) then end(d,c) = 1 else end(d,c) = 0 endif end do c--------------------------------------------------------------------- c zap the whole left hand side for starters c--------------------------------------------------------------------- do n = 1, 15 do k = 0, cell_size(3,c)-1 do j = 0, cell_size(2,c)-1 do i = 0, cell_size(1,c)-1 lhs(i,j,k,n,c) = 0.0d0 end do end do end do end do c--------------------------------------------------------------------- c next, set all diagonal values to 1. This is overkill, but convenient c--------------------------------------------------------------------- do n = 1, 3 do k = 0, cell_size(3,c)-1 do j = 0, cell_size(2,c)-1 do i = 0, cell_size(1,c)-1 lhs(i,j,k,5*n-2,c) = 1.0d0 end do end do end do end do end do return end