xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 6bf464f92cc51e6fd6163850774a6badb2f63b6b)
1c6db04a5SJed Brown #include <private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscmat.h>
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
52c9f667aSSatish Balay #define matdestroy_                      MATDESTROY
67d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
75dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
835bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
9f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
10f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
11f4e70085SSatish Balay #define matgetrow_                       MATGETROW
12f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
13f7e310deSShri Abhyankar #define matload_                         MATLOAD
14f4e70085SSatish Balay #define matview_                         MATVIEW
15f4e70085SSatish Balay #define matgetarray_                     MATGETARRAY
16f4e70085SSatish Balay #define matrestorearray_                 MATRESTOREARRAY
17f4e70085SSatish Balay #define matconvert_                      MATCONVERT
18f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
19f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
20f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
21f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
22f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
231eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
247c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
255ba43861SSatish Balay #define matnullspaceremove_              MATNULLSPACEREMOV
265ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
2722688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
2822688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
2922688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
3022688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
3122688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
3222688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
3322688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
3422688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
3522688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
3622688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
3722688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
38b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
39f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
402c9f667aSSatish Balay #define matdestroy_                      matdestroy
417d6bfa3bSBarry Smith #define matdestroymatrices_              matdestroymatrices_
425dffd610SBarry Smith #define matgetfactor_                    matgetfactor
4335bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
447c54600cSBarry Smith #define matgetvecs_                      matgetvecs
45f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
46f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
47f4e70085SSatish Balay #define matgetrow_                       matgetrow
48f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
49f4e70085SSatish Balay #define matview_                         matview
50f7e310deSShri Abhyankar #define matload_                         matload
51f4e70085SSatish Balay #define matgetarray_                     matgetarray
52f4e70085SSatish Balay #define matrestorearray_                 matrestorearray
53f4e70085SSatish Balay #define matconvert_                      matconvert
54f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
55f4e70085SSatish Balay #define matzerorows_                     matzerorows
56f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
57f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
58f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
591eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
60812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
615ba43861SSatish Balay #define matgetinfo_                      matgetinfo
6222688b47SSatish Balay #define matlufactor_                     matlufactor
6322688b47SSatish Balay #define matilufactor_                    matilufactor
6422688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
6522688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
6622688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
6722688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
6822688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
6922688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
7022688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
7122688b47SSatish Balay #define maticcfactor_                    maticcfactor
7222688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
73b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
74f4e70085SSatish Balay #endif
75f4e70085SSatish Balay 
76f4e70085SSatish Balay EXTERN_C_BEGIN
77f4e70085SSatish Balay 
782c9f667aSSatish Balay void PETSC_STDCALL  matdestroy_(Mat *A, int *__ierr )
792c9f667aSSatish Balay {
80*6bf464f9SBarry Smith   *__ierr = MatDestroy(A);
812c9f667aSSatish Balay }
822c9f667aSSatish Balay 
83b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
84b22b330cSBarry Smith {
85b22b330cSBarry Smith   PetscErrorCode ierr = 0;
86b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
87b22b330cSBarry Smith   return 0;
88b22b330cSBarry Smith }
89b22b330cSBarry Smith 
90b22b330cSBarry Smith void PETSC_STDCALL  matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
91b22b330cSBarry Smith {
92b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
93b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
94b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
95b22b330cSBarry Smith }
96b22b330cSBarry Smith 
977c54600cSBarry Smith void PETSC_STDCALL   matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr )
987c54600cSBarry Smith {
997c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
1007c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
1017c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
1027c54600cSBarry Smith }
1037c54600cSBarry Smith 
104ace3abfcSBarry Smith void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
105ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
106f4e70085SSatish Balay {
107f4e70085SSatish Balay   PetscInt *IA,*JA;
1088f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
109f4e70085SSatish Balay   *iia  = PetscIntAddressToFortran(ia,IA);
110f4e70085SSatish Balay   *jja  = PetscIntAddressToFortran(ja,JA);
111f4e70085SSatish Balay }
112f4e70085SSatish Balay 
113ace3abfcSBarry Smith void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
114ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
115f4e70085SSatish Balay {
116f4e70085SSatish Balay   PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
1178f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
118f4e70085SSatish Balay }
119f4e70085SSatish Balay 
120f4e70085SSatish Balay /*
121f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
122f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
123f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
124f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
125f4e70085SSatish Balay   at a time.
126f4e70085SSatish Balay */
127f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
128f4e70085SSatish Balay static const PetscInt    *my_ocols = 0;
129f4e70085SSatish Balay static const PetscScalar *my_ovals = 0;
130f4e70085SSatish Balay 
131f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
132f4e70085SSatish Balay {
133f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
134f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
135f4e70085SSatish Balay 
136f4e70085SSatish Balay   if (matgetrowactive) {
137d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
138f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
139f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
140f4e70085SSatish Balay      *ierr = 1;
141f4e70085SSatish Balay      return;
142f4e70085SSatish Balay   }
143f4e70085SSatish Balay 
144f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
145f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
146f4e70085SSatish Balay 
147f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
148f4e70085SSatish Balay   if (*ierr) return;
149f4e70085SSatish Balay 
150f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
151f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return; }
152f4e70085SSatish Balay   matgetrowactive = 1;
153f4e70085SSatish Balay }
154f4e70085SSatish Balay 
155f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
156f4e70085SSatish Balay {
157f4e70085SSatish Balay   const PetscInt         **oocols = &my_ocols;
158f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
159f4e70085SSatish Balay   if (!matgetrowactive) {
160d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
161f4e70085SSatish Balay                "Must call MatGetRow() first");
162f4e70085SSatish Balay      *ierr = 1;
163f4e70085SSatish Balay      return;
164f4e70085SSatish Balay   }
165f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
166f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
167f4e70085SSatish Balay 
168f4e70085SSatish Balay   *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
169f4e70085SSatish Balay   matgetrowactive = 0;
170f4e70085SSatish Balay }
171f4e70085SSatish Balay 
172f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
173f4e70085SSatish Balay {
174f4e70085SSatish Balay   PetscViewer v;
175f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
176f4e70085SSatish Balay   *ierr = MatView(*mat,v);
177f4e70085SSatish Balay }
178f4e70085SSatish Balay 
179112444f4SShri Abhyankar void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
180f7e310deSShri Abhyankar {
181f7e310deSShri Abhyankar   PetscViewer v;
182f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
183112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
184f7e310deSShri Abhyankar }
185f7e310deSShri Abhyankar 
186f4e70085SSatish Balay void PETSC_STDCALL matgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
187f4e70085SSatish Balay {
188f4e70085SSatish Balay   PetscScalar *mm;
189f4e70085SSatish Balay   PetscInt    m,n;
190f4e70085SSatish Balay 
191f4e70085SSatish Balay   *ierr = MatGetArray(*mat,&mm); if (*ierr) return;
192f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
193f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
194f4e70085SSatish Balay }
195f4e70085SSatish Balay 
196f4e70085SSatish Balay void PETSC_STDCALL matrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
197f4e70085SSatish Balay {
198f4e70085SSatish Balay   PetscScalar          *lx;
199f4e70085SSatish Balay   PetscInt                  m,n;
200f4e70085SSatish Balay 
201f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
202f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
203f4e70085SSatish Balay   *ierr = MatRestoreArray(*mat,&lx);if (*ierr) return;
204f4e70085SSatish Balay }
205f4e70085SSatish Balay 
20635bd34faSBarry Smith void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
20735bd34faSBarry Smith {
20835bd34faSBarry Smith   const char *tname;
20935bd34faSBarry Smith 
21035bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
21135bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
21235bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
21335bd34faSBarry Smith   }
21435bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
21535bd34faSBarry Smith }
21635bd34faSBarry Smith 
2179be81726SHong Zhang void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
2185dffd610SBarry Smith {
2195dffd610SBarry Smith   char *t;
2205dffd610SBarry Smith   FIXCHAR(outtype,len,t);
2219be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
2225dffd610SBarry Smith   FREECHAR(outtype,t);
2235dffd610SBarry Smith }
2245dffd610SBarry Smith 
225f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
226f4e70085SSatish Balay {
227f4e70085SSatish Balay   char *t;
228f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
229f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
230f4e70085SSatish Balay   FREECHAR(outtype,t);
231f4e70085SSatish Balay }
232f4e70085SSatish Balay 
233f4e70085SSatish Balay /*
234f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
235f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
236f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
237f4e70085SSatish Balay */
238f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
239f4e70085SSatish Balay {
240f4e70085SSatish Balay   Mat *lsmat;
241f4e70085SSatish Balay   PetscInt i;
242f4e70085SSatish Balay 
243f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
244f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
245f4e70085SSatish Balay     for (i=0; i<*n; i++) {
246f4e70085SSatish Balay       smat[i] = lsmat[i];
247f4e70085SSatish Balay     }
248f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
249f4e70085SSatish Balay   } else {
250f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
251f4e70085SSatish Balay   }
252f4e70085SSatish Balay }
253f4e70085SSatish Balay 
2547d6bfa3bSBarry Smith /*
2557d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
2567d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
2577d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
2587d6bfa3bSBarry Smith */
2597d6bfa3bSBarry Smith void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
2607d6bfa3bSBarry Smith {
2617d6bfa3bSBarry Smith   PetscInt i;
2627d6bfa3bSBarry Smith 
2637d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
264*6bf464f9SBarry Smith     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
2657d6bfa3bSBarry Smith   }
2667d6bfa3bSBarry Smith }
2677d6bfa3bSBarry Smith 
2682b40b63fSBarry Smith void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
269f4e70085SSatish Balay {
2702b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
2712b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
2722b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
273f4e70085SSatish Balay }
274f4e70085SSatish Balay 
2752b40b63fSBarry Smith void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
276f4e70085SSatish Balay {
2772b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
2782b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
2792b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
280f4e70085SSatish Balay }
281f4e70085SSatish Balay 
2822b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
283f4e70085SSatish Balay {
2842b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
2852b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
2862b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
287f4e70085SSatish Balay }
288f4e70085SSatish Balay 
2892b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
290f4e70085SSatish Balay {
2912b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
2922b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
2932b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
294f4e70085SSatish Balay }
295f4e70085SSatish Balay 
2961eea217eSSatish Balay 
2972b40b63fSBarry Smith void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2981eea217eSSatish Balay {
2991eea217eSSatish Balay   char *t;
3001eea217eSSatish Balay 
3011eea217eSSatish Balay   FIXCHAR(prefix,len,t);
3021eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
3031eea217eSSatish Balay   FREECHAR(prefix,t);
3041eea217eSSatish Balay }
3051eea217eSSatish Balay 
306812c3f48SMatthew Knepley void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,Vec *out,PetscErrorCode *ierr)
307812c3f48SMatthew Knepley {
308812c3f48SMatthew Knepley   CHKFORTRANNULLOBJECT(out);
309812c3f48SMatthew Knepley   *ierr = MatNullSpaceRemove(*sp,*vec,out);
310812c3f48SMatthew Knepley }
3111eea217eSSatish Balay 
3125ba43861SSatish Balay void PETSC_STDCALL   matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr )
3135ba43861SSatish Balay {
3145ba43861SSatish Balay   *__ierr = MatGetInfo(*mat,*flag,info);
3155ba43861SSatish Balay }
3165ba43861SSatish Balay 
31722688b47SSatish Balay void PETSC_STDCALL   matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
31822688b47SSatish Balay {
31922688b47SSatish Balay   *__ierr = MatLUFactor(*mat,*row,*col,info);
32022688b47SSatish Balay }
32122688b47SSatish Balay 
32222688b47SSatish Balay void PETSC_STDCALL   matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
32322688b47SSatish Balay {
32422688b47SSatish Balay   *__ierr = MatILUFactor(*mat,*row,*col,info);
32522688b47SSatish Balay }
32622688b47SSatish Balay 
32722688b47SSatish Balay void PETSC_STDCALL   matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
32822688b47SSatish Balay {
32922688b47SSatish Balay   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
33022688b47SSatish Balay }
33122688b47SSatish Balay 
33222688b47SSatish Balay void PETSC_STDCALL   matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr )
33322688b47SSatish Balay {
33422688b47SSatish Balay   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
33522688b47SSatish Balay }
33622688b47SSatish Balay 
33722688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr )
33822688b47SSatish Balay {
33922688b47SSatish Balay   *__ierr = MatCholeskyFactor(*mat,*perm,info);
34022688b47SSatish Balay }
34122688b47SSatish Balay 
34222688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr )
34322688b47SSatish Balay {
34422688b47SSatish Balay   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
34522688b47SSatish Balay }
34622688b47SSatish Balay 
34722688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr )
34822688b47SSatish Balay {
34922688b47SSatish Balay   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
35022688b47SSatish Balay }
35122688b47SSatish Balay 
35222688b47SSatish Balay void PETSC_STDCALL   matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
35322688b47SSatish Balay {
35422688b47SSatish Balay   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
35522688b47SSatish Balay }
35622688b47SSatish Balay 
35722688b47SSatish Balay void PETSC_STDCALL   maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr )
35822688b47SSatish Balay {
35922688b47SSatish Balay   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
36022688b47SSatish Balay }
36122688b47SSatish Balay 
36222688b47SSatish Balay void PETSC_STDCALL   maticcfactor_(Mat *mat,IS *row, MatFactorInfo* info, int *__ierr )
36322688b47SSatish Balay {
36422688b47SSatish Balay   *__ierr = MatICCFactor(*mat,*row,info);
36522688b47SSatish Balay }
36622688b47SSatish Balay 
36722688b47SSatish Balay void PETSC_STDCALL   matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr )
36822688b47SSatish Balay {
36922688b47SSatish Balay   *__ierr = MatFactorInfoInitialize(info);
37022688b47SSatish Balay }
37122688b47SSatish Balay 
372f4e70085SSatish Balay EXTERN_C_END
373