xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision afc39838a4156c0acd3fc2ac80d0fcaf32bc02dd)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2cee688dbSBarry Smith #include <petsc/private/f90impl.h>
3c6db04a5SJed Brown #include <petscmat.h>
4665c2dedSJed Brown #include <petscviewer.h>
5f4e70085SSatish Balay 
6f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
74d03fd2bSBarry Smith #define matsetvalues_                    MATSETVALUES
81006886cSSatish Balay #define matsetvaluesnnnn_                MATSETVALUESNNNN
93b494cfeSSatish Balay #define matsetvalues0_                   MATSETVALUES0
101b266c99SBarry Smith #define matsetvaluesnn1_                 MATSETVALUESNN1
114d03fd2bSBarry Smith #define matsetvalues11_                  MATSETVALUES11
124d03fd2bSBarry Smith #define matsetvalues1n_                  MATSETVALUES1N
134d03fd2bSBarry Smith #define matsetvaluesn1_                  MATSETVALUESN1
143b494cfeSSatish Balay #define matsetvaluesblocked0_            MATSETVALUESBLOCKED0
150aee3464SBarry Smith #define matsetvaluesblocked2_            MATSETVALUESBLOCKED2
164d03fd2bSBarry Smith #define matsetvaluesblocked11_           MATSETVALUESBLOCKED11
174d03fd2bSBarry Smith #define matsetvaluesblocked111_          MATSETVALUESBLOCKED111
184d03fd2bSBarry Smith #define matsetvaluesblocked1n_           MATSETVALUESBLOCKED1N
194d03fd2bSBarry Smith #define matsetvaluesblockedn1_           MATSETVALUESBLOCKEDN1
204d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        MATSETVALUESBLOCKEDLOCAL
213b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       MATSETVALUESBLOCKEDLOCAL0
224d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      MATSETVALUESBLOCKEDLOCAL11
234d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     MATSETVALUESBLOCKEDLOCAL111
244d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      MATSETVALUESBLOCKEDLOCAL1N
254d03fd2bSBarry Smith #define matsetvaluesblockedlocaln1_      MATSETVALUESBLOCKEDLOCALN1
264d03fd2bSBarry Smith #define matsetvalueslocal_               MATSETVALUESLOCAL
273b494cfeSSatish Balay #define matsetvalueslocal0_              MATSETVALUESLOCAL0
284d03fd2bSBarry Smith #define matsetvalueslocal11_             MATSETVALUESLOCAL11
294d03fd2bSBarry Smith #define matsetvalueslocal11nn_           MATSETVALUESLOCAL11NN
304d03fd2bSBarry Smith #define matsetvalueslocal111_            MATSETVALUESLOCAL111
314d03fd2bSBarry Smith #define matsetvalueslocal1n_             MATSETVALUESLOCAL1N
324d03fd2bSBarry Smith #define matsetvalueslocaln1_             MATSETVALUESLOCALN1
3387bcf4e0SBarry Smith #define matgetrowmin_                    MATGETROWMIN
3487bcf4e0SBarry Smith #define matgetrowminabs_                 MATGETROWMINABS
355928be6bSBarry Smith #define matgetrowmax_                    MATGETROWMAX
365928be6bSBarry Smith #define matgetrowmaxabs_                 MATGETROWMAXABS
377d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
38df750dc8SHong Zhang #define matdestroysubmatrices_           MATDESTROYSUBMATRICES
395dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
4035bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
41f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
42f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
43f4e70085SSatish Balay #define matgetrow_                       MATGETROW
44f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
45f7e310deSShri Abhyankar #define matload_                         MATLOAD
46f4e70085SSatish Balay #define matview_                         MATVIEW
478c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
486778691eSSatish Balay #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
498c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
508c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
51f4e70085SSatish Balay #define matconvert_                      MATCONVERT
527dae84e0SHong Zhang #define matcreatesubmatrices_            MATCREATESUBMATRICES
5317ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
5417ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
5517ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
56d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
57f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
58f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
59f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
60f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
6117ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
6217ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
631eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
64fcc9d04bSBarry Smith #define matcreatevecs_                   MATCREATEVECS
65c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
665ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
6722688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
6822688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
6922688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
7022688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
7122688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
7222688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
7322688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
7422688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
7522688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
7622688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
7722688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
78b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
790905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
803be0408cSBarry Smith #define matgetsize00_                    MATGETSIZE00
813be0408cSBarry Smith #define matgetsize10_                    MATGETSIZE10
823be0408cSBarry Smith #define matgetsize01_                    MATGETSIZE01
833be0408cSBarry Smith #define matgetlocalsize00_               MATGETLOCALSIZE00
843be0408cSBarry Smith #define matgetlocalsize10_               MATGETLOCALSIZE10
853be0408cSBarry Smith #define matgetlocalsize01_               MATGETLOCALSIZE01
86260663b8SBarry Smith #define matgetnullspace_                 MATGETNULLSPACE
87260663b8SBarry Smith #define matsetnullspace_                 MATSETNULLSPACE
88260663b8SBarry Smith #define matgetownershiprange_            MATGETOWNERSHIPRANGE
89*afc39838SBarry Smith #define matgetownershiprangecolumn_      MATGETOWNERSHIPRANGECOLUMN
90f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
914d03fd2bSBarry Smith #define matsetvalues_                    matsetvalues
921006886cSSatish Balay #define matsetvaluesnnnn_                matsetvaluesnnnn
933b494cfeSSatish Balay #define matsetvalues0_                   matsetvalues0
941b266c99SBarry Smith #define matsetvaluesnn1_                 matsetvaluesnn1
954d03fd2bSBarry Smith #define matsetvalues11_                  matsetvalues11
964d03fd2bSBarry Smith #define matsetvaluesn1_                  matsetvaluesn1
974d03fd2bSBarry Smith #define matsetvalues1n_                  matsetvalues1n
984d03fd2bSBarry Smith #define matsetvalueslocal_               matsetvalueslocal
993b494cfeSSatish Balay #define matsetvalueslocal0_              matsetvalueslocal0
1004d03fd2bSBarry Smith #define matsetvalueslocal11_             matsetvalueslocal11
1014d03fd2bSBarry Smith #define matsetvalueslocal11nn_           matsetvalueslocal11nn
1024d03fd2bSBarry Smith #define matsetvalueslocal111_            matsetvalueslocal111
1034d03fd2bSBarry Smith #define matsetvalueslocal1n_             matsetvalueslocal1n
1044d03fd2bSBarry Smith #define matsetvalueslocaln1_             matsetvalueslocaln1
1054d03fd2bSBarry Smith #define matsetvaluesblocked_             matsetvaluesblocked
1063b494cfeSSatish Balay #define matsetvaluesblocked0_            matsetvaluesblocked0
1070aee3464SBarry Smith #define matsetvaluesblocked2_            matsetvaluesblocked2
1084d03fd2bSBarry Smith #define matsetvaluesblocked11_           matsetvaluesblocked11
1094d03fd2bSBarry Smith #define matsetvaluesblocked111_          matsetvaluesblocked111
1104d03fd2bSBarry Smith #define matsetvaluesblocked1n_           matsetvaluesblocked1n
11124aa916eSSatish Balay #define matsetvaluesblockedn1_           matsetvaluesblockedn1
1124d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        matsetvaluesblockedlocal
1133b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       matsetvaluesblockedlocal0
1144d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      matsetvaluesblockedlocal11
1154d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     matsetvaluesblockedlocal111
1164d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      matsetvaluesblockedlocal1n
11724aa916eSSatish Balay #define matsetvaluesblockedlocaln1_      matsetvaluesblockedlocaln1
11887bcf4e0SBarry Smith #define matgetrowmin_                    matgetrowmin
11987bcf4e0SBarry Smith #define matgetrowminabs_                 matgetrowminabs
1205928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
1215928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
1225928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
123df750dc8SHong Zhang #define matdestroysubmatrices_           matdestroysubmatrices
1245dffd610SBarry Smith #define matgetfactor_                    matgetfactor
12535bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
126fcc9d04bSBarry Smith #define matcreatevecs_                   matcreatevecs
127f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
128f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
129f4e70085SSatish Balay #define matgetrow_                       matgetrow
130f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
131f4e70085SSatish Balay #define matview_                         matview
132f7e310deSShri Abhyankar #define matload_                         matload
1338c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
1348c778c55SBarry Smith #define matseqaijrestorearray_           matseqaijrestorearray
1358c778c55SBarry Smith #define matdensegetarray_                matdensegetarray
1368c778c55SBarry Smith #define matdenserestorearray_            matdenserestorearray
137f4e70085SSatish Balay #define matconvert_                      matconvert
1387dae84e0SHong Zhang #define matcreatesubmatrices_            matcreatesubmatrices
13917ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
14017ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
14117ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
142d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
143f4e70085SSatish Balay #define matzerorows_                     matzerorows
144f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
145f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
146f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
14717ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
14817ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
1491eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
150812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
1515ba43861SSatish Balay #define matgetinfo_                      matgetinfo
15222688b47SSatish Balay #define matlufactor_                     matlufactor
15322688b47SSatish Balay #define matilufactor_                    matilufactor
15422688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
15522688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
15622688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
15722688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
15822688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
15922688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
16022688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
16122688b47SSatish Balay #define maticcfactor_                    maticcfactor
16222688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
163b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
1640905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
1653be0408cSBarry Smith #define matgetsize00_                    matgetsize00
1663be0408cSBarry Smith #define matgetsize10_                    matgetsize10
1673be0408cSBarry Smith #define matgetsize01_                    matgetsize01
1683be0408cSBarry Smith #define matgetlocalsize00_               matgetlocalsize00
1693be0408cSBarry Smith #define matgetlocalsize10_               matgetlocalsize10
1703be0408cSBarry Smith #define matgetlocalsize01_               matgetlocalsize01
171260663b8SBarry Smith #define matgetnullspace_                 matgetnullspace
172260663b8SBarry Smith #define matsetnullspace_                 matsetnullspace
173260663b8SBarry Smith #define matgetownershiprange_            matgetownershiprange
174*afc39838SBarry Smith #define matgetownershiprangecolumn_      matgetownershiprangecolumn
175f4e70085SSatish Balay #endif
176f4e70085SSatish Balay 
177260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
178260663b8SBarry Smith {
179260663b8SBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(nullsp);
180260663b8SBarry Smith   *ierr = MatSetNullSpace(*mat,*nullsp);
181260663b8SBarry Smith }
182260663b8SBarry Smith 
183260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
184260663b8SBarry Smith {
185260663b8SBarry Smith   MatNullSpace sp;
186260663b8SBarry Smith   *ierr = MatGetNullSpace(*mat,&sp);if (*ierr) return;
187260663b8SBarry Smith   if (!sp) {
188260663b8SBarry Smith     *nullsp = (MatNullSpace) -1;
189260663b8SBarry Smith   } else {
190260663b8SBarry Smith     *nullsp = sp;
191260663b8SBarry Smith   }
192260663b8SBarry Smith }
193260663b8SBarry Smith 
194260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
195260663b8SBarry Smith {
196260663b8SBarry Smith   CHKFORTRANNULLINTEGER(m);
197260663b8SBarry Smith   CHKFORTRANNULLINTEGER(n);
198260663b8SBarry Smith   *ierr = MatGetOwnershipRange(*mat,m,n);
199260663b8SBarry Smith }
200260663b8SBarry Smith 
201*afc39838SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprangecolumn_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
202*afc39838SBarry Smith {
203*afc39838SBarry Smith   CHKFORTRANNULLINTEGER(m);
204*afc39838SBarry Smith   CHKFORTRANNULLINTEGER(n);
205*afc39838SBarry Smith   *ierr = MatGetOwnershipRangeColumn(*mat,m,n);
206*afc39838SBarry Smith }
207*afc39838SBarry Smith 
2083be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2093be0408cSBarry Smith {
2103be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2113be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2123be0408cSBarry Smith   *ierr = MatGetSize(*mat,m,n);
2133be0408cSBarry Smith }
2143be0408cSBarry Smith 
2153be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2163be0408cSBarry Smith {
2173be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2183be0408cSBarry Smith }
2193be0408cSBarry Smith 
2203be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2213be0408cSBarry Smith {
2223be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2233be0408cSBarry Smith }
2243be0408cSBarry Smith 
2253be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2263be0408cSBarry Smith {
2273be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2283be0408cSBarry Smith }
2293be0408cSBarry Smith 
2303be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2313be0408cSBarry Smith {
2323be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2333be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2343be0408cSBarry Smith   *ierr = MatGetLocalSize(*mat,m,n);
2353be0408cSBarry Smith }
2363be0408cSBarry Smith 
2373be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2383be0408cSBarry Smith {
2393be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2403be0408cSBarry Smith }
2413be0408cSBarry Smith 
2423be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2433be0408cSBarry Smith {
2443be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2453be0408cSBarry Smith }
2463be0408cSBarry Smith 
2473be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2483be0408cSBarry Smith {
2493be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2503be0408cSBarry Smith }
2513be0408cSBarry Smith 
2524d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2534d03fd2bSBarry Smith   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
2544d03fd2bSBarry Smith }
2554d03fd2bSBarry Smith 
256cee688dbSBarry 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)){
257cee688dbSBarry Smith   PetscScalar *fa;
2580aee3464SBarry Smith   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
259cee688dbSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
260cee688dbSBarry Smith }
261cee688dbSBarry Smith 
2623b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2633b494cfeSSatish Balay   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2643b494cfeSSatish Balay }
2653b494cfeSSatish Balay 
2664d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(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  matsetvaluesblocked111_(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  matsetvaluesblocked1n_(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  matsetvaluesblockedn1_(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  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
2834d03fd2bSBarry Smith {
2844d03fd2bSBarry Smith   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
2854d03fd2bSBarry Smith }
2864d03fd2bSBarry Smith 
2873b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2883b494cfeSSatish Balay   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
2893b494cfeSSatish Balay }
2903b494cfeSSatish Balay 
2914d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(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  matsetvaluesblockedlocal111_(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  matsetvaluesblockedlocal1n_(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  matsetvaluesblockedlocaln1_(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  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3084d03fd2bSBarry Smith {
3094d03fd2bSBarry Smith   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
3104d03fd2bSBarry Smith }
3114d03fd2bSBarry Smith 
3121b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3131b266c99SBarry Smith {
3141b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3151b266c99SBarry Smith }
3161b266c99SBarry Smith 
3173b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3183b494cfeSSatish Balay {
3193b494cfeSSatish Balay   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3203b494cfeSSatish Balay }
3213b494cfeSSatish Balay 
3221b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3231b266c99SBarry Smith {
3241b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3251b266c99SBarry Smith }
3261b266c99SBarry Smith 
3274d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3284d03fd2bSBarry Smith {
3294d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3304d03fd2bSBarry Smith }
3314d03fd2bSBarry Smith 
3324d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3334d03fd2bSBarry Smith {
3344d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3354d03fd2bSBarry Smith }
3364d03fd2bSBarry Smith 
3374d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3384d03fd2bSBarry Smith {
3394d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3404d03fd2bSBarry Smith }
3414d03fd2bSBarry Smith 
3424d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3434d03fd2bSBarry Smith {
3444d03fd2bSBarry Smith   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
3454d03fd2bSBarry Smith }
3464d03fd2bSBarry Smith 
3473b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3483b494cfeSSatish Balay {
3493b494cfeSSatish Balay   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3503b494cfeSSatish Balay }
3513b494cfeSSatish Balay 
3524d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3534d03fd2bSBarry Smith {
3544d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3554d03fd2bSBarry Smith }
3564d03fd2bSBarry Smith 
3574d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11nn_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3584d03fd2bSBarry Smith {
3594d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3604d03fd2bSBarry Smith }
3614d03fd2bSBarry Smith 
3624d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal111_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3634d03fd2bSBarry Smith {
3644d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3654d03fd2bSBarry Smith }
3664d03fd2bSBarry Smith 
3674d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal1n_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3684d03fd2bSBarry Smith {
3694d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3704d03fd2bSBarry Smith }
3714d03fd2bSBarry Smith 
3724d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3734d03fd2bSBarry Smith {
3744d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3754d03fd2bSBarry Smith }
3764d03fd2bSBarry Smith 
37787bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
37887bcf4e0SBarry Smith {
37987bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
38087bcf4e0SBarry Smith   *ierr = MatGetRowMin(*mat,*v,idx);
38187bcf4e0SBarry Smith }
3824d03fd2bSBarry Smith 
38387bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
38487bcf4e0SBarry Smith {
38587bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
38687bcf4e0SBarry Smith   *ierr = MatGetRowMinAbs(*mat,*v,idx);
38787bcf4e0SBarry Smith }
38887bcf4e0SBarry Smith 
3895928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3905928be6bSBarry Smith {
3915928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
3925928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
3935928be6bSBarry Smith }
3945928be6bSBarry Smith 
3955928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
3965928be6bSBarry Smith {
3975928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
3985928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
3995928be6bSBarry Smith }
4005928be6bSBarry Smith 
401b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
402b22b330cSBarry Smith {
403b22b330cSBarry Smith   PetscErrorCode ierr = 0;
404b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
405b22b330cSBarry Smith   return 0;
406b22b330cSBarry Smith }
407b22b330cSBarry Smith 
4088cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
409b22b330cSBarry Smith {
410b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
411b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
41226fbe8dcSKarl Rupp 
413b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
414b22b330cSBarry Smith }
415b22b330cSBarry Smith 
416d2da0f5dSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
4177c54600cSBarry Smith {
4187c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
4197c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
4202a7a6963SBarry Smith   *ierr = MatCreateVecs(*mat,right,left);
4217c54600cSBarry Smith }
4227c54600cSBarry Smith 
4238cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
424ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
425f4e70085SSatish Balay {
4261a83f524SJed Brown   const PetscInt *IA,*JA;
4278f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
4281a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
4291a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
430f4e70085SSatish Balay }
431f4e70085SSatish Balay 
4328cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
433ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
434f4e70085SSatish Balay {
4351a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
4368f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
437f4e70085SSatish Balay }
438f4e70085SSatish Balay 
439f4e70085SSatish Balay /*
440f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
441f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
442f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
443f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
444f4e70085SSatish Balay   at a time.
445f4e70085SSatish Balay */
446f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
447f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
448f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
449f4e70085SSatish Balay 
4508cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
451f4e70085SSatish Balay {
452f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
453f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
454f4e70085SSatish Balay 
455f4e70085SSatish Balay   if (matgetrowactive) {
456efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
457f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
458f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
459f4e70085SSatish Balay     *ierr = 1;
460f4e70085SSatish Balay     return;
461f4e70085SSatish Balay   }
462f4e70085SSatish Balay 
4630298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4640298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
465f4e70085SSatish Balay 
466f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
467f4e70085SSatish Balay   if (*ierr) return;
468f4e70085SSatish Balay 
469f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
470f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
471f4e70085SSatish Balay   matgetrowactive = 1;
472f4e70085SSatish Balay }
473f4e70085SSatish Balay 
4748cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
475f4e70085SSatish Balay {
476f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
477f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
478f4e70085SSatish Balay   if (!matgetrowactive) {
479efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
480f4e70085SSatish Balay                "Must call MatGetRow() first");
481f4e70085SSatish Balay     *ierr = 1;
482f4e70085SSatish Balay     return;
483f4e70085SSatish Balay   }
4840298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4850298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
486f4e70085SSatish Balay 
487f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
488f4e70085SSatish Balay   matgetrowactive = 0;
489f4e70085SSatish Balay }
490f4e70085SSatish Balay 
4918cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
492f4e70085SSatish Balay {
493f4e70085SSatish Balay   PetscViewer v;
494f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
495f4e70085SSatish Balay   *ierr = MatView(*mat,v);
496f4e70085SSatish Balay }
497f4e70085SSatish Balay 
4988cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
499f7e310deSShri Abhyankar {
500f7e310deSShri Abhyankar   PetscViewer v;
501f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
502112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
503f7e310deSShri Abhyankar }
504f7e310deSShri Abhyankar 
5058cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
506f4e70085SSatish Balay {
507f4e70085SSatish Balay   PetscScalar *mm;
508f4e70085SSatish Balay   PetscInt    m,n;
509f4e70085SSatish Balay 
5108c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
511f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
512f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
513f4e70085SSatish Balay }
514f4e70085SSatish Balay 
5158cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
516f4e70085SSatish Balay {
517f4e70085SSatish Balay   PetscScalar *lx;
518f4e70085SSatish Balay   PetscInt    m,n;
519f4e70085SSatish Balay 
520f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
521f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5228c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
523f4e70085SSatish Balay }
524f4e70085SSatish Balay 
5258cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
52673a71a0fSBarry Smith {
52773a71a0fSBarry Smith   PetscScalar *mm;
52873a71a0fSBarry Smith   PetscInt    m,n;
52973a71a0fSBarry Smith 
5308c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
53173a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
53273a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
53373a71a0fSBarry Smith }
53473a71a0fSBarry Smith 
5358cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
53673a71a0fSBarry Smith {
53773a71a0fSBarry Smith   PetscScalar *lx;
53873a71a0fSBarry Smith   PetscInt    m,n;
53973a71a0fSBarry Smith 
54073a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
54173a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5428c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
54373a71a0fSBarry Smith }
54473a71a0fSBarry Smith 
545390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
54635bd34faSBarry Smith {
54735bd34faSBarry Smith   const char *tname;
54835bd34faSBarry Smith 
54935bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
55035bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
55135bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
55235bd34faSBarry Smith   }
55335bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
55435bd34faSBarry Smith }
55535bd34faSBarry Smith 
556390e1bf2SBarry 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))
5575dffd610SBarry Smith {
5585dffd610SBarry Smith   char *t;
5595dffd610SBarry Smith   FIXCHAR(outtype,len,t);
5609be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
5615dffd610SBarry Smith   FREECHAR(outtype,t);
5625dffd610SBarry Smith }
5635dffd610SBarry Smith 
564390e1bf2SBarry 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))
565f4e70085SSatish Balay {
566f4e70085SSatish Balay   char *t;
567f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
568f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
569f4e70085SSatish Balay   FREECHAR(outtype,t);
570f4e70085SSatish Balay }
571f4e70085SSatish Balay 
572f4e70085SSatish Balay /*
5737dae84e0SHong Zhang     MatCreateSubmatrices() is slightly different from C since the
574f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
5757dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
576f4e70085SSatish Balay */
5777dae84e0SHong Zhang PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
578f4e70085SSatish Balay {
579f4e70085SSatish Balay   Mat      *lsmat;
580f4e70085SSatish Balay   PetscInt i;
581f4e70085SSatish Balay 
582f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
5837dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
584de7ef04eSHong Zhang     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
585f4e70085SSatish Balay       smat[i] = lsmat[i];
586f4e70085SSatish Balay     }
587f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
588f4e70085SSatish Balay   } else {
5897dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
590f4e70085SSatish Balay   }
591f4e70085SSatish Balay }
592f4e70085SSatish Balay 
5937d6bfa3bSBarry Smith /*
5947d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
595de7ef04eSHong Zhang     Fortran does not free the array of matrix objects, while in C that
596de7ef04eSHong Zhang     the array is freed
597de7ef04eSHong Zhang */
598de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
599de7ef04eSHong Zhang {
600de7ef04eSHong Zhang   PetscInt i;
601de7ef04eSHong Zhang 
602de7ef04eSHong Zhang   for (i=0; i<*n; i++) {
603de7ef04eSHong Zhang     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
604de7ef04eSHong Zhang   }
605de7ef04eSHong Zhang }
606de7ef04eSHong Zhang 
607de7ef04eSHong Zhang /*
608de7ef04eSHong Zhang     MatDestroySubMatrices() is slightly different from C since the
6097d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects, while in C that
6107dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
6117d6bfa3bSBarry Smith */
612de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
6137d6bfa3bSBarry Smith {
614de7ef04eSHong Zhang   Mat      *lsmat;
6157d6bfa3bSBarry Smith   PetscInt i;
6167d6bfa3bSBarry Smith 
617de7ef04eSHong Zhang   *ierr = PetscMalloc1(*n+1,&lsmat);
618de7ef04eSHong Zhang   for (i=0; i<=*n; i++) {
619de7ef04eSHong Zhang       lsmat[i] = smat[i];
6207d6bfa3bSBarry Smith   }
621de7ef04eSHong Zhang   *ierr = MatDestroySubMatrices(*n,&lsmat);
622df750dc8SHong Zhang }
623df750dc8SHong Zhang 
6248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
62517ede90eSSatish Balay {
62617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
62717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
62817ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
62917ede90eSSatish Balay }
63017ede90eSSatish Balay 
6318cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
63217ede90eSSatish Balay {
63317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
63417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
63517ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
63617ede90eSSatish Balay }
63717ede90eSSatish Balay 
6388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
63917ede90eSSatish Balay {
64017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
64117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
64217ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
64317ede90eSSatish Balay }
64417ede90eSSatish Balay 
6458cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
646d25a37e1SJed Brown {
647d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
648d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
649d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
650d25a37e1SJed Brown }
651d25a37e1SJed Brown 
6528cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
653f4e70085SSatish Balay {
6542b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6552b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6562b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
657f4e70085SSatish Balay }
658f4e70085SSatish Balay 
6598cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
660f4e70085SSatish Balay {
6612b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6622b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6632b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
664f4e70085SSatish Balay }
665f4e70085SSatish Balay 
6668cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
667f4e70085SSatish Balay {
6682b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6692b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6702b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
671f4e70085SSatish Balay }
672f4e70085SSatish Balay 
6738cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
674f4e70085SSatish Balay {
6752b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6762b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6772b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
678f4e70085SSatish Balay }
679f4e70085SSatish Balay 
6808cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
68117ede90eSSatish Balay {
68217ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
68317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
68417ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
68517ede90eSSatish Balay }
68617ede90eSSatish Balay 
6878cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
68817ede90eSSatish Balay {
68917ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
69017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
69117ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
69217ede90eSSatish Balay }
6931eea217eSSatish Balay 
694390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
6951eea217eSSatish Balay {
6961eea217eSSatish Balay   char *t;
6971eea217eSSatish Balay 
6981eea217eSSatish Balay   FIXCHAR(prefix,len,t);
6991eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
7001eea217eSSatish Balay   FREECHAR(prefix,t);
7011eea217eSSatish Balay }
7021eea217eSSatish Balay 
703d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
704812c3f48SMatthew Knepley {
705260663b8SBarry Smith   CHKFORTRANNULLOBJECT(*sp)
706d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
707812c3f48SMatthew Knepley }
7081eea217eSSatish Balay 
7094d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
7105ba43861SSatish Balay {
7114d03fd2bSBarry Smith   *ierr = MatGetInfo(*mat,*flag,info);
7125ba43861SSatish Balay }
7135ba43861SSatish Balay 
7144d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
71522688b47SSatish Balay {
7164d03fd2bSBarry Smith   *ierr = MatLUFactor(*mat,*row,*col,info);
71722688b47SSatish Balay }
71822688b47SSatish Balay 
7194d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
72022688b47SSatish Balay {
7214d03fd2bSBarry Smith   *ierr = MatILUFactor(*mat,*row,*col,info);
72222688b47SSatish Balay }
72322688b47SSatish Balay 
7244d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
72522688b47SSatish Balay {
7264d03fd2bSBarry Smith   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
72722688b47SSatish Balay }
72822688b47SSatish Balay 
7294d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
73022688b47SSatish Balay {
7314d03fd2bSBarry Smith   *ierr = MatLUFactorNumeric(*fact,*mat,info);
73222688b47SSatish Balay }
73322688b47SSatish Balay 
7344d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
73522688b47SSatish Balay {
7364d03fd2bSBarry Smith   *ierr = MatCholeskyFactor(*mat,*perm,info);
73722688b47SSatish Balay }
73822688b47SSatish Balay 
7394d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
74022688b47SSatish Balay {
7414d03fd2bSBarry Smith   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
74222688b47SSatish Balay }
74322688b47SSatish Balay 
7444d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
74522688b47SSatish Balay {
7464d03fd2bSBarry Smith   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
74722688b47SSatish Balay }
74822688b47SSatish Balay 
7494d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
75022688b47SSatish Balay {
7514d03fd2bSBarry Smith   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
75222688b47SSatish Balay }
75322688b47SSatish Balay 
7544d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
75522688b47SSatish Balay {
7564d03fd2bSBarry Smith   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
75722688b47SSatish Balay }
75822688b47SSatish Balay 
7594d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
76022688b47SSatish Balay {
7614d03fd2bSBarry Smith   *ierr = MatICCFactor(*mat,*row,info);
76222688b47SSatish Balay }
76322688b47SSatish Balay 
7644d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
76522688b47SSatish Balay {
7664d03fd2bSBarry Smith   *ierr = MatFactorInfoInitialize(info);
76722688b47SSatish Balay }
768