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 @*/ 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 @*/ 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 @*/ 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 @*/ 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 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 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 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 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 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 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 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 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 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 5016dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrscalar_(void *array, PetscFortranAddr *address) 5026dd63270SBarry Smith { 5036dd63270SBarry Smith *address = (PetscFortranAddr)array; 5046dd63270SBarry Smith } 5056dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrreal_(void *array, PetscFortranAddr *address) 5066dd63270SBarry Smith { 5076dd63270SBarry Smith *address = (PetscFortranAddr)array; 5086dd63270SBarry Smith } 5096dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrint_(void *array, PetscFortranAddr *address) 5106dd63270SBarry Smith { 5116dd63270SBarry Smith *address = (PetscFortranAddr)array; 5126dd63270SBarry Smith } 5136dd63270SBarry Smith PETSC_EXTERN void f90array1dgetaddrmpiint_(void *array, PetscFortranAddr *address) 5146dd63270SBarry Smith { 5156dd63270SBarry Smith *address = (PetscFortranAddr)array; 5166dd63270SBarry Smith } 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 5346dd63270SBarry Smith PETSC_EXTERN void f90array2dgetaddrscalar_(void *array, PetscFortranAddr *address) 5356dd63270SBarry Smith { 5366dd63270SBarry Smith *address = (PetscFortranAddr)array; 5376dd63270SBarry Smith } 5386dd63270SBarry Smith PETSC_EXTERN void f90array2dgetaddrreal_(void *array, PetscFortranAddr *address) 5396dd63270SBarry Smith { 5406dd63270SBarry Smith *address = (PetscFortranAddr)array; 5416dd63270SBarry Smith } 5426dd63270SBarry Smith PETSC_EXTERN void f90array2dgetaddrint_(void *array, PetscFortranAddr *address) 5436dd63270SBarry Smith { 5446dd63270SBarry Smith *address = (PetscFortranAddr)array; 5456dd63270SBarry Smith } 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 5636dd63270SBarry Smith PETSC_EXTERN void f90array3dgetaddrscalar_(void *array, PetscFortranAddr *address) 5646dd63270SBarry Smith { 5656dd63270SBarry Smith *address = (PetscFortranAddr)array; 5666dd63270SBarry Smith } 5676dd63270SBarry Smith PETSC_EXTERN void f90array3dgetaddrreal_(void *array, PetscFortranAddr *address) 5686dd63270SBarry Smith { 5696dd63270SBarry Smith *address = (PetscFortranAddr)array; 5706dd63270SBarry Smith } 5716dd63270SBarry Smith PETSC_EXTERN void f90array3dgetaddrint_(void *array, PetscFortranAddr *address) 5726dd63270SBarry Smith { 5736dd63270SBarry Smith *address = (PetscFortranAddr)array; 5746dd63270SBarry Smith } 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 5926dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrscalar_(void *array, PetscFortranAddr *address) 5936dd63270SBarry Smith { 5946dd63270SBarry Smith *address = (PetscFortranAddr)array; 5956dd63270SBarry Smith } 5966dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrreal_(void *array, PetscFortranAddr *address) 5976dd63270SBarry Smith { 5986dd63270SBarry Smith *address = (PetscFortranAddr)array; 5996dd63270SBarry Smith } 6006dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrint_(void *array, PetscFortranAddr *address) 6016dd63270SBarry Smith { 6026dd63270SBarry Smith *address = (PetscFortranAddr)array; 6036dd63270SBarry Smith } 6046dd63270SBarry Smith PETSC_EXTERN void f90array4dgetaddrfortranaddr_(void *array, PetscFortranAddr *address) 6056dd63270SBarry Smith { 6066dd63270SBarry Smith *address = (PetscFortranAddr)array; 6076dd63270SBarry Smith } 608