| |
| 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 |
| |
| |
| |