xref: /petsc/src/binding/petsc4py/demo/legacy/perftest/App.f90 (revision 357ff46720e610a6bc52c5e1c8bc7f4c2931b93d)
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