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