Actual source code: f90_fwrap.F90

  1: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2: !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
  3: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  4: #include <petsc/finclude/petscsys.h>
  5: subroutine F90Array1dCreateScalar(array, start, len1, ptr)
  6:   use, intrinsic :: ISO_C_binding
  7:   implicit none
  8:   PetscInt start, len1
  9:   PetscScalar, target :: array(start:start + len1 - 1)
 10:   PetscScalar, pointer :: ptr(:)

 12:   ptr => array
 13: end subroutine

 15: subroutine F90Array1dCreateReal(array, start, len1, ptr)
 16:   use, intrinsic :: ISO_C_binding
 17:   implicit none
 18:   PetscInt start, len1
 19:   PetscReal, target :: array(start:start + len1 - 1)
 20:   PetscReal, pointer :: ptr(:)

 22:   ptr => array
 23: end subroutine

 25: subroutine F90Array1dCreateInt(array, start, len1, ptr)
 26:   use, intrinsic :: ISO_C_binding
 27:   implicit none
 28:   PetscInt start, len1
 29:   PetscInt, target :: array(start:start + len1 - 1)
 30:   PetscInt, pointer :: ptr(:)

 32:   ptr => array
 33: end subroutine

 35: subroutine F90Array1dCreateBool(array, start, len1, ptr)
 36:   use, intrinsic :: ISO_C_binding
 37:   implicit none
 38:   PetscInt start, len1
 39:   PetscBool, target :: array(start:start + len1 - 1)
 40:   PetscBool, pointer :: ptr(:)

 42:   ptr => array
 43: end subroutine

 45: subroutine F90Array1dCreateMPIInt(array, start, len1, ptr)
 46:   use, intrinsic :: ISO_C_binding
 47:   implicit none
 48:   PetscInt start, len1
 49:   PetscMPIInt, target :: array(start:start + len1 - 1)
 50:   PetscMPIInt, pointer :: ptr(:)

 52:   ptr => array
 53: end subroutine

 55: subroutine F90Array1dCreateFortranAddr(array, start, len1, ptr)
 56:   use, intrinsic :: ISO_C_binding
 57:   implicit none
 58:   PetscInt start, len1
 59:   PetscFortranAddr, target :: array(start:start + len1 - 1)
 60:   PetscFortranAddr, pointer :: ptr(:)

 62:   ptr => array
 63: end subroutine

 65: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 66: subroutine F90Array1dAccessScalar(ptr, address)
 67:   use, intrinsic :: ISO_C_binding
 68:   implicit none
 69:   PetscScalar, pointer :: ptr(:)
 70:   PetscFortranAddr address
 71:   PetscInt start

 73:   if (.not. associated(ptr)) then
 74:     address = 0
 75:   else
 76:     start = lbound(ptr, 1)
 77:     call F90Array1dGetAddrScalar(ptr(start), address)
 78:   end if
 79: end subroutine

 81: subroutine F90Array1dAccessReal(ptr, address)
 82:   use, intrinsic :: ISO_C_binding
 83:   implicit none
 84:   PetscReal, pointer :: ptr(:)
 85:   PetscFortranAddr address
 86:   PetscInt start

 88:   if (.not. associated(ptr)) then
 89:     address = 0
 90:   else
 91:     start = lbound(ptr, 1)
 92:     call F90Array1dGetAddrReal(ptr(start), address)
 93:   end if
 94: end subroutine

 96: subroutine F90Array1dAccessInt(ptr, address)
 97:   use, intrinsic :: ISO_C_binding
 98:   implicit none
 99:   PetscInt, pointer :: ptr(:)
100:   PetscFortranAddr address
101:   PetscInt start

103:   if (.not. associated(ptr)) then
104:     address = 0
105:   else
106:     start = lbound(ptr, 1)
107:     call F90Array1dGetAddrInt(ptr(start), address)
108:   end if
109: end subroutine

111: subroutine F90Array1dAccessBool(ptr, address)
112:   use, intrinsic :: ISO_C_binding
113:   implicit none
114:   PetscBool, pointer :: ptr(:)
115:   PetscFortranAddr address
116:   PetscInt start

118:   if (.not. associated(ptr)) then
119:     address = 0
120:   else
121:     start = lbound(ptr, 1)
122:     call F90Array1dGetAddrBool(ptr(start), address)
123:   end if
124: end subroutine

126: subroutine F90Array1dAccessMPIInt(ptr, address)
127:   use, intrinsic :: ISO_C_binding
128:   implicit none
129:   PetscMPIInt, pointer :: ptr(:)
130:   PetscFortranAddr address
131:   PetscInt start

133:   if (.not. associated(ptr)) then
134:     address = 0
135:   else
136:     start = lbound(ptr, 1)
137:     call F90Array1dGetAddrMPIInt(ptr(start), address)
138:   end if
139: end subroutine

141: subroutine F90Array1dAccessFortranAddr(ptr, address)
142:   use, intrinsic :: ISO_C_binding
143:   implicit none
144:   PetscFortranAddr, pointer :: ptr(:)
145:   PetscFortranAddr address
146:   PetscInt start

148:   if (.not. associated(ptr)) then
149:     address = 0
150:   else
151:     start = lbound(ptr, 1)
152:     call F90Array1dGetAddrFortranAddr(ptr(start), address)
153:   end if
154: end subroutine

156: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
157: subroutine F90Array1dDestroyScalar(ptr)
158:   use, intrinsic :: ISO_C_binding
159:   implicit none
160:   PetscScalar, pointer :: ptr(:)

162:   nullify (ptr)
163: end subroutine

165: subroutine F90Array1dDestroyReal(ptr)
166:   use, intrinsic :: ISO_C_binding
167:   implicit none
168:   PetscReal, pointer :: ptr(:)

170:   nullify (ptr)
171: end subroutine

173: subroutine F90Array1dDestroyInt(ptr)
174:   use, intrinsic :: ISO_C_binding
175:   implicit none
176:   PetscInt, pointer :: ptr(:)

178:   nullify (ptr)
179: end subroutine

181: subroutine F90Array1dDestroyBool(ptr)
182:   use, intrinsic :: ISO_C_binding
183:   implicit none
184:   PetscBool, pointer :: ptr(:)

186:   nullify (ptr)
187: end subroutine

189: subroutine F90Array1dDestroyMPIInt(ptr)
190:   use, intrinsic :: ISO_C_binding
191:   implicit none
192:   PetscMPIInt, pointer :: ptr(:)

194:   nullify (ptr)
195: end subroutine

197: subroutine F90Array1dDestroyFortranAddr(ptr)
198:   use, intrinsic :: ISO_C_binding
199:   implicit none
200:   PetscFortranAddr, pointer :: ptr(:)

202:   nullify (ptr)
203: end subroutine
204: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
205: !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
206: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
207: subroutine F90Array2dCreateScalar(array, start1, len1, start2, len2, ptr)
208:   use, intrinsic :: ISO_C_binding
209:   implicit none
210:   PetscInt start1, len1
211:   PetscInt start2, len2
212:   PetscScalar, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
213:   PetscScalar, pointer :: ptr(:, :)

215:   ptr => array
216: end subroutine

218: subroutine F90Array2dCreateReal(array, start1, len1, start2, len2, ptr)
219:   use, intrinsic :: ISO_C_binding
220:   implicit none
221:   PetscInt start1, len1
222:   PetscInt start2, len2
223:   PetscReal, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
224:   PetscReal, pointer :: ptr(:, :)

226:   ptr => array
227: end subroutine

229: subroutine F90Array2dCreateInt(array, start1, len1, start2, len2, ptr)
230:   use, intrinsic :: ISO_C_binding
231:   implicit none
232:   PetscInt start1, len1
233:   PetscInt start2, len2
234:   PetscInt, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
235:   PetscInt, pointer :: ptr(:, :)

237:   ptr => array
238: end subroutine

240: subroutine F90Array2dCreateBool(array, start1, len1, start2, len2, ptr)
241:   use, intrinsic :: ISO_C_binding
242:   implicit none
243:   PetscInt start1, len1
244:   PetscInt start2, len2
245:   PetscBool, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
246:   PetscBool, pointer :: ptr(:, :)

248:   ptr => array
249: end subroutine

251: subroutine F90Array2dCreateFortranAddr(array, start1, len1, start2, len2, ptr)
252:   use, intrinsic :: ISO_C_binding
253:   implicit none
254:   PetscInt start1, len1
255:   PetscInt start2, len2
256:   PetscFortranAddr, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1)
257:   PetscFortranAddr, pointer :: ptr(:, :)

259:   ptr => array
260: end subroutine

262: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
263: subroutine F90Array2dAccessScalar(ptr, address)
264:   use, intrinsic :: ISO_C_binding
265:   implicit none
266:   PetscScalar, pointer :: ptr(:, :)
267:   PetscFortranAddr address
268:   PetscInt start1, start2

270:   start1 = lbound(ptr, 1)
271:   start2 = lbound(ptr, 2)
272:   call F90Array2dGetAddrScalar(ptr(start1, start2), address)
273: end subroutine

275: subroutine F90Array2dAccessReal(ptr, address)
276:   use, intrinsic :: ISO_C_binding
277:   implicit none
278:   PetscReal, pointer :: ptr(:, :)
279:   PetscFortranAddr address
280:   PetscInt start1, start2

282:   start1 = lbound(ptr, 1)
283:   start2 = lbound(ptr, 2)
284:   call F90Array2dGetAddrReal(ptr(start1, start2), address)
285: end subroutine

287: subroutine F90Array2dAccessInt(ptr, address)
288:   use, intrinsic :: ISO_C_binding
289:   implicit none
290:   PetscInt, pointer :: ptr(:, :)
291:   PetscFortranAddr address
292:   PetscInt start1, start2

294:   start1 = lbound(ptr, 1)
295:   start2 = lbound(ptr, 2)
296:   call F90Array2dGetAddrInt(ptr(start1, start2), address)
297: end subroutine

299: subroutine F90Array2dAccessBool(ptr, address)
300:   use, intrinsic :: ISO_C_binding
301:   implicit none
302:   PetscBool, pointer :: ptr(:, :)
303:   PetscFortranAddr address
304:   PetscInt start1, start2

306:   start1 = lbound(ptr, 1)
307:   start2 = lbound(ptr, 2)
308:   call F90Array2dGetAddrBool(ptr(start1, start2), address)
309: end subroutine

311: subroutine F90Array2dAccessFortranAddr(ptr, address)
312:   use, intrinsic :: ISO_C_binding
313:   implicit none
314:   PetscFortranAddr, pointer :: ptr(:, :)
315:   PetscFortranAddr address
316:   PetscInt start1, start2

318:   start1 = lbound(ptr, 1)
319:   start2 = lbound(ptr, 2)
320:   call F90Array2dGetAddrFortranAddr(ptr(start1, start2), address)
321: end subroutine

323: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
324: subroutine F90Array2dDestroyScalar(ptr)
325:   use, intrinsic :: ISO_C_binding
326:   implicit none
327:   PetscScalar, pointer :: ptr(:, :)

329:   nullify (ptr)
330: end subroutine

332: subroutine F90Array2dDestroyReal(ptr)
333:   use, intrinsic :: ISO_C_binding
334:   implicit none
335:   PetscReal, pointer :: ptr(:, :)

337:   nullify (ptr)
338: end subroutine

340: subroutine F90Array2dDestroyInt(ptr)
341:   use, intrinsic :: ISO_C_binding
342:   implicit none
343:   PetscInt, pointer :: ptr(:, :)

345:   nullify (ptr)
346: end subroutine

348: subroutine F90Array2dDestroyBool(ptr)
349:   use, intrinsic :: ISO_C_binding
350:   implicit none
351:   PetscBool, pointer :: ptr(:, :)

353:   nullify (ptr)
354: end subroutine

356: subroutine F90Array2dDestroyFortranAddr(ptr)
357:   use, intrinsic :: ISO_C_binding
358:   implicit none
359:   PetscFortranAddr, pointer :: ptr(:, :)

361:   nullify (ptr)
362: end subroutine
363: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
364: !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
365: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
366: subroutine F90Array3dCreateScalar(array, start1, len1, start2, len2, start3, len3, ptr)
367:   use, intrinsic :: ISO_C_binding
368:   implicit none
369:   PetscInt start1, len1
370:   PetscInt start2, len2
371:   PetscInt start3, len3
372:   PetscScalar, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
373:   PetscScalar, pointer :: ptr(:, :, :)

375:   ptr => array
376: end subroutine

378: subroutine F90Array3dCreateReal(array, start1, len1, start2, len2, start3, len3, ptr)
379:   use, intrinsic :: ISO_C_binding
380:   implicit none
381:   PetscInt start1, len1
382:   PetscInt start2, len2
383:   PetscInt start3, len3
384:   PetscReal, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
385:   PetscReal, pointer :: ptr(:, :, :)

387:   ptr => array
388: end subroutine

390: subroutine F90Array3dCreateInt(array, start1, len1, start2, len2, start3, len3, ptr)
391:   use, intrinsic :: ISO_C_binding
392:   implicit none
393:   PetscInt start1, len1
394:   PetscInt start2, len2
395:   PetscInt start3, len3
396:   PetscInt, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
397:   PetscInt, pointer :: ptr(:, :, :)

399:   ptr => array
400: end subroutine

402: subroutine F90Array3dCreateBool(array, start1, len1, start2, len2, start3, len3, ptr)
403:   use, intrinsic :: ISO_C_binding
404:   implicit none
405:   PetscInt start1, len1
406:   PetscInt start2, len2
407:   PetscInt start3, len3
408:   PetscBool, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
409:   PetscBool, pointer :: ptr(:, :, :)

411:   ptr => array
412: end subroutine

414: subroutine F90Array3dCreateFortranAddr(array, start1, len1, start2, len2, start3, len3, ptr)
415:   use, intrinsic :: ISO_C_binding
416:   implicit none
417:   PetscInt start1, len1
418:   PetscInt start2, len2
419:   PetscInt start3, len3
420:   PetscFortranAddr, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1)
421:   PetscFortranAddr, pointer :: ptr(:, :, :)

423:   ptr => array
424: end subroutine

426: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
427: subroutine F90Array3dAccessScalar(ptr, address)
428:   use, intrinsic :: ISO_C_binding
429:   implicit none
430:   PetscScalar, pointer :: ptr(:, :, :)
431:   PetscFortranAddr address
432:   PetscInt start1, start2, start3

434:   start1 = lbound(ptr, 1)
435:   start2 = lbound(ptr, 2)
436:   start3 = lbound(ptr, 3)
437:   call F90Array3dGetAddrScalar(ptr(start1, start2, start3), address)
438: end subroutine

440: subroutine F90Array3dAccessReal(ptr, address)
441:   use, intrinsic :: ISO_C_binding
442:   implicit none
443:   PetscReal, pointer :: ptr(:, :, :)
444:   PetscFortranAddr address
445:   PetscInt start1, start2, start3

447:   start1 = lbound(ptr, 1)
448:   start2 = lbound(ptr, 2)
449:   start3 = lbound(ptr, 3)
450:   call F90Array3dGetAddrReal(ptr(start1, start2, start3), address)
451: end subroutine

453: subroutine F90Array3dAccessInt(ptr, address)
454:   use, intrinsic :: ISO_C_binding
455:   implicit none
456:   PetscInt, pointer :: ptr(:, :, :)
457:   PetscFortranAddr address
458:   PetscInt start1, start2, start3

460:   start1 = lbound(ptr, 1)
461:   start2 = lbound(ptr, 2)
462:   start3 = lbound(ptr, 3)
463:   call F90Array3dGetAddrInt(ptr(start1, start2, start3), address)
464: end subroutine

466: subroutine F90Array3dAccessBool(ptr, address)
467:   use, intrinsic :: ISO_C_binding
468:   implicit none
469:   PetscBool, pointer :: ptr(:, :, :)
470:   PetscFortranAddr address
471:   PetscInt start1, start2, start3

473:   start1 = lbound(ptr, 1)
474:   start2 = lbound(ptr, 2)
475:   start3 = lbound(ptr, 3)
476:   call F90Array3dGetAddrBool(ptr(start1, start2, start3), address)
477: end subroutine

479: subroutine F90Array3dAccessFortranAddr(ptr, address)
480:   use, intrinsic :: ISO_C_binding
481:   implicit none
482:   PetscFortranAddr, pointer :: ptr(:, :, :)
483:   PetscFortranAddr address
484:   PetscInt start1, start2, start3

486:   start1 = lbound(ptr, 1)
487:   start2 = lbound(ptr, 2)
488:   start3 = lbound(ptr, 3)
489:   call F90Array3dGetAddrFortranAddr(ptr(start1, start2, start3), address)
490: end subroutine

492: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
493: subroutine F90Array3dDestroyScalar(ptr)
494:   use, intrinsic :: ISO_C_binding
495:   implicit none
496:   PetscScalar, pointer :: ptr(:, :, :)

498:   nullify (ptr)
499: end subroutine

501: subroutine F90Array3dDestroyReal(ptr)
502:   use, intrinsic :: ISO_C_binding
503:   implicit none
504:   PetscReal, pointer :: ptr(:, :, :)

506:   nullify (ptr)
507: end subroutine

509: subroutine F90Array3dDestroyInt(ptr)
510:   use, intrinsic :: ISO_C_binding
511:   implicit none
512:   PetscInt, pointer :: ptr(:, :, :)

514:   nullify (ptr)
515: end subroutine

517: subroutine F90Array3dDestroyBool(ptr)
518:   use, intrinsic :: ISO_C_binding
519:   implicit none
520:   PetscBool, pointer :: ptr(:, :, :)

522:   nullify (ptr)
523: end subroutine

525: subroutine F90Array3dDestroyFortranAddr(ptr)
526:   use, intrinsic :: ISO_C_binding
527:   implicit none
528:   PetscFortranAddr, pointer :: ptr(:, :, :)

530:   nullify (ptr)
531: end subroutine

533: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
534: subroutine F90Array4dCreateScalar(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
535:   use, intrinsic :: ISO_C_binding
536:   implicit none
537:   PetscInt start1, len1
538:   PetscInt start2, len2
539:   PetscInt start3, len3
540:   PetscInt start4, len4
541:   PetscScalar, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
542:   PetscScalar, pointer :: ptr(:, :, :, :)

544:   ptr => array
545: end subroutine

547: subroutine F90Array4dCreateReal(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
548:   use, intrinsic :: ISO_C_binding
549:   implicit none
550:   PetscInt start1, len1
551:   PetscInt start2, len2
552:   PetscInt start3, len3
553:   PetscInt start4, len4
554:   PetscReal, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
555:   PetscReal, pointer :: ptr(:, :, :, :)

557:   ptr => array
558: end subroutine

560: subroutine F90Array4dCreateInt(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
561:   use, intrinsic :: ISO_C_binding
562:   implicit none
563:   PetscInt start1, len1
564:   PetscInt start2, len2
565:   PetscInt start3, len3
566:   PetscInt start4, len4
567:   PetscInt, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
568:   PetscInt, pointer :: ptr(:, :, :, :)

570:   ptr => array
571: end subroutine

573: subroutine F90Array4dCreateBool(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
574:   use, intrinsic :: ISO_C_binding
575:   implicit none
576:   PetscInt start1, len1
577:   PetscInt start2, len2
578:   PetscInt start3, len3
579:   PetscInt start4, len4
580:   PetscBool, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
581:   PetscBool, pointer :: ptr(:, :, :, :)

583:   ptr => array
584: end subroutine

586: subroutine F90Array4dCreateFortranAddr(array, start1, len1, start2, len2, start3, len3, start4, len4, ptr)
587:   use, intrinsic :: ISO_C_binding
588:   implicit none
589:   PetscInt start1, len1
590:   PetscInt start2, len2
591:   PetscInt start3, len3
592:   PetscInt start4, len4
593:   PetscFortranAddr, target :: array(start1:start1 + len1 - 1, start2:start2 + len2 - 1, start3:start3 + len3 - 1, start4:start4 + len4 - 1)
594:   PetscFortranAddr, pointer :: ptr(:, :, :, :)

596:   ptr => array
597: end subroutine

599: subroutine F90Array4dAccessScalar(ptr, address)
600:   use, intrinsic :: ISO_C_binding
601:   implicit none
602:   PetscScalar, pointer :: ptr(:, :, :, :)
603:   PetscFortranAddr address
604:   PetscInt start1, start2, start3, start4

606:   start1 = lbound(ptr, 1)
607:   start2 = lbound(ptr, 2)
608:   start3 = lbound(ptr, 3)
609:   start4 = lbound(ptr, 4)
610:   call F90Array4dGetAddrScalar(ptr(start1, start2, start3, start4), address)
611: end subroutine

613: subroutine F90Array4dAccessReal(ptr, address)
614:   use, intrinsic :: ISO_C_binding
615:   implicit none
616:   PetscReal, pointer :: ptr(:, :, :, :)
617:   PetscFortranAddr address
618:   PetscInt start1, start2, start3, start4

620:   start1 = lbound(ptr, 1)
621:   start2 = lbound(ptr, 2)
622:   start3 = lbound(ptr, 3)
623:   start4 = lbound(ptr, 4)
624:   call F90Array4dGetAddrReal(ptr(start1, start2, start3, start4), address)
625: end subroutine

627: subroutine F90Array4dAccessInt(ptr, address)
628:   use, intrinsic :: ISO_C_binding
629:   implicit none
630:   PetscInt, pointer :: ptr(:, :, :, :)
631:   PetscFortranAddr address
632:   PetscInt start1, start2, start3, start4

634:   start1 = lbound(ptr, 1)
635:   start2 = lbound(ptr, 2)
636:   start3 = lbound(ptr, 3)
637:   start4 = lbound(ptr, 4)
638:   call F90Array4dGetAddrInt(ptr(start1, start2, start3, start4), address)
639: end subroutine

641: subroutine F90Array4dAccessBool(ptr, address)
642:   use, intrinsic :: ISO_C_binding
643:   implicit none
644:   PetscBool, pointer :: ptr(:, :, :, :)
645:   PetscFortranAddr address
646:   PetscInt start1, start2, start3, start4

648:   start1 = lbound(ptr, 1)
649:   start2 = lbound(ptr, 2)
650:   start3 = lbound(ptr, 3)
651:   start4 = lbound(ptr, 4)
652:   call F90Array4dGetAddrBool(ptr(start1, start2, start3, start4), address)
653: end subroutine

655: subroutine F90Array4dAccessFortranAddr(ptr, address)
656:   use, intrinsic :: ISO_C_binding
657:   implicit none
658:   PetscScalar, pointer :: ptr(:, :, :, :)
659:   PetscFortranAddr address
660:   PetscFortranAddr start1, start2, start3, start4

662:   start1 = lbound(ptr, 1)
663:   start2 = lbound(ptr, 2)
664:   start3 = lbound(ptr, 3)
665:   start4 = lbound(ptr, 4)
666:   call F90Array4dGetAddrFortranAddr(ptr(start1, start2, start3, start4), address)
667: end subroutine

669: subroutine F90Array4dDestroyScalar(ptr)
670:   use, intrinsic :: ISO_C_binding
671:   implicit none
672:   PetscScalar, pointer :: ptr(:, :, :, :)

674:   nullify (ptr)
675: end subroutine

677: subroutine F90Array4dDestroyReal(ptr)
678:   use, intrinsic :: ISO_C_binding
679:   implicit none
680:   PetscReal, pointer :: ptr(:, :, :, :)

682:   nullify (ptr)
683: end subroutine

685: subroutine F90Array4dDestroyInt(ptr)
686:   use, intrinsic :: ISO_C_binding
687:   implicit none
688:   PetscInt, pointer :: ptr(:, :, :, :)

690:   nullify (ptr)
691: end subroutine

693: subroutine F90Array4dDestroyBool(ptr)
694:   use, intrinsic :: ISO_C_binding
695:   implicit none
696:   PetscBool, pointer :: ptr(:, :, :, :)

698:   nullify (ptr)
699: end subroutine

701: subroutine F90Array4dDestroyFortranAddr(ptr)
702:   use, intrinsic :: ISO_C_binding
703:   implicit none
704:   PetscFortranAddr, pointer :: ptr(:, :, :, :)

706:   nullify (ptr)
707: end subroutine

709: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
710: !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
711: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!