xref: /petsc/include/petscmat.h (revision 123145dfa260b404ec74fab6a7bbe490bcc93c48)
1 /* $Id: petscmat.h,v 1.228 2001/09/07 20:09:08 bsmith Exp $ */
2 /*
3      Include file for the matrix component of PETSc
4 */
5 #ifndef __PETSCMAT_H
6 #define __PETSCMAT_H
7 #include "petscvec.h"
8 
9 /*S
10      Mat - Abstract PETSc matrix object
11 
12    Level: beginner
13 
14   Concepts: matrix; linear operator
15 
16 .seealso:  MatCreate(), MatType, MatSetType()
17 S*/
18 typedef struct _p_Mat*           Mat;
19 
20 /*E
21     MatType - String with the name of a PETSc matrix or the creation function
22        with an optional dynamic library name, for example
23        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
24 
25    Level: beginner
26 
27 .seealso: MatSetType(), Mat
28 E*/
29 #define MATSAME     "same"
30 #define MATSEQMAIJ  "seqmaij"
31 #define MATMPIMAIJ  "mpimaij"
32 #define MATIS       "is"
33 #define MATMPIROWBS "mpirowbs"
34 #define MATSEQDENSE "seqdense"
35 #define MATSEQAIJ   "seqaij"
36 #define MATMPIAIJ   "mpiaij"
37 #define MATSHELL    "shell"
38 #define MATSEQBDIAG "seqbdiag"
39 #define MATMPIBDIAG "mpibdiag"
40 #define MATMPIDENSE "mpidense"
41 #define MATSEQBAIJ  "seqbaij"
42 #define MATMPIBAIJ  "mpibaij"
43 #define MATMPIADJ   "mpiadj"
44 #define MATSEQSBAIJ "seqsbaij"
45 #define MATMPISBAIJ "mpisbaij"
46 #define MATDAAD     "daad"
47 #define MATMFFD     "mffd"
48 #define MATESI      "esi"
49 #define MATPETSCESI "petscesi"
50 #define MATNORMAL   "normal"
51 #define MATGLENN    "glenn"
52 typedef char* MatType;
53 
54 #define MAT_SER_SEQAIJ_BINARY "seqaij_binary"
55 #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary"
56 typedef char *MatSerializeType;
57 
58 /* Logging support */
59 #define    MAT_FILE_COOKIE 1211216    /* used to indicate matrices in binary files */
60 extern int MAT_COOKIE;
61 extern int MATSNESMFCTX_COOKIE;
62 extern int MAT_FDCOLORING_COOKIE;
63 extern int MAT_PARTITIONING_COOKIE;
64 extern int MAT_NULLSPACE_COOKIE;
65 extern int MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
66 extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose;
67 extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
68 extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
69 extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
70 extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
71 extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
72 extern int MAT_FDColoringApply, MAT_Transpose;
73 
74 EXTERN int MatInitializePackage(char *);
75 
76 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
77 EXTERN int MatSetType(Mat,MatType);
78 EXTERN int MatSetFromOptions(Mat);
79 EXTERN int MatSetUpPreallocation(Mat);
80 EXTERN int MatRegisterAll(char*);
81 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
82 EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
83 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
84 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
85 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
86 #else
87 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
88 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
89 #endif
90 extern PetscTruth MatRegisterAllCalled;
91 extern PetscFList MatList;
92 
93 EXTERN PetscFList MatSerializeList;
94 EXTERN int MatSerializeRegisterAll(const char []);
95 EXTERN int MatSerializeRegisterDestroy(void);
96 EXTERN int MatSerializeRegisterAllCalled;
97 EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
98 EXTERN int MatSetSerializeType(Mat, MatSerializeType);
99 
100 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
101 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
102 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
103 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
104 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
105 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
106 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
107 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
108 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
109 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
110 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
111 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
112 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
113 EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
114 EXTERN int MatCreateNormal(Mat,Mat*);
115 EXTERN int MatDestroy(Mat);
116 
117 EXTERN int MatPrintHelp(Mat);
118 EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
119 
120 /* ------------------------------------------------------------*/
121 EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
122 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
123 
124 /*S
125      MatStencil - Data structure (C struct) for storing information about a single row or
126         column of a matrix as index on an associated grid.
127 
128    Level: beginner
129 
130   Concepts: matrix; linear operator
131 
132 .seealso:  MatSetValuesStencil(), MatSetStencil()
133 S*/
134 typedef struct {
135   int k,j,i,c;
136 } MatStencil;
137 
138 EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
139 EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
140 EXTERN int MatSetStencil(Mat,int,int*,int*,int);
141 
142 EXTERN int MatSetColoring(Mat,ISColoring);
143 EXTERN int MatSetValuesAdic(Mat,void*);
144 EXTERN int MatSetValuesAdifor(Mat,int,void*);
145 
146 /*E
147     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
148      to continue to add values to it
149 
150     Level: beginner
151 
152 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
153 E*/
154 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
155 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
156 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
157 EXTERN int MatAssembled(Mat,PetscTruth*);
158 
159 #define MatSetValue(v,i,j,va,mode) \
160 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
161   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
162 }
163 #define MatGetValue(v,i,j,va) \
164 0; {int _ierr,_row = i,_col = j; \
165   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
166 }
167 #define MatSetValueLocal(v,i,j,va,mode) \
168 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
169   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
170 }
171 /*E
172     MatOption - Options that may be set for a matrix and its behavior or storage
173 
174     Level: beginner
175 
176    Any additions/changes here MUST also be made in include/finclude/petscmat.h
177 
178 .seealso: MatSetOption()
179 E*/
180 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
181               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
182               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
183               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
184               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
185               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
186               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
187               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
188               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
189               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
190               MAT_DO_NOT_USE_INODES=82} MatOption;
191 EXTERN int MatSetOption(Mat,MatOption);
192 EXTERN int MatGetType(Mat,MatType*);
193 
194 EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
195 EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
196 EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
197 EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
198 EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
199 EXTERN int MatGetColumnVector(Mat,Vec,int);
200 EXTERN int MatGetArray(Mat,PetscScalar **);
201 EXTERN int MatRestoreArray(Mat,PetscScalar **);
202 EXTERN int MatGetBlockSize(Mat,int *);
203 
204 EXTERN int MatMult(Mat,Vec,Vec);
205 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
206 EXTERN int MatMultTranspose(Mat,Vec,Vec);
207 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
208 EXTERN int MatMultConstrained(Mat,Vec,Vec);
209 EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
210 
211 /*E
212     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
213   its numerical values copied over or just its nonzero structure.
214 
215     Level: beginner
216 
217    Any additions/changes here MUST also be made in include/finclude/petscmat.h
218 
219 .seealso: MatDuplicate()
220 E*/
221 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
222 
223 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
224 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
225 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
226 #else
227 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
228 #endif
229 EXTERN int        MatConvertRegisterAll(char*);
230 EXTERN int        MatConvertRegisterDestroy(void);
231 extern PetscTruth MatConvertRegisterAllCalled;
232 extern PetscFList MatConvertList;
233 EXTERN int        MatConvert(Mat,MatType,Mat*);
234 EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
235 
236 /*E
237     MatStructure - Indicates if the matrix has the same nonzero structure
238 
239     Level: beginner
240 
241    Any additions/changes here MUST also be made in include/finclude/petscmat.h
242 
243 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
244 E*/
245 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
246 
247 EXTERN int MatCopy(Mat,Mat,MatStructure);
248 EXTERN int MatView(Mat,PetscViewer);
249 
250 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
251 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
252 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
253 #else
254 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
255 #endif
256 EXTERN int        MatLoadRegisterAll(char*);
257 EXTERN int        MatLoadRegisterDestroy(void);
258 extern PetscTruth MatLoadRegisterAllCalled;
259 extern PetscFList MatLoadList;
260 EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
261 EXTERN int        MatMerge(MPI_Comm,Mat,Mat*);
262 
263 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
264 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
265 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
266 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
267 
268 /*S
269      MatInfo - Context of matrix information, used with MatGetInfo()
270 
271    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
272 
273    Level: intermediate
274 
275   Concepts: matrix^nonzero information
276 
277 .seealso:  MatGetInfo(), MatInfoType
278 S*/
279 typedef struct {
280   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
281   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
282   PetscLogDouble block_size;                         /* block size */
283   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
284   PetscLogDouble memory;                             /* memory allocated */
285   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
286   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
287   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
288   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
289 } MatInfo;
290 
291 /*E
292     MatInfoType - Indicates if you want information about the local part of the matrix,
293      the entire parallel matrix or the maximum over all the local parts.
294 
295     Level: beginner
296 
297    Any additions/changes here MUST also be made in include/finclude/petscmat.h
298 
299 .seealso: MatGetInfo(), MatInfo
300 E*/
301 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
302 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
303 EXTERN int MatValid(Mat,PetscTruth*);
304 EXTERN int MatGetDiagonal(Mat,Vec);
305 EXTERN int MatGetRowMax(Mat,Vec);
306 EXTERN int MatTranspose(Mat,Mat*);
307 EXTERN int MatPermute(Mat,IS,IS,Mat *);
308 EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *);
309 EXTERN int MatDiagonalScale(Mat,Vec,Vec);
310 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
311 EXTERN int MatEqual(Mat,Mat,PetscTruth*);
312 
313 EXTERN int MatNorm(Mat,NormType,PetscReal *);
314 EXTERN int MatZeroEntries(Mat);
315 EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
316 EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
317 
318 EXTERN int MatUseScaledForm(Mat,PetscTruth);
319 EXTERN int MatScaleSystem(Mat,Vec,Vec);
320 EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
321 
322 EXTERN int MatGetSize(Mat,int*,int*);
323 EXTERN int MatGetLocalSize(Mat,int*,int*);
324 EXTERN int MatGetOwnershipRange(Mat,int*,int*);
325 
326 /*E
327     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
328      or MatGetSubMatrix() are to be reused to store the new matrix values.
329 
330     Level: beginner
331 
332    Any additions/changes here MUST also be made in include/finclude/petscmat.h
333 
334 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
335 E*/
336 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
337 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
338 EXTERN int MatDestroyMatrices(int,Mat **);
339 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
340 
341 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
342 
343 EXTERN int MatAXPY(PetscScalar *,Mat,Mat,MatStructure);
344 EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
345 EXTERN int MatCompress(Mat);
346 
347 EXTERN int MatScale(PetscScalar *,Mat);
348 EXTERN int MatShift(PetscScalar *,Mat);
349 
350 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
351 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
352 EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
353 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
354 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
355 
356 EXTERN int MatSetStashInitialSize(Mat,int,int);
357 
358 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
359 EXTERN int MatInterpolate(Mat,Vec,Vec);
360 EXTERN int MatRestrict(Mat,Vec,Vec);
361 
362 /*
363       These three (or four) macros MUST be used together. The third one closes the open { of the first one
364 */
365 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
366 { \
367   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
368   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
369   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
370   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
371   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
372 
373 #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \
374 { \
375   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__end; \
376   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
377   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
378   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\
379   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
380 
381 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
382 {\
383   int __l;\
384   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
385   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
386   for (__l=0;__l<nrows;__l++) {\
387     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
388   }\
389 }
390 
391 #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
392 {\
393   int __l;\
394   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
395   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
396   for (__l=0;__l<nrows;__l++) {\
397     _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
398   }\
399 }
400 
401 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
402 { int __i; \
403   for (__i=0; __i<nc; __i++) {\
404     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
405   }\
406   dnz[row - __rstart] = nc - onz[row - __rstart];\
407 }
408 
409 #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\
410 { int __i; \
411   for (__i=0; __i<nc; __i++) {\
412     if (cols[__i] >= __end) onz[row - __rstart]++; \
413     else if (cols[__i] >= row) dnz[row - __rstart]++;\
414   }\
415 }
416 
417 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
418 
419 /* Routines unique to particular data structures */
420 EXTERN int MatShellGetContext(Mat,void **);
421 
422 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
423 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
424 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
425 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
426 
427 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
428 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
429 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
430 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
431 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
432 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
433 
434 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
435 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
436 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
437 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
438 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
439 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
440 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
441 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
442 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
443 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
444 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
445 
446 EXTERN int MatStoreValues(Mat);
447 EXTERN int MatRetrieveValues(Mat);
448 
449 EXTERN int MatDAADSetCtx(Mat,void*);
450 
451 /*
452   These routines are not usually accessed directly, rather solving is
453   done through the SLES, KSP and PC interfaces.
454 */
455 
456 /*E
457     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
458        with an optional dynamic library name, for example
459        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
460 
461    Level: beginner
462 
463 .seealso: MatGetOrdering()
464 E*/
465 typedef char* MatOrderingType;
466 #define MATORDERING_NATURAL   "natural"
467 #define MATORDERING_ND        "nd"
468 #define MATORDERING_1WD       "1wd"
469 #define MATORDERING_RCM       "rcm"
470 #define MATORDERING_QMD       "qmd"
471 #define MATORDERING_ROWLENGTH "rowlength"
472 #define MATORDERING_DSC_ND    "dsc_nd"
473 #define MATORDERING_DSC_MMD   "dsc_mmd"
474 #define MATORDERING_DSC_MDF   "dsc_mdf"
475 #define MATORDERING_CONSTRAINED "constrained"
476 #define MATORDERING_IDENTITY  "identity"
477 #define MATORDERING_REVERSE   "reverse"
478 
479 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
480 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
481 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
482 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
483 #else
484 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
485 #endif
486 EXTERN int        MatOrderingRegisterDestroy(void);
487 EXTERN int        MatOrderingRegisterAll(char*);
488 extern PetscTruth MatOrderingRegisterAllCalled;
489 extern PetscFList      MatOrderingList;
490 
491 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
492 
493 EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
494 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
495 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
496 
497 /*S
498    MatILUInfo - Data based into the matrix ILU factorization routines
499 
500    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
501 
502    Notes: These are not usually directly used by users, instead use the PC type of ILU
503           All entries are double precision.
504 
505    Level: developer
506 
507 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
508 
509 S*/
510 typedef struct {
511   PetscReal     levels;         /* ILU(levels) */
512   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
513   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
514   PetscReal     dt;             /* drop tolerance */
515   PetscReal     dtcol;          /* tolerance for pivoting */
516   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
517   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
518   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
519   PetscReal     zeropivot; /* pivot is called zero if less than this */
520   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
521                                    factorization may be faster if do not pivot */
522 } MatILUInfo;
523 
524 /*S
525    MatLUInfo - Data based into the matrix LU factorization routines
526 
527    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
528 
529    Notes: These are not usually directly used by users, instead use the PC type of LU
530           All entries are double precision.
531 
532    Level: developer
533 
534 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
535 
536 S*/
537 typedef struct {
538   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
539   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
540   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
541   PetscReal     zeropivot; /* pivot is called zero if less than this */
542   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
543                                    factorization may be faster if do not pivot */
544 } MatLUInfo;
545 
546 /*S
547    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
548 
549    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
550 
551    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
552           All entries are double precision.
553 
554    Level: developer
555 
556 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
557 
558 S*/
559 typedef struct {
560   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
561   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
562   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
563                                    factorization may be faster if do not pivot */
564 } MatCholeskyInfo;
565 
566 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
567 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
568 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
569 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
570 EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*);
571 EXTERN int MatICCFactor(Mat,IS,PetscReal,int);
572 EXTERN int MatLUFactorNumeric(Mat,Mat*);
573 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
574 EXTERN int MatGetInertia(Mat,int*,int*,int*);
575 EXTERN int MatSolve(Mat,Vec,Vec);
576 EXTERN int MatForwardSolve(Mat,Vec,Vec);
577 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
578 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
579 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
580 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
581 EXTERN int MatSolves(Mat,Vecs,Vecs);
582 
583 EXTERN int MatSetUnfactored(Mat);
584 
585 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
586 /*E
587     MatSORType - What type of (S)SOR to perform
588 
589     Level: beginner
590 
591    May be bitwise ORd together
592 
593    Any additions/changes here MUST also be made in include/finclude/petscmat.h
594 
595 .seealso: MatRelax()
596 E*/
597 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
598               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
599               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
600               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
601 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec);
602 
603 /*
604     These routines are for efficiently computing Jacobians via finite differences.
605 */
606 
607 /*E
608     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
609        with an optional dynamic library name, for example
610        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
611 
612    Level: beginner
613 
614 .seealso: MatGetColoring()
615 E*/
616 typedef char* MatColoringType;
617 #define MATCOLORING_NATURAL "natural"
618 #define MATCOLORING_SL      "sl"
619 #define MATCOLORING_LF      "lf"
620 #define MATCOLORING_ID      "id"
621 
622 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
623 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
624 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
625 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
626 #else
627 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
628 #endif
629 EXTERN int        MatColoringRegisterAll(char *);
630 extern PetscTruth MatColoringRegisterAllCalled;
631 EXTERN int        MatColoringRegisterDestroy(void);
632 EXTERN int        MatColoringPatch(Mat,int,int,int *,ISColoring*);
633 
634 /*S
635      MatFDColoring - Object for computing a sparse Jacobian via finite differences
636         and coloring
637 
638    Level: beginner
639 
640   Concepts: coloring, sparse Jacobian, finite differences
641 
642 .seealso:  MatFDColoringCreate()
643 S*/
644 typedef struct _p_MatFDColoring *MatFDColoring;
645 
646 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
647 EXTERN int MatFDColoringDestroy(MatFDColoring);
648 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
649 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
650 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
651 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
652 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
653 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
654 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
655 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
656 EXTERN int MatFDColoringSetRecompute(MatFDColoring);
657 EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
658 EXTERN int MatFDColoringGetPerturbedColumns(MatFDColoring,int*,int**);
659 /*
660     These routines are for partitioning matrices: currently used only
661   for adjacency matrix, MatCreateMPIAdj().
662 */
663 
664 /*S
665      MatPartitioning - Object for managing the partitioning of a matrix or graph
666 
667    Level: beginner
668 
669   Concepts: partitioning
670 
671 .seealso:  MatParitioningCreate(), MatPartitioningType
672 S*/
673 typedef struct _p_MatPartitioning *MatPartitioning;
674 
675 /*E
676     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
677        with an optional dynamic library name, for example
678        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
679 
680    Level: beginner
681 
682 .seealso: MatPartitioingCreate(), MatPartitioning
683 E*/
684 typedef char* MatPartitioningType;
685 #define MAT_PARTITIONING_CURRENT  "current"
686 #define MAT_PARTITIONING_PARMETIS "parmetis"
687 
688 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
689 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
690 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
691 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
692 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
693 EXTERN int MatPartitioningDestroy(MatPartitioning);
694 
695 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
696 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
697 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
698 #else
699 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
700 #endif
701 
702 EXTERN int        MatPartitioningRegisterAll(char *);
703 extern PetscTruth MatPartitioningRegisterAllCalled;
704 EXTERN int        MatPartitioningRegisterDestroy(void);
705 
706 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
707 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
708 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
709 
710 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
711 
712 /*
713     If you add entries here you must also add them to finclude/petscmat.h
714 */
715 typedef enum { MATOP_SET_VALUES=0,
716                MATOP_GET_ROW=1,
717                MATOP_RESTORE_ROW=2,
718                MATOP_MULT=3,
719                MATOP_MULT_ADD=4,
720                MATOP_MULT_TRANSPOSE=5,
721                MATOP_MULT_TRANSPOSE_ADD=6,
722                MATOP_SOLVE=7,
723                MATOP_SOLVE_ADD=8,
724                MATOP_SOLVE_TRANSPOSE=9,
725                MATOP_SOLVE_TRANSPOSE_ADD=10,
726                MATOP_LUFACTOR=11,
727                MATOP_CHOLESKYFACTOR=12,
728                MATOP_RELAX=13,
729                MATOP_TRANSPOSE=14,
730                MATOP_GETINFO=15,
731                MATOP_EQUAL=16,
732                MATOP_GET_DIAGONAL=17,
733                MATOP_DIAGONAL_SCALE=18,
734                MATOP_NORM=19,
735                MATOP_ASSEMBLY_BEGIN=20,
736                MATOP_ASSEMBLY_END=21,
737                MATOP_COMPRESS=22,
738                MATOP_SET_OPTION=23,
739                MATOP_ZERO_ENTRIES=24,
740                MATOP_ZERO_ROWS=25,
741                MATOP_LUFACTOR_SYMBOLIC=26,
742                MATOP_LUFACTOR_NUMERIC=27,
743                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
744                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
745                MATOP_SETUP_PREALLOCATION=30,
746                MATOP_ILUFACTOR_SYMBOLIC=31,
747                MATOP_ICCFACTOR_SYMBOLIC=32,
748                MATOP_GET_ARRAY=33,
749                MATOP_RESTORE_ARRAY=34,
750                MATOP_DUPLCIATE=35,
751                MATOP_FORWARD_SOLVE=36,
752                MATOP_BACKWARD_SOLVE=37,
753                MATOP_ILUFACTOR=38,
754                MATOP_ICCFACTOR=39,
755                MATOP_AXPY=40,
756                MATOP_GET_SUBMATRICES=41,
757                MATOP_INCREASE_OVERLAP=42,
758                MATOP_GET_VALUES=43,
759                MATOP_COPY=44,
760                MATOP_PRINT_HELP=45,
761                MATOP_SCALE=46,
762                MATOP_SHIFT=47,
763                MATOP_DIAGONAL_SHIFT=48,
764                MATOP_ILUDT_FACTOR=49,
765                MATOP_GET_BLOCK_SIZE=50,
766                MATOP_GET_ROW_IJ=51,
767                MATOP_RESTORE_ROW_IJ=52,
768                MATOP_GET_COLUMN_IJ=53,
769                MATOP_RESTORE_COLUMN_IJ=54,
770                MATOP_FDCOLORING_CREATE=55,
771                MATOP_COLORING_PATCH=56,
772                MATOP_SET_UNFACTORED=57,
773                MATOP_PERMUTE=58,
774                MATOP_SET_VALUES_BLOCKED=59,
775                MATOP_GET_SUBMATRIX=60,
776                MATOP_DESTROY=61,
777                MATOP_VIEW=62,
778                MATOP_GET_MAPS=63,
779                MATOP_USE_SCALED_FORM=64,
780                MATOP_SCALE_SYSTEM=65,
781                MATOP_UNSCALE_SYSTEM=66,
782                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
783                MATOP_SET_VALUES_LOCAL=68,
784                MATOP_ZERO_ROWS_LOCAL=69,
785                MATOP_GET_ROW_MAX=70,
786                MATOP_CONVERT=71,
787                MATOP_SET_COLORING=72,
788                MATOP_SET_VALUES_ADIC=73,
789                MATOP_SET_VALUES_ADIFOR=74,
790                MATOP_FD_COLORING_APPLY=75,
791                MATOP_SET_FROM_OPTIONS=76,
792                MATOP_MULT_CONSTRAINED=77,
793                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
794                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
795                MATOP_PERMUTE_SPARSIFY=80,
796                MATOP_MULT_MULTIPLE=81,
797                MATOP_SOLVE_MULTIPLE=82
798              } MatOperation;
799 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
800 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void));
801 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void));
802 EXTERN int MatShellSetContext(Mat,void*);
803 
804 /*
805    Codes for matrices stored on disk. By default they are
806  stored in a universal format. By changing the format with
807  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
808  be stored in a way natural for the matrix, for example dense matrices
809  would be stored as dense. Matrices stored this way may only be
810  read into matrices of the same time.
811 */
812 #define MATRIX_BINARY_FORMAT_DENSE -1
813 
814 /*
815      New matrix classes not yet distributed
816 */
817 /*
818     MatAIJIndices is a data structure for storing the nonzero location information
819   for sparse matrices. Several matrices with identical nonzero structure can share
820   the same MatAIJIndices.
821 */
822 typedef struct _p_MatAIJIndices* MatAIJIndices;
823 
824 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
825 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
826 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
827 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
828 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
829 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
830 EXTERN int MatShiftAIJIndices(MatAIJIndices);
831 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
832 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
833 
834 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
835 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
836 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
837 
838 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
839 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
840 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
841 
842 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
843 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
844 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
845 
846 /*S
847      MatNullSpace - Object that removes a null space from a vector, i.e.
848          orthogonalizes the vector to a subsapce
849 
850    Level: advanced
851 
852   Concepts: matrix; linear operator, null space
853 
854   Users manual sections:
855 .   sec_singular
856 
857 .seealso:  MatNullSpaceCreate()
858 S*/
859 typedef struct _p_MatNullSpace* MatNullSpace;
860 
861 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
862 EXTERN int MatNullSpaceDestroy(MatNullSpace);
863 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
864 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
865 EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
866 
867 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
868 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
869 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
870 
871 
872 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
873 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
874 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
875 
876 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
877 
878 EXTERN int MatComputeExplicitOperator(Mat,Mat*);
879 
880 EXTERN int MatESISetType(Mat,char*);
881 EXTERN int MatESISetFromOptions(Mat);
882 
883 EXTERN int MatDiagonalScaleLocal(Mat,Vec);
884 
885 EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *);
886 EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *);
887 
888 EXTERN int MatUseSuperLU_DIST_MPIAIJ(Mat);
889 EXTERN int MatUseSpooles_SeqAIJ(Mat);
890 EXTERN int MatUseUMFPACK_SeqAIJ(Mat);
891 EXTERN int MatUseSuperLU_SeqAIJ(Mat);
892 EXTERN int MatUseEssl_SeqAIJ(Mat);
893 EXTERN int MatUseLUSOL_SeqAIJ(Mat);
894 EXTERN int MatUseMatlab_SeqAIJ(Mat);
895 EXTERN int MatUseDXML_SeqAIJ(Mat);
896 EXTERN int MatUseSuperLU_DIST_MPIAIJ(Mat);
897 EXTERN int MatUseSpooles_MPIAIJ(Mat);
898 EXTERN int MatUseSpooles_SeqSBAIJ(Mat);
899 extern int MatUseSpooles_MPISBAIJ(Mat);
900 
901 #endif
902 
903 
904 
905