xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision c08c7cb97c8a96079b8cb5b2881afccfb9915bda)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2cee688dbSBarry Smith #include <petsc/private/f90impl.h>
3c6db04a5SJed Brown #include <petscmat.h>
4665c2dedSJed Brown #include <petscviewer.h>
5f4e70085SSatish Balay 
6f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
74d03fd2bSBarry Smith #define matsetvalues_                    MATSETVALUES
81006886cSSatish Balay #define matsetvaluesnnnn_                MATSETVALUESNNNN
93b494cfeSSatish Balay #define matsetvalues0_                   MATSETVALUES0
101b266c99SBarry Smith #define matsetvaluesnn1_                 MATSETVALUESNN1
114d03fd2bSBarry Smith #define matsetvalues11_                  MATSETVALUES11
124d03fd2bSBarry Smith #define matsetvalues1n_                  MATSETVALUES1N
134d03fd2bSBarry Smith #define matsetvaluesn1_                  MATSETVALUESN1
143b494cfeSSatish Balay #define matsetvaluesblocked0_            MATSETVALUESBLOCKED0
150aee3464SBarry Smith #define matsetvaluesblocked2_            MATSETVALUESBLOCKED2
164d03fd2bSBarry Smith #define matsetvaluesblocked11_           MATSETVALUESBLOCKED11
174d03fd2bSBarry Smith #define matsetvaluesblocked111_          MATSETVALUESBLOCKED111
184d03fd2bSBarry Smith #define matsetvaluesblocked1n_           MATSETVALUESBLOCKED1N
194d03fd2bSBarry Smith #define matsetvaluesblockedn1_           MATSETVALUESBLOCKEDN1
204d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        MATSETVALUESBLOCKEDLOCAL
213b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       MATSETVALUESBLOCKEDLOCAL0
224d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      MATSETVALUESBLOCKEDLOCAL11
234d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     MATSETVALUESBLOCKEDLOCAL111
244d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      MATSETVALUESBLOCKEDLOCAL1N
254d03fd2bSBarry Smith #define matsetvaluesblockedlocaln1_      MATSETVALUESBLOCKEDLOCALN1
264d03fd2bSBarry Smith #define matsetvalueslocal_               MATSETVALUESLOCAL
273b494cfeSSatish Balay #define matsetvalueslocal0_              MATSETVALUESLOCAL0
284d03fd2bSBarry Smith #define matsetvalueslocal11_             MATSETVALUESLOCAL11
294d03fd2bSBarry Smith #define matsetvalueslocal11nn_           MATSETVALUESLOCAL11NN
304d03fd2bSBarry Smith #define matsetvalueslocal111_            MATSETVALUESLOCAL111
314d03fd2bSBarry Smith #define matsetvalueslocal1n_             MATSETVALUESLOCAL1N
324d03fd2bSBarry Smith #define matsetvalueslocaln1_             MATSETVALUESLOCALN1
3387bcf4e0SBarry Smith #define matgetrowmin_                    MATGETROWMIN
3487bcf4e0SBarry Smith #define matgetrowminabs_                 MATGETROWMINABS
355928be6bSBarry Smith #define matgetrowmax_                    MATGETROWMAX
365928be6bSBarry Smith #define matgetrowmaxabs_                 MATGETROWMAXABS
377d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
38df750dc8SHong Zhang #define matdestroysubmatrices_           MATDESTROYSUBMATRICES
395dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
4035bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
41f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
42f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
43f4e70085SSatish Balay #define matgetrow_                       MATGETROW
44f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
45f7e310deSShri Abhyankar #define matload_                         MATLOAD
46f4e70085SSatish Balay #define matview_                         MATVIEW
478c778c55SBarry Smith #define matseqaijgetarray_               MATSEQAIJGETARRAY
486778691eSSatish Balay #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
498c778c55SBarry Smith #define matdensegetarray_                MATDENSEGETARRAY
508572280aSBarry Smith #define matdensegetarrayread_            MATDENSEGETARRAYREAD
518c778c55SBarry Smith #define matdenserestorearray_            MATDENSERESTOREARRAY
528572280aSBarry Smith #define matdenserestorearrayread_        MATDENSERESTOREARRAYREAD
53f4e70085SSatish Balay #define matconvert_                      MATCONVERT
547dae84e0SHong Zhang #define matcreatesubmatrices_            MATCREATESUBMATRICES
5517ede90eSSatish Balay #define matzerorowscolumns_              MATZEROROWSCOLUMNS
5617ede90eSSatish Balay #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
5717ede90eSSatish Balay #define matzerorowsstencil_              MATZEROROWSSTENCIL
58d25a37e1SJed Brown #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
59f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
60f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
61f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
62f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
6317ede90eSSatish Balay #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
6417ede90eSSatish Balay #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
651eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
66fcc9d04bSBarry Smith #define matcreatevecs_                   MATCREATEVECS
67c9d5ca86SBarry Smith #define matnullspaceremove_              MATNULLSPACEREMOVE
685ba43861SSatish Balay #define matgetinfo_                      MATGETINFO
6922688b47SSatish Balay #define matlufactor_                     MATLUFACTOR
7022688b47SSatish Balay #define matilufactor_                    MATILUFACTOR
7122688b47SSatish Balay #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
7222688b47SSatish Balay #define matlufactornumeric_              MATLUFACTORNUMERIC
7322688b47SSatish Balay #define matcholeskyfactor_               MATCHOLESKYFACTOR
7422688b47SSatish Balay #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
7522688b47SSatish Balay #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
7622688b47SSatish Balay #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
7722688b47SSatish Balay #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
7822688b47SSatish Balay #define maticcfactor_                    MATICCFACTOR
7922688b47SSatish Balay #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
80b22b330cSBarry Smith #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
810905d9aaSJed Brown #define matfindnonzerorows_              MATFINDNONZEROROWS
823be0408cSBarry Smith #define matgetsize00_                    MATGETSIZE00
833be0408cSBarry Smith #define matgetsize10_                    MATGETSIZE10
843be0408cSBarry Smith #define matgetsize01_                    MATGETSIZE01
853be0408cSBarry Smith #define matgetlocalsize00_               MATGETLOCALSIZE00
863be0408cSBarry Smith #define matgetlocalsize10_               MATGETLOCALSIZE10
873be0408cSBarry Smith #define matgetlocalsize01_               MATGETLOCALSIZE01
88260663b8SBarry Smith #define matgetnullspace_                 MATGETNULLSPACE
89260663b8SBarry Smith #define matsetnullspace_                 MATSETNULLSPACE
90260663b8SBarry Smith #define matgetownershiprange_            MATGETOWNERSHIPRANGE
91*c08c7cb9SBarry Smith #define matgetownershipis_               MATGETOWNERSHIPIS
92afc39838SBarry Smith #define matgetownershiprangecolumn_      MATGETOWNERSHIPRANGECOLUMN
93f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
944d03fd2bSBarry Smith #define matsetvalues_                    matsetvalues
951006886cSSatish Balay #define matsetvaluesnnnn_                matsetvaluesnnnn
963b494cfeSSatish Balay #define matsetvalues0_                   matsetvalues0
971b266c99SBarry Smith #define matsetvaluesnn1_                 matsetvaluesnn1
984d03fd2bSBarry Smith #define matsetvalues11_                  matsetvalues11
994d03fd2bSBarry Smith #define matsetvaluesn1_                  matsetvaluesn1
1004d03fd2bSBarry Smith #define matsetvalues1n_                  matsetvalues1n
1014d03fd2bSBarry Smith #define matsetvalueslocal_               matsetvalueslocal
1023b494cfeSSatish Balay #define matsetvalueslocal0_              matsetvalueslocal0
1034d03fd2bSBarry Smith #define matsetvalueslocal11_             matsetvalueslocal11
1044d03fd2bSBarry Smith #define matsetvalueslocal11nn_           matsetvalueslocal11nn
1054d03fd2bSBarry Smith #define matsetvalueslocal111_            matsetvalueslocal111
1064d03fd2bSBarry Smith #define matsetvalueslocal1n_             matsetvalueslocal1n
1074d03fd2bSBarry Smith #define matsetvalueslocaln1_             matsetvalueslocaln1
1084d03fd2bSBarry Smith #define matsetvaluesblocked_             matsetvaluesblocked
1093b494cfeSSatish Balay #define matsetvaluesblocked0_            matsetvaluesblocked0
1100aee3464SBarry Smith #define matsetvaluesblocked2_            matsetvaluesblocked2
1114d03fd2bSBarry Smith #define matsetvaluesblocked11_           matsetvaluesblocked11
1124d03fd2bSBarry Smith #define matsetvaluesblocked111_          matsetvaluesblocked111
1134d03fd2bSBarry Smith #define matsetvaluesblocked1n_           matsetvaluesblocked1n
11424aa916eSSatish Balay #define matsetvaluesblockedn1_           matsetvaluesblockedn1
1154d03fd2bSBarry Smith #define matsetvaluesblockedlocal_        matsetvaluesblockedlocal
1163b494cfeSSatish Balay #define matsetvaluesblockedlocal0_       matsetvaluesblockedlocal0
1174d03fd2bSBarry Smith #define matsetvaluesblockedlocal11_      matsetvaluesblockedlocal11
1184d03fd2bSBarry Smith #define matsetvaluesblockedlocal111_     matsetvaluesblockedlocal111
1194d03fd2bSBarry Smith #define matsetvaluesblockedlocal1n_      matsetvaluesblockedlocal1n
12024aa916eSSatish Balay #define matsetvaluesblockedlocaln1_      matsetvaluesblockedlocaln1
12187bcf4e0SBarry Smith #define matgetrowmin_                    matgetrowmin
12287bcf4e0SBarry Smith #define matgetrowminabs_                 matgetrowminabs
1235928be6bSBarry Smith #define matgetrowmax_                    matgetrowmax
1245928be6bSBarry Smith #define matgetrowmaxabs_                 matgetrowmaxabs
1255928be6bSBarry Smith #define matdestroymatrices_              matdestroymatrices
126df750dc8SHong Zhang #define matdestroysubmatrices_           matdestroysubmatrices
1275dffd610SBarry Smith #define matgetfactor_                    matgetfactor
12835bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
129fcc9d04bSBarry Smith #define matcreatevecs_                   matcreatevecs
130f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
131f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
132f4e70085SSatish Balay #define matgetrow_                       matgetrow
133f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
134f4e70085SSatish Balay #define matview_                         matview
135f7e310deSShri Abhyankar #define matload_                         matload
1368c778c55SBarry Smith #define matseqaijgetarray_               matseqaijgetarray
1378c778c55SBarry Smith #define matseqaijrestorearray_           matseqaijrestorearray
1388c778c55SBarry Smith #define matdensegetarray_                matdensegetarray
1398572280aSBarry Smith #define matdensegetarrayread_            matdensegetarrayread
1408c778c55SBarry Smith #define matdenserestorearray_            matdenserestorearray
1418572280aSBarry Smith #define matdenserestorearrayread_        matdenserestorearrayread
142f4e70085SSatish Balay #define matconvert_                      matconvert
1437dae84e0SHong Zhang #define matcreatesubmatrices_            matcreatesubmatrices
14417ede90eSSatish Balay #define matzerorowscolumns_              matzerorowscolumns
14517ede90eSSatish Balay #define matzerorowscolumnsis_            matzerorowscolumnsis
14617ede90eSSatish Balay #define matzerorowsstencil_              matzerorowsstencil
147d25a37e1SJed Brown #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
148f4e70085SSatish Balay #define matzerorows_                     matzerorows
149f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
150f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
151f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
15217ede90eSSatish Balay #define matzerorowscolumnslocal_         matzerorowscolumnslocal
15317ede90eSSatish Balay #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
1541eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
155812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
1565ba43861SSatish Balay #define matgetinfo_                      matgetinfo
15722688b47SSatish Balay #define matlufactor_                     matlufactor
15822688b47SSatish Balay #define matilufactor_                    matilufactor
15922688b47SSatish Balay #define matlufactorsymbolic_             matlufactorsymbolic
16022688b47SSatish Balay #define matlufactornumeric_              matlufactornumeric
16122688b47SSatish Balay #define matcholeskyfactor_               matcholeskyfactor
16222688b47SSatish Balay #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
16322688b47SSatish Balay #define matcholeskyfactornumeric_        matcholeskyfactornumeric
16422688b47SSatish Balay #define matilufactorsymbolic_            matilufactorsymbolic
16522688b47SSatish Balay #define maticcfactorsymbolic_            maticcfactorsymbolic
16622688b47SSatish Balay #define maticcfactor_                    maticcfactor
16722688b47SSatish Balay #define matfactorinfoinitialize_         matfactorinfoinitialize
168b22b330cSBarry Smith #define matnullspacesetfunction_         matnullspacesetfunction
1690905d9aaSJed Brown #define matfindnonzerorows_              matfindnonzerorows
1703be0408cSBarry Smith #define matgetsize00_                    matgetsize00
1713be0408cSBarry Smith #define matgetsize10_                    matgetsize10
1723be0408cSBarry Smith #define matgetsize01_                    matgetsize01
1733be0408cSBarry Smith #define matgetlocalsize00_               matgetlocalsize00
1743be0408cSBarry Smith #define matgetlocalsize10_               matgetlocalsize10
1753be0408cSBarry Smith #define matgetlocalsize01_               matgetlocalsize01
176260663b8SBarry Smith #define matgetnullspace_                 matgetnullspace
177260663b8SBarry Smith #define matsetnullspace_                 matsetnullspace
178260663b8SBarry Smith #define matgetownershiprange_            matgetownershiprange
179*c08c7cb9SBarry Smith #define matgetownershipis_               matgetownershipis
180afc39838SBarry Smith #define matgetownershiprangecolumn_      matgetownershiprangecolumn
181f4e70085SSatish Balay #endif
182f4e70085SSatish Balay 
183260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
184260663b8SBarry Smith {
185260663b8SBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(nullsp);
186260663b8SBarry Smith   *ierr = MatSetNullSpace(*mat,*nullsp);
187260663b8SBarry Smith }
188260663b8SBarry Smith 
189260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetnullspace_(Mat *mat, MatNullSpace *nullsp, int *ierr)
190260663b8SBarry Smith {
191260663b8SBarry Smith   MatNullSpace sp;
192260663b8SBarry Smith   *ierr = MatGetNullSpace(*mat,&sp);if (*ierr) return;
193260663b8SBarry Smith   if (!sp) {
194260663b8SBarry Smith     *nullsp = (MatNullSpace) -1;
195260663b8SBarry Smith   } else {
196260663b8SBarry Smith     *nullsp = sp;
197260663b8SBarry Smith   }
198260663b8SBarry Smith }
199260663b8SBarry Smith 
200260663b8SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
201260663b8SBarry Smith {
202260663b8SBarry Smith   CHKFORTRANNULLINTEGER(m);
203260663b8SBarry Smith   CHKFORTRANNULLINTEGER(n);
204260663b8SBarry Smith   *ierr = MatGetOwnershipRange(*mat,m,n);
205260663b8SBarry Smith }
206260663b8SBarry Smith 
207*c08c7cb9SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershipis_(Mat *mat,IS *m,IS *n, int *ierr )
208*c08c7cb9SBarry Smith {
209*c08c7cb9SBarry Smith   CHKFORTRANNULLOBJECT(m);
210*c08c7cb9SBarry Smith   CHKFORTRANNULLOBJECT(n);
211*c08c7cb9SBarry Smith   *ierr = MatGetOwnershipIS(*mat,m,n);
212*c08c7cb9SBarry Smith }
213*c08c7cb9SBarry Smith 
214afc39838SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetownershiprangecolumn_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
215afc39838SBarry Smith {
216afc39838SBarry Smith   CHKFORTRANNULLINTEGER(m);
217afc39838SBarry Smith   CHKFORTRANNULLINTEGER(n);
218afc39838SBarry Smith   *ierr = MatGetOwnershipRangeColumn(*mat,m,n);
219afc39838SBarry Smith }
220afc39838SBarry Smith 
2213be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2223be0408cSBarry Smith {
2233be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2243be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2253be0408cSBarry Smith   *ierr = MatGetSize(*mat,m,n);
2263be0408cSBarry Smith }
2273be0408cSBarry Smith 
2283be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(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  matgetsize10_(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  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2393be0408cSBarry Smith {
2403be0408cSBarry Smith   matgetsize_(mat,m,n,ierr);
2413be0408cSBarry Smith }
2423be0408cSBarry Smith 
2433be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2443be0408cSBarry Smith {
2453be0408cSBarry Smith   CHKFORTRANNULLINTEGER(m);
2463be0408cSBarry Smith   CHKFORTRANNULLINTEGER(n);
2473be0408cSBarry Smith   *ierr = MatGetLocalSize(*mat,m,n);
2483be0408cSBarry Smith }
2493be0408cSBarry Smith 
2503be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(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  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2563be0408cSBarry Smith {
2573be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2583be0408cSBarry Smith }
2593be0408cSBarry Smith 
2603be0408cSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
2613be0408cSBarry Smith {
2623be0408cSBarry Smith   matgetlocalsize_(mat,m,n,ierr);
2633be0408cSBarry Smith }
2643be0408cSBarry Smith 
2654d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2664d03fd2bSBarry Smith   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
2674d03fd2bSBarry Smith }
2684d03fd2bSBarry Smith 
269cee688dbSBarry 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)){
270cee688dbSBarry Smith   PetscScalar *fa;
2710aee3464SBarry Smith   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
272cee688dbSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
273cee688dbSBarry Smith }
274cee688dbSBarry Smith 
2753b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2763b494cfeSSatish Balay   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2773b494cfeSSatish Balay }
2783b494cfeSSatish Balay 
2794d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2804d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2814d03fd2bSBarry Smith }
2824d03fd2bSBarry Smith 
2834d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2844d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2854d03fd2bSBarry Smith }
2864d03fd2bSBarry Smith 
2874d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2884d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2894d03fd2bSBarry Smith }
2904d03fd2bSBarry Smith 
2914d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
2924d03fd2bSBarry Smith   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
2934d03fd2bSBarry Smith }
2944d03fd2bSBarry Smith 
2954d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
2964d03fd2bSBarry Smith {
2974d03fd2bSBarry Smith   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
2984d03fd2bSBarry Smith }
2994d03fd2bSBarry Smith 
3003b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3013b494cfeSSatish Balay   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3023b494cfeSSatish Balay }
3033b494cfeSSatish Balay 
3044d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3054d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3064d03fd2bSBarry Smith }
3074d03fd2bSBarry Smith 
3084d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3094d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3104d03fd2bSBarry Smith }
3114d03fd2bSBarry Smith 
3124d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3134d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3144d03fd2bSBarry Smith }
3154d03fd2bSBarry Smith 
3164d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocaln1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
3174d03fd2bSBarry Smith   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
3184d03fd2bSBarry Smith }
3194d03fd2bSBarry Smith 
3204d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3214d03fd2bSBarry Smith {
3224d03fd2bSBarry Smith   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
3234d03fd2bSBarry Smith }
3244d03fd2bSBarry Smith 
3251b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3261b266c99SBarry Smith {
3271b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3281b266c99SBarry Smith }
3291b266c99SBarry Smith 
3303b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3313b494cfeSSatish Balay {
3323b494cfeSSatish Balay   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3333b494cfeSSatish Balay }
3343b494cfeSSatish Balay 
3351b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3361b266c99SBarry Smith {
3371b266c99SBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3381b266c99SBarry Smith }
3391b266c99SBarry Smith 
3404d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(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  matsetvaluesn1_(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  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
3514d03fd2bSBarry Smith {
3524d03fd2bSBarry Smith   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
3534d03fd2bSBarry Smith }
3544d03fd2bSBarry Smith 
3554d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3564d03fd2bSBarry Smith {
3574d03fd2bSBarry Smith   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
3584d03fd2bSBarry Smith }
3594d03fd2bSBarry Smith 
3603b494cfeSSatish Balay PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3613b494cfeSSatish Balay {
3623b494cfeSSatish Balay   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3633b494cfeSSatish Balay }
3643b494cfeSSatish Balay 
3654d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(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  matsetvalueslocal11nn_(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  matsetvalueslocal111_(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  matsetvalueslocal1n_(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 
3854d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
3864d03fd2bSBarry Smith {
3874d03fd2bSBarry Smith   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
3884d03fd2bSBarry Smith }
3894d03fd2bSBarry Smith 
39087bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
39187bcf4e0SBarry Smith {
39287bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
39387bcf4e0SBarry Smith   *ierr = MatGetRowMin(*mat,*v,idx);
39487bcf4e0SBarry Smith }
3954d03fd2bSBarry Smith 
39687bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
39787bcf4e0SBarry Smith {
39887bcf4e0SBarry Smith   CHKFORTRANNULLINTEGER(idx);
39987bcf4e0SBarry Smith   *ierr = MatGetRowMinAbs(*mat,*v,idx);
40087bcf4e0SBarry Smith }
40187bcf4e0SBarry Smith 
4025928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
4035928be6bSBarry Smith {
4045928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
4055928be6bSBarry Smith   *ierr = MatGetRowMax(*mat,*v,idx);
4065928be6bSBarry Smith }
4075928be6bSBarry Smith 
4085928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
4095928be6bSBarry Smith {
4105928be6bSBarry Smith   CHKFORTRANNULLINTEGER(idx);
4115928be6bSBarry Smith   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
4125928be6bSBarry Smith }
4135928be6bSBarry Smith 
414b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
415b22b330cSBarry Smith {
416b22b330cSBarry Smith   PetscErrorCode ierr = 0;
417b22b330cSBarry Smith   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
418b22b330cSBarry Smith   return 0;
419b22b330cSBarry Smith }
420b22b330cSBarry Smith 
4218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
422b22b330cSBarry Smith {
423b22b330cSBarry Smith   PetscObjectAllocateFortranPointers(*sp,1);
424b22b330cSBarry Smith   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
42526fbe8dcSKarl Rupp 
426b22b330cSBarry Smith   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
427b22b330cSBarry Smith }
428b22b330cSBarry Smith 
429d2da0f5dSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
4307c54600cSBarry Smith {
4317c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
4327c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
4332a7a6963SBarry Smith   *ierr = MatCreateVecs(*mat,right,left);
4347c54600cSBarry Smith }
4357c54600cSBarry Smith 
4368cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
437ace3abfcSBarry Smith                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
438f4e70085SSatish Balay {
4391a83f524SJed Brown   const PetscInt *IA,*JA;
4408f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
4411a83f524SJed Brown   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
4421a83f524SJed Brown   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
443f4e70085SSatish Balay }
444f4e70085SSatish Balay 
4458cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
446ace3abfcSBarry Smith                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
447f4e70085SSatish Balay {
4481a83f524SJed Brown   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
4498f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
450f4e70085SSatish Balay }
451f4e70085SSatish Balay 
452f4e70085SSatish Balay /*
453f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
454f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
455f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
456f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
457f4e70085SSatish Balay   at a time.
458f4e70085SSatish Balay */
459f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
460f4e70085SSatish Balay static const PetscInt    *my_ocols       = 0;
461f4e70085SSatish Balay static const PetscScalar *my_ovals       = 0;
462f4e70085SSatish Balay 
4638cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
464f4e70085SSatish Balay {
465f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
466f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
467f4e70085SSatish Balay 
468f4e70085SSatish Balay   if (matgetrowactive) {
469efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
470f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
471f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
472f4e70085SSatish Balay     *ierr = 1;
473f4e70085SSatish Balay     return;
474f4e70085SSatish Balay   }
475f4e70085SSatish Balay 
4760298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4770298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
478f4e70085SSatish Balay 
479f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
480f4e70085SSatish Balay   if (*ierr) return;
481f4e70085SSatish Balay 
482f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
483f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
484f4e70085SSatish Balay   matgetrowactive = 1;
485f4e70085SSatish Balay }
486f4e70085SSatish Balay 
4878cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
488f4e70085SSatish Balay {
489f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
490f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
491f4e70085SSatish Balay   if (!matgetrowactive) {
492efca3c55SSatish Balay     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
493f4e70085SSatish Balay                "Must call MatGetRow() first");
494f4e70085SSatish Balay     *ierr = 1;
495f4e70085SSatish Balay     return;
496f4e70085SSatish Balay   }
4970298fd71SBarry Smith   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
4980298fd71SBarry Smith   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
499f4e70085SSatish Balay 
500f4e70085SSatish Balay   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
501f4e70085SSatish Balay   matgetrowactive = 0;
502f4e70085SSatish Balay }
503f4e70085SSatish Balay 
5048cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
505f4e70085SSatish Balay {
506f4e70085SSatish Balay   PetscViewer v;
507f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
508f4e70085SSatish Balay   *ierr = MatView(*mat,v);
509f4e70085SSatish Balay }
510f4e70085SSatish Balay 
5118cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
512f7e310deSShri Abhyankar {
513f7e310deSShri Abhyankar   PetscViewer v;
514f7e310deSShri Abhyankar   PetscPatchDefaultViewers_Fortran(vin,v);
515112444f4SShri Abhyankar   *ierr = MatLoad(*mat,v);
516f7e310deSShri Abhyankar }
517f7e310deSShri Abhyankar 
5188cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
519f4e70085SSatish Balay {
520f4e70085SSatish Balay   PetscScalar *mm;
521f4e70085SSatish Balay   PetscInt    m,n;
522f4e70085SSatish Balay 
5238c778c55SBarry Smith   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
524f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
525f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
526f4e70085SSatish Balay }
527f4e70085SSatish Balay 
5288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
529f4e70085SSatish Balay {
530f4e70085SSatish Balay   PetscScalar *lx;
531f4e70085SSatish Balay   PetscInt    m,n;
532f4e70085SSatish Balay 
533f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
534f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5358c778c55SBarry Smith   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
536f4e70085SSatish Balay }
537f4e70085SSatish Balay 
5388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
53973a71a0fSBarry Smith {
54073a71a0fSBarry Smith   PetscScalar *mm;
54173a71a0fSBarry Smith   PetscInt    m,n;
54273a71a0fSBarry Smith 
5438c778c55SBarry Smith   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
54473a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
54573a71a0fSBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
54673a71a0fSBarry Smith }
54773a71a0fSBarry Smith 
5488cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
54973a71a0fSBarry Smith {
55073a71a0fSBarry Smith   PetscScalar *lx;
55173a71a0fSBarry Smith   PetscInt    m,n;
55273a71a0fSBarry Smith 
55373a71a0fSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
55473a71a0fSBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
5558c778c55SBarry Smith   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
55673a71a0fSBarry Smith }
55773a71a0fSBarry Smith 
5587067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdensegetarrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5598572280aSBarry Smith {
5607067c7f7SBarry Smith   const PetscScalar *mm;
5618572280aSBarry Smith   PetscInt         m,n;
5628572280aSBarry Smith 
5638572280aSBarry Smith   *ierr = MatDenseGetArrayRead(*mat,&mm); if (*ierr) return;
5648572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
5657067c7f7SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,(PetscScalar*)mm,m*n,ia); if (*ierr) return;
5668572280aSBarry Smith }
5678572280aSBarry Smith 
5687067c7f7SBarry Smith 
5697067c7f7SBarry Smith PETSC_EXTERN void PETSC_STDCALL matdenserestorearrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
5708572280aSBarry Smith {
5717067c7f7SBarry Smith   const PetscScalar *lx;
5728572280aSBarry Smith   PetscInt          m,n;
5738572280aSBarry Smith 
5748572280aSBarry Smith   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
5757067c7f7SBarry Smith   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,(PetscScalar**)&lx);if (*ierr) return;
5768572280aSBarry Smith   *ierr = MatDenseRestoreArrayRead(*mat,&lx);if (*ierr) return;
5778572280aSBarry Smith }
5788572280aSBarry Smith 
579390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
58035bd34faSBarry Smith {
58135bd34faSBarry Smith   const char *tname;
58235bd34faSBarry Smith 
5833ca39a21SBarry Smith   *ierr = MatFactorGetSolverType(*mat,&tname);if (*ierr) return;
58435bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
58535bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
58635bd34faSBarry Smith   }
58735bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
58835bd34faSBarry Smith }
58935bd34faSBarry Smith 
590390e1bf2SBarry 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))
5915dffd610SBarry Smith {
5925dffd610SBarry Smith   char *t;
5935dffd610SBarry Smith   FIXCHAR(outtype,len,t);
5949be81726SHong Zhang   *ierr = MatGetFactor(*mat,t,*ftype,M);
5955dffd610SBarry Smith   FREECHAR(outtype,t);
5965dffd610SBarry Smith }
5975dffd610SBarry Smith 
598390e1bf2SBarry 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))
599f4e70085SSatish Balay {
600f4e70085SSatish Balay   char *t;
601f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
602f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
603f4e70085SSatish Balay   FREECHAR(outtype,t);
604f4e70085SSatish Balay }
605f4e70085SSatish Balay 
606f4e70085SSatish Balay /*
6077dae84e0SHong Zhang     MatCreateSubmatrices() is slightly different from C since the
608f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
6097dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
610f4e70085SSatish Balay */
6117dae84e0SHong Zhang PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
612f4e70085SSatish Balay {
613f4e70085SSatish Balay   Mat      *lsmat;
614f4e70085SSatish Balay   PetscInt i;
615f4e70085SSatish Balay 
616f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
6177dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
618de7ef04eSHong Zhang     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
619f4e70085SSatish Balay       smat[i] = lsmat[i];
620f4e70085SSatish Balay     }
621f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
622f4e70085SSatish Balay   } else {
6237dae84e0SHong Zhang     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
624f4e70085SSatish Balay   }
625f4e70085SSatish Balay }
626f4e70085SSatish Balay 
6277d6bfa3bSBarry Smith /*
6287d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
629de7ef04eSHong Zhang     Fortran does not free the array of matrix objects, while in C that
630de7ef04eSHong Zhang     the array is freed
631de7ef04eSHong Zhang */
632de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
633de7ef04eSHong Zhang {
634de7ef04eSHong Zhang   PetscInt i;
635de7ef04eSHong Zhang 
636de7ef04eSHong Zhang   for (i=0; i<*n; i++) {
637de7ef04eSHong Zhang     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
638de7ef04eSHong Zhang   }
639de7ef04eSHong Zhang }
640de7ef04eSHong Zhang 
641de7ef04eSHong Zhang /*
642de7ef04eSHong Zhang     MatDestroySubMatrices() is slightly different from C since the
6437d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects, while in C that
6447dae84e0SHong Zhang     array is allocated by the MatCreateSubmatrices()
6457d6bfa3bSBarry Smith */
646de7ef04eSHong Zhang PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
6477d6bfa3bSBarry Smith {
648de7ef04eSHong Zhang   Mat      *lsmat;
6497d6bfa3bSBarry Smith   PetscInt i;
6507d6bfa3bSBarry Smith 
651de7ef04eSHong Zhang   *ierr = PetscMalloc1(*n+1,&lsmat);
652de7ef04eSHong Zhang   for (i=0; i<=*n; i++) {
653de7ef04eSHong Zhang       lsmat[i] = smat[i];
6547d6bfa3bSBarry Smith   }
655de7ef04eSHong Zhang   *ierr = MatDestroySubMatrices(*n,&lsmat);
656df750dc8SHong Zhang }
657df750dc8SHong Zhang 
6588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
65917ede90eSSatish Balay {
66017ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
66117ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
66217ede90eSSatish Balay   *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b);
66317ede90eSSatish Balay }
66417ede90eSSatish Balay 
6658cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
66617ede90eSSatish Balay {
66717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
66817ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
66917ede90eSSatish Balay   *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b);
67017ede90eSSatish Balay }
67117ede90eSSatish Balay 
6728cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
67317ede90eSSatish Balay {
67417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
67517ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
67617ede90eSSatish Balay   *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b);
67717ede90eSSatish Balay }
67817ede90eSSatish Balay 
6798cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
680d25a37e1SJed Brown {
681d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(x);
682d25a37e1SJed Brown   CHKFORTRANNULLOBJECTDEREFERENCE(b);
683d25a37e1SJed Brown   *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b);
684d25a37e1SJed Brown }
685d25a37e1SJed Brown 
6868cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
687f4e70085SSatish Balay {
6882b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6892b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6902b40b63fSBarry Smith   *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b);
691f4e70085SSatish Balay }
692f4e70085SSatish Balay 
6938cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
694f4e70085SSatish Balay {
6952b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
6962b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
6972b40b63fSBarry Smith   *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b);
698f4e70085SSatish Balay }
699f4e70085SSatish Balay 
7008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
701f4e70085SSatish Balay {
7022b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
7032b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
7042b40b63fSBarry Smith   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
705f4e70085SSatish Balay }
706f4e70085SSatish Balay 
7078cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
708f4e70085SSatish Balay {
7092b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
7102b40b63fSBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
7112b40b63fSBarry Smith   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b);
712f4e70085SSatish Balay }
713f4e70085SSatish Balay 
7148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
71517ede90eSSatish Balay {
71617ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
71717ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
71817ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b);
71917ede90eSSatish Balay }
72017ede90eSSatish Balay 
7218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr)
72217ede90eSSatish Balay {
72317ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(x);
72417ede90eSSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(b);
72517ede90eSSatish Balay   *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b);
72617ede90eSSatish Balay }
7271eea217eSSatish Balay 
728390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
7291eea217eSSatish Balay {
7301eea217eSSatish Balay   char *t;
7311eea217eSSatish Balay 
7321eea217eSSatish Balay   FIXCHAR(prefix,len,t);
7331eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
7341eea217eSSatish Balay   FREECHAR(prefix,t);
7351eea217eSSatish Balay }
7361eea217eSSatish Balay 
737d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
738812c3f48SMatthew Knepley {
739260663b8SBarry Smith   CHKFORTRANNULLOBJECT(*sp)
740d0195637SJed Brown   *ierr = MatNullSpaceRemove(*sp,*vec);
741812c3f48SMatthew Knepley }
7421eea217eSSatish Balay 
7434d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
7445ba43861SSatish Balay {
7454d03fd2bSBarry Smith   *ierr = MatGetInfo(*mat,*flag,info);
7465ba43861SSatish Balay }
7475ba43861SSatish Balay 
7484d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
74922688b47SSatish Balay {
7504d03fd2bSBarry Smith   *ierr = MatLUFactor(*mat,*row,*col,info);
75122688b47SSatish Balay }
75222688b47SSatish Balay 
7534d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
75422688b47SSatish Balay {
7554d03fd2bSBarry Smith   *ierr = MatILUFactor(*mat,*row,*col,info);
75622688b47SSatish Balay }
75722688b47SSatish Balay 
7584d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
75922688b47SSatish Balay {
760954bb437SSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(row);
761954bb437SSatish Balay   CHKFORTRANNULLOBJECTDEREFERENCE(col);
7624d03fd2bSBarry Smith   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
76322688b47SSatish Balay }
76422688b47SSatish Balay 
7654d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
76622688b47SSatish Balay {
7674d03fd2bSBarry Smith   *ierr = MatLUFactorNumeric(*fact,*mat,info);
76822688b47SSatish Balay }
76922688b47SSatish Balay 
7704d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
77122688b47SSatish Balay {
7724d03fd2bSBarry Smith   *ierr = MatCholeskyFactor(*mat,*perm,info);
77322688b47SSatish Balay }
77422688b47SSatish Balay 
7754d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
77622688b47SSatish Balay {
7774d03fd2bSBarry Smith   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
77822688b47SSatish Balay }
77922688b47SSatish Balay 
7804d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
78122688b47SSatish Balay {
7824d03fd2bSBarry Smith   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
78322688b47SSatish Balay }
78422688b47SSatish Balay 
7854d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
78622688b47SSatish Balay {
7874d03fd2bSBarry Smith   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
78822688b47SSatish Balay }
78922688b47SSatish Balay 
7904d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
79122688b47SSatish Balay {
7924d03fd2bSBarry Smith   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
79322688b47SSatish Balay }
79422688b47SSatish Balay 
7954d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
79622688b47SSatish Balay {
7974d03fd2bSBarry Smith   *ierr = MatICCFactor(*mat,*row,info);
79822688b47SSatish Balay }
79922688b47SSatish Balay 
8004d03fd2bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
80122688b47SSatish Balay {
8024d03fd2bSBarry Smith   *ierr = MatFactorInfoInitialize(info);
80322688b47SSatish Balay }
804