xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision d2da0f5de408596fc8fb6ca3c8291a40e7f07874)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscmat.h>
3665c2dedSJed Brown #include <petscviewer.h>
4f4e70085SSatish Balay 
5f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
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
158c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
166778691eSSatish Balay #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
178c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
188c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
19f4e70085SSatish Balay #define matconvert_                      MATCONVERT
20f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
2117ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
2217ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
2317ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
24d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
25f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
26f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
27f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
28f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
2917ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
3017ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
311eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
32*d2da0f5dSBarry Smith #define matcreate_                       MATCREATE
33c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
345ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
3522688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
3622688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
3722688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
3822688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
3922688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
4022688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
4122688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
4222688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
4322688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
4422688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
4522688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
46b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
470905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
48f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
497d6bfa3bSBarry Smith #define matdestroymatrices_              matdestroymatrices_
505dffd610SBarry Smith #define matgetfactor_                    matgetfactor
5135bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
52*d2da0f5dSBarry Smith #define matcreate_                       matcreate
53f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
54f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
55f4e70085SSatish Balay #define matgetrow_                       matgetrow
56f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
57f4e70085SSatish Balay #define matview_                         matview
58f7e310deSShri Abhyankar #define matload_                         matload
598c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
608c778c55SBarry Smith #define matseqaijrestorearray_           matseqaijrestorearray
618c778c55SBarry Smith #define matdensegetarray_                matdensegetarray
628c778c55SBarry Smith #define matdenserestorearray_            matdenserestorearray
63f4e70085SSatish Balay #define matconvert_                      matconvert
64f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
6517ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
6617ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
6717ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
68d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
69f4e70085SSatish Balay #define matzerorows_                     matzerorows
70f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
71f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
72f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
7317ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
7417ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
751eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
76812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
775ba43861SSatish Balay #define matgetinfo_                      matgetinfo
7822688b47SSatish Balay #define matlufactor_                     matlufactor
7922688b47SSatish Balay #define matilufactor_                    matilufactor
8022688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
8122688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
8222688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
8322688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
8422688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
8522688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
8622688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
8722688b47SSatish Balay #define maticcfactor_                    maticcfactor
8822688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
89b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
900905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
91f4e70085SSatish Balay #endif
92f4e70085SSatish Balay 
93b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
94b22b330cSBarry Smith {
95b22b330cSBarry Smith   PetscErrorCode ierr = 0;
96b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
97b22b330cSBarry Smith   return 0;
98b22b330cSBarry Smith }
99b22b330cSBarry Smith 
1008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
101b22b330cSBarry Smith {
102b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
103b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
10426fbe8dcSKarl Rupp 
105b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
106b22b330cSBarry Smith }
107b22b330cSBarry Smith 
108*d2da0f5dSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
1097c54600cSBarry Smith {
1107c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
1117c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
1122a7a6963SBarry Smith   *ierr = MatCreateVecs(*mat,right,left);
1137c54600cSBarry Smith }
1147c54600cSBarry Smith 
1158cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
116ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
117f4e70085SSatish Balay {
1181a83f524SJed Brown   const PetscInt *IA,*JA;
1198f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
1201a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
1211a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
122f4e70085SSatish Balay }
123f4e70085SSatish Balay 
1248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
125ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
126f4e70085SSatish Balay {
1271a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
1288f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
129f4e70085SSatish Balay }
130f4e70085SSatish Balay 
131f4e70085SSatish Balay /*
132f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
133f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
134f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
135f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
136f4e70085SSatish Balay   at a time.
137f4e70085SSatish Balay */
138f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
139f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
140f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
141f4e70085SSatish Balay 
1428cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
143f4e70085SSatish Balay {
144f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
145f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
146f4e70085SSatish Balay 
147f4e70085SSatish Balay   if (matgetrowactive) {
148efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
149f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
150f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
151f4e70085SSatish Balay     *ierr = 1;
152f4e70085SSatish Balay     return;
153f4e70085SSatish Balay   }
154f4e70085SSatish Balay 
1550298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
1560298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
157f4e70085SSatish Balay 
158f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
159f4e70085SSatish Balay   if (*ierr) return;
160f4e70085SSatish Balay 
161f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
162f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
163f4e70085SSatish Balay   matgetrowactive = 1;
164f4e70085SSatish Balay }
165f4e70085SSatish Balay 
1668cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
167f4e70085SSatish Balay {
168f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
169f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
170f4e70085SSatish Balay   if (!matgetrowactive) {
171efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
172f4e70085SSatish Balay                "Must call MatGetRow() first");
173f4e70085SSatish Balay     *ierr = 1;
174f4e70085SSatish Balay     return;
175f4e70085SSatish Balay   }
1760298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
1770298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
178f4e70085SSatish Balay 
179f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
180f4e70085SSatish Balay   matgetrowactive = 0;
181f4e70085SSatish Balay }
182f4e70085SSatish Balay 
1838cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
184f4e70085SSatish Balay {
185f4e70085SSatish Balay   PetscViewer v;
186f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
187f4e70085SSatish Balay   *ierr = MatView(*mat,v);
188f4e70085SSatish Balay }
189f4e70085SSatish Balay 
1908cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
191f7e310deSShri Abhyankar {
192f7e310deSShri Abhyankar   PetscViewer v;
193f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
194112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
195f7e310deSShri Abhyankar }
196f7e310deSShri Abhyankar 
1978cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
198f4e70085SSatish Balay {
199f4e70085SSatish Balay   PetscScalar *mm;
200f4e70085SSatish Balay   PetscInt    m,n;
201f4e70085SSatish Balay 
2028c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
203f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
204f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
205f4e70085SSatish Balay }
206f4e70085SSatish Balay 
2078cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
208f4e70085SSatish Balay {
209f4e70085SSatish Balay   PetscScalar *lx;
210f4e70085SSatish Balay   PetscInt    m,n;
211f4e70085SSatish Balay 
212f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
213f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2148c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
215f4e70085SSatish Balay }
216f4e70085SSatish Balay 
2178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
21873a71a0fSBarry Smith {
21973a71a0fSBarry Smith   PetscScalar *mm;
22073a71a0fSBarry Smith   PetscInt    m,n;
22173a71a0fSBarry Smith 
2228c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
22373a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
22473a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
22573a71a0fSBarry Smith }
22673a71a0fSBarry Smith 
2278cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
22873a71a0fSBarry Smith {
22973a71a0fSBarry Smith   PetscScalar *lx;
23073a71a0fSBarry Smith   PetscInt    m,n;
23173a71a0fSBarry Smith 
23273a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
23373a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2348c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
23573a71a0fSBarry Smith }
23673a71a0fSBarry Smith 
2378cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
23835bd34faSBarry Smith {
23935bd34faSBarry Smith   const char *tname;
24035bd34faSBarry Smith 
24135bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
24235bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
24335bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
24435bd34faSBarry Smith   }
24535bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
24635bd34faSBarry Smith }
24735bd34faSBarry Smith 
2488cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
2495dffd610SBarry Smith {
2505dffd610SBarry Smith   char *t;
2515dffd610SBarry Smith   FIXCHAR(outtype,len,t);
2529be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
2535dffd610SBarry Smith   FREECHAR(outtype,t);
2545dffd610SBarry Smith }
2555dffd610SBarry Smith 
2568cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
257f4e70085SSatish Balay {
258f4e70085SSatish Balay   char *t;
259f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
260f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
261f4e70085SSatish Balay   FREECHAR(outtype,t);
262f4e70085SSatish Balay }
263f4e70085SSatish Balay 
264f4e70085SSatish Balay /*
265f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
266f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
267f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
268f4e70085SSatish Balay */
2698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
270f4e70085SSatish Balay {
271f4e70085SSatish Balay   Mat      *lsmat;
272f4e70085SSatish Balay   PetscInt i;
273f4e70085SSatish Balay 
274f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
275f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
276f4e70085SSatish Balay     for (i=0; i<*n; i++) {
277f4e70085SSatish Balay       smat[i] = lsmat[i];
278f4e70085SSatish Balay     }
279f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
280f4e70085SSatish Balay   } else {
281f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
282f4e70085SSatish Balay   }
283f4e70085SSatish Balay }
284f4e70085SSatish Balay 
2857d6bfa3bSBarry Smith /*
2867d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
2877d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
2887d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
2897d6bfa3bSBarry Smith */
2908cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
2917d6bfa3bSBarry Smith {
2927d6bfa3bSBarry Smith   PetscInt i;
2937d6bfa3bSBarry Smith 
2947d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
2956bf464f9SBarry Smith     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
2967d6bfa3bSBarry Smith   }
2977d6bfa3bSBarry Smith }
2987d6bfa3bSBarry Smith 
2998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
30017ede90eSSatish Balay {
30117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
30217ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
30317ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
30417ede90eSSatish Balay }
30517ede90eSSatish Balay 
3068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
30717ede90eSSatish Balay {
30817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
30917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31017ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
31117ede90eSSatish Balay }
31217ede90eSSatish Balay 
3138cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
31417ede90eSSatish Balay {
31517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
31617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31717ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
31817ede90eSSatish Balay }
31917ede90eSSatish Balay 
3208cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
321d25a37e1SJed Brown {
322d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
323d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
324d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
325d25a37e1SJed Brown }
326d25a37e1SJed Brown 
3278cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
328f4e70085SSatish Balay {
3292b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3302b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3312b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
332f4e70085SSatish Balay }
333f4e70085SSatish Balay 
3348cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
335f4e70085SSatish Balay {
3362b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3372b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3382b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
339f4e70085SSatish Balay }
340f4e70085SSatish Balay 
3418cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
342f4e70085SSatish Balay {
3432b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3442b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3452b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
346f4e70085SSatish Balay }
347f4e70085SSatish Balay 
3488cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
349f4e70085SSatish Balay {
3502b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3512b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3522b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
353f4e70085SSatish Balay }
354f4e70085SSatish Balay 
3558cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
35617ede90eSSatish Balay {
35717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
35817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
35917ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
36017ede90eSSatish Balay }
36117ede90eSSatish Balay 
3628cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
36317ede90eSSatish Balay {
36417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
36517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
36617ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
36717ede90eSSatish Balay }
3681eea217eSSatish Balay 
3698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3701eea217eSSatish Balay {
3711eea217eSSatish Balay   char *t;
3721eea217eSSatish Balay 
3731eea217eSSatish Balay   FIXCHAR(prefix,len,t);
3741eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
3751eea217eSSatish Balay   FREECHAR(prefix,t);
3761eea217eSSatish Balay }
3771eea217eSSatish Balay 
378d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
379812c3f48SMatthew Knepley {
380d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
381812c3f48SMatthew Knepley }
3821eea217eSSatish Balay 
3838cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr)
3845ba43861SSatish Balay {
3855ba43861SSatish Balay   *__ierr = MatGetInfo(*mat,*flag,info);
3865ba43861SSatish Balay }
3875ba43861SSatish Balay 
3888cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
38922688b47SSatish Balay {
39022688b47SSatish Balay   *__ierr = MatLUFactor(*mat,*row,*col,info);
39122688b47SSatish Balay }
39222688b47SSatish Balay 
3938cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
39422688b47SSatish Balay {
39522688b47SSatish Balay   *__ierr = MatILUFactor(*mat,*row,*col,info);
39622688b47SSatish Balay }
39722688b47SSatish Balay 
3988cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
39922688b47SSatish Balay {
40022688b47SSatish Balay   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
40122688b47SSatish Balay }
40222688b47SSatish Balay 
4038cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
40422688b47SSatish Balay {
40522688b47SSatish Balay   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
40622688b47SSatish Balay }
40722688b47SSatish Balay 
4088cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
40922688b47SSatish Balay {
41022688b47SSatish Balay   *__ierr = MatCholeskyFactor(*mat,*perm,info);
41122688b47SSatish Balay }
41222688b47SSatish Balay 
4138cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
41422688b47SSatish Balay {
41522688b47SSatish Balay   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
41622688b47SSatish Balay }
41722688b47SSatish Balay 
4188cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
41922688b47SSatish Balay {
42022688b47SSatish Balay   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
42122688b47SSatish Balay }
42222688b47SSatish Balay 
4238cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
42422688b47SSatish Balay {
42522688b47SSatish Balay   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
42622688b47SSatish Balay }
42722688b47SSatish Balay 
4288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
42922688b47SSatish Balay {
43022688b47SSatish Balay   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
43122688b47SSatish Balay }
43222688b47SSatish Balay 
4338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr)
43422688b47SSatish Balay {
43522688b47SSatish Balay   *__ierr = MatICCFactor(*mat,*row,info);
43622688b47SSatish Balay }
43722688b47SSatish Balay 
4388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr)
43922688b47SSatish Balay {
44022688b47SSatish Balay   *__ierr = MatFactorInfoInitialize(info);
44122688b47SSatish Balay }
442