155a74a43SLisandro Dalcinsubroutine formFunction_C(nx, ny, nz, h, t, x, xdot, f) & 255a74a43SLisandro Dalcin bind(C, name="formFunction") 355a74a43SLisandro Dalcin use ISO_C_BINDING, only: C_INT, C_DOUBLE 455a74a43SLisandro Dalcin implicit none 555a74a43SLisandro Dalcin integer(kind=C_INT), intent(in) :: nx, ny, nz 655a74a43SLisandro Dalcin real(kind=C_DOUBLE), intent(in) :: h(3), t 755a74a43SLisandro Dalcin real(kind=C_DOUBLE), intent(in) :: x(nx,ny,nz), xdot(nx,ny,nz) 855a74a43SLisandro Dalcin real(kind=C_DOUBLE), intent(inout) :: f(nx,ny,nz) 955a74a43SLisandro Dalcin call formfunction_f(nx, ny, nz, h, t, x, xdot, f) 1055a74a43SLisandro Dalcinend subroutine formFunction_C 1155a74a43SLisandro Dalcin 1255a74a43SLisandro Dalcinsubroutine formInitial_C(nx, ny, nz, h, t, x) & 1355a74a43SLisandro Dalcin bind(C, name="formInitial") 1455a74a43SLisandro Dalcin use ISO_C_BINDING, only: C_INT, C_DOUBLE 1555a74a43SLisandro Dalcin implicit none 1655a74a43SLisandro Dalcin integer(kind=C_INT), intent(in) :: nx, ny, nz 1755a74a43SLisandro Dalcin real(kind=C_DOUBLE), intent(in) :: h(3), t 1855a74a43SLisandro Dalcin real(kind=C_DOUBLE), intent(inout) :: x(nx,ny,nz) 1955a74a43SLisandro Dalcin call forminitial_f(nx, ny, nz, h, t, x) 2055a74a43SLisandro Dalcinend subroutine formInitial_C 2155a74a43SLisandro Dalcin 2255a74a43SLisandro Dalcinsubroutine evalK (P, K) 2355a74a43SLisandro Dalcin real(kind=8), intent(in) :: P 2455a74a43SLisandro Dalcin real(kind=8), intent(out) :: K 2555a74a43SLisandro Dalcin if (P >= 0.0) then 2655a74a43SLisandro Dalcin K = 1.0 2755a74a43SLisandro Dalcin else 2855a74a43SLisandro Dalcin K = 1.0/(1+P**2) 2955a74a43SLisandro Dalcin end if 3055a74a43SLisandro Dalcinend subroutine evalK 3155a74a43SLisandro Dalcin 3255a74a43SLisandro Dalcinsubroutine fillK (P, K) 3355a74a43SLisandro Dalcin real(kind=8), intent(in) :: P(-1:1) 3455a74a43SLisandro Dalcin real(kind=8), intent(out) :: K(-1:1) 35*37cc6f30SBarry Smith real(kind=8) :: Ka, Kb 3655a74a43SLisandro Dalcin call evalK((P(-1)+P( 0))/2.0, Ka) 3755a74a43SLisandro Dalcin call evalK((P( 0)+P( 1))/2.0, Kb) 3855a74a43SLisandro Dalcin K(-1) = -Ka 3955a74a43SLisandro Dalcin K( 0) = Ka + Kb 4055a74a43SLisandro Dalcin K(+1) = -Kb 4155a74a43SLisandro Dalcinend subroutine fillK 4255a74a43SLisandro Dalcin 4355a74a43SLisandro Dalcinsubroutine forminitial_f(nx, ny, nz, h, t, x) 4455a74a43SLisandro Dalcin implicit none 4555a74a43SLisandro Dalcin integer, intent(in) :: nx, ny, nz 4655a74a43SLisandro Dalcin real(kind=8), intent(in) :: h(3), t 4755a74a43SLisandro Dalcin real(kind=8), intent(inout) :: x(nx,ny,nz) 4855a74a43SLisandro Dalcin ! 4955a74a43SLisandro Dalcin x(:,:,:) = 0.0 5055a74a43SLisandro Dalcinend subroutine forminitial_f 5155a74a43SLisandro Dalcin 5255a74a43SLisandro Dalcinsubroutine formfunction_f(nx, ny, nz, h, t, x, xdot, f) 5355a74a43SLisandro Dalcin implicit none 5455a74a43SLisandro Dalcin integer, intent(in) :: nx, ny, nz 5555a74a43SLisandro Dalcin real(kind=8), intent(in) :: h(3), t 5655a74a43SLisandro Dalcin real(kind=8), intent(in) :: x(nx,ny,nz), xdot(nx,ny,nz) 5755a74a43SLisandro Dalcin real(kind=8), intent(inout) :: f(nx,ny,nz) 5855a74a43SLisandro Dalcin ! 5955a74a43SLisandro Dalcin integer :: i,j,k,ii(-1:1),jj(-1:1),kk(-1:1) 6055a74a43SLisandro Dalcin real(kind=8) :: K1(-1:1), K2(-1:1), K3(-1:1) 6155a74a43SLisandro Dalcin real(kind=8) :: P1(-1:1), P2(-1:1), P3(-1:1) 6255a74a43SLisandro Dalcin ! 6355a74a43SLisandro Dalcin do k=1,nz 6455a74a43SLisandro Dalcin do j=1,ny 6555a74a43SLisandro Dalcin do i=1,nx 6655a74a43SLisandro Dalcin ! 67*37cc6f30SBarry Smith ii = [i-1, i, i+1] 6855a74a43SLisandro Dalcin if (i == 1) then 6955a74a43SLisandro Dalcin ii(-1) = i 7055a74a43SLisandro Dalcin else if (i == nx) then 7155a74a43SLisandro Dalcin ii(+1) = i 7255a74a43SLisandro Dalcin end if 7355a74a43SLisandro Dalcin ! 74*37cc6f30SBarry Smith jj = [j-1, j, j+1] 7555a74a43SLisandro Dalcin if (j == 1) then 7655a74a43SLisandro Dalcin jj(-1) = j 7755a74a43SLisandro Dalcin else if (j == ny) then 7855a74a43SLisandro Dalcin jj(+1) = j 7955a74a43SLisandro Dalcin end if 8055a74a43SLisandro Dalcin ! 81*37cc6f30SBarry Smith kk = [k-1, k, k+1] 8255a74a43SLisandro Dalcin if (k == 1) then 8355a74a43SLisandro Dalcin kk(-1) = k 8455a74a43SLisandro Dalcin else if (k == nz) then 8555a74a43SLisandro Dalcin kk(+1) = k 8655a74a43SLisandro Dalcin end if 8755a74a43SLisandro Dalcin ! 8855a74a43SLisandro Dalcin P1 = x(ii,j,k) 8955a74a43SLisandro Dalcin P2 = x(i,jj,k) 9055a74a43SLisandro Dalcin P3 = x(i,j,kk) 9155a74a43SLisandro Dalcin call fillK(P1,K1) 9255a74a43SLisandro Dalcin call fillK(P2,K2) 9355a74a43SLisandro Dalcin call fillK(P3,K3) 9455a74a43SLisandro Dalcin f(i,j,k) = & 9555a74a43SLisandro Dalcin xdot(i,j,k) + & 9655a74a43SLisandro Dalcin sum(K1*P1)/h(1)**2 + & 9755a74a43SLisandro Dalcin sum(K2*P2)/h(2)**2 + & 9855a74a43SLisandro Dalcin sum(K3*P3)/h(3)**2 9955a74a43SLisandro Dalcin ! 10055a74a43SLisandro Dalcin end do !i 10155a74a43SLisandro Dalcin end do !j 10255a74a43SLisandro Dalcin end do !k 10355a74a43SLisandro Dalcin ! 10455a74a43SLisandro Dalcin i = nx/4+1 10555a74a43SLisandro Dalcin j = ny/4+1 10655a74a43SLisandro Dalcin k = nz/2+1 10755a74a43SLisandro Dalcin f(i,j,k:nz) = f(i,j,k:nz) + 300.0 10855a74a43SLisandro Dalcin ! 10955a74a43SLisandro Dalcinend subroutine formfunction_f 110