xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 91f56e93da311afad369df3e31a1c1b1b74d9bb6)
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
8438135fcbSMartin Diehl #define matgetsize_                      MATGETSIZE
853be0408cSBarry Smith #define matgetsize00_                    MATGETSIZE00
863be0408cSBarry Smith #define matgetsize10_                    MATGETSIZE10
873be0408cSBarry Smith #define matgetsize01_                    MATGETSIZE01
8838135fcbSMartin Diehl #define matgetlocalsize_                 MATGETLOCALSIZE
893be0408cSBarry Smith #define matgetlocalsize00_               MATGETLOCALSIZE00
903be0408cSBarry Smith #define matgetlocalsize10_               MATGETLOCALSIZE10
913be0408cSBarry Smith #define matgetlocalsize01_               MATGETLOCALSIZE01
92260663b8SBarry Smith #define matsetnullspace_                 MATSETNULLSPACE
93260663b8SBarry Smith #define matgetownershiprange_            MATGETOWNERSHIPRANGE
94*91f56e93SMartin Diehl #define matgetownershiprange00_          MATGETOWNERSHIPRANGE00
95*91f56e93SMartin Diehl #define matgetownershiprange10_          MATGETOWNERSHIPRANGE10
96*91f56e93SMartin Diehl #define matgetownershiprange01_          MATGETOWNERSHIPRANGE01
97*91f56e93SMartin Diehl #define matgetownershiprange10_          MATGETOWNERSHIPRANGE11
98c08c7cb9SBarry Smith #define matgetownershipis_               MATGETOWNERSHIPIS
99afc39838SBarry Smith #define matgetownershiprangecolumn_      MATGETOWNERSHIPRANGECOLUMN
100f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
1014d03fd2bSBarry Smith #define matsetvalues_                    matsetvalues
1021006886cSSatish Balay #define matsetvaluesnnnn_                matsetvaluesnnnn
1033b494cfeSSatish Balay #define matsetvalues0_                   matsetvalues0
1041b266c99SBarry Smith #define matsetvaluesnn1_                 matsetvaluesnn1
1054d03fd2bSBarry Smith #define matsetvalues11_                  matsetvalues11
1064d03fd2bSBarry Smith #define matsetvaluesn1_                  matsetvaluesn1
1074d03fd2bSBarry Smith #define matsetvalues1n_                  matsetvalues1n
1084d03fd2bSBarry Smith #define matsetvalueslocal_               matsetvalueslocal
1093b494cfeSSatish Balay #define matsetvalueslocal0_              matsetvalueslocal0
1104d03fd2bSBarry Smith #define matsetvalueslocal11_             matsetvalueslocal11
1114d03fd2bSBarry Smith #define matsetvalueslocal11nn_           matsetvalueslocal11nn
1124d03fd2bSBarry Smith #define matsetvalueslocal111_            matsetvalueslocal111
1134d03fd2bSBarry Smith #define matsetvalueslocal1n_             matsetvalueslocal1n
1144d03fd2bSBarry Smith #define matsetvalueslocaln1_             matsetvalueslocaln1
1154d03fd2bSBarry Smith #define matsetvaluesblocked_             matsetvaluesblocked
1163b494cfeSSatish Balay #define matsetvaluesblocked0_            matsetvaluesblocked0
1170aee3464SBarry Smith #define matsetvaluesblocked2_            matsetvaluesblocked2
1184d03fd2bSBarry Smith #define matsetvaluesblocked11_           matsetvaluesblocked11
1194d03fd2bSBarry Smith #define matsetvaluesblocked111_          matsetvaluesblocked111
1204d03fd2bSBarry Smith #define matsetvaluesblocked1n_           matsetvaluesblocked1n
12124aa916eSSatish Balay #define matsetvaluesblockedn1_           matsetvaluesblockedn1
1224d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        matsetvaluesblockedlocal
1233b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       matsetvaluesblockedlocal0
1244d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      matsetvaluesblockedlocal11
1254d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     matsetvaluesblockedlocal111
1264d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      matsetvaluesblockedlocal1n
12724aa916eSSatish Balay #define matsetvaluesblockedlocaln1_      matsetvaluesblockedlocaln1
12887bcf4e0SBarry Smith #define matgetrowmin_                    matgetrowmin
12987bcf4e0SBarry Smith #define matgetrowminabs_                 matgetrowminabs
1305928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
1315928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
1325928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
133df750dc8SHong Zhang #define matdestroysubmatrices_           matdestroysubmatrices
1345dffd610SBarry Smith #define matgetfactor_                    matgetfactor
13535bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
136fcc9d04bSBarry Smith #define matcreatevecs_                   matcreatevecs
137f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
138f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
139f4e70085SSatish Balay #define matgetrow_                       matgetrow
140f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
141f4e70085SSatish Balay #define matview_                         matview
142f7e310deSShri Abhyankar #define matload_                         matload
1438c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
1448c778c55SBarry Smith #define matseqaijrestorearray_           matseqaijrestorearray
1458c778c55SBarry Smith #define matdensegetarray_                matdensegetarray
1468572280aSBarry Smith #define matdensegetarrayread_            matdensegetarrayread
1478c778c55SBarry Smith #define matdenserestorearray_            matdenserestorearray
1488572280aSBarry Smith #define matdenserestorearrayread_        matdenserestorearrayread
149f4e70085SSatish Balay #define matconvert_                      matconvert
1507dae84e0SHong Zhang #define matcreatesubmatrices_            matcreatesubmatrices
15117ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
15217ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
15317ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
154d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
155f4e70085SSatish Balay #define matzerorows_                     matzerorows
156f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
157f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
158f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
15917ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
16017ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
1611eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
162812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
1635ba43861SSatish Balay #define matgetinfo_                      matgetinfo
16422688b47SSatish Balay #define matlufactor_                     matlufactor
16522688b47SSatish Balay #define matilufactor_                    matilufactor
16622688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
16722688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
16822688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
16922688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
17022688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
17122688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
17222688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
17322688b47SSatish Balay #define maticcfactor_                    maticcfactor
17422688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
175b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
1760905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
17738135fcbSMartin Diehl #define matgetsize_                      matgetsize
1783be0408cSBarry Smith #define matgetsize00_                    matgetsize00
1793be0408cSBarry Smith #define matgetsize10_                    matgetsize10
1803be0408cSBarry Smith #define matgetsize01_                    matgetsize01
18138135fcbSMartin Diehl #define matgetlocalsize_                 matgetlocalsize
1823be0408cSBarry Smith #define matgetlocalsize00_               matgetlocalsize00
1833be0408cSBarry Smith #define matgetlocalsize10_               matgetlocalsize10
1843be0408cSBarry Smith #define matgetlocalsize01_               matgetlocalsize01
185260663b8SBarry Smith #define matsetnullspace_                 matsetnullspace
186260663b8SBarry Smith #define matgetownershiprange_            matgetownershiprange
187*91f56e93SMartin Diehl #define matgetownershiprange00_          matgetownershiprange00
188*91f56e93SMartin Diehl #define matgetownershiprange10_          matgetownershiprange10
189*91f56e93SMartin Diehl #define matgetownershiprange01_          matgetownershiprange01
190*91f56e93SMartin Diehl #define matgetownershiprange11_          matgetownershiprange11
191c08c7cb9SBarry Smith #define matgetownershipis_               matgetownershipis
192afc39838SBarry Smith #define matgetownershiprangecolumn_      matgetownershiprangecolumn
193f4e70085SSatish Balay #endif
194f4e70085SSatish Balay 
195260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
196260663b8SBarry Smith {
197260663b8SBarry Smith   CHKFORTRANNULLINTEGER(m);
198260663b8SBarry Smith   CHKFORTRANNULLINTEGER(n);
199260663b8SBarry Smith   *ierr = MatGetOwnershipRange(*mat,m,n);
200260663b8SBarry Smith }
201260663b8SBarry Smith 
202c08c7cb9SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershipis_(Mat *mat,IS *m,IS *n, int *ierr )
203c08c7cb9SBarry Smith {
204c08c7cb9SBarry Smith   CHKFORTRANNULLOBJECT(m);
205c08c7cb9SBarry Smith   CHKFORTRANNULLOBJECT(n);
206c08c7cb9SBarry Smith   *ierr = MatGetOwnershipIS(*mat,m,n);
207c08c7cb9SBarry Smith }
208c08c7cb9SBarry Smith 
209afc39838SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprangecolumn_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
210afc39838SBarry Smith {
211afc39838SBarry Smith   CHKFORTRANNULLINTEGER(m);
212afc39838SBarry Smith   CHKFORTRANNULLINTEGER(n);
213afc39838SBarry Smith   *ierr = MatGetOwnershipRangeColumn(*mat,m,n);
214afc39838SBarry Smith }
215afc39838SBarry Smith 
2163be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2173be0408cSBarry Smith {
2183be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2193be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2203be0408cSBarry Smith   *ierr = MatGetSize(*mat,m,n);
2213be0408cSBarry Smith }
2223be0408cSBarry Smith 
2233be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2243be0408cSBarry Smith {
2253be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2263be0408cSBarry Smith }
2273be0408cSBarry Smith 
2283be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2293be0408cSBarry Smith {
2303be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2313be0408cSBarry Smith }
2323be0408cSBarry Smith 
2333be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2343be0408cSBarry Smith {
2353be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2363be0408cSBarry Smith }
2373be0408cSBarry Smith 
2383be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2393be0408cSBarry Smith {
2403be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2413be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2423be0408cSBarry Smith   *ierr = MatGetLocalSize(*mat,m,n);
2433be0408cSBarry Smith }
2443be0408cSBarry Smith 
2453be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2463be0408cSBarry Smith {
2473be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2483be0408cSBarry Smith }
2493be0408cSBarry Smith 
2503be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2513be0408cSBarry Smith {
2523be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2533be0408cSBarry Smith }
2543be0408cSBarry Smith 
2553be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2563be0408cSBarry Smith {
2573be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2583be0408cSBarry Smith }
2593be0408cSBarry Smith 
2604d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2614d03fd2bSBarry Smith   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
2624d03fd2bSBarry Smith }
2634d03fd2bSBarry Smith 
264cee688dbSBarry 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)){
265cee688dbSBarry Smith   PetscScalar *fa;
2660aee3464SBarry Smith   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
267cee688dbSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
268cee688dbSBarry Smith }
269cee688dbSBarry Smith 
2703b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2713b494cfeSSatish Balay   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2723b494cfeSSatish Balay }
2733b494cfeSSatish Balay 
2744d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(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  matsetvaluesblocked111_(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  matsetvaluesblocked1n_(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  matsetvaluesblockedn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2874d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2884d03fd2bSBarry Smith }
2894d03fd2bSBarry Smith 
2904d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
2914d03fd2bSBarry Smith {
2924d03fd2bSBarry Smith   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
2934d03fd2bSBarry Smith }
2944d03fd2bSBarry Smith 
2953b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2963b494cfeSSatish Balay   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2973b494cfeSSatish Balay }
2983b494cfeSSatish Balay 
2994d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(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  matsetvaluesblockedlocal111_(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  matsetvaluesblockedlocal1n_(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  matsetvaluesblockedlocaln1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3124d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3134d03fd2bSBarry Smith }
3144d03fd2bSBarry Smith 
3154d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3164d03fd2bSBarry Smith {
3174d03fd2bSBarry Smith   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
3184d03fd2bSBarry Smith }
3194d03fd2bSBarry Smith 
3201b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3211b266c99SBarry Smith {
3221b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3231b266c99SBarry Smith }
3241b266c99SBarry Smith 
3253b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3263b494cfeSSatish Balay {
3273b494cfeSSatish Balay   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3283b494cfeSSatish Balay }
3293b494cfeSSatish Balay 
3301b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3311b266c99SBarry Smith {
3321b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3331b266c99SBarry Smith }
3341b266c99SBarry Smith 
3354d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3364d03fd2bSBarry Smith {
3374d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3384d03fd2bSBarry Smith }
3394d03fd2bSBarry Smith 
3404d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3414d03fd2bSBarry Smith {
3424d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3434d03fd2bSBarry Smith }
3444d03fd2bSBarry Smith 
3454d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3464d03fd2bSBarry Smith {
3474d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3484d03fd2bSBarry Smith }
3494d03fd2bSBarry Smith 
3504d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3514d03fd2bSBarry Smith {
3524d03fd2bSBarry Smith   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
3534d03fd2bSBarry Smith }
3544d03fd2bSBarry Smith 
3553b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3563b494cfeSSatish Balay {
3573b494cfeSSatish Balay   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3583b494cfeSSatish Balay }
3593b494cfeSSatish Balay 
3604d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3614d03fd2bSBarry Smith {
3624d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3634d03fd2bSBarry Smith }
3644d03fd2bSBarry Smith 
3654d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11nn_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3664d03fd2bSBarry Smith {
3674d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3684d03fd2bSBarry Smith }
3694d03fd2bSBarry Smith 
3704d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal111_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3714d03fd2bSBarry Smith {
3724d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3734d03fd2bSBarry Smith }
3744d03fd2bSBarry Smith 
3754d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal1n_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3764d03fd2bSBarry Smith {
3774d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3784d03fd2bSBarry Smith }
3794d03fd2bSBarry Smith 
3804d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3814d03fd2bSBarry Smith {
3824d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3834d03fd2bSBarry Smith }
3844d03fd2bSBarry Smith 
38587bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
38687bcf4e0SBarry Smith {
38787bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
38887bcf4e0SBarry Smith   *ierr = MatGetRowMin(*mat,*v,idx);
38987bcf4e0SBarry Smith }
3904d03fd2bSBarry Smith 
39187bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
39287bcf4e0SBarry Smith {
39387bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
39487bcf4e0SBarry Smith   *ierr = MatGetRowMinAbs(*mat,*v,idx);
39587bcf4e0SBarry Smith }
39687bcf4e0SBarry Smith 
3975928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3985928be6bSBarry Smith {
3995928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
4005928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
4015928be6bSBarry Smith }
4025928be6bSBarry Smith 
4035928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
4045928be6bSBarry Smith {
4055928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
4065928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
4075928be6bSBarry Smith }
4085928be6bSBarry Smith 
409b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
410b22b330cSBarry Smith {
411b22b330cSBarry Smith   PetscErrorCode ierr = 0;
412b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
413b22b330cSBarry Smith   return 0;
414b22b330cSBarry Smith }
415b22b330cSBarry Smith 
4168cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
417b22b330cSBarry Smith {
418b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
419b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
42026fbe8dcSKarl Rupp 
421b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
422b22b330cSBarry Smith }
423b22b330cSBarry Smith 
424d2da0f5dSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
4257c54600cSBarry Smith {
4267c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
4277c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
4282a7a6963SBarry Smith   *ierr = MatCreateVecs(*mat,right,left);
4297c54600cSBarry Smith }
4307c54600cSBarry Smith 
4318cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
432ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
433f4e70085SSatish Balay {
4341a83f524SJed Brown   const PetscInt *IA,*JA;
4358f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
4361a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
4371a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
438f4e70085SSatish Balay }
439f4e70085SSatish Balay 
4408cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
441ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
442f4e70085SSatish Balay {
4431a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
4448f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
445f4e70085SSatish Balay }
446f4e70085SSatish Balay 
447f4e70085SSatish Balay /*
448f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
449f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
450f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
451f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
452f4e70085SSatish Balay   at a time.
453f4e70085SSatish Balay */
454f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
455f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
456f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
457f4e70085SSatish Balay 
4588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
459f4e70085SSatish Balay {
460f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
461f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
462f4e70085SSatish Balay 
463f4e70085SSatish Balay   if (matgetrowactive) {
464efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
465f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
466f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
467f4e70085SSatish Balay     *ierr = 1;
468f4e70085SSatish Balay     return;
469f4e70085SSatish Balay   }
470f4e70085SSatish Balay 
4710298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4720298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
473f4e70085SSatish Balay 
474f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
475f4e70085SSatish Balay   if (*ierr) return;
476f4e70085SSatish Balay 
477f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
478f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
479f4e70085SSatish Balay   matgetrowactive = 1;
480f4e70085SSatish Balay }
481f4e70085SSatish Balay 
4828cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
483f4e70085SSatish Balay {
484f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
485f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
486f4e70085SSatish Balay   if (!matgetrowactive) {
487efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
488f4e70085SSatish Balay                "Must call MatGetRow() first");
489f4e70085SSatish Balay     *ierr = 1;
490f4e70085SSatish Balay     return;
491f4e70085SSatish Balay   }
4920298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4930298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
494f4e70085SSatish Balay 
495f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
496f4e70085SSatish Balay   matgetrowactive = 0;
497f4e70085SSatish Balay }
498f4e70085SSatish Balay 
4998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
500f4e70085SSatish Balay {
501f4e70085SSatish Balay   PetscViewer v;
502f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
503f4e70085SSatish Balay   *ierr = MatView(*mat,v);
504f4e70085SSatish Balay }
505f4e70085SSatish Balay 
5068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
507f7e310deSShri Abhyankar {
508f7e310deSShri Abhyankar   PetscViewer v;
509f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
510112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
511f7e310deSShri Abhyankar }
512f7e310deSShri Abhyankar 
5138cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
514f4e70085SSatish Balay {
515f4e70085SSatish Balay   PetscScalar *mm;
516f4e70085SSatish Balay   PetscInt    m,n;
517f4e70085SSatish Balay 
5188c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
519f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
520f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
521f4e70085SSatish Balay }
522f4e70085SSatish Balay 
5238cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
524f4e70085SSatish Balay {
525f4e70085SSatish Balay   PetscScalar *lx;
526f4e70085SSatish Balay   PetscInt    m,n;
527f4e70085SSatish Balay 
528f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
529f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5308c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
531f4e70085SSatish Balay }
532f4e70085SSatish Balay 
5338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
53473a71a0fSBarry Smith {
53573a71a0fSBarry Smith   PetscScalar *mm;
53673a71a0fSBarry Smith   PetscInt    m,n;
53773a71a0fSBarry Smith 
5388c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
53973a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
54073a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
54173a71a0fSBarry Smith }
54273a71a0fSBarry Smith 
5438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
54473a71a0fSBarry Smith {
54573a71a0fSBarry Smith   PetscScalar *lx;
54673a71a0fSBarry Smith   PetscInt    m,n;
54773a71a0fSBarry Smith 
54873a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
54973a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5508c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
55173a71a0fSBarry Smith }
55273a71a0fSBarry Smith 
5537067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdensegetarrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5548572280aSBarry Smith {
5557067c7f7SBarry Smith   const PetscScalar *mm;
5568572280aSBarry Smith   PetscInt         m,n;
5578572280aSBarry Smith 
5588572280aSBarry Smith   *ierr = MatDenseGetArrayRead(*mat,&mm); if (*ierr) return;
5598572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
5607067c7f7SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,(PetscScalar*)mm,m*n,ia); if (*ierr) return;
5618572280aSBarry Smith }
5628572280aSBarry Smith 
5637067c7f7SBarry Smith 
5647067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdenserestorearrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5658572280aSBarry Smith {
5667067c7f7SBarry Smith   const PetscScalar *lx;
5678572280aSBarry Smith   PetscInt          m,n;
5688572280aSBarry Smith 
5698572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
5707067c7f7SBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,(PetscScalar**)&lx);if (*ierr) return;
5718572280aSBarry Smith   *ierr = MatDenseRestoreArrayRead(*mat,&lx);if (*ierr) return;
5728572280aSBarry Smith }
5738572280aSBarry Smith 
574390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
57535bd34faSBarry Smith {
57635bd34faSBarry Smith   const char *tname;
57735bd34faSBarry Smith 
5783ca39a21SBarry Smith   *ierr = MatFactorGetSolverType(*mat,&tname);if (*ierr) return;
57935bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
58035bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
58135bd34faSBarry Smith   }
58235bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
58335bd34faSBarry Smith }
58435bd34faSBarry Smith 
585390e1bf2SBarry 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))
5865dffd610SBarry Smith {
5875dffd610SBarry Smith   char *t;
5885dffd610SBarry Smith   FIXCHAR(outtype,len,t);
589d49bb8f9SBarry Smith   *ierr = MatGetFactor(*mat,t,*ftype,M);if (*ierr) return;
5905dffd610SBarry Smith   FREECHAR(outtype,t);
5915dffd610SBarry Smith }
5925dffd610SBarry Smith 
593390e1bf2SBarry 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))
594f4e70085SSatish Balay {
595f4e70085SSatish Balay   char *t;
596f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
597d49bb8f9SBarry Smith   *ierr = MatConvert(*mat,t,*reuse,M);if (*ierr) return;
598f4e70085SSatish Balay   FREECHAR(outtype,t);
599f4e70085SSatish Balay }
600f4e70085SSatish Balay 
601f4e70085SSatish Balay /*
6027dae84e0SHong Zhang     MatCreateSubmatrices() is slightly different from C since the
603f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
6047dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
605f4e70085SSatish Balay */
6067dae84e0SHong Zhang PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
607f4e70085SSatish Balay {
608f4e70085SSatish Balay   Mat      *lsmat;
609f4e70085SSatish Balay   PetscInt i;
610f4e70085SSatish Balay 
611f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
6127dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
613de7ef04eSHong Zhang     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
614f4e70085SSatish Balay       smat[i] = lsmat[i];
615f4e70085SSatish Balay     }
616f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
617f4e70085SSatish Balay   } else {
6187dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
619f4e70085SSatish Balay   }
620f4e70085SSatish Balay }
621f4e70085SSatish Balay 
6227d6bfa3bSBarry Smith /*
6237d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
624de7ef04eSHong Zhang     Fortran does not free the array of matrix objects, while in C that
625de7ef04eSHong Zhang     the array is freed
626de7ef04eSHong Zhang */
627de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
628de7ef04eSHong Zhang {
629de7ef04eSHong Zhang   PetscInt i;
630de7ef04eSHong Zhang 
631de7ef04eSHong Zhang   for (i=0; i<*n; i++) {
632de7ef04eSHong Zhang     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
633de7ef04eSHong Zhang   }
634de7ef04eSHong Zhang }
635de7ef04eSHong Zhang 
636de7ef04eSHong Zhang /*
637de7ef04eSHong Zhang     MatDestroySubMatrices() is slightly different from C since the
6387d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects, while in C that
6397dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
6407d6bfa3bSBarry Smith */
641de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
6427d6bfa3bSBarry Smith {
643de7ef04eSHong Zhang   Mat      *lsmat;
6447d6bfa3bSBarry Smith   PetscInt i;
6457d6bfa3bSBarry Smith 
646de7ef04eSHong Zhang   *ierr = PetscMalloc1(*n+1,&lsmat);
647de7ef04eSHong Zhang   for (i=0; i<=*n; i++) {
648de7ef04eSHong Zhang       lsmat[i] = smat[i];
6497d6bfa3bSBarry Smith   }
650de7ef04eSHong Zhang   *ierr = MatDestroySubMatrices(*n,&lsmat);
651df750dc8SHong Zhang }
652df750dc8SHong Zhang 
653390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
6541eea217eSSatish Balay {
6551eea217eSSatish Balay   char *t;
6561eea217eSSatish Balay 
6571eea217eSSatish Balay   FIXCHAR(prefix,len,t);
658d49bb8f9SBarry Smith   *ierr = MatSetOptionsPrefix(*mat,t);if (*ierr) return;
6591eea217eSSatish Balay   FREECHAR(prefix,t);
6601eea217eSSatish Balay }
6611eea217eSSatish Balay 
662d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
663812c3f48SMatthew Knepley {
664260663b8SBarry Smith   CHKFORTRANNULLOBJECT(*sp)
665d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
666812c3f48SMatthew Knepley }
6671eea217eSSatish Balay 
6684d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
6695ba43861SSatish Balay {
6704d03fd2bSBarry Smith   *ierr = MatGetInfo(*mat,*flag,info);
6715ba43861SSatish Balay }
6725ba43861SSatish Balay 
6734d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
67422688b47SSatish Balay {
6754d03fd2bSBarry Smith   *ierr = MatLUFactor(*mat,*row,*col,info);
67622688b47SSatish Balay }
67722688b47SSatish Balay 
6784d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
67922688b47SSatish Balay {
6804d03fd2bSBarry Smith   *ierr = MatILUFactor(*mat,*row,*col,info);
68122688b47SSatish Balay }
68222688b47SSatish Balay 
6834d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
68422688b47SSatish Balay {
6854d03fd2bSBarry Smith   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
68622688b47SSatish Balay }
68722688b47SSatish Balay 
6884d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
68922688b47SSatish Balay {
6904d03fd2bSBarry Smith   *ierr = MatLUFactorNumeric(*fact,*mat,info);
69122688b47SSatish Balay }
69222688b47SSatish Balay 
6934d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
69422688b47SSatish Balay {
6954d03fd2bSBarry Smith   *ierr = MatCholeskyFactor(*mat,*perm,info);
69622688b47SSatish Balay }
69722688b47SSatish Balay 
6984d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
69922688b47SSatish Balay {
7004d03fd2bSBarry Smith   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
70122688b47SSatish Balay }
70222688b47SSatish Balay 
7034d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
70422688b47SSatish Balay {
7054d03fd2bSBarry Smith   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
70622688b47SSatish Balay }
70722688b47SSatish Balay 
7084d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
70922688b47SSatish Balay {
7104d03fd2bSBarry Smith   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
71122688b47SSatish Balay }
71222688b47SSatish Balay 
7134d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
71422688b47SSatish Balay {
7154d03fd2bSBarry Smith   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
71622688b47SSatish Balay }
71722688b47SSatish Balay 
7184d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
71922688b47SSatish Balay {
7204d03fd2bSBarry Smith   *ierr = MatICCFactor(*mat,*row,info);
72122688b47SSatish Balay }
72222688b47SSatish Balay 
7234d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
72422688b47SSatish Balay {
7254d03fd2bSBarry Smith   *ierr = MatFactorInfoInitialize(info);
72622688b47SSatish Balay }
727d27e6124SSatish Balay PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
728d27e6124SSatish Balay {
729d27e6124SSatish Balay   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
730d27e6124SSatish Balay }
731d27e6124SSatish Balay PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal0_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
732d27e6124SSatish Balay {
733d27e6124SSatish Balay   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
734d27e6124SSatish Balay }
735d27e6124SSatish Balay PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal1_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
736d27e6124SSatish Balay {
737d27e6124SSatish Balay   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
738d27e6124SSatish Balay }
739