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