16dd63270SBarry Smith #include <petscmat.h>
26dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
36dd63270SBarry Smith
46dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
5f14a4c02SBarry Smith #define matgetrow_ MATGETROW
6f14a4c02SBarry Smith #define matrestorerow_ MATRESTOREROW
76dd63270SBarry Smith #define matmpiaijgetseqaij_ MATMPIAIJGETSEQAIJ
86dd63270SBarry Smith #define matmpiaijrestoreseqaij_ MATMPIAIJRESTORESEQAIJ
96dd63270SBarry Smith #define matdensegetarray1d_ MATDENSEGETARRAY1D
106dd63270SBarry Smith #define matdenserestorearray1d_ MATDENSERESTOREARRAY1D
116dd63270SBarry Smith #define matdensegetarrayread1d_ MATDENSEGETARRAYREAD1D
126dd63270SBarry Smith #define matdenserestorearrayread1d_ MATDENSERESTOREARRAYREAD1D
136dd63270SBarry Smith #define matdensegetarraywrite1d_ MATDENSEGETARRAYWRITE1D
146dd63270SBarry Smith #define matdenserestorearraywrite1d_ MATDENSERESTOREARRAYWRITE1D
156dd63270SBarry Smith #define matdensegetarray2d_ MATDENSEGETARRAY2D
166dd63270SBarry Smith #define matdenserestorearray2d_ MATDENSERESTOREARRAY2D
176dd63270SBarry Smith #define matdensegetarrayread2d_ MATDENSEGETARRAYREAD2D
186dd63270SBarry Smith #define matdenserestorearrayread2d_ MATDENSERESTOREARRAYREAD2D
196dd63270SBarry Smith #define matdensegetarraywrite2d_ MATDENSEGETARRAYWRITE2D
206dd63270SBarry Smith #define matdenserestorearraywrite2d_ MATDENSERESTOREARRAYWRITE2D
216dd63270SBarry Smith #define matdensegetcolumn_ MATDENSEGETCOLUMN
226dd63270SBarry Smith #define matdenserestorecolumn_ MATDENSERESTORECOLUMN
236dd63270SBarry Smith #define matseqaijgetarray_ MATSEQAIJGETARRAY
246dd63270SBarry Smith #define matseqaijrestorearray_ MATSEQAIJRESTOREARRAY
256dd63270SBarry Smith #define matgetghosts_ MATGETGHOSTS
266dd63270SBarry Smith #define matgetrowij_ MATGETROWIJ
276dd63270SBarry Smith #define matrestorerowij_ MATRESTOREROWIJ
286dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
29f14a4c02SBarry Smith #define matgetrow_ matgetrow
30f14a4c02SBarry Smith #define matrestorerow_ matrestorerow
316dd63270SBarry Smith #define matmpiaijgetseqaij_ matmpiaijgetseqaij
326dd63270SBarry Smith #define matmpiaijrestoreseqaij_ matmpiaijrestoreseqaij
336dd63270SBarry Smith #define matdensegetarray1d_ matdensegetarray1d
346dd63270SBarry Smith #define matdenserestorearray1d_ matdenserestorearray1d
356dd63270SBarry Smith #define matdensegetarrayread1d_ matdensegetarrayread1d
366dd63270SBarry Smith #define matdenserestorearrayread1d_ matdenserestorearrayread1d
376dd63270SBarry Smith #define matdensegetarraywrite1d_ matdensegetarraywrite1d
386dd63270SBarry Smith #define matdenserestorearraywrite1d_ matdenserestorearraywrite1d
396dd63270SBarry Smith #define matdensegetarray2d_ matdensegetarray2d
406dd63270SBarry Smith #define matdenserestorearray2d_ matdenserestorearray2d
416dd63270SBarry Smith #define matdensegetarrayread2d_ matdensegetarrayread2d
426dd63270SBarry Smith #define matdenserestorearrayread2d_ matdenserestorearrayread2d
436dd63270SBarry Smith #define matdensegetarraywrite2d_ matdensegetarraywrite2d
446dd63270SBarry Smith #define matdenserestorearraywrite2d_ matdenserestorearraywrite2d
456dd63270SBarry Smith #define matdensegetcolumn_ matdensegetcolumn
466dd63270SBarry Smith #define matdenserestorecolumn_ matdenserestorecolumn
476dd63270SBarry Smith #define matseqaijgetarray_ matseqaijgetarray
486dd63270SBarry Smith #define matseqaijrestorearray_ matseqaijrestorearray
496dd63270SBarry Smith #define matgetghosts_ matgetghosts
506dd63270SBarry Smith #define matgetrowij_ matgetrowij
516dd63270SBarry Smith #define matrestorerowij_ matrestorerowij
526dd63270SBarry Smith #endif
536dd63270SBarry Smith
matgetrow_(Mat * B,PetscInt * row,PetscInt * N,F90Array1d * ia,F90Array1d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (iad)PETSC_F90_2PTR_PROTO (jad))54f14a4c02SBarry Smith PETSC_EXTERN void matgetrow_(Mat *B, PetscInt *row, PetscInt *N, F90Array1d *ia, F90Array1d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(iad) PETSC_F90_2PTR_PROTO(jad))
55f14a4c02SBarry Smith {
56f14a4c02SBarry Smith PetscInt n;
57f14a4c02SBarry Smith const PetscInt *II = NULL;
58f14a4c02SBarry Smith const PetscScalar *A = NULL;
59f14a4c02SBarry Smith
60f14a4c02SBarry Smith if (FORTRANNULLINTEGERPOINTER(ia) && FORTRANNULLSCALARPOINTER(a)) {
61f14a4c02SBarry Smith *ierr = MatGetRow(*B, *row, &n, NULL, NULL);
62f14a4c02SBarry Smith } else if (FORTRANNULLINTEGERPOINTER(ia)) {
63f14a4c02SBarry Smith *ierr = MatGetRow(*B, *row, &n, NULL, &A);
64f14a4c02SBarry Smith } else if (FORTRANNULLSCALARPOINTER(a)) {
65f14a4c02SBarry Smith *ierr = MatGetRow(*B, *row, &n, &II, NULL);
66f14a4c02SBarry Smith } else {
67f14a4c02SBarry Smith *ierr = MatGetRow(*B, *row, &n, &II, &A);
68f14a4c02SBarry Smith }
69f14a4c02SBarry Smith if (*ierr) return;
70ac530a7eSPierre Jolivet if (II) *ierr = F90Array1dCreate((void *)II, MPIU_INT, 1, n, ia PETSC_F90_2PTR_PARAM(iad));
71ac530a7eSPierre Jolivet if (A) *ierr = F90Array1dCreate((void *)A, MPIU_SCALAR, 1, n, a PETSC_F90_2PTR_PARAM(jad));
72f14a4c02SBarry Smith if (!FORTRANNULLINTEGER(N)) *N = n;
73f14a4c02SBarry Smith }
matrestorerow_(Mat * B,PetscInt * row,PetscInt * N,F90Array1d * ia,F90Array1d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (iad)PETSC_F90_2PTR_PROTO (jad))74f14a4c02SBarry Smith PETSC_EXTERN void matrestorerow_(Mat *B, PetscInt *row, PetscInt *N, F90Array1d *ia, F90Array1d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(iad) PETSC_F90_2PTR_PROTO(jad))
75f14a4c02SBarry Smith {
76f14a4c02SBarry Smith const PetscInt *IA = NULL;
77f14a4c02SBarry Smith const PetscScalar *A = NULL;
78f14a4c02SBarry Smith PetscInt n;
79f14a4c02SBarry Smith
80281f9e90SBarry Smith if (FORTRANNULLINTEGERPOINTER(ia) && FORTRANNULLSCALARPOINTER(a)) {
81281f9e90SBarry Smith *ierr = MatRestoreRow(*B, *row, &n, NULL, NULL);
82281f9e90SBarry Smith return;
83281f9e90SBarry Smith }
84f14a4c02SBarry Smith if (!FORTRANNULLINTEGERPOINTER(ia)) {
85f14a4c02SBarry Smith *ierr = F90Array1dAccess(ia, MPIU_INT, (void **)&IA PETSC_F90_2PTR_PARAM(iad));
86f14a4c02SBarry Smith if (*ierr) return;
87f14a4c02SBarry Smith *ierr = F90Array1dDestroy(ia, MPIU_INT PETSC_F90_2PTR_PARAM(iad));
88f14a4c02SBarry Smith if (*ierr) return;
89f14a4c02SBarry Smith }
90f14a4c02SBarry Smith if (!FORTRANNULLSCALARPOINTER(a)) {
91f14a4c02SBarry Smith *ierr = F90Array1dAccess(a, MPIU_SCALAR, (void **)&A PETSC_F90_2PTR_PARAM(jad));
92f14a4c02SBarry Smith if (*ierr) return;
93f14a4c02SBarry Smith *ierr = F90Array1dDestroy(a, MPIU_INT PETSC_F90_2PTR_PARAM(jad));
94f14a4c02SBarry Smith if (*ierr) return;
95f14a4c02SBarry Smith }
96f14a4c02SBarry Smith if (FORTRANNULLINTEGERPOINTER(ia)) {
97f14a4c02SBarry Smith *ierr = MatRestoreRow(*B, *row, &n, NULL, &A);
98f14a4c02SBarry Smith } else if (FORTRANNULLSCALARPOINTER(a)) {
99f14a4c02SBarry Smith *ierr = MatRestoreRow(*B, *row, &n, &IA, NULL);
100f14a4c02SBarry Smith } else {
101f14a4c02SBarry Smith *ierr = MatRestoreRow(*B, *row, &n, &IA, &A);
102f14a4c02SBarry Smith }
103f14a4c02SBarry Smith }
matgetghosts_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1046dd63270SBarry Smith PETSC_EXTERN void matgetghosts_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1056dd63270SBarry Smith {
1066dd63270SBarry Smith const PetscInt *ghosts;
1076dd63270SBarry Smith PetscInt N;
1086dd63270SBarry Smith
1096dd63270SBarry Smith *ierr = MatGetGhosts(*mat, &N, &ghosts);
1106dd63270SBarry Smith if (*ierr) return;
1116dd63270SBarry Smith *ierr = F90Array1dCreate((PetscInt *)ghosts, MPIU_INT, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
1126dd63270SBarry Smith }
matdensegetarray2d_(Mat * mat,F90Array2d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1136dd63270SBarry Smith PETSC_EXTERN void matdensegetarray2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1146dd63270SBarry Smith {
1156dd63270SBarry Smith PetscScalar *fa;
1166dd63270SBarry Smith PetscInt m, N, lda;
1176dd63270SBarry Smith *ierr = MatDenseGetArray(*mat, &fa);
1186dd63270SBarry Smith if (*ierr) return;
1196dd63270SBarry Smith *ierr = MatGetLocalSize(*mat, &m, NULL);
1206dd63270SBarry Smith if (*ierr) return;
1216dd63270SBarry Smith *ierr = MatGetSize(*mat, NULL, &N);
1226dd63270SBarry Smith if (*ierr) return;
1236dd63270SBarry Smith *ierr = MatDenseGetLDA(*mat, &lda);
1246dd63270SBarry Smith if (*ierr) return;
1256dd63270SBarry Smith if (m != lda) { // TODO: add F90Array2dLDACreate()
1266dd63270SBarry Smith *ierr = PetscError(((PetscObject)*mat)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "Array lda %" PetscInt_FMT " must match number of local rows %" PetscInt_FMT, lda, m);
1276dd63270SBarry Smith return;
1286dd63270SBarry Smith }
1296dd63270SBarry Smith *ierr = F90Array2dCreate(fa, MPIU_SCALAR, 1, m, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
1306dd63270SBarry Smith }
matdenserestorearray2d_(Mat * mat,F90Array2d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1316dd63270SBarry Smith PETSC_EXTERN void matdenserestorearray2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1326dd63270SBarry Smith {
1336dd63270SBarry Smith PetscScalar *fa;
1346dd63270SBarry Smith *ierr = F90Array2dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
1356dd63270SBarry Smith if (*ierr) return;
1366dd63270SBarry Smith *ierr = F90Array2dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
1376dd63270SBarry Smith if (*ierr) return;
1386dd63270SBarry Smith *ierr = MatDenseRestoreArray(*mat, &fa);
1396dd63270SBarry Smith }
matdensegetarrayread2d_(Mat * mat,F90Array2d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1406dd63270SBarry Smith PETSC_EXTERN void matdensegetarrayread2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1416dd63270SBarry Smith {
1426dd63270SBarry Smith const PetscScalar *fa;
1436dd63270SBarry Smith PetscInt m, N, lda;
1446dd63270SBarry Smith *ierr = MatDenseGetArrayRead(*mat, &fa);
1456dd63270SBarry Smith if (*ierr) return;
1466dd63270SBarry Smith *ierr = MatGetLocalSize(*mat, &m, NULL);
1476dd63270SBarry Smith if (*ierr) return;
1486dd63270SBarry Smith *ierr = MatGetSize(*mat, NULL, &N);
1496dd63270SBarry Smith if (*ierr) return;
1506dd63270SBarry Smith *ierr = MatDenseGetLDA(*mat, &lda);
1516dd63270SBarry Smith if (*ierr) return;
1526dd63270SBarry Smith if (m != lda) { // TODO: add F90Array2dLDACreate()
1536dd63270SBarry Smith *ierr = PetscError(((PetscObject)*mat)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "Array lda %" PetscInt_FMT " must match number of local rows %" PetscInt_FMT, lda, m);
1546dd63270SBarry Smith return;
1556dd63270SBarry Smith }
1566dd63270SBarry Smith *ierr = F90Array2dCreate((void **)fa, MPIU_SCALAR, 1, m, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
1576dd63270SBarry Smith }
matdenserestorearrayread2d_(Mat * mat,F90Array2d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1586dd63270SBarry Smith PETSC_EXTERN void matdenserestorearrayread2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1596dd63270SBarry Smith {
1606dd63270SBarry Smith const PetscScalar *fa;
1616dd63270SBarry Smith *ierr = F90Array2dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
1626dd63270SBarry Smith if (*ierr) return;
1636dd63270SBarry Smith *ierr = F90Array2dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
1646dd63270SBarry Smith if (*ierr) return;
1656dd63270SBarry Smith *ierr = MatDenseRestoreArrayRead(*mat, &fa);
1666dd63270SBarry Smith }
matdensegetarraywrite2d_(Mat * mat,F90Array2d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1676dd63270SBarry Smith PETSC_EXTERN void matdensegetarraywrite2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1686dd63270SBarry Smith {
1696dd63270SBarry Smith PetscScalar *fa;
1706dd63270SBarry Smith PetscInt m, N, lda;
1716dd63270SBarry Smith *ierr = MatDenseGetArrayWrite(*mat, &fa);
1726dd63270SBarry Smith if (*ierr) return;
1736dd63270SBarry Smith *ierr = MatGetLocalSize(*mat, &m, NULL);
1746dd63270SBarry Smith if (*ierr) return;
1756dd63270SBarry Smith *ierr = MatGetSize(*mat, NULL, &N);
1766dd63270SBarry Smith if (*ierr) return;
1776dd63270SBarry Smith *ierr = MatDenseGetLDA(*mat, &lda);
1786dd63270SBarry Smith if (*ierr) return;
1796dd63270SBarry Smith if (m != lda) { // TODO: add F90Array2dLDACreate()
1806dd63270SBarry Smith *ierr = PetscError(((PetscObject)*mat)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "Array lda %" PetscInt_FMT " must match number of local rows %" PetscInt_FMT, lda, m);
1816dd63270SBarry Smith return;
1826dd63270SBarry Smith }
1836dd63270SBarry Smith *ierr = F90Array2dCreate(fa, MPIU_SCALAR, 1, m, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
1846dd63270SBarry Smith }
matdenserestorearraywrite2d_(Mat * mat,F90Array2d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1856dd63270SBarry Smith PETSC_EXTERN void matdenserestorearraywrite2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1866dd63270SBarry Smith {
1876dd63270SBarry Smith PetscScalar *fa;
1886dd63270SBarry Smith *ierr = F90Array2dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
1896dd63270SBarry Smith if (*ierr) return;
1906dd63270SBarry Smith *ierr = F90Array2dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
1916dd63270SBarry Smith if (*ierr) return;
1926dd63270SBarry Smith *ierr = MatDenseRestoreArrayWrite(*mat, &fa);
1936dd63270SBarry Smith }
matdensegetarray1d_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))1946dd63270SBarry Smith PETSC_EXTERN void matdensegetarray1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
1956dd63270SBarry Smith {
1966dd63270SBarry Smith PetscScalar *fa;
1976dd63270SBarry Smith PetscInt m, N, lda;
1986dd63270SBarry Smith *ierr = MatDenseGetArray(*mat, &fa);
1996dd63270SBarry Smith if (*ierr) return;
2006dd63270SBarry Smith *ierr = MatGetLocalSize(*mat, &m, NULL);
2016dd63270SBarry Smith if (*ierr) return;
2026dd63270SBarry Smith *ierr = MatGetSize(*mat, NULL, &N);
2036dd63270SBarry Smith if (*ierr) return;
2046dd63270SBarry Smith *ierr = MatDenseGetLDA(*mat, &lda);
2056dd63270SBarry Smith if (*ierr) return;
2066dd63270SBarry Smith if (m != lda) { // TODO: add F90Array1dLDACreate()
2076dd63270SBarry Smith *ierr = PetscError(((PetscObject)*mat)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "Array lda %" PetscInt_FMT " must match number of local rows %" PetscInt_FMT, lda, m);
2086dd63270SBarry Smith return;
2096dd63270SBarry Smith }
2106dd63270SBarry Smith *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, m * N, ptr PETSC_F90_2PTR_PARAM(ptrd));
2116dd63270SBarry Smith }
matdenserestorearray1d_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2126dd63270SBarry Smith PETSC_EXTERN void matdenserestorearray1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2136dd63270SBarry Smith {
2146dd63270SBarry Smith PetscScalar *fa;
2156dd63270SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
2166dd63270SBarry Smith if (*ierr) return;
2176dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
2186dd63270SBarry Smith if (*ierr) return;
2196dd63270SBarry Smith *ierr = MatDenseRestoreArray(*mat, &fa);
2206dd63270SBarry Smith }
matdensegetarrayread1d_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2216dd63270SBarry Smith PETSC_EXTERN void matdensegetarrayread1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2226dd63270SBarry Smith {
2236dd63270SBarry Smith const PetscScalar *fa;
2246dd63270SBarry Smith PetscInt m, N, lda;
2256dd63270SBarry Smith *ierr = MatDenseGetArrayRead(*mat, &fa);
2266dd63270SBarry Smith if (*ierr) return;
2276dd63270SBarry Smith *ierr = MatGetLocalSize(*mat, &m, NULL);
2286dd63270SBarry Smith if (*ierr) return;
2296dd63270SBarry Smith *ierr = MatGetSize(*mat, NULL, &N);
2306dd63270SBarry Smith if (*ierr) return;
2316dd63270SBarry Smith *ierr = MatDenseGetLDA(*mat, &lda);
2326dd63270SBarry Smith if (*ierr) return;
2336dd63270SBarry Smith if (m != lda) { // TODO: add F90Array1dLDACreate()
2346dd63270SBarry Smith *ierr = PetscError(((PetscObject)*mat)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "Array lda %" PetscInt_FMT " must match number of local rows %" PetscInt_FMT, lda, m);
2356dd63270SBarry Smith return;
2366dd63270SBarry Smith }
2376dd63270SBarry Smith *ierr = F90Array1dCreate((void **)fa, MPIU_SCALAR, 1, m * N, ptr PETSC_F90_2PTR_PARAM(ptrd));
2386dd63270SBarry Smith }
matdenserestorearrayread1d_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2396dd63270SBarry Smith PETSC_EXTERN void matdenserestorearrayread1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2406dd63270SBarry Smith {
2416dd63270SBarry Smith const PetscScalar *fa;
2426dd63270SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
2436dd63270SBarry Smith if (*ierr) return;
2446dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
2456dd63270SBarry Smith if (*ierr) return;
2466dd63270SBarry Smith *ierr = MatDenseRestoreArrayRead(*mat, &fa);
2476dd63270SBarry Smith }
matdensegetarraywrite1d_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2486dd63270SBarry Smith PETSC_EXTERN void matdensegetarraywrite1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2496dd63270SBarry Smith {
2506dd63270SBarry Smith PetscScalar *fa;
2516dd63270SBarry Smith PetscInt m, N, lda;
2526dd63270SBarry Smith *ierr = MatDenseGetArrayWrite(*mat, &fa);
2536dd63270SBarry Smith if (*ierr) return;
2546dd63270SBarry Smith *ierr = MatGetLocalSize(*mat, &m, NULL);
2556dd63270SBarry Smith if (*ierr) return;
2566dd63270SBarry Smith *ierr = MatGetSize(*mat, NULL, &N);
2576dd63270SBarry Smith if (*ierr) return;
2586dd63270SBarry Smith *ierr = MatDenseGetLDA(*mat, &lda);
2596dd63270SBarry Smith if (*ierr) return;
2606dd63270SBarry Smith if (m != lda) { // TODO: add F90Array1dLDACreate()
2616dd63270SBarry Smith *ierr = PetscError(((PetscObject)*mat)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "Array lda %" PetscInt_FMT " must match number of local rows %" PetscInt_FMT, lda, m);
2626dd63270SBarry Smith return;
2636dd63270SBarry Smith }
2646dd63270SBarry Smith *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, m * N, ptr PETSC_F90_2PTR_PARAM(ptrd));
2656dd63270SBarry Smith }
matdenserestorearraywrite1d_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2666dd63270SBarry Smith PETSC_EXTERN void matdenserestorearraywrite1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2676dd63270SBarry Smith {
2686dd63270SBarry Smith PetscScalar *fa;
2696dd63270SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
2706dd63270SBarry Smith if (*ierr) return;
2716dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
2726dd63270SBarry Smith if (*ierr) return;
2736dd63270SBarry Smith *ierr = MatDenseRestoreArrayWrite(*mat, &fa);
2746dd63270SBarry Smith }
matdensegetcolumn_(Mat * mat,PetscInt * col,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2756dd63270SBarry Smith PETSC_EXTERN void matdensegetcolumn_(Mat *mat, PetscInt *col, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2766dd63270SBarry Smith {
2776dd63270SBarry Smith PetscScalar *fa;
2786dd63270SBarry Smith PetscInt m;
2796dd63270SBarry Smith *ierr = MatDenseGetColumn(*mat, *col, &fa);
2806dd63270SBarry Smith if (*ierr) return;
2816dd63270SBarry Smith *ierr = MatGetLocalSize(*mat, &m, NULL);
2826dd63270SBarry Smith if (*ierr) return;
2836dd63270SBarry Smith *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, m, ptr PETSC_F90_2PTR_PARAM(ptrd));
2846dd63270SBarry Smith }
matdenserestorecolumn_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2856dd63270SBarry Smith PETSC_EXTERN void matdenserestorecolumn_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2866dd63270SBarry Smith {
2876dd63270SBarry Smith PetscScalar *fa;
2886dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
2896dd63270SBarry Smith if (*ierr) return;
2906dd63270SBarry Smith *ierr = MatDenseRestoreColumn(*mat, &fa);
2916dd63270SBarry Smith }
292*009de11bSBarry Smith
293*009de11bSBarry Smith #include <../src/mat/impls/aij/seq/aij.h>
matseqaijgetarray_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))2946dd63270SBarry Smith PETSC_EXTERN void matseqaijgetarray_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
2956dd63270SBarry Smith {
2966dd63270SBarry Smith PetscScalar *fa;
297*009de11bSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ *)(*mat)->data;
298*009de11bSBarry Smith PetscInt nz = (*mat)->rmap->n ? a->i[(*mat)->rmap->n] : 0;
299*009de11bSBarry Smith
3006dd63270SBarry Smith *ierr = MatSeqAIJGetArray(*mat, &fa);
3016dd63270SBarry Smith if (*ierr) return;
302*009de11bSBarry Smith *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, nz, ptr PETSC_F90_2PTR_PARAM(ptrd));
3036dd63270SBarry Smith }
matseqaijrestorearray_(Mat * mat,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))3046dd63270SBarry Smith PETSC_EXTERN void matseqaijrestorearray_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
3056dd63270SBarry Smith {
3066dd63270SBarry Smith PetscScalar *fa;
3076dd63270SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
3086dd63270SBarry Smith if (*ierr) return;
3096dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
3106dd63270SBarry Smith if (*ierr) return;
3116dd63270SBarry Smith *ierr = MatSeqAIJRestoreArray(*mat, &fa);
3126dd63270SBarry Smith }
matgetrowij_(Mat * B,PetscInt * shift,PetscBool * sym,PetscBool * blockcompressed,PetscInt * n,F90Array1d * ia,F90Array1d * ja,PetscBool * done,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (iad)PETSC_F90_2PTR_PROTO (jad))3136dd63270SBarry Smith PETSC_EXTERN void matgetrowij_(Mat *B, PetscInt *shift, PetscBool *sym, PetscBool *blockcompressed, PetscInt *n, F90Array1d *ia, F90Array1d *ja, PetscBool *done, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(iad) PETSC_F90_2PTR_PROTO(jad))
3146dd63270SBarry Smith {
3156dd63270SBarry Smith const PetscInt *IA, *JA;
3166dd63270SBarry Smith *ierr = MatGetRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
3176dd63270SBarry Smith if (*ierr) return;
3186dd63270SBarry Smith if (!*done) return;
3196dd63270SBarry Smith *ierr = F90Array1dCreate((PetscInt *)IA, MPIU_INT, 1, *n + 1, ia PETSC_F90_2PTR_PARAM(iad));
3206dd63270SBarry Smith *ierr = F90Array1dCreate((PetscInt *)JA, MPIU_INT, 1, IA[*n], ja PETSC_F90_2PTR_PARAM(jad));
3216dd63270SBarry Smith }
matrestorerowij_(Mat * B,PetscInt * shift,PetscBool * sym,PetscBool * blockcompressed,PetscInt * n,F90Array1d * ia,F90Array1d * ja,PetscBool * done,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (iad)PETSC_F90_2PTR_PROTO (jad))3226dd63270SBarry Smith PETSC_EXTERN void matrestorerowij_(Mat *B, PetscInt *shift, PetscBool *sym, PetscBool *blockcompressed, PetscInt *n, F90Array1d *ia, F90Array1d *ja, PetscBool *done, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(iad) PETSC_F90_2PTR_PROTO(jad))
3236dd63270SBarry Smith {
3246dd63270SBarry Smith const PetscInt *IA, *JA;
3256dd63270SBarry Smith *ierr = F90Array1dAccess(ia, MPIU_INT, (void **)&IA PETSC_F90_2PTR_PARAM(iad));
3266dd63270SBarry Smith if (*ierr) return;
3276dd63270SBarry Smith *ierr = F90Array1dDestroy(ia, MPIU_INT PETSC_F90_2PTR_PARAM(iad));
3286dd63270SBarry Smith if (*ierr) return;
3296dd63270SBarry Smith *ierr = F90Array1dAccess(ja, MPIU_INT, (void **)&JA PETSC_F90_2PTR_PARAM(jad));
3306dd63270SBarry Smith if (*ierr) return;
3316dd63270SBarry Smith *ierr = F90Array1dDestroy(ja, MPIU_INT PETSC_F90_2PTR_PARAM(jad));
3326dd63270SBarry Smith if (*ierr) return;
3336dd63270SBarry Smith *ierr = MatRestoreRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
3346dd63270SBarry Smith }
matmpiaijgetseqaij_(Mat * mat,Mat * A,Mat * B,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))3356dd63270SBarry Smith PETSC_EXTERN void matmpiaijgetseqaij_(Mat *mat, Mat *A, Mat *B, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
3366dd63270SBarry Smith {
3376dd63270SBarry Smith const PetscInt *fa;
3386dd63270SBarry Smith PetscInt n;
3396dd63270SBarry Smith *ierr = MatMPIAIJGetSeqAIJ(*mat, A, B, &fa);
3406dd63270SBarry Smith if (*ierr) return;
3416dd63270SBarry Smith *ierr = MatGetLocalSize(*B, NULL, &n);
3426dd63270SBarry Smith if (*ierr) return;
3436dd63270SBarry Smith *ierr = F90Array1dCreate((void *)fa, MPIU_INT, 1, n, ptr PETSC_F90_2PTR_PARAM(ptrd));
3446dd63270SBarry Smith }
matmpiaijrestoreseqaij_(Mat * mat,Mat * A,Mat * B,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd))3456dd63270SBarry Smith PETSC_EXTERN void matmpiaijrestoreseqaij_(Mat *mat, Mat *A, Mat *B, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
3466dd63270SBarry Smith {
3476dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_INT PETSC_F90_2PTR_PARAM(ptrd));
3486dd63270SBarry Smith if (*ierr) return;
3496dd63270SBarry Smith }
350