xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 5a7b8bca3c29d15665d9fe2994377cbe2bede2c8)
1 #include <petsc/private/fortranimpl.h>
2 #include <petsc/private/f90impl.h>
3 #include <petscmat.h>
4 #include <petscviewer.h>
5 
6 #if defined(PETSC_HAVE_FORTRAN_CAPS)
7 #define matsetvalues_                    MATSETVALUES
8 #define matsetvaluesnnnn_                MATSETVALUESNNNN
9 #define matsetvalues0_                   MATSETVALUES0
10 #define matsetvaluesnn1_                 MATSETVALUESNN1
11 #define matsetvalues11_                  MATSETVALUES11
12 #define matsetvalues1n_                  MATSETVALUES1N
13 #define matsetvaluesn1_                  MATSETVALUESN1
14 #define matsetvaluesblocked0_            MATSETVALUESBLOCKED0
15 #define matsetvaluesblocked2_            MATSETVALUESBLOCKED2
16 #define matsetvaluesblocked11_           MATSETVALUESBLOCKED11
17 #define matsetvaluesblocked111_          MATSETVALUESBLOCKED111
18 #define matsetvaluesblocked1n_           MATSETVALUESBLOCKED1N
19 #define matsetvaluesblockedn1_           MATSETVALUESBLOCKEDN1
20 #define matsetvaluesblockedlocal_        MATSETVALUESBLOCKEDLOCAL
21 #define matsetvaluesblockedlocal0_       MATSETVALUESBLOCKEDLOCAL0
22 #define matsetvaluesblockedlocal11_      MATSETVALUESBLOCKEDLOCAL11
23 #define matsetvaluesblockedlocal111_     MATSETVALUESBLOCKEDLOCAL111
24 #define matsetvaluesblockedlocal1n_      MATSETVALUESBLOCKEDLOCAL1N
25 #define matsetvaluesblockedlocaln1_      MATSETVALUESBLOCKEDLOCALN1
26 #define matsetvalueslocal_               MATSETVALUESLOCAL
27 #define matsetvalueslocal0_              MATSETVALUESLOCAL0
28 #define matsetvalueslocal11_             MATSETVALUESLOCAL11
29 #define matsetvalueslocal11nn_           MATSETVALUESLOCAL11NN
30 #define matsetvalueslocal111_            MATSETVALUESLOCAL111
31 #define matsetvalueslocal1n_             MATSETVALUESLOCAL1N
32 #define matsetvalueslocaln1_             MATSETVALUESLOCALN1
33 #define matgetrowmin_                    MATGETROWMIN
34 #define matgetrowminabs_                 MATGETROWMINABS
35 #define matgetrowmax_                    MATGETROWMAX
36 #define matgetrowmaxabs_                 MATGETROWMAXABS
37 #define matdestroymatrices_              MATDESTROYMATRICES
38 #define matdestroysubmatrices_           MATDESTROYSUBMATRICES
39 #define matgetfactor_                    MATGETFACTOR
40 #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
41 #define matgetrowij_                     MATGETROWIJ
42 #define matrestorerowij_                 MATRESTOREROWIJ
43 #define matgetrow_                       MATGETROW
44 #define matrestorerow_                   MATRESTOREROW
45 #define matload_                         MATLOAD
46 #define matview_                         MATVIEW
47 #define matseqaijgetarray_               MATSEQAIJGETARRAY
48 #define matseqaijrestorearray_           MATSEQAIJRESTOREARRAY
49 #define matdensegetarray_                MATDENSEGETARRAY
50 #define matdensegetarrayread_            MATDENSEGETARRAYREAD
51 #define matdenserestorearray_            MATDENSERESTOREARRAY
52 #define matdenserestorearrayread_        MATDENSERESTOREARRAYREAD
53 #define matconvert_                      MATCONVERT
54 #define matcreatesubmatrices_            MATCREATESUBMATRICES
55 #define matzerorowscolumns_              MATZEROROWSCOLUMNS
56 #define matzerorowscolumnsis_            MATZEROROWSCOLUMNSIS
57 #define matzerorowsstencil_              MATZEROROWSSTENCIL
58 #define matzerorowscolumnsstencil_       MATZEROROWSCOLUMNSSTENCIL
59 #define matzerorows_                     MATZEROROWS
60 #define matzerorowsis_                   MATZEROROWSIS
61 #define matzerorowslocal_                MATZEROROWSLOCAL
62 #define matzerorowslocal0_               MATZEROROWSLOCAL0
63 #define matzerorowslocal1_               MATZEROROWSLOCAL1
64 #define matzerorowslocalis_              MATZEROROWSLOCALIS
65 #define matzerorowscolumnslocal_         MATZEROROWSCOLUMNSLOCAL
66 #define matzerorowscolumnslocalis_       MATZEROROWSCOLUMNSLOCALIS
67 #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
68 #define matcreatevecs_                   MATCREATEVECS
69 #define matnullspaceremove_              MATNULLSPACEREMOVE
70 #define matgetinfo_                      MATGETINFO
71 #define matlufactor_                     MATLUFACTOR
72 #define matilufactor_                    MATILUFACTOR
73 #define matlufactorsymbolic_             MATLUFACTORSYMBOLIC
74 #define matlufactornumeric_              MATLUFACTORNUMERIC
75 #define matcholeskyfactor_               MATCHOLESKYFACTOR
76 #define matcholeskyfactorsymbolic_       MATCHOLESKYFACTORSYMBOLIC
77 #define matcholeskyfactornumeric_        MATCHOLESKYFACTORNUMERIC
78 #define matilufactorsymbolic_            MATILUFACTORSYMBOLIC
79 #define maticcfactorsymbolic_            MATICCFACTORSYMBOLIC
80 #define maticcfactor_                    MATICCFACTOR
81 #define matfactorinfoinitialize_         MATFACTORINFOINITIALIZE
82 #define matnullspacesetfunction_         MATNULLSPACESETFUNCTION
83 #define matfindnonzerorows_              MATFINDNONZEROROWS
84 #define matgetsize00_                    MATGETSIZE00
85 #define matgetsize10_                    MATGETSIZE10
86 #define matgetsize01_                    MATGETSIZE01
87 #define matgetlocalsize00_               MATGETLOCALSIZE00
88 #define matgetlocalsize10_               MATGETLOCALSIZE10
89 #define matgetlocalsize01_               MATGETLOCALSIZE01
90 #define matsetnullspace_                 MATSETNULLSPACE
91 #define matgetownershiprange_            MATGETOWNERSHIPRANGE
92 #define matgetownershipis_               MATGETOWNERSHIPIS
93 #define matgetownershiprangecolumn_      MATGETOWNERSHIPRANGECOLUMN
94 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
95 #define matsetvalues_                    matsetvalues
96 #define matsetvaluesnnnn_                matsetvaluesnnnn
97 #define matsetvalues0_                   matsetvalues0
98 #define matsetvaluesnn1_                 matsetvaluesnn1
99 #define matsetvalues11_                  matsetvalues11
100 #define matsetvaluesn1_                  matsetvaluesn1
101 #define matsetvalues1n_                  matsetvalues1n
102 #define matsetvalueslocal_               matsetvalueslocal
103 #define matsetvalueslocal0_              matsetvalueslocal0
104 #define matsetvalueslocal11_             matsetvalueslocal11
105 #define matsetvalueslocal11nn_           matsetvalueslocal11nn
106 #define matsetvalueslocal111_            matsetvalueslocal111
107 #define matsetvalueslocal1n_             matsetvalueslocal1n
108 #define matsetvalueslocaln1_             matsetvalueslocaln1
109 #define matsetvaluesblocked_             matsetvaluesblocked
110 #define matsetvaluesblocked0_            matsetvaluesblocked0
111 #define matsetvaluesblocked2_            matsetvaluesblocked2
112 #define matsetvaluesblocked11_           matsetvaluesblocked11
113 #define matsetvaluesblocked111_          matsetvaluesblocked111
114 #define matsetvaluesblocked1n_           matsetvaluesblocked1n
115 #define matsetvaluesblockedn1_           matsetvaluesblockedn1
116 #define matsetvaluesblockedlocal_        matsetvaluesblockedlocal
117 #define matsetvaluesblockedlocal0_       matsetvaluesblockedlocal0
118 #define matsetvaluesblockedlocal11_      matsetvaluesblockedlocal11
119 #define matsetvaluesblockedlocal111_     matsetvaluesblockedlocal111
120 #define matsetvaluesblockedlocal1n_      matsetvaluesblockedlocal1n
121 #define matsetvaluesblockedlocaln1_      matsetvaluesblockedlocaln1
122 #define matgetrowmin_                    matgetrowmin
123 #define matgetrowminabs_                 matgetrowminabs
124 #define matgetrowmax_                    matgetrowmax
125 #define matgetrowmaxabs_                 matgetrowmaxabs
126 #define matdestroymatrices_              matdestroymatrices
127 #define matdestroysubmatrices_           matdestroysubmatrices
128 #define matgetfactor_                    matgetfactor
129 #define matfactorgetsolverpackage_       matfactorgetsolverpackage
130 #define matcreatevecs_                   matcreatevecs
131 #define matgetrowij_                     matgetrowij
132 #define matrestorerowij_                 matrestorerowij
133 #define matgetrow_                       matgetrow
134 #define matrestorerow_                   matrestorerow
135 #define matview_                         matview
136 #define matload_                         matload
137 #define matseqaijgetarray_               matseqaijgetarray
138 #define matseqaijrestorearray_           matseqaijrestorearray
139 #define matdensegetarray_                matdensegetarray
140 #define matdensegetarrayread_            matdensegetarrayread
141 #define matdenserestorearray_            matdenserestorearray
142 #define matdenserestorearrayread_        matdenserestorearrayread
143 #define matconvert_                      matconvert
144 #define matcreatesubmatrices_            matcreatesubmatrices
145 #define matzerorowscolumns_              matzerorowscolumns
146 #define matzerorowscolumnsis_            matzerorowscolumnsis
147 #define matzerorowsstencil_              matzerorowsstencil
148 #define matzerorowscolumnsstencil_       matzerorowscolumnsstencil
149 #define matzerorows_                     matzerorows
150 #define matzerorowsis_                   matzerorowsis
151 #define matzerorowslocal_                matzerorowslocal
152 #define matzerorowslocalis_              matzerorowslocalis
153 #define matzerorowscolumnslocal_         matzerorowscolumnslocal
154 #define matzerorowscolumnslocalis_       matzerorowscolumnslocalis
155 #define matsetoptionsprefix_             matsetoptionsprefix
156 #define matnullspaceremove_              matnullspaceremove
157 #define matgetinfo_                      matgetinfo
158 #define matlufactor_                     matlufactor
159 #define matilufactor_                    matilufactor
160 #define matlufactorsymbolic_             matlufactorsymbolic
161 #define matlufactornumeric_              matlufactornumeric
162 #define matcholeskyfactor_               matcholeskyfactor
163 #define matcholeskyfactorsymbolic_       matcholeskyfactorsymbolic
164 #define matcholeskyfactornumeric_        matcholeskyfactornumeric
165 #define matilufactorsymbolic_            matilufactorsymbolic
166 #define maticcfactorsymbolic_            maticcfactorsymbolic
167 #define maticcfactor_                    maticcfactor
168 #define matfactorinfoinitialize_         matfactorinfoinitialize
169 #define matnullspacesetfunction_         matnullspacesetfunction
170 #define matfindnonzerorows_              matfindnonzerorows
171 #define matgetsize00_                    matgetsize00
172 #define matgetsize10_                    matgetsize10
173 #define matgetsize01_                    matgetsize01
174 #define matgetlocalsize00_               matgetlocalsize00
175 #define matgetlocalsize10_               matgetlocalsize10
176 #define matgetlocalsize01_               matgetlocalsize01
177 #define matsetnullspace_                 matsetnullspace
178 #define matgetownershiprange_            matgetownershiprange
179 #define matgetownershipis_               matgetownershipis
180 #define matgetownershiprangecolumn_      matgetownershiprangecolumn
181 #endif
182 
183 PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
184 {
185   CHKFORTRANNULLINTEGER(m);
186   CHKFORTRANNULLINTEGER(n);
187   *ierr = MatGetOwnershipRange(*mat,m,n);
188 }
189 
190 PETSC_EXTERN void PETSC_STDCALL  matgetownershipis_(Mat *mat,IS *m,IS *n, int *ierr )
191 {
192   CHKFORTRANNULLOBJECT(m);
193   CHKFORTRANNULLOBJECT(n);
194   *ierr = MatGetOwnershipIS(*mat,m,n);
195 }
196 
197 PETSC_EXTERN void PETSC_STDCALL  matgetownershiprangecolumn_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
198 {
199   CHKFORTRANNULLINTEGER(m);
200   CHKFORTRANNULLINTEGER(n);
201   *ierr = MatGetOwnershipRangeColumn(*mat,m,n);
202 }
203 
204 PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
205 {
206   CHKFORTRANNULLINTEGER(m);
207   CHKFORTRANNULLINTEGER(n);
208   *ierr = MatGetSize(*mat,m,n);
209 }
210 
211 PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
212 {
213   matgetsize_(mat,m,n,ierr);
214 }
215 
216 PETSC_EXTERN void PETSC_STDCALL  matgetsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
217 {
218   matgetsize_(mat,m,n,ierr);
219 }
220 
221 PETSC_EXTERN void PETSC_STDCALL  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
222 {
223   matgetsize_(mat,m,n,ierr);
224 }
225 
226 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
227 {
228   CHKFORTRANNULLINTEGER(m);
229   CHKFORTRANNULLINTEGER(n);
230   *ierr = MatGetLocalSize(*mat,m,n);
231 }
232 
233 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
234 {
235   matgetlocalsize_(mat,m,n,ierr);
236 }
237 
238 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
239 {
240   matgetlocalsize_(mat,m,n,ierr);
241 }
242 
243 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
244 {
245   matgetlocalsize_(mat,m,n,ierr);
246 }
247 
248 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
249   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
250 }
251 
252 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)){
253   PetscScalar *fa;
254   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
255   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
256 }
257 
258 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
259   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
260 }
261 
262 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
263   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
264 }
265 
266 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
267   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
268 }
269 
270 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
271   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
272 }
273 
274 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
275   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
276 }
277 
278 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
279 {
280   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
281 }
282 
283 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
284   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
285 }
286 
287 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
288   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
289 }
290 
291 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
292   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
293 }
294 
295 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
296   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
297 }
298 
299 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocaln1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
300   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
301 }
302 
303 PETSC_EXTERN void PETSC_STDCALL  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
304 {
305   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
306 }
307 
308 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
309 {
310   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
311 }
312 
313 PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
314 {
315   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
316 }
317 
318 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
319 {
320   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
321 }
322 
323 PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
324 {
325   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
326 }
327 
328 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
329 {
330   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
331 }
332 
333 PETSC_EXTERN void PETSC_STDCALL  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
334 {
335   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
336 }
337 
338 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
339 {
340   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
341 }
342 
343 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
344 {
345   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
346 }
347 
348 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
349 {
350   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
351 }
352 
353 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11nn_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
354 {
355   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
356 }
357 
358 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal111_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
359 {
360   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
361 }
362 
363 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal1n_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
364 {
365   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
366 }
367 
368 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
369 {
370   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
371 }
372 
373 PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
374 {
375   CHKFORTRANNULLINTEGER(idx);
376   *ierr = MatGetRowMin(*mat,*v,idx);
377 }
378 
379 PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
380 {
381   CHKFORTRANNULLINTEGER(idx);
382   *ierr = MatGetRowMinAbs(*mat,*v,idx);
383 }
384 
385 PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
386 {
387   CHKFORTRANNULLINTEGER(idx);
388   *ierr = MatGetRowMax(*mat,*v,idx);
389 }
390 
391 PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
392 {
393   CHKFORTRANNULLINTEGER(idx);
394   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
395 }
396 
397 static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
398 {
399   PetscErrorCode ierr = 0;
400   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
401   return 0;
402 }
403 
404 PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
405 {
406   PetscObjectAllocateFortranPointers(*sp,1);
407   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
408 
409   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
410 }
411 
412 PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
413 {
414   CHKFORTRANNULLOBJECT(right);
415   CHKFORTRANNULLOBJECT(left);
416   *ierr = MatCreateVecs(*mat,right,left);
417 }
418 
419 PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
420                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
421 {
422   const PetscInt *IA,*JA;
423   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
424   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
425   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
426 }
427 
428 PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
429                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
430 {
431   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
432   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
433 }
434 
435 /*
436    This is a poor way of storing the column and value pointers
437   generated by MatGetRow() to be returned with MatRestoreRow()
438   but there is not natural,good place else to store them. Hence
439   Fortran programmers can only have one outstanding MatGetRows()
440   at a time.
441 */
442 static PetscErrorCode    matgetrowactive = 0;
443 static const PetscInt    *my_ocols       = 0;
444 static const PetscScalar *my_ovals       = 0;
445 
446 PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
447 {
448   const PetscInt    **oocols = &my_ocols;
449   const PetscScalar **oovals = &my_ovals;
450 
451   if (matgetrowactive) {
452     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
453                "Cannot have two MatGetRow() active simultaneously\n\
454                call MatRestoreRow() before calling MatGetRow() a second time");
455     *ierr = 1;
456     return;
457   }
458 
459   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
460   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
461 
462   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
463   if (*ierr) return;
464 
465   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
466   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
467   matgetrowactive = 1;
468 }
469 
470 PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
471 {
472   const PetscInt    **oocols = &my_ocols;
473   const PetscScalar **oovals = &my_ovals;
474   if (!matgetrowactive) {
475     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
476                "Must call MatGetRow() first");
477     *ierr = 1;
478     return;
479   }
480   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
481   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
482 
483   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
484   matgetrowactive = 0;
485 }
486 
487 PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
488 {
489   PetscViewer v;
490   PetscPatchDefaultViewers_Fortran(vin,v);
491   *ierr = MatView(*mat,v);
492 }
493 
494 PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
495 {
496   PetscViewer v;
497   PetscPatchDefaultViewers_Fortran(vin,v);
498   *ierr = MatLoad(*mat,v);
499 }
500 
501 PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
502 {
503   PetscScalar *mm;
504   PetscInt    m,n;
505 
506   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
507   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
508   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
509 }
510 
511 PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
512 {
513   PetscScalar *lx;
514   PetscInt    m,n;
515 
516   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
517   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
518   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
519 }
520 
521 PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
522 {
523   PetscScalar *mm;
524   PetscInt    m,n;
525 
526   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
527   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
528   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
529 }
530 
531 PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
532 {
533   PetscScalar *lx;
534   PetscInt    m,n;
535 
536   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
537   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
538   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
539 }
540 
541 PETSC_EXTERN void PETSC_STDCALL matdensegetarrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
542 {
543   const PetscScalar *mm;
544   PetscInt         m,n;
545 
546   *ierr = MatDenseGetArrayRead(*mat,&mm); if (*ierr) return;
547   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
548   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,(PetscScalar*)mm,m*n,ia); if (*ierr) return;
549 }
550 
551 
552 PETSC_EXTERN void PETSC_STDCALL matdenserestorearrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
553 {
554   const PetscScalar *lx;
555   PetscInt          m,n;
556 
557   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
558   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,(PetscScalar**)&lx);if (*ierr) return;
559   *ierr = MatDenseRestoreArrayRead(*mat,&lx);if (*ierr) return;
560 }
561 
562 PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
563 {
564   const char *tname;
565 
566   *ierr = MatFactorGetSolverType(*mat,&tname);if (*ierr) return;
567   if (name != PETSC_NULL_CHARACTER_Fortran) {
568     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
569   }
570   FIXRETURNCHAR(PETSC_TRUE,name,len);
571 }
572 
573 PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,char* outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
574 {
575   char *t;
576   FIXCHAR(outtype,len,t);
577   *ierr = MatGetFactor(*mat,t,*ftype,M);
578   FREECHAR(outtype,t);
579 }
580 
581 PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,char* outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
582 {
583   char *t;
584   FIXCHAR(outtype,len,t);
585   *ierr = MatConvert(*mat,t,*reuse,M);
586   FREECHAR(outtype,t);
587 }
588 
589 /*
590     MatCreateSubmatrices() is slightly different from C since the
591     Fortran provides the array to hold the submatrix objects,while in C that
592     array is allocated by the MatCreateSubmatrices()
593 */
594 PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
595 {
596   Mat      *lsmat;
597   PetscInt i;
598 
599   if (*scall == MAT_INITIAL_MATRIX) {
600     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
601     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
602       smat[i] = lsmat[i];
603     }
604     *ierr = PetscFree(lsmat);
605   } else {
606     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
607   }
608 }
609 
610 /*
611     MatDestroyMatrices() is slightly different from C since the
612     Fortran does not free the array of matrix objects, while in C that
613     the array is freed
614 */
615 PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
616 {
617   PetscInt i;
618 
619   for (i=0; i<*n; i++) {
620     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
621   }
622 }
623 
624 /*
625     MatDestroySubMatrices() is slightly different from C since the
626     Fortran provides the array to hold the submatrix objects, while in C that
627     array is allocated by the MatCreateSubmatrices()
628 */
629 PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
630 {
631   Mat      *lsmat;
632   PetscInt i;
633 
634   *ierr = PetscMalloc1(*n+1,&lsmat);
635   for (i=0; i<=*n; i++) {
636       lsmat[i] = smat[i];
637   }
638   *ierr = MatDestroySubMatrices(*n,&lsmat);
639 }
640 
641 PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
642 {
643   char *t;
644 
645   FIXCHAR(prefix,len,t);
646   *ierr = MatSetOptionsPrefix(*mat,t);
647   FREECHAR(prefix,t);
648 }
649 
650 PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
651 {
652   CHKFORTRANNULLOBJECT(*sp)
653   *ierr = MatNullSpaceRemove(*sp,*vec);
654 }
655 
656 PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
657 {
658   *ierr = MatGetInfo(*mat,*flag,info);
659 }
660 
661 PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
662 {
663   *ierr = MatLUFactor(*mat,*row,*col,info);
664 }
665 
666 PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
667 {
668   *ierr = MatILUFactor(*mat,*row,*col,info);
669 }
670 
671 PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
672 {
673   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
674 }
675 
676 PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
677 {
678   *ierr = MatLUFactorNumeric(*fact,*mat,info);
679 }
680 
681 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
682 {
683   *ierr = MatCholeskyFactor(*mat,*perm,info);
684 }
685 
686 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
687 {
688   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
689 }
690 
691 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
692 {
693   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
694 }
695 
696 PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
697 {
698   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
699 }
700 
701 PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
702 {
703   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
704 }
705 
706 PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
707 {
708   *ierr = MatICCFactor(*mat,*row,info);
709 }
710 
711 PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
712 {
713   *ierr = MatFactorInfoInitialize(info);
714 }
715 PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
716 {
717   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
718 }
719 PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal0_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
720 {
721   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
722 }
723 PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal1_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
724 {
725   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
726 }
727