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