xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 5928be6b83c887ef425a941d2a487e5cf4c29362)
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)
6*5928be6bSBarry Smith #define matgetrowmax_                    MATGETROWMAX
7*5928be6bSBarry Smith #define matgetrowmaxabs_                 MATGETROWMAXABS
87d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
95dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
1035bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
11f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
12f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
13f4e70085SSatish Balay #define matgetrow_                       MATGETROW
14f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
15f7e310deSShri Abhyankar #define matload_                         MATLOAD
16f4e70085SSatish Balay #define matview_                         MATVIEW
178c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
186778691eSSatish Balay #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
198c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
208c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
21f4e70085SSatish Balay #define matconvert_                      MATCONVERT
22f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
2317ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
2417ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
2517ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
26d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
27f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
28f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
29f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
30f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
3117ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
3217ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
331eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
347c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
35c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
365ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
3722688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
3822688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
3922688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
4022688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
4122688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
4222688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
4322688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
4422688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
4522688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
4622688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
4722688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
48b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
490905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
50f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
51*5928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
52*5928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
53*5928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
545dffd610SBarry Smith #define matgetfactor_                    matgetfactor
5535bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
567c54600cSBarry Smith #define matgetvecs_                      matgetvecs
57f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
58f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
59f4e70085SSatish Balay #define matgetrow_                       matgetrow
60f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
61f4e70085SSatish Balay #define matview_                         matview
62f7e310deSShri Abhyankar #define matload_                         matload
638c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
648c778c55SBarry Smith #define matseqaijrestorearray_                 matseqaijrestorearray
658c778c55SBarry Smith #define matdensegetarray_             matdensegetarray
668c778c55SBarry Smith #define matdenserestorearray_         matdenserestorearray
67f4e70085SSatish Balay #define matconvert_                      matconvert
68f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
6917ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
7017ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
7117ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
72d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
73f4e70085SSatish Balay #define matzerorows_                     matzerorows
74f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
75f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
76f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
7717ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
7817ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
791eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
80812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
815ba43861SSatish Balay #define matgetinfo_                      matgetinfo
8222688b47SSatish Balay #define matlufactor_                     matlufactor
8322688b47SSatish Balay #define matilufactor_                    matilufactor
8422688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
8522688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
8622688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
8722688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
8822688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
8922688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
9022688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
9122688b47SSatish Balay #define maticcfactor_                    maticcfactor
9222688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
93b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
940905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
95f4e70085SSatish Balay #endif
96f4e70085SSatish Balay 
97*5928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
98*5928be6bSBarry Smith {
99*5928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
100*5928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
101*5928be6bSBarry Smith }
102*5928be6bSBarry Smith 
103*5928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
104*5928be6bSBarry Smith {
105*5928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
106*5928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
107*5928be6bSBarry Smith }
108*5928be6bSBarry Smith 
109b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
110b22b330cSBarry Smith {
111b22b330cSBarry Smith   PetscErrorCode ierr = 0;
112b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
113b22b330cSBarry Smith   return 0;
114b22b330cSBarry Smith }
115b22b330cSBarry Smith 
1168cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
117b22b330cSBarry Smith {
118b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
119b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
12026fbe8dcSKarl Rupp 
121b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
122b22b330cSBarry Smith }
123b22b330cSBarry Smith 
1248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
1257c54600cSBarry Smith {
1267c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
1277c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
1287c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
1297c54600cSBarry Smith }
1307c54600cSBarry Smith 
1318cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
132ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
133f4e70085SSatish Balay {
1341a83f524SJed Brown   const PetscInt *IA,*JA;
1358f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
1361a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
1371a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
138f4e70085SSatish Balay }
139f4e70085SSatish Balay 
1408cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
141ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
142f4e70085SSatish Balay {
1431a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
1448f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
145f4e70085SSatish Balay }
146f4e70085SSatish Balay 
147f4e70085SSatish Balay /*
148f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
149f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
150f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
151f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
152f4e70085SSatish Balay   at a time.
153f4e70085SSatish Balay */
154f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
155f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
156f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
157f4e70085SSatish Balay 
1588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
159f4e70085SSatish Balay {
160f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
161f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
162f4e70085SSatish Balay 
163f4e70085SSatish Balay   if (matgetrowactive) {
164efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
165f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
166f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
167f4e70085SSatish Balay     *ierr = 1;
168f4e70085SSatish Balay     return;
169f4e70085SSatish Balay   }
170f4e70085SSatish Balay 
1710298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
1720298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
173f4e70085SSatish Balay 
174f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
175f4e70085SSatish Balay   if (*ierr) return;
176f4e70085SSatish Balay 
177f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
178f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
179f4e70085SSatish Balay   matgetrowactive = 1;
180f4e70085SSatish Balay }
181f4e70085SSatish Balay 
1828cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
183f4e70085SSatish Balay {
184f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
185f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
186f4e70085SSatish Balay   if (!matgetrowactive) {
187efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
188f4e70085SSatish Balay                "Must call MatGetRow() first");
189f4e70085SSatish Balay     *ierr = 1;
190f4e70085SSatish Balay     return;
191f4e70085SSatish Balay   }
1920298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
1930298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
194f4e70085SSatish Balay 
195f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
196f4e70085SSatish Balay   matgetrowactive = 0;
197f4e70085SSatish Balay }
198f4e70085SSatish Balay 
1998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
200f4e70085SSatish Balay {
201f4e70085SSatish Balay   PetscViewer v;
202f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
203f4e70085SSatish Balay   *ierr = MatView(*mat,v);
204f4e70085SSatish Balay }
205f4e70085SSatish Balay 
2068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
207f7e310deSShri Abhyankar {
208f7e310deSShri Abhyankar   PetscViewer v;
209f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
210112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
211f7e310deSShri Abhyankar }
212f7e310deSShri Abhyankar 
2138cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
214f4e70085SSatish Balay {
215f4e70085SSatish Balay   PetscScalar *mm;
216f4e70085SSatish Balay   PetscInt    m,n;
217f4e70085SSatish Balay 
2188c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
219f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
220f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
221f4e70085SSatish Balay }
222f4e70085SSatish Balay 
2238cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
224f4e70085SSatish Balay {
225f4e70085SSatish Balay   PetscScalar *lx;
226f4e70085SSatish Balay   PetscInt    m,n;
227f4e70085SSatish Balay 
228f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
229f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2308c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
231f4e70085SSatish Balay }
232f4e70085SSatish Balay 
2338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
23473a71a0fSBarry Smith {
23573a71a0fSBarry Smith   PetscScalar *mm;
23673a71a0fSBarry Smith   PetscInt    m,n;
23773a71a0fSBarry Smith 
2388c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
23973a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
24073a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
24173a71a0fSBarry Smith }
24273a71a0fSBarry Smith 
2438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
24473a71a0fSBarry Smith {
24573a71a0fSBarry Smith   PetscScalar *lx;
24673a71a0fSBarry Smith   PetscInt    m,n;
24773a71a0fSBarry Smith 
24873a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
24973a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2508c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
25173a71a0fSBarry Smith }
25273a71a0fSBarry Smith 
2538cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
25435bd34faSBarry Smith {
25535bd34faSBarry Smith   const char *tname;
25635bd34faSBarry Smith 
25735bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
25835bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
25935bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
26035bd34faSBarry Smith   }
26135bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
26235bd34faSBarry Smith }
26335bd34faSBarry Smith 
2648cc058d9SJed 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))
2655dffd610SBarry Smith {
2665dffd610SBarry Smith   char *t;
2675dffd610SBarry Smith   FIXCHAR(outtype,len,t);
2689be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
2695dffd610SBarry Smith   FREECHAR(outtype,t);
2705dffd610SBarry Smith }
2715dffd610SBarry Smith 
2728cc058d9SJed 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))
273f4e70085SSatish Balay {
274f4e70085SSatish Balay   char *t;
275f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
276f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
277f4e70085SSatish Balay   FREECHAR(outtype,t);
278f4e70085SSatish Balay }
279f4e70085SSatish Balay 
280f4e70085SSatish Balay /*
281f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
282f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
283f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
284f4e70085SSatish Balay */
2858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
286f4e70085SSatish Balay {
287f4e70085SSatish Balay   Mat      *lsmat;
288f4e70085SSatish Balay   PetscInt i;
289f4e70085SSatish Balay 
290f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
291f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
292f4e70085SSatish Balay     for (i=0; i<*n; i++) {
293f4e70085SSatish Balay       smat[i] = lsmat[i];
294f4e70085SSatish Balay     }
295f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
296f4e70085SSatish Balay   } else {
297f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
298f4e70085SSatish Balay   }
299f4e70085SSatish Balay }
300f4e70085SSatish Balay 
3017d6bfa3bSBarry Smith /*
3027d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
3037d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
3047d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
3057d6bfa3bSBarry Smith */
3068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
3077d6bfa3bSBarry Smith {
3087d6bfa3bSBarry Smith   PetscInt i;
3097d6bfa3bSBarry Smith 
3107d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
3116bf464f9SBarry Smith     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
3127d6bfa3bSBarry Smith   }
3137d6bfa3bSBarry Smith }
3147d6bfa3bSBarry Smith 
3158cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
31617ede90eSSatish Balay {
31717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
31817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31917ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
32017ede90eSSatish Balay }
32117ede90eSSatish Balay 
3228cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
32317ede90eSSatish Balay {
32417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
32517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
32617ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
32717ede90eSSatish Balay }
32817ede90eSSatish Balay 
3298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
33017ede90eSSatish Balay {
33117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
33217ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
33317ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
33417ede90eSSatish Balay }
33517ede90eSSatish Balay 
3368cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
337d25a37e1SJed Brown {
338d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
339d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
340d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
341d25a37e1SJed Brown }
342d25a37e1SJed Brown 
3438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
344f4e70085SSatish Balay {
3452b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3462b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3472b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
348f4e70085SSatish Balay }
349f4e70085SSatish Balay 
3508cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
351f4e70085SSatish Balay {
3522b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3532b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3542b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
355f4e70085SSatish Balay }
356f4e70085SSatish Balay 
3578cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
358f4e70085SSatish Balay {
3592b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3602b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3612b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
362f4e70085SSatish Balay }
363f4e70085SSatish Balay 
3648cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
365f4e70085SSatish Balay {
3662b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3672b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3682b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
369f4e70085SSatish Balay }
370f4e70085SSatish Balay 
3718cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
37217ede90eSSatish Balay {
37317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
37417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
37517ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
37617ede90eSSatish Balay }
37717ede90eSSatish Balay 
3788cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
37917ede90eSSatish Balay {
38017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
38117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
38217ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
38317ede90eSSatish Balay }
3841eea217eSSatish Balay 
3858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3861eea217eSSatish Balay {
3871eea217eSSatish Balay   char *t;
3881eea217eSSatish Balay 
3891eea217eSSatish Balay   FIXCHAR(prefix,len,t);
3901eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
3911eea217eSSatish Balay   FREECHAR(prefix,t);
3921eea217eSSatish Balay }
3931eea217eSSatish Balay 
394d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
395812c3f48SMatthew Knepley {
396d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
397812c3f48SMatthew Knepley }
3981eea217eSSatish Balay 
3998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr)
4005ba43861SSatish Balay {
4015ba43861SSatish Balay   *__ierr = MatGetInfo(*mat,*flag,info);
4025ba43861SSatish Balay }
4035ba43861SSatish Balay 
4048cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
40522688b47SSatish Balay {
40622688b47SSatish Balay   *__ierr = MatLUFactor(*mat,*row,*col,info);
40722688b47SSatish Balay }
40822688b47SSatish Balay 
4098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
41022688b47SSatish Balay {
41122688b47SSatish Balay   *__ierr = MatILUFactor(*mat,*row,*col,info);
41222688b47SSatish Balay }
41322688b47SSatish Balay 
4148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
41522688b47SSatish Balay {
41622688b47SSatish Balay   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
41722688b47SSatish Balay }
41822688b47SSatish Balay 
4198cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
42022688b47SSatish Balay {
42122688b47SSatish Balay   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
42222688b47SSatish Balay }
42322688b47SSatish Balay 
4248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
42522688b47SSatish Balay {
42622688b47SSatish Balay   *__ierr = MatCholeskyFactor(*mat,*perm,info);
42722688b47SSatish Balay }
42822688b47SSatish Balay 
4298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
43022688b47SSatish Balay {
43122688b47SSatish Balay   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
43222688b47SSatish Balay }
43322688b47SSatish Balay 
4348cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
43522688b47SSatish Balay {
43622688b47SSatish Balay   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
43722688b47SSatish Balay }
43822688b47SSatish Balay 
4398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
44022688b47SSatish Balay {
44122688b47SSatish Balay   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
44222688b47SSatish Balay }
44322688b47SSatish Balay 
4448cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
44522688b47SSatish Balay {
44622688b47SSatish Balay   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
44722688b47SSatish Balay }
44822688b47SSatish Balay 
4498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr)
45022688b47SSatish Balay {
45122688b47SSatish Balay   *__ierr = MatICCFactor(*mat,*row,info);
45222688b47SSatish Balay }
45322688b47SSatish Balay 
4548cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr)
45522688b47SSatish Balay {
45622688b47SSatish Balay   *__ierr = MatFactorInfoInitialize(info);
45722688b47SSatish Balay }
458