xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 26fbe8dc1a3c99fb8dddfa572c8c6b3b4ce3ca53)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscmat.h>
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
57d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
65dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
735bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
8f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
9f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
10f4e70085SSatish Balay #define matgetrow_                       MATGETROW
11f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
12f7e310deSShri Abhyankar #define matload_                         MATLOAD
13f4e70085SSatish Balay #define matview_                         MATVIEW
148c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
158c778c55SBarry Smith #define matseqaijrestorearray            MATSEQAIJRESTOREARRAY
168c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
178c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
18f4e70085SSatish Balay #define matconvert_                      MATCONVERT
19f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
2017ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
2117ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
2217ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
23d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
24f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
25f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
26f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
27f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
2817ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
2917ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
301eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
317c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
32c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
335ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
3422688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
3522688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
3622688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
3722688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
3822688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
3922688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
4022688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
4122688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
4222688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
4322688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
4422688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
45b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
460905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
47f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
487d6bfa3bSBarry Smith #define matdestroymatrices_              matdestroymatrices_
495dffd610SBarry Smith #define matgetfactor_                    matgetfactor
5035bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
517c54600cSBarry Smith #define matgetvecs_                      matgetvecs
52f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
53f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
54f4e70085SSatish Balay #define matgetrow_                       matgetrow
55f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
56f4e70085SSatish Balay #define matview_                         matview
57f7e310deSShri Abhyankar #define matload_                         matload
588c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
598c778c55SBarry Smith #define matseqaijrestorearray_                 matseqaijrestorearray
608c778c55SBarry Smith #define matdensegetarray_             matdensegetarray
618c778c55SBarry Smith #define matdenserestorearray_         matdenserestorearray
62f4e70085SSatish Balay #define matconvert_                      matconvert
63f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
6417ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
6517ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
6617ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
67d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
68f4e70085SSatish Balay #define matzerorows_                     matzerorows
69f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
70f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
71f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
7217ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
7317ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
741eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
75812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
765ba43861SSatish Balay #define matgetinfo_                      matgetinfo
7722688b47SSatish Balay #define matlufactor_                     matlufactor
7822688b47SSatish Balay #define matilufactor_                    matilufactor
7922688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
8022688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
8122688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
8222688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
8322688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
8422688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
8522688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
8622688b47SSatish Balay #define maticcfactor_                    maticcfactor
8722688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
88b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
890905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
90f4e70085SSatish Balay #endif
91f4e70085SSatish Balay 
92f4e70085SSatish Balay EXTERN_C_BEGIN
93f4e70085SSatish Balay 
94b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
95b22b330cSBarry Smith {
96b22b330cSBarry Smith   PetscErrorCode ierr = 0;
97b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
98b22b330cSBarry Smith   return 0;
99b22b330cSBarry Smith }
100b22b330cSBarry Smith 
101b22b330cSBarry Smith void PETSC_STDCALL  matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
102b22b330cSBarry Smith {
103b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
104b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
105*26fbe8dcSKarl Rupp 
106b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
107b22b330cSBarry Smith }
108b22b330cSBarry Smith 
1097c54600cSBarry Smith void PETSC_STDCALL   matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
1107c54600cSBarry Smith {
1117c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
1127c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
1137c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
1147c54600cSBarry Smith }
1157c54600cSBarry Smith 
116ace3abfcSBarry Smith void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
117ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
118f4e70085SSatish Balay {
1191a83f524SJed Brown   const PetscInt *IA,*JA;
1208f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
1211a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
1221a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
123f4e70085SSatish Balay }
124f4e70085SSatish Balay 
125ace3abfcSBarry Smith void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
126ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
127f4e70085SSatish Balay {
1281a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
1298f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
130f4e70085SSatish Balay }
131f4e70085SSatish Balay 
132f4e70085SSatish Balay /*
133f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
134f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
135f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
136f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
137f4e70085SSatish Balay   at a time.
138f4e70085SSatish Balay */
139f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
140f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
141f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
142f4e70085SSatish Balay 
143f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
144f4e70085SSatish Balay {
145f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
146f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
147f4e70085SSatish Balay 
148f4e70085SSatish Balay   if (matgetrowactive) {
149d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
150f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
151f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
152f4e70085SSatish Balay     *ierr = 1;
153f4e70085SSatish Balay     return;
154f4e70085SSatish Balay   }
155f4e70085SSatish Balay 
156f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
157f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
158f4e70085SSatish Balay 
159f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
160f4e70085SSatish Balay   if (*ierr) return;
161f4e70085SSatish Balay 
162f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
163f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
164f4e70085SSatish Balay   matgetrowactive = 1;
165f4e70085SSatish Balay }
166f4e70085SSatish Balay 
167f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
168f4e70085SSatish Balay {
169f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
170f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
171f4e70085SSatish Balay   if (!matgetrowactive) {
172d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
173f4e70085SSatish Balay                "Must call MatGetRow() first");
174f4e70085SSatish Balay     *ierr = 1;
175f4e70085SSatish Balay     return;
176f4e70085SSatish Balay   }
177f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
178f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
179f4e70085SSatish Balay 
180f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
181f4e70085SSatish Balay   matgetrowactive = 0;
182f4e70085SSatish Balay }
183f4e70085SSatish Balay 
184f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
185f4e70085SSatish Balay {
186f4e70085SSatish Balay   PetscViewer v;
187f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
188f4e70085SSatish Balay   *ierr = MatView(*mat,v);
189f4e70085SSatish Balay }
190f4e70085SSatish Balay 
191112444f4SShri Abhyankar void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
192f7e310deSShri Abhyankar {
193f7e310deSShri Abhyankar   PetscViewer v;
194f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
195112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
196f7e310deSShri Abhyankar }
197f7e310deSShri Abhyankar 
1988c778c55SBarry Smith void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
199f4e70085SSatish Balay {
200f4e70085SSatish Balay   PetscScalar *mm;
201f4e70085SSatish Balay   PetscInt    m,n;
202f4e70085SSatish Balay 
2038c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
204f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
205f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
206f4e70085SSatish Balay }
207f4e70085SSatish Balay 
2088c778c55SBarry Smith void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
209f4e70085SSatish Balay {
210f4e70085SSatish Balay   PetscScalar *lx;
211f4e70085SSatish Balay   PetscInt    m,n;
212f4e70085SSatish Balay 
213f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
214f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2158c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
216f4e70085SSatish Balay }
217f4e70085SSatish Balay 
2188c778c55SBarry Smith void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
21973a71a0fSBarry Smith {
22073a71a0fSBarry Smith   PetscScalar *mm;
22173a71a0fSBarry Smith   PetscInt    m,n;
22273a71a0fSBarry Smith 
2238c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
22473a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
22573a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
22673a71a0fSBarry Smith }
22773a71a0fSBarry Smith 
2288c778c55SBarry Smith void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
22973a71a0fSBarry Smith {
23073a71a0fSBarry Smith   PetscScalar *lx;
23173a71a0fSBarry Smith   PetscInt    m,n;
23273a71a0fSBarry Smith 
23373a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
23473a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2358c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
23673a71a0fSBarry Smith }
23773a71a0fSBarry Smith 
23835bd34faSBarry Smith void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
23935bd34faSBarry Smith {
24035bd34faSBarry Smith   const char *tname;
24135bd34faSBarry Smith 
24235bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
24335bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
24435bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
24535bd34faSBarry Smith   }
24635bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
24735bd34faSBarry Smith }
24835bd34faSBarry Smith 
2499be81726SHong Zhang void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
2505dffd610SBarry Smith {
2515dffd610SBarry Smith   char *t;
2525dffd610SBarry Smith   FIXCHAR(outtype,len,t);
2539be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
2545dffd610SBarry Smith   FREECHAR(outtype,t);
2555dffd610SBarry Smith }
2565dffd610SBarry Smith 
257f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
258f4e70085SSatish Balay {
259f4e70085SSatish Balay   char *t;
260f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
261f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
262f4e70085SSatish Balay   FREECHAR(outtype,t);
263f4e70085SSatish Balay }
264f4e70085SSatish Balay 
265f4e70085SSatish Balay /*
266f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
267f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
268f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
269f4e70085SSatish Balay */
270f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
271f4e70085SSatish Balay {
272f4e70085SSatish Balay   Mat      *lsmat;
273f4e70085SSatish Balay   PetscInt i;
274f4e70085SSatish Balay 
275f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
276f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
277f4e70085SSatish Balay     for (i=0; i<*n; i++) {
278f4e70085SSatish Balay       smat[i] = lsmat[i];
279f4e70085SSatish Balay     }
280f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
281f4e70085SSatish Balay   } else {
282f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
283f4e70085SSatish Balay   }
284f4e70085SSatish Balay }
285f4e70085SSatish Balay 
2867d6bfa3bSBarry Smith /*
2877d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
2887d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
2897d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
2907d6bfa3bSBarry Smith */
2917d6bfa3bSBarry Smith void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
2927d6bfa3bSBarry Smith {
2937d6bfa3bSBarry Smith   PetscInt i;
2947d6bfa3bSBarry Smith 
2957d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
2966bf464f9SBarry Smith     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
2977d6bfa3bSBarry Smith   }
2987d6bfa3bSBarry Smith }
2997d6bfa3bSBarry Smith 
30017ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
30117ede90eSSatish Balay {
30217ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
30317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
30417ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
30517ede90eSSatish Balay }
30617ede90eSSatish Balay 
30717ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
30817ede90eSSatish Balay {
30917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
31017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31117ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
31217ede90eSSatish Balay }
31317ede90eSSatish Balay 
31417ede90eSSatish Balay void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
31517ede90eSSatish Balay {
31617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
31717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31817ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
31917ede90eSSatish Balay }
32017ede90eSSatish Balay 
321d25a37e1SJed Brown void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
322d25a37e1SJed Brown {
323d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
324d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
325d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
326d25a37e1SJed Brown }
327d25a37e1SJed Brown 
3282b40b63fSBarry Smith void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
329f4e70085SSatish Balay {
3302b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3312b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3322b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
333f4e70085SSatish Balay }
334f4e70085SSatish Balay 
3352b40b63fSBarry Smith void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
336f4e70085SSatish Balay {
3372b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3382b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3392b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
340f4e70085SSatish Balay }
341f4e70085SSatish Balay 
3422b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
343f4e70085SSatish Balay {
3442b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3452b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3462b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
347f4e70085SSatish Balay }
348f4e70085SSatish Balay 
3492b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
350f4e70085SSatish Balay {
3512b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3522b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3532b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
354f4e70085SSatish Balay }
355f4e70085SSatish Balay 
35617ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
35717ede90eSSatish Balay {
35817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
35917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
36017ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
36117ede90eSSatish Balay }
36217ede90eSSatish Balay 
36317ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
36417ede90eSSatish Balay {
36517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
36617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
36717ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
36817ede90eSSatish Balay }
3691eea217eSSatish Balay 
3702b40b63fSBarry Smith void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3711eea217eSSatish Balay {
3721eea217eSSatish Balay   char *t;
3731eea217eSSatish Balay 
3741eea217eSSatish Balay   FIXCHAR(prefix,len,t);
3751eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
3761eea217eSSatish Balay   FREECHAR(prefix,t);
3771eea217eSSatish Balay }
3781eea217eSSatish Balay 
379812c3f48SMatthew Knepley void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,Vec *out,PetscErrorCode *ierr)
380812c3f48SMatthew Knepley {
381812c3f48SMatthew Knepley   CHKFORTRANNULLOBJECT(out);
382812c3f48SMatthew Knepley   *ierr = MatNullSpaceRemove(*sp,*vec,out);
383812c3f48SMatthew Knepley }
3841eea217eSSatish Balay 
3855ba43861SSatish Balay void PETSC_STDCALL   matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr)
3865ba43861SSatish Balay {
3875ba43861SSatish Balay   *__ierr = MatGetInfo(*mat,*flag,info);
3885ba43861SSatish Balay }
3895ba43861SSatish Balay 
39022688b47SSatish Balay void PETSC_STDCALL   matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
39122688b47SSatish Balay {
39222688b47SSatish Balay   *__ierr = MatLUFactor(*mat,*row,*col,info);
39322688b47SSatish Balay }
39422688b47SSatish Balay 
39522688b47SSatish Balay void PETSC_STDCALL   matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
39622688b47SSatish Balay {
39722688b47SSatish Balay   *__ierr = MatILUFactor(*mat,*row,*col,info);
39822688b47SSatish Balay }
39922688b47SSatish Balay 
40022688b47SSatish Balay void PETSC_STDCALL   matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
40122688b47SSatish Balay {
40222688b47SSatish Balay   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
40322688b47SSatish Balay }
40422688b47SSatish Balay 
40522688b47SSatish Balay void PETSC_STDCALL   matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
40622688b47SSatish Balay {
40722688b47SSatish Balay   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
40822688b47SSatish Balay }
40922688b47SSatish Balay 
41022688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
41122688b47SSatish Balay {
41222688b47SSatish Balay   *__ierr = MatCholeskyFactor(*mat,*perm,info);
41322688b47SSatish Balay }
41422688b47SSatish Balay 
41522688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
41622688b47SSatish Balay {
41722688b47SSatish Balay   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
41822688b47SSatish Balay }
41922688b47SSatish Balay 
42022688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
42122688b47SSatish Balay {
42222688b47SSatish Balay   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
42322688b47SSatish Balay }
42422688b47SSatish Balay 
42522688b47SSatish Balay void PETSC_STDCALL   matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
42622688b47SSatish Balay {
42722688b47SSatish Balay   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
42822688b47SSatish Balay }
42922688b47SSatish Balay 
43022688b47SSatish Balay void PETSC_STDCALL   maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
43122688b47SSatish Balay {
43222688b47SSatish Balay   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
43322688b47SSatish Balay }
43422688b47SSatish Balay 
43522688b47SSatish Balay void PETSC_STDCALL   maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr)
43622688b47SSatish Balay {
43722688b47SSatish Balay   *__ierr = MatICCFactor(*mat,*row,info);
43822688b47SSatish Balay }
43922688b47SSatish Balay 
44022688b47SSatish Balay void PETSC_STDCALL   matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr)
44122688b47SSatish Balay {
44222688b47SSatish Balay   *__ierr = MatFactorInfoInitialize(info);
44322688b47SSatish Balay }
44422688b47SSatish Balay 
445f4e70085SSatish Balay EXTERN_C_END
446