1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
subroutine formFunction_C(nx, ny, nz, h, t, x, xdot, f) &
bind(C, name="formFunction")
use ISO_C_BINDING, only: C_INT, C_DOUBLE
implicit none
integer(kind=C_INT), intent(in) :: nx, ny, nz
real(kind=C_DOUBLE), intent(in) :: h(3), t
real(kind=C_DOUBLE), intent(in) :: x(nx,ny,nz), xdot(nx,ny,nz)
real(kind=C_DOUBLE), intent(inout) :: f(nx,ny,nz)
call formfunction_f(nx, ny, nz, h, t, x, xdot, f)
end subroutine formFunction_C
subroutine formInitial_C(nx, ny, nz, h, t, x) &
bind(C, name="formInitial")
use ISO_C_BINDING, only: C_INT, C_DOUBLE
implicit none
integer(kind=C_INT), intent(in) :: nx, ny, nz
real(kind=C_DOUBLE), intent(in) :: h(3), t
real(kind=C_DOUBLE), intent(inout) :: x(nx,ny,nz)
call forminitial_f(nx, ny, nz, h, t, x)
end subroutine formInitial_C
subroutine evalK (P, K)
real(kind=8), intent(in) :: P
real(kind=8), intent(out) :: K
if (P >= 0.0) then
K = 1.0
else
K = 1.0/(1+P**2)
end if
end subroutine evalK
subroutine fillK (P, K)
real(kind=8), intent(in) :: P(-1:1)
real(kind=8), intent(out) :: K(-1:1)
real(kind=8) Ka, Kb
call evalK((P(-1)+P( 0))/2.0, Ka)
call evalK((P( 0)+P( 1))/2.0, Kb)
K(-1) = -Ka
K( 0) = Ka + Kb
K(+1) = -Kb
end subroutine fillK
subroutine forminitial_f(nx, ny, nz, h, t, x)
implicit none
integer, intent(in) :: nx, ny, nz
real(kind=8), intent(in) :: h(3), t
real(kind=8), intent(inout) :: x(nx,ny,nz)
!
x(:,:,:) = 0.0
end subroutine forminitial_f
subroutine formfunction_f(nx, ny, nz, h, t, x, xdot, f)
implicit none
integer, intent(in) :: nx, ny, nz
real(kind=8), intent(in) :: h(3), t
real(kind=8), intent(in) :: x(nx,ny,nz), xdot(nx,ny,nz)
real(kind=8), intent(inout) :: f(nx,ny,nz)
!
integer :: i,j,k,ii(-1:1),jj(-1:1),kk(-1:1)
real(kind=8) :: K1(-1:1), K2(-1:1), K3(-1:1)
real(kind=8) :: P1(-1:1), P2(-1:1), P3(-1:1)
!
do k=1,nz
do j=1,ny
do i=1,nx
!
ii = (/i-1, i, i+1/)
if (i == 1) then
ii(-1) = i
else if (i == nx) then
ii(+1) = i
endif
!
jj = (/j-1, j, j+1/)
if (j == 1) then
jj(-1) = j
else if (j == ny) then
jj(+1) = j
end if
!
kk = (/k-1, k, k+1/)
if (k == 1) then
kk(-1) = k
else if (k == nz) then
kk(+1) = k
end if
!
P1 = x(ii,j,k)
P2 = x(i,jj,k)
P3 = x(i,j,kk)
call fillK(P1,K1)
call fillK(P2,K2)
call fillK(P3,K3)
f(i,j,k) = &
xdot(i,j,k) + &
sum(K1*P1)/h(1)**2 + &
sum(K2*P2)/h(2)**2 + &
sum(K3*P3)/h(3)**2
!
end do !i
end do !j
end do !k
!
i = nx/4+1
j = ny/4+1
k = nz/2+1
f(i,j,k:nz) = f(i,j,k:nz) + 300.0
!
end subroutine formfunction_f
|