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