xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 73a71a0f875e342bef2af9dbfc05b9368f8a1bc4)
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
14f4e70085SSatish Balay #define matgetarray_                     MATGETARRAY
15f4e70085SSatish Balay #define matrestorearray_                 MATRESTOREARRAY
16*73a71a0fSBarry Smith #define matseqdensegetarray_             MATSEQDENSEGETARRAY
17*73a71a0fSBarry Smith #define matseqdenserestorearray_         MATSEQDENSERESTOREARRAY
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
23f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
24f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
25f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
26f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
2717ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
2817ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
291eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
307c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
31c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
325ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
3322688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
3422688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
3522688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
3622688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
3722688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
3822688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
3922688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
4022688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
4122688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
4222688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
4322688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
44b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
450905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
46f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
477d6bfa3bSBarry Smith #define matdestroymatrices_              matdestroymatrices_
485dffd610SBarry Smith #define matgetfactor_                    matgetfactor
4935bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
507c54600cSBarry Smith #define matgetvecs_                      matgetvecs
51f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
52f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
53f4e70085SSatish Balay #define matgetrow_                       matgetrow
54f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
55f4e70085SSatish Balay #define matview_                         matview
56f7e310deSShri Abhyankar #define matload_                         matload
57f4e70085SSatish Balay #define matgetarray_                     matgetarray
58f4e70085SSatish Balay #define matrestorearray_                 matrestorearray
59*73a71a0fSBarry Smith #define matseqdensegetarray_             matseqdensegetarray
60*73a71a0fSBarry Smith #define matseqdenserestorearray_         matseqdenserestorearray
61f4e70085SSatish Balay #define matconvert_                      matconvert
62f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
6317ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
6417ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
6517ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
66f4e70085SSatish Balay #define matzerorows_                     matzerorows
67f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
68f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
69f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
7017ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
7117ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
721eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
73812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
745ba43861SSatish Balay #define matgetinfo_                      matgetinfo
7522688b47SSatish Balay #define matlufactor_                     matlufactor
7622688b47SSatish Balay #define matilufactor_                    matilufactor
7722688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
7822688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
7922688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
8022688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
8122688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
8222688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
8322688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
8422688b47SSatish Balay #define maticcfactor_                    maticcfactor
8522688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
86b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
870905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
88f4e70085SSatish Balay #endif
89f4e70085SSatish Balay 
90f4e70085SSatish Balay EXTERN_C_BEGIN
91f4e70085SSatish Balay 
92b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
93b22b330cSBarry Smith {
94b22b330cSBarry Smith   PetscErrorCode ierr = 0;
95b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
96b22b330cSBarry Smith   return 0;
97b22b330cSBarry Smith }
98b22b330cSBarry Smith 
99b22b330cSBarry Smith void PETSC_STDCALL  matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
100b22b330cSBarry Smith {
101b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
102b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
103b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
104b22b330cSBarry Smith }
105b22b330cSBarry Smith 
1067c54600cSBarry Smith void PETSC_STDCALL   matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr )
1077c54600cSBarry Smith {
1087c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
1097c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
1107c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
1117c54600cSBarry Smith }
1127c54600cSBarry Smith 
113ace3abfcSBarry Smith void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
114ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
115f4e70085SSatish Balay {
116f4e70085SSatish Balay   PetscInt *IA,*JA;
1178f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
118f4e70085SSatish Balay   *iia  = PetscIntAddressToFortran(ia,IA);
119f4e70085SSatish Balay   *jja  = PetscIntAddressToFortran(ja,JA);
120f4e70085SSatish Balay }
121f4e70085SSatish Balay 
122ace3abfcSBarry Smith void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
123ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
124f4e70085SSatish Balay {
125f4e70085SSatish Balay   PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
1268f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
127f4e70085SSatish Balay }
128f4e70085SSatish Balay 
129f4e70085SSatish Balay /*
130f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
131f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
132f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
133f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
134f4e70085SSatish Balay   at a time.
135f4e70085SSatish Balay */
136f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
137f4e70085SSatish Balay static const PetscInt    *my_ocols = 0;
138f4e70085SSatish Balay static const PetscScalar *my_ovals = 0;
139f4e70085SSatish Balay 
140f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
141f4e70085SSatish Balay {
142f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
143f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
144f4e70085SSatish Balay 
145f4e70085SSatish Balay   if (matgetrowactive) {
146d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
147f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
148f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
149f4e70085SSatish Balay      *ierr = 1;
150f4e70085SSatish Balay      return;
151f4e70085SSatish Balay   }
152f4e70085SSatish Balay 
153f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
154f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
155f4e70085SSatish Balay 
156f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
157f4e70085SSatish Balay   if (*ierr) return;
158f4e70085SSatish Balay 
159f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
160f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return; }
161f4e70085SSatish Balay   matgetrowactive = 1;
162f4e70085SSatish Balay }
163f4e70085SSatish Balay 
164f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
165f4e70085SSatish Balay {
166f4e70085SSatish Balay   const PetscInt         **oocols = &my_ocols;
167f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
168f4e70085SSatish Balay   if (!matgetrowactive) {
169d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
170f4e70085SSatish Balay                "Must call MatGetRow() first");
171f4e70085SSatish Balay      *ierr = 1;
172f4e70085SSatish Balay      return;
173f4e70085SSatish Balay   }
174f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
175f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
176f4e70085SSatish Balay 
177f4e70085SSatish Balay   *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
178f4e70085SSatish Balay   matgetrowactive = 0;
179f4e70085SSatish Balay }
180f4e70085SSatish Balay 
181f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
182f4e70085SSatish Balay {
183f4e70085SSatish Balay   PetscViewer v;
184f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
185f4e70085SSatish Balay   *ierr = MatView(*mat,v);
186f4e70085SSatish Balay }
187f4e70085SSatish Balay 
188112444f4SShri Abhyankar void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
189f7e310deSShri Abhyankar {
190f7e310deSShri Abhyankar   PetscViewer v;
191f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
192112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
193f7e310deSShri Abhyankar }
194f7e310deSShri Abhyankar 
195f4e70085SSatish Balay void PETSC_STDCALL matgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
196f4e70085SSatish Balay {
197f4e70085SSatish Balay   PetscScalar *mm;
198f4e70085SSatish Balay   PetscInt    m,n;
199f4e70085SSatish Balay 
200f4e70085SSatish Balay   *ierr = MatGetArray(*mat,&mm); if (*ierr) return;
201f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
202f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
203f4e70085SSatish Balay }
204f4e70085SSatish Balay 
205f4e70085SSatish Balay void PETSC_STDCALL matrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
206f4e70085SSatish Balay {
207f4e70085SSatish Balay   PetscScalar          *lx;
208f4e70085SSatish Balay   PetscInt                  m,n;
209f4e70085SSatish Balay 
210f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
211f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
212f4e70085SSatish Balay   *ierr = MatRestoreArray(*mat,&lx);if (*ierr) return;
213f4e70085SSatish Balay }
214f4e70085SSatish Balay 
215*73a71a0fSBarry Smith void PETSC_STDCALL matseqdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
216*73a71a0fSBarry Smith {
217*73a71a0fSBarry Smith   PetscScalar *mm;
218*73a71a0fSBarry Smith   PetscInt    m,n;
219*73a71a0fSBarry Smith 
220*73a71a0fSBarry Smith   *ierr = MatSeqDenseGetArray(*mat,&mm); if (*ierr) return;
221*73a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
222*73a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
223*73a71a0fSBarry Smith }
224*73a71a0fSBarry Smith 
225*73a71a0fSBarry Smith void PETSC_STDCALL matseqdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
226*73a71a0fSBarry Smith {
227*73a71a0fSBarry Smith   PetscScalar          *lx;
228*73a71a0fSBarry Smith   PetscInt                  m,n;
229*73a71a0fSBarry Smith 
230*73a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
231*73a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
232*73a71a0fSBarry Smith   *ierr = MatSeqDenseRestoreArray(*mat,&lx);if (*ierr) return;
233*73a71a0fSBarry Smith }
234*73a71a0fSBarry Smith 
23535bd34faSBarry Smith void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
23635bd34faSBarry Smith {
23735bd34faSBarry Smith   const char *tname;
23835bd34faSBarry Smith 
23935bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
24035bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
24135bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
24235bd34faSBarry Smith   }
24335bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
24435bd34faSBarry Smith }
24535bd34faSBarry Smith 
2469be81726SHong Zhang void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
2475dffd610SBarry Smith {
2485dffd610SBarry Smith   char *t;
2495dffd610SBarry Smith   FIXCHAR(outtype,len,t);
2509be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
2515dffd610SBarry Smith   FREECHAR(outtype,t);
2525dffd610SBarry Smith }
2535dffd610SBarry Smith 
254f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
255f4e70085SSatish Balay {
256f4e70085SSatish Balay   char *t;
257f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
258f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
259f4e70085SSatish Balay   FREECHAR(outtype,t);
260f4e70085SSatish Balay }
261f4e70085SSatish Balay 
262f4e70085SSatish Balay /*
263f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
264f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
265f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
266f4e70085SSatish Balay */
267f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
268f4e70085SSatish Balay {
269f4e70085SSatish Balay   Mat *lsmat;
270f4e70085SSatish Balay   PetscInt i;
271f4e70085SSatish Balay 
272f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
273f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
274f4e70085SSatish Balay     for (i=0; i<*n; i++) {
275f4e70085SSatish Balay       smat[i] = lsmat[i];
276f4e70085SSatish Balay     }
277f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
278f4e70085SSatish Balay   } else {
279f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
280f4e70085SSatish Balay   }
281f4e70085SSatish Balay }
282f4e70085SSatish Balay 
2837d6bfa3bSBarry Smith /*
2847d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
2857d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
2867d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
2877d6bfa3bSBarry Smith */
2887d6bfa3bSBarry Smith void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
2897d6bfa3bSBarry Smith {
2907d6bfa3bSBarry Smith   PetscInt i;
2917d6bfa3bSBarry Smith 
2927d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
2936bf464f9SBarry Smith     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
2947d6bfa3bSBarry Smith   }
2957d6bfa3bSBarry Smith }
2967d6bfa3bSBarry Smith 
29717ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
29817ede90eSSatish Balay {
29917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
30017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
30117ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
30217ede90eSSatish Balay }
30317ede90eSSatish Balay 
30417ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
30517ede90eSSatish Balay {
30617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
30717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
30817ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
30917ede90eSSatish Balay }
31017ede90eSSatish Balay 
31117ede90eSSatish Balay void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
31217ede90eSSatish Balay {
31317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
31417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31517ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
31617ede90eSSatish Balay }
31717ede90eSSatish Balay 
3182b40b63fSBarry Smith void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
319f4e70085SSatish Balay {
3202b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3212b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3222b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
323f4e70085SSatish Balay }
324f4e70085SSatish Balay 
3252b40b63fSBarry Smith void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
326f4e70085SSatish Balay {
3272b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3282b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3292b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
330f4e70085SSatish Balay }
331f4e70085SSatish Balay 
3322b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
333f4e70085SSatish Balay {
3342b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3352b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3362b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
337f4e70085SSatish Balay }
338f4e70085SSatish Balay 
3392b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
340f4e70085SSatish Balay {
3412b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3422b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3432b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
344f4e70085SSatish Balay }
345f4e70085SSatish Balay 
34617ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
34717ede90eSSatish Balay {
34817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
34917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
35017ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
35117ede90eSSatish Balay }
35217ede90eSSatish Balay 
35317ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
35417ede90eSSatish Balay {
35517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
35617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
35717ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
35817ede90eSSatish Balay }
3591eea217eSSatish Balay 
3602b40b63fSBarry Smith void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3611eea217eSSatish Balay {
3621eea217eSSatish Balay   char *t;
3631eea217eSSatish Balay 
3641eea217eSSatish Balay   FIXCHAR(prefix,len,t);
3651eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
3661eea217eSSatish Balay   FREECHAR(prefix,t);
3671eea217eSSatish Balay }
3681eea217eSSatish Balay 
369812c3f48SMatthew Knepley void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,Vec *out,PetscErrorCode *ierr)
370812c3f48SMatthew Knepley {
371812c3f48SMatthew Knepley   CHKFORTRANNULLOBJECT(out);
372812c3f48SMatthew Knepley   *ierr = MatNullSpaceRemove(*sp,*vec,out);
373812c3f48SMatthew Knepley }
3741eea217eSSatish Balay 
3755ba43861SSatish Balay void PETSC_STDCALL   matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr )
3765ba43861SSatish Balay {
3775ba43861SSatish Balay   *__ierr = MatGetInfo(*mat,*flag,info);
3785ba43861SSatish Balay }
3795ba43861SSatish Balay 
38022688b47SSatish Balay void PETSC_STDCALL   matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
38122688b47SSatish Balay {
38222688b47SSatish Balay   *__ierr = MatLUFactor(*mat,*row,*col,info);
38322688b47SSatish Balay }
38422688b47SSatish Balay 
38522688b47SSatish Balay void PETSC_STDCALL   matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
38622688b47SSatish Balay {
38722688b47SSatish Balay   *__ierr = MatILUFactor(*mat,*row,*col,info);
38822688b47SSatish Balay }
38922688b47SSatish Balay 
39022688b47SSatish Balay void PETSC_STDCALL   matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
39122688b47SSatish Balay {
39222688b47SSatish Balay   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
39322688b47SSatish Balay }
39422688b47SSatish Balay 
39522688b47SSatish Balay void PETSC_STDCALL   matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr )
39622688b47SSatish Balay {
39722688b47SSatish Balay   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
39822688b47SSatish Balay }
39922688b47SSatish Balay 
40022688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr )
40122688b47SSatish Balay {
40222688b47SSatish Balay   *__ierr = MatCholeskyFactor(*mat,*perm,info);
40322688b47SSatish Balay }
40422688b47SSatish Balay 
40522688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr )
40622688b47SSatish Balay {
40722688b47SSatish Balay   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
40822688b47SSatish Balay }
40922688b47SSatish Balay 
41022688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr )
41122688b47SSatish Balay {
41222688b47SSatish Balay   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
41322688b47SSatish Balay }
41422688b47SSatish Balay 
41522688b47SSatish Balay void PETSC_STDCALL   matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr )
41622688b47SSatish Balay {
41722688b47SSatish Balay   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
41822688b47SSatish Balay }
41922688b47SSatish Balay 
42022688b47SSatish Balay void PETSC_STDCALL   maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr )
42122688b47SSatish Balay {
42222688b47SSatish Balay   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
42322688b47SSatish Balay }
42422688b47SSatish Balay 
42522688b47SSatish Balay void PETSC_STDCALL   maticcfactor_(Mat *mat,IS *row, MatFactorInfo* info, int *__ierr )
42622688b47SSatish Balay {
42722688b47SSatish Balay   *__ierr = MatICCFactor(*mat,*row,info);
42822688b47SSatish Balay }
42922688b47SSatish Balay 
43022688b47SSatish Balay void PETSC_STDCALL   matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr )
43122688b47SSatish Balay {
43222688b47SSatish Balay   *__ierr = MatFactorInfoInitialize(info);
43322688b47SSatish Balay }
43422688b47SSatish Balay 
435f4e70085SSatish Balay EXTERN_C_END
436