Actual source code: zmatrixf.c

  1: #include <petsc/private/fortranimpl.h>
  2: #include <petsc/private/f90impl.h>
  3: #include <petscmat.h>
  4: #include <petscviewer.h>

  6: #if defined(PETSC_HAVE_FORTRAN_CAPS)
  7:   #define matgetvalues_                MATGETVALUES
  8:   #define matgetvalues0_               MATGETVALUES0
  9:   #define matgetvaluesnn1_             MATGETVALUESnn1
 10:   #define matgetvaluesnnnn_            MATGETVALUESnnnn
 11:   #define matgetvalues11_              MATGETVALUES11
 12:   #define matgetvalues11a_             MATGETVALUES11A
 13:   #define matgetvalues1n_              MATGETVALUES1N
 14:   #define matgetvaluesn1_              MATGETVALUESN1
 15:   #define matgetvalueslocal_           MATGETVALUESLOCAL
 16:   #define matgetvalueslocal0_          MATGETVALUESLOCAL0
 17:   #define matgetvalueslocalnn1_        MATGETVALUESLOCALNN1
 18:   #define matgetvalueslocalnnnn_       MATGETVALUESLOCALNNNN
 19:   #define matgetvalueslocal11_         MATGETVALUESLOCAL11
 20:   #define matgetvalueslocal11a_        MATGETVALUESLOCAL11A
 21:   #define matgetvalueslocal1n_         MATGETVALUESLOCAL1N
 22:   #define matgetvalueslocaln1_         MATGETVALUESLOCALN1
 23:   #define matsetvalues_                MATSETVALUES
 24:   #define matsetvaluesnnnn_            MATSETVALUESNNNN
 25:   #define matsetvalues0_               MATSETVALUES0
 26:   #define matsetvaluesnn1_             MATSETVALUESNN1
 27:   #define matsetvalues11_              MATSETVALUES11
 28:   #define matsetvalues1n_              MATSETVALUES1N
 29:   #define matsetvaluesn1_              MATSETVALUESN1
 30:   #define matsetvaluesblocked0_        MATSETVALUESBLOCKED0
 31:   #define matsetvaluesblocked2_        MATSETVALUESBLOCKED2
 32:   #define matsetvaluesblocked11_       MATSETVALUESBLOCKED11
 33:   #define matsetvaluesblocked111_      MATSETVALUESBLOCKED111
 34:   #define matsetvaluesblocked1n_       MATSETVALUESBLOCKED1N
 35:   #define matsetvaluesblockedn1_       MATSETVALUESBLOCKEDN1
 36:   #define matsetvaluesblockedlocal_    MATSETVALUESBLOCKEDLOCAL
 37:   #define matsetvaluesblockedlocal0_   MATSETVALUESBLOCKEDLOCAL0
 38:   #define matsetvaluesblockedlocal11_  MATSETVALUESBLOCKEDLOCAL11
 39:   #define matsetvaluesblockedlocal111_ MATSETVALUESBLOCKEDLOCAL111
 40:   #define matsetvaluesblockedlocal1n_  MATSETVALUESBLOCKEDLOCAL1N
 41:   #define matsetvaluesblockedlocaln1_  MATSETVALUESBLOCKEDLOCALN1
 42:   #define matsetvalueslocal_           MATSETVALUESLOCAL
 43:   #define matsetvalueslocal0_          MATSETVALUESLOCAL0
 44:   #define matsetvalueslocal11_         MATSETVALUESLOCAL11
 45:   #define matsetvalueslocal11nn_       MATSETVALUESLOCAL11NN
 46:   #define matsetvalueslocal111_        MATSETVALUESLOCAL111
 47:   #define matsetvalueslocal1n_         MATSETVALUESLOCAL1N
 48:   #define matsetvalueslocaln1_         MATSETVALUESLOCALN1
 49:   #define matgetrowmin_                MATGETROWMIN
 50:   #define matgetrowminabs_             MATGETROWMINABS
 51:   #define matgetrowmax_                MATGETROWMAX
 52:   #define matgetrowmaxabs_             MATGETROWMAXABS
 53:   #define matdestroymatrices_          MATDESTROYMATRICES
 54:   #define matdestroysubmatrices_       MATDESTROYSUBMATRICES
 55:   #define matgetfactor_                MATGETFACTOR
 56:   #define matfactorgetsolverpackage_   MATFACTORGETSOLVERPACKAGE
 57:   #define matgetrowij_                 MATGETROWIJ
 58:   #define matrestorerowij_             MATRESTOREROWIJ
 59:   #define matgetrow_                   MATGETROW
 60:   #define matrestorerow_               MATRESTOREROW
 61:   #define matload_                     MATLOAD
 62:   #define matview_                     MATVIEW
 63:   #define matseqaijgetarray_           MATSEQAIJGETARRAY
 64:   #define matseqaijrestorearray_       MATSEQAIJRESTOREARRAY
 65:   #define matdensegetarray_            MATDENSEGETARRAY
 66:   #define matdensegetarrayread_        MATDENSEGETARRAYREAD
 67:   #define matdenserestorearray_        MATDENSERESTOREARRAY
 68:   #define matdenserestorearrayread_    MATDENSERESTOREARRAYREAD
 69:   #define matconvert_                  MATCONVERT
 70:   #define matcreatesubmatrices_        MATCREATESUBMATRICES
 71:   #define matcreatesubmatricesmpi_     MATCREATESUBMATRICESMPI
 72:   #define matzerorowscolumns_          MATZEROROWSCOLUMNS
 73:   #define matzerorowscolumnsis_        MATZEROROWSCOLUMNSIS
 74:   #define matzerorowsstencil_          MATZEROROWSSTENCIL
 75:   #define matzerorowscolumnsstencil_   MATZEROROWSCOLUMNSSTENCIL
 76:   #define matzerorows_                 MATZEROROWS
 77:   #define matzerorowsis_               MATZEROROWSIS
 78:   #define matzerorowslocal_            MATZEROROWSLOCAL
 79:   #define matzerorowslocal0_           MATZEROROWSLOCAL0
 80:   #define matzerorowslocal1_           MATZEROROWSLOCAL1
 81:   #define matzerorowslocalis_          MATZEROROWSLOCALIS
 82:   #define matzerorowscolumnslocal_     MATZEROROWSCOLUMNSLOCAL
 83:   #define matzerorowscolumnslocalis_   MATZEROROWSCOLUMNSLOCALIS
 84:   #define matsetoptionsprefix_         MATSETOPTIONSPREFIX
 85:   #define matcreatevecs_               MATCREATEVECS
 86:   #define matnullspaceremove_          MATNULLSPACEREMOVE
 87:   #define matgetinfo_                  MATGETINFO
 88:   #define matlufactor_                 MATLUFACTOR
 89:   #define matilufactor_                MATILUFACTOR
 90:   #define matlufactorsymbolic_         MATLUFACTORSYMBOLIC
 91:   #define matlufactornumeric_          MATLUFACTORNUMERIC
 92:   #define matcholeskyfactor_           MATCHOLESKYFACTOR
 93:   #define matcholeskyfactorsymbolic_   MATCHOLESKYFACTORSYMBOLIC
 94:   #define matcholeskyfactornumeric_    MATCHOLESKYFACTORNUMERIC
 95:   #define matilufactorsymbolic_        MATILUFACTORSYMBOLIC
 96:   #define maticcfactorsymbolic_        MATICCFACTORSYMBOLIC
 97:   #define maticcfactor_                MATICCFACTOR
 98:   #define matfactorinfoinitialize_     MATFACTORINFOINITIALIZE
 99:   #define matnullspacesetfunction_     MATNULLSPACESETFUNCTION
100:   #define matfindnonzerorows_          MATFINDNONZEROROWS
101:   #define matgetsize_                  MATGETSIZE
102:   #define matgetsize00_                MATGETSIZE00
103:   #define matgetsize10_                MATGETSIZE10
104:   #define matgetsize01_                MATGETSIZE01
105:   #define matgetlocalsize_             MATGETLOCALSIZE
106:   #define matgetlocalsize00_           MATGETLOCALSIZE00
107:   #define matgetlocalsize10_           MATGETLOCALSIZE10
108:   #define matgetlocalsize01_           MATGETLOCALSIZE01
109:   #define matsetnullspace_             MATSETNULLSPACE
110:   #define matgetownershiprange_        MATGETOWNERSHIPRANGE
111:   #define matgetownershiprange00_      MATGETOWNERSHIPRANGE00
112:   #define matgetownershiprange10_      MATGETOWNERSHIPRANGE10
113:   #define matgetownershiprange01_      MATGETOWNERSHIPRANGE01
114:   #define matgetownershiprange11_      MATGETOWNERSHIPRANGE11
115:   #define matgetownershipis_           MATGETOWNERSHIPIS
116:   #define matgetownershiprangecolumn_  MATGETOWNERSHIPRANGECOLUMN
117:   #define matviewfromoptions_          MATVIEWFROMOPTIONS
118:   #define matdestroy_                  MATDESTROY
119:   #define matcreatefromoptions_        MATCREATEFROMOPTIONS
120: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
121:   #define matsetvalues_                matsetvalues
122:   #define matsetvaluesnnnn_            matsetvaluesnnnn
123:   #define matsetvalues0_               matsetvalues0
124:   #define matsetvaluesnn1_             matsetvaluesnn1
125:   #define matsetvalues11_              matsetvalues11
126:   #define matsetvaluesn1_              matsetvaluesn1
127:   #define matsetvalues1n_              matsetvalues1n
128:   #define matsetvalueslocal_           matsetvalueslocal
129:   #define matsetvalueslocal0_          matsetvalueslocal0
130:   #define matsetvalueslocal11_         matsetvalueslocal11
131:   #define matsetvalueslocal11nn_       matsetvalueslocal11nn
132:   #define matsetvalueslocal111_        matsetvalueslocal111
133:   #define matsetvalueslocal1n_         matsetvalueslocal1n
134:   #define matsetvalueslocaln1_         matsetvalueslocaln1
135:   #define matsetvaluesblocked_         matsetvaluesblocked
136:   #define matsetvaluesblocked0_        matsetvaluesblocked0
137:   #define matsetvaluesblocked2_        matsetvaluesblocked2
138:   #define matsetvaluesblocked11_       matsetvaluesblocked11
139:   #define matsetvaluesblocked111_      matsetvaluesblocked111
140:   #define matsetvaluesblocked1n_       matsetvaluesblocked1n
141:   #define matsetvaluesblockedn1_       matsetvaluesblockedn1
142:   #define matsetvaluesblockedlocal_    matsetvaluesblockedlocal
143:   #define matsetvaluesblockedlocal0_   matsetvaluesblockedlocal0
144:   #define matsetvaluesblockedlocal11_  matsetvaluesblockedlocal11
145:   #define matsetvaluesblockedlocal111_ matsetvaluesblockedlocal111
146:   #define matsetvaluesblockedlocal1n_  matsetvaluesblockedlocal1n
147:   #define matsetvaluesblockedlocaln1_  matsetvaluesblockedlocaln1
148:   #define matgetrowmin_                matgetrowmin
149:   #define matgetrowminabs_             matgetrowminabs
150:   #define matgetrowmax_                matgetrowmax
151:   #define matgetrowmaxabs_             matgetrowmaxabs
152:   #define matdestroymatrices_          matdestroymatrices
153:   #define matdestroysubmatrices_       matdestroysubmatrices
154:   #define matgetfactor_                matgetfactor
155:   #define matfactorgetsolverpackage_   matfactorgetsolverpackage
156:   #define matcreatevecs_               matcreatevecs
157:   #define matgetrowij_                 matgetrowij
158:   #define matrestorerowij_             matrestorerowij
159:   #define matgetrow_                   matgetrow
160:   #define matrestorerow_               matrestorerow
161:   #define matview_                     matview
162:   #define matload_                     matload
163:   #define matseqaijgetarray_           matseqaijgetarray
164:   #define matseqaijrestorearray_       matseqaijrestorearray
165:   #define matdensegetarray_            matdensegetarray
166:   #define matdensegetarrayread_        matdensegetarrayread
167:   #define matdenserestorearray_        matdenserestorearray
168:   #define matdenserestorearrayread_    matdenserestorearrayread
169:   #define matconvert_                  matconvert
170:   #define matcreatesubmatrices_        matcreatesubmatrices
171:   #define matcreatesubmatricesmpi_     matcreatesubmatricesmpi
172:   #define matzerorowscolumns_          matzerorowscolumns
173:   #define matzerorowscolumnsis_        matzerorowscolumnsis
174:   #define matzerorowsstencil_          matzerorowsstencil
175:   #define matzerorowscolumnsstencil_   matzerorowscolumnsstencil
176:   #define matzerorows_                 matzerorows
177:   #define matzerorowsis_               matzerorowsis
178:   #define matzerorowslocal_            matzerorowslocal
179:   #define matzerorowslocalis_          matzerorowslocalis
180:   #define matzerorowscolumnslocal_     matzerorowscolumnslocal
181:   #define matzerorowscolumnslocalis_   matzerorowscolumnslocalis
182:   #define matsetoptionsprefix_         matsetoptionsprefix
183:   #define matnullspaceremove_          matnullspaceremove
184:   #define matgetinfo_                  matgetinfo
185:   #define matlufactor_                 matlufactor
186:   #define matilufactor_                matilufactor
187:   #define matlufactorsymbolic_         matlufactorsymbolic
188:   #define matlufactornumeric_          matlufactornumeric
189:   #define matcholeskyfactor_           matcholeskyfactor
190:   #define matcholeskyfactorsymbolic_   matcholeskyfactorsymbolic
191:   #define matcholeskyfactornumeric_    matcholeskyfactornumeric
192:   #define matilufactorsymbolic_        matilufactorsymbolic
193:   #define maticcfactorsymbolic_        maticcfactorsymbolic
194:   #define maticcfactor_                maticcfactor
195:   #define matfactorinfoinitialize_     matfactorinfoinitialize
196:   #define matnullspacesetfunction_     matnullspacesetfunction
197:   #define matfindnonzerorows_          matfindnonzerorows
198:   #define matgetsize_                  matgetsize
199:   #define matgetsize00_                matgetsize00
200:   #define matgetsize10_                matgetsize10
201:   #define matgetsize01_                matgetsize01
202:   #define matgetlocalsize_             matgetlocalsize
203:   #define matgetlocalsize00_           matgetlocalsize00
204:   #define matgetlocalsize10_           matgetlocalsize10
205:   #define matgetlocalsize01_           matgetlocalsize01
206:   #define matgetvalues_                matgetvalues
207:   #define matgetvalues0_               matgetvalues0
208:   #define matgetvaluesnn1_             matgetvaluesnn1
209:   #define matgetvaluesnnnn_            matgetvaluesnnnn
210:   #define matgetvalues11_              matgetvalues11
211:   #define matgetvalues11a_             matgetvalues11a
212:   #define matgetvalues1n_              matgetvalues1n
213:   #define matgetvaluesn1_              matgetvaluesn1
214:   #define matgetvalueslocal_           matgetvalueslocal
215:   #define matgetvalueslocal0_          matgetvalueslocal0
216:   #define matgetvalueslocalnn1_        matgetvalueslocalnn1
217:   #define matgetvalueslocalnnnn_       matgetvalueslocalnnnn
218:   #define matgetvalueslocal11_         matgetvalueslocal11
219:   #define matgetvalueslocal1n_         matgetvalueslocal1n
220:   #define matgetvalueslocaln1_         matgetvalueslocaln1
221:   #define matsetnullspace_             matsetnullspace
222:   #define matgetownershiprange_        matgetownershiprange
223:   #define matgetownershiprange00_      matgetownershiprange00
224:   #define matgetownershiprange10_      matgetownershiprange10
225:   #define matgetownershiprange01_      matgetownershiprange01
226:   #define matgetownershiprange11_      matgetownershiprange11
227:   #define matgetownershipis_           matgetownershipis
228:   #define matgetownershiprangecolumn_  matgetownershiprangecolumn
229:   #define matviewfromoptions_          matviewfromoptions
230:   #define matdestroy_                  matdestroy
231:   #define matcreatefromoptions_        matcreatefromoptions
232: #endif

234: PETSC_EXTERN void matcreatefromoptions_(MPI_Fint *comm, char *prefix, PetscInt *bs, PetscInt *m, PetscInt *n, PetscInt *M, PetscInt *N, Mat *A, int *ierr, PETSC_FORTRAN_CHARLEN_T len)
235: {
236:   char *fprefix;
237:   FIXCHAR(prefix, len, fprefix);
238:   *ierr = MatCreateFromOptions(MPI_Comm_f2c(*(comm)), fprefix, *bs, *m, *n, *M, *N, A);
239:   if (*ierr) return;
240:   FREECHAR(prefix, fprefix);
241: }

243: PETSC_EXTERN void matgetvalues_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
244: {
245:   *ierr = MatGetValues(*mat, *m, idxm, *n, idxn, v);
246: }

248: PETSC_EXTERN void matgetvalues0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
249: {
250:   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
251: }

253: PETSC_EXTERN void matgetvaluesnn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
254: {
255:   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
256: }

258: PETSC_EXTERN void matgetvaluesnnnn_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
259: {
260:   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
261: }

263: PETSC_EXTERN void matgetvalues11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
264: {
265:   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
266: }

268: PETSC_EXTERN void matgetvalues11a_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
269: {
270:   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
271: }

273: PETSC_EXTERN void matgetvalues1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
274: {
275:   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
276: }

278: PETSC_EXTERN void matgetvaluesn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
279: {
280:   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
281: }

283: PETSC_EXTERN void matgetvalueslocal_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
284: {
285:   *ierr = MatGetValuesLocal(*mat, *m, idxm, *n, idxn, v);
286: }

288: PETSC_EXTERN void matgetvalueslocal0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
289: {
290:   matgetvalueslocal_(mat, m, idxm, n, idxn, v, ierr);
291: }

293: PETSC_EXTERN void matgetvalueslocalnn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
294: {
295:   matgetvalueslocal_(mat, m, idxm, n, idxn, v, ierr);
296: }

298: PETSC_EXTERN void matgetvalueslocalnnnn_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
299: {
300:   matgetvalueslocal_(mat, m, idxm, n, idxn, v, ierr);
301: }

303: PETSC_EXTERN void matgetvalueslocal11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
304: {
305:   matgetvalueslocal_(mat, m, idxm, n, idxn, v, ierr);
306: }

308: PETSC_EXTERN void matgetvalueslocal11a_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
309: {
310:   matgetvalueslocal_(mat, m, idxm, n, idxn, v, ierr);
311: }

313: PETSC_EXTERN void matgetvalueslocal1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
314: {
315:   matgetvalueslocal_(mat, m, idxm, n, idxn, v, ierr);
316: }

318: PETSC_EXTERN void matgetvalueslocaln1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
319: {
320:   matgetvalueslocal_(mat, m, idxm, n, idxn, v, ierr);
321: }

323: PETSC_EXTERN void matgetownershiprange_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
324: {
325:   CHKFORTRANNULLINTEGER(m);
326:   CHKFORTRANNULLINTEGER(n);
327:   *ierr = MatGetOwnershipRange(*mat, m, n);
328: }

330: PETSC_EXTERN void matgetownershiprange00_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
331: {
332:   CHKFORTRANNULLINTEGER(m);
333:   CHKFORTRANNULLINTEGER(n);
334:   *ierr = MatGetOwnershipRange(*mat, m, n);
335: }

337: PETSC_EXTERN void matgetownershiprange10_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
338: {
339:   CHKFORTRANNULLINTEGER(m);
340:   CHKFORTRANNULLINTEGER(n);
341:   *ierr = MatGetOwnershipRange(*mat, m, n);
342: }

344: PETSC_EXTERN void matgetownershiprange01_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
345: {
346:   CHKFORTRANNULLINTEGER(m);
347:   CHKFORTRANNULLINTEGER(n);
348:   *ierr = MatGetOwnershipRange(*mat, m, n);
349: }

351: PETSC_EXTERN void matgetownershiprange11_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
352: {
353:   CHKFORTRANNULLINTEGER(m);
354:   CHKFORTRANNULLINTEGER(n);
355:   *ierr = MatGetOwnershipRange(*mat, m, n);
356: }

358: PETSC_EXTERN void matgetownershipis_(Mat *mat, IS *m, IS *n, int *ierr)
359: {
360:   CHKFORTRANNULLOBJECT(m);
361:   CHKFORTRANNULLOBJECT(n);
362:   *ierr = MatGetOwnershipIS(*mat, m, n);
363: }

365: PETSC_EXTERN void matgetownershiprangecolumn_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
366: {
367:   CHKFORTRANNULLINTEGER(m);
368:   CHKFORTRANNULLINTEGER(n);
369:   *ierr = MatGetOwnershipRangeColumn(*mat, m, n);
370: }

372: PETSC_EXTERN void matgetsize_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
373: {
374:   CHKFORTRANNULLINTEGER(m);
375:   CHKFORTRANNULLINTEGER(n);
376:   *ierr = MatGetSize(*mat, m, n);
377: }

379: PETSC_EXTERN void matgetsize00_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
380: {
381:   matgetsize_(mat, m, n, ierr);
382: }

384: PETSC_EXTERN void matgetsize10_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
385: {
386:   matgetsize_(mat, m, n, ierr);
387: }

389: PETSC_EXTERN void matgetsize01_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
390: {
391:   matgetsize_(mat, m, n, ierr);
392: }

394: PETSC_EXTERN void matgetlocalsize_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
395: {
396:   CHKFORTRANNULLINTEGER(m);
397:   CHKFORTRANNULLINTEGER(n);
398:   *ierr = MatGetLocalSize(*mat, m, n);
399: }

401: PETSC_EXTERN void matgetlocalsize00_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
402: {
403:   matgetlocalsize_(mat, m, n, ierr);
404: }

406: PETSC_EXTERN void matgetlocalsize10_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
407: {
408:   matgetlocalsize_(mat, m, n, ierr);
409: }

411: PETSC_EXTERN void matgetlocalsize01_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
412: {
413:   matgetlocalsize_(mat, m, n, ierr);
414: }

416: PETSC_EXTERN void matsetvaluesblocked_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
417: {
418:   *ierr = MatSetValuesBlocked(*mat, *m, idxm, *n, idxn, v, *addv);
419: }

421: PETSC_EXTERN void matsetvaluesblocked2_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], F90Array2d *y, InsertMode *addv, int *ierr PETSC_F90_2PTR_PROTO(ptrd))
422: {
423:   PetscScalar *fa;
424:   *ierr = F90Array2dAccess(y, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
425:   if (*ierr) return;
426:   matsetvaluesblocked_(mat, m, idxm, n, idxn, fa, addv, ierr);
427: }

429: PETSC_EXTERN void matsetvaluesblocked0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
430: {
431:   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
432: }

434: PETSC_EXTERN void matsetvaluesblocked11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
435: {
436:   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
437: }

439: PETSC_EXTERN void matsetvaluesblocked111_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
440: {
441:   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
442: }

444: PETSC_EXTERN void matsetvaluesblocked1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
445: {
446:   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
447: }

449: PETSC_EXTERN void matsetvaluesblockedn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
450: {
451:   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
452: }

454: PETSC_EXTERN void matsetvaluesblockedlocal_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
455: {
456:   *ierr = MatSetValuesBlockedLocal(*mat, *nrow, irow, *ncol, icol, y, *addv);
457: }

459: PETSC_EXTERN void matsetvaluesblockedlocal0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
460: {
461:   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
462: }

464: PETSC_EXTERN void matsetvaluesblockedlocal11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
465: {
466:   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
467: }

469: PETSC_EXTERN void matsetvaluesblockedlocal111_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
470: {
471:   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
472: }

474: PETSC_EXTERN void matsetvaluesblockedlocal1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
475: {
476:   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
477: }

479: PETSC_EXTERN void matsetvaluesblockedlocaln1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
480: {
481:   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
482: }

484: PETSC_EXTERN void matsetvalues_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
485: {
486:   *ierr = MatSetValues(*mat, *m, idxm, *n, idxn, v, *addv);
487: }

489: PETSC_EXTERN void matsetvaluesnnnn_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
490: {
491:   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
492: }

494: PETSC_EXTERN void matsetvalues0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
495: {
496:   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
497: }

499: PETSC_EXTERN void matsetvaluesnn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
500: {
501:   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
502: }

504: PETSC_EXTERN void matsetvalues11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
505: {
506:   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
507: }

509: PETSC_EXTERN void matsetvaluesn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
510: {
511:   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
512: }

514: PETSC_EXTERN void matsetvalues1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
515: {
516:   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
517: }

519: PETSC_EXTERN void matsetvalueslocal_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
520: {
521:   *ierr = MatSetValuesLocal(*mat, *nrow, irow, *ncol, icol, y, *addv);
522: }

524: PETSC_EXTERN void matsetvalueslocal0_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
525: {
526:   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
527: }

529: PETSC_EXTERN void matsetvalueslocal11_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
530: {
531:   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
532: }

534: PETSC_EXTERN void matsetvalueslocal11nn_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
535: {
536:   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
537: }

539: PETSC_EXTERN void matsetvalueslocal111_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
540: {
541:   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
542: }

544: PETSC_EXTERN void matsetvalueslocal1n_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
545: {
546:   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
547: }

549: PETSC_EXTERN void matsetvalueslocaln1_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
550: {
551:   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
552: }

554: PETSC_EXTERN void matgetrowmin_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
555: {
556:   CHKFORTRANNULLINTEGER(idx);
557:   *ierr = MatGetRowMin(*mat, *v, idx);
558: }

560: PETSC_EXTERN void matgetrowminabs_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
561: {
562:   CHKFORTRANNULLINTEGER(idx);
563:   *ierr = MatGetRowMinAbs(*mat, *v, idx);
564: }

566: PETSC_EXTERN void matgetrowmax_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
567: {
568:   CHKFORTRANNULLINTEGER(idx);
569:   *ierr = MatGetRowMax(*mat, *v, idx);
570: }

572: PETSC_EXTERN void matgetrowmaxabs_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
573: {
574:   CHKFORTRANNULLINTEGER(idx);
575:   *ierr = MatGetRowMaxAbs(*mat, *v, idx);
576: }

578: static PetscErrorCode ournullfunction(MatNullSpace sp, Vec x, void *ctx)
579: {
580:   PetscCallFortranVoidFunction((*(void (*)(MatNullSpace *, Vec *, void *, PetscErrorCode *))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp, &x, ctx, &ierr));
581:   return PETSC_SUCCESS;
582: }

584: PETSC_EXTERN void matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace, Vec, void *), void *ctx, PetscErrorCode *ierr)
585: {
586:   PetscObjectAllocateFortranPointers(*sp, 1);
587:   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFn *)rem;

589:   *ierr = MatNullSpaceSetFunction(*sp, ournullfunction, ctx);
590: }

592: PETSC_EXTERN void matcreatevecs_(Mat *mat, Vec *right, Vec *left, int *ierr)
593: {
594:   CHKFORTRANNULLOBJECT(right);
595:   CHKFORTRANNULLOBJECT(left);
596:   *ierr = MatCreateVecs(*mat, right, left);
597: }

599: PETSC_EXTERN void matgetrowij_(Mat *B, PetscInt *shift, PetscBool *sym, PetscBool *blockcompressed, PetscInt *n, PetscInt *ia, size_t *iia, PetscInt *ja, size_t *jja, PetscBool *done, PetscErrorCode *ierr)
600: {
601:   const PetscInt *IA, *JA;
602:   *ierr = MatGetRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
603:   if (*ierr) return;
604:   *iia = PetscIntAddressToFortran(ia, (PetscInt *)IA);
605:   *jja = PetscIntAddressToFortran(ja, (PetscInt *)JA);
606: }

608: PETSC_EXTERN void matrestorerowij_(Mat *B, PetscInt *shift, PetscBool *sym, PetscBool *blockcompressed, PetscInt *n, PetscInt *ia, size_t *iia, PetscInt *ja, size_t *jja, PetscBool *done, PetscErrorCode *ierr)
609: {
610:   const PetscInt *IA = PetscIntAddressFromFortran(ia, *iia), *JA = PetscIntAddressFromFortran(ja, *jja);
611:   *ierr = MatRestoreRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
612: }

614: /*
615:    This is a poor way of storing the column and value pointers
616:   generated by MatGetRow() to be returned with MatRestoreRow()
617:   but there is not natural,good place else to store them. Hence
618:   Fortran programmers can only have one outstanding MatGetRows()
619:   at a time.
620: */
621: static int                matgetrowactive = 0;
622: static const PetscInt    *my_ocols        = NULL;
623: static const PetscScalar *my_ovals        = NULL;

625: PETSC_EXTERN void matgetrow_(Mat *mat, PetscInt *row, PetscInt *ncols, PetscInt *cols, PetscScalar *vals, PetscErrorCode *ierr)
626: {
627:   const PetscInt    **oocols = &my_ocols;
628:   const PetscScalar **oovals = &my_ovals;

630:   if (matgetrowactive) {
631:     *ierr = PetscError(PETSC_COMM_SELF, __LINE__, "MatGetRow_Fortran", __FILE__, PETSC_ERR_ARG_WRONGSTATE, PETSC_ERROR_INITIAL, "Cannot have two MatGetRow() active simultaneously\n\
632:                call MatRestoreRow() before calling MatGetRow() a second time");
633:     *ierr = PETSC_ERR_ARG_WRONGSTATE;
634:     return;
635:   }

637:   CHKFORTRANNULLINTEGER(cols);
638:   if (!cols) oocols = NULL;
639:   CHKFORTRANNULLSCALAR(vals);
640:   if (!vals) oovals = NULL;

642:   *ierr = MatGetRow(*mat, *row, ncols, oocols, oovals);
643:   if (*ierr) return;

645:   if (oocols) {
646:     *ierr = PetscArraycpy(cols, my_ocols, *ncols);
647:     if (*ierr) return;
648:   }
649:   if (oovals) {
650:     *ierr = PetscArraycpy(vals, my_ovals, *ncols);
651:     if (*ierr) return;
652:   }
653:   matgetrowactive = 1;
654: }

656: PETSC_EXTERN void matrestorerow_(Mat *mat, PetscInt *row, PetscInt *ncols, PetscInt *cols, PetscScalar *vals, PetscErrorCode *ierr)
657: {
658:   const PetscInt    **oocols = &my_ocols;
659:   const PetscScalar **oovals = &my_ovals;

661:   if (!matgetrowactive) {
662:     *ierr = PetscError(PETSC_COMM_SELF, __LINE__, "MatRestoreRow_Fortran", __FILE__, PETSC_ERR_ARG_WRONGSTATE, PETSC_ERROR_INITIAL, "Must call MatGetRow() first");
663:     *ierr = PETSC_ERR_ARG_WRONGSTATE;
664:     return;
665:   }
666:   CHKFORTRANNULLINTEGER(cols);
667:   if (!cols) oocols = NULL;
668:   CHKFORTRANNULLSCALAR(vals);
669:   if (!vals) oovals = NULL;

671:   *ierr           = MatRestoreRow(*mat, *row, ncols, oocols, oovals);
672:   matgetrowactive = 0;
673: }

675: PETSC_EXTERN void matview_(Mat *mat, PetscViewer *vin, PetscErrorCode *ierr)
676: {
677:   PetscViewer v;
678:   PetscPatchDefaultViewers_Fortran(vin, v);
679:   *ierr = MatView(*mat, v);
680: }

682: PETSC_EXTERN void matload_(Mat *mat, PetscViewer *vin, PetscErrorCode *ierr)
683: {
684:   PetscViewer v;
685:   PetscPatchDefaultViewers_Fortran(vin, v);
686:   *ierr = MatLoad(*mat, v);
687: }

689: PETSC_EXTERN void matseqaijgetarray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
690: {
691:   PetscScalar *mm;
692:   PetscInt     m, n;

694:   *ierr = MatSeqAIJGetArray(*mat, &mm);
695:   if (*ierr) return;
696:   *ierr = MatGetSize(*mat, &m, &n);
697:   if (*ierr) return;
698:   *ierr = PetscScalarAddressToFortran((PetscObject)*mat, 1, fa, mm, m * n, ia);
699:   if (*ierr) return;
700: }

702: PETSC_EXTERN void matseqaijrestorearray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
703: {
704:   PetscScalar *lx;
705:   PetscInt     m, n;

707:   *ierr = MatGetSize(*mat, &m, &n);
708:   if (*ierr) return;
709:   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat, fa, *ia, m * n, &lx);
710:   if (*ierr) return;
711:   *ierr = MatSeqAIJRestoreArray(*mat, &lx);
712:   if (*ierr) return;
713: }

715: PETSC_EXTERN void matdensegetarray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
716: {
717:   PetscScalar *mm;
718:   PetscInt     m, n;

720:   *ierr = MatDenseGetArray(*mat, &mm);
721:   if (*ierr) return;
722:   *ierr = MatGetSize(*mat, &m, &n);
723:   if (*ierr) return;
724:   *ierr = PetscScalarAddressToFortran((PetscObject)*mat, 1, fa, mm, m * n, ia);
725:   if (*ierr) return;
726: }

728: PETSC_EXTERN void matdenserestorearray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
729: {
730:   PetscScalar *lx;
731:   PetscInt     m, n;

733:   *ierr = MatGetSize(*mat, &m, &n);
734:   if (*ierr) return;
735:   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat, fa, *ia, m * n, &lx);
736:   if (*ierr) return;
737:   *ierr = MatDenseRestoreArray(*mat, &lx);
738:   if (*ierr) return;
739: }

741: PETSC_EXTERN void matdensegetarrayread_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
742: {
743:   const PetscScalar *mm;
744:   PetscInt           m, n;

746:   *ierr = MatDenseGetArrayRead(*mat, &mm);
747:   if (*ierr) return;
748:   *ierr = MatGetSize(*mat, &m, &n);
749:   if (*ierr) return;
750:   *ierr = PetscScalarAddressToFortran((PetscObject)*mat, 1, fa, (PetscScalar *)mm, m * n, ia);
751:   if (*ierr) return;
752: }

754: PETSC_EXTERN void matdenserestorearrayread_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
755: {
756:   const PetscScalar *lx;
757:   PetscInt           m, n;

759:   *ierr = MatGetSize(*mat, &m, &n);
760:   if (*ierr) return;
761:   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat, fa, *ia, m * n, (PetscScalar **)&lx);
762:   if (*ierr) return;
763:   *ierr = MatDenseRestoreArrayRead(*mat, &lx);
764:   if (*ierr) return;
765: }

767: PETSC_EXTERN void matfactorgetsolverpackage_(Mat *mat, char *name, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
768: {
769:   const char *tname;

771:   *ierr = MatFactorGetSolverType(*mat, &tname);
772:   if (*ierr) return;
773:   if (name != PETSC_NULL_CHARACTER_Fortran) {
774:     *ierr = PetscStrncpy(name, tname, len);
775:     if (*ierr) return;
776:   }
777:   FIXRETURNCHAR(PETSC_TRUE, name, len);
778: }

780: PETSC_EXTERN void matgetfactor_(Mat *mat, char *outtype, MatFactorType *ftype, Mat *M, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
781: {
782:   char *t;
783:   FIXCHAR(outtype, len, t);
784:   *ierr = MatGetFactor(*mat, t, *ftype, M);
785:   if (*ierr) return;
786:   FREECHAR(outtype, t);
787: }

789: PETSC_EXTERN void matconvert_(Mat *mat, char *outtype, MatReuse *reuse, Mat *M, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
790: {
791:   char *t;
792:   FIXCHAR(outtype, len, t);
793:   *ierr = MatConvert(*mat, t, *reuse, M);
794:   if (*ierr) return;
795:   FREECHAR(outtype, t);
796: }

798: /*
799:     MatCreateSubmatrices() is slightly different from C since the
800:     Fortran provides the array to hold the submatrix objects,while in C that
801:     array is allocated by the MatCreateSubmatrices()
802: */
803: PETSC_EXTERN void matcreatesubmatrices_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, Mat *smat, PetscErrorCode *ierr)
804: {
805:   Mat     *lsmat;
806:   PetscInt i;

808:   if (*scall == MAT_INITIAL_MATRIX) {
809:     *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &lsmat);
810:     for (i = 0; i <= *n; i++) { /* lsmat[*n] might be a dummy matrix for saving data structure */
811:       smat[i] = lsmat[i];
812:     }
813:     *ierr = PetscFree(lsmat);
814:   } else {
815:     *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &smat);
816:   }
817: }

819: /*
820:     MatCreateSubmatrices() is slightly different from C since the
821:     Fortran provides the array to hold the submatrix objects,while in C that
822:     array is allocated by the MatCreateSubmatrices()
823: */
824: PETSC_EXTERN void matcreatesubmatricesmpi_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, Mat *smat, PetscErrorCode *ierr)
825: {
826:   Mat     *lsmat;
827:   PetscInt i;

829:   if (*scall == MAT_INITIAL_MATRIX) {
830:     *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &lsmat);
831:     for (i = 0; i <= *n; i++) { /* lsmat[*n] might be a dummy matrix for saving data structure */
832:       smat[i] = lsmat[i];
833:     }
834:     *ierr = PetscFree(lsmat);
835:   } else {
836:     *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &smat);
837:   }
838: }

840: /*
841:     MatDestroyMatrices() is slightly different from C since the
842:     Fortran does not free the array of matrix objects, while in C that
843:     the array is freed
844: */
845: PETSC_EXTERN void matdestroymatrices_(PetscInt *n, Mat *smat, PetscErrorCode *ierr)
846: {
847:   PetscInt i;

849:   for (i = 0; i < *n; i++) {
850:     PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(&smat[i]);
851:     *ierr = MatDestroy(&smat[i]);
852:     if (*ierr) return;
853:     PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(&smat[i]);
854:   }
855: }

857: /*
858:     MatDestroySubMatrices() is slightly different from C since the
859:     Fortran provides the array to hold the submatrix objects, while in C that
860:     array is allocated by the MatCreateSubmatrices()
861: */
862: PETSC_EXTERN void matdestroysubmatrices_(PetscInt *n, Mat *smat, PetscErrorCode *ierr)
863: {
864:   Mat     *lsmat;
865:   PetscInt i;

867:   *ierr = PetscMalloc1(*n + 1, &lsmat);
868:   for (i = 0; i <= *n; i++) {
869:     PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(&smat[i]);
870:     lsmat[i] = smat[i];
871:   }
872:   *ierr = MatDestroySubMatrices(*n, &lsmat);
873:   for (i = 0; i <= *n; i++) { PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(&smat[i]); }
874: }

876: PETSC_EXTERN void matdestroy_(Mat *x, int *ierr)
877: {
878:   PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(x);
879:   *ierr = MatDestroy(x);
880:   if (*ierr) return;
881:   PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(x);
882: }

884: PETSC_EXTERN void matsetoptionsprefix_(Mat *mat, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
885: {
886:   char *t;

888:   FIXCHAR(prefix, len, t);
889:   *ierr = MatSetOptionsPrefix(*mat, t);
890:   if (*ierr) return;
891:   FREECHAR(prefix, t);
892: }

894: PETSC_EXTERN void matnullspaceremove_(MatNullSpace *sp, Vec *vec, PetscErrorCode *ierr)
895: {
896:   CHKFORTRANNULLOBJECT(*sp);
897:   *ierr = MatNullSpaceRemove(*sp, *vec);
898: }

900: PETSC_EXTERN void matgetinfo_(Mat *mat, MatInfoType *flag, MatInfo *info, int *ierr)
901: {
902:   *ierr = MatGetInfo(*mat, *flag, info);
903: }

905: PETSC_EXTERN void matlufactor_(Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
906: {
907:   CHKFORTRANNULLOBJECT(row);
908:   CHKFORTRANNULLOBJECT(col);
909:   *ierr = MatLUFactor(*mat, row ? *row : NULL, col ? *col : NULL, info);
910: }

912: PETSC_EXTERN void matilufactor_(Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
913: {
914:   CHKFORTRANNULLOBJECT(row);
915:   CHKFORTRANNULLOBJECT(col);
916:   *ierr = MatILUFactor(*mat, row ? *row : NULL, col ? *col : NULL, info);
917: }

919: PETSC_EXTERN void matlufactorsymbolic_(Mat *fact, Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
920: {
921:   CHKFORTRANNULLOBJECT(row);
922:   CHKFORTRANNULLOBJECT(col);
923:   *ierr = MatLUFactorSymbolic(*fact, *mat, row ? *row : NULL, col ? *col : NULL, info);
924: }

926: PETSC_EXTERN void matlufactornumeric_(Mat *fact, Mat *mat, const MatFactorInfo *info, int *ierr)
927: {
928:   *ierr = MatLUFactorNumeric(*fact, *mat, info);
929: }

931: PETSC_EXTERN void matcholeskyfactor_(Mat *mat, IS *perm, const MatFactorInfo *info, int *ierr)
932: {
933:   CHKFORTRANNULLOBJECT(perm);
934:   *ierr = MatCholeskyFactor(*mat, perm ? *perm : NULL, info);
935: }

937: PETSC_EXTERN void matcholeskyfactorsymbolic_(Mat *fact, Mat *mat, IS *perm, const MatFactorInfo *info, int *ierr)
938: {
939:   CHKFORTRANNULLOBJECT(perm);
940:   *ierr = MatCholeskyFactorSymbolic(*fact, *mat, perm ? *perm : NULL, info);
941: }

943: PETSC_EXTERN void matcholeskyfactornumeric_(Mat *fact, Mat *mat, const MatFactorInfo *info, int *ierr)
944: {
945:   *ierr = MatCholeskyFactorNumeric(*fact, *mat, info);
946: }

948: PETSC_EXTERN void matilufactorsymbolic_(Mat *fact, Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
949: {
950:   CHKFORTRANNULLOBJECT(row);
951:   CHKFORTRANNULLOBJECT(col);
952:   *ierr = MatILUFactorSymbolic(*fact, *mat, row ? *row : NULL, col ? *col : NULL, info);
953: }

955: PETSC_EXTERN void maticcfactorsymbolic_(Mat *fact, Mat *mat, IS *perm, const MatFactorInfo *info, int *ierr)
956: {
957:   CHKFORTRANNULLOBJECT(perm);
958:   *ierr = MatICCFactorSymbolic(*fact, *mat, perm ? *perm : NULL, info);
959: }

961: PETSC_EXTERN void maticcfactor_(Mat *mat, IS *perm, const MatFactorInfo *info, int *ierr)
962: {
963:   CHKFORTRANNULLOBJECT(perm);
964:   *ierr = MatICCFactor(*mat, perm ? *perm : NULL, info);
965: }

967: PETSC_EXTERN void matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
968: {
969:   *ierr = MatFactorInfoInitialize(info);
970: }
971: PETSC_EXTERN void matzerorowslocal_(Mat *mat, PetscInt *numRows, PetscInt rows[], PetscScalar *diag, Vec *x, Vec *b, int *ierr)
972: {
973:   *ierr = MatZeroRowsLocal(*mat, *numRows, rows, *diag, *x, *b);
974: }
975: PETSC_EXTERN void matzerorowslocal0_(Mat *mat, PetscInt *numRows, PetscInt rows[], PetscScalar *diag, Vec *x, Vec *b, int *ierr)
976: {
977:   matzerorowslocal_(mat, numRows, rows, diag, x, b, ierr);
978: }
979: PETSC_EXTERN void matzerorowslocal1_(Mat *mat, PetscInt *numRows, PetscInt rows[], PetscScalar *diag, Vec *x, Vec *b, int *ierr)
980: {
981:   matzerorowslocal_(mat, numRows, rows, diag, x, b, ierr);
982: }
983: PETSC_EXTERN void matviewfromoptions_(Mat *ao, PetscObject obj, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
984: {
985:   char *t;

987:   FIXCHAR(type, len, t);
988:   CHKFORTRANNULLOBJECT(obj);
989:   *ierr = MatViewFromOptions(*ao, obj, t);
990:   if (*ierr) return;
991:   FREECHAR(type, t);
992: }