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