xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 95cbbfd359aa2cc7e96afc77b64e4c0540dc7b23)
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 matgetownershiprange11_          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  matgetownershiprange00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
203 {
204   CHKFORTRANNULLINTEGER(m);
205   CHKFORTRANNULLINTEGER(n);
206   *ierr = MatGetOwnershipRange(*mat,m,n);
207 }
208 
209 PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
210 {
211   CHKFORTRANNULLINTEGER(m);
212   CHKFORTRANNULLINTEGER(n);
213   *ierr = MatGetOwnershipRange(*mat,m,n);
214 }
215 
216 PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
217 {
218   CHKFORTRANNULLINTEGER(m);
219   CHKFORTRANNULLINTEGER(n);
220   *ierr = MatGetOwnershipRange(*mat,m,n);
221 }
222 
223 PETSC_EXTERN void PETSC_STDCALL  matgetownershiprange11_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
224 {
225   CHKFORTRANNULLINTEGER(m);
226   CHKFORTRANNULLINTEGER(n);
227   *ierr = MatGetOwnershipRange(*mat,m,n);
228 }
229 
230 PETSC_EXTERN void PETSC_STDCALL  matgetownershipis_(Mat *mat,IS *m,IS *n, int *ierr )
231 {
232   CHKFORTRANNULLOBJECT(m);
233   CHKFORTRANNULLOBJECT(n);
234   *ierr = MatGetOwnershipIS(*mat,m,n);
235 }
236 
237 PETSC_EXTERN void PETSC_STDCALL  matgetownershiprangecolumn_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
238 {
239   CHKFORTRANNULLINTEGER(m);
240   CHKFORTRANNULLINTEGER(n);
241   *ierr = MatGetOwnershipRangeColumn(*mat,m,n);
242 }
243 
244 PETSC_EXTERN void PETSC_STDCALL  matgetsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
245 {
246   CHKFORTRANNULLINTEGER(m);
247   CHKFORTRANNULLINTEGER(n);
248   *ierr = MatGetSize(*mat,m,n);
249 }
250 
251 PETSC_EXTERN void PETSC_STDCALL  matgetsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
252 {
253   matgetsize_(mat,m,n,ierr);
254 }
255 
256 PETSC_EXTERN void PETSC_STDCALL  matgetsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
257 {
258   matgetsize_(mat,m,n,ierr);
259 }
260 
261 PETSC_EXTERN void PETSC_STDCALL  matgetsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
262 {
263   matgetsize_(mat,m,n,ierr);
264 }
265 
266 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
267 {
268   CHKFORTRANNULLINTEGER(m);
269   CHKFORTRANNULLINTEGER(n);
270   *ierr = MatGetLocalSize(*mat,m,n);
271 }
272 
273 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize00_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
274 {
275   matgetlocalsize_(mat,m,n,ierr);
276 }
277 
278 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize10_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
279 {
280   matgetlocalsize_(mat,m,n,ierr);
281 }
282 
283 PETSC_EXTERN void PETSC_STDCALL  matgetlocalsize01_(Mat *mat,PetscInt *m,PetscInt *n, int *ierr )
284 {
285   matgetlocalsize_(mat,m,n,ierr);
286 }
287 
288 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
289   *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv);
290 }
291 
292 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)){
293   PetscScalar *fa;
294   *ierr = F90Array2dAccess(y,MPIU_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd));if (*ierr) return;
295   matsetvaluesblocked_(mat,m,idxm,n,idxn,fa,addv,ierr);
296 }
297 
298 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
299   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
300 }
301 
302 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
303   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
304 }
305 
306 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
307   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
308 }
309 
310 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblocked1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
311   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
312 }
313 
314 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
315   matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr);
316 }
317 
318 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
319 {
320   *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
321 }
322 
323 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
324   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
325 }
326 
327 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
328   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
329 }
330 
331 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
332   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
333 }
334 
335 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocal1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
336   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
337 }
338 
339 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesblockedlocaln1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){
340   matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr);
341 }
342 
343 PETSC_EXTERN void PETSC_STDCALL  matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
344 {
345   *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv);
346 }
347 
348 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
349 {
350   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
351 }
352 
353 PETSC_EXTERN void PETSC_STDCALL  matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
354 {
355   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
356 }
357 
358 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
359 {
360   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
361 }
362 
363 PETSC_EXTERN void PETSC_STDCALL  matsetvalues11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
364 {
365   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
366 }
367 
368 PETSC_EXTERN void PETSC_STDCALL  matsetvaluesn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
369 {
370   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
371 }
372 
373 PETSC_EXTERN void PETSC_STDCALL  matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr )
374 {
375   matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr);
376 }
377 
378 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
379 {
380   *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv);
381 }
382 
383 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
384 {
385   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
386 }
387 
388 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
389 {
390   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
391 }
392 
393 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal11nn_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
394 {
395   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
396 }
397 
398 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal111_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
399 {
400   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
401 }
402 
403 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocal1n_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
404 {
405   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
406 }
407 
408 PETSC_EXTERN void PETSC_STDCALL  matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr )
409 {
410   matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr);
411 }
412 
413 PETSC_EXTERN void PETSC_STDCALL  matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
414 {
415   CHKFORTRANNULLINTEGER(idx);
416   *ierr = MatGetRowMin(*mat,*v,idx);
417 }
418 
419 PETSC_EXTERN void PETSC_STDCALL  matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
420 {
421   CHKFORTRANNULLINTEGER(idx);
422   *ierr = MatGetRowMinAbs(*mat,*v,idx);
423 }
424 
425 PETSC_EXTERN void PETSC_STDCALL  matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
426 {
427   CHKFORTRANNULLINTEGER(idx);
428   *ierr = MatGetRowMax(*mat,*v,idx);
429 }
430 
431 PETSC_EXTERN void PETSC_STDCALL  matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr )
432 {
433   CHKFORTRANNULLINTEGER(idx);
434   *ierr = MatGetRowMaxAbs(*mat,*v,idx);
435 }
436 
437 static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx)
438 {
439   PetscErrorCode ierr = 0;
440   (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr);
441   return 0;
442 }
443 
444 PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr)
445 {
446   PetscObjectAllocateFortranPointers(*sp,1);
447   ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem;
448 
449   *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx);
450 }
451 
452 PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr)
453 {
454   CHKFORTRANNULLOBJECT(right);
455   CHKFORTRANNULLOBJECT(left);
456   *ierr = MatCreateVecs(*mat,right,left);
457 }
458 
459 PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
460                                 PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
461 {
462   const PetscInt *IA,*JA;
463   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
464   *iia  = PetscIntAddressToFortran(ia,(PetscInt*)IA);
465   *jja  = PetscIntAddressToFortran(ja,(PetscInt*)JA);
466 }
467 
468 PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
469                                     PetscInt *ja,size_t *jja,PetscBool  *done,PetscErrorCode *ierr)
470 {
471   const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
472   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
473 }
474 
475 /*
476    This is a poor way of storing the column and value pointers
477   generated by MatGetRow() to be returned with MatRestoreRow()
478   but there is not natural,good place else to store them. Hence
479   Fortran programmers can only have one outstanding MatGetRows()
480   at a time.
481 */
482 static PetscErrorCode    matgetrowactive = 0;
483 static const PetscInt    *my_ocols       = 0;
484 static const PetscScalar *my_ovals       = 0;
485 
486 PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
487 {
488   const PetscInt    **oocols = &my_ocols;
489   const PetscScalar **oovals = &my_ovals;
490 
491   if (matgetrowactive) {
492     PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
493                "Cannot have two MatGetRow() active simultaneously\n\
494                call MatRestoreRow() before calling MatGetRow() a second time");
495     *ierr = 1;
496     return;
497   }
498 
499   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
500   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
501 
502   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
503   if (*ierr) return;
504 
505   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
506   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;}
507   matgetrowactive = 1;
508 }
509 
510 PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
511 {
512   const PetscInt    **oocols = &my_ocols;
513   const PetscScalar **oovals = &my_ovals;
514   if (!matgetrowactive) {
515     PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL,
516                "Must call MatGetRow() first");
517     *ierr = 1;
518     return;
519   }
520   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL;
521   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = NULL;
522 
523   *ierr           = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
524   matgetrowactive = 0;
525 }
526 
527 PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
528 {
529   PetscViewer v;
530   PetscPatchDefaultViewers_Fortran(vin,v);
531   *ierr = MatView(*mat,v);
532 }
533 
534 PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
535 {
536   PetscViewer v;
537   PetscPatchDefaultViewers_Fortran(vin,v);
538   *ierr = MatLoad(*mat,v);
539 }
540 
541 PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
542 {
543   PetscScalar *mm;
544   PetscInt    m,n;
545 
546   *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return;
547   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
548   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
549 }
550 
551 PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
552 {
553   PetscScalar *lx;
554   PetscInt    m,n;
555 
556   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
557   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
558   *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return;
559 }
560 
561 PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
562 {
563   PetscScalar *mm;
564   PetscInt    m,n;
565 
566   *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return;
567   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
568   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
569 }
570 
571 PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
572 {
573   PetscScalar *lx;
574   PetscInt    m,n;
575 
576   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
577   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
578   *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return;
579 }
580 
581 PETSC_EXTERN void PETSC_STDCALL matdensegetarrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
582 {
583   const PetscScalar *mm;
584   PetscInt         m,n;
585 
586   *ierr = MatDenseGetArrayRead(*mat,&mm); if (*ierr) return;
587   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
588   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,(PetscScalar*)mm,m*n,ia); if (*ierr) return;
589 }
590 
591 
592 PETSC_EXTERN void PETSC_STDCALL matdenserestorearrayread_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
593 {
594   const PetscScalar *lx;
595   PetscInt          m,n;
596 
597   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
598   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,(PetscScalar**)&lx);if (*ierr) return;
599   *ierr = MatDenseRestoreArrayRead(*mat,&lx);if (*ierr) return;
600 }
601 
602 PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,char* name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
603 {
604   const char *tname;
605 
606   *ierr = MatFactorGetSolverType(*mat,&tname);if (*ierr) return;
607   if (name != PETSC_NULL_CHARACTER_Fortran) {
608     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
609   }
610   FIXRETURNCHAR(PETSC_TRUE,name,len);
611 }
612 
613 PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,char* outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
614 {
615   char *t;
616   FIXCHAR(outtype,len,t);
617   *ierr = MatGetFactor(*mat,t,*ftype,M);if (*ierr) return;
618   FREECHAR(outtype,t);
619 }
620 
621 PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,char* outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
622 {
623   char *t;
624   FIXCHAR(outtype,len,t);
625   *ierr = MatConvert(*mat,t,*reuse,M);if (*ierr) return;
626   FREECHAR(outtype,t);
627 }
628 
629 /*
630     MatCreateSubmatrices() is slightly different from C since the
631     Fortran provides the array to hold the submatrix objects,while in C that
632     array is allocated by the MatCreateSubmatrices()
633 */
634 PETSC_EXTERN void PETSC_STDCALL matcreatesubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
635 {
636   Mat      *lsmat;
637   PetscInt i;
638 
639   if (*scall == MAT_INITIAL_MATRIX) {
640     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
641     for (i=0; i<=*n; i++) { /* lsmat[*n] might be a dummy matrix for saving data struc */
642       smat[i] = lsmat[i];
643     }
644     *ierr = PetscFree(lsmat);
645   } else {
646     *ierr = MatCreateSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
647   }
648 }
649 
650 /*
651     MatDestroyMatrices() is slightly different from C since the
652     Fortran does not free the array of matrix objects, while in C that
653     the array is freed
654 */
655 PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
656 {
657   PetscInt i;
658 
659   for (i=0; i<*n; i++) {
660     *ierr = MatDestroy(&smat[i]);if (*ierr) return;
661   }
662 }
663 
664 /*
665     MatDestroySubMatrices() is slightly different from C since the
666     Fortran provides the array to hold the submatrix objects, while in C that
667     array is allocated by the MatCreateSubmatrices()
668 */
669 PETSC_EXTERN void PETSC_STDCALL matdestroysubmatrices_(PetscInt *n,Mat *smat,PetscErrorCode *ierr)
670 {
671   Mat      *lsmat;
672   PetscInt i;
673 
674   *ierr = PetscMalloc1(*n+1,&lsmat);
675   for (i=0; i<=*n; i++) {
676       lsmat[i] = smat[i];
677   }
678   *ierr = MatDestroySubMatrices(*n,&lsmat);
679 }
680 
681 PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
682 {
683   char *t;
684 
685   FIXCHAR(prefix,len,t);
686   *ierr = MatSetOptionsPrefix(*mat,t);if (*ierr) return;
687   FREECHAR(prefix,t);
688 }
689 
690 PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr)
691 {
692   CHKFORTRANNULLOBJECT(*sp)
693   *ierr = MatNullSpaceRemove(*sp,*vec);
694 }
695 
696 PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr)
697 {
698   *ierr = MatGetInfo(*mat,*flag,info);
699 }
700 
701 PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
702 {
703   *ierr = MatLUFactor(*mat,*row,*col,info);
704 }
705 
706 PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
707 {
708   *ierr = MatILUFactor(*mat,*row,*col,info);
709 }
710 
711 PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
712 {
713   *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info);
714 }
715 
716 PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
717 {
718   *ierr = MatLUFactorNumeric(*fact,*mat,info);
719 }
720 
721 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
722 {
723   *ierr = MatCholeskyFactor(*mat,*perm,info);
724 }
725 
726 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
727 {
728   *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info);
729 }
730 
731 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr)
732 {
733   *ierr = MatCholeskyFactorNumeric(*fact,*mat,info);
734 }
735 
736 PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr)
737 {
738   *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info);
739 }
740 
741 PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr)
742 {
743   *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info);
744 }
745 
746 PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr)
747 {
748   *ierr = MatICCFactor(*mat,*row,info);
749 }
750 
751 PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr)
752 {
753   *ierr = MatFactorInfoInitialize(info);
754 }
755 PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
756 {
757   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b);
758 }
759 PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal0_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
760 {
761   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
762 }
763 PETSC_EXTERN void PETSC_STDCALL  matzerorowslocal1_(Mat *mat,PetscInt *numRows, PetscInt rows[],PetscScalar *diag,Vec *x,Vec *b, int *ierr)
764 {
765   matzerorowslocal_(mat,numRows,rows,diag,x,b,ierr);
766 }
767