xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 260663b818f2abac442f7a80362441c0f26c25a9)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2cee688dbSBarry Smith #include <petsc/private/f90impl.h>
3c6db04a5SJed Brown #include <petscmat.h>
4665c2dedSJed Brown #include <petscviewer.h>
5f4e70085SSatish Balay 
6f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
74d03fd2bSBarry Smith #define matsetvalues_                    MATSETVALUES
81006886cSSatish Balay #define matsetvaluesnnnn_                MATSETVALUESNNNN
93b494cfeSSatish Balay #define matsetvalues0_                   MATSETVALUES0
101b266c99SBarry Smith #define matsetvaluesnn1_                 MATSETVALUESNN1
114d03fd2bSBarry Smith #define matsetvalues11_                  MATSETVALUES11
124d03fd2bSBarry Smith #define matsetvalues1n_                  MATSETVALUES1N
134d03fd2bSBarry Smith #define matsetvaluesn1_                  MATSETVALUESN1
143b494cfeSSatish Balay #define matsetvaluesblocked0_            MATSETVALUESBLOCKED0
150aee3464SBarry Smith #define matsetvaluesblocked2_            MATSETVALUESBLOCKED2
164d03fd2bSBarry Smith #define matsetvaluesblocked11_           MATSETVALUESBLOCKED11
174d03fd2bSBarry Smith #define matsetvaluesblocked111_          MATSETVALUESBLOCKED111
184d03fd2bSBarry Smith #define matsetvaluesblocked1n_           MATSETVALUESBLOCKED1N
194d03fd2bSBarry Smith #define matsetvaluesblockedn1_           MATSETVALUESBLOCKEDN1
204d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        MATSETVALUESBLOCKEDLOCAL
213b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       MATSETVALUESBLOCKEDLOCAL0
224d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      MATSETVALUESBLOCKEDLOCAL11
234d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     MATSETVALUESBLOCKEDLOCAL111
244d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      MATSETVALUESBLOCKEDLOCAL1N
254d03fd2bSBarry Smith #define matsetvaluesblockedlocaln1_      MATSETVALUESBLOCKEDLOCALN1
264d03fd2bSBarry Smith #define matsetvalueslocal_               MATSETVALUESLOCAL
273b494cfeSSatish Balay #define matsetvalueslocal0_              MATSETVALUESLOCAL0
284d03fd2bSBarry Smith #define matsetvalueslocal11_             MATSETVALUESLOCAL11
294d03fd2bSBarry Smith #define matsetvalueslocal11nn_           MATSETVALUESLOCAL11NN
304d03fd2bSBarry Smith #define matsetvalueslocal111_            MATSETVALUESLOCAL111
314d03fd2bSBarry Smith #define matsetvalueslocal1n_             MATSETVALUESLOCAL1N
324d03fd2bSBarry Smith #define matsetvalueslocaln1_             MATSETVALUESLOCALN1
3387bcf4e0SBarry Smith #define matgetrowmin_                    MATGETROWMIN
3487bcf4e0SBarry Smith #define matgetrowminabs_                 MATGETROWMINABS
355928be6bSBarry Smith #define matgetrowmax_                    MATGETROWMAX
365928be6bSBarry Smith #define matgetrowmaxabs_                 MATGETROWMAXABS
377d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
38df750dc8SHong Zhang #define matdestroysubmatrices_           MATDESTROYSUBMATRICES
395dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
4035bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
41f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
42f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
43f4e70085SSatish Balay #define matgetrow_                       MATGETROW
44f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
45f7e310deSShri Abhyankar #define matload_                         MATLOAD
46f4e70085SSatish Balay #define matview_                         MATVIEW
478c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
486778691eSSatish Balay #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
498c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
508c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
51f4e70085SSatish Balay #define matconvert_                      MATCONVERT
527dae84e0SHong Zhang #define matcreatesubmatrices_            MATCREATESUBMATRICES
5317ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
5417ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
5517ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
56d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
57f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
58f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
59f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
60f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
6117ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
6217ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
631eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
64fcc9d04bSBarry Smith #define matcreatevecs_                   MATCREATEVECS
65c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
665ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
6722688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
6822688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
6922688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
7022688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
7122688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
7222688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
7322688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
7422688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
7522688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
7622688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
7722688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
78b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
790905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
803be0408cSBarry Smith #define matgetsize00_                    MATGETSIZE00
813be0408cSBarry Smith #define matgetsize10_                    MATGETSIZE10
823be0408cSBarry Smith #define matgetsize01_                    MATGETSIZE01
833be0408cSBarry Smith #define matgetlocalsize00_               MATGETLOCALSIZE00
843be0408cSBarry Smith #define matgetlocalsize10_               MATGETLOCALSIZE10
853be0408cSBarry Smith #define matgetlocalsize01_               MATGETLOCALSIZE01
86*260663b8SBarry Smith #define matgetnullspace_                 MATGETNULLSPACE
87*260663b8SBarry Smith #define matsetnullspace_                 MATSETNULLSPACE
88*260663b8SBarry Smith #define matgetownershiprange_            MATGETOWNERSHIPRANGE
89f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
904d03fd2bSBarry Smith #define matsetvalues_                    matsetvalues
911006886cSSatish Balay #define matsetvaluesnnnn_                matsetvaluesnnnn
923b494cfeSSatish Balay #define matsetvalues0_                   matsetvalues0
931b266c99SBarry Smith #define matsetvaluesnn1_                 matsetvaluesnn1
944d03fd2bSBarry Smith #define matsetvalues11_                  matsetvalues11
954d03fd2bSBarry Smith #define matsetvaluesn1_                  matsetvaluesn1
964d03fd2bSBarry Smith #define matsetvalues1n_                  matsetvalues1n
974d03fd2bSBarry Smith #define matsetvalueslocal_               matsetvalueslocal
983b494cfeSSatish Balay #define matsetvalueslocal0_              matsetvalueslocal0
994d03fd2bSBarry Smith #define matsetvalueslocal11_             matsetvalueslocal11
1004d03fd2bSBarry Smith #define matsetvalueslocal11nn_           matsetvalueslocal11nn
1014d03fd2bSBarry Smith #define matsetvalueslocal111_            matsetvalueslocal111
1024d03fd2bSBarry Smith #define matsetvalueslocal1n_             matsetvalueslocal1n
1034d03fd2bSBarry Smith #define matsetvalueslocaln1_             matsetvalueslocaln1
1044d03fd2bSBarry Smith #define matsetvaluesblocked_             matsetvaluesblocked
1053b494cfeSSatish Balay #define matsetvaluesblocked0_            matsetvaluesblocked0
1060aee3464SBarry Smith #define matsetvaluesblocked2_            matsetvaluesblocked2
1074d03fd2bSBarry Smith #define matsetvaluesblocked11_           matsetvaluesblocked11
1084d03fd2bSBarry Smith #define matsetvaluesblocked111_          matsetvaluesblocked111
1094d03fd2bSBarry Smith #define matsetvaluesblocked1n_           matsetvaluesblocked1n
11024aa916eSSatish Balay #define matsetvaluesblockedn1_           matsetvaluesblockedn1
1114d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        matsetvaluesblockedlocal
1123b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       matsetvaluesblockedlocal0
1134d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      matsetvaluesblockedlocal11
1144d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     matsetvaluesblockedlocal111
1154d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      matsetvaluesblockedlocal1n
11624aa916eSSatish Balay #define matsetvaluesblockedlocaln1_      matsetvaluesblockedlocaln1
11787bcf4e0SBarry Smith #define matgetrowmin_                    matgetrowmin
11887bcf4e0SBarry Smith #define matgetrowminabs_                 matgetrowminabs
1195928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
1205928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
1215928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
122df750dc8SHong Zhang #define matdestroysubmatrices_           matdestroysubmatrices
1235dffd610SBarry Smith #define matgetfactor_                    matgetfactor
12435bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
125fcc9d04bSBarry Smith #define matcreatevecs_                   matcreatevecs
126f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
127f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
128f4e70085SSatish Balay #define matgetrow_                       matgetrow
129f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
130f4e70085SSatish Balay #define matview_                         matview
131f7e310deSShri Abhyankar #define matload_                         matload
1328c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
1338c778c55SBarry Smith #define matseqaijrestorearray_           matseqaijrestorearray
1348c778c55SBarry Smith #define matdensegetarray_                matdensegetarray
1358c778c55SBarry Smith #define matdenserestorearray_            matdenserestorearray
136f4e70085SSatish Balay #define matconvert_                      matconvert
1377dae84e0SHong Zhang #define matcreatesubmatrices_            matcreatesubmatrices
13817ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
13917ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
14017ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
141d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
142f4e70085SSatish Balay #define matzerorows_                     matzerorows
143f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
144f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
145f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
14617ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
14717ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
1481eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
149812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
1505ba43861SSatish Balay #define matgetinfo_                      matgetinfo
15122688b47SSatish Balay #define matlufactor_                     matlufactor
15222688b47SSatish Balay #define matilufactor_                    matilufactor
15322688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
15422688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
15522688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
15622688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
15722688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
15822688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
15922688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
16022688b47SSatish Balay #define maticcfactor_                    maticcfactor
16122688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
162b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
1630905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
1643be0408cSBarry Smith #define matgetsize00_                    matgetsize00
1653be0408cSBarry Smith #define matgetsize10_                    matgetsize10
1663be0408cSBarry Smith #define matgetsize01_                    matgetsize01
1673be0408cSBarry Smith #define matgetlocalsize00_               matgetlocalsize00
1683be0408cSBarry Smith #define matgetlocalsize10_               matgetlocalsize10
1693be0408cSBarry Smith #define matgetlocalsize01_               matgetlocalsize01
170*260663b8SBarry Smith #define matgetnullspace_                 matgetnullspace
171*260663b8SBarry Smith #define matsetnullspace_                 matsetnullspace
172*260663b8SBarry Smith #define matgetownershiprange_            matgetownershiprange
173f4e70085SSatish Balay #endif
174f4e70085SSatish Balay 
175*260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
176*260663b8SBarry Smith {
177*260663b8SBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(nullsp);
178*260663b8SBarry Smith   *ierr = MatSetNullSpace(*mat,*nullsp);
179*260663b8SBarry Smith }
180*260663b8SBarry Smith 
181*260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
182*260663b8SBarry Smith {
183*260663b8SBarry Smith   MatNullSpace sp;
184*260663b8SBarry Smith   *ierr = MatGetNullSpace(*mat,&sp);if (*ierr) return;
185*260663b8SBarry Smith   if (!sp) {
186*260663b8SBarry Smith     *nullsp = (MatNullSpace) -1;
187*260663b8SBarry Smith   } else {
188*260663b8SBarry Smith     *nullsp = sp;
189*260663b8SBarry Smith   }
190*260663b8SBarry Smith }
191*260663b8SBarry Smith 
192*260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
193*260663b8SBarry Smith {
194*260663b8SBarry Smith   CHKFORTRANNULLINTEGER(m);
195*260663b8SBarry Smith   CHKFORTRANNULLINTEGER(n);
196*260663b8SBarry Smith   *ierr = MatGetOwnershipRange(*mat,m,n);
197*260663b8SBarry Smith }
198*260663b8SBarry Smith 
1993be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2003be0408cSBarry Smith {
2013be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2023be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2033be0408cSBarry Smith   *ierr = MatGetSize(*mat,m,n);
2043be0408cSBarry Smith }
2053be0408cSBarry Smith 
2063be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2073be0408cSBarry Smith {
2083be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2093be0408cSBarry Smith }
2103be0408cSBarry Smith 
2113be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2123be0408cSBarry Smith {
2133be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2143be0408cSBarry Smith }
2153be0408cSBarry Smith 
2163be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2173be0408cSBarry Smith {
2183be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2193be0408cSBarry Smith }
2203be0408cSBarry Smith 
2213be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2223be0408cSBarry Smith {
2233be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2243be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2253be0408cSBarry Smith   *ierr = MatGetLocalSize(*mat,m,n);
2263be0408cSBarry Smith }
2273be0408cSBarry Smith 
2283be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2293be0408cSBarry Smith {
2303be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2313be0408cSBarry Smith }
2323be0408cSBarry Smith 
2333be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2343be0408cSBarry Smith {
2353be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2363be0408cSBarry Smith }
2373be0408cSBarry Smith 
2383be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2393be0408cSBarry Smith {
2403be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2413be0408cSBarry Smith }
2423be0408cSBarry Smith 
2434d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2444d03fd2bSBarry Smith   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
2454d03fd2bSBarry Smith }
2464d03fd2bSBarry Smith 
247cee688dbSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked2_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], F90Array2d *y,InsertMode *addv, int *ierr PETSC_F90_2PTR_PROTO(ptrd)){
248cee688dbSBarry Smith   PetscScalar *fa;
2490aee3464SBarry Smith   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
250cee688dbSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
251cee688dbSBarry Smith }
252cee688dbSBarry Smith 
2533b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2543b494cfeSSatish Balay   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2553b494cfeSSatish Balay }
2563b494cfeSSatish Balay 
2574d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2584d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2594d03fd2bSBarry Smith }
2604d03fd2bSBarry Smith 
2614d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2624d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2634d03fd2bSBarry Smith }
2644d03fd2bSBarry Smith 
2654d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2664d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2674d03fd2bSBarry Smith }
2684d03fd2bSBarry Smith 
2694d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2704d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2714d03fd2bSBarry Smith }
2724d03fd2bSBarry Smith 
2734d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
2744d03fd2bSBarry Smith {
2754d03fd2bSBarry Smith   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
2764d03fd2bSBarry Smith }
2774d03fd2bSBarry Smith 
2783b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2793b494cfeSSatish Balay   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2803b494cfeSSatish Balay }
2813b494cfeSSatish Balay 
2824d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2834d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2844d03fd2bSBarry Smith }
2854d03fd2bSBarry Smith 
2864d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2874d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2884d03fd2bSBarry Smith }
2894d03fd2bSBarry Smith 
2904d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2914d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2924d03fd2bSBarry Smith }
2934d03fd2bSBarry Smith 
2944d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocaln1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2954d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2964d03fd2bSBarry Smith }
2974d03fd2bSBarry Smith 
2984d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
2994d03fd2bSBarry Smith {
3004d03fd2bSBarry Smith   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
3014d03fd2bSBarry Smith }
3024d03fd2bSBarry Smith 
3031b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3041b266c99SBarry Smith {
3051b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3061b266c99SBarry Smith }
3071b266c99SBarry Smith 
3083b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3093b494cfeSSatish Balay {
3103b494cfeSSatish Balay   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3113b494cfeSSatish Balay }
3123b494cfeSSatish Balay 
3131b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3141b266c99SBarry Smith {
3151b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3161b266c99SBarry Smith }
3171b266c99SBarry Smith 
3184d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3194d03fd2bSBarry Smith {
3204d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3214d03fd2bSBarry Smith }
3224d03fd2bSBarry Smith 
3234d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3244d03fd2bSBarry Smith {
3254d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3264d03fd2bSBarry Smith }
3274d03fd2bSBarry Smith 
3284d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3294d03fd2bSBarry Smith {
3304d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3314d03fd2bSBarry Smith }
3324d03fd2bSBarry Smith 
3334d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3344d03fd2bSBarry Smith {
3354d03fd2bSBarry Smith   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
3364d03fd2bSBarry Smith }
3374d03fd2bSBarry Smith 
3383b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3393b494cfeSSatish Balay {
3403b494cfeSSatish Balay   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3413b494cfeSSatish Balay }
3423b494cfeSSatish Balay 
3434d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3444d03fd2bSBarry Smith {
3454d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3464d03fd2bSBarry Smith }
3474d03fd2bSBarry Smith 
3484d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11nn_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3494d03fd2bSBarry Smith {
3504d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3514d03fd2bSBarry Smith }
3524d03fd2bSBarry Smith 
3534d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal111_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3544d03fd2bSBarry Smith {
3554d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3564d03fd2bSBarry Smith }
3574d03fd2bSBarry Smith 
3584d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal1n_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3594d03fd2bSBarry Smith {
3604d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3614d03fd2bSBarry Smith }
3624d03fd2bSBarry Smith 
3634d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3644d03fd2bSBarry Smith {
3654d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3664d03fd2bSBarry Smith }
3674d03fd2bSBarry Smith 
36887bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
36987bcf4e0SBarry Smith {
37087bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
37187bcf4e0SBarry Smith   *ierr = MatGetRowMin(*mat,*v,idx);
37287bcf4e0SBarry Smith }
3734d03fd2bSBarry Smith 
37487bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
37587bcf4e0SBarry Smith {
37687bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
37787bcf4e0SBarry Smith   *ierr = MatGetRowMinAbs(*mat,*v,idx);
37887bcf4e0SBarry Smith }
37987bcf4e0SBarry Smith 
3805928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3815928be6bSBarry Smith {
3825928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
3835928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
3845928be6bSBarry Smith }
3855928be6bSBarry Smith 
3865928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3875928be6bSBarry Smith {
3885928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
3895928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
3905928be6bSBarry Smith }
3915928be6bSBarry Smith 
392b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
393b22b330cSBarry Smith {
394b22b330cSBarry Smith   PetscErrorCode ierr = 0;
395b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
396b22b330cSBarry Smith   return 0;
397b22b330cSBarry Smith }
398b22b330cSBarry Smith 
3998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
400b22b330cSBarry Smith {
401b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
402b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
40326fbe8dcSKarl Rupp 
404b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
405b22b330cSBarry Smith }
406b22b330cSBarry Smith 
407d2da0f5dSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
4087c54600cSBarry Smith {
4097c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
4107c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
4112a7a6963SBarry Smith   *ierr = MatCreateVecs(*mat,right,left);
4127c54600cSBarry Smith }
4137c54600cSBarry Smith 
4148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
415ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
416f4e70085SSatish Balay {
4171a83f524SJed Brown   const PetscInt *IA,*JA;
4188f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
4191a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
4201a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
421f4e70085SSatish Balay }
422f4e70085SSatish Balay 
4238cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
424ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
425f4e70085SSatish Balay {
4261a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
4278f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
428f4e70085SSatish Balay }
429f4e70085SSatish Balay 
430f4e70085SSatish Balay /*
431f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
432f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
433f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
434f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
435f4e70085SSatish Balay   at a time.
436f4e70085SSatish Balay */
437f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
438f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
439f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
440f4e70085SSatish Balay 
4418cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
442f4e70085SSatish Balay {
443f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
444f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
445f4e70085SSatish Balay 
446f4e70085SSatish Balay   if (matgetrowactive) {
447efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
448f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
449f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
450f4e70085SSatish Balay     *ierr = 1;
451f4e70085SSatish Balay     return;
452f4e70085SSatish Balay   }
453f4e70085SSatish Balay 
4540298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4550298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
456f4e70085SSatish Balay 
457f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
458f4e70085SSatish Balay   if (*ierr) return;
459f4e70085SSatish Balay 
460f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
461f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
462f4e70085SSatish Balay   matgetrowactive = 1;
463f4e70085SSatish Balay }
464f4e70085SSatish Balay 
4658cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
466f4e70085SSatish Balay {
467f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
468f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
469f4e70085SSatish Balay   if (!matgetrowactive) {
470efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
471f4e70085SSatish Balay                "Must call MatGetRow() first");
472f4e70085SSatish Balay     *ierr = 1;
473f4e70085SSatish Balay     return;
474f4e70085SSatish Balay   }
4750298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4760298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
477f4e70085SSatish Balay 
478f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
479f4e70085SSatish Balay   matgetrowactive = 0;
480f4e70085SSatish Balay }
481f4e70085SSatish Balay 
4828cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
483f4e70085SSatish Balay {
484f4e70085SSatish Balay   PetscViewer v;
485f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
486f4e70085SSatish Balay   *ierr = MatView(*mat,v);
487f4e70085SSatish Balay }
488f4e70085SSatish Balay 
4898cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
490f7e310deSShri Abhyankar {
491f7e310deSShri Abhyankar   PetscViewer v;
492f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
493112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
494f7e310deSShri Abhyankar }
495f7e310deSShri Abhyankar 
4968cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
497f4e70085SSatish Balay {
498f4e70085SSatish Balay   PetscScalar *mm;
499f4e70085SSatish Balay   PetscInt    m,n;
500f4e70085SSatish Balay 
5018c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
502f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
503f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
504f4e70085SSatish Balay }
505f4e70085SSatish Balay 
5068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
507f4e70085SSatish Balay {
508f4e70085SSatish Balay   PetscScalar *lx;
509f4e70085SSatish Balay   PetscInt    m,n;
510f4e70085SSatish Balay 
511f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
512f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5138c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
514f4e70085SSatish Balay }
515f4e70085SSatish Balay 
5168cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
51773a71a0fSBarry Smith {
51873a71a0fSBarry Smith   PetscScalar *mm;
51973a71a0fSBarry Smith   PetscInt    m,n;
52073a71a0fSBarry Smith 
5218c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
52273a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
52373a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
52473a71a0fSBarry Smith }
52573a71a0fSBarry Smith 
5268cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
52773a71a0fSBarry Smith {
52873a71a0fSBarry Smith   PetscScalar *lx;
52973a71a0fSBarry Smith   PetscInt    m,n;
53073a71a0fSBarry Smith 
53173a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
53273a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5338c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
53473a71a0fSBarry Smith }
53573a71a0fSBarry Smith 
536390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
53735bd34faSBarry Smith {
53835bd34faSBarry Smith   const char *tname;
53935bd34faSBarry Smith 
54035bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
54135bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
54235bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
54335bd34faSBarry Smith   }
54435bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
54535bd34faSBarry Smith }
54635bd34faSBarry Smith 
547390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,char* outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
5485dffd610SBarry Smith {
5495dffd610SBarry Smith   char *t;
5505dffd610SBarry Smith   FIXCHAR(outtype,len,t);
5519be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
5525dffd610SBarry Smith   FREECHAR(outtype,t);
5535dffd610SBarry Smith }
5545dffd610SBarry Smith 
555390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,char* outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
556f4e70085SSatish Balay {
557f4e70085SSatish Balay   char *t;
558f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
559f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
560f4e70085SSatish Balay   FREECHAR(outtype,t);
561f4e70085SSatish Balay }
562f4e70085SSatish Balay 
563f4e70085SSatish Balay /*
5647dae84e0SHong Zhang     MatCreateSubmatrices() is slightly different from C since the
565f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
5667dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
567f4e70085SSatish Balay */
5687dae84e0SHong Zhang PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
569f4e70085SSatish Balay {
570f4e70085SSatish Balay   Mat      *lsmat;
571f4e70085SSatish Balay   PetscInt i;
572f4e70085SSatish Balay 
573f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
5747dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
575de7ef04eSHong Zhang     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
576f4e70085SSatish Balay       smat[i] = lsmat[i];
577f4e70085SSatish Balay     }
578f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
579f4e70085SSatish Balay   } else {
5807dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
581f4e70085SSatish Balay   }
582f4e70085SSatish Balay }
583f4e70085SSatish Balay 
5847d6bfa3bSBarry Smith /*
5857d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
586de7ef04eSHong Zhang     Fortran does not free the array of matrix objects, while in C that
587de7ef04eSHong Zhang     the array is freed
588de7ef04eSHong Zhang */
589de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
590de7ef04eSHong Zhang {
591de7ef04eSHong Zhang   PetscInt i;
592de7ef04eSHong Zhang 
593de7ef04eSHong Zhang   for (i=0; i<*n; i++) {
594de7ef04eSHong Zhang     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
595de7ef04eSHong Zhang   }
596de7ef04eSHong Zhang }
597de7ef04eSHong Zhang 
598de7ef04eSHong Zhang /*
599de7ef04eSHong Zhang     MatDestroySubMatrices() is slightly different from C since the
6007d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects, while in C that
6017dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
6027d6bfa3bSBarry Smith */
603de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
6047d6bfa3bSBarry Smith {
605de7ef04eSHong Zhang   Mat      *lsmat;
6067d6bfa3bSBarry Smith   PetscInt i;
6077d6bfa3bSBarry Smith 
608de7ef04eSHong Zhang   *ierr = PetscMalloc1(*n+1,&lsmat);
609de7ef04eSHong Zhang   for (i=0; i<=*n; i++) {
610de7ef04eSHong Zhang       lsmat[i] = smat[i];
6117d6bfa3bSBarry Smith   }
612de7ef04eSHong Zhang   *ierr = MatDestroySubMatrices(*n,&lsmat);
613df750dc8SHong Zhang }
614df750dc8SHong Zhang 
6158cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
61617ede90eSSatish Balay {
61717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
61817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
61917ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
62017ede90eSSatish Balay }
62117ede90eSSatish Balay 
6228cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
62317ede90eSSatish Balay {
62417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
62517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
62617ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
62717ede90eSSatish Balay }
62817ede90eSSatish Balay 
6298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
63017ede90eSSatish Balay {
63117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
63217ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
63317ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
63417ede90eSSatish Balay }
63517ede90eSSatish Balay 
6368cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
637d25a37e1SJed Brown {
638d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
639d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
640d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
641d25a37e1SJed Brown }
642d25a37e1SJed Brown 
6438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
644f4e70085SSatish Balay {
6452b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6462b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6472b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
648f4e70085SSatish Balay }
649f4e70085SSatish Balay 
6508cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
651f4e70085SSatish Balay {
6522b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6532b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6542b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
655f4e70085SSatish Balay }
656f4e70085SSatish Balay 
6578cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
658f4e70085SSatish Balay {
6592b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6602b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6612b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
662f4e70085SSatish Balay }
663f4e70085SSatish Balay 
6648cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
665f4e70085SSatish Balay {
6662b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6672b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6682b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
669f4e70085SSatish Balay }
670f4e70085SSatish Balay 
6718cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
67217ede90eSSatish Balay {
67317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
67417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
67517ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
67617ede90eSSatish Balay }
67717ede90eSSatish Balay 
6788cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
67917ede90eSSatish Balay {
68017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
68117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
68217ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
68317ede90eSSatish Balay }
6841eea217eSSatish Balay 
685390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
6861eea217eSSatish Balay {
6871eea217eSSatish Balay   char *t;
6881eea217eSSatish Balay 
6891eea217eSSatish Balay   FIXCHAR(prefix,len,t);
6901eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
6911eea217eSSatish Balay   FREECHAR(prefix,t);
6921eea217eSSatish Balay }
6931eea217eSSatish Balay 
694d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
695812c3f48SMatthew Knepley {
696*260663b8SBarry Smith   CHKFORTRANNULLOBJECT(*sp)
697d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
698812c3f48SMatthew Knepley }
6991eea217eSSatish Balay 
7004d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
7015ba43861SSatish Balay {
7024d03fd2bSBarry Smith   *ierr = MatGetInfo(*mat,*flag,info);
7035ba43861SSatish Balay }
7045ba43861SSatish Balay 
7054d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
70622688b47SSatish Balay {
7074d03fd2bSBarry Smith   *ierr = MatLUFactor(*mat,*row,*col,info);
70822688b47SSatish Balay }
70922688b47SSatish Balay 
7104d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
71122688b47SSatish Balay {
7124d03fd2bSBarry Smith   *ierr = MatILUFactor(*mat,*row,*col,info);
71322688b47SSatish Balay }
71422688b47SSatish Balay 
7154d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
71622688b47SSatish Balay {
7174d03fd2bSBarry Smith   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
71822688b47SSatish Balay }
71922688b47SSatish Balay 
7204d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
72122688b47SSatish Balay {
7224d03fd2bSBarry Smith   *ierr = MatLUFactorNumeric(*fact,*mat,info);
72322688b47SSatish Balay }
72422688b47SSatish Balay 
7254d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
72622688b47SSatish Balay {
7274d03fd2bSBarry Smith   *ierr = MatCholeskyFactor(*mat,*perm,info);
72822688b47SSatish Balay }
72922688b47SSatish Balay 
7304d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
73122688b47SSatish Balay {
7324d03fd2bSBarry Smith   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
73322688b47SSatish Balay }
73422688b47SSatish Balay 
7354d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
73622688b47SSatish Balay {
7374d03fd2bSBarry Smith   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
73822688b47SSatish Balay }
73922688b47SSatish Balay 
7404d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
74122688b47SSatish Balay {
7424d03fd2bSBarry Smith   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
74322688b47SSatish Balay }
74422688b47SSatish Balay 
7454d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
74622688b47SSatish Balay {
7474d03fd2bSBarry Smith   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
74822688b47SSatish Balay }
74922688b47SSatish Balay 
7504d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
75122688b47SSatish Balay {
7524d03fd2bSBarry Smith   *ierr = MatICCFactor(*mat,*row,info);
75322688b47SSatish Balay }
75422688b47SSatish Balay 
7554d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
75622688b47SSatish Balay {
7574d03fd2bSBarry Smith   *ierr = MatFactorInfoInitialize(info);
75822688b47SSatish Balay }
759