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 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; 70f14a4c02SBarry Smith if (II) { *ierr = F90Array1dCreate((void *)II, MPIU_INT, 1, n, ia PETSC_F90_2PTR_PARAM(iad)); } 71f14a4c02SBarry Smith 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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> 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 } 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 } 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 } 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 } 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 } 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