1*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2*6dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX! 3*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 4*6dd63270SBarry Smith#include <petsc/finclude/petscsys.h> 5*6dd63270SBarry Smith subroutine F90Array1dCreateScalar(array,start,len1,ptr) 6*6dd63270SBarry Smith implicit none 7*6dd63270SBarry Smith PetscInt start,len1 8*6dd63270SBarry Smith PetscScalar, target :: & 9*6dd63270SBarry Smith & array(start:start+len1-1) 10*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:) 11*6dd63270SBarry Smith 12*6dd63270SBarry Smith ptr => array 13*6dd63270SBarry Smith end subroutine 14*6dd63270SBarry Smith 15*6dd63270SBarry Smith subroutine F90Array1dCreateReal(array,start,len1,ptr) 16*6dd63270SBarry Smith implicit none 17*6dd63270SBarry Smith PetscInt start,len1 18*6dd63270SBarry Smith PetscReal, target :: & 19*6dd63270SBarry Smith & array(start:start+len1-1) 20*6dd63270SBarry Smith PetscReal, pointer :: ptr(:) 21*6dd63270SBarry Smith 22*6dd63270SBarry Smith ptr => array 23*6dd63270SBarry Smith end subroutine 24*6dd63270SBarry Smith 25*6dd63270SBarry Smith subroutine F90Array1dCreateInt(array,start,len1,ptr) 26*6dd63270SBarry Smith implicit none 27*6dd63270SBarry Smith PetscInt start,len1 28*6dd63270SBarry Smith PetscInt, target :: & 29*6dd63270SBarry Smith & array(start:start+len1-1) 30*6dd63270SBarry Smith PetscInt, pointer :: ptr(:) 31*6dd63270SBarry Smith 32*6dd63270SBarry Smith ptr => array 33*6dd63270SBarry Smith end subroutine 34*6dd63270SBarry Smith 35*6dd63270SBarry Smith subroutine F90Array1dCreateMPIInt(array,start,len1,ptr) 36*6dd63270SBarry Smith implicit none 37*6dd63270SBarry Smith PetscInt start,len1 38*6dd63270SBarry Smith PetscMPIInt, target :: & 39*6dd63270SBarry Smith & array(start:start+len1-1) 40*6dd63270SBarry Smith PetscMPIInt, pointer :: ptr(:) 41*6dd63270SBarry Smith 42*6dd63270SBarry Smith ptr => array 43*6dd63270SBarry Smith end subroutine 44*6dd63270SBarry Smith 45*6dd63270SBarry Smith subroutine F90Array1dCreateFortranAddr(array,start,len1,ptr) 46*6dd63270SBarry Smith implicit none 47*6dd63270SBarry Smith PetscInt start,len1 48*6dd63270SBarry Smith PetscFortranAddr, target :: & 49*6dd63270SBarry Smith & array(start:start+len1-1) 50*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:) 51*6dd63270SBarry Smith 52*6dd63270SBarry Smith ptr => array 53*6dd63270SBarry Smith end subroutine 54*6dd63270SBarry Smith 55*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 56*6dd63270SBarry Smith subroutine F90Array1dAccessScalar(ptr,address) 57*6dd63270SBarry Smith implicit none 58*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:) 59*6dd63270SBarry Smith PetscFortranAddr address 60*6dd63270SBarry Smith PetscInt start 61*6dd63270SBarry Smith 62*6dd63270SBarry Smith if (associated(ptr) .eqv. .false.) then 63*6dd63270SBarry Smith address = 0 64*6dd63270SBarry Smith else 65*6dd63270SBarry Smith start = lbound(ptr,1) 66*6dd63270SBarry Smith call F90Array1dGetAddrScalar(ptr(start),address) 67*6dd63270SBarry Smith endif 68*6dd63270SBarry Smith end subroutine 69*6dd63270SBarry Smith 70*6dd63270SBarry Smith subroutine F90Array1dAccessReal(ptr,address) 71*6dd63270SBarry Smith implicit none 72*6dd63270SBarry Smith PetscReal, pointer :: ptr(:) 73*6dd63270SBarry Smith PetscFortranAddr address 74*6dd63270SBarry Smith PetscInt start 75*6dd63270SBarry Smith 76*6dd63270SBarry Smith if (associated(ptr) .eqv. .false.) then 77*6dd63270SBarry Smith address = 0 78*6dd63270SBarry Smith else 79*6dd63270SBarry Smith start = lbound(ptr,1) 80*6dd63270SBarry Smith call F90Array1dGetAddrReal(ptr(start),address) 81*6dd63270SBarry Smith endif 82*6dd63270SBarry Smith end subroutine 83*6dd63270SBarry Smith 84*6dd63270SBarry Smith subroutine F90Array1dAccessInt(ptr,address) 85*6dd63270SBarry Smith implicit none 86*6dd63270SBarry Smith PetscInt, pointer :: ptr(:) 87*6dd63270SBarry Smith PetscFortranAddr address 88*6dd63270SBarry Smith PetscInt start 89*6dd63270SBarry Smith 90*6dd63270SBarry Smith if (associated(ptr) .eqv. .false.) then 91*6dd63270SBarry Smith address = 0 92*6dd63270SBarry Smith else 93*6dd63270SBarry Smith start = lbound(ptr,1) 94*6dd63270SBarry Smith call F90Array1dGetAddrInt(ptr(start),address) 95*6dd63270SBarry Smith endif 96*6dd63270SBarry Smith end subroutine 97*6dd63270SBarry Smith 98*6dd63270SBarry Smith subroutine F90Array1dAccessMPIInt(ptr,address) 99*6dd63270SBarry Smith implicit none 100*6dd63270SBarry Smith PetscMPIInt, pointer :: ptr(:) 101*6dd63270SBarry Smith PetscFortranAddr address 102*6dd63270SBarry Smith PetscInt start 103*6dd63270SBarry Smith 104*6dd63270SBarry Smith if (associated(ptr) .eqv. .false.) then 105*6dd63270SBarry Smith address = 0 106*6dd63270SBarry Smith else 107*6dd63270SBarry Smith start = lbound(ptr,1) 108*6dd63270SBarry Smith call F90Array1dGetAddrMPIInt(ptr(start),address) 109*6dd63270SBarry Smith endif 110*6dd63270SBarry Smith end subroutine 111*6dd63270SBarry Smith 112*6dd63270SBarry Smith subroutine F90Array1dAccessFortranAddr(ptr,address) 113*6dd63270SBarry Smith implicit none 114*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:) 115*6dd63270SBarry Smith PetscFortranAddr address 116*6dd63270SBarry Smith PetscInt start 117*6dd63270SBarry Smith 118*6dd63270SBarry Smith if (associated(ptr) .eqv. .false.) then 119*6dd63270SBarry Smith address = 0 120*6dd63270SBarry Smith else 121*6dd63270SBarry Smith start = lbound(ptr,1) 122*6dd63270SBarry Smith call F90Array1dGetAddrFortranAddr(ptr(start),address) 123*6dd63270SBarry Smith endif 124*6dd63270SBarry Smith end subroutine 125*6dd63270SBarry Smith 126*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 127*6dd63270SBarry Smith subroutine F90Array1dDestroyScalar(ptr) 128*6dd63270SBarry Smith implicit none 129*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:) 130*6dd63270SBarry Smith 131*6dd63270SBarry Smith nullify(ptr) 132*6dd63270SBarry Smith end subroutine 133*6dd63270SBarry Smith 134*6dd63270SBarry Smith subroutine F90Array1dDestroyReal(ptr) 135*6dd63270SBarry Smith implicit none 136*6dd63270SBarry Smith PetscReal, pointer :: ptr(:) 137*6dd63270SBarry Smith 138*6dd63270SBarry Smith nullify(ptr) 139*6dd63270SBarry Smith end subroutine 140*6dd63270SBarry Smith 141*6dd63270SBarry Smith subroutine F90Array1dDestroyInt(ptr) 142*6dd63270SBarry Smith implicit none 143*6dd63270SBarry Smith PetscInt, pointer :: ptr(:) 144*6dd63270SBarry Smith 145*6dd63270SBarry Smith nullify(ptr) 146*6dd63270SBarry Smith end subroutine 147*6dd63270SBarry Smith 148*6dd63270SBarry Smith subroutine F90Array1dDestroyMPIInt(ptr) 149*6dd63270SBarry Smith implicit none 150*6dd63270SBarry Smith PetscMPIInt, pointer :: ptr(:) 151*6dd63270SBarry Smith 152*6dd63270SBarry Smith nullify(ptr) 153*6dd63270SBarry Smith end subroutine 154*6dd63270SBarry Smith 155*6dd63270SBarry Smith subroutine F90Array1dDestroyFortranAddr(ptr) 156*6dd63270SBarry Smith implicit none 157*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:) 158*6dd63270SBarry Smith 159*6dd63270SBarry Smith nullify(ptr) 160*6dd63270SBarry Smith end subroutine 161*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 162*6dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX! 163*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 164*6dd63270SBarry Smith subroutine F90Array2dCreateScalar(array,start1,len1, & 165*6dd63270SBarry Smith & start2,len2,ptr) 166*6dd63270SBarry Smith implicit none 167*6dd63270SBarry Smith PetscInt start1,len1 168*6dd63270SBarry Smith PetscInt start2,len2 169*6dd63270SBarry Smith PetscScalar, target :: & 170*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1) 171*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:) 172*6dd63270SBarry Smith 173*6dd63270SBarry Smith ptr => array 174*6dd63270SBarry Smith end subroutine 175*6dd63270SBarry Smith 176*6dd63270SBarry Smith subroutine F90Array2dCreateReal(array,start1,len1, & 177*6dd63270SBarry Smith & start2,len2,ptr) 178*6dd63270SBarry Smith implicit none 179*6dd63270SBarry Smith PetscInt start1,len1 180*6dd63270SBarry Smith PetscInt start2,len2 181*6dd63270SBarry Smith PetscReal, target :: & 182*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1) 183*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:) 184*6dd63270SBarry Smith 185*6dd63270SBarry Smith ptr => array 186*6dd63270SBarry Smith end subroutine 187*6dd63270SBarry Smith 188*6dd63270SBarry Smith subroutine F90Array2dCreateInt(array,start1,len1, & 189*6dd63270SBarry Smith & start2,len2,ptr) 190*6dd63270SBarry Smith implicit none 191*6dd63270SBarry Smith PetscInt start1,len1 192*6dd63270SBarry Smith PetscInt start2,len2 193*6dd63270SBarry Smith PetscInt, target :: & 194*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1) 195*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:) 196*6dd63270SBarry Smith 197*6dd63270SBarry Smith ptr => array 198*6dd63270SBarry Smith end subroutine 199*6dd63270SBarry Smith 200*6dd63270SBarry Smith subroutine F90Array2dCreateFortranAddr(array,start1,len1, & 201*6dd63270SBarry Smith & start2,len2,ptr) 202*6dd63270SBarry Smith implicit none 203*6dd63270SBarry Smith PetscInt start1,len1 204*6dd63270SBarry Smith PetscInt start2,len2 205*6dd63270SBarry Smith PetscFortranAddr, target :: & 206*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1) 207*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:) 208*6dd63270SBarry Smith 209*6dd63270SBarry Smith ptr => array 210*6dd63270SBarry Smith end subroutine 211*6dd63270SBarry Smith 212*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 213*6dd63270SBarry Smith subroutine F90Array2dAccessScalar(ptr,address) 214*6dd63270SBarry Smith implicit none 215*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:) 216*6dd63270SBarry Smith PetscFortranAddr address 217*6dd63270SBarry Smith PetscInt start1,start2 218*6dd63270SBarry Smith 219*6dd63270SBarry Smith start1 = lbound(ptr,1) 220*6dd63270SBarry Smith start2 = lbound(ptr,2) 221*6dd63270SBarry Smith call F90Array2dGetAddrScalar(ptr(start1,start2),address) 222*6dd63270SBarry Smith end subroutine 223*6dd63270SBarry Smith 224*6dd63270SBarry Smith subroutine F90Array2dAccessReal(ptr,address) 225*6dd63270SBarry Smith implicit none 226*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:) 227*6dd63270SBarry Smith PetscFortranAddr address 228*6dd63270SBarry Smith PetscInt start1,start2 229*6dd63270SBarry Smith 230*6dd63270SBarry Smith start1 = lbound(ptr,1) 231*6dd63270SBarry Smith start2 = lbound(ptr,2) 232*6dd63270SBarry Smith call F90Array2dGetAddrReal(ptr(start1,start2),address) 233*6dd63270SBarry Smith end subroutine 234*6dd63270SBarry Smith 235*6dd63270SBarry Smith subroutine F90Array2dAccessInt(ptr,address) 236*6dd63270SBarry Smith implicit none 237*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:) 238*6dd63270SBarry Smith PetscFortranAddr address 239*6dd63270SBarry Smith PetscInt start1,start2 240*6dd63270SBarry Smith 241*6dd63270SBarry Smith start1 = lbound(ptr,1) 242*6dd63270SBarry Smith start2 = lbound(ptr,2) 243*6dd63270SBarry Smith call F90Array2dGetAddrInt(ptr(start1,start2),address) 244*6dd63270SBarry Smith end subroutine 245*6dd63270SBarry Smith 246*6dd63270SBarry Smith subroutine F90Array2dAccessFortranAddr(ptr,address) 247*6dd63270SBarry Smith implicit none 248*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:) 249*6dd63270SBarry Smith PetscFortranAddr address 250*6dd63270SBarry Smith PetscInt start1,start2 251*6dd63270SBarry Smith 252*6dd63270SBarry Smith start1 = lbound(ptr,1) 253*6dd63270SBarry Smith start2 = lbound(ptr,2) 254*6dd63270SBarry Smith call F90Array2dGetAddrFortranAddr(ptr(start1,start2),address) 255*6dd63270SBarry Smith end subroutine 256*6dd63270SBarry Smith 257*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 258*6dd63270SBarry Smith subroutine F90Array2dDestroyScalar(ptr) 259*6dd63270SBarry Smith implicit none 260*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:) 261*6dd63270SBarry Smith 262*6dd63270SBarry Smith nullify(ptr) 263*6dd63270SBarry Smith end subroutine 264*6dd63270SBarry Smith 265*6dd63270SBarry Smith subroutine F90Array2dDestroyReal(ptr) 266*6dd63270SBarry Smith implicit none 267*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:) 268*6dd63270SBarry Smith 269*6dd63270SBarry Smith nullify(ptr) 270*6dd63270SBarry Smith end subroutine 271*6dd63270SBarry Smith 272*6dd63270SBarry Smith subroutine F90Array2dDestroyInt(ptr) 273*6dd63270SBarry Smith implicit none 274*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:) 275*6dd63270SBarry Smith 276*6dd63270SBarry Smith nullify(ptr) 277*6dd63270SBarry Smith end subroutine 278*6dd63270SBarry Smith 279*6dd63270SBarry Smith subroutine F90Array2dDestroyFortranAddr(ptr) 280*6dd63270SBarry Smith implicit none 281*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:) 282*6dd63270SBarry Smith 283*6dd63270SBarry Smith nullify(ptr) 284*6dd63270SBarry Smith end subroutine 285*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 286*6dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX! 287*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 288*6dd63270SBarry Smith subroutine F90Array3dCreateScalar(array,start1,len1, & 289*6dd63270SBarry Smith & start2,len2,start3,len3,ptr) 290*6dd63270SBarry Smith implicit none 291*6dd63270SBarry Smith PetscInt start1,len1 292*6dd63270SBarry Smith PetscInt start2,len2 293*6dd63270SBarry Smith PetscInt start3,len3 294*6dd63270SBarry Smith PetscScalar, target :: & 295*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 296*6dd63270SBarry Smith & start3:start3+len3-1) 297*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:,:) 298*6dd63270SBarry Smith 299*6dd63270SBarry Smith ptr => array 300*6dd63270SBarry Smith end subroutine 301*6dd63270SBarry Smith 302*6dd63270SBarry Smith subroutine F90Array3dCreateReal(array,start1,len1, & 303*6dd63270SBarry Smith & start2,len2,start3,len3,ptr) 304*6dd63270SBarry Smith implicit none 305*6dd63270SBarry Smith PetscInt start1,len1 306*6dd63270SBarry Smith PetscInt start2,len2 307*6dd63270SBarry Smith PetscInt start3,len3 308*6dd63270SBarry Smith PetscReal, target :: & 309*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 310*6dd63270SBarry Smith & start3:start3+len3-1) 311*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:,:) 312*6dd63270SBarry Smith 313*6dd63270SBarry Smith ptr => array 314*6dd63270SBarry Smith end subroutine 315*6dd63270SBarry Smith 316*6dd63270SBarry Smith subroutine F90Array3dCreateInt(array,start1,len1, & 317*6dd63270SBarry Smith & start2,len2,start3,len3,ptr) 318*6dd63270SBarry Smith implicit none 319*6dd63270SBarry Smith PetscInt start1,len1 320*6dd63270SBarry Smith PetscInt start2,len2 321*6dd63270SBarry Smith PetscInt start3,len3 322*6dd63270SBarry Smith PetscInt, target :: & 323*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 324*6dd63270SBarry Smith & start3:start3+len3-1) 325*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:,:) 326*6dd63270SBarry Smith 327*6dd63270SBarry Smith ptr => array 328*6dd63270SBarry Smith end subroutine 329*6dd63270SBarry Smith 330*6dd63270SBarry Smith subroutine F90Array3dCreateFortranAddr(array,start1,len1, & 331*6dd63270SBarry Smith & start2,len2,start3,len3,ptr) 332*6dd63270SBarry Smith implicit none 333*6dd63270SBarry Smith PetscInt start1,len1 334*6dd63270SBarry Smith PetscInt start2,len2 335*6dd63270SBarry Smith PetscInt start3,len3 336*6dd63270SBarry Smith PetscFortranAddr, target :: & 337*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 338*6dd63270SBarry Smith & start3:start3+len3-1) 339*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:,:) 340*6dd63270SBarry Smith 341*6dd63270SBarry Smith ptr => array 342*6dd63270SBarry Smith end subroutine 343*6dd63270SBarry Smith 344*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 345*6dd63270SBarry Smith subroutine F90Array3dAccessScalar(ptr,address) 346*6dd63270SBarry Smith implicit none 347*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:,:) 348*6dd63270SBarry Smith PetscFortranAddr address 349*6dd63270SBarry Smith PetscInt start1,start2,start3 350*6dd63270SBarry Smith 351*6dd63270SBarry Smith start1 = lbound(ptr,1) 352*6dd63270SBarry Smith start2 = lbound(ptr,2) 353*6dd63270SBarry Smith start3 = lbound(ptr,3) 354*6dd63270SBarry Smith call F90Array3dGetAddrScalar(ptr(start1,start2,start3),address) 355*6dd63270SBarry Smith end subroutine 356*6dd63270SBarry Smith 357*6dd63270SBarry Smith subroutine F90Array3dAccessReal(ptr,address) 358*6dd63270SBarry Smith implicit none 359*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:,:) 360*6dd63270SBarry Smith PetscFortranAddr address 361*6dd63270SBarry Smith PetscInt start1,start2,start3 362*6dd63270SBarry Smith 363*6dd63270SBarry Smith start1 = lbound(ptr,1) 364*6dd63270SBarry Smith start2 = lbound(ptr,2) 365*6dd63270SBarry Smith start3 = lbound(ptr,3) 366*6dd63270SBarry Smith call F90Array3dGetAddrReal(ptr(start1,start2,start3),address) 367*6dd63270SBarry Smith end subroutine 368*6dd63270SBarry Smith 369*6dd63270SBarry Smith subroutine F90Array3dAccessInt(ptr,address) 370*6dd63270SBarry Smith implicit none 371*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:,:) 372*6dd63270SBarry Smith PetscFortranAddr address 373*6dd63270SBarry Smith PetscInt start1,start2,start3 374*6dd63270SBarry Smith 375*6dd63270SBarry Smith start1 = lbound(ptr,1) 376*6dd63270SBarry Smith start2 = lbound(ptr,2) 377*6dd63270SBarry Smith start3 = lbound(ptr,3) 378*6dd63270SBarry Smith call F90Array3dGetAddrInt(ptr(start1,start2,start3),address) 379*6dd63270SBarry Smith end subroutine 380*6dd63270SBarry Smith 381*6dd63270SBarry Smith subroutine F90Array3dAccessFortranAddr(ptr,address) 382*6dd63270SBarry Smith implicit none 383*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:,:) 384*6dd63270SBarry Smith PetscFortranAddr address 385*6dd63270SBarry Smith PetscInt start1,start2,start3 386*6dd63270SBarry Smith 387*6dd63270SBarry Smith start1 = lbound(ptr,1) 388*6dd63270SBarry Smith start2 = lbound(ptr,2) 389*6dd63270SBarry Smith start3 = lbound(ptr,3) 390*6dd63270SBarry Smith call F90Array3dGetAddrFortranAddr(ptr(start1,start2,start3), & 391*6dd63270SBarry Smith & address) 392*6dd63270SBarry Smith end subroutine 393*6dd63270SBarry Smith 394*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 395*6dd63270SBarry Smith subroutine F90Array3dDestroyScalar(ptr) 396*6dd63270SBarry Smith implicit none 397*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:,:) 398*6dd63270SBarry Smith 399*6dd63270SBarry Smith nullify(ptr) 400*6dd63270SBarry Smith end subroutine 401*6dd63270SBarry Smith 402*6dd63270SBarry Smith subroutine F90Array3dDestroyReal(ptr) 403*6dd63270SBarry Smith implicit none 404*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:,:) 405*6dd63270SBarry Smith 406*6dd63270SBarry Smith nullify(ptr) 407*6dd63270SBarry Smith end subroutine 408*6dd63270SBarry Smith 409*6dd63270SBarry Smith subroutine F90Array3dDestroyInt(ptr) 410*6dd63270SBarry Smith implicit none 411*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:,:) 412*6dd63270SBarry Smith 413*6dd63270SBarry Smith nullify(ptr) 414*6dd63270SBarry Smith end subroutine 415*6dd63270SBarry Smith 416*6dd63270SBarry Smith subroutine F90Array3dDestroyFortranAddr(ptr) 417*6dd63270SBarry Smith implicit none 418*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:,:) 419*6dd63270SBarry Smith 420*6dd63270SBarry Smith nullify(ptr) 421*6dd63270SBarry Smith end subroutine 422*6dd63270SBarry Smith 423*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 424*6dd63270SBarry Smith subroutine F90Array4dCreateScalar(array,start1,len1, & 425*6dd63270SBarry Smith & start2,len2,start3,len3,start4,len4,ptr) 426*6dd63270SBarry Smith implicit none 427*6dd63270SBarry Smith PetscInt start1,len1 428*6dd63270SBarry Smith PetscInt start2,len2 429*6dd63270SBarry Smith PetscInt start3,len3 430*6dd63270SBarry Smith PetscInt start4,len4 431*6dd63270SBarry Smith PetscScalar, target :: & 432*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 433*6dd63270SBarry Smith & start3:start3+len3-1,start4:start4+len4-1) 434*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:,:,:) 435*6dd63270SBarry Smith 436*6dd63270SBarry Smith ptr => array 437*6dd63270SBarry Smith end subroutine 438*6dd63270SBarry Smith 439*6dd63270SBarry Smith subroutine F90Array4dCreateReal(array,start1,len1, & 440*6dd63270SBarry Smith & start2,len2,start3,len3,start4,len4,ptr) 441*6dd63270SBarry Smith implicit none 442*6dd63270SBarry Smith PetscInt start1,len1 443*6dd63270SBarry Smith PetscInt start2,len2 444*6dd63270SBarry Smith PetscInt start3,len3 445*6dd63270SBarry Smith PetscInt start4,len4 446*6dd63270SBarry Smith PetscReal, target :: & 447*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 448*6dd63270SBarry Smith & start3:start3+len3-1,start4:start4+len4-1) 449*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:,:,:) 450*6dd63270SBarry Smith 451*6dd63270SBarry Smith ptr => array 452*6dd63270SBarry Smith end subroutine 453*6dd63270SBarry Smith 454*6dd63270SBarry Smith subroutine F90Array4dCreateInt(array,start1,len1, & 455*6dd63270SBarry Smith & start2,len2,start3,len3,start4,len4,ptr) 456*6dd63270SBarry Smith implicit none 457*6dd63270SBarry Smith PetscInt start1,len1 458*6dd63270SBarry Smith PetscInt start2,len2 459*6dd63270SBarry Smith PetscInt start3,len3 460*6dd63270SBarry Smith PetscInt start4,len4 461*6dd63270SBarry Smith PetscInt, target :: & 462*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 463*6dd63270SBarry Smith & start3:start3+len3-1,start4:start4+len4-1) 464*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:,:,:) 465*6dd63270SBarry Smith 466*6dd63270SBarry Smith ptr => array 467*6dd63270SBarry Smith end subroutine 468*6dd63270SBarry Smith 469*6dd63270SBarry Smith subroutine F90Array4dCreateFortranAddr(array,start1,len1, & 470*6dd63270SBarry Smith & start2,len2,start3,len3,start4,len4,ptr) 471*6dd63270SBarry Smith implicit none 472*6dd63270SBarry Smith PetscInt start1,len1 473*6dd63270SBarry Smith PetscInt start2,len2 474*6dd63270SBarry Smith PetscInt start3,len3 475*6dd63270SBarry Smith PetscInt start4,len4 476*6dd63270SBarry Smith PetscFortranAddr, target :: & 477*6dd63270SBarry Smith & array(start1:start1+len1-1,start2:start2+len2-1, & 478*6dd63270SBarry Smith & start3:start3+len3-1,start4:start4+len4-1) 479*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:,:,:) 480*6dd63270SBarry Smith 481*6dd63270SBarry Smith ptr => array 482*6dd63270SBarry Smith end subroutine 483*6dd63270SBarry Smith 484*6dd63270SBarry Smith subroutine F90Array4dAccessScalar(ptr,address) 485*6dd63270SBarry Smith implicit none 486*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:,:,:) 487*6dd63270SBarry Smith PetscFortranAddr address 488*6dd63270SBarry Smith PetscInt start1,start2,start3,start4 489*6dd63270SBarry Smith 490*6dd63270SBarry Smith start1 = lbound(ptr,1) 491*6dd63270SBarry Smith start2 = lbound(ptr,2) 492*6dd63270SBarry Smith start3 = lbound(ptr,3) 493*6dd63270SBarry Smith start4 = lbound(ptr,4) 494*6dd63270SBarry Smith call F90Array4dGetAddrScalar(ptr(start1,start2,start3,start4), & 495*6dd63270SBarry Smith & address) 496*6dd63270SBarry Smith end subroutine 497*6dd63270SBarry Smith 498*6dd63270SBarry Smith subroutine F90Array4dAccessReal(ptr,address) 499*6dd63270SBarry Smith implicit none 500*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:,:,:) 501*6dd63270SBarry Smith PetscFortranAddr address 502*6dd63270SBarry Smith PetscInt start1,start2,start3,start4 503*6dd63270SBarry Smith 504*6dd63270SBarry Smith start1 = lbound(ptr,1) 505*6dd63270SBarry Smith start2 = lbound(ptr,2) 506*6dd63270SBarry Smith start3 = lbound(ptr,3) 507*6dd63270SBarry Smith start4 = lbound(ptr,4) 508*6dd63270SBarry Smith call F90Array4dGetAddrReal(ptr(start1,start2,start3,start4), & 509*6dd63270SBarry Smith & address) 510*6dd63270SBarry Smith end subroutine 511*6dd63270SBarry Smith 512*6dd63270SBarry Smith subroutine F90Array4dAccessInt(ptr,address) 513*6dd63270SBarry Smith implicit none 514*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:,:,:) 515*6dd63270SBarry Smith PetscFortranAddr address 516*6dd63270SBarry Smith PetscInt start1,start2,start3,start4 517*6dd63270SBarry Smith 518*6dd63270SBarry Smith start1 = lbound(ptr,1) 519*6dd63270SBarry Smith start2 = lbound(ptr,2) 520*6dd63270SBarry Smith start3 = lbound(ptr,3) 521*6dd63270SBarry Smith start4 = lbound(ptr,4) 522*6dd63270SBarry Smith call F90Array4dGetAddrInt(ptr(start1,start2,start3,start4), & 523*6dd63270SBarry Smith & address) 524*6dd63270SBarry Smith end subroutine 525*6dd63270SBarry Smith 526*6dd63270SBarry Smith subroutine F90Array4dAccessFortranAddr(ptr,address) 527*6dd63270SBarry Smith implicit none 528*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:,:,:) 529*6dd63270SBarry Smith PetscFortranAddr address 530*6dd63270SBarry Smith PetscFortranAddr start1,start2,start3,start4 531*6dd63270SBarry Smith 532*6dd63270SBarry Smith start1 = lbound(ptr,1) 533*6dd63270SBarry Smith start2 = lbound(ptr,2) 534*6dd63270SBarry Smith start3 = lbound(ptr,3) 535*6dd63270SBarry Smith start4 = lbound(ptr,4) 536*6dd63270SBarry Smith call F90Array4dGetAddrFortranAddr(ptr(start1,start2,start3, & 537*6dd63270SBarry Smith & start4),address) 538*6dd63270SBarry Smith end subroutine 539*6dd63270SBarry Smith 540*6dd63270SBarry Smith subroutine F90Array4dDestroyScalar(ptr) 541*6dd63270SBarry Smith implicit none 542*6dd63270SBarry Smith PetscScalar, pointer :: ptr(:,:,:,:) 543*6dd63270SBarry Smith 544*6dd63270SBarry Smith nullify(ptr) 545*6dd63270SBarry Smith end subroutine 546*6dd63270SBarry Smith 547*6dd63270SBarry Smith subroutine F90Array4dDestroyReal(ptr) 548*6dd63270SBarry Smith implicit none 549*6dd63270SBarry Smith PetscReal, pointer :: ptr(:,:,:,:) 550*6dd63270SBarry Smith 551*6dd63270SBarry Smith nullify(ptr) 552*6dd63270SBarry Smith end subroutine 553*6dd63270SBarry Smith 554*6dd63270SBarry Smith subroutine F90Array4dDestroyInt(ptr) 555*6dd63270SBarry Smith implicit none 556*6dd63270SBarry Smith PetscInt, pointer :: ptr(:,:,:,:) 557*6dd63270SBarry Smith 558*6dd63270SBarry Smith nullify(ptr) 559*6dd63270SBarry Smith end subroutine 560*6dd63270SBarry Smith 561*6dd63270SBarry Smith subroutine F90Array4dDestroyFortranAddr(ptr) 562*6dd63270SBarry Smith implicit none 563*6dd63270SBarry Smith PetscFortranAddr, pointer :: ptr(:,:,:,:) 564*6dd63270SBarry Smith 565*6dd63270SBarry Smith nullify(ptr) 566*6dd63270SBarry Smith end subroutine 567*6dd63270SBarry Smith 568*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 569*6dd63270SBarry Smith!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX! 570*6dd63270SBarry Smith!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 571