xref: /petsc/src/sys/ftn-src/f90_fwrap.F90 (revision d47c0497e3b52bb8681c9d2e1026ce8506d72f69)
16dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
26dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
36dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
46dd63270SBarry Smith#include <petsc/finclude/petscsys.h>
56dd63270SBarry Smithsubroutine F90Array1dCreateScalar(array, start, len1, ptr)
6fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
76dd63270SBarry Smith  implicit none
86dd63270SBarry Smith  PetscInt start, len1
9*057526baSMartin Diehl  PetscScalar, target :: array(start:start + len1 - 1)
106dd63270SBarry Smith  PetscScalar, pointer :: ptr(:)
116dd63270SBarry Smith
126dd63270SBarry Smith  ptr => array
136dd63270SBarry Smithend subroutine
146dd63270SBarry Smith
156dd63270SBarry Smithsubroutine F90Array1dCreateReal(array, start, len1, ptr)
16fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
176dd63270SBarry Smith  implicit none
186dd63270SBarry Smith  PetscInt start, len1
19*057526baSMartin Diehl  PetscReal, target :: array(start:start + len1 - 1)
206dd63270SBarry Smith  PetscReal, pointer :: ptr(:)
216dd63270SBarry Smith
226dd63270SBarry Smith  ptr => array
236dd63270SBarry Smithend subroutine
246dd63270SBarry Smith
256dd63270SBarry Smithsubroutine F90Array1dCreateInt(array, start, len1, ptr)
26fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
276dd63270SBarry Smith  implicit none
286dd63270SBarry Smith  PetscInt start, len1
29*057526baSMartin Diehl  PetscInt, target :: array(start:start + len1 - 1)
306dd63270SBarry Smith  PetscInt, pointer :: ptr(:)
316dd63270SBarry Smith
326dd63270SBarry Smith  ptr => array
336dd63270SBarry Smithend subroutine
346dd63270SBarry Smith
356dd63270SBarry Smithsubroutine F90Array1dCreateMPIInt(array, start, len1, ptr)
36fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
376dd63270SBarry Smith  implicit none
386dd63270SBarry Smith  PetscInt start, len1
39*057526baSMartin Diehl  PetscMPIInt, target :: array(start:start + len1 - 1)
406dd63270SBarry Smith  PetscMPIInt, pointer :: ptr(:)
416dd63270SBarry Smith
426dd63270SBarry Smith  ptr => array
436dd63270SBarry Smithend subroutine
446dd63270SBarry Smith
456dd63270SBarry Smithsubroutine F90Array1dCreateFortranAddr(array, start, len1, ptr)
46fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
476dd63270SBarry Smith  implicit none
486dd63270SBarry Smith  PetscInt start, len1
49*057526baSMartin Diehl  PetscFortranAddr, target :: array(start:start + len1 - 1)
506dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:)
516dd63270SBarry Smith
526dd63270SBarry Smith  ptr => array
536dd63270SBarry Smithend subroutine
546dd63270SBarry Smith
556dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
566dd63270SBarry Smithsubroutine F90Array1dAccessScalar(ptr, address)
57fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
586dd63270SBarry Smith  implicit none
596dd63270SBarry Smith  PetscScalar, pointer :: ptr(:)
606dd63270SBarry Smith  PetscFortranAddr address
616dd63270SBarry Smith  PetscInt start
626dd63270SBarry Smith
63*057526baSMartin Diehl  if (.not. associated(ptr)) then
646dd63270SBarry Smith    address = 0
656dd63270SBarry Smith  else
666dd63270SBarry Smith    start = lbound(ptr, 1)
676dd63270SBarry Smith    call F90Array1dGetAddrScalar(ptr(start), address)
686dd63270SBarry Smith  end if
696dd63270SBarry Smithend subroutine
706dd63270SBarry Smith
716dd63270SBarry Smithsubroutine F90Array1dAccessReal(ptr, address)
72fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
736dd63270SBarry Smith  implicit none
746dd63270SBarry Smith  PetscReal, pointer :: ptr(:)
756dd63270SBarry Smith  PetscFortranAddr address
766dd63270SBarry Smith  PetscInt start
776dd63270SBarry Smith
78*057526baSMartin Diehl  if (.not. associated(ptr)) then
796dd63270SBarry Smith    address = 0
806dd63270SBarry Smith  else
816dd63270SBarry Smith    start = lbound(ptr, 1)
826dd63270SBarry Smith    call F90Array1dGetAddrReal(ptr(start), address)
836dd63270SBarry Smith  end if
846dd63270SBarry Smithend subroutine
856dd63270SBarry Smith
866dd63270SBarry Smithsubroutine F90Array1dAccessInt(ptr, address)
87fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
886dd63270SBarry Smith  implicit none
896dd63270SBarry Smith  PetscInt, pointer :: ptr(:)
906dd63270SBarry Smith  PetscFortranAddr address
916dd63270SBarry Smith  PetscInt start
926dd63270SBarry Smith
93*057526baSMartin Diehl  if (.not. associated(ptr)) then
946dd63270SBarry Smith    address = 0
956dd63270SBarry Smith  else
966dd63270SBarry Smith    start = lbound(ptr, 1)
976dd63270SBarry Smith    call F90Array1dGetAddrInt(ptr(start), address)
986dd63270SBarry Smith  end if
996dd63270SBarry Smithend subroutine
1006dd63270SBarry Smith
1016dd63270SBarry Smithsubroutine F90Array1dAccessMPIInt(ptr, address)
102fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1036dd63270SBarry Smith  implicit none
1046dd63270SBarry Smith  PetscMPIInt, pointer :: ptr(:)
1056dd63270SBarry Smith  PetscFortranAddr address
1066dd63270SBarry Smith  PetscInt start
1076dd63270SBarry Smith
108*057526baSMartin Diehl  if (.not. associated(ptr)) then
1096dd63270SBarry Smith    address = 0
1106dd63270SBarry Smith  else
1116dd63270SBarry Smith    start = lbound(ptr, 1)
1126dd63270SBarry Smith    call F90Array1dGetAddrMPIInt(ptr(start), address)
1136dd63270SBarry Smith  end if
1146dd63270SBarry Smithend subroutine
1156dd63270SBarry Smith
1166dd63270SBarry Smithsubroutine F90Array1dAccessFortranAddr(ptr, address)
117fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1186dd63270SBarry Smith  implicit none
1196dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:)
1206dd63270SBarry Smith  PetscFortranAddr address
1216dd63270SBarry Smith  PetscInt start
1226dd63270SBarry Smith
123*057526baSMartin Diehl  if (.not. associated(ptr)) then
1246dd63270SBarry Smith    address = 0
1256dd63270SBarry Smith  else
1266dd63270SBarry Smith    start = lbound(ptr, 1)
1276dd63270SBarry Smith    call F90Array1dGetAddrFortranAddr(ptr(start), address)
1286dd63270SBarry Smith  end if
1296dd63270SBarry Smithend subroutine
1306dd63270SBarry Smith
1316dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1326dd63270SBarry Smithsubroutine F90Array1dDestroyScalar(ptr)
133fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1346dd63270SBarry Smith  implicit none
1356dd63270SBarry Smith  PetscScalar, pointer :: ptr(:)
1366dd63270SBarry Smith
1376dd63270SBarry Smith  nullify (ptr)
1386dd63270SBarry Smithend subroutine
1396dd63270SBarry Smith
1406dd63270SBarry Smithsubroutine F90Array1dDestroyReal(ptr)
141fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1426dd63270SBarry Smith  implicit none
1436dd63270SBarry Smith  PetscReal, pointer :: ptr(:)
1446dd63270SBarry Smith
1456dd63270SBarry Smith  nullify (ptr)
1466dd63270SBarry Smithend subroutine
1476dd63270SBarry Smith
1486dd63270SBarry Smithsubroutine F90Array1dDestroyInt(ptr)
149fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1506dd63270SBarry Smith  implicit none
1516dd63270SBarry Smith  PetscInt, pointer :: ptr(:)
1526dd63270SBarry Smith
1536dd63270SBarry Smith  nullify (ptr)
1546dd63270SBarry Smithend subroutine
1556dd63270SBarry Smith
1566dd63270SBarry Smithsubroutine F90Array1dDestroyMPIInt(ptr)
157fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1586dd63270SBarry Smith  implicit none
1596dd63270SBarry Smith  PetscMPIInt, pointer :: ptr(:)
1606dd63270SBarry Smith
1616dd63270SBarry Smith  nullify (ptr)
1626dd63270SBarry Smithend subroutine
1636dd63270SBarry Smith
1646dd63270SBarry Smithsubroutine F90Array1dDestroyFortranAddr(ptr)
165fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1666dd63270SBarry Smith  implicit none
1676dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:)
1686dd63270SBarry Smith
1696dd63270SBarry Smith  nullify (ptr)
1706dd63270SBarry Smithend subroutine
1716dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1726dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
1736dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
174*057526baSMartin Diehlsubroutine F90Array2dCreateScalar(array, start1, len1, start2, len2, ptr)
175fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1766dd63270SBarry Smith  implicit none
1776dd63270SBarry Smith  PetscInt start1, len1
1786dd63270SBarry Smith  PetscInt start2, len2
179*057526baSMartin Diehl  PetscScalar, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
1806dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :)
1816dd63270SBarry Smith
1826dd63270SBarry Smith  ptr => array
1836dd63270SBarry Smithend subroutine
1846dd63270SBarry Smith
185*057526baSMartin Diehlsubroutine F90Array2dCreateReal(array, start1, len1, start2, len2, ptr)
186fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1876dd63270SBarry Smith  implicit none
1886dd63270SBarry Smith  PetscInt start1, len1
1896dd63270SBarry Smith  PetscInt start2, len2
190*057526baSMartin Diehl  PetscReal, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
1916dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :)
1926dd63270SBarry Smith
1936dd63270SBarry Smith  ptr => array
1946dd63270SBarry Smithend subroutine
1956dd63270SBarry Smith
196*057526baSMartin Diehlsubroutine F90Array2dCreateInt(array, start1, len1, start2, len2, ptr)
197fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
1986dd63270SBarry Smith  implicit none
1996dd63270SBarry Smith  PetscInt start1, len1
2006dd63270SBarry Smith  PetscInt start2, len2
201*057526baSMartin Diehl  PetscInt, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
2026dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :)
2036dd63270SBarry Smith
2046dd63270SBarry Smith  ptr => array
2056dd63270SBarry Smithend subroutine
2066dd63270SBarry Smith
207*057526baSMartin Diehlsubroutine F90Array2dCreateFortranAddr(array, start1, len1, start2, len2, ptr)
208fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2096dd63270SBarry Smith  implicit none
2106dd63270SBarry Smith  PetscInt start1, len1
2116dd63270SBarry Smith  PetscInt start2, len2
212*057526baSMartin Diehl  PetscFortranAddr, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
2136dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :)
2146dd63270SBarry Smith
2156dd63270SBarry Smith  ptr => array
2166dd63270SBarry Smithend subroutine
2176dd63270SBarry Smith
2186dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2196dd63270SBarry Smithsubroutine F90Array2dAccessScalar(ptr, address)
220fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2216dd63270SBarry Smith  implicit none
2226dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :)
2236dd63270SBarry Smith  PetscFortranAddr address
2246dd63270SBarry Smith  PetscInt start1, start2
2256dd63270SBarry Smith
2266dd63270SBarry Smith  start1 = lbound(ptr, 1)
2276dd63270SBarry Smith  start2 = lbound(ptr, 2)
2286dd63270SBarry Smith  call F90Array2dGetAddrScalar(ptr(start1, start2), address)
2296dd63270SBarry Smithend subroutine
2306dd63270SBarry Smith
2316dd63270SBarry Smithsubroutine F90Array2dAccessReal(ptr, address)
232fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2336dd63270SBarry Smith  implicit none
2346dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :)
2356dd63270SBarry Smith  PetscFortranAddr address
2366dd63270SBarry Smith  PetscInt start1, start2
2376dd63270SBarry Smith
2386dd63270SBarry Smith  start1 = lbound(ptr, 1)
2396dd63270SBarry Smith  start2 = lbound(ptr, 2)
2406dd63270SBarry Smith  call F90Array2dGetAddrReal(ptr(start1, start2), address)
2416dd63270SBarry Smithend subroutine
2426dd63270SBarry Smith
2436dd63270SBarry Smithsubroutine F90Array2dAccessInt(ptr, address)
244fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2456dd63270SBarry Smith  implicit none
2466dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :)
2476dd63270SBarry Smith  PetscFortranAddr address
2486dd63270SBarry Smith  PetscInt start1, start2
2496dd63270SBarry Smith
2506dd63270SBarry Smith  start1 = lbound(ptr, 1)
2516dd63270SBarry Smith  start2 = lbound(ptr, 2)
2526dd63270SBarry Smith  call F90Array2dGetAddrInt(ptr(start1, start2), address)
2536dd63270SBarry Smithend subroutine
2546dd63270SBarry Smith
2556dd63270SBarry Smithsubroutine F90Array2dAccessFortranAddr(ptr, address)
256fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2576dd63270SBarry Smith  implicit none
2586dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :)
2596dd63270SBarry Smith  PetscFortranAddr address
2606dd63270SBarry Smith  PetscInt start1, start2
2616dd63270SBarry Smith
2626dd63270SBarry Smith  start1 = lbound(ptr, 1)
2636dd63270SBarry Smith  start2 = lbound(ptr, 2)
2646dd63270SBarry Smith  call F90Array2dGetAddrFortranAddr(ptr(start1, start2), address)
2656dd63270SBarry Smithend subroutine
2666dd63270SBarry Smith
2676dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2686dd63270SBarry Smithsubroutine F90Array2dDestroyScalar(ptr)
269fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2706dd63270SBarry Smith  implicit none
2716dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :)
2726dd63270SBarry Smith
2736dd63270SBarry Smith  nullify (ptr)
2746dd63270SBarry Smithend subroutine
2756dd63270SBarry Smith
2766dd63270SBarry Smithsubroutine F90Array2dDestroyReal(ptr)
277fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2786dd63270SBarry Smith  implicit none
2796dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :)
2806dd63270SBarry Smith
2816dd63270SBarry Smith  nullify (ptr)
2826dd63270SBarry Smithend subroutine
2836dd63270SBarry Smith
2846dd63270SBarry Smithsubroutine F90Array2dDestroyInt(ptr)
285fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2866dd63270SBarry Smith  implicit none
2876dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :)
2886dd63270SBarry Smith
2896dd63270SBarry Smith  nullify (ptr)
2906dd63270SBarry Smithend subroutine
2916dd63270SBarry Smith
2926dd63270SBarry Smithsubroutine F90Array2dDestroyFortranAddr(ptr)
293fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
2946dd63270SBarry Smith  implicit none
2956dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :)
2966dd63270SBarry Smith
2976dd63270SBarry Smith  nullify (ptr)
2986dd63270SBarry Smithend subroutine
2996dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3006dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
3016dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
302*057526baSMartin Diehlsubroutine F90Array3dCreateScalar(array, start1, len1, start2, len2, start3, len3, ptr)
303fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3046dd63270SBarry Smith  implicit none
3056dd63270SBarry Smith  PetscInt start1, len1
3066dd63270SBarry Smith  PetscInt start2, len2
3076dd63270SBarry Smith  PetscInt start3, len3
308*057526baSMartin Diehl  PetscScalar, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
3096dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :, :)
3106dd63270SBarry Smith
3116dd63270SBarry Smith  ptr => array
3126dd63270SBarry Smithend subroutine
3136dd63270SBarry Smith
314*057526baSMartin Diehlsubroutine F90Array3dCreateReal(array, start1, len1, start2, len2, start3, len3, ptr)
315fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3166dd63270SBarry Smith  implicit none
3176dd63270SBarry Smith  PetscInt start1, len1
3186dd63270SBarry Smith  PetscInt start2, len2
3196dd63270SBarry Smith  PetscInt start3, len3
320*057526baSMartin Diehl  PetscReal, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
3216dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :, :)
3226dd63270SBarry Smith
3236dd63270SBarry Smith  ptr => array
3246dd63270SBarry Smithend subroutine
3256dd63270SBarry Smith
326*057526baSMartin Diehlsubroutine F90Array3dCreateInt(array, start1, len1, start2, len2, start3, len3, ptr)
327fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3286dd63270SBarry Smith  implicit none
3296dd63270SBarry Smith  PetscInt start1, len1
3306dd63270SBarry Smith  PetscInt start2, len2
3316dd63270SBarry Smith  PetscInt start3, len3
332*057526baSMartin Diehl  PetscInt, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
3336dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :, :)
3346dd63270SBarry Smith
3356dd63270SBarry Smith  ptr => array
3366dd63270SBarry Smithend subroutine
3376dd63270SBarry Smith
338*057526baSMartin Diehlsubroutine F90Array3dCreateFortranAddr(array, start1, len1, start2, len2, start3, len3, ptr)
339fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3406dd63270SBarry Smith  implicit none
3416dd63270SBarry Smith  PetscInt start1, len1
3426dd63270SBarry Smith  PetscInt start2, len2
3436dd63270SBarry Smith  PetscInt start3, len3
344*057526baSMartin Diehl  PetscFortranAddr, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
3456dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :, :)
3466dd63270SBarry Smith
3476dd63270SBarry Smith  ptr => array
3486dd63270SBarry Smithend subroutine
3496dd63270SBarry Smith
3506dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3516dd63270SBarry Smithsubroutine F90Array3dAccessScalar(ptr, address)
352fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3536dd63270SBarry Smith  implicit none
3546dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :, :)
3556dd63270SBarry Smith  PetscFortranAddr address
3566dd63270SBarry Smith  PetscInt start1, start2, start3
3576dd63270SBarry Smith
3586dd63270SBarry Smith  start1 = lbound(ptr, 1)
3596dd63270SBarry Smith  start2 = lbound(ptr, 2)
3606dd63270SBarry Smith  start3 = lbound(ptr, 3)
3616dd63270SBarry Smith  call F90Array3dGetAddrScalar(ptr(start1, start2, start3), address)
3626dd63270SBarry Smithend subroutine
3636dd63270SBarry Smith
3646dd63270SBarry Smithsubroutine F90Array3dAccessReal(ptr, address)
365fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3666dd63270SBarry Smith  implicit none
3676dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :, :)
3686dd63270SBarry Smith  PetscFortranAddr address
3696dd63270SBarry Smith  PetscInt start1, start2, start3
3706dd63270SBarry Smith
3716dd63270SBarry Smith  start1 = lbound(ptr, 1)
3726dd63270SBarry Smith  start2 = lbound(ptr, 2)
3736dd63270SBarry Smith  start3 = lbound(ptr, 3)
3746dd63270SBarry Smith  call F90Array3dGetAddrReal(ptr(start1, start2, start3), address)
3756dd63270SBarry Smithend subroutine
3766dd63270SBarry Smith
3776dd63270SBarry Smithsubroutine F90Array3dAccessInt(ptr, address)
378fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3796dd63270SBarry Smith  implicit none
3806dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :, :)
3816dd63270SBarry Smith  PetscFortranAddr address
3826dd63270SBarry Smith  PetscInt start1, start2, start3
3836dd63270SBarry Smith
3846dd63270SBarry Smith  start1 = lbound(ptr, 1)
3856dd63270SBarry Smith  start2 = lbound(ptr, 2)
3866dd63270SBarry Smith  start3 = lbound(ptr, 3)
3876dd63270SBarry Smith  call F90Array3dGetAddrInt(ptr(start1, start2, start3), address)
3886dd63270SBarry Smithend subroutine
3896dd63270SBarry Smith
3906dd63270SBarry Smithsubroutine F90Array3dAccessFortranAddr(ptr, address)
391fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
3926dd63270SBarry Smith  implicit none
3936dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :, :)
3946dd63270SBarry Smith  PetscFortranAddr address
3956dd63270SBarry Smith  PetscInt start1, start2, start3
3966dd63270SBarry Smith
3976dd63270SBarry Smith  start1 = lbound(ptr, 1)
3986dd63270SBarry Smith  start2 = lbound(ptr, 2)
3996dd63270SBarry Smith  start3 = lbound(ptr, 3)
400*057526baSMartin Diehl  call F90Array3dGetAddrFortranAddr(ptr(start1, start2, start3), address)
4016dd63270SBarry Smithend subroutine
4026dd63270SBarry Smith
4036dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4046dd63270SBarry Smithsubroutine F90Array3dDestroyScalar(ptr)
405fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4066dd63270SBarry Smith  implicit none
4076dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :, :)
4086dd63270SBarry Smith
4096dd63270SBarry Smith  nullify (ptr)
4106dd63270SBarry Smithend subroutine
4116dd63270SBarry Smith
4126dd63270SBarry Smithsubroutine F90Array3dDestroyReal(ptr)
413fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4146dd63270SBarry Smith  implicit none
4156dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :, :)
4166dd63270SBarry Smith
4176dd63270SBarry Smith  nullify (ptr)
4186dd63270SBarry Smithend subroutine
4196dd63270SBarry Smith
4206dd63270SBarry Smithsubroutine F90Array3dDestroyInt(ptr)
421fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4226dd63270SBarry Smith  implicit none
4236dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :, :)
4246dd63270SBarry Smith
4256dd63270SBarry Smith  nullify (ptr)
4266dd63270SBarry Smithend subroutine
4276dd63270SBarry Smith
4286dd63270SBarry Smithsubroutine F90Array3dDestroyFortranAddr(ptr)
429fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4306dd63270SBarry Smith  implicit none
4316dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :, :)
4326dd63270SBarry Smith
4336dd63270SBarry Smith  nullify (ptr)
4346dd63270SBarry Smithend subroutine
4356dd63270SBarry Smith
4366dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
437*057526baSMartin Diehlsubroutine F90Array4dCreateScalar(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
438fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4396dd63270SBarry Smith  implicit none
4406dd63270SBarry Smith  PetscInt start1, len1
4416dd63270SBarry Smith  PetscInt start2, len2
4426dd63270SBarry Smith  PetscInt start3, len3
4436dd63270SBarry Smith  PetscInt start4, len4
444*057526baSMartin Diehl  PetscScalar, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
4456dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :, :, :)
4466dd63270SBarry Smith
4476dd63270SBarry Smith  ptr => array
4486dd63270SBarry Smithend subroutine
4496dd63270SBarry Smith
450*057526baSMartin Diehlsubroutine F90Array4dCreateReal(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
451fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4526dd63270SBarry Smith  implicit none
4536dd63270SBarry Smith  PetscInt start1, len1
4546dd63270SBarry Smith  PetscInt start2, len2
4556dd63270SBarry Smith  PetscInt start3, len3
4566dd63270SBarry Smith  PetscInt start4, len4
457*057526baSMartin Diehl  PetscReal, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
4586dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :, :, :)
4596dd63270SBarry Smith
4606dd63270SBarry Smith  ptr => array
4616dd63270SBarry Smithend subroutine
4626dd63270SBarry Smith
463*057526baSMartin Diehlsubroutine F90Array4dCreateInt(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
464fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4656dd63270SBarry Smith  implicit none
4666dd63270SBarry Smith  PetscInt start1, len1
4676dd63270SBarry Smith  PetscInt start2, len2
4686dd63270SBarry Smith  PetscInt start3, len3
4696dd63270SBarry Smith  PetscInt start4, len4
470*057526baSMartin Diehl  PetscInt, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
4716dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :, :, :)
4726dd63270SBarry Smith
4736dd63270SBarry Smith  ptr => array
4746dd63270SBarry Smithend subroutine
4756dd63270SBarry Smith
476*057526baSMartin Diehlsubroutine F90Array4dCreateFortranAddr(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
477fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4786dd63270SBarry Smith  implicit none
4796dd63270SBarry Smith  PetscInt start1, len1
4806dd63270SBarry Smith  PetscInt start2, len2
4816dd63270SBarry Smith  PetscInt start3, len3
4826dd63270SBarry Smith  PetscInt start4, len4
483*057526baSMartin Diehl  PetscFortranAddr, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
4846dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :, :, :)
4856dd63270SBarry Smith
4866dd63270SBarry Smith  ptr => array
4876dd63270SBarry Smithend subroutine
4886dd63270SBarry Smith
4896dd63270SBarry Smithsubroutine F90Array4dAccessScalar(ptr, address)
490fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
4916dd63270SBarry Smith  implicit none
4926dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :, :, :)
4936dd63270SBarry Smith  PetscFortranAddr address
4946dd63270SBarry Smith  PetscInt start1, start2, start3, start4
4956dd63270SBarry Smith
4966dd63270SBarry Smith  start1 = lbound(ptr, 1)
4976dd63270SBarry Smith  start2 = lbound(ptr, 2)
4986dd63270SBarry Smith  start3 = lbound(ptr, 3)
4996dd63270SBarry Smith  start4 = lbound(ptr, 4)
500*057526baSMartin Diehl  call F90Array4dGetAddrScalar(ptr(start1, start2, start3, start4), address)
5016dd63270SBarry Smithend subroutine
5026dd63270SBarry Smith
5036dd63270SBarry Smithsubroutine F90Array4dAccessReal(ptr, address)
504fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
5056dd63270SBarry Smith  implicit none
5066dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :, :, :)
5076dd63270SBarry Smith  PetscFortranAddr address
5086dd63270SBarry Smith  PetscInt start1, start2, start3, start4
5096dd63270SBarry Smith
5106dd63270SBarry Smith  start1 = lbound(ptr, 1)
5116dd63270SBarry Smith  start2 = lbound(ptr, 2)
5126dd63270SBarry Smith  start3 = lbound(ptr, 3)
5136dd63270SBarry Smith  start4 = lbound(ptr, 4)
514*057526baSMartin Diehl  call F90Array4dGetAddrReal(ptr(start1, start2, start3, start4), address)
5156dd63270SBarry Smithend subroutine
5166dd63270SBarry Smith
5176dd63270SBarry Smithsubroutine F90Array4dAccessInt(ptr, address)
518fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
5196dd63270SBarry Smith  implicit none
5206dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :, :, :)
5216dd63270SBarry Smith  PetscFortranAddr address
5226dd63270SBarry Smith  PetscInt start1, start2, start3, start4
5236dd63270SBarry Smith
5246dd63270SBarry Smith  start1 = lbound(ptr, 1)
5256dd63270SBarry Smith  start2 = lbound(ptr, 2)
5266dd63270SBarry Smith  start3 = lbound(ptr, 3)
5276dd63270SBarry Smith  start4 = lbound(ptr, 4)
528*057526baSMartin Diehl  call F90Array4dGetAddrInt(ptr(start1, start2, start3, start4), address)
5296dd63270SBarry Smithend subroutine
5306dd63270SBarry Smith
5316dd63270SBarry Smithsubroutine F90Array4dAccessFortranAddr(ptr, address)
532fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
5336dd63270SBarry Smith  implicit none
5346dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :, :, :)
5356dd63270SBarry Smith  PetscFortranAddr address
5366dd63270SBarry Smith  PetscFortranAddr start1, start2, start3, start4
5376dd63270SBarry Smith
5386dd63270SBarry Smith  start1 = lbound(ptr, 1)
5396dd63270SBarry Smith  start2 = lbound(ptr, 2)
5406dd63270SBarry Smith  start3 = lbound(ptr, 3)
5416dd63270SBarry Smith  start4 = lbound(ptr, 4)
542*057526baSMartin Diehl  call F90Array4dGetAddrFortranAddr(ptr(start1, start2, start3, start4), address)
5436dd63270SBarry Smithend subroutine
5446dd63270SBarry Smith
5456dd63270SBarry Smithsubroutine F90Array4dDestroyScalar(ptr)
546fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
5476dd63270SBarry Smith  implicit none
5486dd63270SBarry Smith  PetscScalar, pointer :: ptr(:, :, :, :)
5496dd63270SBarry Smith
5506dd63270SBarry Smith  nullify (ptr)
5516dd63270SBarry Smithend subroutine
5526dd63270SBarry Smith
5536dd63270SBarry Smithsubroutine F90Array4dDestroyReal(ptr)
554fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
5556dd63270SBarry Smith  implicit none
5566dd63270SBarry Smith  PetscReal, pointer :: ptr(:, :, :, :)
5576dd63270SBarry Smith
5586dd63270SBarry Smith  nullify (ptr)
5596dd63270SBarry Smithend subroutine
5606dd63270SBarry Smith
5616dd63270SBarry Smithsubroutine F90Array4dDestroyInt(ptr)
562fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
5636dd63270SBarry Smith  implicit none
5646dd63270SBarry Smith  PetscInt, pointer :: ptr(:, :, :, :)
5656dd63270SBarry Smith
5666dd63270SBarry Smith  nullify (ptr)
5676dd63270SBarry Smithend subroutine
5686dd63270SBarry Smith
5696dd63270SBarry Smithsubroutine F90Array4dDestroyFortranAddr(ptr)
570fe66ebccSMartin Diehl  use, intrinsic :: ISO_C_binding
5716dd63270SBarry Smith  implicit none
5726dd63270SBarry Smith  PetscFortranAddr, pointer :: ptr(:, :, :, :)
5736dd63270SBarry Smith
5746dd63270SBarry Smith  nullify (ptr)
5756dd63270SBarry Smithend subroutine
5766dd63270SBarry Smith
5776dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5786dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
5796dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
580