xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 87bcf4e03de20402409e54681f41c2796c94bba5)
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*87bcf4e0SBarry Smith #define matgetrowmin_                    MATGETROWMIN
7*87bcf4e0SBarry Smith #define matgetrowminabs_                 MATGETROWMINABS
85928be6bSBarry Smith #define matgetrowmax_                    MATGETROWMAX
95928be6bSBarry Smith #define matgetrowmaxabs_                 MATGETROWMAXABS
107d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
115dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
1235bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
13f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
14f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
15f4e70085SSatish Balay #define matgetrow_                       MATGETROW
16f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
17f7e310deSShri Abhyankar #define matload_                         MATLOAD
18f4e70085SSatish Balay #define matview_                         MATVIEW
198c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
206778691eSSatish Balay #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
218c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
228c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
23f4e70085SSatish Balay #define matconvert_                      MATCONVERT
24f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
2517ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
2617ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
2717ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
28d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
29f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
30f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
31f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
32f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
3317ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
3417ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
351eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
367c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
37c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
385ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
3922688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
4022688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
4122688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
4222688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
4322688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
4422688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
4522688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
4622688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
4722688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
4822688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
4922688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
50b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
510905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
52f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
53*87bcf4e0SBarry Smith #define matgetrowmin_                    matgetrowmin
54*87bcf4e0SBarry Smith #define matgetrowminabs_                 matgetrowminabs
555928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
565928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
575928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
585dffd610SBarry Smith #define matgetfactor_                    matgetfactor
5935bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
607c54600cSBarry Smith #define matgetvecs_                      matgetvecs
61f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
62f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
63f4e70085SSatish Balay #define matgetrow_                       matgetrow
64f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
65f4e70085SSatish Balay #define matview_                         matview
66f7e310deSShri Abhyankar #define matload_                         matload
678c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
688c778c55SBarry Smith #define matseqaijrestorearray_                 matseqaijrestorearray
698c778c55SBarry Smith #define matdensegetarray_             matdensegetarray
708c778c55SBarry Smith #define matdenserestorearray_         matdenserestorearray
71f4e70085SSatish Balay #define matconvert_                      matconvert
72f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
7317ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
7417ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
7517ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
76d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
77f4e70085SSatish Balay #define matzerorows_                     matzerorows
78f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
79f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
80f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
8117ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
8217ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
831eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
84812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
855ba43861SSatish Balay #define matgetinfo_                      matgetinfo
8622688b47SSatish Balay #define matlufactor_                     matlufactor
8722688b47SSatish Balay #define matilufactor_                    matilufactor
8822688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
8922688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
9022688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
9122688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
9222688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
9322688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
9422688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
9522688b47SSatish Balay #define maticcfactor_                    maticcfactor
9622688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
97b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
980905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
99f4e70085SSatish Balay #endif
100f4e70085SSatish Balay 
101*87bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
102*87bcf4e0SBarry Smith {
103*87bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
104*87bcf4e0SBarry Smith   *ierr = MatGetRowMin(*mat,*v,idx);
105*87bcf4e0SBarry Smith }
106*87bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
107*87bcf4e0SBarry Smith {
108*87bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
109*87bcf4e0SBarry Smith   *ierr = MatGetRowMinAbs(*mat,*v,idx);
110*87bcf4e0SBarry Smith }
111*87bcf4e0SBarry Smith 
1125928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
1135928be6bSBarry Smith {
1145928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
1155928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
1165928be6bSBarry Smith }
1175928be6bSBarry Smith 
1185928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
1195928be6bSBarry Smith {
1205928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
1215928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
1225928be6bSBarry Smith }
1235928be6bSBarry Smith 
124b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
125b22b330cSBarry Smith {
126b22b330cSBarry Smith   PetscErrorCode ierr = 0;
127b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
128b22b330cSBarry Smith   return 0;
129b22b330cSBarry Smith }
130b22b330cSBarry Smith 
1318cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
132b22b330cSBarry Smith {
133b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
134b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
13526fbe8dcSKarl Rupp 
136b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
137b22b330cSBarry Smith }
138b22b330cSBarry Smith 
1398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
1407c54600cSBarry Smith {
1417c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
1427c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
1437c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
1447c54600cSBarry Smith }
1457c54600cSBarry Smith 
1468cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
147ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
148f4e70085SSatish Balay {
1491a83f524SJed Brown   const PetscInt *IA,*JA;
1508f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
1511a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
1521a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
153f4e70085SSatish Balay }
154f4e70085SSatish Balay 
1558cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
156ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
157f4e70085SSatish Balay {
1581a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
1598f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
160f4e70085SSatish Balay }
161f4e70085SSatish Balay 
162f4e70085SSatish Balay /*
163f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
164f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
165f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
166f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
167f4e70085SSatish Balay   at a time.
168f4e70085SSatish Balay */
169f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
170f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
171f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
172f4e70085SSatish Balay 
1738cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
174f4e70085SSatish Balay {
175f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
176f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
177f4e70085SSatish Balay 
178f4e70085SSatish Balay   if (matgetrowactive) {
179efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
180f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
181f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
182f4e70085SSatish Balay     *ierr = 1;
183f4e70085SSatish Balay     return;
184f4e70085SSatish Balay   }
185f4e70085SSatish Balay 
1860298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
1870298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
188f4e70085SSatish Balay 
189f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
190f4e70085SSatish Balay   if (*ierr) return;
191f4e70085SSatish Balay 
192f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
193f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
194f4e70085SSatish Balay   matgetrowactive = 1;
195f4e70085SSatish Balay }
196f4e70085SSatish Balay 
1978cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
198f4e70085SSatish Balay {
199f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
200f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
201f4e70085SSatish Balay   if (!matgetrowactive) {
202efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
203f4e70085SSatish Balay                "Must call MatGetRow() first");
204f4e70085SSatish Balay     *ierr = 1;
205f4e70085SSatish Balay     return;
206f4e70085SSatish Balay   }
2070298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
2080298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
209f4e70085SSatish Balay 
210f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
211f4e70085SSatish Balay   matgetrowactive = 0;
212f4e70085SSatish Balay }
213f4e70085SSatish Balay 
2148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
215f4e70085SSatish Balay {
216f4e70085SSatish Balay   PetscViewer v;
217f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
218f4e70085SSatish Balay   *ierr = MatView(*mat,v);
219f4e70085SSatish Balay }
220f4e70085SSatish Balay 
2218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
222f7e310deSShri Abhyankar {
223f7e310deSShri Abhyankar   PetscViewer v;
224f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
225112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
226f7e310deSShri Abhyankar }
227f7e310deSShri Abhyankar 
2288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
229f4e70085SSatish Balay {
230f4e70085SSatish Balay   PetscScalar *mm;
231f4e70085SSatish Balay   PetscInt    m,n;
232f4e70085SSatish Balay 
2338c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
234f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
235f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
236f4e70085SSatish Balay }
237f4e70085SSatish Balay 
2388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
239f4e70085SSatish Balay {
240f4e70085SSatish Balay   PetscScalar *lx;
241f4e70085SSatish Balay   PetscInt    m,n;
242f4e70085SSatish Balay 
243f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
244f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2458c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
246f4e70085SSatish Balay }
247f4e70085SSatish Balay 
2488cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
24973a71a0fSBarry Smith {
25073a71a0fSBarry Smith   PetscScalar *mm;
25173a71a0fSBarry Smith   PetscInt    m,n;
25273a71a0fSBarry Smith 
2538c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
25473a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
25573a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
25673a71a0fSBarry Smith }
25773a71a0fSBarry Smith 
2588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
25973a71a0fSBarry Smith {
26073a71a0fSBarry Smith   PetscScalar *lx;
26173a71a0fSBarry Smith   PetscInt    m,n;
26273a71a0fSBarry Smith 
26373a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
26473a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2658c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
26673a71a0fSBarry Smith }
26773a71a0fSBarry Smith 
2688cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
26935bd34faSBarry Smith {
27035bd34faSBarry Smith   const char *tname;
27135bd34faSBarry Smith 
27235bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
27335bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
27435bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
27535bd34faSBarry Smith   }
27635bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
27735bd34faSBarry Smith }
27835bd34faSBarry Smith 
2798cc058d9SJed 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))
2805dffd610SBarry Smith {
2815dffd610SBarry Smith   char *t;
2825dffd610SBarry Smith   FIXCHAR(outtype,len,t);
2839be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
2845dffd610SBarry Smith   FREECHAR(outtype,t);
2855dffd610SBarry Smith }
2865dffd610SBarry Smith 
2878cc058d9SJed 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))
288f4e70085SSatish Balay {
289f4e70085SSatish Balay   char *t;
290f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
291f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
292f4e70085SSatish Balay   FREECHAR(outtype,t);
293f4e70085SSatish Balay }
294f4e70085SSatish Balay 
295f4e70085SSatish Balay /*
296f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
297f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
298f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
299f4e70085SSatish Balay */
3008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
301f4e70085SSatish Balay {
302f4e70085SSatish Balay   Mat      *lsmat;
303f4e70085SSatish Balay   PetscInt i;
304f4e70085SSatish Balay 
305f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
306f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
307f4e70085SSatish Balay     for (i=0; i<*n; i++) {
308f4e70085SSatish Balay       smat[i] = lsmat[i];
309f4e70085SSatish Balay     }
310f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
311f4e70085SSatish Balay   } else {
312f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
313f4e70085SSatish Balay   }
314f4e70085SSatish Balay }
315f4e70085SSatish Balay 
3167d6bfa3bSBarry Smith /*
3177d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
3187d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
3197d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
3207d6bfa3bSBarry Smith */
3218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
3227d6bfa3bSBarry Smith {
3237d6bfa3bSBarry Smith   PetscInt i;
3247d6bfa3bSBarry Smith 
3257d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
3266bf464f9SBarry Smith     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
3277d6bfa3bSBarry Smith   }
3287d6bfa3bSBarry Smith }
3297d6bfa3bSBarry Smith 
3308cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
33117ede90eSSatish Balay {
33217ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
33317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
33417ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
33517ede90eSSatish Balay }
33617ede90eSSatish Balay 
3378cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
33817ede90eSSatish Balay {
33917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
34017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
34117ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
34217ede90eSSatish Balay }
34317ede90eSSatish Balay 
3448cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
34517ede90eSSatish Balay {
34617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
34717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
34817ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
34917ede90eSSatish Balay }
35017ede90eSSatish Balay 
3518cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
352d25a37e1SJed Brown {
353d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
354d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
355d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
356d25a37e1SJed Brown }
357d25a37e1SJed Brown 
3588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
359f4e70085SSatish Balay {
3602b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3612b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3622b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
363f4e70085SSatish Balay }
364f4e70085SSatish Balay 
3658cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
366f4e70085SSatish Balay {
3672b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3682b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3692b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
370f4e70085SSatish Balay }
371f4e70085SSatish Balay 
3728cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
373f4e70085SSatish Balay {
3742b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3752b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3762b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
377f4e70085SSatish Balay }
378f4e70085SSatish Balay 
3798cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
380f4e70085SSatish Balay {
3812b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3822b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3832b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
384f4e70085SSatish Balay }
385f4e70085SSatish Balay 
3868cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
38717ede90eSSatish Balay {
38817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
38917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
39017ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
39117ede90eSSatish Balay }
39217ede90eSSatish Balay 
3938cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
39417ede90eSSatish Balay {
39517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
39617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
39717ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
39817ede90eSSatish Balay }
3991eea217eSSatish Balay 
4008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
4011eea217eSSatish Balay {
4021eea217eSSatish Balay   char *t;
4031eea217eSSatish Balay 
4041eea217eSSatish Balay   FIXCHAR(prefix,len,t);
4051eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
4061eea217eSSatish Balay   FREECHAR(prefix,t);
4071eea217eSSatish Balay }
4081eea217eSSatish Balay 
409d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
410812c3f48SMatthew Knepley {
411d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
412812c3f48SMatthew Knepley }
4131eea217eSSatish Balay 
4148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr)
4155ba43861SSatish Balay {
4165ba43861SSatish Balay   *__ierr = MatGetInfo(*mat,*flag,info);
4175ba43861SSatish Balay }
4185ba43861SSatish Balay 
4198cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
42022688b47SSatish Balay {
42122688b47SSatish Balay   *__ierr = MatLUFactor(*mat,*row,*col,info);
42222688b47SSatish Balay }
42322688b47SSatish Balay 
4248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
42522688b47SSatish Balay {
42622688b47SSatish Balay   *__ierr = MatILUFactor(*mat,*row,*col,info);
42722688b47SSatish Balay }
42822688b47SSatish Balay 
4298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
43022688b47SSatish Balay {
43122688b47SSatish Balay   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
43222688b47SSatish Balay }
43322688b47SSatish Balay 
4348cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
43522688b47SSatish Balay {
43622688b47SSatish Balay   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
43722688b47SSatish Balay }
43822688b47SSatish Balay 
4398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
44022688b47SSatish Balay {
44122688b47SSatish Balay   *__ierr = MatCholeskyFactor(*mat,*perm,info);
44222688b47SSatish Balay }
44322688b47SSatish Balay 
4448cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
44522688b47SSatish Balay {
44622688b47SSatish Balay   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
44722688b47SSatish Balay }
44822688b47SSatish Balay 
4498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
45022688b47SSatish Balay {
45122688b47SSatish Balay   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
45222688b47SSatish Balay }
45322688b47SSatish Balay 
4548cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
45522688b47SSatish Balay {
45622688b47SSatish Balay   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
45722688b47SSatish Balay }
45822688b47SSatish Balay 
4598cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
46022688b47SSatish Balay {
46122688b47SSatish Balay   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
46222688b47SSatish Balay }
46322688b47SSatish Balay 
4648cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr)
46522688b47SSatish Balay {
46622688b47SSatish Balay   *__ierr = MatICCFactor(*mat,*row,info);
46722688b47SSatish Balay }
46822688b47SSatish Balay 
4698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr)
47022688b47SSatish Balay {
47122688b47SSatish Balay   *__ierr = MatFactorInfoInitialize(info);
47222688b47SSatish Balay }
473