xref: /petsc/src/sys/ftn-custom/f90_cwrap.c (revision 834855d6effb0d027771461c8e947ee1ce5a1e17)
16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
26dd63270SBarry Smith 
36dd63270SBarry Smith /*@C
46dd63270SBarry Smith    PetscMPIFortranDatatypeToC - Converts a `MPI_Fint` that contains a Fortran `MPI_Datatype` to its C `MPI_Datatype` equivalent
56dd63270SBarry Smith 
66dd63270SBarry Smith    Not Collective, No Fortran Support
76dd63270SBarry Smith 
86dd63270SBarry Smith    Input Parameter:
96dd63270SBarry Smith .  unit - The Fortran `MPI_Datatype`
106dd63270SBarry Smith 
116dd63270SBarry Smith    Output Parameter:
126dd63270SBarry Smith .  dtype - the corresponding C `MPI_Datatype`
136dd63270SBarry Smith 
146dd63270SBarry Smith    Level: developer
156dd63270SBarry Smith 
166dd63270SBarry Smith    Developer Note:
176dd63270SBarry Smith    The MPI documentation in multiple places says that one can never us
186dd63270SBarry Smith    Fortran `MPI_Datatype`s in C (or vice-versa) but this is problematic since users could never
196dd63270SBarry Smith    call C routines from Fortran that have `MPI_Datatype` arguments. Jed states that the Fortran
206dd63270SBarry Smith    `MPI_Datatype`s will always be available in C if the MPI was built to support Fortran. This function
216dd63270SBarry Smith    relies on this.
226dd63270SBarry Smith 
236dd63270SBarry Smith .seealso: `MPI_Fint`, `MPI_Datatype`
246dd63270SBarry Smith @*/
PetscMPIFortranDatatypeToC(MPI_Fint unit,MPI_Datatype * dtype)256dd63270SBarry Smith PetscErrorCode PetscMPIFortranDatatypeToC(MPI_Fint unit, MPI_Datatype *dtype)
266dd63270SBarry Smith {
276dd63270SBarry Smith   MPI_Datatype ftype;
286dd63270SBarry Smith 
296dd63270SBarry Smith   PetscFunctionBegin;
306dd63270SBarry Smith   ftype = MPI_Type_f2c(unit);
316dd63270SBarry Smith   if (ftype == MPI_INTEGER || ftype == MPI_INT) *dtype = MPI_INT;
326dd63270SBarry Smith   else if (ftype == MPI_INTEGER8 || ftype == MPIU_INT64) *dtype = MPIU_INT64;
336dd63270SBarry Smith   else if (ftype == MPI_DOUBLE_PRECISION || ftype == MPI_DOUBLE) *dtype = MPI_DOUBLE;
346dd63270SBarry Smith   else if (ftype == MPI_FLOAT) *dtype = MPI_FLOAT;
356dd63270SBarry Smith #if defined(PETSC_HAVE_COMPLEX)
366dd63270SBarry Smith   else if (ftype == MPI_COMPLEX16 || ftype == MPI_C_DOUBLE_COMPLEX) *dtype = MPI_C_DOUBLE_COMPLEX;
376dd63270SBarry Smith #endif
386dd63270SBarry Smith #if defined(PETSC_HAVE_REAL___FLOAT128)
396dd63270SBarry Smith   else if (ftype == MPIU___FLOAT128) *dtype = MPIU___FLOAT128;
406dd63270SBarry Smith #endif
416dd63270SBarry Smith   else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unknown Fortran MPI_Datatype");
426dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
436dd63270SBarry Smith }
446dd63270SBarry Smith 
456dd63270SBarry Smith /*************************************************************************/
466dd63270SBarry Smith 
476dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
486dd63270SBarry Smith   #define f90array1dcreatescalar_       F90ARRAY1DCREATESCALAR
496dd63270SBarry Smith   #define f90array1daccessscalar_       F90ARRAY1DACCESSSCALAR
506dd63270SBarry Smith   #define f90array1ddestroyscalar_      F90ARRAY1DDESTROYSCALAR
516dd63270SBarry Smith   #define f90array1dcreatereal_         F90ARRAY1DCREATEREAL
526dd63270SBarry Smith   #define f90array1daccessreal_         F90ARRAY1DACCESSREAL
536dd63270SBarry Smith   #define f90array1ddestroyreal_        F90ARRAY1DDESTROYREAL
546dd63270SBarry Smith   #define f90array1dcreateint_          F90ARRAY1DCREATEINT
556dd63270SBarry Smith   #define f90array1daccessint_          F90ARRAY1DACCESSINT
566dd63270SBarry Smith   #define f90array1ddestroyint_         F90ARRAY1DDESTROYINT
576dd63270SBarry Smith   #define f90array1dcreatempiint_       F90ARRAY1DCREATEMPIINT
586dd63270SBarry Smith   #define f90array1daccessmpiint_       F90ARRAY1DACCESSMPIINT
596dd63270SBarry Smith   #define f90array1ddestroympiint_      F90ARRAY1DDESTROYMPIINT
606dd63270SBarry Smith   #define f90array1dcreatefortranaddr_  F90ARRAY1DCREATEFORTRANADDR
616dd63270SBarry Smith   #define f90array1daccessfortranaddr_  F90ARRAY1DACCESSFORTRANADDR
626dd63270SBarry Smith   #define f90array1ddestroyfortranaddr_ F90ARRAY1DDESTROYFORTRANADDR
636dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
646dd63270SBarry Smith   #define f90array1dcreatescalar_       f90array1dcreatescalar
656dd63270SBarry Smith   #define f90array1daccessscalar_       f90array1daccessscalar
666dd63270SBarry Smith   #define f90array1ddestroyscalar_      f90array1ddestroyscalar
676dd63270SBarry Smith   #define f90array1dcreatereal_         f90array1dcreatereal
686dd63270SBarry Smith   #define f90array1daccessreal_         f90array1daccessreal
696dd63270SBarry Smith   #define f90array1ddestroyreal_        f90array1ddestroyreal
706dd63270SBarry Smith   #define f90array1dcreateint_          f90array1dcreateint
716dd63270SBarry Smith   #define f90array1daccessint_          f90array1daccessint
726dd63270SBarry Smith   #define f90array1ddestroyint_         f90array1ddestroyint
736dd63270SBarry Smith   #define f90array1dcreatempiint_       f90array1dcreatempiint
746dd63270SBarry Smith   #define f90array1daccessmpiint_       f90array1daccessmpiint
756dd63270SBarry Smith   #define f90array1ddestroympiint_      f90array1ddestroympiint
766dd63270SBarry Smith   #define f90array1dcreatefortranaddr_  f90array1dcreatefortranaddr
776dd63270SBarry Smith   #define f90array1daccessfortranaddr_  f90array1daccessfortranaddr
786dd63270SBarry Smith   #define f90array1ddestroyfortranaddr_ f90array1ddestroyfortranaddr
796dd63270SBarry Smith #endif
806dd63270SBarry Smith 
816dd63270SBarry Smith PETSC_EXTERN void f90array1dcreatescalar_(void *, PetscInt *, PetscInt *, F90Array1d *PETSC_F90_2PTR_PROTO_NOVAR);
826dd63270SBarry Smith PETSC_EXTERN void f90array1daccessscalar_(F90Array1d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
836dd63270SBarry Smith PETSC_EXTERN void f90array1ddestroyscalar_(F90Array1d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
846dd63270SBarry Smith PETSC_EXTERN void f90array1dcreatereal_(void *, PetscInt *, PetscInt *, F90Array1d *PETSC_F90_2PTR_PROTO_NOVAR);
856dd63270SBarry Smith PETSC_EXTERN void f90array1daccessreal_(F90Array1d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
866dd63270SBarry Smith PETSC_EXTERN void f90array1ddestroyreal_(F90Array1d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
876dd63270SBarry Smith PETSC_EXTERN void f90array1dcreateint_(void *, PetscInt *, PetscInt *, F90Array1d *PETSC_F90_2PTR_PROTO_NOVAR);
886dd63270SBarry Smith PETSC_EXTERN void f90array1daccessint_(F90Array1d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
896dd63270SBarry Smith PETSC_EXTERN void f90array1ddestroyint_(F90Array1d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
906dd63270SBarry Smith PETSC_EXTERN void f90array1dcreatempiint_(void *, PetscInt *, PetscInt *, F90Array1d *PETSC_F90_2PTR_PROTO_NOVAR);
916dd63270SBarry Smith PETSC_EXTERN void f90array1daccessmpiint_(F90Array1d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
926dd63270SBarry Smith PETSC_EXTERN void f90array1ddestroympiint_(F90Array1d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
936dd63270SBarry Smith PETSC_EXTERN void f90array1dcreatefortranaddr_(void *, PetscInt *, PetscInt *, F90Array1d *PETSC_F90_2PTR_PROTO_NOVAR);
946dd63270SBarry Smith PETSC_EXTERN void f90array1daccessfortranaddr_(F90Array1d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
956dd63270SBarry Smith PETSC_EXTERN void f90array1ddestroyfortranaddr_(F90Array1d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
966dd63270SBarry Smith 
976dd63270SBarry Smith /*@C
986dd63270SBarry Smith    F90Array1dCreate - given a `F90Array1d` passed from Fortran associate with it a C array, its starting index and length
996dd63270SBarry Smith 
1006dd63270SBarry Smith    Not Collective, No Fortran Support
1016dd63270SBarry Smith 
1026dd63270SBarry Smith    Input Parameters:
1036dd63270SBarry Smith +  array - the C address pointer
1046dd63270SBarry Smith .  type  - the MPI datatype of the array
1056dd63270SBarry Smith .  start - the first index of the array
1066dd63270SBarry Smith .  len   - the length of the array
1076dd63270SBarry Smith .  ptr   - the `F90Array1d` passed from Fortran
1086dd63270SBarry Smith -  ptrd   - an extra pointer passed by some Fortran compilers
1096dd63270SBarry Smith 
1106dd63270SBarry Smith    Level: developer
1116dd63270SBarry Smith 
1126dd63270SBarry Smith    Developer Notes:
1136dd63270SBarry Smith    This is used in PETSc Fortran stubs that are used to pass C arrays to Fortran, for example `VecGetArray()`
1146dd63270SBarry Smith 
1156dd63270SBarry Smith    This doesn't actually create the `F90Array1d()`, it just associates a C pointer with it.
1166dd63270SBarry Smith 
1176dd63270SBarry Smith    There are equivalent routines for 2, 3, and 4 dimensional Fortran arrays.
1186dd63270SBarry Smith 
1196dd63270SBarry Smith .seealso: `F90Array1d`, `F90Array1dAccess()`, `F90Array1dDestroy()`, `F90Array2dCreate()`, `F90Array2dAccess()`, `F90Array2dDestroy()`
1206dd63270SBarry Smith @*/
F90Array1dCreate(void * array,MPI_Datatype type,PetscInt start,PetscInt len,F90Array1d * ptr PETSC_F90_2PTR_PROTO (ptrd))1216dd63270SBarry Smith PetscErrorCode F90Array1dCreate(void *array, MPI_Datatype type, PetscInt start, PetscInt len, F90Array1d *ptr PETSC_F90_2PTR_PROTO(ptrd))
1226dd63270SBarry Smith {
1236dd63270SBarry Smith   PetscFunctionBegin;
1246dd63270SBarry Smith   if (type == MPIU_SCALAR) {
1256dd63270SBarry Smith     if (!len) array = PETSC_NULL_SCALAR_Fortran;
1266dd63270SBarry Smith     f90array1dcreatescalar_(array, &start, &len, ptr PETSC_F90_2PTR_PARAM(ptrd));
1276dd63270SBarry Smith   } else if (type == MPIU_REAL) {
1286dd63270SBarry Smith     if (!len) array = PETSC_NULL_REAL_Fortran;
1296dd63270SBarry Smith     f90array1dcreatereal_(array, &start, &len, ptr PETSC_F90_2PTR_PARAM(ptrd));
1306dd63270SBarry Smith   } else if (type == MPIU_INT) {
1316dd63270SBarry Smith     if (!len) array = PETSC_NULL_INTEGER_Fortran;
1326dd63270SBarry Smith     f90array1dcreateint_(array, &start, &len, ptr PETSC_F90_2PTR_PARAM(ptrd));
1336dd63270SBarry Smith   } else if (type == MPI_INT) {
134f0b74427SPierre Jolivet     /* PETSC_NULL_MPIINT_Fortran is not needed since there is no PETSc APIs allowing NULL in place of 'PetscMPIInt *' arguments.
1356dd63270SBarry Smith        At this line, we only need to assign 'array' a valid address when len is 0, thus PETSC_NULL_INTEGER_Fortran is enough.
1366dd63270SBarry Smith     */
1376dd63270SBarry Smith     if (!len) array = PETSC_NULL_INTEGER_Fortran;
1386dd63270SBarry Smith     f90array1dcreatempiint_(array, &start, &len, ptr PETSC_F90_2PTR_PARAM(ptrd));
1396dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
1406dd63270SBarry Smith     f90array1dcreatefortranaddr_(array, &start, &len, ptr PETSC_F90_2PTR_PARAM(ptrd));
1416dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
1426dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1436dd63270SBarry Smith }
1446dd63270SBarry Smith 
1456dd63270SBarry Smith /*@C
1466dd63270SBarry Smith    F90Array1dAccess - given a `F90Array1d` passed from Fortran, accesses from it the associate C array that was provided with `F90Array1dCreate()`
1476dd63270SBarry Smith 
1486dd63270SBarry Smith    Not Collective, No Fortran Support
1496dd63270SBarry Smith 
1506dd63270SBarry Smith    Input Parameters:
1516dd63270SBarry Smith +  ptr   - the `F90Array1d` passed from Fortran
1526dd63270SBarry Smith .  type  - the MPI datatype of the array
1536dd63270SBarry Smith -  ptrd   - an extra pointer passed by some Fortran compilers
1546dd63270SBarry Smith 
1556dd63270SBarry Smith    Output Parameter:
1566dd63270SBarry Smith .  array - the C address pointer
1576dd63270SBarry Smith 
1586dd63270SBarry Smith    Level: developer
1596dd63270SBarry Smith 
1606dd63270SBarry Smith    Developer Note:
1616dd63270SBarry Smith    This is used in PETSc Fortran stubs that access C arrays inside Fortran pointer arrays to Fortran. It is usually used in `XXXRestore()`` Fortran stubs.
1626dd63270SBarry Smith 
1636dd63270SBarry Smith    There are equivalent routines for 2, 3, and 4 dimensional Fortran arrays.
1646dd63270SBarry Smith 
1656dd63270SBarry Smith .seealso: `F90Array1d`, `F90Array1dCreate()`, `F90Array1dDestroy()`, `F90Array2dCreate()`, `F90Array2dAccess()`, `F90Array2dDestroy()`
1666dd63270SBarry Smith @*/
F90Array1dAccess(F90Array1d * ptr,MPI_Datatype type,void ** array PETSC_F90_2PTR_PROTO (ptrd))1676dd63270SBarry Smith PetscErrorCode F90Array1dAccess(F90Array1d *ptr, MPI_Datatype type, void **array PETSC_F90_2PTR_PROTO(ptrd))
1686dd63270SBarry Smith {
1696dd63270SBarry Smith   PetscFunctionBegin;
1706dd63270SBarry Smith   if (type == MPIU_SCALAR) {
1716dd63270SBarry Smith     f90array1daccessscalar_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
1726dd63270SBarry Smith     if (*array == PETSC_NULL_SCALAR_Fortran) *array = NULL;
1736dd63270SBarry Smith   } else if (type == MPIU_REAL) {
1746dd63270SBarry Smith     f90array1daccessreal_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
1756dd63270SBarry Smith     if (*array == PETSC_NULL_REAL_Fortran) *array = NULL;
1766dd63270SBarry Smith   } else if (type == MPIU_INT) {
1776dd63270SBarry Smith     f90array1daccessint_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
1786dd63270SBarry Smith     if (*array == PETSC_NULL_INTEGER_Fortran) *array = NULL;
1796dd63270SBarry Smith   } else if (type == MPI_INT) {
1806dd63270SBarry Smith     f90array1daccessmpiint_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
1816dd63270SBarry Smith     if (*array == PETSC_NULL_INTEGER_Fortran) *array = NULL;
1826dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
1836dd63270SBarry Smith     f90array1daccessfortranaddr_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
1846dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
1856dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1866dd63270SBarry Smith }
1876dd63270SBarry Smith 
1886dd63270SBarry Smith /*@C
1896dd63270SBarry Smith    F90Array1dDestroy - given a `F90Array1d` passed from Fortran removes the C array associate with it with `F90Array1dCreate()`
1906dd63270SBarry Smith 
1916dd63270SBarry Smith    Not Collective, No Fortran Support
1926dd63270SBarry Smith 
1936dd63270SBarry Smith    Input Parameters:
1946dd63270SBarry Smith +  ptr   - the `F90Array1d` passed from Fortran
1956dd63270SBarry Smith .  type  - the MPI datatype of the array
1966dd63270SBarry Smith -  ptrd   - an extra pointer passed by some Fortran compilers
1976dd63270SBarry Smith 
1986dd63270SBarry Smith    Level: developer
1996dd63270SBarry Smith 
2006dd63270SBarry Smith    Developer Notes:
2016dd63270SBarry Smith    This is used in PETSc Fortran stubs that are used to end access to C arrays from Fortran, for example `VecRestoreArray()`
2026dd63270SBarry Smith 
2036dd63270SBarry Smith    This doesn't actually destroy the `F90Array1d()`, it just removes the associated C pointer from it.
2046dd63270SBarry Smith 
2056dd63270SBarry Smith    There are equivalent routines for 2, 3, and 4 dimensional Fortran arrays.
2066dd63270SBarry Smith 
2076dd63270SBarry Smith .seealso: `F90Array1d`, `F90Array1dAccess()`, `F90Array1dCreate()`, `F90Array2dCreate()`, `F90Array2dAccess()`, `F90Array2dDestroy()`
2086dd63270SBarry Smith @*/
F90Array1dDestroy(F90Array1d * ptr,MPI_Datatype type PETSC_F90_2PTR_PROTO (ptrd))2096dd63270SBarry Smith PetscErrorCode F90Array1dDestroy(F90Array1d *ptr, MPI_Datatype type PETSC_F90_2PTR_PROTO(ptrd))
2106dd63270SBarry Smith {
2116dd63270SBarry Smith   PetscFunctionBegin;
2126dd63270SBarry Smith   if (type == MPIU_SCALAR) {
2136dd63270SBarry Smith     f90array1ddestroyscalar_(ptr PETSC_F90_2PTR_PARAM(ptrd));
2146dd63270SBarry Smith   } else if (type == MPIU_REAL) {
2156dd63270SBarry Smith     f90array1ddestroyreal_(ptr PETSC_F90_2PTR_PARAM(ptrd));
2166dd63270SBarry Smith   } else if (type == MPIU_INT) {
2176dd63270SBarry Smith     f90array1ddestroyint_(ptr PETSC_F90_2PTR_PARAM(ptrd));
2186dd63270SBarry Smith   } else if (type == MPI_INT) {
2196dd63270SBarry Smith     f90array1ddestroympiint_(ptr PETSC_F90_2PTR_PARAM(ptrd));
2206dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
2216dd63270SBarry Smith     f90array1ddestroyfortranaddr_(ptr PETSC_F90_2PTR_PARAM(ptrd));
2226dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
2236dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2246dd63270SBarry Smith }
2256dd63270SBarry Smith 
2266dd63270SBarry Smith /*MC
2276dd63270SBarry Smith    F90Array1d - a PETSc C representation of a Fortran `XXX, pointer :: array(:)` object
2286dd63270SBarry Smith 
2296dd63270SBarry Smith    Not Collective, No Fortran Support
2306dd63270SBarry Smith 
2316dd63270SBarry Smith    Level: developer
2326dd63270SBarry Smith 
2336dd63270SBarry Smith    Developer Notes:
2346dd63270SBarry Smith    This is used in PETSc Fortran stubs that are used to control access to C arrays from Fortran, for example `VecGetArray()`
2356dd63270SBarry Smith 
2366dd63270SBarry Smith    PETSc does not require any information about the format of this object, all operations on the object are performed by calling Fortran routines.
2376dd63270SBarry Smith 
2386dd63270SBarry Smith    There are equivalent objects for 2, 3, and 4 dimensional Fortran arrays.
2396dd63270SBarry Smith 
2406dd63270SBarry Smith .seealso: `F90Array1dAccess()`, `F90Array1dCreate()`, , `F90Array1dDestroy()`, `F90Array2dCreate()`, `F90Array2dAccess()`, `F90Array2dDestroy()`
2416dd63270SBarry Smith M*/
2426dd63270SBarry Smith 
2436dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
2446dd63270SBarry Smith   #define f90array2dcreatescalar_       F90ARRAY2DCREATESCALAR
2456dd63270SBarry Smith   #define f90array2daccessscalar_       F90ARRAY2DACCESSSCALAR
2466dd63270SBarry Smith   #define f90array2ddestroyscalar_      F90ARRAY2DDESTROYSCALAR
2476dd63270SBarry Smith   #define f90array2dcreatereal_         F90ARRAY2DCREATEREAL
2486dd63270SBarry Smith   #define f90array2daccessreal_         F90ARRAY2DACCESSREAL
2496dd63270SBarry Smith   #define f90array2ddestroyreal_        F90ARRAY2DDESTROYREAL
2506dd63270SBarry Smith   #define f90array2dcreateint_          F90ARRAY2DCREATEINT
2516dd63270SBarry Smith   #define f90array2daccessint_          F90ARRAY2DACCESSINT
2526dd63270SBarry Smith   #define f90array2ddestroyint_         F90ARRAY2DDESTROYINT
2536dd63270SBarry Smith   #define f90array2dcreatefortranaddr_  F90ARRAY2DCREATEFORTRANADDR
2546dd63270SBarry Smith   #define f90array2daccessfortranaddr_  F90ARRAY2DACCESSFORTRANADDR
2556dd63270SBarry Smith   #define f90array2ddestroyfortranaddr_ F90ARRAY2DDESTROYFORTRANADDR
2566dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
2576dd63270SBarry Smith   #define f90array2dcreatescalar_       f90array2dcreatescalar
2586dd63270SBarry Smith   #define f90array2daccessscalar_       f90array2daccessscalar
2596dd63270SBarry Smith   #define f90array2ddestroyscalar_      f90array2ddestroyscalar
2606dd63270SBarry Smith   #define f90array2dcreatereal_         f90array2dcreatereal
2616dd63270SBarry Smith   #define f90array2daccessreal_         f90array2daccessreal
2626dd63270SBarry Smith   #define f90array2ddestroyreal_        f90array2ddestroyreal
2636dd63270SBarry Smith   #define f90array2dcreateint_          f90array2dcreateint
2646dd63270SBarry Smith   #define f90array2daccessint_          f90array2daccessint
2656dd63270SBarry Smith   #define f90array2ddestroyint_         f90array2ddestroyint
2666dd63270SBarry Smith   #define f90array2dcreatefortranaddr_  f90array2dcreatefortranaddr
2676dd63270SBarry Smith   #define f90array2daccessfortranaddr_  f90array2daccessfortranaddr
2686dd63270SBarry Smith   #define f90array2ddestroyfortranaddr_ f90array2ddestroyfortranaddr
2696dd63270SBarry Smith #endif
2706dd63270SBarry Smith 
2716dd63270SBarry Smith PETSC_EXTERN void f90array2dcreatescalar_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array2d *PETSC_F90_2PTR_PROTO_NOVAR);
2726dd63270SBarry Smith PETSC_EXTERN void f90array2daccessscalar_(F90Array2d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
2736dd63270SBarry Smith PETSC_EXTERN void f90array2ddestroyscalar_(F90Array2d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
2746dd63270SBarry Smith PETSC_EXTERN void f90array2dcreatereal_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array2d *PETSC_F90_2PTR_PROTO_NOVAR);
2756dd63270SBarry Smith PETSC_EXTERN void f90array2daccessreal_(F90Array2d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
2766dd63270SBarry Smith PETSC_EXTERN void f90array2ddestroyreal_(F90Array2d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
2776dd63270SBarry Smith PETSC_EXTERN void f90array2dcreateint_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array2d *PETSC_F90_2PTR_PROTO_NOVAR);
2786dd63270SBarry Smith PETSC_EXTERN void f90array2daccessint_(F90Array2d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
2796dd63270SBarry Smith PETSC_EXTERN void f90array2ddestroyint_(F90Array2d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
2806dd63270SBarry Smith PETSC_EXTERN void f90array2dcreatefortranaddr_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array2d *PETSC_F90_2PTR_PROTO_NOVAR);
2816dd63270SBarry Smith PETSC_EXTERN void f90array2daccessfortranaddr_(F90Array2d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
2826dd63270SBarry Smith PETSC_EXTERN void f90array2ddestroyfortranaddr_(F90Array2d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
2836dd63270SBarry Smith 
F90Array2dCreate(void * array,MPI_Datatype type,PetscInt start1,PetscInt len1,PetscInt start2,PetscInt len2,F90Array2d * ptr PETSC_F90_2PTR_PROTO (ptrd))2846dd63270SBarry Smith PetscErrorCode F90Array2dCreate(void *array, MPI_Datatype type, PetscInt start1, PetscInt len1, PetscInt start2, PetscInt len2, F90Array2d *ptr PETSC_F90_2PTR_PROTO(ptrd))
2856dd63270SBarry Smith {
2866dd63270SBarry Smith   PetscFunctionBegin;
2876dd63270SBarry Smith   if (type == MPIU_SCALAR) {
2886dd63270SBarry Smith     f90array2dcreatescalar_(array, &start1, &len1, &start2, &len2, ptr PETSC_F90_2PTR_PARAM(ptrd));
2896dd63270SBarry Smith   } else if (type == MPIU_REAL) {
2906dd63270SBarry Smith     f90array2dcreatereal_(array, &start1, &len1, &start2, &len2, ptr PETSC_F90_2PTR_PARAM(ptrd));
2916dd63270SBarry Smith   } else if (type == MPIU_INT) {
2926dd63270SBarry Smith     f90array2dcreateint_(array, &start1, &len1, &start2, &len2, ptr PETSC_F90_2PTR_PARAM(ptrd));
2936dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
2946dd63270SBarry Smith     f90array2dcreatefortranaddr_(array, &start1, &len1, &start2, &len2, ptr PETSC_F90_2PTR_PARAM(ptrd));
2956dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
2966dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2976dd63270SBarry Smith }
2986dd63270SBarry Smith 
F90Array2dAccess(F90Array2d * ptr,MPI_Datatype type,void ** array PETSC_F90_2PTR_PROTO (ptrd))2996dd63270SBarry Smith PetscErrorCode F90Array2dAccess(F90Array2d *ptr, MPI_Datatype type, void **array PETSC_F90_2PTR_PROTO(ptrd))
3006dd63270SBarry Smith {
3016dd63270SBarry Smith   PetscFunctionBegin;
3026dd63270SBarry Smith   if (type == MPIU_SCALAR) {
3036dd63270SBarry Smith     f90array2daccessscalar_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3046dd63270SBarry Smith   } else if (type == MPIU_REAL) {
3056dd63270SBarry Smith     f90array2daccessreal_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3066dd63270SBarry Smith   } else if (type == MPIU_INT) {
3076dd63270SBarry Smith     f90array2daccessint_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3086dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
3096dd63270SBarry Smith     f90array2daccessfortranaddr_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3106dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
3116dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3126dd63270SBarry Smith }
3136dd63270SBarry Smith 
F90Array2dDestroy(F90Array2d * ptr,MPI_Datatype type PETSC_F90_2PTR_PROTO (ptrd))3146dd63270SBarry Smith PetscErrorCode F90Array2dDestroy(F90Array2d *ptr, MPI_Datatype type PETSC_F90_2PTR_PROTO(ptrd))
3156dd63270SBarry Smith {
3166dd63270SBarry Smith   PetscFunctionBegin;
3176dd63270SBarry Smith   if (type == MPIU_SCALAR) {
3186dd63270SBarry Smith     f90array2ddestroyscalar_(ptr PETSC_F90_2PTR_PARAM(ptrd));
3196dd63270SBarry Smith   } else if (type == MPIU_REAL) {
3206dd63270SBarry Smith     f90array2ddestroyreal_(ptr PETSC_F90_2PTR_PARAM(ptrd));
3216dd63270SBarry Smith   } else if (type == MPIU_INT) {
3226dd63270SBarry Smith     f90array2ddestroyint_(ptr PETSC_F90_2PTR_PARAM(ptrd));
3236dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
3246dd63270SBarry Smith     f90array2ddestroyfortranaddr_(ptr PETSC_F90_2PTR_PARAM(ptrd));
3256dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
3266dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3276dd63270SBarry Smith }
3286dd63270SBarry Smith 
3296dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
3306dd63270SBarry Smith   #define f90array3dcreatescalar_       F90ARRAY3DCREATESCALAR
3316dd63270SBarry Smith   #define f90array3daccessscalar_       F90ARRAY3DACCESSSCALAR
3326dd63270SBarry Smith   #define f90array3ddestroyscalar_      F90ARRAY3DDESTROYSCALAR
3336dd63270SBarry Smith   #define f90array3dcreatereal_         F90ARRAY3DCREATEREAL
3346dd63270SBarry Smith   #define f90array3daccessreal_         F90ARRAY3DACCESSREAL
3356dd63270SBarry Smith   #define f90array3ddestroyreal_        F90ARRAY3DDESTROYREAL
3366dd63270SBarry Smith   #define f90array3dcreateint_          F90ARRAY3DCREATEINT
3376dd63270SBarry Smith   #define f90array3daccessint_          F90ARRAY3DACCESSINT
3386dd63270SBarry Smith   #define f90array3ddestroyint_         F90ARRAY3DDESTROYINT
3396dd63270SBarry Smith   #define f90array3dcreatefortranaddr_  F90ARRAY3DCREATEFORTRANADDR
3406dd63270SBarry Smith   #define f90array3daccessfortranaddr_  F90ARRAY3DACCESSFORTRANADDR
3416dd63270SBarry Smith   #define f90array3ddestroyfortranaddr_ F90ARRAY3DDESTROYFORTRANADDR
3426dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
3436dd63270SBarry Smith   #define f90array3dcreatescalar_       f90array3dcreatescalar
3446dd63270SBarry Smith   #define f90array3daccessscalar_       f90array3daccessscalar
3456dd63270SBarry Smith   #define f90array3ddestroyscalar_      f90array3ddestroyscalar
3466dd63270SBarry Smith   #define f90array3dcreatereal_         f90array3dcreatereal
3476dd63270SBarry Smith   #define f90array3daccessreal_         f90array3daccessreal
3486dd63270SBarry Smith   #define f90array3ddestroyreal_        f90array3ddestroyreal
3496dd63270SBarry Smith   #define f90array3dcreateint_          f90array3dcreateint
3506dd63270SBarry Smith   #define f90array3daccessint_          f90array3daccessint
3516dd63270SBarry Smith   #define f90array3ddestroyint_         f90array3ddestroyint
3526dd63270SBarry Smith   #define f90array3dcreatefortranaddr_  f90array3dcreatefortranaddr
3536dd63270SBarry Smith   #define f90array3daccessfortranaddr_  f90array3daccessfortranaddr
3546dd63270SBarry Smith   #define f90array3ddestroyfortranaddr_ f90array3ddestroyfortranaddr
3556dd63270SBarry Smith #endif
3566dd63270SBarry Smith 
3576dd63270SBarry Smith PETSC_EXTERN void f90array3dcreatescalar_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array3d *PETSC_F90_2PTR_PROTO_NOVAR);
3586dd63270SBarry Smith PETSC_EXTERN void f90array3daccessscalar_(F90Array3d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
3596dd63270SBarry Smith PETSC_EXTERN void f90array3ddestroyscalar_(F90Array3d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
3606dd63270SBarry Smith PETSC_EXTERN void f90array3dcreatereal_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array3d *PETSC_F90_2PTR_PROTO_NOVAR);
3616dd63270SBarry Smith PETSC_EXTERN void f90array3daccessreal_(F90Array3d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
3626dd63270SBarry Smith PETSC_EXTERN void f90array3ddestroyreal_(F90Array3d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
3636dd63270SBarry Smith PETSC_EXTERN void f90array3dcreateint_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array3d *PETSC_F90_2PTR_PROTO_NOVAR);
3646dd63270SBarry Smith PETSC_EXTERN void f90array3daccessint_(F90Array3d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
3656dd63270SBarry Smith PETSC_EXTERN void f90array3ddestroyint_(F90Array3d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
3666dd63270SBarry Smith PETSC_EXTERN void f90array3dcreatefortranaddr_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array3d *PETSC_F90_2PTR_PROTO_NOVAR);
3676dd63270SBarry Smith PETSC_EXTERN void f90array3daccessfortranaddr_(F90Array3d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
3686dd63270SBarry Smith PETSC_EXTERN void f90array3ddestroyfortranaddr_(F90Array3d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
3696dd63270SBarry Smith 
F90Array3dCreate(void * array,MPI_Datatype type,PetscInt start1,PetscInt len1,PetscInt start2,PetscInt len2,PetscInt start3,PetscInt len3,F90Array3d * ptr PETSC_F90_2PTR_PROTO (ptrd))3706dd63270SBarry Smith PetscErrorCode F90Array3dCreate(void *array, MPI_Datatype type, PetscInt start1, PetscInt len1, PetscInt start2, PetscInt len2, PetscInt start3, PetscInt len3, F90Array3d *ptr PETSC_F90_2PTR_PROTO(ptrd))
3716dd63270SBarry Smith {
3726dd63270SBarry Smith   PetscFunctionBegin;
3736dd63270SBarry Smith   if (type == MPIU_SCALAR) {
3746dd63270SBarry Smith     f90array3dcreatescalar_(array, &start1, &len1, &start2, &len2, &start3, &len3, ptr PETSC_F90_2PTR_PARAM(ptrd));
3756dd63270SBarry Smith   } else if (type == MPIU_REAL) {
3766dd63270SBarry Smith     f90array3dcreatereal_(array, &start1, &len1, &start2, &len2, &start3, &len3, ptr PETSC_F90_2PTR_PARAM(ptrd));
3776dd63270SBarry Smith   } else if (type == MPIU_INT) {
3786dd63270SBarry Smith     f90array3dcreateint_(array, &start1, &len1, &start2, &len2, &start3, &len3, ptr PETSC_F90_2PTR_PARAM(ptrd));
3796dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
3806dd63270SBarry Smith     f90array3dcreatefortranaddr_(array, &start1, &len1, &start2, &len2, &start3, &len3, ptr PETSC_F90_2PTR_PARAM(ptrd));
3816dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
3826dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3836dd63270SBarry Smith }
3846dd63270SBarry Smith 
F90Array3dAccess(F90Array3d * ptr,MPI_Datatype type,void ** array PETSC_F90_2PTR_PROTO (ptrd))3856dd63270SBarry Smith PetscErrorCode F90Array3dAccess(F90Array3d *ptr, MPI_Datatype type, void **array PETSC_F90_2PTR_PROTO(ptrd))
3866dd63270SBarry Smith {
3876dd63270SBarry Smith   PetscFunctionBegin;
3886dd63270SBarry Smith   if (type == MPIU_SCALAR) {
3896dd63270SBarry Smith     f90array3daccessscalar_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3906dd63270SBarry Smith   } else if (type == MPIU_REAL) {
3916dd63270SBarry Smith     f90array3daccessreal_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3926dd63270SBarry Smith   } else if (type == MPIU_INT) {
3936dd63270SBarry Smith     f90array3daccessint_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3946dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
3956dd63270SBarry Smith     f90array3daccessfortranaddr_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
3966dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
3976dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3986dd63270SBarry Smith }
3996dd63270SBarry Smith 
F90Array3dDestroy(F90Array3d * ptr,MPI_Datatype type PETSC_F90_2PTR_PROTO (ptrd))4006dd63270SBarry Smith PetscErrorCode F90Array3dDestroy(F90Array3d *ptr, MPI_Datatype type PETSC_F90_2PTR_PROTO(ptrd))
4016dd63270SBarry Smith {
4026dd63270SBarry Smith   PetscFunctionBegin;
4036dd63270SBarry Smith   if (type == MPIU_SCALAR) {
4046dd63270SBarry Smith     f90array3ddestroyscalar_(ptr PETSC_F90_2PTR_PARAM(ptrd));
4056dd63270SBarry Smith   } else if (type == MPIU_REAL) {
4066dd63270SBarry Smith     f90array3ddestroyreal_(ptr PETSC_F90_2PTR_PARAM(ptrd));
4076dd63270SBarry Smith   } else if (type == MPIU_INT) {
4086dd63270SBarry Smith     f90array3ddestroyint_(ptr PETSC_F90_2PTR_PARAM(ptrd));
4096dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
4106dd63270SBarry Smith     f90array3ddestroyfortranaddr_(ptr PETSC_F90_2PTR_PARAM(ptrd));
4116dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
4126dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
4136dd63270SBarry Smith }
4146dd63270SBarry Smith 
4156dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
4166dd63270SBarry Smith   #define f90array4dcreatescalar_       F90ARRAY4DCREATESCALAR
4176dd63270SBarry Smith   #define f90array4daccessscalar_       F90ARRAY4DACCESSSCALAR
4186dd63270SBarry Smith   #define f90array4ddestroyscalar_      F90ARRAY4DDESTROYSCALAR
4196dd63270SBarry Smith   #define f90array4dcreatereal_         F90ARRAY4DCREATEREAL
4206dd63270SBarry Smith   #define f90array4daccessreal_         F90ARRAY4DACCESSREAL
4216dd63270SBarry Smith   #define f90array4ddestroyreal_        F90ARRAY4DDESTROYREAL
4226dd63270SBarry Smith   #define f90array4dcreateint_          F90ARRAY4DCREATEINT
4236dd63270SBarry Smith   #define f90array4daccessint_          F90ARRAY4DACCESSINT
4246dd63270SBarry Smith   #define f90array4ddestroyint_         F90ARRAY4DDESTROYINT
4256dd63270SBarry Smith   #define f90array4dcreatefortranaddr_  F90ARRAY4DCREATEFORTRANADDR
4266dd63270SBarry Smith   #define f90array4daccessfortranaddr_  F90ARRAY4DACCESSFORTRANADDR
4276dd63270SBarry Smith   #define f90array4ddestroyfortranaddr_ F90ARRAY4DDESTROYFORTRANADDR
4286dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
4296dd63270SBarry Smith   #define f90array4dcreatescalar_       f90array4dcreatescalar
4306dd63270SBarry Smith   #define f90array4daccessscalar_       f90array4daccessscalar
4316dd63270SBarry Smith   #define f90array4ddestroyscalar_      f90array4ddestroyscalar
4326dd63270SBarry Smith   #define f90array4dcreatereal_         f90array4dcreatereal
4336dd63270SBarry Smith   #define f90array4daccessreal_         f90array4daccessreal
4346dd63270SBarry Smith   #define f90array4ddestroyreal_        f90array4ddestroyreal
4356dd63270SBarry Smith   #define f90array4dcreateint_          f90array4dcreateint
4366dd63270SBarry Smith   #define f90array4daccessint_          f90array4daccessint
4376dd63270SBarry Smith   #define f90array4ddestroyint_         f90array4ddestroyint
4386dd63270SBarry Smith   #define f90array4dcreatefortranaddr_  f90array4dcreatefortranaddr
4396dd63270SBarry Smith   #define f90array4daccessfortranaddr_  f90array4daccessfortranaddr
4406dd63270SBarry Smith   #define f90array4ddestroyfortranaddr_ f90array4ddestroyfortranaddr
4416dd63270SBarry Smith #endif
4426dd63270SBarry Smith 
4436dd63270SBarry Smith PETSC_EXTERN void f90array4dcreatescalar_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array4d *PETSC_F90_2PTR_PROTO_NOVAR);
4446dd63270SBarry Smith PETSC_EXTERN void f90array4daccessscalar_(F90Array4d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
4456dd63270SBarry Smith PETSC_EXTERN void f90array4ddestroyscalar_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
4466dd63270SBarry Smith PETSC_EXTERN void f90array4dcreatereal_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array4d *PETSC_F90_2PTR_PROTO_NOVAR);
4476dd63270SBarry Smith PETSC_EXTERN void f90array4daccessreal_(F90Array4d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
4486dd63270SBarry Smith PETSC_EXTERN void f90array4ddestroyreal_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
4496dd63270SBarry Smith PETSC_EXTERN void f90array4dcreateint_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array4d *PETSC_F90_2PTR_PROTO_NOVAR);
4506dd63270SBarry Smith PETSC_EXTERN void f90array4daccessint_(F90Array4d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
4516dd63270SBarry Smith PETSC_EXTERN void f90array4ddestroyint_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
4526dd63270SBarry Smith PETSC_EXTERN void f90array4dcreatefortranaddr_(void *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, PetscInt *, F90Array4d *PETSC_F90_2PTR_PROTO_NOVAR);
4536dd63270SBarry Smith PETSC_EXTERN void f90array4daccessfortranaddr_(F90Array4d *, void **PETSC_F90_2PTR_PROTO_NOVAR);
4546dd63270SBarry Smith PETSC_EXTERN void f90array4ddestroyfortranaddr_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR);
4556dd63270SBarry Smith 
F90Array4dCreate(void * array,MPI_Datatype type,PetscInt start1,PetscInt len1,PetscInt start2,PetscInt len2,PetscInt start3,PetscInt len3,PetscInt start4,PetscInt len4,F90Array4d * ptr PETSC_F90_2PTR_PROTO (ptrd))4566dd63270SBarry Smith PetscErrorCode F90Array4dCreate(void *array, MPI_Datatype type, PetscInt start1, PetscInt len1, PetscInt start2, PetscInt len2, PetscInt start3, PetscInt len3, PetscInt start4, PetscInt len4, F90Array4d *ptr PETSC_F90_2PTR_PROTO(ptrd))
4576dd63270SBarry Smith {
4586dd63270SBarry Smith   PetscFunctionBegin;
459*966bd95aSPierre Jolivet   PetscCheck(type == MPIU_SCALAR, PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
4606dd63270SBarry Smith   f90array4dcreatescalar_(array, &start1, &len1, &start2, &len2, &start3, &len3, &start4, &len4, ptr PETSC_F90_2PTR_PARAM(ptrd));
4616dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
4626dd63270SBarry Smith }
4636dd63270SBarry Smith 
F90Array4dAccess(F90Array4d * ptr,MPI_Datatype type,void ** array PETSC_F90_2PTR_PROTO (ptrd))4646dd63270SBarry Smith PetscErrorCode F90Array4dAccess(F90Array4d *ptr, MPI_Datatype type, void **array PETSC_F90_2PTR_PROTO(ptrd))
4656dd63270SBarry Smith {
4666dd63270SBarry Smith   PetscFunctionBegin;
4676dd63270SBarry Smith   if (type == MPIU_SCALAR) {
4686dd63270SBarry Smith     f90array4daccessscalar_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
4696dd63270SBarry Smith   } else if (type == MPIU_REAL) {
4706dd63270SBarry Smith     f90array4daccessreal_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
4716dd63270SBarry Smith   } else if (type == MPIU_INT) {
4726dd63270SBarry Smith     f90array4daccessint_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
4736dd63270SBarry Smith   } else if (type == MPIU_FORTRANADDR) {
4746dd63270SBarry Smith     f90array4daccessfortranaddr_(ptr, array PETSC_F90_2PTR_PARAM(ptrd));
4756dd63270SBarry Smith   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
4766dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
4776dd63270SBarry Smith }
4786dd63270SBarry Smith 
F90Array4dDestroy(F90Array4d * ptr,MPI_Datatype type PETSC_F90_2PTR_PROTO (ptrd))4796dd63270SBarry Smith PetscErrorCode F90Array4dDestroy(F90Array4d *ptr, MPI_Datatype type PETSC_F90_2PTR_PROTO(ptrd))
4806dd63270SBarry Smith {
4816dd63270SBarry Smith   PetscFunctionBegin;
482*966bd95aSPierre Jolivet   PetscCheck(type == MPIU_SCALAR, PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported MPI_Datatype");
4836dd63270SBarry Smith   f90array4ddestroyscalar_(ptr PETSC_F90_2PTR_PARAM(ptrd));
4846dd63270SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
4856dd63270SBarry Smith }
4866dd63270SBarry Smith 
4876dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
4886dd63270SBarry Smith   #define f90array1dgetaddrscalar_      F90ARRAY1DGETADDRSCALAR
4896dd63270SBarry Smith   #define f90array1dgetaddrreal_        F90ARRAY1DGETADDRREAL
4906dd63270SBarry Smith   #define f90array1dgetaddrint_         F90ARRAY1DGETADDRINT
4916dd63270SBarry Smith   #define f90array1dgetaddrmpiint_      F90ARRAY1DGETADDRMPIINT
4926dd63270SBarry Smith   #define f90array1dgetaddrfortranaddr_ F90ARRAY1DGETADDRFORTRANADDR
4936dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
4946dd63270SBarry Smith   #define f90array1dgetaddrscalar_      f90array1dgetaddrscalar
4956dd63270SBarry Smith   #define f90array1dgetaddrreal_        f90array1dgetaddrreal
4966dd63270SBarry Smith   #define f90array1dgetaddrint_         f90array1dgetaddrint
4976dd63270SBarry Smith   #define f90array1dgetaddrmpiint_      f90array1dgetaddrmpiint
4986dd63270SBarry Smith   #define f90array1dgetaddrfortranaddr_ f90array1dgetaddrfortranaddr
4996dd63270SBarry Smith #endif
5006dd63270SBarry Smith 
f90array1dgetaddrscalar_(void * array,PetscFortranAddr * address)5016dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrscalar_(void *array, PetscFortranAddr *address)
5026dd63270SBarry Smith {
5036dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5046dd63270SBarry Smith }
f90array1dgetaddrreal_(void * array,PetscFortranAddr * address)5056dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrreal_(void *array, PetscFortranAddr *address)
5066dd63270SBarry Smith {
5076dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5086dd63270SBarry Smith }
f90array1dgetaddrint_(void * array,PetscFortranAddr * address)5096dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrint_(void *array, PetscFortranAddr *address)
5106dd63270SBarry Smith {
5116dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5126dd63270SBarry Smith }
f90array1dgetaddrmpiint_(void * array,PetscFortranAddr * address)5136dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrmpiint_(void *array, PetscFortranAddr *address)
5146dd63270SBarry Smith {
5156dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5166dd63270SBarry Smith }
f90array1dgetaddrfortranaddr_(void * array,PetscFortranAddr * address)5176dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrfortranaddr_(void *array, PetscFortranAddr *address)
5186dd63270SBarry Smith {
5196dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5206dd63270SBarry Smith }
5216dd63270SBarry Smith 
5226dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
5236dd63270SBarry Smith   #define f90array2dgetaddrscalar_      F90ARRAY2DGETADDRSCALAR
5246dd63270SBarry Smith   #define f90array2dgetaddrreal_        F90ARRAY2DGETADDRREAL
5256dd63270SBarry Smith   #define f90array2dgetaddrint_         F90ARRAY2DGETADDRINT
5266dd63270SBarry Smith   #define f90array2dgetaddrfortranaddr_ F90ARRAY2DGETADDRFORTRANADDR
5276dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
5286dd63270SBarry Smith   #define f90array2dgetaddrscalar_      f90array2dgetaddrscalar
5296dd63270SBarry Smith   #define f90array2dgetaddrreal_        f90array2dgetaddrreal
5306dd63270SBarry Smith   #define f90array2dgetaddrint_         f90array2dgetaddrint
5316dd63270SBarry Smith   #define f90array2dgetaddrfortranaddr_ f90array2dgetaddrfortranaddr
5326dd63270SBarry Smith #endif
5336dd63270SBarry Smith 
f90array2dgetaddrscalar_(void * array,PetscFortranAddr * address)5346dd63270SBarry Smith PETSC_EXTERN void f90array2dgetaddrscalar_(void *array, PetscFortranAddr *address)
5356dd63270SBarry Smith {
5366dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5376dd63270SBarry Smith }
f90array2dgetaddrreal_(void * array,PetscFortranAddr * address)5386dd63270SBarry Smith PETSC_EXTERN void f90array2dgetaddrreal_(void *array, PetscFortranAddr *address)
5396dd63270SBarry Smith {
5406dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5416dd63270SBarry Smith }
f90array2dgetaddrint_(void * array,PetscFortranAddr * address)5426dd63270SBarry Smith PETSC_EXTERN void f90array2dgetaddrint_(void *array, PetscFortranAddr *address)
5436dd63270SBarry Smith {
5446dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5456dd63270SBarry Smith }
f90array2dgetaddrfortranaddr_(void * array,PetscFortranAddr * address)5466dd63270SBarry Smith PETSC_EXTERN void f90array2dgetaddrfortranaddr_(void *array, PetscFortranAddr *address)
5476dd63270SBarry Smith {
5486dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5496dd63270SBarry Smith }
5506dd63270SBarry Smith 
5516dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
5526dd63270SBarry Smith   #define f90array3dgetaddrscalar_      F90ARRAY3DGETADDRSCALAR
5536dd63270SBarry Smith   #define f90array3dgetaddrreal_        F90ARRAY3DGETADDRREAL
5546dd63270SBarry Smith   #define f90array3dgetaddrint_         F90ARRAY3DGETADDRINT
5556dd63270SBarry Smith   #define f90array3dgetaddrfortranaddr_ F90ARRAY3DGETADDRFORTRANADDR
5566dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
5576dd63270SBarry Smith   #define f90array3dgetaddrscalar_      f90array3dgetaddrscalar
5586dd63270SBarry Smith   #define f90array3dgetaddrreal_        f90array3dgetaddrreal
5596dd63270SBarry Smith   #define f90array3dgetaddrint_         f90array3dgetaddrint
5606dd63270SBarry Smith   #define f90array3dgetaddrfortranaddr_ f90array3dgetaddrfortranaddr
5616dd63270SBarry Smith #endif
5626dd63270SBarry Smith 
f90array3dgetaddrscalar_(void * array,PetscFortranAddr * address)5636dd63270SBarry Smith PETSC_EXTERN void f90array3dgetaddrscalar_(void *array, PetscFortranAddr *address)
5646dd63270SBarry Smith {
5656dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5666dd63270SBarry Smith }
f90array3dgetaddrreal_(void * array,PetscFortranAddr * address)5676dd63270SBarry Smith PETSC_EXTERN void f90array3dgetaddrreal_(void *array, PetscFortranAddr *address)
5686dd63270SBarry Smith {
5696dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5706dd63270SBarry Smith }
f90array3dgetaddrint_(void * array,PetscFortranAddr * address)5716dd63270SBarry Smith PETSC_EXTERN void f90array3dgetaddrint_(void *array, PetscFortranAddr *address)
5726dd63270SBarry Smith {
5736dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5746dd63270SBarry Smith }
f90array3dgetaddrfortranaddr_(void * array,PetscFortranAddr * address)5756dd63270SBarry Smith PETSC_EXTERN void f90array3dgetaddrfortranaddr_(void *array, PetscFortranAddr *address)
5766dd63270SBarry Smith {
5776dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5786dd63270SBarry Smith }
5796dd63270SBarry Smith 
5806dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
5816dd63270SBarry Smith   #define f90array4dgetaddrscalar_      F90ARRAY4DGETADDRSCALAR
5826dd63270SBarry Smith   #define f90array4dgetaddrreal_        F90ARRAY4DGETADDRREAL
5836dd63270SBarry Smith   #define f90array4dgetaddrint_         F90ARRAY4DGETADDRINT
5846dd63270SBarry Smith   #define f90array4dgetaddrfortranaddr_ F90ARRAY4DGETADDRFORTRANADDR
5856dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
5866dd63270SBarry Smith   #define f90array4dgetaddrscalar_      f90array4dgetaddrscalar
5876dd63270SBarry Smith   #define f90array4dgetaddrreal_        f90array4dgetaddrreal
5886dd63270SBarry Smith   #define f90array4dgetaddrint_         f90array4dgetaddrint
5896dd63270SBarry Smith   #define f90array4dgetaddrfortranaddr_ f90array4dgetaddrfortranaddr
5906dd63270SBarry Smith #endif
5916dd63270SBarry Smith 
f90array4dgetaddrscalar_(void * array,PetscFortranAddr * address)5926dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrscalar_(void *array, PetscFortranAddr *address)
5936dd63270SBarry Smith {
5946dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5956dd63270SBarry Smith }
f90array4dgetaddrreal_(void * array,PetscFortranAddr * address)5966dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrreal_(void *array, PetscFortranAddr *address)
5976dd63270SBarry Smith {
5986dd63270SBarry Smith   *address = (PetscFortranAddr)array;
5996dd63270SBarry Smith }
f90array4dgetaddrint_(void * array,PetscFortranAddr * address)6006dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrint_(void *array, PetscFortranAddr *address)
6016dd63270SBarry Smith {
6026dd63270SBarry Smith   *address = (PetscFortranAddr)array;
6036dd63270SBarry Smith }
f90array4dgetaddrfortranaddr_(void * array,PetscFortranAddr * address)6046dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrfortranaddr_(void *array, PetscFortranAddr *address)
6056dd63270SBarry Smith {
6066dd63270SBarry Smith   *address = (PetscFortranAddr)array;
6076dd63270SBarry Smith }
608