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