xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision d49bb8f946631d5470c2a737c5ecfe1ed81df0b7)
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
62d27e6124SSatish Balay #define matzerorowslocal0_               MATZEROROWSLOCAL0
63d27e6124SSatish Balay #define matzerorowslocal1_               MATZEROROWSLOCAL1
64f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
6517ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
6617ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
671eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
68fcc9d04bSBarry Smith #define matcreatevecs_                   MATCREATEVECS
69c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
705ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
7122688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
7222688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
7322688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
7422688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
7522688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
7622688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
7722688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
7822688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
7922688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
8022688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
8122688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
82b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
830905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
843be0408cSBarry Smith #define matgetsize00_                    MATGETSIZE00
853be0408cSBarry Smith #define matgetsize10_                    MATGETSIZE10
863be0408cSBarry Smith #define matgetsize01_                    MATGETSIZE01
873be0408cSBarry Smith #define matgetlocalsize00_               MATGETLOCALSIZE00
883be0408cSBarry Smith #define matgetlocalsize10_               MATGETLOCALSIZE10
893be0408cSBarry Smith #define matgetlocalsize01_               MATGETLOCALSIZE01
90260663b8SBarry Smith #define matsetnullspace_                 MATSETNULLSPACE
91260663b8SBarry Smith #define matgetownershiprange_            MATGETOWNERSHIPRANGE
92c08c7cb9SBarry Smith #define matgetownershipis_               MATGETOWNERSHIPIS
93afc39838SBarry Smith #define matgetownershiprangecolumn_      MATGETOWNERSHIPRANGECOLUMN
94f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
954d03fd2bSBarry Smith #define matsetvalues_                    matsetvalues
961006886cSSatish Balay #define matsetvaluesnnnn_                matsetvaluesnnnn
973b494cfeSSatish Balay #define matsetvalues0_                   matsetvalues0
981b266c99SBarry Smith #define matsetvaluesnn1_                 matsetvaluesnn1
994d03fd2bSBarry Smith #define matsetvalues11_                  matsetvalues11
1004d03fd2bSBarry Smith #define matsetvaluesn1_                  matsetvaluesn1
1014d03fd2bSBarry Smith #define matsetvalues1n_                  matsetvalues1n
1024d03fd2bSBarry Smith #define matsetvalueslocal_               matsetvalueslocal
1033b494cfeSSatish Balay #define matsetvalueslocal0_              matsetvalueslocal0
1044d03fd2bSBarry Smith #define matsetvalueslocal11_             matsetvalueslocal11
1054d03fd2bSBarry Smith #define matsetvalueslocal11nn_           matsetvalueslocal11nn
1064d03fd2bSBarry Smith #define matsetvalueslocal111_            matsetvalueslocal111
1074d03fd2bSBarry Smith #define matsetvalueslocal1n_             matsetvalueslocal1n
1084d03fd2bSBarry Smith #define matsetvalueslocaln1_             matsetvalueslocaln1
1094d03fd2bSBarry Smith #define matsetvaluesblocked_             matsetvaluesblocked
1103b494cfeSSatish Balay #define matsetvaluesblocked0_            matsetvaluesblocked0
1110aee3464SBarry Smith #define matsetvaluesblocked2_            matsetvaluesblocked2
1124d03fd2bSBarry Smith #define matsetvaluesblocked11_           matsetvaluesblocked11
1134d03fd2bSBarry Smith #define matsetvaluesblocked111_          matsetvaluesblocked111
1144d03fd2bSBarry Smith #define matsetvaluesblocked1n_           matsetvaluesblocked1n
11524aa916eSSatish Balay #define matsetvaluesblockedn1_           matsetvaluesblockedn1
1164d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        matsetvaluesblockedlocal
1173b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       matsetvaluesblockedlocal0
1184d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      matsetvaluesblockedlocal11
1194d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     matsetvaluesblockedlocal111
1204d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      matsetvaluesblockedlocal1n
12124aa916eSSatish Balay #define matsetvaluesblockedlocaln1_      matsetvaluesblockedlocaln1
12287bcf4e0SBarry Smith #define matgetrowmin_                    matgetrowmin
12387bcf4e0SBarry Smith #define matgetrowminabs_                 matgetrowminabs
1245928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
1255928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
1265928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
127df750dc8SHong Zhang #define matdestroysubmatrices_           matdestroysubmatrices
1285dffd610SBarry Smith #define matgetfactor_                    matgetfactor
12935bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
130fcc9d04bSBarry Smith #define matcreatevecs_                   matcreatevecs
131f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
132f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
133f4e70085SSatish Balay #define matgetrow_                       matgetrow
134f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
135f4e70085SSatish Balay #define matview_                         matview
136f7e310deSShri Abhyankar #define matload_                         matload
1378c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
1388c778c55SBarry Smith #define matseqaijrestorearray_           matseqaijrestorearray
1398c778c55SBarry Smith #define matdensegetarray_                matdensegetarray
1408572280aSBarry Smith #define matdensegetarrayread_            matdensegetarrayread
1418c778c55SBarry Smith #define matdenserestorearray_            matdenserestorearray
1428572280aSBarry Smith #define matdenserestorearrayread_        matdenserestorearrayread
143f4e70085SSatish Balay #define matconvert_                      matconvert
1447dae84e0SHong Zhang #define matcreatesubmatrices_            matcreatesubmatrices
14517ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
14617ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
14717ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
148d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
149f4e70085SSatish Balay #define matzerorows_                     matzerorows
150f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
151f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
152f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
15317ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
15417ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
1551eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
156812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
1575ba43861SSatish Balay #define matgetinfo_                      matgetinfo
15822688b47SSatish Balay #define matlufactor_                     matlufactor
15922688b47SSatish Balay #define matilufactor_                    matilufactor
16022688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
16122688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
16222688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
16322688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
16422688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
16522688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
16622688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
16722688b47SSatish Balay #define maticcfactor_                    maticcfactor
16822688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
169b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
1700905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
1713be0408cSBarry Smith #define matgetsize00_                    matgetsize00
1723be0408cSBarry Smith #define matgetsize10_                    matgetsize10
1733be0408cSBarry Smith #define matgetsize01_                    matgetsize01
1743be0408cSBarry Smith #define matgetlocalsize00_               matgetlocalsize00
1753be0408cSBarry Smith #define matgetlocalsize10_               matgetlocalsize10
1763be0408cSBarry Smith #define matgetlocalsize01_               matgetlocalsize01
177260663b8SBarry Smith #define matsetnullspace_                 matsetnullspace
178260663b8SBarry Smith #define matgetownershiprange_            matgetownershiprange
179c08c7cb9SBarry Smith #define matgetownershipis_               matgetownershipis
180afc39838SBarry Smith #define matgetownershiprangecolumn_      matgetownershiprangecolumn
181f4e70085SSatish Balay #endif
182f4e70085SSatish Balay 
183260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
184260663b8SBarry Smith {
185260663b8SBarry Smith   CHKFORTRANNULLINTEGER(m);
186260663b8SBarry Smith   CHKFORTRANNULLINTEGER(n);
187260663b8SBarry Smith   *ierr = MatGetOwnershipRange(*mat,m,n);
188260663b8SBarry Smith }
189260663b8SBarry Smith 
190c08c7cb9SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershipis_(Mat *mat,IS *m,IS *n, int *ierr )
191c08c7cb9SBarry Smith {
192c08c7cb9SBarry Smith   CHKFORTRANNULLOBJECT(m);
193c08c7cb9SBarry Smith   CHKFORTRANNULLOBJECT(n);
194c08c7cb9SBarry Smith   *ierr = MatGetOwnershipIS(*mat,m,n);
195c08c7cb9SBarry Smith }
196c08c7cb9SBarry Smith 
197afc39838SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprangecolumn_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
198afc39838SBarry Smith {
199afc39838SBarry Smith   CHKFORTRANNULLINTEGER(m);
200afc39838SBarry Smith   CHKFORTRANNULLINTEGER(n);
201afc39838SBarry Smith   *ierr = MatGetOwnershipRangeColumn(*mat,m,n);
202afc39838SBarry Smith }
203afc39838SBarry Smith 
2043be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2053be0408cSBarry Smith {
2063be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2073be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2083be0408cSBarry Smith   *ierr = MatGetSize(*mat,m,n);
2093be0408cSBarry Smith }
2103be0408cSBarry Smith 
2113be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(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  matgetsize10_(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  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2223be0408cSBarry Smith {
2233be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2243be0408cSBarry Smith }
2253be0408cSBarry Smith 
2263be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2273be0408cSBarry Smith {
2283be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2293be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2303be0408cSBarry Smith   *ierr = MatGetLocalSize(*mat,m,n);
2313be0408cSBarry Smith }
2323be0408cSBarry Smith 
2333be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(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  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2393be0408cSBarry Smith {
2403be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2413be0408cSBarry Smith }
2423be0408cSBarry Smith 
2433be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2443be0408cSBarry Smith {
2453be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2463be0408cSBarry Smith }
2473be0408cSBarry Smith 
2484d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2494d03fd2bSBarry Smith   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
2504d03fd2bSBarry Smith }
2514d03fd2bSBarry Smith 
252cee688dbSBarry 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)){
253cee688dbSBarry Smith   PetscScalar *fa;
2540aee3464SBarry Smith   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
255cee688dbSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
256cee688dbSBarry Smith }
257cee688dbSBarry Smith 
2583b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2593b494cfeSSatish Balay   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2603b494cfeSSatish Balay }
2613b494cfeSSatish Balay 
2624d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2634d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2644d03fd2bSBarry Smith }
2654d03fd2bSBarry Smith 
2664d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2674d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2684d03fd2bSBarry Smith }
2694d03fd2bSBarry Smith 
2704d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked1n_(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  matsetvaluesblockedn1_(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  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
2794d03fd2bSBarry Smith {
2804d03fd2bSBarry Smith   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
2814d03fd2bSBarry Smith }
2824d03fd2bSBarry Smith 
2833b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2843b494cfeSSatish Balay   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2853b494cfeSSatish Balay }
2863b494cfeSSatish Balay 
2874d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2884d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2894d03fd2bSBarry Smith }
2904d03fd2bSBarry Smith 
2914d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2924d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2934d03fd2bSBarry Smith }
2944d03fd2bSBarry Smith 
2954d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal1n_(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  matsetvaluesblockedlocaln1_(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  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3044d03fd2bSBarry Smith {
3054d03fd2bSBarry Smith   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
3064d03fd2bSBarry Smith }
3074d03fd2bSBarry Smith 
3081b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3091b266c99SBarry Smith {
3101b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3111b266c99SBarry Smith }
3121b266c99SBarry Smith 
3133b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3143b494cfeSSatish Balay {
3153b494cfeSSatish Balay   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3163b494cfeSSatish Balay }
3173b494cfeSSatish Balay 
3181b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3191b266c99SBarry Smith {
3201b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3211b266c99SBarry Smith }
3221b266c99SBarry Smith 
3234d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(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  matsetvaluesn1_(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  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3344d03fd2bSBarry Smith {
3354d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3364d03fd2bSBarry Smith }
3374d03fd2bSBarry Smith 
3384d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3394d03fd2bSBarry Smith {
3404d03fd2bSBarry Smith   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
3414d03fd2bSBarry Smith }
3424d03fd2bSBarry Smith 
3433b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3443b494cfeSSatish Balay {
3453b494cfeSSatish Balay   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3463b494cfeSSatish Balay }
3473b494cfeSSatish Balay 
3484d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(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  matsetvalueslocal11nn_(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  matsetvalueslocal111_(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  matsetvalueslocal1n_(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 
3684d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3694d03fd2bSBarry Smith {
3704d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3714d03fd2bSBarry Smith }
3724d03fd2bSBarry Smith 
37387bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
37487bcf4e0SBarry Smith {
37587bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
37687bcf4e0SBarry Smith   *ierr = MatGetRowMin(*mat,*v,idx);
37787bcf4e0SBarry Smith }
3784d03fd2bSBarry Smith 
37987bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
38087bcf4e0SBarry Smith {
38187bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
38287bcf4e0SBarry Smith   *ierr = MatGetRowMinAbs(*mat,*v,idx);
38387bcf4e0SBarry Smith }
38487bcf4e0SBarry Smith 
3855928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3865928be6bSBarry Smith {
3875928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
3885928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
3895928be6bSBarry Smith }
3905928be6bSBarry Smith 
3915928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3925928be6bSBarry Smith {
3935928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
3945928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
3955928be6bSBarry Smith }
3965928be6bSBarry Smith 
397b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
398b22b330cSBarry Smith {
399b22b330cSBarry Smith   PetscErrorCode ierr = 0;
400b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
401b22b330cSBarry Smith   return 0;
402b22b330cSBarry Smith }
403b22b330cSBarry Smith 
4048cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
405b22b330cSBarry Smith {
406b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
407b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
40826fbe8dcSKarl Rupp 
409b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
410b22b330cSBarry Smith }
411b22b330cSBarry Smith 
412d2da0f5dSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
4137c54600cSBarry Smith {
4147c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
4157c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
4162a7a6963SBarry Smith   *ierr = MatCreateVecs(*mat,right,left);
4177c54600cSBarry Smith }
4187c54600cSBarry Smith 
4198cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
420ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
421f4e70085SSatish Balay {
4221a83f524SJed Brown   const PetscInt *IA,*JA;
4238f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
4241a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
4251a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
426f4e70085SSatish Balay }
427f4e70085SSatish Balay 
4288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
429ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
430f4e70085SSatish Balay {
4311a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
4328f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
433f4e70085SSatish Balay }
434f4e70085SSatish Balay 
435f4e70085SSatish Balay /*
436f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
437f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
438f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
439f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
440f4e70085SSatish Balay   at a time.
441f4e70085SSatish Balay */
442f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
443f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
444f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
445f4e70085SSatish Balay 
4468cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
447f4e70085SSatish Balay {
448f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
449f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
450f4e70085SSatish Balay 
451f4e70085SSatish Balay   if (matgetrowactive) {
452efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
453f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
454f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
455f4e70085SSatish Balay     *ierr = 1;
456f4e70085SSatish Balay     return;
457f4e70085SSatish Balay   }
458f4e70085SSatish Balay 
4590298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4600298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
461f4e70085SSatish Balay 
462f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
463f4e70085SSatish Balay   if (*ierr) return;
464f4e70085SSatish Balay 
465f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
466f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
467f4e70085SSatish Balay   matgetrowactive = 1;
468f4e70085SSatish Balay }
469f4e70085SSatish Balay 
4708cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
471f4e70085SSatish Balay {
472f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
473f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
474f4e70085SSatish Balay   if (!matgetrowactive) {
475efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
476f4e70085SSatish Balay                "Must call MatGetRow() first");
477f4e70085SSatish Balay     *ierr = 1;
478f4e70085SSatish Balay     return;
479f4e70085SSatish Balay   }
4800298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4810298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
482f4e70085SSatish Balay 
483f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
484f4e70085SSatish Balay   matgetrowactive = 0;
485f4e70085SSatish Balay }
486f4e70085SSatish Balay 
4878cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
488f4e70085SSatish Balay {
489f4e70085SSatish Balay   PetscViewer v;
490f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
491f4e70085SSatish Balay   *ierr = MatView(*mat,v);
492f4e70085SSatish Balay }
493f4e70085SSatish Balay 
4948cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
495f7e310deSShri Abhyankar {
496f7e310deSShri Abhyankar   PetscViewer v;
497f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
498112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
499f7e310deSShri Abhyankar }
500f7e310deSShri Abhyankar 
5018cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
502f4e70085SSatish Balay {
503f4e70085SSatish Balay   PetscScalar *mm;
504f4e70085SSatish Balay   PetscInt    m,n;
505f4e70085SSatish Balay 
5068c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
507f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
508f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
509f4e70085SSatish Balay }
510f4e70085SSatish Balay 
5118cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
512f4e70085SSatish Balay {
513f4e70085SSatish Balay   PetscScalar *lx;
514f4e70085SSatish Balay   PetscInt    m,n;
515f4e70085SSatish Balay 
516f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
517f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5188c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
519f4e70085SSatish Balay }
520f4e70085SSatish Balay 
5218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
52273a71a0fSBarry Smith {
52373a71a0fSBarry Smith   PetscScalar *mm;
52473a71a0fSBarry Smith   PetscInt    m,n;
52573a71a0fSBarry Smith 
5268c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
52773a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
52873a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
52973a71a0fSBarry Smith }
53073a71a0fSBarry Smith 
5318cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
53273a71a0fSBarry Smith {
53373a71a0fSBarry Smith   PetscScalar *lx;
53473a71a0fSBarry Smith   PetscInt    m,n;
53573a71a0fSBarry Smith 
53673a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
53773a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5388c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
53973a71a0fSBarry Smith }
54073a71a0fSBarry Smith 
5417067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdensegetarrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5428572280aSBarry Smith {
5437067c7f7SBarry Smith   const PetscScalar *mm;
5448572280aSBarry Smith   PetscInt         m,n;
5458572280aSBarry Smith 
5468572280aSBarry Smith   *ierr = MatDenseGetArrayRead(*mat,&mm); if (*ierr) return;
5478572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
5487067c7f7SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,(PetscScalar*)mm,m*n,ia); if (*ierr) return;
5498572280aSBarry Smith }
5508572280aSBarry Smith 
5517067c7f7SBarry Smith 
5527067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdenserestorearrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5538572280aSBarry Smith {
5547067c7f7SBarry Smith   const PetscScalar *lx;
5558572280aSBarry Smith   PetscInt          m,n;
5568572280aSBarry Smith 
5578572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
5587067c7f7SBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,(PetscScalar**)&lx);if (*ierr) return;
5598572280aSBarry Smith   *ierr = MatDenseRestoreArrayRead(*mat,&lx);if (*ierr) return;
5608572280aSBarry Smith }
5618572280aSBarry Smith 
562390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
56335bd34faSBarry Smith {
56435bd34faSBarry Smith   const char *tname;
56535bd34faSBarry Smith 
5663ca39a21SBarry Smith   *ierr = MatFactorGetSolverType(*mat,&tname);if (*ierr) return;
56735bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
56835bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
56935bd34faSBarry Smith   }
57035bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
57135bd34faSBarry Smith }
57235bd34faSBarry Smith 
573390e1bf2SBarry 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))
5745dffd610SBarry Smith {
5755dffd610SBarry Smith   char *t;
5765dffd610SBarry Smith   FIXCHAR(outtype,len,t);
577*d49bb8f9SBarry Smith   *ierr = MatGetFactor(*mat,t,*ftype,M);if (*ierr) return;
5785dffd610SBarry Smith   FREECHAR(outtype,t);
5795dffd610SBarry Smith }
5805dffd610SBarry Smith 
581390e1bf2SBarry 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))
582f4e70085SSatish Balay {
583f4e70085SSatish Balay   char *t;
584f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
585*d49bb8f9SBarry Smith   *ierr = MatConvert(*mat,t,*reuse,M);if (*ierr) return;
586f4e70085SSatish Balay   FREECHAR(outtype,t);
587f4e70085SSatish Balay }
588f4e70085SSatish Balay 
589f4e70085SSatish Balay /*
5907dae84e0SHong Zhang     MatCreateSubmatrices() is slightly different from C since the
591f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
5927dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
593f4e70085SSatish Balay */
5947dae84e0SHong Zhang PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
595f4e70085SSatish Balay {
596f4e70085SSatish Balay   Mat      *lsmat;
597f4e70085SSatish Balay   PetscInt i;
598f4e70085SSatish Balay 
599f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
6007dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
601de7ef04eSHong Zhang     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
602f4e70085SSatish Balay       smat[i] = lsmat[i];
603f4e70085SSatish Balay     }
604f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
605f4e70085SSatish Balay   } else {
6067dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
607f4e70085SSatish Balay   }
608f4e70085SSatish Balay }
609f4e70085SSatish Balay 
6107d6bfa3bSBarry Smith /*
6117d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
612de7ef04eSHong Zhang     Fortran does not free the array of matrix objects, while in C that
613de7ef04eSHong Zhang     the array is freed
614de7ef04eSHong Zhang */
615de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
616de7ef04eSHong Zhang {
617de7ef04eSHong Zhang   PetscInt i;
618de7ef04eSHong Zhang 
619de7ef04eSHong Zhang   for (i=0; i<*n; i++) {
620de7ef04eSHong Zhang     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
621de7ef04eSHong Zhang   }
622de7ef04eSHong Zhang }
623de7ef04eSHong Zhang 
624de7ef04eSHong Zhang /*
625de7ef04eSHong Zhang     MatDestroySubMatrices() is slightly different from C since the
6267d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects, while in C that
6277dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
6287d6bfa3bSBarry Smith */
629de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
6307d6bfa3bSBarry Smith {
631de7ef04eSHong Zhang   Mat      *lsmat;
6327d6bfa3bSBarry Smith   PetscInt i;
6337d6bfa3bSBarry Smith 
634de7ef04eSHong Zhang   *ierr = PetscMalloc1(*n+1,&lsmat);
635de7ef04eSHong Zhang   for (i=0; i<=*n; i++) {
636de7ef04eSHong Zhang       lsmat[i] = smat[i];
6377d6bfa3bSBarry Smith   }
638de7ef04eSHong Zhang   *ierr = MatDestroySubMatrices(*n,&lsmat);
639df750dc8SHong Zhang }
640df750dc8SHong Zhang 
641390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
6421eea217eSSatish Balay {
6431eea217eSSatish Balay   char *t;
6441eea217eSSatish Balay 
6451eea217eSSatish Balay   FIXCHAR(prefix,len,t);
646*d49bb8f9SBarry Smith   *ierr = MatSetOptionsPrefix(*mat,t);if (*ierr) return;
6471eea217eSSatish Balay   FREECHAR(prefix,t);
6481eea217eSSatish Balay }
6491eea217eSSatish Balay 
650d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
651812c3f48SMatthew Knepley {
652260663b8SBarry Smith   CHKFORTRANNULLOBJECT(*sp)
653d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
654812c3f48SMatthew Knepley }
6551eea217eSSatish Balay 
6564d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
6575ba43861SSatish Balay {
6584d03fd2bSBarry Smith   *ierr = MatGetInfo(*mat,*flag,info);
6595ba43861SSatish Balay }
6605ba43861SSatish Balay 
6614d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
66222688b47SSatish Balay {
6634d03fd2bSBarry Smith   *ierr = MatLUFactor(*mat,*row,*col,info);
66422688b47SSatish Balay }
66522688b47SSatish Balay 
6664d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
66722688b47SSatish Balay {
6684d03fd2bSBarry Smith   *ierr = MatILUFactor(*mat,*row,*col,info);
66922688b47SSatish Balay }
67022688b47SSatish Balay 
6714d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
67222688b47SSatish Balay {
6734d03fd2bSBarry Smith   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
67422688b47SSatish Balay }
67522688b47SSatish Balay 
6764d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
67722688b47SSatish Balay {
6784d03fd2bSBarry Smith   *ierr = MatLUFactorNumeric(*fact,*mat,info);
67922688b47SSatish Balay }
68022688b47SSatish Balay 
6814d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
68222688b47SSatish Balay {
6834d03fd2bSBarry Smith   *ierr = MatCholeskyFactor(*mat,*perm,info);
68422688b47SSatish Balay }
68522688b47SSatish Balay 
6864d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
68722688b47SSatish Balay {
6884d03fd2bSBarry Smith   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
68922688b47SSatish Balay }
69022688b47SSatish Balay 
6914d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
69222688b47SSatish Balay {
6934d03fd2bSBarry Smith   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
69422688b47SSatish Balay }
69522688b47SSatish Balay 
6964d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
69722688b47SSatish Balay {
6984d03fd2bSBarry Smith   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
69922688b47SSatish Balay }
70022688b47SSatish Balay 
7014d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
70222688b47SSatish Balay {
7034d03fd2bSBarry Smith   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
70422688b47SSatish Balay }
70522688b47SSatish Balay 
7064d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
70722688b47SSatish Balay {
7084d03fd2bSBarry Smith   *ierr = MatICCFactor(*mat,*row,info);
70922688b47SSatish Balay }
71022688b47SSatish Balay 
7114d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
71222688b47SSatish Balay {
7134d03fd2bSBarry Smith   *ierr = MatFactorInfoInitialize(info);
71422688b47SSatish Balay }
715d27e6124SSatish Balay PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
716d27e6124SSatish Balay {
717d27e6124SSatish Balay   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
718d27e6124SSatish Balay }
719d27e6124SSatish Balay PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal0_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
720d27e6124SSatish Balay {
721d27e6124SSatish Balay   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
722d27e6124SSatish Balay }
723d27e6124SSatish Balay PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal1_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
724d27e6124SSatish Balay {
725d27e6124SSatish Balay   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
726d27e6124SSatish Balay }
727