xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 954bb43766f6b3dc2c658bd80dcfb7cfc45cc9c2)
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
508572280aSBarry Smith #define matdensegetarrayread_            MATDENSEGETARRAYREAD
518c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
528572280aSBarry Smith #define matdenserestorearrayread_        MATDENSERESTOREARRAYREAD
53f4e70085SSatish Balay #define matconvert_                      MATCONVERT
547dae84e0SHong Zhang #define matcreatesubmatrices_            MATCREATESUBMATRICES
5517ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
5617ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
5717ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
58d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
59f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
60f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
61f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
62f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
6317ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
6417ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
651eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
66fcc9d04bSBarry Smith #define matcreatevecs_                   MATCREATEVECS
67c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
685ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
6922688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
7022688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
7122688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
7222688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
7322688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
7422688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
7522688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
7622688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
7722688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
7822688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
7922688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
80b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
810905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
823be0408cSBarry Smith #define matgetsize00_                    MATGETSIZE00
833be0408cSBarry Smith #define matgetsize10_                    MATGETSIZE10
843be0408cSBarry Smith #define matgetsize01_                    MATGETSIZE01
853be0408cSBarry Smith #define matgetlocalsize00_               MATGETLOCALSIZE00
863be0408cSBarry Smith #define matgetlocalsize10_               MATGETLOCALSIZE10
873be0408cSBarry Smith #define matgetlocalsize01_               MATGETLOCALSIZE01
88260663b8SBarry Smith #define matgetnullspace_                 MATGETNULLSPACE
89260663b8SBarry Smith #define matsetnullspace_                 MATSETNULLSPACE
90260663b8SBarry Smith #define matgetownershiprange_            MATGETOWNERSHIPRANGE
91afc39838SBarry Smith #define matgetownershiprangecolumn_      MATGETOWNERSHIPRANGECOLUMN
92f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
934d03fd2bSBarry Smith #define matsetvalues_                    matsetvalues
941006886cSSatish Balay #define matsetvaluesnnnn_                matsetvaluesnnnn
953b494cfeSSatish Balay #define matsetvalues0_                   matsetvalues0
961b266c99SBarry Smith #define matsetvaluesnn1_                 matsetvaluesnn1
974d03fd2bSBarry Smith #define matsetvalues11_                  matsetvalues11
984d03fd2bSBarry Smith #define matsetvaluesn1_                  matsetvaluesn1
994d03fd2bSBarry Smith #define matsetvalues1n_                  matsetvalues1n
1004d03fd2bSBarry Smith #define matsetvalueslocal_               matsetvalueslocal
1013b494cfeSSatish Balay #define matsetvalueslocal0_              matsetvalueslocal0
1024d03fd2bSBarry Smith #define matsetvalueslocal11_             matsetvalueslocal11
1034d03fd2bSBarry Smith #define matsetvalueslocal11nn_           matsetvalueslocal11nn
1044d03fd2bSBarry Smith #define matsetvalueslocal111_            matsetvalueslocal111
1054d03fd2bSBarry Smith #define matsetvalueslocal1n_             matsetvalueslocal1n
1064d03fd2bSBarry Smith #define matsetvalueslocaln1_             matsetvalueslocaln1
1074d03fd2bSBarry Smith #define matsetvaluesblocked_             matsetvaluesblocked
1083b494cfeSSatish Balay #define matsetvaluesblocked0_            matsetvaluesblocked0
1090aee3464SBarry Smith #define matsetvaluesblocked2_            matsetvaluesblocked2
1104d03fd2bSBarry Smith #define matsetvaluesblocked11_           matsetvaluesblocked11
1114d03fd2bSBarry Smith #define matsetvaluesblocked111_          matsetvaluesblocked111
1124d03fd2bSBarry Smith #define matsetvaluesblocked1n_           matsetvaluesblocked1n
11324aa916eSSatish Balay #define matsetvaluesblockedn1_           matsetvaluesblockedn1
1144d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        matsetvaluesblockedlocal
1153b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       matsetvaluesblockedlocal0
1164d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      matsetvaluesblockedlocal11
1174d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     matsetvaluesblockedlocal111
1184d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      matsetvaluesblockedlocal1n
11924aa916eSSatish Balay #define matsetvaluesblockedlocaln1_      matsetvaluesblockedlocaln1
12087bcf4e0SBarry Smith #define matgetrowmin_                    matgetrowmin
12187bcf4e0SBarry Smith #define matgetrowminabs_                 matgetrowminabs
1225928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
1235928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
1245928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
125df750dc8SHong Zhang #define matdestroysubmatrices_           matdestroysubmatrices
1265dffd610SBarry Smith #define matgetfactor_                    matgetfactor
12735bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
128fcc9d04bSBarry Smith #define matcreatevecs_                   matcreatevecs
129f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
130f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
131f4e70085SSatish Balay #define matgetrow_                       matgetrow
132f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
133f4e70085SSatish Balay #define matview_                         matview
134f7e310deSShri Abhyankar #define matload_                         matload
1358c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
1368c778c55SBarry Smith #define matseqaijrestorearray_           matseqaijrestorearray
1378c778c55SBarry Smith #define matdensegetarray_                matdensegetarray
1388572280aSBarry Smith #define matdensegetarrayread_            matdensegetarrayread
1398c778c55SBarry Smith #define matdenserestorearray_            matdenserestorearray
1408572280aSBarry Smith #define matdenserestorearrayread_        matdenserestorearrayread
141f4e70085SSatish Balay #define matconvert_                      matconvert
1427dae84e0SHong Zhang #define matcreatesubmatrices_            matcreatesubmatrices
14317ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
14417ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
14517ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
146d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
147f4e70085SSatish Balay #define matzerorows_                     matzerorows
148f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
149f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
150f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
15117ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
15217ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
1531eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
154812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
1555ba43861SSatish Balay #define matgetinfo_                      matgetinfo
15622688b47SSatish Balay #define matlufactor_                     matlufactor
15722688b47SSatish Balay #define matilufactor_                    matilufactor
15822688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
15922688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
16022688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
16122688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
16222688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
16322688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
16422688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
16522688b47SSatish Balay #define maticcfactor_                    maticcfactor
16622688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
167b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
1680905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
1693be0408cSBarry Smith #define matgetsize00_                    matgetsize00
1703be0408cSBarry Smith #define matgetsize10_                    matgetsize10
1713be0408cSBarry Smith #define matgetsize01_                    matgetsize01
1723be0408cSBarry Smith #define matgetlocalsize00_               matgetlocalsize00
1733be0408cSBarry Smith #define matgetlocalsize10_               matgetlocalsize10
1743be0408cSBarry Smith #define matgetlocalsize01_               matgetlocalsize01
175260663b8SBarry Smith #define matgetnullspace_                 matgetnullspace
176260663b8SBarry Smith #define matsetnullspace_                 matsetnullspace
177260663b8SBarry Smith #define matgetownershiprange_            matgetownershiprange
178afc39838SBarry Smith #define matgetownershiprangecolumn_      matgetownershiprangecolumn
179f4e70085SSatish Balay #endif
180f4e70085SSatish Balay 
181260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
182260663b8SBarry Smith {
183260663b8SBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(nullsp);
184260663b8SBarry Smith   *ierr = MatSetNullSpace(*mat,*nullsp);
185260663b8SBarry Smith }
186260663b8SBarry Smith 
187260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
188260663b8SBarry Smith {
189260663b8SBarry Smith   MatNullSpace sp;
190260663b8SBarry Smith   *ierr = MatGetNullSpace(*mat,&sp);if (*ierr) return;
191260663b8SBarry Smith   if (!sp) {
192260663b8SBarry Smith     *nullsp = (MatNullSpace) -1;
193260663b8SBarry Smith   } else {
194260663b8SBarry Smith     *nullsp = sp;
195260663b8SBarry Smith   }
196260663b8SBarry Smith }
197260663b8SBarry Smith 
198260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
199260663b8SBarry Smith {
200260663b8SBarry Smith   CHKFORTRANNULLINTEGER(m);
201260663b8SBarry Smith   CHKFORTRANNULLINTEGER(n);
202260663b8SBarry Smith   *ierr = MatGetOwnershipRange(*mat,m,n);
203260663b8SBarry Smith }
204260663b8SBarry Smith 
205afc39838SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprangecolumn_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
206afc39838SBarry Smith {
207afc39838SBarry Smith   CHKFORTRANNULLINTEGER(m);
208afc39838SBarry Smith   CHKFORTRANNULLINTEGER(n);
209afc39838SBarry Smith   *ierr = MatGetOwnershipRangeColumn(*mat,m,n);
210afc39838SBarry Smith }
211afc39838SBarry Smith 
2123be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2133be0408cSBarry Smith {
2143be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2153be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2163be0408cSBarry Smith   *ierr = MatGetSize(*mat,m,n);
2173be0408cSBarry Smith }
2183be0408cSBarry Smith 
2193be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2203be0408cSBarry Smith {
2213be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2223be0408cSBarry Smith }
2233be0408cSBarry Smith 
2243be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2253be0408cSBarry Smith {
2263be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2273be0408cSBarry Smith }
2283be0408cSBarry Smith 
2293be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2303be0408cSBarry Smith {
2313be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2323be0408cSBarry Smith }
2333be0408cSBarry Smith 
2343be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2353be0408cSBarry Smith {
2363be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2373be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2383be0408cSBarry Smith   *ierr = MatGetLocalSize(*mat,m,n);
2393be0408cSBarry Smith }
2403be0408cSBarry Smith 
2413be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2423be0408cSBarry Smith {
2433be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2443be0408cSBarry Smith }
2453be0408cSBarry Smith 
2463be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2473be0408cSBarry Smith {
2483be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2493be0408cSBarry Smith }
2503be0408cSBarry Smith 
2513be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2523be0408cSBarry Smith {
2533be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2543be0408cSBarry Smith }
2553be0408cSBarry Smith 
2564d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2574d03fd2bSBarry Smith   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
2584d03fd2bSBarry Smith }
2594d03fd2bSBarry Smith 
260cee688dbSBarry 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)){
261cee688dbSBarry Smith   PetscScalar *fa;
2620aee3464SBarry Smith   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
263cee688dbSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
264cee688dbSBarry Smith }
265cee688dbSBarry Smith 
2663b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2673b494cfeSSatish Balay   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2683b494cfeSSatish Balay }
2693b494cfeSSatish Balay 
2704d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2714d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2724d03fd2bSBarry Smith }
2734d03fd2bSBarry Smith 
2744d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2754d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2764d03fd2bSBarry Smith }
2774d03fd2bSBarry Smith 
2784d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2794d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2804d03fd2bSBarry Smith }
2814d03fd2bSBarry Smith 
2824d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2834d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2844d03fd2bSBarry Smith }
2854d03fd2bSBarry Smith 
2864d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
2874d03fd2bSBarry Smith {
2884d03fd2bSBarry Smith   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
2894d03fd2bSBarry Smith }
2904d03fd2bSBarry Smith 
2913b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2923b494cfeSSatish Balay   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2933b494cfeSSatish Balay }
2943b494cfeSSatish Balay 
2954d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2964d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2974d03fd2bSBarry Smith }
2984d03fd2bSBarry Smith 
2994d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3004d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3014d03fd2bSBarry Smith }
3024d03fd2bSBarry Smith 
3034d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3044d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3054d03fd2bSBarry Smith }
3064d03fd2bSBarry Smith 
3074d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocaln1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3084d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3094d03fd2bSBarry Smith }
3104d03fd2bSBarry Smith 
3114d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3124d03fd2bSBarry Smith {
3134d03fd2bSBarry Smith   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
3144d03fd2bSBarry Smith }
3154d03fd2bSBarry Smith 
3161b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3171b266c99SBarry Smith {
3181b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3191b266c99SBarry Smith }
3201b266c99SBarry Smith 
3213b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3223b494cfeSSatish Balay {
3233b494cfeSSatish Balay   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3243b494cfeSSatish Balay }
3253b494cfeSSatish Balay 
3261b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3271b266c99SBarry Smith {
3281b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3291b266c99SBarry Smith }
3301b266c99SBarry Smith 
3314d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3324d03fd2bSBarry Smith {
3334d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3344d03fd2bSBarry Smith }
3354d03fd2bSBarry Smith 
3364d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3374d03fd2bSBarry Smith {
3384d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3394d03fd2bSBarry Smith }
3404d03fd2bSBarry Smith 
3414d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3424d03fd2bSBarry Smith {
3434d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3444d03fd2bSBarry Smith }
3454d03fd2bSBarry Smith 
3464d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3474d03fd2bSBarry Smith {
3484d03fd2bSBarry Smith   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
3494d03fd2bSBarry Smith }
3504d03fd2bSBarry Smith 
3513b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3523b494cfeSSatish Balay {
3533b494cfeSSatish Balay   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3543b494cfeSSatish Balay }
3553b494cfeSSatish Balay 
3564d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3574d03fd2bSBarry Smith {
3584d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3594d03fd2bSBarry Smith }
3604d03fd2bSBarry Smith 
3614d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11nn_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3624d03fd2bSBarry Smith {
3634d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3644d03fd2bSBarry Smith }
3654d03fd2bSBarry Smith 
3664d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal111_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3674d03fd2bSBarry Smith {
3684d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3694d03fd2bSBarry Smith }
3704d03fd2bSBarry Smith 
3714d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal1n_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3724d03fd2bSBarry Smith {
3734d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3744d03fd2bSBarry Smith }
3754d03fd2bSBarry Smith 
3764d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3774d03fd2bSBarry Smith {
3784d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3794d03fd2bSBarry Smith }
3804d03fd2bSBarry Smith 
38187bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
38287bcf4e0SBarry Smith {
38387bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
38487bcf4e0SBarry Smith   *ierr = MatGetRowMin(*mat,*v,idx);
38587bcf4e0SBarry Smith }
3864d03fd2bSBarry Smith 
38787bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
38887bcf4e0SBarry Smith {
38987bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
39087bcf4e0SBarry Smith   *ierr = MatGetRowMinAbs(*mat,*v,idx);
39187bcf4e0SBarry Smith }
39287bcf4e0SBarry Smith 
3935928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3945928be6bSBarry Smith {
3955928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
3965928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
3975928be6bSBarry Smith }
3985928be6bSBarry Smith 
3995928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
4005928be6bSBarry Smith {
4015928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
4025928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
4035928be6bSBarry Smith }
4045928be6bSBarry Smith 
405b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
406b22b330cSBarry Smith {
407b22b330cSBarry Smith   PetscErrorCode ierr = 0;
408b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
409b22b330cSBarry Smith   return 0;
410b22b330cSBarry Smith }
411b22b330cSBarry Smith 
4128cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
413b22b330cSBarry Smith {
414b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
415b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
41626fbe8dcSKarl Rupp 
417b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
418b22b330cSBarry Smith }
419b22b330cSBarry Smith 
420d2da0f5dSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
4217c54600cSBarry Smith {
4227c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
4237c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
4242a7a6963SBarry Smith   *ierr = MatCreateVecs(*mat,right,left);
4257c54600cSBarry Smith }
4267c54600cSBarry Smith 
4278cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
428ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
429f4e70085SSatish Balay {
4301a83f524SJed Brown   const PetscInt *IA,*JA;
4318f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
4321a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
4331a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
434f4e70085SSatish Balay }
435f4e70085SSatish Balay 
4368cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
437ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
438f4e70085SSatish Balay {
4391a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
4408f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
441f4e70085SSatish Balay }
442f4e70085SSatish Balay 
443f4e70085SSatish Balay /*
444f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
445f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
446f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
447f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
448f4e70085SSatish Balay   at a time.
449f4e70085SSatish Balay */
450f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
451f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
452f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
453f4e70085SSatish Balay 
4548cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
455f4e70085SSatish Balay {
456f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
457f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
458f4e70085SSatish Balay 
459f4e70085SSatish Balay   if (matgetrowactive) {
460efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
461f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
462f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
463f4e70085SSatish Balay     *ierr = 1;
464f4e70085SSatish Balay     return;
465f4e70085SSatish Balay   }
466f4e70085SSatish Balay 
4670298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4680298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
469f4e70085SSatish Balay 
470f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
471f4e70085SSatish Balay   if (*ierr) return;
472f4e70085SSatish Balay 
473f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
474f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
475f4e70085SSatish Balay   matgetrowactive = 1;
476f4e70085SSatish Balay }
477f4e70085SSatish Balay 
4788cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
479f4e70085SSatish Balay {
480f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
481f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
482f4e70085SSatish Balay   if (!matgetrowactive) {
483efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
484f4e70085SSatish Balay                "Must call MatGetRow() first");
485f4e70085SSatish Balay     *ierr = 1;
486f4e70085SSatish Balay     return;
487f4e70085SSatish Balay   }
4880298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4890298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
490f4e70085SSatish Balay 
491f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
492f4e70085SSatish Balay   matgetrowactive = 0;
493f4e70085SSatish Balay }
494f4e70085SSatish Balay 
4958cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
496f4e70085SSatish Balay {
497f4e70085SSatish Balay   PetscViewer v;
498f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
499f4e70085SSatish Balay   *ierr = MatView(*mat,v);
500f4e70085SSatish Balay }
501f4e70085SSatish Balay 
5028cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
503f7e310deSShri Abhyankar {
504f7e310deSShri Abhyankar   PetscViewer v;
505f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
506112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
507f7e310deSShri Abhyankar }
508f7e310deSShri Abhyankar 
5098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
510f4e70085SSatish Balay {
511f4e70085SSatish Balay   PetscScalar *mm;
512f4e70085SSatish Balay   PetscInt    m,n;
513f4e70085SSatish Balay 
5148c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
515f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
516f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
517f4e70085SSatish Balay }
518f4e70085SSatish Balay 
5198cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
520f4e70085SSatish Balay {
521f4e70085SSatish Balay   PetscScalar *lx;
522f4e70085SSatish Balay   PetscInt    m,n;
523f4e70085SSatish Balay 
524f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
525f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5268c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
527f4e70085SSatish Balay }
528f4e70085SSatish Balay 
5298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
53073a71a0fSBarry Smith {
53173a71a0fSBarry Smith   PetscScalar *mm;
53273a71a0fSBarry Smith   PetscInt    m,n;
53373a71a0fSBarry Smith 
5348c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
53573a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
53673a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
53773a71a0fSBarry Smith }
53873a71a0fSBarry Smith 
5398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
54073a71a0fSBarry Smith {
54173a71a0fSBarry Smith   PetscScalar *lx;
54273a71a0fSBarry Smith   PetscInt    m,n;
54373a71a0fSBarry Smith 
54473a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
54573a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5468c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
54773a71a0fSBarry Smith }
54873a71a0fSBarry Smith 
5497067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdensegetarrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5508572280aSBarry Smith {
5517067c7f7SBarry Smith   const PetscScalar *mm;
5528572280aSBarry Smith   PetscInt         m,n;
5538572280aSBarry Smith 
5548572280aSBarry Smith   *ierr = MatDenseGetArrayRead(*mat,&mm); if (*ierr) return;
5558572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
5567067c7f7SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,(PetscScalar*)mm,m*n,ia); if (*ierr) return;
5578572280aSBarry Smith }
5588572280aSBarry Smith 
5597067c7f7SBarry Smith 
5607067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdenserestorearrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5618572280aSBarry Smith {
5627067c7f7SBarry Smith   const PetscScalar *lx;
5638572280aSBarry Smith   PetscInt          m,n;
5648572280aSBarry Smith 
5658572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
5667067c7f7SBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,(PetscScalar**)&lx);if (*ierr) return;
5678572280aSBarry Smith   *ierr = MatDenseRestoreArrayRead(*mat,&lx);if (*ierr) return;
5688572280aSBarry Smith }
5698572280aSBarry Smith 
570390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
57135bd34faSBarry Smith {
57235bd34faSBarry Smith   const char *tname;
57335bd34faSBarry Smith 
5743ca39a21SBarry Smith   *ierr = MatFactorGetSolverType(*mat,&tname);if (*ierr) return;
57535bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
57635bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
57735bd34faSBarry Smith   }
57835bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
57935bd34faSBarry Smith }
58035bd34faSBarry Smith 
581390e1bf2SBarry 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))
5825dffd610SBarry Smith {
5835dffd610SBarry Smith   char *t;
5845dffd610SBarry Smith   FIXCHAR(outtype,len,t);
5859be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
5865dffd610SBarry Smith   FREECHAR(outtype,t);
5875dffd610SBarry Smith }
5885dffd610SBarry Smith 
589390e1bf2SBarry 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))
590f4e70085SSatish Balay {
591f4e70085SSatish Balay   char *t;
592f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
593f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
594f4e70085SSatish Balay   FREECHAR(outtype,t);
595f4e70085SSatish Balay }
596f4e70085SSatish Balay 
597f4e70085SSatish Balay /*
5987dae84e0SHong Zhang     MatCreateSubmatrices() is slightly different from C since the
599f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
6007dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
601f4e70085SSatish Balay */
6027dae84e0SHong Zhang PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
603f4e70085SSatish Balay {
604f4e70085SSatish Balay   Mat      *lsmat;
605f4e70085SSatish Balay   PetscInt i;
606f4e70085SSatish Balay 
607f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
6087dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
609de7ef04eSHong Zhang     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
610f4e70085SSatish Balay       smat[i] = lsmat[i];
611f4e70085SSatish Balay     }
612f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
613f4e70085SSatish Balay   } else {
6147dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
615f4e70085SSatish Balay   }
616f4e70085SSatish Balay }
617f4e70085SSatish Balay 
6187d6bfa3bSBarry Smith /*
6197d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
620de7ef04eSHong Zhang     Fortran does not free the array of matrix objects, while in C that
621de7ef04eSHong Zhang     the array is freed
622de7ef04eSHong Zhang */
623de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
624de7ef04eSHong Zhang {
625de7ef04eSHong Zhang   PetscInt i;
626de7ef04eSHong Zhang 
627de7ef04eSHong Zhang   for (i=0; i<*n; i++) {
628de7ef04eSHong Zhang     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
629de7ef04eSHong Zhang   }
630de7ef04eSHong Zhang }
631de7ef04eSHong Zhang 
632de7ef04eSHong Zhang /*
633de7ef04eSHong Zhang     MatDestroySubMatrices() is slightly different from C since the
6347d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects, while in C that
6357dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
6367d6bfa3bSBarry Smith */
637de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
6387d6bfa3bSBarry Smith {
639de7ef04eSHong Zhang   Mat      *lsmat;
6407d6bfa3bSBarry Smith   PetscInt i;
6417d6bfa3bSBarry Smith 
642de7ef04eSHong Zhang   *ierr = PetscMalloc1(*n+1,&lsmat);
643de7ef04eSHong Zhang   for (i=0; i<=*n; i++) {
644de7ef04eSHong Zhang       lsmat[i] = smat[i];
6457d6bfa3bSBarry Smith   }
646de7ef04eSHong Zhang   *ierr = MatDestroySubMatrices(*n,&lsmat);
647df750dc8SHong Zhang }
648df750dc8SHong Zhang 
6498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
65017ede90eSSatish Balay {
65117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
65217ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
65317ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
65417ede90eSSatish Balay }
65517ede90eSSatish Balay 
6568cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
65717ede90eSSatish Balay {
65817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
65917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
66017ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
66117ede90eSSatish Balay }
66217ede90eSSatish Balay 
6638cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
66417ede90eSSatish Balay {
66517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
66617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
66717ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
66817ede90eSSatish Balay }
66917ede90eSSatish Balay 
6708cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
671d25a37e1SJed Brown {
672d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
673d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
674d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
675d25a37e1SJed Brown }
676d25a37e1SJed Brown 
6778cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
678f4e70085SSatish Balay {
6792b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6802b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6812b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
682f4e70085SSatish Balay }
683f4e70085SSatish Balay 
6848cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
685f4e70085SSatish Balay {
6862b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6872b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6882b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
689f4e70085SSatish Balay }
690f4e70085SSatish Balay 
6918cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
692f4e70085SSatish Balay {
6932b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6942b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6952b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
696f4e70085SSatish Balay }
697f4e70085SSatish Balay 
6988cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
699f4e70085SSatish Balay {
7002b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
7012b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
7022b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
703f4e70085SSatish Balay }
704f4e70085SSatish Balay 
7058cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
70617ede90eSSatish Balay {
70717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
70817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
70917ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
71017ede90eSSatish Balay }
71117ede90eSSatish Balay 
7128cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
71317ede90eSSatish Balay {
71417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
71517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
71617ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
71717ede90eSSatish Balay }
7181eea217eSSatish Balay 
719390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
7201eea217eSSatish Balay {
7211eea217eSSatish Balay   char *t;
7221eea217eSSatish Balay 
7231eea217eSSatish Balay   FIXCHAR(prefix,len,t);
7241eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
7251eea217eSSatish Balay   FREECHAR(prefix,t);
7261eea217eSSatish Balay }
7271eea217eSSatish Balay 
728d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
729812c3f48SMatthew Knepley {
730260663b8SBarry Smith   CHKFORTRANNULLOBJECT(*sp)
731d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
732812c3f48SMatthew Knepley }
7331eea217eSSatish Balay 
7344d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
7355ba43861SSatish Balay {
7364d03fd2bSBarry Smith   *ierr = MatGetInfo(*mat,*flag,info);
7375ba43861SSatish Balay }
7385ba43861SSatish Balay 
7394d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
74022688b47SSatish Balay {
7414d03fd2bSBarry Smith   *ierr = MatLUFactor(*mat,*row,*col,info);
74222688b47SSatish Balay }
74322688b47SSatish Balay 
7444d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
74522688b47SSatish Balay {
7464d03fd2bSBarry Smith   *ierr = MatILUFactor(*mat,*row,*col,info);
74722688b47SSatish Balay }
74822688b47SSatish Balay 
7494d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
75022688b47SSatish Balay {
751*954bb437SSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(row);
752*954bb437SSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(col);
7534d03fd2bSBarry Smith   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
75422688b47SSatish Balay }
75522688b47SSatish Balay 
7564d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
75722688b47SSatish Balay {
7584d03fd2bSBarry Smith   *ierr = MatLUFactorNumeric(*fact,*mat,info);
75922688b47SSatish Balay }
76022688b47SSatish Balay 
7614d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
76222688b47SSatish Balay {
7634d03fd2bSBarry Smith   *ierr = MatCholeskyFactor(*mat,*perm,info);
76422688b47SSatish Balay }
76522688b47SSatish Balay 
7664d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
76722688b47SSatish Balay {
7684d03fd2bSBarry Smith   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
76922688b47SSatish Balay }
77022688b47SSatish Balay 
7714d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
77222688b47SSatish Balay {
7734d03fd2bSBarry Smith   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
77422688b47SSatish Balay }
77522688b47SSatish Balay 
7764d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
77722688b47SSatish Balay {
7784d03fd2bSBarry Smith   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
77922688b47SSatish Balay }
78022688b47SSatish Balay 
7814d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
78222688b47SSatish Balay {
7834d03fd2bSBarry Smith   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
78422688b47SSatish Balay }
78522688b47SSatish Balay 
7864d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
78722688b47SSatish Balay {
7884d03fd2bSBarry Smith   *ierr = MatICCFactor(*mat,*row,info);
78922688b47SSatish Balay }
79022688b47SSatish Balay 
7914d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
79222688b47SSatish Balay {
7934d03fd2bSBarry Smith   *ierr = MatFactorInfoInitialize(info);
79422688b47SSatish Balay }
795