xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 66af8762ec03dbef0e079729eb2a1734a35ed7ff)
1 #include <petsc/private/fortranimpl.h>
2 #include <petsc/private/f90impl.h>
3 #include <petscmat.h>
4 #include <petscviewer.h>
5 
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 matgetvalues1n_              MATGETVALUES1n
13   #define matgetvaluesn1_              MATGETVALUESn1
14   #define matsetvalues_                MATSETVALUES
15   #define matsetvaluesnnnn_            MATSETVALUESNNNN
16   #define matsetvalues0_               MATSETVALUES0
17   #define matsetvaluesnn1_             MATSETVALUESNN1
18   #define matsetvalues11_              MATSETVALUES11
19   #define matsetvalues1n_              MATSETVALUES1N
20   #define matsetvaluesn1_              MATSETVALUESN1
21   #define matsetvaluesblocked0_        MATSETVALUESBLOCKED0
22   #define matsetvaluesblocked2_        MATSETVALUESBLOCKED2
23   #define matsetvaluesblocked11_       MATSETVALUESBLOCKED11
24   #define matsetvaluesblocked111_      MATSETVALUESBLOCKED111
25   #define matsetvaluesblocked1n_       MATSETVALUESBLOCKED1N
26   #define matsetvaluesblockedn1_       MATSETVALUESBLOCKEDN1
27   #define matsetvaluesblockedlocal_    MATSETVALUESBLOCKEDLOCAL
28   #define matsetvaluesblockedlocal0_   MATSETVALUESBLOCKEDLOCAL0
29   #define matsetvaluesblockedlocal11_  MATSETVALUESBLOCKEDLOCAL11
30   #define matsetvaluesblockedlocal111_ MATSETVALUESBLOCKEDLOCAL111
31   #define matsetvaluesblockedlocal1n_  MATSETVALUESBLOCKEDLOCAL1N
32   #define matsetvaluesblockedlocaln1_  MATSETVALUESBLOCKEDLOCALN1
33   #define matsetvalueslocal_           MATSETVALUESLOCAL
34   #define matsetvalueslocal0_          MATSETVALUESLOCAL0
35   #define matsetvalueslocal11_         MATSETVALUESLOCAL11
36   #define matsetvalueslocal11nn_       MATSETVALUESLOCAL11NN
37   #define matsetvalueslocal111_        MATSETVALUESLOCAL111
38   #define matsetvalueslocal1n_         MATSETVALUESLOCAL1N
39   #define matsetvalueslocaln1_         MATSETVALUESLOCALN1
40   #define matgetrowmin_                MATGETROWMIN
41   #define matgetrowminabs_             MATGETROWMINABS
42   #define matgetrowmax_                MATGETROWMAX
43   #define matgetrowmaxabs_             MATGETROWMAXABS
44   #define matdestroymatrices_          MATDESTROYMATRICES
45   #define matdestroysubmatrices_       MATDESTROYSUBMATRICES
46   #define matgetfactor_                MATGETFACTOR
47   #define matfactorgetsolverpackage_   MATFACTORGETSOLVERPACKAGE
48   #define matgetrowij_                 MATGETROWIJ
49   #define matrestorerowij_             MATRESTOREROWIJ
50   #define matgetrow_                   MATGETROW
51   #define matrestorerow_               MATRESTOREROW
52   #define matload_                     MATLOAD
53   #define matview_                     MATVIEW
54   #define matseqaijgetarray_           MATSEQAIJGETARRAY
55   #define matseqaijrestorearray_       MATSEQAIJRESTOREARRAY
56   #define matdensegetarray_            MATDENSEGETARRAY
57   #define matdensegetarrayread_        MATDENSEGETARRAYREAD
58   #define matdenserestorearray_        MATDENSERESTOREARRAY
59   #define matdenserestorearrayread_    MATDENSERESTOREARRAYREAD
60   #define matconvert_                  MATCONVERT
61   #define matcreatesubmatrices_        MATCREATESUBMATRICES
62   #define matcreatesubmatricesmpi_     MATCREATESUBMATRICESMPI
63   #define matzerorowscolumns_          MATZEROROWSCOLUMNS
64   #define matzerorowscolumnsis_        MATZEROROWSCOLUMNSIS
65   #define matzerorowsstencil_          MATZEROROWSSTENCIL
66   #define matzerorowscolumnsstencil_   MATZEROROWSCOLUMNSSTENCIL
67   #define matzerorows_                 MATZEROROWS
68   #define matzerorowsis_               MATZEROROWSIS
69   #define matzerorowslocal_            MATZEROROWSLOCAL
70   #define matzerorowslocal0_           MATZEROROWSLOCAL0
71   #define matzerorowslocal1_           MATZEROROWSLOCAL1
72   #define matzerorowslocalis_          MATZEROROWSLOCALIS
73   #define matzerorowscolumnslocal_     MATZEROROWSCOLUMNSLOCAL
74   #define matzerorowscolumnslocalis_   MATZEROROWSCOLUMNSLOCALIS
75   #define matsetoptionsprefix_         MATSETOPTIONSPREFIX
76   #define matcreatevecs_               MATCREATEVECS
77   #define matnullspaceremove_          MATNULLSPACEREMOVE
78   #define matgetinfo_                  MATGETINFO
79   #define matlufactor_                 MATLUFACTOR
80   #define matilufactor_                MATILUFACTOR
81   #define matlufactorsymbolic_         MATLUFACTORSYMBOLIC
82   #define matlufactornumeric_          MATLUFACTORNUMERIC
83   #define matcholeskyfactor_           MATCHOLESKYFACTOR
84   #define matcholeskyfactorsymbolic_   MATCHOLESKYFACTORSYMBOLIC
85   #define matcholeskyfactornumeric_    MATCHOLESKYFACTORNUMERIC
86   #define matilufactorsymbolic_        MATILUFACTORSYMBOLIC
87   #define maticcfactorsymbolic_        MATICCFACTORSYMBOLIC
88   #define maticcfactor_                MATICCFACTOR
89   #define matfactorinfoinitialize_     MATFACTORINFOINITIALIZE
90   #define matnullspacesetfunction_     MATNULLSPACESETFUNCTION
91   #define matfindnonzerorows_          MATFINDNONZEROROWS
92   #define matgetsize_                  MATGETSIZE
93   #define matgetsize00_                MATGETSIZE00
94   #define matgetsize10_                MATGETSIZE10
95   #define matgetsize01_                MATGETSIZE01
96   #define matgetlocalsize_             MATGETLOCALSIZE
97   #define matgetlocalsize00_           MATGETLOCALSIZE00
98   #define matgetlocalsize10_           MATGETLOCALSIZE10
99   #define matgetlocalsize01_           MATGETLOCALSIZE01
100   #define matsetnullspace_             MATSETNULLSPACE
101   #define matgetownershiprange_        MATGETOWNERSHIPRANGE
102   #define matgetownershiprange00_      MATGETOWNERSHIPRANGE00
103   #define matgetownershiprange10_      MATGETOWNERSHIPRANGE10
104   #define matgetownershiprange01_      MATGETOWNERSHIPRANGE01
105   #define matgetownershiprange11_      MATGETOWNERSHIPRANGE11
106   #define matgetownershipis_           MATGETOWNERSHIPIS
107   #define matgetownershiprangecolumn_  MATGETOWNERSHIPRANGECOLUMN
108   #define matviewfromoptions_          MATVIEWFROMOPTIONS
109   #define matdestroy_                  MATDESTROY
110   #define matcreatefromoptions_        MATCREATEFROMOPTIONS
111 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
112   #define matsetvalues_                matsetvalues
113   #define matsetvaluesnnnn_            matsetvaluesnnnn
114   #define matsetvalues0_               matsetvalues0
115   #define matsetvaluesnn1_             matsetvaluesnn1
116   #define matsetvalues11_              matsetvalues11
117   #define matsetvaluesn1_              matsetvaluesn1
118   #define matsetvalues1n_              matsetvalues1n
119   #define matsetvalueslocal_           matsetvalueslocal
120   #define matsetvalueslocal0_          matsetvalueslocal0
121   #define matsetvalueslocal11_         matsetvalueslocal11
122   #define matsetvalueslocal11nn_       matsetvalueslocal11nn
123   #define matsetvalueslocal111_        matsetvalueslocal111
124   #define matsetvalueslocal1n_         matsetvalueslocal1n
125   #define matsetvalueslocaln1_         matsetvalueslocaln1
126   #define matsetvaluesblocked_         matsetvaluesblocked
127   #define matsetvaluesblocked0_        matsetvaluesblocked0
128   #define matsetvaluesblocked2_        matsetvaluesblocked2
129   #define matsetvaluesblocked11_       matsetvaluesblocked11
130   #define matsetvaluesblocked111_      matsetvaluesblocked111
131   #define matsetvaluesblocked1n_       matsetvaluesblocked1n
132   #define matsetvaluesblockedn1_       matsetvaluesblockedn1
133   #define matsetvaluesblockedlocal_    matsetvaluesblockedlocal
134   #define matsetvaluesblockedlocal0_   matsetvaluesblockedlocal0
135   #define matsetvaluesblockedlocal11_  matsetvaluesblockedlocal11
136   #define matsetvaluesblockedlocal111_ matsetvaluesblockedlocal111
137   #define matsetvaluesblockedlocal1n_  matsetvaluesblockedlocal1n
138   #define matsetvaluesblockedlocaln1_  matsetvaluesblockedlocaln1
139   #define matgetrowmin_                matgetrowmin
140   #define matgetrowminabs_             matgetrowminabs
141   #define matgetrowmax_                matgetrowmax
142   #define matgetrowmaxabs_             matgetrowmaxabs
143   #define matdestroymatrices_          matdestroymatrices
144   #define matdestroysubmatrices_       matdestroysubmatrices
145   #define matgetfactor_                matgetfactor
146   #define matfactorgetsolverpackage_   matfactorgetsolverpackage
147   #define matcreatevecs_               matcreatevecs
148   #define matgetrowij_                 matgetrowij
149   #define matrestorerowij_             matrestorerowij
150   #define matgetrow_                   matgetrow
151   #define matrestorerow_               matrestorerow
152   #define matview_                     matview
153   #define matload_                     matload
154   #define matseqaijgetarray_           matseqaijgetarray
155   #define matseqaijrestorearray_       matseqaijrestorearray
156   #define matdensegetarray_            matdensegetarray
157   #define matdensegetarrayread_        matdensegetarrayread
158   #define matdenserestorearray_        matdenserestorearray
159   #define matdenserestorearrayread_    matdenserestorearrayread
160   #define matconvert_                  matconvert
161   #define matcreatesubmatrices_        matcreatesubmatrices
162   #define matcreatesubmatricesmpi_     matcreatesubmatricesmpi
163   #define matzerorowscolumns_          matzerorowscolumns
164   #define matzerorowscolumnsis_        matzerorowscolumnsis
165   #define matzerorowsstencil_          matzerorowsstencil
166   #define matzerorowscolumnsstencil_   matzerorowscolumnsstencil
167   #define matzerorows_                 matzerorows
168   #define matzerorowsis_               matzerorowsis
169   #define matzerorowslocal_            matzerorowslocal
170   #define matzerorowslocalis_          matzerorowslocalis
171   #define matzerorowscolumnslocal_     matzerorowscolumnslocal
172   #define matzerorowscolumnslocalis_   matzerorowscolumnslocalis
173   #define matsetoptionsprefix_         matsetoptionsprefix
174   #define matnullspaceremove_          matnullspaceremove
175   #define matgetinfo_                  matgetinfo
176   #define matlufactor_                 matlufactor
177   #define matilufactor_                matilufactor
178   #define matlufactorsymbolic_         matlufactorsymbolic
179   #define matlufactornumeric_          matlufactornumeric
180   #define matcholeskyfactor_           matcholeskyfactor
181   #define matcholeskyfactorsymbolic_   matcholeskyfactorsymbolic
182   #define matcholeskyfactornumeric_    matcholeskyfactornumeric
183   #define matilufactorsymbolic_        matilufactorsymbolic
184   #define maticcfactorsymbolic_        maticcfactorsymbolic
185   #define maticcfactor_                maticcfactor
186   #define matfactorinfoinitialize_     matfactorinfoinitialize
187   #define matnullspacesetfunction_     matnullspacesetfunction
188   #define matfindnonzerorows_          matfindnonzerorows
189   #define matgetsize_                  matgetsize
190   #define matgetsize00_                matgetsize00
191   #define matgetsize10_                matgetsize10
192   #define matgetsize01_                matgetsize01
193   #define matgetlocalsize_             matgetlocalsize
194   #define matgetlocalsize00_           matgetlocalsize00
195   #define matgetlocalsize10_           matgetlocalsize10
196   #define matgetlocalsize01_           matgetlocalsize01
197   #define matgetvalues_                matgetvalues
198   #define matgetvalues0_               matgetvalues0
199   #define matgetvaluesnn1_             matgetvaluesnn1
200   #define matgetvaluesnnnn_            matgetvaluesnnnn
201   #define matgetvalues11_              matgetvalues11
202   #define matgetvalues1n_              matgetvalues1n
203   #define matgetvaluesn1_              matgetvaluesn1
204   #define matsetnullspace_             matsetnullspace
205   #define matgetownershiprange_        matgetownershiprange
206   #define matgetownershiprange00_      matgetownershiprange00
207   #define matgetownershiprange10_      matgetownershiprange10
208   #define matgetownershiprange01_      matgetownershiprange01
209   #define matgetownershiprange11_      matgetownershiprange11
210   #define matgetownershipis_           matgetownershipis
211   #define matgetownershiprangecolumn_  matgetownershiprangecolumn
212   #define matviewfromoptions_          matviewfromoptions
213   #define matdestroy_                  matdestroy
214   #define matcreatefromoptions_        matcreatefromoptions
215 #endif
216 
217 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)
218 {
219   char *fprefix;
220   FIXCHAR(prefix, len, fprefix);
221   *ierr = MatCreateFromOptions(MPI_Comm_f2c(*(comm)), fprefix, *bs, *m, *n, *M, *N, A);
222   if (*ierr) return;
223   FREECHAR(prefix, fprefix);
224 }
225 
226 PETSC_EXTERN void matgetvalues_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
227 {
228   *ierr = MatGetValues(*mat, *m, idxm, *n, idxn, v);
229 }
230 
231 PETSC_EXTERN void matgetvalues0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
232 {
233   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
234 }
235 
236 PETSC_EXTERN void matgetvaluesnn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
237 {
238   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
239 }
240 
241 PETSC_EXTERN void matgetvaluesnnnn_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
242 {
243   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
244 }
245 
246 PETSC_EXTERN void matgetvalues11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
247 {
248   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
249 }
250 
251 PETSC_EXTERN void matgetvalues1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
252 {
253   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
254 }
255 
256 PETSC_EXTERN void matgetvaluesn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], int *ierr)
257 {
258   matgetvalues_(mat, m, idxm, n, idxn, v, ierr);
259 }
260 
261 PETSC_EXTERN void matgetownershiprange_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
262 {
263   CHKFORTRANNULLINTEGER(m);
264   CHKFORTRANNULLINTEGER(n);
265   *ierr = MatGetOwnershipRange(*mat, m, n);
266 }
267 
268 PETSC_EXTERN void matgetownershiprange00_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
269 {
270   CHKFORTRANNULLINTEGER(m);
271   CHKFORTRANNULLINTEGER(n);
272   *ierr = MatGetOwnershipRange(*mat, m, n);
273 }
274 
275 PETSC_EXTERN void matgetownershiprange10_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
276 {
277   CHKFORTRANNULLINTEGER(m);
278   CHKFORTRANNULLINTEGER(n);
279   *ierr = MatGetOwnershipRange(*mat, m, n);
280 }
281 
282 PETSC_EXTERN void matgetownershiprange01_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
283 {
284   CHKFORTRANNULLINTEGER(m);
285   CHKFORTRANNULLINTEGER(n);
286   *ierr = MatGetOwnershipRange(*mat, m, n);
287 }
288 
289 PETSC_EXTERN void matgetownershiprange11_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
290 {
291   CHKFORTRANNULLINTEGER(m);
292   CHKFORTRANNULLINTEGER(n);
293   *ierr = MatGetOwnershipRange(*mat, m, n);
294 }
295 
296 PETSC_EXTERN void matgetownershipis_(Mat *mat, IS *m, IS *n, int *ierr)
297 {
298   CHKFORTRANNULLOBJECT(m);
299   CHKFORTRANNULLOBJECT(n);
300   *ierr = MatGetOwnershipIS(*mat, m, n);
301 }
302 
303 PETSC_EXTERN void matgetownershiprangecolumn_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
304 {
305   CHKFORTRANNULLINTEGER(m);
306   CHKFORTRANNULLINTEGER(n);
307   *ierr = MatGetOwnershipRangeColumn(*mat, m, n);
308 }
309 
310 PETSC_EXTERN void matgetsize_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
311 {
312   CHKFORTRANNULLINTEGER(m);
313   CHKFORTRANNULLINTEGER(n);
314   *ierr = MatGetSize(*mat, m, n);
315 }
316 
317 PETSC_EXTERN void matgetsize00_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
318 {
319   matgetsize_(mat, m, n, ierr);
320 }
321 
322 PETSC_EXTERN void matgetsize10_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
323 {
324   matgetsize_(mat, m, n, ierr);
325 }
326 
327 PETSC_EXTERN void matgetsize01_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
328 {
329   matgetsize_(mat, m, n, ierr);
330 }
331 
332 PETSC_EXTERN void matgetlocalsize_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
333 {
334   CHKFORTRANNULLINTEGER(m);
335   CHKFORTRANNULLINTEGER(n);
336   *ierr = MatGetLocalSize(*mat, m, n);
337 }
338 
339 PETSC_EXTERN void matgetlocalsize00_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
340 {
341   matgetlocalsize_(mat, m, n, ierr);
342 }
343 
344 PETSC_EXTERN void matgetlocalsize10_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
345 {
346   matgetlocalsize_(mat, m, n, ierr);
347 }
348 
349 PETSC_EXTERN void matgetlocalsize01_(Mat *mat, PetscInt *m, PetscInt *n, int *ierr)
350 {
351   matgetlocalsize_(mat, m, n, ierr);
352 }
353 
354 PETSC_EXTERN void matsetvaluesblocked_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
355 {
356   *ierr = MatSetValuesBlocked(*mat, *m, idxm, *n, idxn, v, *addv);
357 }
358 
359 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))
360 {
361   PetscScalar *fa;
362   *ierr = F90Array2dAccess(y, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd));
363   if (*ierr) return;
364   matsetvaluesblocked_(mat, m, idxm, n, idxn, fa, addv, ierr);
365 }
366 
367 PETSC_EXTERN void matsetvaluesblocked0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
368 {
369   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
370 }
371 
372 PETSC_EXTERN void matsetvaluesblocked11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
373 {
374   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
375 }
376 
377 PETSC_EXTERN void matsetvaluesblocked111_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
378 {
379   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
380 }
381 
382 PETSC_EXTERN void matsetvaluesblocked1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
383 {
384   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
385 }
386 
387 PETSC_EXTERN void matsetvaluesblockedn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
388 {
389   matsetvaluesblocked_(mat, m, idxm, n, idxn, v, addv, ierr);
390 }
391 
392 PETSC_EXTERN void matsetvaluesblockedlocal_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
393 {
394   *ierr = MatSetValuesBlockedLocal(*mat, *nrow, irow, *ncol, icol, y, *addv);
395 }
396 
397 PETSC_EXTERN void matsetvaluesblockedlocal0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
398 {
399   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
400 }
401 
402 PETSC_EXTERN void matsetvaluesblockedlocal11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
403 {
404   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
405 }
406 
407 PETSC_EXTERN void matsetvaluesblockedlocal111_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
408 {
409   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
410 }
411 
412 PETSC_EXTERN void matsetvaluesblockedlocal1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
413 {
414   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
415 }
416 
417 PETSC_EXTERN void matsetvaluesblockedlocaln1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
418 {
419   matsetvaluesblockedlocal_(mat, m, idxm, n, idxn, v, addv, ierr);
420 }
421 
422 PETSC_EXTERN void matsetvalues_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
423 {
424   *ierr = MatSetValues(*mat, *m, idxm, *n, idxn, v, *addv);
425 }
426 
427 PETSC_EXTERN void matsetvaluesnnnn_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
428 {
429   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
430 }
431 
432 PETSC_EXTERN void matsetvalues0_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
433 {
434   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
435 }
436 
437 PETSC_EXTERN void matsetvaluesnn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
438 {
439   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
440 }
441 
442 PETSC_EXTERN void matsetvalues11_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
443 {
444   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
445 }
446 
447 PETSC_EXTERN void matsetvaluesn1_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
448 {
449   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
450 }
451 
452 PETSC_EXTERN void matsetvalues1n_(Mat *mat, PetscInt *m, PetscInt idxm[], PetscInt *n, PetscInt idxn[], PetscScalar v[], InsertMode *addv, int *ierr)
453 {
454   matsetvalues_(mat, m, idxm, n, idxn, v, addv, ierr);
455 }
456 
457 PETSC_EXTERN void matsetvalueslocal_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
458 {
459   *ierr = MatSetValuesLocal(*mat, *nrow, irow, *ncol, icol, y, *addv);
460 }
461 
462 PETSC_EXTERN void matsetvalueslocal0_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
463 {
464   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
465 }
466 
467 PETSC_EXTERN void matsetvalueslocal11_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
468 {
469   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
470 }
471 
472 PETSC_EXTERN void matsetvalueslocal11nn_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
473 {
474   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
475 }
476 
477 PETSC_EXTERN void matsetvalueslocal111_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
478 {
479   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
480 }
481 
482 PETSC_EXTERN void matsetvalueslocal1n_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
483 {
484   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
485 }
486 
487 PETSC_EXTERN void matsetvalueslocaln1_(Mat *mat, PetscInt *nrow, PetscInt irow[], PetscInt *ncol, PetscInt icol[], PetscScalar y[], InsertMode *addv, int *ierr)
488 {
489   matsetvalueslocal_(mat, nrow, irow, ncol, icol, y, addv, ierr);
490 }
491 
492 PETSC_EXTERN void matgetrowmin_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
493 {
494   CHKFORTRANNULLINTEGER(idx);
495   *ierr = MatGetRowMin(*mat, *v, idx);
496 }
497 
498 PETSC_EXTERN void matgetrowminabs_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
499 {
500   CHKFORTRANNULLINTEGER(idx);
501   *ierr = MatGetRowMinAbs(*mat, *v, idx);
502 }
503 
504 PETSC_EXTERN void matgetrowmax_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
505 {
506   CHKFORTRANNULLINTEGER(idx);
507   *ierr = MatGetRowMax(*mat, *v, idx);
508 }
509 
510 PETSC_EXTERN void matgetrowmaxabs_(Mat *mat, Vec *v, PetscInt idx[], int *ierr)
511 {
512   CHKFORTRANNULLINTEGER(idx);
513   *ierr = MatGetRowMaxAbs(*mat, *v, idx);
514 }
515 
516 static PetscErrorCode ournullfunction(MatNullSpace sp, Vec x, void *ctx)
517 {
518   PetscCallFortranVoidFunction((*(void (*)(MatNullSpace *, Vec *, void *, PetscErrorCode *))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp, &x, ctx, &ierr));
519   return PETSC_SUCCESS;
520 }
521 
522 PETSC_EXTERN void matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace, Vec, void *), void *ctx, PetscErrorCode *ierr)
523 {
524   PetscObjectAllocateFortranPointers(*sp, 1);
525   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
526 
527   *ierr = MatNullSpaceSetFunction(*sp, ournullfunction, ctx);
528 }
529 
530 PETSC_EXTERN void matcreatevecs_(Mat *mat, Vec *right, Vec *left, int *ierr)
531 {
532   CHKFORTRANNULLOBJECT(right);
533   CHKFORTRANNULLOBJECT(left);
534   *ierr = MatCreateVecs(*mat, right, left);
535 }
536 
537 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)
538 {
539   const PetscInt *IA, *JA;
540   *ierr = MatGetRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
541   if (*ierr) return;
542   *iia = PetscIntAddressToFortran(ia, (PetscInt *)IA);
543   *jja = PetscIntAddressToFortran(ja, (PetscInt *)JA);
544 }
545 
546 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)
547 {
548   const PetscInt *IA = PetscIntAddressFromFortran(ia, *iia), *JA = PetscIntAddressFromFortran(ja, *jja);
549   *ierr = MatRestoreRowIJ(*B, *shift, *sym, *blockcompressed, n, &IA, &JA, done);
550 }
551 
552 /*
553    This is a poor way of storing the column and value pointers
554   generated by MatGetRow() to be returned with MatRestoreRow()
555   but there is not natural,good place else to store them. Hence
556   Fortran programmers can only have one outstanding MatGetRows()
557   at a time.
558 */
559 static int                matgetrowactive = 0;
560 static const PetscInt    *my_ocols        = 0;
561 static const PetscScalar *my_ovals        = 0;
562 
563 PETSC_EXTERN void matgetrow_(Mat *mat, PetscInt *row, PetscInt *ncols, PetscInt *cols, PetscScalar *vals, PetscErrorCode *ierr)
564 {
565   const PetscInt    **oocols = &my_ocols;
566   const PetscScalar **oovals = &my_ovals;
567 
568   if (matgetrowactive) {
569     *ierr = PetscError(PETSC_COMM_SELF, __LINE__, "MatGetRow_Fortran", __FILE__, PETSC_ERR_ARG_WRONGSTATE, PETSC_ERROR_INITIAL, "Cannot have two MatGetRow() active simultaneously\n\
570                call MatRestoreRow() before calling MatGetRow() a second time");
571     *ierr = PETSC_ERR_ARG_WRONGSTATE;
572     return;
573   }
574 
575   CHKFORTRANNULLINTEGER(cols);
576   if (!cols) oocols = NULL;
577   CHKFORTRANNULLSCALAR(vals);
578   if (!vals) oovals = NULL;
579 
580   *ierr = MatGetRow(*mat, *row, ncols, oocols, oovals);
581   if (*ierr) return;
582 
583   if (oocols) {
584     *ierr = PetscArraycpy(cols, my_ocols, *ncols);
585     if (*ierr) return;
586   }
587   if (oovals) {
588     *ierr = PetscArraycpy(vals, my_ovals, *ncols);
589     if (*ierr) return;
590   }
591   matgetrowactive = 1;
592 }
593 
594 PETSC_EXTERN void matrestorerow_(Mat *mat, PetscInt *row, PetscInt *ncols, PetscInt *cols, PetscScalar *vals, PetscErrorCode *ierr)
595 {
596   const PetscInt    **oocols = &my_ocols;
597   const PetscScalar **oovals = &my_ovals;
598 
599   if (!matgetrowactive) {
600     *ierr = PetscError(PETSC_COMM_SELF, __LINE__, "MatRestoreRow_Fortran", __FILE__, PETSC_ERR_ARG_WRONGSTATE, PETSC_ERROR_INITIAL, "Must call MatGetRow() first");
601     *ierr = PETSC_ERR_ARG_WRONGSTATE;
602     return;
603   }
604   CHKFORTRANNULLINTEGER(cols);
605   if (!cols) oocols = NULL;
606   CHKFORTRANNULLSCALAR(vals);
607   if (!vals) oovals = NULL;
608 
609   *ierr           = MatRestoreRow(*mat, *row, ncols, oocols, oovals);
610   matgetrowactive = 0;
611 }
612 
613 PETSC_EXTERN void matview_(Mat *mat, PetscViewer *vin, PetscErrorCode *ierr)
614 {
615   PetscViewer v;
616   PetscPatchDefaultViewers_Fortran(vin, v);
617   *ierr = MatView(*mat, v);
618 }
619 
620 PETSC_EXTERN void matload_(Mat *mat, PetscViewer *vin, PetscErrorCode *ierr)
621 {
622   PetscViewer v;
623   PetscPatchDefaultViewers_Fortran(vin, v);
624   *ierr = MatLoad(*mat, v);
625 }
626 
627 PETSC_EXTERN void matseqaijgetarray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
628 {
629   PetscScalar *mm;
630   PetscInt     m, n;
631 
632   *ierr = MatSeqAIJGetArray(*mat, &mm);
633   if (*ierr) return;
634   *ierr = MatGetSize(*mat, &m, &n);
635   if (*ierr) return;
636   *ierr = PetscScalarAddressToFortran((PetscObject)*mat, 1, fa, mm, m * n, ia);
637   if (*ierr) return;
638 }
639 
640 PETSC_EXTERN void matseqaijrestorearray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
641 {
642   PetscScalar *lx;
643   PetscInt     m, n;
644 
645   *ierr = MatGetSize(*mat, &m, &n);
646   if (*ierr) return;
647   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat, fa, *ia, m * n, &lx);
648   if (*ierr) return;
649   *ierr = MatSeqAIJRestoreArray(*mat, &lx);
650   if (*ierr) return;
651 }
652 
653 PETSC_EXTERN void matdensegetarray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
654 {
655   PetscScalar *mm;
656   PetscInt     m, n;
657 
658   *ierr = MatDenseGetArray(*mat, &mm);
659   if (*ierr) return;
660   *ierr = MatGetSize(*mat, &m, &n);
661   if (*ierr) return;
662   *ierr = PetscScalarAddressToFortran((PetscObject)*mat, 1, fa, mm, m * n, ia);
663   if (*ierr) return;
664 }
665 
666 PETSC_EXTERN void matdenserestorearray_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
667 {
668   PetscScalar *lx;
669   PetscInt     m, n;
670 
671   *ierr = MatGetSize(*mat, &m, &n);
672   if (*ierr) return;
673   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat, fa, *ia, m * n, &lx);
674   if (*ierr) return;
675   *ierr = MatDenseRestoreArray(*mat, &lx);
676   if (*ierr) return;
677 }
678 
679 PETSC_EXTERN void matdensegetarrayread_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
680 {
681   const PetscScalar *mm;
682   PetscInt           m, n;
683 
684   *ierr = MatDenseGetArrayRead(*mat, &mm);
685   if (*ierr) return;
686   *ierr = MatGetSize(*mat, &m, &n);
687   if (*ierr) return;
688   *ierr = PetscScalarAddressToFortran((PetscObject)*mat, 1, fa, (PetscScalar *)mm, m * n, ia);
689   if (*ierr) return;
690 }
691 
692 PETSC_EXTERN void matdenserestorearrayread_(Mat *mat, PetscScalar *fa, size_t *ia, PetscErrorCode *ierr)
693 {
694   const PetscScalar *lx;
695   PetscInt           m, n;
696 
697   *ierr = MatGetSize(*mat, &m, &n);
698   if (*ierr) return;
699   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat, fa, *ia, m * n, (PetscScalar **)&lx);
700   if (*ierr) return;
701   *ierr = MatDenseRestoreArrayRead(*mat, &lx);
702   if (*ierr) return;
703 }
704 
705 PETSC_EXTERN void matfactorgetsolverpackage_(Mat *mat, char *name, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
706 {
707   const char *tname;
708 
709   *ierr = MatFactorGetSolverType(*mat, &tname);
710   if (*ierr) return;
711   if (name != PETSC_NULL_CHARACTER_Fortran) {
712     *ierr = PetscStrncpy(name, tname, len);
713     if (*ierr) return;
714   }
715   FIXRETURNCHAR(PETSC_TRUE, name, len);
716 }
717 
718 PETSC_EXTERN void matgetfactor_(Mat *mat, char *outtype, MatFactorType *ftype, Mat *M, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
719 {
720   char *t;
721   FIXCHAR(outtype, len, t);
722   *ierr = MatGetFactor(*mat, t, *ftype, M);
723   if (*ierr) return;
724   FREECHAR(outtype, t);
725 }
726 
727 PETSC_EXTERN void matconvert_(Mat *mat, char *outtype, MatReuse *reuse, Mat *M, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
728 {
729   char *t;
730   FIXCHAR(outtype, len, t);
731   *ierr = MatConvert(*mat, t, *reuse, M);
732   if (*ierr) return;
733   FREECHAR(outtype, t);
734 }
735 
736 /*
737     MatCreateSubmatrices() is slightly different from C since the
738     Fortran provides the array to hold the submatrix objects,while in C that
739     array is allocated by the MatCreateSubmatrices()
740 */
741 PETSC_EXTERN void matcreatesubmatrices_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, Mat *smat, PetscErrorCode *ierr)
742 {
743   Mat     *lsmat;
744   PetscInt i;
745 
746   if (*scall == MAT_INITIAL_MATRIX) {
747     *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &lsmat);
748     for (i = 0; i <= *n; i++) { /* lsmat[*n] might be a dummy matrix for saving data structure */
749       smat[i] = lsmat[i];
750     }
751     *ierr = PetscFree(lsmat);
752   } else {
753     *ierr = MatCreateSubMatrices(*mat, *n, isrow, iscol, *scall, &smat);
754   }
755 }
756 
757 /*
758     MatCreateSubmatrices() is slightly different from C since the
759     Fortran provides the array to hold the submatrix objects,while in C that
760     array is allocated by the MatCreateSubmatrices()
761 */
762 PETSC_EXTERN void matcreatesubmatricesmpi_(Mat *mat, PetscInt *n, IS *isrow, IS *iscol, MatReuse *scall, Mat *smat, PetscErrorCode *ierr)
763 {
764   Mat     *lsmat;
765   PetscInt i;
766 
767   if (*scall == MAT_INITIAL_MATRIX) {
768     *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &lsmat);
769     for (i = 0; i <= *n; i++) { /* lsmat[*n] might be a dummy matrix for saving data structure */
770       smat[i] = lsmat[i];
771     }
772     *ierr = PetscFree(lsmat);
773   } else {
774     *ierr = MatCreateSubMatricesMPI(*mat, *n, isrow, iscol, *scall, &smat);
775   }
776 }
777 
778 /*
779     MatDestroyMatrices() is slightly different from C since the
780     Fortran does not free the array of matrix objects, while in C that
781     the array is freed
782 */
783 PETSC_EXTERN void matdestroymatrices_(PetscInt *n, Mat *smat, PetscErrorCode *ierr)
784 {
785   PetscInt i;
786 
787   for (i = 0; i < *n; i++) {
788     PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(&smat[i]);
789     *ierr = MatDestroy(&smat[i]);
790     if (*ierr) return;
791     PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(&smat[i]);
792   }
793 }
794 
795 /*
796     MatDestroySubMatrices() is slightly different from C since the
797     Fortran provides the array to hold the submatrix objects, while in C that
798     array is allocated by the MatCreateSubmatrices()
799 */
800 PETSC_EXTERN void matdestroysubmatrices_(PetscInt *n, Mat *smat, PetscErrorCode *ierr)
801 {
802   Mat     *lsmat;
803   PetscInt i;
804 
805   *ierr = PetscMalloc1(*n + 1, &lsmat);
806   for (i = 0; i <= *n; i++) {
807     PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(&smat[i]);
808     lsmat[i] = smat[i];
809   }
810   *ierr = MatDestroySubMatrices(*n, &lsmat);
811   for (i = 0; i <= *n; i++) { PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(&smat[i]); }
812 }
813 
814 PETSC_EXTERN void matdestroy_(Mat *x, int *ierr)
815 {
816   PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(x);
817   *ierr = MatDestroy(x);
818   if (*ierr) return;
819   PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(x);
820 }
821 
822 PETSC_EXTERN void matsetoptionsprefix_(Mat *mat, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
823 {
824   char *t;
825 
826   FIXCHAR(prefix, len, t);
827   *ierr = MatSetOptionsPrefix(*mat, t);
828   if (*ierr) return;
829   FREECHAR(prefix, t);
830 }
831 
832 PETSC_EXTERN void matnullspaceremove_(MatNullSpace *sp, Vec *vec, PetscErrorCode *ierr)
833 {
834   CHKFORTRANNULLOBJECT(*sp);
835   *ierr = MatNullSpaceRemove(*sp, *vec);
836 }
837 
838 PETSC_EXTERN void matgetinfo_(Mat *mat, MatInfoType *flag, MatInfo *info, int *ierr)
839 {
840   *ierr = MatGetInfo(*mat, *flag, info);
841 }
842 
843 PETSC_EXTERN void matlufactor_(Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
844 {
845   *ierr = MatLUFactor(*mat, *row, *col, info);
846 }
847 
848 PETSC_EXTERN void matilufactor_(Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
849 {
850   *ierr = MatILUFactor(*mat, *row, *col, info);
851 }
852 
853 PETSC_EXTERN void matlufactorsymbolic_(Mat *fact, Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
854 {
855   *ierr = MatLUFactorSymbolic(*fact, *mat, *row, *col, info);
856 }
857 
858 PETSC_EXTERN void matlufactornumeric_(Mat *fact, Mat *mat, const MatFactorInfo *info, int *ierr)
859 {
860   *ierr = MatLUFactorNumeric(*fact, *mat, info);
861 }
862 
863 PETSC_EXTERN void matcholeskyfactor_(Mat *mat, IS *perm, const MatFactorInfo *info, int *ierr)
864 {
865   *ierr = MatCholeskyFactor(*mat, *perm, info);
866 }
867 
868 PETSC_EXTERN void matcholeskyfactorsymbolic_(Mat *fact, Mat *mat, IS *perm, const MatFactorInfo *info, int *ierr)
869 {
870   *ierr = MatCholeskyFactorSymbolic(*fact, *mat, *perm, info);
871 }
872 
873 PETSC_EXTERN void matcholeskyfactornumeric_(Mat *fact, Mat *mat, const MatFactorInfo *info, int *ierr)
874 {
875   *ierr = MatCholeskyFactorNumeric(*fact, *mat, info);
876 }
877 
878 PETSC_EXTERN void matilufactorsymbolic_(Mat *fact, Mat *mat, IS *row, IS *col, const MatFactorInfo *info, int *ierr)
879 {
880   *ierr = MatILUFactorSymbolic(*fact, *mat, *row, *col, info);
881 }
882 
883 PETSC_EXTERN void maticcfactorsymbolic_(Mat *fact, Mat *mat, IS *perm, const MatFactorInfo *info, int *ierr)
884 {
885   *ierr = MatICCFactorSymbolic(*fact, *mat, *perm, info);
886 }
887 
888 PETSC_EXTERN void maticcfactor_(Mat *mat, IS *row, const MatFactorInfo *info, int *ierr)
889 {
890   *ierr = MatICCFactor(*mat, *row, info);
891 }
892 
893 PETSC_EXTERN void matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
894 {
895   *ierr = MatFactorInfoInitialize(info);
896 }
897 PETSC_EXTERN void matzerorowslocal_(Mat *mat, PetscInt *numRows, PetscInt rows[], PetscScalar *diag, Vec *x, Vec *b, int *ierr)
898 {
899   *ierr = MatZeroRowsLocal(*mat, *numRows, rows, *diag, *x, *b);
900 }
901 PETSC_EXTERN void matzerorowslocal0_(Mat *mat, PetscInt *numRows, PetscInt rows[], PetscScalar *diag, Vec *x, Vec *b, int *ierr)
902 {
903   matzerorowslocal_(mat, numRows, rows, diag, x, b, ierr);
904 }
905 PETSC_EXTERN void matzerorowslocal1_(Mat *mat, PetscInt *numRows, PetscInt rows[], PetscScalar *diag, Vec *x, Vec *b, int *ierr)
906 {
907   matzerorowslocal_(mat, numRows, rows, diag, x, b, ierr);
908 }
909 PETSC_EXTERN void matviewfromoptions_(Mat *ao, PetscObject obj, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
910 {
911   char *t;
912 
913   FIXCHAR(type, len, t);
914   CHKFORTRANNULLOBJECT(obj);
915   *ierr = MatViewFromOptions(*ao, obj, t);
916   if (*ierr) return;
917   FREECHAR(type, t);
918 }
919