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