xref: /petsc/include/petscmat.h (revision 8e3fd1c6bcdd636cbe1185ae1d67b2e02ee19254)
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 typedef char* MatType;
52 
53 #define MAT_SER_SEQAIJ_BINARY "seqaij_binary"
54 #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary"
55 typedef char *MatSerializeType;
56 
57 /* Logging support */
58 #define    MAT_FILE_COOKIE 1211216    /* used to indicate matrices in binary files */
59 extern int MAT_COOKIE;
60 extern int MATSNESMFCTX_COOKIE;
61 extern int MAT_FDCOLORING_COOKIE;
62 extern int MAT_PARTITIONING_COOKIE;
63 extern int MAT_NULLSPACE_COOKIE;
64 extern int MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
65 extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose;
66 extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
67 extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
68 extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
69 extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
70 extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
71 extern int MAT_FDColoringApply, MAT_Transpose, MAT_FDColoringFunction;
72 
73 EXTERN int MatInitializePackage(char *);
74 
75 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
76 EXTERN int MatSetType(Mat,MatType);
77 EXTERN int MatSetFromOptions(Mat);
78 EXTERN int MatSetUpPreallocation(Mat);
79 EXTERN int MatRegisterAll(char*);
80 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
81 EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
82 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
83 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
84 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
85 #else
86 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
87 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
88 #endif
89 extern PetscTruth MatRegisterAllCalled;
90 extern PetscFList MatList;
91 
92 EXTERN PetscFList MatSerializeList;
93 EXTERN int MatSerializeRegisterAll(const char []);
94 EXTERN int MatSerializeRegisterDestroy(void);
95 EXTERN int MatSerializeRegisterAllCalled;
96 EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
97 EXTERN int MatSetSerializeType(Mat, MatSerializeType);
98 
99 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
100 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
101 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
102 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
103 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
104 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
105 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
106 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
107 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
108 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
109 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
110 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
111 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
112 EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
113 EXTERN int MatCreateNormal(Mat,Mat*);
114 EXTERN int MatDestroy(Mat);
115 
116 EXTERN int MatPrintHelp(Mat);
117 EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
118 
119 /* ------------------------------------------------------------*/
120 EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
121 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
122 
123 /*S
124      MatStencil - Data structure (C struct) for storing information about a single row or
125         column of a matrix as index on an associated grid.
126 
127    Level: beginner
128 
129   Concepts: matrix; linear operator
130 
131 .seealso:  MatSetValuesStencil(), MatSetStencil()
132 S*/
133 typedef struct {
134   int k,j,i,c;
135 } MatStencil;
136 
137 EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
138 EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
139 EXTERN int MatSetStencil(Mat,int,int*,int*,int);
140 
141 EXTERN int MatSetColoring(Mat,ISColoring);
142 EXTERN int MatSetValuesAdic(Mat,void*);
143 EXTERN int MatSetValuesAdifor(Mat,int,void*);
144 
145 /*E
146     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
147      to continue to add values to it
148 
149     Level: beginner
150 
151 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
152 E*/
153 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
154 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
155 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
156 EXTERN int MatAssembled(Mat,PetscTruth*);
157 
158 #define MatSetValue(v,i,j,va,mode) \
159 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
160   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
161 }
162 #define MatGetValue(v,i,j,va) \
163 0; {int _ierr,_row = i,_col = j; \
164   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
165 }
166 #define MatSetValueLocal(v,i,j,va,mode) \
167 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
168   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
169 }
170 /*E
171     MatOption - Options that may be set for a matrix and its behavior or storage
172 
173     Level: beginner
174 
175    Any additions/changes here MUST also be made in include/finclude/petscmat.h
176 
177 .seealso: MatSetOption()
178 E*/
179 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
180               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
181               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
182               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
183               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
184               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
185               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
186               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
187               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
188               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
189               MAT_DO_NOT_USE_INODES=82} MatOption;
190 EXTERN int MatSetOption(Mat,MatOption);
191 EXTERN int MatGetType(Mat,MatType*);
192 
193 EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
194 EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
195 EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
196 EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
197 EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
198 EXTERN int MatGetColumnVector(Mat,Vec,int);
199 EXTERN int MatGetArray(Mat,PetscScalar **);
200 EXTERN int MatRestoreArray(Mat,PetscScalar **);
201 EXTERN int MatGetBlockSize(Mat,int *);
202 
203 EXTERN int MatMult(Mat,Vec,Vec);
204 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
205 EXTERN int MatMultTranspose(Mat,Vec,Vec);
206 EXTERN int MatIsSymmetric(Mat,Mat,PetscTruth*);
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,SUBSET_NONZERO_PATTERN} 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 MatSeqDenseSetLDA(Mat,int);
447 
448 EXTERN int MatStoreValues(Mat);
449 EXTERN int MatRetrieveValues(Mat);
450 
451 EXTERN int MatDAADSetCtx(Mat,void*);
452 
453 /*
454   These routines are not usually accessed directly, rather solving is
455   done through the SLES, KSP and PC interfaces.
456 */
457 
458 /*E
459     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
460        with an optional dynamic library name, for example
461        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
462 
463    Level: beginner
464 
465 .seealso: MatGetOrdering()
466 E*/
467 typedef char* MatOrderingType;
468 #define MATORDERING_NATURAL   "natural"
469 #define MATORDERING_ND        "nd"
470 #define MATORDERING_1WD       "1wd"
471 #define MATORDERING_RCM       "rcm"
472 #define MATORDERING_QMD       "qmd"
473 #define MATORDERING_ROWLENGTH "rowlength"
474 #define MATORDERING_DSC_ND    "dsc_nd"
475 #define MATORDERING_DSC_MMD   "dsc_mmd"
476 #define MATORDERING_DSC_MDF   "dsc_mdf"
477 #define MATORDERING_CONSTRAINED "constrained"
478 #define MATORDERING_IDENTITY  "identity"
479 #define MATORDERING_REVERSE   "reverse"
480 
481 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
482 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
483 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
484 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
485 #else
486 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
487 #endif
488 EXTERN int        MatOrderingRegisterDestroy(void);
489 EXTERN int        MatOrderingRegisterAll(char*);
490 extern PetscTruth MatOrderingRegisterAllCalled;
491 extern PetscFList      MatOrderingList;
492 
493 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
494 
495 /*S
496    MatFactorInfo - Data based into the matrix factorization routines
497 
498    In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE
499 
500    Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC.
501 
502    Level: developer
503 
504 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor()
505 
506 S*/
507 typedef struct {
508   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
509   PetscReal     lu_shift;          /* if true, shift until positive pivots */
510   PetscReal     lu_shift_fraction; /* record shift fraction taken */
511   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
512   PetscReal     dt;             /* drop tolerance */
513   PetscReal     dtcol;          /* tolerance for pivoting */
514   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
515   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
516   int           levels;         /* ICC(levels) */
517   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
518                                    factorization may be faster if do not pivot */
519   PetscReal     zeropivot;      /* pivot is called zero if less than this */
520 } MatFactorInfo;
521 
522 EXTERN int MatCholeskyFactor(Mat,IS,MatFactorInfo*);
523 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*);
524 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
525 EXTERN int MatLUFactor(Mat,IS,IS,MatFactorInfo*);
526 EXTERN int MatILUFactor(Mat,IS,IS,MatFactorInfo*);
527 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*);
528 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*);
529 EXTERN int MatICCFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*);
530 EXTERN int MatICCFactor(Mat,IS,MatFactorInfo*);
531 EXTERN int MatLUFactorNumeric(Mat,Mat*);
532 EXTERN int MatILUDTFactor(Mat,MatFactorInfo*,IS,IS,Mat *);
533 EXTERN int MatGetInertia(Mat,int*,int*,int*);
534 EXTERN int MatSolve(Mat,Vec,Vec);
535 EXTERN int MatForwardSolve(Mat,Vec,Vec);
536 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
537 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
538 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
539 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
540 EXTERN int MatSolves(Mat,Vecs,Vecs);
541 
542 EXTERN int MatSetUnfactored(Mat);
543 
544 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
545 /*E
546     MatSORType - What type of (S)SOR to perform
547 
548     Level: beginner
549 
550    May be bitwise ORd together
551 
552    Any additions/changes here MUST also be made in include/finclude/petscmat.h
553 
554 .seealso: MatRelax()
555 E*/
556 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
557               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
558               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
559               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
560 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec);
561 
562 /*
563     These routines are for efficiently computing Jacobians via finite differences.
564 */
565 
566 /*E
567     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
568        with an optional dynamic library name, for example
569        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
570 
571    Level: beginner
572 
573 .seealso: MatGetColoring()
574 E*/
575 typedef char* MatColoringType;
576 #define MATCOLORING_NATURAL "natural"
577 #define MATCOLORING_SL      "sl"
578 #define MATCOLORING_LF      "lf"
579 #define MATCOLORING_ID      "id"
580 
581 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
582 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
583 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
584 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
585 #else
586 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
587 #endif
588 EXTERN int        MatColoringRegisterAll(char *);
589 extern PetscTruth MatColoringRegisterAllCalled;
590 EXTERN int        MatColoringRegisterDestroy(void);
591 EXTERN int        MatColoringPatch(Mat,int,int,ISColoringValue *,ISColoring*);
592 
593 /*S
594      MatFDColoring - Object for computing a sparse Jacobian via finite differences
595         and coloring
596 
597    Level: beginner
598 
599   Concepts: coloring, sparse Jacobian, finite differences
600 
601 .seealso:  MatFDColoringCreate()
602 S*/
603 typedef struct _p_MatFDColoring *MatFDColoring;
604 
605 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
606 EXTERN int MatFDColoringDestroy(MatFDColoring);
607 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
608 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
609 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
610 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
611 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
612 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
613 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
614 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
615 EXTERN int MatFDColoringSetRecompute(MatFDColoring);
616 EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
617 EXTERN int MatFDColoringGetPerturbedColumns(MatFDColoring,int*,int**);
618 /*
619     These routines are for partitioning matrices: currently used only
620   for adjacency matrix, MatCreateMPIAdj().
621 */
622 
623 /*S
624      MatPartitioning - Object for managing the partitioning of a matrix or graph
625 
626    Level: beginner
627 
628   Concepts: partitioning
629 
630 .seealso:  MatParitioningCreate(), MatPartitioningType
631 S*/
632 typedef struct _p_MatPartitioning *MatPartitioning;
633 
634 /*E
635     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
636        with an optional dynamic library name, for example
637        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
638 
639    Level: beginner
640 
641 .seealso: MatPartitioingCreate(), MatPartitioning
642 E*/
643 typedef char* MatPartitioningType;
644 #define MAT_PARTITIONING_CURRENT  "current"
645 #define MAT_PARTITIONING_PARMETIS "parmetis"
646 
647 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
648 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
649 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
650 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
651 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
652 EXTERN int MatPartitioningDestroy(MatPartitioning);
653 
654 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
655 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
656 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
657 #else
658 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
659 #endif
660 
661 EXTERN int        MatPartitioningRegisterAll(char *);
662 extern PetscTruth MatPartitioningRegisterAllCalled;
663 EXTERN int        MatPartitioningRegisterDestroy(void);
664 
665 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
666 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
667 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
668 
669 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
670 
671 /*
672     If you add entries here you must also add them to finclude/petscmat.h
673 */
674 typedef enum { MATOP_SET_VALUES=0,
675                MATOP_GET_ROW=1,
676                MATOP_RESTORE_ROW=2,
677                MATOP_MULT=3,
678                MATOP_MULT_ADD=4,
679                MATOP_MULT_TRANSPOSE=5,
680                MATOP_MULT_TRANSPOSE_ADD=6,
681                MATOP_SOLVE=7,
682                MATOP_SOLVE_ADD=8,
683                MATOP_SOLVE_TRANSPOSE=9,
684                MATOP_SOLVE_TRANSPOSE_ADD=10,
685                MATOP_LUFACTOR=11,
686                MATOP_CHOLESKYFACTOR=12,
687                MATOP_RELAX=13,
688                MATOP_TRANSPOSE=14,
689                MATOP_GETINFO=15,
690                MATOP_EQUAL=16,
691                MATOP_GET_DIAGONAL=17,
692                MATOP_DIAGONAL_SCALE=18,
693                MATOP_NORM=19,
694                MATOP_ASSEMBLY_BEGIN=20,
695                MATOP_ASSEMBLY_END=21,
696                MATOP_COMPRESS=22,
697                MATOP_SET_OPTION=23,
698                MATOP_ZERO_ENTRIES=24,
699                MATOP_ZERO_ROWS=25,
700                MATOP_LUFACTOR_SYMBOLIC=26,
701                MATOP_LUFACTOR_NUMERIC=27,
702                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
703                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
704                MATOP_SETUP_PREALLOCATION=30,
705                MATOP_ILUFACTOR_SYMBOLIC=31,
706                MATOP_ICCFACTOR_SYMBOLIC=32,
707                MATOP_GET_ARRAY=33,
708                MATOP_RESTORE_ARRAY=34,
709                MATOP_DUPLCIATE=35,
710                MATOP_FORWARD_SOLVE=36,
711                MATOP_BACKWARD_SOLVE=37,
712                MATOP_ILUFACTOR=38,
713                MATOP_ICCFACTOR=39,
714                MATOP_AXPY=40,
715                MATOP_GET_SUBMATRICES=41,
716                MATOP_INCREASE_OVERLAP=42,
717                MATOP_GET_VALUES=43,
718                MATOP_COPY=44,
719                MATOP_PRINT_HELP=45,
720                MATOP_SCALE=46,
721                MATOP_SHIFT=47,
722                MATOP_DIAGONAL_SHIFT=48,
723                MATOP_ILUDT_FACTOR=49,
724                MATOP_GET_BLOCK_SIZE=50,
725                MATOP_GET_ROW_IJ=51,
726                MATOP_RESTORE_ROW_IJ=52,
727                MATOP_GET_COLUMN_IJ=53,
728                MATOP_RESTORE_COLUMN_IJ=54,
729                MATOP_FDCOLORING_CREATE=55,
730                MATOP_COLORING_PATCH=56,
731                MATOP_SET_UNFACTORED=57,
732                MATOP_PERMUTE=58,
733                MATOP_SET_VALUES_BLOCKED=59,
734                MATOP_GET_SUBMATRIX=60,
735                MATOP_DESTROY=61,
736                MATOP_VIEW=62,
737                MATOP_GET_MAPS=63,
738                MATOP_USE_SCALED_FORM=64,
739                MATOP_SCALE_SYSTEM=65,
740                MATOP_UNSCALE_SYSTEM=66,
741                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
742                MATOP_SET_VALUES_LOCAL=68,
743                MATOP_ZERO_ROWS_LOCAL=69,
744                MATOP_GET_ROW_MAX=70,
745                MATOP_CONVERT=71,
746                MATOP_SET_COLORING=72,
747                MATOP_SET_VALUES_ADIC=73,
748                MATOP_SET_VALUES_ADIFOR=74,
749                MATOP_FD_COLORING_APPLY=75,
750                MATOP_SET_FROM_OPTIONS=76,
751                MATOP_MULT_CONSTRAINED=77,
752                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
753                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
754                MATOP_PERMUTE_SPARSIFY=80,
755                MATOP_MULT_MULTIPLE=81,
756                MATOP_SOLVE_MULTIPLE=82
757              } MatOperation;
758 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
759 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void));
760 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void));
761 EXTERN int MatShellSetContext(Mat,void*);
762 
763 /*
764    Codes for matrices stored on disk. By default they are
765  stored in a universal format. By changing the format with
766  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
767  be stored in a way natural for the matrix, for example dense matrices
768  would be stored as dense. Matrices stored this way may only be
769  read into matrices of the same time.
770 */
771 #define MATRIX_BINARY_FORMAT_DENSE -1
772 
773 /*
774      New matrix classes not yet distributed
775 */
776 /*
777     MatAIJIndices is a data structure for storing the nonzero location information
778   for sparse matrices. Several matrices with identical nonzero structure can share
779   the same MatAIJIndices.
780 */
781 typedef struct _p_MatAIJIndices* MatAIJIndices;
782 
783 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
784 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
785 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
786 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
787 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
788 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
789 EXTERN int MatShiftAIJIndices(MatAIJIndices);
790 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
791 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
792 
793 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
794 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
795 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
796 
797 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
798 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
799 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
800 
801 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
802 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
803 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
804 
805 /*S
806      MatNullSpace - Object that removes a null space from a vector, i.e.
807          orthogonalizes the vector to a subsapce
808 
809    Level: advanced
810 
811   Concepts: matrix; linear operator, null space
812 
813   Users manual sections:
814 .   sec_singular
815 
816 .seealso:  MatNullSpaceCreate()
817 S*/
818 typedef struct _p_MatNullSpace* MatNullSpace;
819 
820 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
821 EXTERN int MatNullSpaceDestroy(MatNullSpace);
822 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
823 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
824 EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
825 
826 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
827 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
828 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
829 
830 
831 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
832 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
833 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
834 
835 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
836 
837 EXTERN int MatComputeExplicitOperator(Mat,Mat*);
838 
839 EXTERN int MatESISetType(Mat,char*);
840 EXTERN int MatESISetFromOptions(Mat);
841 
842 EXTERN int MatDiagonalScaleLocal(Mat,Vec);
843 
844 EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *);
845 EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *);
846 
847 EXTERN int MatUseSpooles_SeqAIJ(Mat);
848 EXTERN int MatUseUMFPACK_SeqAIJ(Mat);
849 EXTERN int MatUseSuperLU_SeqAIJ(Mat);
850 EXTERN int MatUseEssl_SeqAIJ(Mat);
851 EXTERN int MatUseLUSOL_SeqAIJ(Mat);
852 EXTERN int MatUseMatlab_SeqAIJ(Mat);
853 EXTERN int MatUseDXML_SeqAIJ(Mat);
854 EXTERN int MatUseSuperLU_DIST_MPIAIJ(Mat);
855 EXTERN int MatUseSpooles_MPIAIJ(Mat);
856 EXTERN int MatUseSpooles_SeqSBAIJ(Mat);
857 EXTERN int MatUseSpooles_MPISBAIJ(Mat);
858 EXTERN int MatUseMUMPS_MPIAIJ(Mat);
859 
860 #endif
861 
862 
863 
864