Actual source code: zmatrixf90.c

  1: #include <petscmat.h>
  2: #include <petsc/private/ftnimpl.h>

  4: #if defined(PETSC_HAVE_FORTRAN_CAPS)
  5:   #define matgetrow_                   MATGETROW
  6:   #define matrestorerow_               MATRESTOREROW
  7:   #define matmpiaijgetseqaij_          MATMPIAIJGETSEQAIJ
  8:   #define matmpiaijrestoreseqaij_      MATMPIAIJRESTORESEQAIJ
  9:   #define matdensegetarray1d_          MATDENSEGETARRAY1D
 10:   #define matdenserestorearray1d_      MATDENSERESTOREARRAY1D
 11:   #define matdensegetarrayread1d_      MATDENSEGETARRAYREAD1D
 12:   #define matdenserestorearrayread1d_  MATDENSERESTOREARRAYREAD1D
 13:   #define matdensegetarraywrite1d_     MATDENSEGETARRAYWRITE1D
 14:   #define matdenserestorearraywrite1d_ MATDENSERESTOREARRAYWRITE1D
 15:   #define matdensegetarray2d_          MATDENSEGETARRAY2D
 16:   #define matdenserestorearray2d_      MATDENSERESTOREARRAY2D
 17:   #define matdensegetarrayread2d_      MATDENSEGETARRAYREAD2D
 18:   #define matdenserestorearrayread2d_  MATDENSERESTOREARRAYREAD2D
 19:   #define matdensegetarraywrite2d_     MATDENSEGETARRAYWRITE2D
 20:   #define matdenserestorearraywrite2d_ MATDENSERESTOREARRAYWRITE2D
 21:   #define matdensegetcolumn_           MATDENSEGETCOLUMN
 22:   #define matdenserestorecolumn_       MATDENSERESTORECOLUMN
 23:   #define matseqaijgetarray_           MATSEQAIJGETARRAY
 24:   #define matseqaijrestorearray_       MATSEQAIJRESTOREARRAY
 25:   #define matseqaijgetarrayread_       MATSEQAIJGETARRAYREAD
 26:   #define matseqaijrestorearrayread_   MATSEQAIJRESTOREARRAYREAD
 27:   #define matseqaijgetarraywrite_      MATSEQAIJGETARRAYWRITE
 28:   #define matseqaijrestorearraywrite_  MATSEQAIJRESTOREARRAYWRITE
 29:   #define matgetghosts_                MATGETGHOSTS
 30:   #define matgetrowij_                 MATGETROWIJ
 31:   #define matrestorerowij_             MATRESTOREROWIJ
 32: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
 33:   #define matgetrow_                   matgetrow
 34:   #define matrestorerow_               matrestorerow
 35:   #define matmpiaijgetseqaij_          matmpiaijgetseqaij
 36:   #define matmpiaijrestoreseqaij_      matmpiaijrestoreseqaij
 37:   #define matdensegetarray1d_          matdensegetarray1d
 38:   #define matdenserestorearray1d_      matdenserestorearray1d
 39:   #define matdensegetarrayread1d_      matdensegetarrayread1d
 40:   #define matdenserestorearrayread1d_  matdenserestorearrayread1d
 41:   #define matdensegetarraywrite1d_     matdensegetarraywrite1d
 42:   #define matdenserestorearraywrite1d_ matdenserestorearraywrite1d
 43:   #define matdensegetarray2d_          matdensegetarray2d
 44:   #define matdenserestorearray2d_      matdenserestorearray2d
 45:   #define matdensegetarrayread2d_      matdensegetarrayread2d
 46:   #define matdenserestorearrayread2d_  matdenserestorearrayread2d
 47:   #define matdensegetarraywrite2d_     matdensegetarraywrite2d
 48:   #define matdenserestorearraywrite2d_ matdenserestorearraywrite2d
 49:   #define matdensegetcolumn_           matdensegetcolumn
 50:   #define matdenserestorecolumn_       matdenserestorecolumn
 51:   #define matseqaijgetarray_           matseqaijgetarray
 52:   #define matseqaijrestorearray_       matseqaijrestorearray
 53:   #define matseqaijgetarrayread_       matseqaijgetarrayread
 54:   #define matseqaijrestorearrayread_   matseqaijrestorearrayread
 55:   #define matseqaijgetarraywrite_      matseqaijgetarraywrite
 56:   #define matseqaijrestorearraywrite_  matseqaijrestorearraywrite
 57:   #define matgetghosts_                matgetghosts
 58:   #define matgetrowij_                 matgetrowij
 59:   #define matrestorerowij_             matrestorerowij
 60: #endif

 62: 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))
 63: {
 64:   PetscInt           n;
 65:   const PetscInt    *II = NULL;
 66:   const PetscScalar *A  = NULL;

 68:   if (FORTRANNULLINTEGERPOINTER(ia) && FORTRANNULLSCALARPOINTER(a)) {
 69:     *ierr = MatGetRow(*B, *row, &n, NULL, NULL);
 70:   } else if (FORTRANNULLINTEGERPOINTER(ia)) {
 71:     *ierr = MatGetRow(*B, *row, &n, NULL, &A);
 72:   } else if (FORTRANNULLSCALARPOINTER(a)) {
 73:     *ierr = MatGetRow(*B, *row, &n, &II, NULL);
 74:   } else {
 75:     *ierr = MatGetRow(*B, *row, &n, &II, &A);
 76:   }
 77:   if (*ierr) return;
 78:   if (II) *ierr = F90Array1dCreate((void *)II, MPIU_INT, 1, n, ia PETSC_F90_2PTR_PARAM(iad));
 79:   if (A) *ierr = F90Array1dCreate((void *)A, MPIU_SCALAR, 1, n, a PETSC_F90_2PTR_PARAM(jad));
 80:   if (!FORTRANNULLINTEGER(N)) *N = n;
 81: }
 82: 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))
 83: {
 84:   const PetscInt    *IA = NULL;
 85:   const PetscScalar *A  = NULL;
 86:   PetscInt           n;

 88:   if (FORTRANNULLINTEGERPOINTER(ia) && FORTRANNULLSCALARPOINTER(a)) {
 89:     *ierr = MatRestoreRow(*B, *row, &n, NULL, NULL);
 90:     return;
 91:   }
 92:   if (!FORTRANNULLINTEGERPOINTER(ia)) {
 93:     *ierr = F90Array1dAccess(ia, MPIU_INT, (void **)&IA PETSC_F90_2PTR_PARAM(iad));
 94:     if (*ierr) return;
 95:     *ierr = F90Array1dDestroy(ia, MPIU_INT PETSC_F90_2PTR_PARAM(iad));
 96:     if (*ierr) return;
 97:   }
 98:   if (!FORTRANNULLSCALARPOINTER(a)) {
 99:     *ierr = F90Array1dAccess(a, MPIU_SCALAR, (void **)&A PETSC_F90_2PTR_PARAM(jad));
100:     if (*ierr) return;
101:     *ierr = F90Array1dDestroy(a, MPIU_INT PETSC_F90_2PTR_PARAM(jad));
102:     if (*ierr) return;
103:   }
104:   if (FORTRANNULLINTEGERPOINTER(ia)) {
105:     *ierr = MatRestoreRow(*B, *row, &n, NULL, &A);
106:   } else if (FORTRANNULLSCALARPOINTER(a)) {
107:     *ierr = MatRestoreRow(*B, *row, &n, &IA, NULL);
108:   } else {
109:     *ierr = MatRestoreRow(*B, *row, &n, &IA, &A);
110:   }
111: }
112: PETSC_EXTERN void matgetghosts_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
113: {
114:   const PetscInt *ghosts;
115:   PetscInt        N;

117:   *ierr = MatGetGhosts(*mat, &N, &ghosts);
118:   if (*ierr) return;
119:   *ierr = F90Array1dCreate((PetscInt *)ghosts, MPIU_INT, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
120: }
121: PETSC_EXTERN void matdensegetarray2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
122: {
123:   PetscScalar *fa;
124:   PetscInt     m, N, lda;
125:   *ierr = MatDenseGetArray(*mat, &fa);
126:   if (*ierr) return;
127:   *ierr = MatGetLocalSize(*mat, &m, NULL);
128:   if (*ierr) return;
129:   *ierr = MatGetSize(*mat, NULL, &N);
130:   if (*ierr) return;
131:   *ierr = MatDenseGetLDA(*mat, &lda);
132:   if (*ierr) return;
133:   if (m != lda) { // TODO: add F90Array2dLDACreate()
134:     *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);
135:     return;
136:   }
137:   *ierr = F90Array2dCreate(fa, MPIU_SCALAR, 1, m, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
138: }
139: PETSC_EXTERN void matdenserestorearray2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
140: {
141:   PetscScalar *fa;
142:   *ierr = F90Array2dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
143:   if (*ierr) return;
144:   *ierr = F90Array2dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
145:   if (*ierr) return;
146:   *ierr = MatDenseRestoreArray(*mat, &fa);
147: }
148: PETSC_EXTERN void matdensegetarrayread2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
149: {
150:   const PetscScalar *fa;
151:   PetscInt           m, N, lda;
152:   *ierr = MatDenseGetArrayRead(*mat, &fa);
153:   if (*ierr) return;
154:   *ierr = MatGetLocalSize(*mat, &m, NULL);
155:   if (*ierr) return;
156:   *ierr = MatGetSize(*mat, NULL, &N);
157:   if (*ierr) return;
158:   *ierr = MatDenseGetLDA(*mat, &lda);
159:   if (*ierr) return;
160:   if (m != lda) { // TODO: add F90Array2dLDACreate()
161:     *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);
162:     return;
163:   }
164:   *ierr = F90Array2dCreate((void **)fa, MPIU_SCALAR, 1, m, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
165: }
166: PETSC_EXTERN void matdenserestorearrayread2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
167: {
168:   const PetscScalar *fa;
169:   *ierr = F90Array2dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
170:   if (*ierr) return;
171:   *ierr = F90Array2dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
172:   if (*ierr) return;
173:   *ierr = MatDenseRestoreArrayRead(*mat, &fa);
174: }
175: PETSC_EXTERN void matdensegetarraywrite2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
176: {
177:   PetscScalar *fa;
178:   PetscInt     m, N, lda;
179:   *ierr = MatDenseGetArrayWrite(*mat, &fa);
180:   if (*ierr) return;
181:   *ierr = MatGetLocalSize(*mat, &m, NULL);
182:   if (*ierr) return;
183:   *ierr = MatGetSize(*mat, NULL, &N);
184:   if (*ierr) return;
185:   *ierr = MatDenseGetLDA(*mat, &lda);
186:   if (*ierr) return;
187:   if (m != lda) { // TODO: add F90Array2dLDACreate()
188:     *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);
189:     return;
190:   }
191:   *ierr = F90Array2dCreate(fa, MPIU_SCALAR, 1, m, 1, N, ptr PETSC_F90_2PTR_PARAM(ptrd));
192: }
193: PETSC_EXTERN void matdenserestorearraywrite2d_(Mat *mat, F90Array2d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
194: {
195:   PetscScalar *fa;
196:   *ierr = F90Array2dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
197:   if (*ierr) return;
198:   *ierr = F90Array2dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
199:   if (*ierr) return;
200:   *ierr = MatDenseRestoreArrayWrite(*mat, &fa);
201: }
202: PETSC_EXTERN void matdensegetarray1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
203: {
204:   PetscScalar *fa;
205:   PetscInt     m, N, lda;
206:   *ierr = MatDenseGetArray(*mat, &fa);
207:   if (*ierr) return;
208:   *ierr = MatGetLocalSize(*mat, &m, NULL);
209:   if (*ierr) return;
210:   *ierr = MatGetSize(*mat, NULL, &N);
211:   if (*ierr) return;
212:   *ierr = MatDenseGetLDA(*mat, &lda);
213:   if (*ierr) return;
214:   if (m != lda) { // TODO: add F90Array1dLDACreate()
215:     *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);
216:     return;
217:   }
218:   *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, m * N, ptr PETSC_F90_2PTR_PARAM(ptrd));
219: }
220: PETSC_EXTERN void matdenserestorearray1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
221: {
222:   PetscScalar *fa;
223:   *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
224:   if (*ierr) return;
225:   *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
226:   if (*ierr) return;
227:   *ierr = MatDenseRestoreArray(*mat, &fa);
228: }
229: PETSC_EXTERN void matdensegetarrayread1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
230: {
231:   const PetscScalar *fa;
232:   PetscInt           m, N, lda;
233:   *ierr = MatDenseGetArrayRead(*mat, &fa);
234:   if (*ierr) return;
235:   *ierr = MatGetLocalSize(*mat, &m, NULL);
236:   if (*ierr) return;
237:   *ierr = MatGetSize(*mat, NULL, &N);
238:   if (*ierr) return;
239:   *ierr = MatDenseGetLDA(*mat, &lda);
240:   if (*ierr) return;
241:   if (m != lda) { // TODO: add F90Array1dLDACreate()
242:     *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);
243:     return;
244:   }
245:   *ierr = F90Array1dCreate((void **)fa, MPIU_SCALAR, 1, m * N, ptr PETSC_F90_2PTR_PARAM(ptrd));
246: }
247: PETSC_EXTERN void matdenserestorearrayread1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
248: {
249:   const PetscScalar *fa;
250:   *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
251:   if (*ierr) return;
252:   *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
253:   if (*ierr) return;
254:   *ierr = MatDenseRestoreArrayRead(*mat, &fa);
255: }
256: PETSC_EXTERN void matdensegetarraywrite1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
257: {
258:   PetscScalar *fa;
259:   PetscInt     m, N, lda;
260:   *ierr = MatDenseGetArrayWrite(*mat, &fa);
261:   if (*ierr) return;
262:   *ierr = MatGetLocalSize(*mat, &m, NULL);
263:   if (*ierr) return;
264:   *ierr = MatGetSize(*mat, NULL, &N);
265:   if (*ierr) return;
266:   *ierr = MatDenseGetLDA(*mat, &lda);
267:   if (*ierr) return;
268:   if (m != lda) { // TODO: add F90Array1dLDACreate()
269:     *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);
270:     return;
271:   }
272:   *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, m * N, ptr PETSC_F90_2PTR_PARAM(ptrd));
273: }
274: PETSC_EXTERN void matdenserestorearraywrite1d_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
275: {
276:   PetscScalar *fa;
277:   *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
278:   if (*ierr) return;
279:   *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
280:   if (*ierr) return;
281:   *ierr = MatDenseRestoreArrayWrite(*mat, &fa);
282: }
283: PETSC_EXTERN void matdensegetcolumn_(Mat *mat, PetscInt *col, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
284: {
285:   PetscScalar *fa;
286:   PetscInt     m;
287:   *ierr = MatDenseGetColumn(*mat, *col, &fa);
288:   if (*ierr) return;
289:   *ierr = MatGetLocalSize(*mat, &m, NULL);
290:   if (*ierr) return;
291:   *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, m, ptr PETSC_F90_2PTR_PARAM(ptrd));
292: }
293: PETSC_EXTERN void matdenserestorecolumn_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
294: {
295:   PetscScalar *fa;
296:   *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
297:   if (*ierr) return;
298:   *ierr = MatDenseRestoreColumn(*mat, &fa);
299: }

301: #include <../src/mat/impls/aij/seq/aij.h>
302: PETSC_EXTERN void matseqaijgetarray_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
303: {
304:   PetscScalar *fa;
305:   Mat_SeqAIJ  *a  = (Mat_SeqAIJ *)(*mat)->data;
306:   PetscInt     nz = (*mat)->rmap->n ? a->i[(*mat)->rmap->n] : 0;

308:   *ierr = MatSeqAIJGetArray(*mat, &fa);
309:   if (*ierr) return;
310:   *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, nz, ptr PETSC_F90_2PTR_PARAM(ptrd));
311: }
312: PETSC_EXTERN void matseqaijrestorearray_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
313: {
314:   PetscScalar *fa;
315:   *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
316:   if (*ierr) return;
317:   *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
318:   if (*ierr) return;
319:   *ierr = MatSeqAIJRestoreArray(*mat, &fa);
320: }
321: PETSC_EXTERN void matseqaijgetarrayread_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
322: {
323:   const PetscScalar *fa;
324:   Mat_SeqAIJ        *a  = (Mat_SeqAIJ *)(*mat)->data;
325:   PetscInt           nz = (*mat)->rmap->n ? a->i[(*mat)->rmap->n] : 0;

327:   *ierr = MatSeqAIJGetArrayRead(*mat, &fa);
328:   if (*ierr) return;
329:   *ierr = F90Array1dCreate((void *)fa, MPIU_SCALAR, 1, nz, ptr PETSC_F90_2PTR_PARAM(ptrd));
330: }
331: PETSC_EXTERN void matseqaijrestorearrayread_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
332: {
333:   const PetscScalar *fa;
334:   *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
335:   if (*ierr) return;
336:   *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
337:   if (*ierr) return;
338:   *ierr = MatSeqAIJRestoreArrayRead(*mat, &fa);
339: }
340: PETSC_EXTERN void matseqaijgetarraywrite_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
341: {
342:   PetscScalar *fa;
343:   Mat_SeqAIJ  *a  = (Mat_SeqAIJ *)(*mat)->data;
344:   PetscInt     nz = (*mat)->rmap->n ? a->i[(*mat)->rmap->n] : 0;

346:   *ierr = MatSeqAIJGetArrayWrite(*mat, &fa);
347:   if (*ierr) return;
348:   *ierr = F90Array1dCreate(fa, MPIU_SCALAR, 1, nz, ptr PETSC_F90_2PTR_PARAM(ptrd));
349: }
350: PETSC_EXTERN void matseqaijrestorearraywrite_(Mat *mat, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
351: {
352:   PetscScalar *fa;
353:   *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
354:   if (*ierr) return;
355:   *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
356:   if (*ierr) return;
357:   *ierr = MatSeqAIJRestoreArrayWrite(*mat, &fa);
358: }
359: 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))
360: {
361:   const PetscInt *IA, *JA;
362:   *ierr = MatGetRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
363:   if (*ierr) return;
364:   if (!*done) return;
365:   *ierr = F90Array1dCreate((PetscInt *)IA, MPIU_INT, 1, *n + 1, ia PETSC_F90_2PTR_PARAM(iad));
366:   *ierr = F90Array1dCreate((PetscInt *)JA, MPIU_INT, 1, IA[*n], ja PETSC_F90_2PTR_PARAM(jad));
367: }
368: 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))
369: {
370:   const PetscInt *IA, *JA;
371:   *ierr = F90Array1dAccess(ia, MPIU_INT, (void **)&IA PETSC_F90_2PTR_PARAM(iad));
372:   if (*ierr) return;
373:   *ierr = F90Array1dDestroy(ia, MPIU_INT PETSC_F90_2PTR_PARAM(iad));
374:   if (*ierr) return;
375:   *ierr = F90Array1dAccess(ja, MPIU_INT, (void **)&JA PETSC_F90_2PTR_PARAM(jad));
376:   if (*ierr) return;
377:   *ierr = F90Array1dDestroy(ja, MPIU_INT PETSC_F90_2PTR_PARAM(jad));
378:   if (*ierr) return;
379:   *ierr = MatRestoreRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
380: }
381: PETSC_EXTERN void matmpiaijgetseqaij_(Mat *mat, Mat *A, Mat *B, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
382: {
383:   const PetscInt *fa;
384:   PetscInt        n;
385:   *ierr = MatMPIAIJGetSeqAIJ(*mat, A, B, &fa);
386:   if (*ierr) return;
387:   *ierr = MatGetLocalSize(*B, NULL, &n);
388:   if (*ierr) return;
389:   *ierr = F90Array1dCreate((void *)fa, MPIU_INT, 1, n, ptr PETSC_F90_2PTR_PARAM(ptrd));
390: }
391: PETSC_EXTERN void matmpiaijrestoreseqaij_(Mat *mat, Mat *A, Mat *B, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
392: {
393:   *ierr = F90Array1dDestroy(ptr, MPIU_INT PETSC_F90_2PTR_PARAM(ptrd));
394:   if (*ierr) return;
395: }