xref: /petsc/src/sys/ftn-src/f90_fwrap.F90 (revision 6dd63270497ad23dcf16ae500a87ff2b2a0b7474)
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