xref: /petsc/include/petscmat.h (revision b00f774800712909a2f8230c534edf94be27f04a)
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 MatMultTransposeAdd(Mat,Vec,Vec,Vec);
207 EXTERN int MatMultConstrained(Mat,Vec,Vec);
208 EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
209 
210 /*E
211     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
212   its numerical values copied over or just its nonzero structure.
213 
214     Level: beginner
215 
216    Any additions/changes here MUST also be made in include/finclude/petscmat.h
217 
218 .seealso: MatDuplicate()
219 E*/
220 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
221 
222 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
223 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
224 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
225 #else
226 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
227 #endif
228 EXTERN int        MatConvertRegisterAll(char*);
229 EXTERN int        MatConvertRegisterDestroy(void);
230 extern PetscTruth MatConvertRegisterAllCalled;
231 extern PetscFList MatConvertList;
232 EXTERN int        MatConvert(Mat,MatType,Mat*);
233 EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
234 
235 /*E
236     MatStructure - Indicates if the matrix has the same nonzero structure
237 
238     Level: beginner
239 
240    Any additions/changes here MUST also be made in include/finclude/petscmat.h
241 
242 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
243 E*/
244 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
245 
246 EXTERN int MatCopy(Mat,Mat,MatStructure);
247 EXTERN int MatView(Mat,PetscViewer);
248 
249 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
250 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
251 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
252 #else
253 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
254 #endif
255 EXTERN int        MatLoadRegisterAll(char*);
256 EXTERN int        MatLoadRegisterDestroy(void);
257 extern PetscTruth MatLoadRegisterAllCalled;
258 extern PetscFList MatLoadList;
259 EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
260 EXTERN int        MatMerge(MPI_Comm,Mat,Mat*);
261 
262 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
263 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
264 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
265 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
266 
267 /*S
268      MatInfo - Context of matrix information, used with MatGetInfo()
269 
270    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
271 
272    Level: intermediate
273 
274   Concepts: matrix^nonzero information
275 
276 .seealso:  MatGetInfo(), MatInfoType
277 S*/
278 typedef struct {
279   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
280   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
281   PetscLogDouble block_size;                         /* block size */
282   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
283   PetscLogDouble memory;                             /* memory allocated */
284   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
285   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
286   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
287   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
288 } MatInfo;
289 
290 /*E
291     MatInfoType - Indicates if you want information about the local part of the matrix,
292      the entire parallel matrix or the maximum over all the local parts.
293 
294     Level: beginner
295 
296    Any additions/changes here MUST also be made in include/finclude/petscmat.h
297 
298 .seealso: MatGetInfo(), MatInfo
299 E*/
300 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
301 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
302 EXTERN int MatValid(Mat,PetscTruth*);
303 EXTERN int MatGetDiagonal(Mat,Vec);
304 EXTERN int MatGetRowMax(Mat,Vec);
305 EXTERN int MatTranspose(Mat,Mat*);
306 EXTERN int MatPermute(Mat,IS,IS,Mat *);
307 EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *);
308 EXTERN int MatDiagonalScale(Mat,Vec,Vec);
309 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
310 EXTERN int MatEqual(Mat,Mat,PetscTruth*);
311 
312 EXTERN int MatNorm(Mat,NormType,PetscReal *);
313 EXTERN int MatZeroEntries(Mat);
314 EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
315 EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
316 
317 EXTERN int MatUseScaledForm(Mat,PetscTruth);
318 EXTERN int MatScaleSystem(Mat,Vec,Vec);
319 EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
320 
321 EXTERN int MatGetSize(Mat,int*,int*);
322 EXTERN int MatGetLocalSize(Mat,int*,int*);
323 EXTERN int MatGetOwnershipRange(Mat,int*,int*);
324 
325 /*E
326     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
327      or MatGetSubMatrix() are to be reused to store the new matrix values.
328 
329     Level: beginner
330 
331    Any additions/changes here MUST also be made in include/finclude/petscmat.h
332 
333 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
334 E*/
335 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
336 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
337 EXTERN int MatDestroyMatrices(int,Mat **);
338 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
339 
340 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
341 
342 EXTERN int MatAXPY(PetscScalar *,Mat,Mat,MatStructure);
343 EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
344 EXTERN int MatCompress(Mat);
345 
346 EXTERN int MatScale(PetscScalar *,Mat);
347 EXTERN int MatShift(PetscScalar *,Mat);
348 
349 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
350 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
351 EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
352 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
353 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
354 
355 EXTERN int MatSetStashInitialSize(Mat,int,int);
356 
357 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
358 EXTERN int MatInterpolate(Mat,Vec,Vec);
359 EXTERN int MatRestrict(Mat,Vec,Vec);
360 
361 /*
362       These three (or four) macros MUST be used together. The third one closes the open { of the first one
363 */
364 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
365 { \
366   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
367   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
368   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
369   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
370   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
371 
372 #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \
373 { \
374   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__end; \
375   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
376   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
377   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\
378   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
379 
380 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
381 {\
382   int __l;\
383   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
384   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
385   for (__l=0;__l<nrows;__l++) {\
386     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
387   }\
388 }
389 
390 #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
391 {\
392   int __l;\
393   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
394   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
395   for (__l=0;__l<nrows;__l++) {\
396     _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
397   }\
398 }
399 
400 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
401 { int __i; \
402   for (__i=0; __i<nc; __i++) {\
403     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
404   }\
405   dnz[row - __rstart] = nc - onz[row - __rstart];\
406 }
407 
408 #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\
409 { int __i; \
410   for (__i=0; __i<nc; __i++) {\
411     if (cols[__i] >= __end) onz[row - __rstart]++; \
412     else if (cols[__i] >= row) dnz[row - __rstart]++;\
413   }\
414 }
415 
416 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
417 
418 /* Routines unique to particular data structures */
419 EXTERN int MatShellGetContext(Mat,void **);
420 
421 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
422 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
423 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
424 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
425 
426 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
427 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
428 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
429 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
430 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
431 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
432 
433 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
434 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
435 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
436 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
437 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
438 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
439 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
440 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
441 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
442 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
443 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
444 
445 EXTERN int MatStoreValues(Mat);
446 EXTERN int MatRetrieveValues(Mat);
447 
448 EXTERN int MatDAADSetCtx(Mat,void*);
449 
450 /*
451   These routines are not usually accessed directly, rather solving is
452   done through the SLES, KSP and PC interfaces.
453 */
454 
455 /*E
456     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
457        with an optional dynamic library name, for example
458        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
459 
460    Level: beginner
461 
462 .seealso: MatGetOrdering()
463 E*/
464 typedef char* MatOrderingType;
465 #define MATORDERING_NATURAL   "natural"
466 #define MATORDERING_ND        "nd"
467 #define MATORDERING_1WD       "1wd"
468 #define MATORDERING_RCM       "rcm"
469 #define MATORDERING_QMD       "qmd"
470 #define MATORDERING_ROWLENGTH "rowlength"
471 #define MATORDERING_DSC_ND    "dsc_nd"
472 #define MATORDERING_DSC_MMD   "dsc_mmd"
473 #define MATORDERING_DSC_MDF   "dsc_mdf"
474 #define MATORDERING_CONSTRAINED "constrained"
475 #define MATORDERING_IDENTITY  "identity"
476 #define MATORDERING_REVERSE   "reverse"
477 
478 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
479 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
480 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
481 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
482 #else
483 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
484 #endif
485 EXTERN int        MatOrderingRegisterDestroy(void);
486 EXTERN int        MatOrderingRegisterAll(char*);
487 extern PetscTruth MatOrderingRegisterAllCalled;
488 extern PetscFList      MatOrderingList;
489 
490 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
491 
492 EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
493 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
494 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
495 
496 /*S
497    MatILUInfo - Data based into the matrix ILU factorization routines
498 
499    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
500 
501    Notes: These are not usually directly used by users, instead use the PC type of ILU
502           All entries are double precision.
503 
504    Level: developer
505 
506 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
507 
508 S*/
509 typedef struct {
510   PetscReal     levels;         /* ILU(levels) */
511   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
512   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
513   PetscReal     dt;             /* drop tolerance */
514   PetscReal     dtcol;          /* tolerance for pivoting */
515   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
516   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
517   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
518   PetscReal     zeropivot; /* pivot is called zero if less than this */
519   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
520                                    factorization may be faster if do not pivot */
521 } MatILUInfo;
522 
523 /*S
524    MatLUInfo - Data based into the matrix LU factorization routines
525 
526    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
527 
528    Notes: These are not usually directly used by users, instead use the PC type of LU
529           All entries are double precision.
530 
531    Level: developer
532 
533 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
534 
535 S*/
536 typedef struct {
537   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
538   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
539   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
540   PetscReal     zeropivot; /* pivot is called zero if less than this */
541   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
542                                    factorization may be faster if do not pivot */
543 } MatLUInfo;
544 
545 /*S
546    MatICCInfo - Data based into the matrix ICC factorization routines
547 
548    In Fortran these are simply double precision arrays of size MAT_ICCINFO_SIZE
549 
550    Notes: These are not usually directly used by users, instead use the PC type of ICC
551           All entries are double precision.
552 
553    Level: developer
554 
555 .seealso: MatICCFactorSymbolic(), MatICCFactor(), MatILUInfo, MatLUInfo, MatCholeskyInfo
556 
557 S*/
558 typedef struct {
559   int           levels;         /* ICC(levels) */
560   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
561   PetscReal     dtcol;          /* tolerance for pivoting */
562   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
563   PetscTruth    damp;           /* if is PETSC_TRUE, apply damping until successful */
564   PetscReal     zeropivot;      /* pivot is called zero if less than this */
565 } MatICCInfo;
566 
567 /*S
568    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
569 
570    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
571 
572    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
573           All entries are double precision.
574 
575    Level: developer
576 
577 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
578 
579 S*/
580 typedef struct {
581   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
582   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
583   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
584                                    factorization may be faster if do not pivot */
585 } MatCholeskyInfo;
586 
587 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
588 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
589 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
590 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
591 EXTERN int MatICCFactorSymbolic(Mat,IS,MatICCInfo*,Mat*);
592 EXTERN int MatICCFactor(Mat,IS,MatICCInfo*);
593 EXTERN int MatLUFactorNumeric(Mat,Mat*);
594 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
595 EXTERN int MatGetInertia(Mat,int*,int*,int*);
596 EXTERN int MatSolve(Mat,Vec,Vec);
597 EXTERN int MatForwardSolve(Mat,Vec,Vec);
598 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
599 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
600 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
601 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
602 EXTERN int MatSolves(Mat,Vecs,Vecs);
603 
604 EXTERN int MatSetUnfactored(Mat);
605 
606 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
607 /*E
608     MatSORType - What type of (S)SOR to perform
609 
610     Level: beginner
611 
612    May be bitwise ORd together
613 
614    Any additions/changes here MUST also be made in include/finclude/petscmat.h
615 
616 .seealso: MatRelax()
617 E*/
618 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
619               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
620               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
621               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
622 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec);
623 
624 /*
625     These routines are for efficiently computing Jacobians via finite differences.
626 */
627 
628 /*E
629     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
630        with an optional dynamic library name, for example
631        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
632 
633    Level: beginner
634 
635 .seealso: MatGetColoring()
636 E*/
637 typedef char* MatColoringType;
638 #define MATCOLORING_NATURAL "natural"
639 #define MATCOLORING_SL      "sl"
640 #define MATCOLORING_LF      "lf"
641 #define MATCOLORING_ID      "id"
642 
643 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
644 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
645 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
646 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
647 #else
648 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
649 #endif
650 EXTERN int        MatColoringRegisterAll(char *);
651 extern PetscTruth MatColoringRegisterAllCalled;
652 EXTERN int        MatColoringRegisterDestroy(void);
653 EXTERN int        MatColoringPatch(Mat,int,int,ISColoringValue *,ISColoring*);
654 
655 /*S
656      MatFDColoring - Object for computing a sparse Jacobian via finite differences
657         and coloring
658 
659    Level: beginner
660 
661   Concepts: coloring, sparse Jacobian, finite differences
662 
663 .seealso:  MatFDColoringCreate()
664 S*/
665 typedef struct _p_MatFDColoring *MatFDColoring;
666 
667 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
668 EXTERN int MatFDColoringDestroy(MatFDColoring);
669 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
670 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
671 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
672 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
673 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
674 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
675 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
676 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
677 EXTERN int MatFDColoringSetRecompute(MatFDColoring);
678 EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
679 EXTERN int MatFDColoringGetPerturbedColumns(MatFDColoring,int*,int**);
680 /*
681     These routines are for partitioning matrices: currently used only
682   for adjacency matrix, MatCreateMPIAdj().
683 */
684 
685 /*S
686      MatPartitioning - Object for managing the partitioning of a matrix or graph
687 
688    Level: beginner
689 
690   Concepts: partitioning
691 
692 .seealso:  MatParitioningCreate(), MatPartitioningType
693 S*/
694 typedef struct _p_MatPartitioning *MatPartitioning;
695 
696 /*E
697     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
698        with an optional dynamic library name, for example
699        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
700 
701    Level: beginner
702 
703 .seealso: MatPartitioingCreate(), MatPartitioning
704 E*/
705 typedef char* MatPartitioningType;
706 #define MAT_PARTITIONING_CURRENT  "current"
707 #define MAT_PARTITIONING_PARMETIS "parmetis"
708 
709 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
710 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
711 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
712 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
713 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
714 EXTERN int MatPartitioningDestroy(MatPartitioning);
715 
716 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
717 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
718 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
719 #else
720 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
721 #endif
722 
723 EXTERN int        MatPartitioningRegisterAll(char *);
724 extern PetscTruth MatPartitioningRegisterAllCalled;
725 EXTERN int        MatPartitioningRegisterDestroy(void);
726 
727 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
728 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
729 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
730 
731 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
732 
733 /*
734     If you add entries here you must also add them to finclude/petscmat.h
735 */
736 typedef enum { MATOP_SET_VALUES=0,
737                MATOP_GET_ROW=1,
738                MATOP_RESTORE_ROW=2,
739                MATOP_MULT=3,
740                MATOP_MULT_ADD=4,
741                MATOP_MULT_TRANSPOSE=5,
742                MATOP_MULT_TRANSPOSE_ADD=6,
743                MATOP_SOLVE=7,
744                MATOP_SOLVE_ADD=8,
745                MATOP_SOLVE_TRANSPOSE=9,
746                MATOP_SOLVE_TRANSPOSE_ADD=10,
747                MATOP_LUFACTOR=11,
748                MATOP_CHOLESKYFACTOR=12,
749                MATOP_RELAX=13,
750                MATOP_TRANSPOSE=14,
751                MATOP_GETINFO=15,
752                MATOP_EQUAL=16,
753                MATOP_GET_DIAGONAL=17,
754                MATOP_DIAGONAL_SCALE=18,
755                MATOP_NORM=19,
756                MATOP_ASSEMBLY_BEGIN=20,
757                MATOP_ASSEMBLY_END=21,
758                MATOP_COMPRESS=22,
759                MATOP_SET_OPTION=23,
760                MATOP_ZERO_ENTRIES=24,
761                MATOP_ZERO_ROWS=25,
762                MATOP_LUFACTOR_SYMBOLIC=26,
763                MATOP_LUFACTOR_NUMERIC=27,
764                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
765                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
766                MATOP_SETUP_PREALLOCATION=30,
767                MATOP_ILUFACTOR_SYMBOLIC=31,
768                MATOP_ICCFACTOR_SYMBOLIC=32,
769                MATOP_GET_ARRAY=33,
770                MATOP_RESTORE_ARRAY=34,
771                MATOP_DUPLCIATE=35,
772                MATOP_FORWARD_SOLVE=36,
773                MATOP_BACKWARD_SOLVE=37,
774                MATOP_ILUFACTOR=38,
775                MATOP_ICCFACTOR=39,
776                MATOP_AXPY=40,
777                MATOP_GET_SUBMATRICES=41,
778                MATOP_INCREASE_OVERLAP=42,
779                MATOP_GET_VALUES=43,
780                MATOP_COPY=44,
781                MATOP_PRINT_HELP=45,
782                MATOP_SCALE=46,
783                MATOP_SHIFT=47,
784                MATOP_DIAGONAL_SHIFT=48,
785                MATOP_ILUDT_FACTOR=49,
786                MATOP_GET_BLOCK_SIZE=50,
787                MATOP_GET_ROW_IJ=51,
788                MATOP_RESTORE_ROW_IJ=52,
789                MATOP_GET_COLUMN_IJ=53,
790                MATOP_RESTORE_COLUMN_IJ=54,
791                MATOP_FDCOLORING_CREATE=55,
792                MATOP_COLORING_PATCH=56,
793                MATOP_SET_UNFACTORED=57,
794                MATOP_PERMUTE=58,
795                MATOP_SET_VALUES_BLOCKED=59,
796                MATOP_GET_SUBMATRIX=60,
797                MATOP_DESTROY=61,
798                MATOP_VIEW=62,
799                MATOP_GET_MAPS=63,
800                MATOP_USE_SCALED_FORM=64,
801                MATOP_SCALE_SYSTEM=65,
802                MATOP_UNSCALE_SYSTEM=66,
803                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
804                MATOP_SET_VALUES_LOCAL=68,
805                MATOP_ZERO_ROWS_LOCAL=69,
806                MATOP_GET_ROW_MAX=70,
807                MATOP_CONVERT=71,
808                MATOP_SET_COLORING=72,
809                MATOP_SET_VALUES_ADIC=73,
810                MATOP_SET_VALUES_ADIFOR=74,
811                MATOP_FD_COLORING_APPLY=75,
812                MATOP_SET_FROM_OPTIONS=76,
813                MATOP_MULT_CONSTRAINED=77,
814                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
815                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
816                MATOP_PERMUTE_SPARSIFY=80,
817                MATOP_MULT_MULTIPLE=81,
818                MATOP_SOLVE_MULTIPLE=82
819              } MatOperation;
820 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
821 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void));
822 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void));
823 EXTERN int MatShellSetContext(Mat,void*);
824 
825 /*
826    Codes for matrices stored on disk. By default they are
827  stored in a universal format. By changing the format with
828  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
829  be stored in a way natural for the matrix, for example dense matrices
830  would be stored as dense. Matrices stored this way may only be
831  read into matrices of the same time.
832 */
833 #define MATRIX_BINARY_FORMAT_DENSE -1
834 
835 /*
836      New matrix classes not yet distributed
837 */
838 /*
839     MatAIJIndices is a data structure for storing the nonzero location information
840   for sparse matrices. Several matrices with identical nonzero structure can share
841   the same MatAIJIndices.
842 */
843 typedef struct _p_MatAIJIndices* MatAIJIndices;
844 
845 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
846 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
847 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
848 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
849 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
850 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
851 EXTERN int MatShiftAIJIndices(MatAIJIndices);
852 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
853 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
854 
855 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
856 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
857 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
858 
859 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
860 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
861 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
862 
863 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
864 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
865 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
866 
867 /*S
868      MatNullSpace - Object that removes a null space from a vector, i.e.
869          orthogonalizes the vector to a subsapce
870 
871    Level: advanced
872 
873   Concepts: matrix; linear operator, null space
874 
875   Users manual sections:
876 .   sec_singular
877 
878 .seealso:  MatNullSpaceCreate()
879 S*/
880 typedef struct _p_MatNullSpace* MatNullSpace;
881 
882 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
883 EXTERN int MatNullSpaceDestroy(MatNullSpace);
884 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
885 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
886 EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
887 
888 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
889 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
890 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
891 
892 
893 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
894 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
895 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
896 
897 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
898 
899 EXTERN int MatComputeExplicitOperator(Mat,Mat*);
900 
901 EXTERN int MatESISetType(Mat,char*);
902 EXTERN int MatESISetFromOptions(Mat);
903 
904 EXTERN int MatDiagonalScaleLocal(Mat,Vec);
905 
906 EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *);
907 EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *);
908 
909 EXTERN int MatUseSuperLU_DIST_MPIAIJ(Mat);
910 EXTERN int MatUseSpooles_SeqAIJ(Mat);
911 EXTERN int MatUseUMFPACK_SeqAIJ(Mat);
912 EXTERN int MatUseSuperLU_SeqAIJ(Mat);
913 EXTERN int MatUseEssl_SeqAIJ(Mat);
914 EXTERN int MatUseLUSOL_SeqAIJ(Mat);
915 EXTERN int MatUseMatlab_SeqAIJ(Mat);
916 EXTERN int MatUseDXML_SeqAIJ(Mat);
917 EXTERN int MatUseSuperLU_DIST_MPIAIJ(Mat);
918 EXTERN int MatUseSpooles_MPIAIJ(Mat);
919 EXTERN int MatUseSpooles_SeqSBAIJ(Mat);
920 extern int MatUseSpooles_MPISBAIJ(Mat);
921 
922 #endif
923 
924 
925 
926