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