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