xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision e6e75211d226c622f451867f53ce5d558649ff4f)
1 #include <petsc/private/fortranimpl.h>
2 #include <petscmat.h>
3 #include <petscviewer.h>
4 
5 #if defined(PETSC_HAVE_FORTRAN_CAPS)
6 #define matgetrowmin_                    MATGETROWMIN
7 #define matgetrowminabs_                 MATGETROWMINABS
8 #define matgetrowmax_                    MATGETROWMAX
9 #define matgetrowmaxabs_                 MATGETROWMAXABS
10 #define matdestroymatrices_              MATDESTROYMATRICES
11 #define matgetfactor_                    MATGETFACTOR
12 #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
13 #define matgetrowij_                     MATGETROWIJ
14 #define matrestorerowij_                 MATRESTOREROWIJ
15 #define matgetrow_                       MATGETROW
16 #define matrestorerow_                   MATRESTOREROW
17 #define matload_                         MATLOAD
18 #define matview_                         MATVIEW
19 #define matseqaijgetarray_               MATSEQAIJGETARRAY
20 #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
21 #define matdensegetarray_                MATDENSEGETARRAY
22 #define matdenserestorearray_            MATDENSERESTOREARRAY
23 #define matconvert_                      MATCONVERT
24 #define matgetsubmatrices_               MATGETSUBMATRICES
25 #define matzerorowscolumns_              MATZEROROWSCOLUMNS
26 #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
27 #define matzerorowsstencil_              MATZEROROWSSTENCIL
28 #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
29 #define matzerorows_                     MATZEROROWS
30 #define matzerorowsis_                   MATZEROROWSIS
31 #define matzerorowslocal_                MATZEROROWSLOCAL
32 #define matzerorowslocalis_              MATZEROROWSLOCALIS
33 #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
34 #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
35 #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
36 #define matcreatevecs_                   MATCREATEVECS
37 #define matnullspaceremove_              MATNULLSPACEREMOVE
38 #define matgetinfo_                      MATGETINFO
39 #define matlufactor_                     MATLUFACTOR
40 #define matilufactor_                    MATILUFACTOR
41 #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
42 #define matlufactornumeric_              MATLUFACTORNUMERIC
43 #define matcholeskyfactor_               MATCHOLESKYFACTOR
44 #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
45 #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
46 #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
47 #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
48 #define maticcfactor_                    MATICCFACTOR
49 #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
50 #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
51 #define matfindnonzerorows_              MATFINDNONZEROROWS
52 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
53 #define matgetrowmin_                    matgetrowmin
54 #define matgetrowminabs_                 matgetrowminabs
55 #define matgetrowmax_                    matgetrowmax
56 #define matgetrowmaxabs_                 matgetrowmaxabs
57 #define matdestroymatrices_              matdestroymatrices
58 #define matgetfactor_                    matgetfactor
59 #define matfactorgetsolverpackage_       matfactorgetsolverpackage
60 #define matcreatevecs_                   matcreatevecs
61 #define matgetrowij_                     matgetrowij
62 #define matrestorerowij_                 matrestorerowij
63 #define matgetrow_                       matgetrow
64 #define matrestorerow_                   matrestorerow
65 #define matview_                         matview
66 #define matload_                         matload
67 #define matseqaijgetarray_               matseqaijgetarray
68 #define matseqaijrestorearray_           matseqaijrestorearray
69 #define matdensegetarray_                matdensegetarray
70 #define matdenserestorearray_            matdenserestorearray
71 #define matconvert_                      matconvert
72 #define matgetsubmatrices_               matgetsubmatrices
73 #define matzerorowscolumns_              matzerorowscolumns
74 #define matzerorowscolumnsis_            matzerorowscolumnsis
75 #define matzerorowsstencil_              matzerorowsstencil
76 #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
77 #define matzerorows_                     matzerorows
78 #define matzerorowsis_                   matzerorowsis
79 #define matzerorowslocal_                matzerorowslocal
80 #define matzerorowslocalis_              matzerorowslocalis
81 #define matzerorowscolumnslocal_         matzerorowscolumnslocal
82 #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
83 #define matsetoptionsprefix_             matsetoptionsprefix
84 #define matnullspaceremove_              matnullspaceremove
85 #define matgetinfo_                      matgetinfo
86 #define matlufactor_                     matlufactor
87 #define matilufactor_                    matilufactor
88 #define matlufactorsymbolic_             matlufactorsymbolic
89 #define matlufactornumeric_              matlufactornumeric
90 #define matcholeskyfactor_               matcholeskyfactor
91 #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
92 #define matcholeskyfactornumeric_        matcholeskyfactornumeric
93 #define matilufactorsymbolic_            matilufactorsymbolic
94 #define maticcfactorsymbolic_            maticcfactorsymbolic
95 #define maticcfactor_                    maticcfactor
96 #define matfactorinfoinitialize_         matfactorinfoinitialize
97 #define matnullspacesetfunction_         matnullspacesetfunction
98 #define matfindnonzerorows_              matfindnonzerorows
99 #endif
100 
101 PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
102 {
103   CHKFORTRANNULLINTEGER(idx);
104   *ierr = MatGetRowMin(*mat,*v,idx);
105 }
106 PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
107 {
108   CHKFORTRANNULLINTEGER(idx);
109   *ierr = MatGetRowMinAbs(*mat,*v,idx);
110 }
111 
112 PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
113 {
114   CHKFORTRANNULLINTEGER(idx);
115   *ierr = MatGetRowMax(*mat,*v,idx);
116 }
117 
118 PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
119 {
120   CHKFORTRANNULLINTEGER(idx);
121   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
122 }
123 
124 static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
125 {
126   PetscErrorCode ierr = 0;
127   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
128   return 0;
129 }
130 
131 PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
132 {
133   PetscObjectAllocateFortranPointers(*sp,1);
134   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
135 
136   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
137 }
138 
139 PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
140 {
141   CHKFORTRANNULLOBJECT(right);
142   CHKFORTRANNULLOBJECT(left);
143   *ierr = MatCreateVecs(*mat,right,left);
144 }
145 
146 PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
147                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
148 {
149   const PetscInt *IA,*JA;
150   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
151   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
152   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
153 }
154 
155 PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
156                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
157 {
158   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
159   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
160 }
161 
162 /*
163    This is a poor way of storing the column and value pointers
164   generated by MatGetRow() to be returned with MatRestoreRow()
165   but there is not natural,good place else to store them. Hence
166   Fortran programmers can only have one outstanding MatGetRows()
167   at a time.
168 */
169 static PetscErrorCode    matgetrowactive = 0;
170 static const PetscInt    *my_ocols       = 0;
171 static const PetscScalar *my_ovals       = 0;
172 
173 PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
174 {
175   const PetscInt    **oocols = &my_ocols;
176   const PetscScalar **oovals = &my_ovals;
177 
178   if (matgetrowactive) {
179     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
180                "Cannot have two MatGetRow() active simultaneously\n\
181                call MatRestoreRow() before calling MatGetRow() a second time");
182     *ierr = 1;
183     return;
184   }
185 
186   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
187   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
188 
189   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
190   if (*ierr) return;
191 
192   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
193   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
194   matgetrowactive = 1;
195 }
196 
197 PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
198 {
199   const PetscInt    **oocols = &my_ocols;
200   const PetscScalar **oovals = &my_ovals;
201   if (!matgetrowactive) {
202     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
203                "Must call MatGetRow() first");
204     *ierr = 1;
205     return;
206   }
207   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
208   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
209 
210   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
211   matgetrowactive = 0;
212 }
213 
214 PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
215 {
216   PetscViewer v;
217   PetscPatchDefaultViewers_Fortran(vin,v);
218   *ierr = MatView(*mat,v);
219 }
220 
221 PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
222 {
223   PetscViewer v;
224   PetscPatchDefaultViewers_Fortran(vin,v);
225   *ierr = MatLoad(*mat,v);
226 }
227 
228 PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
229 {
230   PetscScalar *mm;
231   PetscInt    m,n;
232 
233   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
234   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
235   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
236 }
237 
238 PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
239 {
240   PetscScalar *lx;
241   PetscInt    m,n;
242 
243   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
244   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
245   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
246 }
247 
248 PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
249 {
250   PetscScalar *mm;
251   PetscInt    m,n;
252 
253   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
254   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
255   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
256 }
257 
258 PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
259 {
260   PetscScalar *lx;
261   PetscInt    m,n;
262 
263   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
264   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
265   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
266 }
267 
268 PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
269 {
270   const char *tname;
271 
272   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
273   if (name != PETSC_NULL_CHARACTER_Fortran) {
274     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
275   }
276   FIXRETURNCHAR(PETSC_TRUE,name,len);
277 }
278 
279 PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
280 {
281   char *t;
282   FIXCHAR(outtype,len,t);
283   *ierr = MatGetFactor(*mat,t,*ftype,M);
284   FREECHAR(outtype,t);
285 }
286 
287 PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
288 {
289   char *t;
290   FIXCHAR(outtype,len,t);
291   *ierr = MatConvert(*mat,t,*reuse,M);
292   FREECHAR(outtype,t);
293 }
294 
295 /*
296     MatGetSubmatrices() is slightly different from C since the
297     Fortran provides the array to hold the submatrix objects,while in C that
298     array is allocated by the MatGetSubmatrices()
299 */
300 PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
301 {
302   Mat      *lsmat;
303   PetscInt i;
304 
305   if (*scall == MAT_INITIAL_MATRIX) {
306     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
307     for (i=0; i<*n; i++) {
308       smat[i] = lsmat[i];
309     }
310     *ierr = PetscFree(lsmat);
311   } else {
312     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
313   }
314 }
315 
316 /*
317     MatDestroyMatrices() is slightly different from C since the
318     Fortran provides the array to hold the submatrix objects,while in C that
319     array is allocated by the MatGetSubmatrices()
320 */
321 PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
322 {
323   PetscInt i;
324 
325   for (i=0; i<*n; i++) {
326     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
327   }
328 }
329 
330 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
331 {
332   CHKFORTRANNULLOBJECTDEREFERENCE(x);
333   CHKFORTRANNULLOBJECTDEREFERENCE(b);
334   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
335 }
336 
337 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
338 {
339   CHKFORTRANNULLOBJECTDEREFERENCE(x);
340   CHKFORTRANNULLOBJECTDEREFERENCE(b);
341   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
342 }
343 
344 PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
345 {
346   CHKFORTRANNULLOBJECTDEREFERENCE(x);
347   CHKFORTRANNULLOBJECTDEREFERENCE(b);
348   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
349 }
350 
351 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
352 {
353   CHKFORTRANNULLOBJECTDEREFERENCE(x);
354   CHKFORTRANNULLOBJECTDEREFERENCE(b);
355   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
356 }
357 
358 PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
359 {
360   CHKFORTRANNULLOBJECTDEREFERENCE(x);
361   CHKFORTRANNULLOBJECTDEREFERENCE(b);
362   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
363 }
364 
365 PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
366 {
367   CHKFORTRANNULLOBJECTDEREFERENCE(x);
368   CHKFORTRANNULLOBJECTDEREFERENCE(b);
369   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
370 }
371 
372 PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
373 {
374   CHKFORTRANNULLOBJECTDEREFERENCE(x);
375   CHKFORTRANNULLOBJECTDEREFERENCE(b);
376   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
377 }
378 
379 PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
380 {
381   CHKFORTRANNULLOBJECTDEREFERENCE(x);
382   CHKFORTRANNULLOBJECTDEREFERENCE(b);
383   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
384 }
385 
386 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
387 {
388   CHKFORTRANNULLOBJECTDEREFERENCE(x);
389   CHKFORTRANNULLOBJECTDEREFERENCE(b);
390   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
391 }
392 
393 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
394 {
395   CHKFORTRANNULLOBJECTDEREFERENCE(x);
396   CHKFORTRANNULLOBJECTDEREFERENCE(b);
397   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
398 }
399 
400 PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
401 {
402   char *t;
403 
404   FIXCHAR(prefix,len,t);
405   *ierr = MatSetOptionsPrefix(*mat,t);
406   FREECHAR(prefix,t);
407 }
408 
409 PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
410 {
411   *ierr = MatNullSpaceRemove(*sp,*vec);
412 }
413 
414 PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr)
415 {
416   *__ierr = MatGetInfo(*mat,*flag,info);
417 }
418 
419 PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col, const MatFactorInfo *info, int *__ierr)
420 {
421   *__ierr = MatLUFactor(*mat,*row,*col,info);
422 }
423 
424 PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col, const MatFactorInfo *info, int *__ierr)
425 {
426   *__ierr = MatILUFactor(*mat,*row,*col,info);
427 }
428 
429 PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, const MatFactorInfo *info, int *__ierr)
430 {
431   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
432 }
433 
434 PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat, const MatFactorInfo *info, int *__ierr)
435 {
436   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
437 }
438 
439 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm, const MatFactorInfo *info, int *__ierr)
440 {
441   *__ierr = MatCholeskyFactor(*mat,*perm,info);
442 }
443 
444 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, const MatFactorInfo *info, int *__ierr)
445 {
446   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
447 }
448 
449 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat, const MatFactorInfo *info, int *__ierr)
450 {
451   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
452 }
453 
454 PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, const MatFactorInfo *info, int *__ierr)
455 {
456   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
457 }
458 
459 PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, const MatFactorInfo *info, int *__ierr)
460 {
461   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
462 }
463 
464 PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row, const MatFactorInfo *info, int *__ierr)
465 {
466   *__ierr = MatICCFactor(*mat,*row,info);
467 }
468 
469 PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr)
470 {
471   *__ierr = MatFactorInfoInitialize(info);
472 }
473