xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 665c2ded495bb9782a7454dcfef3abf1536c3670)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscmat.h>
3*665c2dedSJed Brown #include <petscviewer.h>
4f4e70085SSatish Balay 
5f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
67d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
75dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
835bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
9f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
10f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
11f4e70085SSatish Balay #define matgetrow_                       MATGETROW
12f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
13f7e310deSShri Abhyankar #define matload_                         MATLOAD
14f4e70085SSatish Balay #define matview_                         MATVIEW
158c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
168c778c55SBarry Smith #define matseqaijrestorearray            MATSEQAIJRESTOREARRAY
178c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
188c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
19f4e70085SSatish Balay #define matconvert_                      MATCONVERT
20f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
2117ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
2217ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
2317ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
24d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
25f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
26f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
27f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
28f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
2917ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
3017ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
311eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
327c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
33c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
345ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
3522688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
3622688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
3722688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
3822688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
3922688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
4022688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
4122688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
4222688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
4322688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
4422688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
4522688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
46b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
470905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
48f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
497d6bfa3bSBarry Smith #define matdestroymatrices_              matdestroymatrices_
505dffd610SBarry Smith #define matgetfactor_                    matgetfactor
5135bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
527c54600cSBarry Smith #define matgetvecs_                      matgetvecs
53f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
54f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
55f4e70085SSatish Balay #define matgetrow_                       matgetrow
56f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
57f4e70085SSatish Balay #define matview_                         matview
58f7e310deSShri Abhyankar #define matload_                         matload
598c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
608c778c55SBarry Smith #define matseqaijrestorearray_                 matseqaijrestorearray
618c778c55SBarry Smith #define matdensegetarray_             matdensegetarray
628c778c55SBarry Smith #define matdenserestorearray_         matdenserestorearray
63f4e70085SSatish Balay #define matconvert_                      matconvert
64f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
6517ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
6617ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
6717ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
68d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
69f4e70085SSatish Balay #define matzerorows_                     matzerorows
70f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
71f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
72f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
7317ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
7417ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
751eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
76812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
775ba43861SSatish Balay #define matgetinfo_                      matgetinfo
7822688b47SSatish Balay #define matlufactor_                     matlufactor
7922688b47SSatish Balay #define matilufactor_                    matilufactor
8022688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
8122688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
8222688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
8322688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
8422688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
8522688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
8622688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
8722688b47SSatish Balay #define maticcfactor_                    maticcfactor
8822688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
89b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
900905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
91f4e70085SSatish Balay #endif
92f4e70085SSatish Balay 
93f4e70085SSatish Balay EXTERN_C_BEGIN
94f4e70085SSatish Balay 
95b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
96b22b330cSBarry Smith {
97b22b330cSBarry Smith   PetscErrorCode ierr = 0;
98b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
99b22b330cSBarry Smith   return 0;
100b22b330cSBarry Smith }
101b22b330cSBarry Smith 
102b22b330cSBarry Smith void PETSC_STDCALL  matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
103b22b330cSBarry Smith {
104b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
105b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
10626fbe8dcSKarl Rupp 
107b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
108b22b330cSBarry Smith }
109b22b330cSBarry Smith 
1107c54600cSBarry Smith void PETSC_STDCALL   matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
1117c54600cSBarry Smith {
1127c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
1137c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
1147c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
1157c54600cSBarry Smith }
1167c54600cSBarry Smith 
117ace3abfcSBarry Smith void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
118ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
119f4e70085SSatish Balay {
1201a83f524SJed Brown   const PetscInt *IA,*JA;
1218f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
1221a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
1231a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
124f4e70085SSatish Balay }
125f4e70085SSatish Balay 
126ace3abfcSBarry Smith void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool  *sym,PetscBool  *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
127ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
128f4e70085SSatish Balay {
1291a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
1308f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
131f4e70085SSatish Balay }
132f4e70085SSatish Balay 
133f4e70085SSatish Balay /*
134f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
135f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
136f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
137f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
138f4e70085SSatish Balay   at a time.
139f4e70085SSatish Balay */
140f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
141f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
142f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
143f4e70085SSatish Balay 
144f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
145f4e70085SSatish Balay {
146f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
147f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
148f4e70085SSatish Balay 
149f4e70085SSatish Balay   if (matgetrowactive) {
150d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
151f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
152f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
153f4e70085SSatish Balay     *ierr = 1;
154f4e70085SSatish Balay     return;
155f4e70085SSatish Balay   }
156f4e70085SSatish Balay 
1570298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
1580298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
159f4e70085SSatish Balay 
160f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
161f4e70085SSatish Balay   if (*ierr) return;
162f4e70085SSatish Balay 
163f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
164f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
165f4e70085SSatish Balay   matgetrowactive = 1;
166f4e70085SSatish Balay }
167f4e70085SSatish Balay 
168f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
169f4e70085SSatish Balay {
170f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
171f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
172f4e70085SSatish Balay   if (!matgetrowactive) {
173d736bfebSBarry Smith     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
174f4e70085SSatish Balay                "Must call MatGetRow() first");
175f4e70085SSatish Balay     *ierr = 1;
176f4e70085SSatish Balay     return;
177f4e70085SSatish Balay   }
1780298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
1790298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
180f4e70085SSatish Balay 
181f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
182f4e70085SSatish Balay   matgetrowactive = 0;
183f4e70085SSatish Balay }
184f4e70085SSatish Balay 
185f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
186f4e70085SSatish Balay {
187f4e70085SSatish Balay   PetscViewer v;
188f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
189f4e70085SSatish Balay   *ierr = MatView(*mat,v);
190f4e70085SSatish Balay }
191f4e70085SSatish Balay 
192112444f4SShri Abhyankar void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
193f7e310deSShri Abhyankar {
194f7e310deSShri Abhyankar   PetscViewer v;
195f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
196112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
197f7e310deSShri Abhyankar }
198f7e310deSShri Abhyankar 
1998c778c55SBarry Smith void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
200f4e70085SSatish Balay {
201f4e70085SSatish Balay   PetscScalar *mm;
202f4e70085SSatish Balay   PetscInt    m,n;
203f4e70085SSatish Balay 
2048c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
205f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
206f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
207f4e70085SSatish Balay }
208f4e70085SSatish Balay 
2098c778c55SBarry Smith void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
210f4e70085SSatish Balay {
211f4e70085SSatish Balay   PetscScalar *lx;
212f4e70085SSatish Balay   PetscInt    m,n;
213f4e70085SSatish Balay 
214f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
215f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2168c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
217f4e70085SSatish Balay }
218f4e70085SSatish Balay 
2198c778c55SBarry Smith void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
22073a71a0fSBarry Smith {
22173a71a0fSBarry Smith   PetscScalar *mm;
22273a71a0fSBarry Smith   PetscInt    m,n;
22373a71a0fSBarry Smith 
2248c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
22573a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
22673a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
22773a71a0fSBarry Smith }
22873a71a0fSBarry Smith 
2298c778c55SBarry Smith void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
23073a71a0fSBarry Smith {
23173a71a0fSBarry Smith   PetscScalar *lx;
23273a71a0fSBarry Smith   PetscInt    m,n;
23373a71a0fSBarry Smith 
23473a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
23573a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
2368c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
23773a71a0fSBarry Smith }
23873a71a0fSBarry Smith 
23935bd34faSBarry Smith void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
24035bd34faSBarry Smith {
24135bd34faSBarry Smith   const char *tname;
24235bd34faSBarry Smith 
24335bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
24435bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
24535bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
24635bd34faSBarry Smith   }
24735bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
24835bd34faSBarry Smith }
24935bd34faSBarry Smith 
2509be81726SHong Zhang void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
2515dffd610SBarry Smith {
2525dffd610SBarry Smith   char *t;
2535dffd610SBarry Smith   FIXCHAR(outtype,len,t);
2549be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
2555dffd610SBarry Smith   FREECHAR(outtype,t);
2565dffd610SBarry Smith }
2575dffd610SBarry Smith 
258f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
259f4e70085SSatish Balay {
260f4e70085SSatish Balay   char *t;
261f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
262f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
263f4e70085SSatish Balay   FREECHAR(outtype,t);
264f4e70085SSatish Balay }
265f4e70085SSatish Balay 
266f4e70085SSatish Balay /*
267f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
268f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
269f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
270f4e70085SSatish Balay */
271f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
272f4e70085SSatish Balay {
273f4e70085SSatish Balay   Mat      *lsmat;
274f4e70085SSatish Balay   PetscInt i;
275f4e70085SSatish Balay 
276f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
277f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
278f4e70085SSatish Balay     for (i=0; i<*n; i++) {
279f4e70085SSatish Balay       smat[i] = lsmat[i];
280f4e70085SSatish Balay     }
281f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
282f4e70085SSatish Balay   } else {
283f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
284f4e70085SSatish Balay   }
285f4e70085SSatish Balay }
286f4e70085SSatish Balay 
2877d6bfa3bSBarry Smith /*
2887d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
2897d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
2907d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
2917d6bfa3bSBarry Smith */
2927d6bfa3bSBarry Smith void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
2937d6bfa3bSBarry Smith {
2947d6bfa3bSBarry Smith   PetscInt i;
2957d6bfa3bSBarry Smith 
2967d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
2976bf464f9SBarry Smith     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
2987d6bfa3bSBarry Smith   }
2997d6bfa3bSBarry Smith }
3007d6bfa3bSBarry Smith 
30117ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
30217ede90eSSatish Balay {
30317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
30417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
30517ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
30617ede90eSSatish Balay }
30717ede90eSSatish Balay 
30817ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
30917ede90eSSatish Balay {
31017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
31117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31217ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
31317ede90eSSatish Balay }
31417ede90eSSatish Balay 
31517ede90eSSatish Balay void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
31617ede90eSSatish Balay {
31717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
31817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
31917ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
32017ede90eSSatish Balay }
32117ede90eSSatish Balay 
322d25a37e1SJed Brown void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
323d25a37e1SJed Brown {
324d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
325d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
326d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
327d25a37e1SJed Brown }
328d25a37e1SJed Brown 
3292b40b63fSBarry Smith void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
330f4e70085SSatish Balay {
3312b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3322b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3332b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
334f4e70085SSatish Balay }
335f4e70085SSatish Balay 
3362b40b63fSBarry Smith void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
337f4e70085SSatish Balay {
3382b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
3392b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
3402b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
341f4e70085SSatish Balay }
342f4e70085SSatish Balay 
3432b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocal_(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 = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
348f4e70085SSatish Balay }
349f4e70085SSatish Balay 
3502b40b63fSBarry Smith void PETSC_STDCALL matzerorowslocalis_(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 = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
355f4e70085SSatish Balay }
356f4e70085SSatish Balay 
35717ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
35817ede90eSSatish Balay {
35917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
36017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
36117ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
36217ede90eSSatish Balay }
36317ede90eSSatish Balay 
36417ede90eSSatish Balay void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
36517ede90eSSatish Balay {
36617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
36717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
36817ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
36917ede90eSSatish Balay }
3701eea217eSSatish Balay 
3712b40b63fSBarry Smith void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3721eea217eSSatish Balay {
3731eea217eSSatish Balay   char *t;
3741eea217eSSatish Balay 
3751eea217eSSatish Balay   FIXCHAR(prefix,len,t);
3761eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
3771eea217eSSatish Balay   FREECHAR(prefix,t);
3781eea217eSSatish Balay }
3791eea217eSSatish Balay 
380812c3f48SMatthew Knepley void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,Vec *out,PetscErrorCode *ierr)
381812c3f48SMatthew Knepley {
382812c3f48SMatthew Knepley   CHKFORTRANNULLOBJECT(out);
383812c3f48SMatthew Knepley   *ierr = MatNullSpaceRemove(*sp,*vec,out);
384812c3f48SMatthew Knepley }
3851eea217eSSatish Balay 
3865ba43861SSatish Balay void PETSC_STDCALL   matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr)
3875ba43861SSatish Balay {
3885ba43861SSatish Balay   *__ierr = MatGetInfo(*mat,*flag,info);
3895ba43861SSatish Balay }
3905ba43861SSatish Balay 
39122688b47SSatish Balay void PETSC_STDCALL   matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
39222688b47SSatish Balay {
39322688b47SSatish Balay   *__ierr = MatLUFactor(*mat,*row,*col,info);
39422688b47SSatish Balay }
39522688b47SSatish Balay 
39622688b47SSatish Balay void PETSC_STDCALL   matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
39722688b47SSatish Balay {
39822688b47SSatish Balay   *__ierr = MatILUFactor(*mat,*row,*col,info);
39922688b47SSatish Balay }
40022688b47SSatish Balay 
40122688b47SSatish Balay void PETSC_STDCALL   matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
40222688b47SSatish Balay {
40322688b47SSatish Balay   *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
40422688b47SSatish Balay }
40522688b47SSatish Balay 
40622688b47SSatish Balay void PETSC_STDCALL   matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
40722688b47SSatish Balay {
40822688b47SSatish Balay   *__ierr = MatLUFactorNumeric(*fact,*mat,info);
40922688b47SSatish Balay }
41022688b47SSatish Balay 
41122688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
41222688b47SSatish Balay {
41322688b47SSatish Balay   *__ierr = MatCholeskyFactor(*mat,*perm,info);
41422688b47SSatish Balay }
41522688b47SSatish Balay 
41622688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
41722688b47SSatish Balay {
41822688b47SSatish Balay   *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
41922688b47SSatish Balay }
42022688b47SSatish Balay 
42122688b47SSatish Balay void PETSC_STDCALL   matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr)
42222688b47SSatish Balay {
42322688b47SSatish Balay   *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
42422688b47SSatish Balay }
42522688b47SSatish Balay 
42622688b47SSatish Balay void PETSC_STDCALL   matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr)
42722688b47SSatish Balay {
42822688b47SSatish Balay   *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
42922688b47SSatish Balay }
43022688b47SSatish Balay 
43122688b47SSatish Balay void PETSC_STDCALL   maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr)
43222688b47SSatish Balay {
43322688b47SSatish Balay   *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
43422688b47SSatish Balay }
43522688b47SSatish Balay 
43622688b47SSatish Balay void PETSC_STDCALL   maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr)
43722688b47SSatish Balay {
43822688b47SSatish Balay   *__ierr = MatICCFactor(*mat,*row,info);
43922688b47SSatish Balay }
44022688b47SSatish Balay 
44122688b47SSatish Balay void PETSC_STDCALL   matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr)
44222688b47SSatish Balay {
44322688b47SSatish Balay   *__ierr = MatFactorInfoInitialize(info);
44422688b47SSatish Balay }
44522688b47SSatish Balay 
446f4e70085SSatish Balay EXTERN_C_END
447