xref: /petsc/include/petscmat.h (revision 22e3da613d90ee96afe3e759fd76128ad75bdda0)
1 /*
2      Include file for the matrix component of PETSc
3 */
4 #ifndef __PETSCMAT_H
5 #define __PETSCMAT_H
6 #include "petscvec.h"
7 PETSC_EXTERN_CXX_BEGIN
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 MATMAIJ            "maij"
33 #define MATIS              "is"
34 #define MATMPIROWBS        "mpirowbs"
35 #define MATSEQAIJ          "seqaij"
36 #define MATMPIAIJ          "mpiaij"
37 #define MATAIJ             "aij"
38 #define MATSHELL           "shell"
39 #define MATSEQBDIAG        "seqbdiag"
40 #define MATMPIBDIAG        "mpibdiag"
41 #define MATBDIAG           "bdiag"
42 #define MATSEQDENSE        "seqdense"
43 #define MATMPIDENSE        "mpidense"
44 #define MATDENSE           "dense"
45 #define MATSEQBAIJ         "seqbaij"
46 #define MATMPIBAIJ         "mpibaij"
47 #define MATBAIJ            "baij"
48 #define MATMPIADJ          "mpiadj"
49 #define MATSEQSBAIJ        "seqsbaij"
50 #define MATMPISBAIJ        "mpisbaij"
51 #define MATSBAIJ           "sbaij"
52 #define MATDAAD            "daad"
53 #define MATMFFD            "mffd"
54 #define MATESI             "esi"
55 #define MATPETSCESI        "petscesi"
56 #define MATNORMAL          "normal"
57 #define MATSEQAIJSPOOLES   "seqaijspooles"
58 #define MATMPIAIJSPOOLES   "mpiaijspooles"
59 #define MATSEQSBAIJSPOOLES "seqsbaijspooles"
60 #define MATMPISBAIJSPOOLES "mpisbaijspooles"
61 #define MATAIJSPOOLES      "aijspooles"
62 #define MATSBAIJSPOOLES    "sbaijspooles"
63 #define MATSUPERLU         "superlu"
64 #define MATSUPERLU_DIST    "superlu_dist"
65 #define MATUMFPACK         "umfpack"
66 #define MATESSL            "essl"
67 #define MATLUSOL           "lusol"
68 #define MATAIJMUMPS        "aijmumps"
69 #define MATSBAIJMUMPS      "sbaijmumps"
70 #define MATDSCPACK         "dscpack"
71 #define MATMATLAB          "matlab"
72 #define MatType char*
73 
74 /* Logging support */
75 #define    MAT_FILE_COOKIE 1211216    /* used to indicate matrices in binary files */
76 extern PetscCookie MAT_COOKIE, MATSNESMFCTX_COOKIE, MAT_FDCOLORING_COOKIE, MAT_PARTITIONING_COOKIE, MAT_NULLSPACE_COOKIE;
77 extern PetscEvent  MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
78 extern PetscEvent  MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose;
79 extern PetscEvent  MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
80 extern PetscEvent  MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
81 extern PetscEvent  MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
82 extern PetscEvent  MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
83 extern PetscEvent  MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
84 extern PetscEvent  MAT_FDColoringApply, MAT_Transpose, MAT_FDColoringFunction;
85 extern PetscEvent  MAT_MatMult, MAT_MatMultSymbolic, MAT_MatMultNumeric;
86 extern PetscEvent  MAT_PtAP, MAT_PtAPSymbolic, MAT_PtAPNumeric;
87 extern PetscEvent  MAT_MatMultTranspose, MAT_MatMultTransposeSymbolic, MAT_MatMultTransposeNumeric;
88 
89 EXTERN PetscErrorCode MatInitializePackage(char *);
90 
91 EXTERN PetscErrorCode MatCreate(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,Mat*);
92 EXTERN PetscErrorCode MatSetType(Mat,const MatType);
93 EXTERN PetscErrorCode MatSetFromOptions(Mat);
94 EXTERN PetscErrorCode MatSetUpPreallocation(Mat);
95 EXTERN PetscErrorCode MatRegisterAll(const char[]);
96 EXTERN PetscErrorCode MatRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat));
97 
98 /*MC
99    MatRegisterDynamic - Adds a new matrix type
100 
101    Synopsis:
102    PetscErrorCode MatRegisterDynamic(char *name,char *path,char *name_create,PetscErrorCode (*routine_create)(Mat))
103 
104    Not Collective
105 
106    Input Parameters:
107 +  name - name of a new user-defined matrix type
108 .  path - path (either absolute or relative) the library containing this solver
109 .  name_create - name of routine to create method context
110 -  routine_create - routine to create method context
111 
112    Notes:
113    MatRegisterDynamic() may be called multiple times to add several user-defined solvers.
114 
115    If dynamic libraries are used, then the fourth input argument (routine_create)
116    is ignored.
117 
118    Sample usage:
119 .vb
120    MatRegisterDynamic("my_mat",/home/username/my_lib/lib/libO/solaris/mylib.a,
121                "MyMatCreate",MyMatCreate);
122 .ve
123 
124    Then, your solver can be chosen with the procedural interface via
125 $     MatSetType(Mat,"my_mat")
126    or at runtime via the option
127 $     -mat_type my_mat
128 
129    Level: advanced
130 
131    Notes: ${PETSC_ARCH} and ${BOPT} occuring in pathname will be replaced with appropriate values.
132          If your function is not being put into a shared library then use VecRegister() instead
133 
134 .keywords: Mat, register
135 
136 .seealso: MatRegisterAll(), MatRegisterDestroy()
137 
138 M*/
139 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
140 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
141 #else
142 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
143 #endif
144 
145 extern PetscTruth MatRegisterAllCalled;
146 extern PetscFList MatList;
147 
148 EXTERN PetscErrorCode MatCreateSeqDense(MPI_Comm,PetscInt,PetscInt,PetscScalar[],Mat*);
149 EXTERN PetscErrorCode MatCreateMPIDense(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar[],Mat*);
150 EXTERN PetscErrorCode MatCreateSeqAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
151 EXTERN PetscErrorCode MatCreateMPIAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
152 EXTERN PetscErrorCode MatCreateMPIRowbs(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
153 EXTERN PetscErrorCode MatCreateSeqBDiag(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscScalar*[],Mat*);
154 EXTERN PetscErrorCode MatCreateMPIBDiag(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscScalar*[],Mat*);
155 EXTERN PetscErrorCode MatCreateSeqBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
156 EXTERN PetscErrorCode MatCreateMPIBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
157 EXTERN PetscErrorCode MatCreateMPIAdj(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscInt[],Mat*);
158 EXTERN PetscErrorCode MatCreateSeqSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
159 EXTERN PetscErrorCode MatCreateMPISBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
160 EXTERN PetscErrorCode MatCreateShell(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,void *,Mat*);
161 EXTERN PetscErrorCode MatCreateAdic(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,void (*)(void),Mat*);
162 EXTERN PetscErrorCode MatCreateNormal(Mat,Mat*);
163 EXTERN PetscErrorCode MatDestroy(Mat);
164 
165 EXTERN PetscErrorCode MatPrintHelp(Mat);
166 EXTERN PetscErrorCode MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
167 
168 /* ------------------------------------------------------------*/
169 EXTERN PetscErrorCode MatSetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
170 EXTERN PetscErrorCode MatSetValuesBlocked(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
171 
172 /*S
173      MatStencil - Data structure (C struct) for storing information about a single row or
174         column of a matrix as index on an associated grid.
175 
176    Level: beginner
177 
178   Concepts: matrix; linear operator
179 
180 .seealso:  MatSetValuesStencil(), MatSetStencil(), MatSetValuesBlockStencil()
181 S*/
182 typedef struct {
183   PetscInt k,j,i,c;
184 } MatStencil;
185 
186 EXTERN PetscErrorCode MatSetValuesStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
187 EXTERN PetscErrorCode MatSetValuesBlockedStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
188 EXTERN PetscErrorCode MatSetStencil(Mat,PetscInt,const PetscInt[],const PetscInt[],PetscInt);
189 
190 EXTERN PetscErrorCode MatSetColoring(Mat,ISColoring);
191 EXTERN PetscErrorCode MatSetValuesAdic(Mat,void*);
192 EXTERN PetscErrorCode MatSetValuesAdifor(Mat,PetscInt,void*);
193 
194 /*E
195     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
196      to continue to add values to it
197 
198     Level: beginner
199 
200 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
201 E*/
202 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
203 EXTERN PetscErrorCode MatAssemblyBegin(Mat,MatAssemblyType);
204 EXTERN PetscErrorCode MatAssemblyEnd(Mat,MatAssemblyType);
205 EXTERN PetscErrorCode MatAssembled(Mat,PetscTruth*);
206 
207 extern PetscInt    MatSetValue_Row, MatSetValue_Column;
208 extern PetscScalar MatSetValue_Value;
209 
210 /*MC
211    MatSetValue - Set a single entry into a matrix.
212 
213    Synopsis:
214    PetscErrorCode MatSetValue(Mat m,PetscInt row,PetscInt col,PetscScalar value,InsertMode mode);
215 
216    Not collective
217 
218    Input Parameters:
219 +  m - the matrix
220 .  row - the row location of the entry
221 .  col - the column location of the entry
222 .  value - the value to insert
223 -  mode - either INSERT_VALUES or ADD_VALUES
224 
225    Notes:
226    For efficiency one should use MatSetValues() and set several or many
227    values simultaneously if possible.
228 
229    Level: beginner
230 
231 .seealso: MatSetValues(), MatSetValueLocal()
232 M*/
233 #define MatSetValue(v,i,j,va,mode) \
234   (MatSetValue_Row = i,MatSetValue_Column = j,MatSetValue_Value = va, \
235    MatSetValues(v,1,&MatSetValue_Row,1,&MatSetValue_Column,&MatSetValue_Value,mode))
236 
237 #define MatGetValue(v,i,j,va) \
238   (MatSetValue_Row = i,MatSetValue_Column = j,\
239    MatGetValues(v,1,&MatSetValue_Row,1,&MatSetValue_Column,&va))
240 
241 #define MatSetValueLocal(v,i,j,va,mode) \
242   (MatSetValue_Row = i,MatSetValue_Column = j,MatSetValue_Value = va, \
243    MatSetValuesLocal(v,1,&MatSetValue_Row,1,&MatSetValue_Column,&MatSetValue_Value,mode))
244 
245 /*E
246     MatOption - Options that may be set for a matrix and its behavior or storage
247 
248     Level: beginner
249 
250    Any additions/changes here MUST also be made in include/finclude/petscmat.h
251 
252 .seealso: MatSetOption()
253 E*/
254 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
255               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
256               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
257               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
258               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
259               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
260               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
261               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
262               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
263               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
264               MAT_DO_NOT_USE_INODES=82,MAT_NOT_SYMMETRIC=83,MAT_HERMITIAN=84,
265               MAT_NOT_STRUCTURALLY_SYMMETRIC=85,MAT_NOT_HERMITIAN=86,
266               MAT_SYMMETRY_ETERNAL=87,MAT_NOT_SYMMETRY_ETERNAL=88} MatOption;
267 EXTERN PetscErrorCode MatSetOption(Mat,MatOption);
268 EXTERN PetscErrorCode MatGetType(Mat,MatType*);
269 
270 EXTERN PetscErrorCode MatGetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscScalar[]);
271 EXTERN PetscErrorCode MatGetRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
272 EXTERN PetscErrorCode MatRestoreRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
273 EXTERN PetscErrorCode MatGetColumn(Mat,PetscInt,PetscInt *,PetscInt *[],PetscScalar*[]);
274 EXTERN PetscErrorCode MatRestoreColumn(Mat,PetscInt,PetscInt *,PetscInt *[],PetscScalar*[]);
275 EXTERN PetscErrorCode MatGetColumnVector(Mat,Vec,PetscInt);
276 EXTERN PetscErrorCode MatGetArray(Mat,PetscScalar *[]);
277 EXTERN PetscErrorCode MatRestoreArray(Mat,PetscScalar *[]);
278 EXTERN PetscErrorCode MatGetBlockSize(Mat,PetscInt *);
279 
280 EXTERN PetscErrorCode MatMult(Mat,Vec,Vec);
281 EXTERN PetscErrorCode MatMultAdd(Mat,Vec,Vec,Vec);
282 EXTERN PetscErrorCode MatMultTranspose(Mat,Vec,Vec);
283 EXTERN PetscErrorCode MatIsTranspose(Mat,Mat,PetscReal,PetscTruth*);
284 EXTERN PetscErrorCode MatMultTransposeAdd(Mat,Vec,Vec,Vec);
285 EXTERN PetscErrorCode MatMultConstrained(Mat,Vec,Vec);
286 EXTERN PetscErrorCode MatMultTransposeConstrained(Mat,Vec,Vec);
287 
288 /*E
289     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
290   its numerical values copied over or just its nonzero structure.
291 
292     Level: beginner
293 
294    Any additions/changes here MUST also be made in include/finclude/petscmat.h
295 
296 .seealso: MatDuplicate()
297 E*/
298 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
299 
300 EXTERN PetscErrorCode MatConvertRegister(const char[],const char[],const char[],PetscErrorCode (*)(Mat,MatType,Mat*));
301 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
302 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
303 #else
304 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
305 #endif
306 EXTERN PetscErrorCode        MatConvertRegisterAll(const char[]);
307 EXTERN PetscErrorCode        MatConvertRegisterDestroy(void);
308 extern PetscTruth MatConvertRegisterAllCalled;
309 extern PetscFList MatConvertList;
310 EXTERN PetscErrorCode        MatConvert(Mat,const MatType,Mat*);
311 EXTERN PetscErrorCode        MatDuplicate(Mat,MatDuplicateOption,Mat*);
312 
313 /*E
314     MatStructure - Indicates if the matrix has the same nonzero structure
315 
316     Level: beginner
317 
318    Any additions/changes here MUST also be made in include/finclude/petscmat.h
319 
320 .seealso: MatCopy(), KSPSetOperators(), PCSetOperators()
321 E*/
322 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER,SUBSET_NONZERO_PATTERN} MatStructure;
323 
324 EXTERN PetscErrorCode MatCopy(Mat,Mat,MatStructure);
325 EXTERN PetscErrorCode MatView(Mat,PetscViewer);
326 EXTERN PetscErrorCode MatIsSymmetric(Mat,PetscReal,PetscTruth*);
327 EXTERN PetscErrorCode MatIsSymmetricKnown(Mat,PetscTruth*,PetscTruth*);
328 EXTERN PetscErrorCode MatIsHermitianKnown(Mat,PetscTruth*,PetscTruth*);
329 EXTERN PetscErrorCode MatLoad(PetscViewer,const MatType,Mat*);
330 
331 EXTERN PetscErrorCode MatGetRowIJ(Mat,PetscInt,PetscTruth,PetscInt*,PetscInt *[],PetscInt *[],PetscTruth *);
332 EXTERN PetscErrorCode MatRestoreRowIJ(Mat,PetscInt,PetscTruth,PetscInt *,PetscInt *[],PetscInt *[],PetscTruth *);
333 EXTERN PetscErrorCode MatGetColumnIJ(Mat,PetscInt,PetscTruth,PetscInt*,PetscInt *[],PetscInt *[],PetscTruth *);
334 EXTERN PetscErrorCode MatRestoreColumnIJ(Mat,PetscInt,PetscTruth,PetscInt *,PetscInt *[],PetscInt *[],PetscTruth *);
335 
336 /*S
337      MatInfo - Context of matrix information, used with MatGetInfo()
338 
339    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
340 
341    Level: intermediate
342 
343   Concepts: matrix^nonzero information
344 
345 .seealso:  MatGetInfo(), MatInfoType
346 S*/
347 typedef struct {
348   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
349   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
350   PetscLogDouble block_size;                         /* block size */
351   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
352   PetscLogDouble memory;                             /* memory allocated */
353   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
354   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
355   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
356   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
357 } MatInfo;
358 
359 /*E
360     MatInfoType - Indicates if you want information about the local part of the matrix,
361      the entire parallel matrix or the maximum over all the local parts.
362 
363     Level: beginner
364 
365    Any additions/changes here MUST also be made in include/finclude/petscmat.h
366 
367 .seealso: MatGetInfo(), MatInfo
368 E*/
369 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
370 EXTERN PetscErrorCode MatGetInfo(Mat,MatInfoType,MatInfo*);
371 EXTERN PetscErrorCode MatValid(Mat,PetscTruth*);
372 EXTERN PetscErrorCode MatGetDiagonal(Mat,Vec);
373 EXTERN PetscErrorCode MatGetRowMax(Mat,Vec);
374 EXTERN PetscErrorCode MatTranspose(Mat,Mat*);
375 EXTERN PetscErrorCode MatPermute(Mat,IS,IS,Mat *);
376 EXTERN PetscErrorCode MatPermuteSparsify(Mat,PetscInt,PetscReal,PetscReal,IS,IS,Mat *);
377 EXTERN PetscErrorCode MatDiagonalScale(Mat,Vec,Vec);
378 EXTERN PetscErrorCode MatDiagonalSet(Mat,Vec,InsertMode);
379 EXTERN PetscErrorCode MatEqual(Mat,Mat,PetscTruth*);
380 
381 EXTERN PetscErrorCode MatNorm(Mat,NormType,PetscReal *);
382 EXTERN PetscErrorCode MatZeroEntries(Mat);
383 EXTERN PetscErrorCode MatZeroRows(Mat,IS,const PetscScalar*);
384 EXTERN PetscErrorCode MatZeroColumns(Mat,IS,const PetscScalar*);
385 
386 EXTERN PetscErrorCode MatUseScaledForm(Mat,PetscTruth);
387 EXTERN PetscErrorCode MatScaleSystem(Mat,Vec,Vec);
388 EXTERN PetscErrorCode MatUnScaleSystem(Mat,Vec,Vec);
389 
390 EXTERN PetscErrorCode MatGetSize(Mat,PetscInt*,PetscInt*);
391 EXTERN PetscErrorCode MatGetLocalSize(Mat,PetscInt*,PetscInt*);
392 EXTERN PetscErrorCode MatGetOwnershipRange(Mat,PetscInt*,PetscInt*);
393 
394 /*E
395     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
396      or MatGetSubMatrix() are to be reused to store the new matrix values.
397 
398     Level: beginner
399 
400    Any additions/changes here MUST also be made in include/finclude/petscmat.h
401 
402 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
403 E*/
404 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
405 EXTERN PetscErrorCode MatGetSubMatrices(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]);
406 EXTERN PetscErrorCode MatDestroyMatrices(PetscInt,Mat *[]);
407 EXTERN PetscErrorCode MatGetSubMatrix(Mat,IS,IS,PetscInt,MatReuse,Mat *);
408 EXTERN PetscErrorCode MatMerge(MPI_Comm,Mat,PetscInt,MatReuse,Mat*);
409 EXTERN PetscErrorCode MatMerge_SeqsToMPI(MPI_Comm,Mat,PetscInt,PetscInt,MatReuse,Mat*);
410 EXTERN PetscErrorCode MatGetLocalMat(Mat,MatReuse,IS*,IS*,Mat*);
411 EXTERN PetscErrorCode MatGetBrowsOfAcols(Mat,Mat,MatReuse,IS*,IS*,PetscInt*,Mat*);
412 
413 EXTERN PetscErrorCode MatIncreaseOverlap(Mat,PetscInt,IS[],PetscInt);
414 
415 EXTERN PetscErrorCode MatMatMult(Mat,Mat,MatReuse,PetscReal,Mat*);
416 EXTERN PetscErrorCode MatMatMultSymbolic(Mat,Mat,PetscReal,Mat*);
417 EXTERN PetscErrorCode MatMatMultNumeric(Mat,Mat,Mat);
418 
419 EXTERN PetscErrorCode MatPtAP(Mat,Mat,MatReuse,PetscReal,Mat*);
420 EXTERN PetscErrorCode MatPtAPSymbolic(Mat,Mat,PetscReal,Mat*);
421 EXTERN PetscErrorCode MatPtAPNumeric(Mat,Mat,Mat);
422 
423 EXTERN PetscErrorCode MatMatMultTranspose(Mat,Mat,MatReuse,PetscReal,Mat*);
424 EXTERN PetscErrorCode MatMatMultTransposeSymbolic(Mat,Mat,PetscReal,Mat*);
425 EXTERN PetscErrorCode MatMatMultTransposeNumeric(Mat,Mat,Mat);
426 
427 EXTERN PetscErrorCode MatAXPY(const PetscScalar *,Mat,Mat,MatStructure);
428 EXTERN PetscErrorCode MatAYPX(const PetscScalar *,Mat,Mat);
429 EXTERN PetscErrorCode MatCompress(Mat);
430 
431 EXTERN PetscErrorCode MatScale(const PetscScalar *,Mat);
432 EXTERN PetscErrorCode MatShift(const PetscScalar *,Mat);
433 
434 EXTERN PetscErrorCode MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
435 EXTERN PetscErrorCode MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
436 EXTERN PetscErrorCode MatZeroRowsLocal(Mat,IS,const PetscScalar*);
437 EXTERN PetscErrorCode MatSetValuesLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
438 EXTERN PetscErrorCode MatSetValuesBlockedLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
439 
440 EXTERN PetscErrorCode MatStashSetInitialSize(Mat,PetscInt,PetscInt);
441 EXTERN PetscErrorCode MatStashGetInfo(Mat,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
442 
443 EXTERN PetscErrorCode MatInterpolateAdd(Mat,Vec,Vec,Vec);
444 EXTERN PetscErrorCode MatInterpolate(Mat,Vec,Vec);
445 EXTERN PetscErrorCode MatRestrict(Mat,Vec,Vec);
446 EXTERN PetscErrorCode MatGetVecs(Mat,Vec*,Vec*);
447 
448 /*MC
449    MatPreallocInitialize - Begins the block of code that will count the number of nonzeros per
450        row in a matrix providing the data that one can use to correctly preallocate the matrix.
451 
452    Synopsis:
453    PetscErrorCode MatPreallocateInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
454 
455    Collective on MPI_Comm
456 
457    Input Parameters:
458 +  comm - the communicator that will share the eventually allocated matrix
459 .  nrows - the number of rows in the matrix
460 -  ncols - the number of columns in the matrix
461 
462    Output Parameters:
463 +  dnz - the array that will be passed to the matrix preallocation routines
464 -  ozn - the other array passed to the matrix preallocation routines
465 
466 
467    Level: intermediate
468 
469    Notes:
470    See the chapter in the users manual on performance for more details
471 
472    Do not malloc or free dnz and onz, that is handled internally by these routines
473 
474    Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices)
475 
476   Concepts: preallocation^Matrix
477 
478 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
479           MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocal()
480 M*/
481 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
482 { \
483   PetscErrorCode _4_ierr; PetscInt __tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
484   _4_ierr = PetscMalloc(2*__tmp*sizeof(PetscInt),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
485   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(PetscInt));CHKERRQ(_4_ierr);\
486   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
487   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
488 
489 /*MC
490    MatPreallocSymmetricInitialize - Begins the block of code that will count the number of nonzeros per
491        row in a matrix providing the data that one can use to correctly preallocate the matrix.
492 
493    Synopsis:
494    PetscErrorCode MatPreallocateSymmetricInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
495 
496    Collective on MPI_Comm
497 
498    Input Parameters:
499 +  comm - the communicator that will share the eventually allocated matrix
500 .  nrows - the number of rows in the matrix
501 -  ncols - the number of columns in the matrix
502 
503    Output Parameters:
504 +  dnz - the array that will be passed to the matrix preallocation routines
505 -  ozn - the other array passed to the matrix preallocation routines
506 
507 
508    Level: intermediate
509 
510    Notes:
511    See the chapter in the users manual on performance for more details
512 
513    Do not malloc or free dnz and onz, that is handled internally by these routines
514 
515   Concepts: preallocation^Matrix
516 
517 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
518           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
519 M*/
520 #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \
521 { \
522   PetscErrorCode _4_ierr; PetscInt __tmp = (nrows),__ctmp = (ncols),__rstart,__end; \
523   _4_ierr = PetscMalloc(2*__tmp*sizeof(PetscInt),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
524   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(PetscInt));CHKERRQ(_4_ierr);\
525   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\
526   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
527 
528 /*MC
529    MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
530        inserted using a local number of the rows and columns
531 
532    Synopsis:
533    PetscErrorCode MatPreallocateSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
534 
535    Not Collective
536 
537    Input Parameters:
538 +  map - the mapping between local numbering and global numbering
539 .  nrows - the number of rows indicated
540 .  rows - the indices of the rows
541 .  ncols - the number of columns in the matrix
542 .  cols - the columns indicated
543 .  dnz - the array that will be passed to the matrix preallocation routines
544 -  ozn - the other array passed to the matrix preallocation routines
545 
546 
547    Level: intermediate
548 
549    Notes:
550    See the chapter in the users manual on performance for more details
551 
552    Do not malloc or free dnz and onz, that is handled internally by these routines
553 
554   Concepts: preallocation^Matrix
555 
556 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
557           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
558 M*/
559 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
560 {\
561   PetscInt __l;\
562   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
563   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
564   for (__l=0;__l<nrows;__l++) {\
565     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
566   }\
567 }
568 
569 /*MC
570    MatPreallocateSymmetricSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
571        inserted using a local number of the rows and columns
572 
573    Synopsis:
574    PetscErrorCode MatPreallocateSymmetricSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
575 
576    Not Collective
577 
578    Input Parameters:
579 +  map - the mapping between local numbering and global numbering
580 .  nrows - the number of rows indicated
581 .  rows - the indices of the rows
582 .  ncols - the number of columns in the matrix
583 .  cols - the columns indicated
584 .  dnz - the array that will be passed to the matrix preallocation routines
585 -  ozn - the other array passed to the matrix preallocation routines
586 
587 
588    Level: intermediate
589 
590    Notes:
591    See the chapter in the users manual on performance for more details
592 
593    Do not malloc or free dnz and onz that is handled internally by these routines
594 
595   Concepts: preallocation^Matrix
596 
597 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
598           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
599 M*/
600 #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
601 {\
602   PetscInt __l;\
603   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
604   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
605   for (__l=0;__l<nrows;__l++) {\
606     _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
607   }\
608 }
609 
610 /*MC
611    MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
612        inserted using a local number of the rows and columns
613 
614    Synopsis:
615    PetscErrorCode MatPreallocateSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
616 
617    Not Collective
618 
619    Input Parameters:
620 +  nrows - the number of rows indicated
621 .  rows - the indices of the rows
622 .  ncols - the number of columns in the matrix
623 -  cols - the columns indicated
624 
625    Output Parameters:
626 +  dnz - the array that will be passed to the matrix preallocation routines
627 -  ozn - the other array passed to the matrix preallocation routines
628 
629 
630    Level: intermediate
631 
632    Notes:
633    See the chapter in the users manual on performance for more details
634 
635    Do not malloc or free dnz and onz that is handled internally by these routines
636 
637   Concepts: preallocation^Matrix
638 
639 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
640           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
641 M*/
642 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
643 { PetscInt __i; \
644   for (__i=0; __i<nc; __i++) {\
645     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
646   }\
647   dnz[row - __rstart] = nc - onz[row - __rstart];\
648 }
649 
650 /*MC
651    MatPreallocateSymmetricSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
652        inserted using a local number of the rows and columns
653 
654    Synopsis:
655    PetscErrorCode MatPreallocateSymmetricSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
656 
657    Not Collective
658 
659    Input Parameters:
660 +  nrows - the number of rows indicated
661 .  rows - the indices of the rows
662 .  ncols - the number of columns in the matrix
663 .  cols - the columns indicated
664 .  dnz - the array that will be passed to the matrix preallocation routines
665 -  ozn - the other array passed to the matrix preallocation routines
666 
667 
668    Level: intermediate
669 
670    Notes:
671    See the chapter in the users manual on performance for more details
672 
673    Do not malloc or free dnz and onz that is handled internally by these routines
674 
675   Concepts: preallocation^Matrix
676 
677 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
678           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
679 M*/
680 #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\
681 { PetscInt __i; \
682   for (__i=0; __i<nc; __i++) {\
683     if (cols[__i] >= __end) onz[row - __rstart]++; \
684     else if (cols[__i] >= row) dnz[row - __rstart]++;\
685   }\
686 }
687 
688 /*MC
689    MatPreallocFinalize - Ends the block of code that will count the number of nonzeros per
690        row in a matrix providing the data that one can use to correctly preallocate the matrix.
691 
692    Synopsis:
693    PetscErrorCode MatPreallocateFinalize(PetscInt *dnz, PetscInt *onz)
694 
695    Collective on MPI_Comm
696 
697    Input Parameters:
698 +  dnz - the array that will be passed to the matrix preallocation routines
699 -  ozn - the other array passed to the matrix preallocation routines
700 
701 
702    Level: intermediate
703 
704    Notes:
705    See the chapter in the users manual on performance for more details
706 
707    Do not malloc or free dnz and onz that is handled internally by these routines
708 
709   Concepts: preallocation^Matrix
710 
711 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
712           MatPreallocateSymmetricInitialize(), MatPreallocateSymmetricSetLocal()
713 M*/
714 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
715 
716 
717 
718 /* Routines unique to particular data structures */
719 EXTERN PetscErrorCode MatShellGetContext(Mat,void **);
720 
721 EXTERN PetscErrorCode MatBDiagGetData(Mat,PetscInt*,PetscInt*,PetscInt*[],PetscInt*[],PetscScalar***);
722 EXTERN PetscErrorCode MatSeqAIJSetColumnIndices(Mat,PetscInt[]);
723 EXTERN PetscErrorCode MatSeqBAIJSetColumnIndices(Mat,PetscInt[]);
724 EXTERN PetscErrorCode MatCreateSeqAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
725 
726 EXTERN PetscErrorCode MatSeqBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
727 EXTERN PetscErrorCode MatSeqSBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
728 EXTERN PetscErrorCode MatSeqAIJSetPreallocation(Mat,PetscInt,const PetscInt[]);
729 EXTERN PetscErrorCode MatSeqDensePreallocation(Mat,PetscScalar[]);
730 EXTERN PetscErrorCode MatSeqBDiagSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscScalar*[]);
731 EXTERN PetscErrorCode MatSeqDenseSetPreallocation(Mat,PetscScalar[]);
732 
733 EXTERN PetscErrorCode MatMPIBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
734 EXTERN PetscErrorCode MatMPISBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
735 EXTERN PetscErrorCode MatMPIAIJSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
736 EXTERN PetscErrorCode MatMPIDensePreallocation(Mat,PetscScalar[]);
737 EXTERN PetscErrorCode MatMPIBDiagSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscScalar*[]);
738 EXTERN PetscErrorCode MatMPIAdjSetPreallocation(Mat,PetscInt[],PetscInt[],PetscInt[]);
739 EXTERN PetscErrorCode MatMPIDenseSetPreallocation(Mat,PetscScalar[]);
740 EXTERN PetscErrorCode MatMPIRowbsSetPreallocation(Mat,PetscInt,const PetscInt[]);
741 EXTERN PetscErrorCode MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,PetscInt*[]);
742 EXTERN PetscErrorCode MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,PetscInt*[]);
743 EXTERN PetscErrorCode MatAdicSetLocalFunction(Mat,void (*)(void));
744 
745 EXTERN PetscErrorCode MatSeqDenseSetLDA(Mat,PetscInt);
746 
747 EXTERN PetscErrorCode MatStoreValues(Mat);
748 EXTERN PetscErrorCode MatRetrieveValues(Mat);
749 
750 EXTERN PetscErrorCode MatDAADSetCtx(Mat,void*);
751 
752 /*
753   These routines are not usually accessed directly, rather solving is
754   done through the KSP and PC interfaces.
755 */
756 
757 /*E
758     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
759        with an optional dynamic library name, for example
760        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
761 
762    Level: beginner
763 
764 .seealso: MatGetOrdering()
765 E*/
766 #define MatOrderingType char*
767 #define MATORDERING_NATURAL   "natural"
768 #define MATORDERING_ND        "nd"
769 #define MATORDERING_1WD       "1wd"
770 #define MATORDERING_RCM       "rcm"
771 #define MATORDERING_QMD       "qmd"
772 #define MATORDERING_ROWLENGTH "rowlength"
773 #define MATORDERING_DSC_ND    "dsc_nd"
774 #define MATORDERING_DSC_MMD   "dsc_mmd"
775 #define MATORDERING_DSC_MDF   "dsc_mdf"
776 #define MATORDERING_CONSTRAINED "constrained"
777 #define MATORDERING_IDENTITY  "identity"
778 #define MATORDERING_REVERSE   "reverse"
779 
780 EXTERN PetscErrorCode MatGetOrdering(Mat,const MatOrderingType,IS*,IS*);
781 EXTERN PetscErrorCode MatOrderingRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,const MatOrderingType,IS*,IS*));
782 
783 /*MC
784    MatOrderingRegisterDynamic - Adds a new sparse matrix ordering to the
785                                matrix package.
786 
787    Synopsis:
788    PetscErrorCode MatOrderingRegisterDynamic(char *name_ordering,char *path,char *name_create,PetscErrorCode (*routine_create)(MatOrdering))
789 
790    Not Collective
791 
792    Input Parameters:
793 +  sname - name of ordering (for example MATORDERING_ND)
794 .  path - location of library where creation routine is
795 .  name - name of function that creates the ordering type,a string
796 -  function - function pointer that creates the ordering
797 
798    Level: developer
799 
800    If dynamic libraries are used, then the fourth input argument (function)
801    is ignored.
802 
803    Sample usage:
804 .vb
805    MatOrderingRegisterDynamic("my_order",/home/username/my_lib/lib/libO/solaris/mylib.a,
806                "MyOrder",MyOrder);
807 .ve
808 
809    Then, your partitioner can be chosen with the procedural interface via
810 $     MatOrderingSetType(part,"my_order)
811    or at runtime via the option
812 $     -pc_ilu_mat_ordering_type my_order
813 $     -pc_lu_mat_ordering_type my_order
814 
815    ${PETSC_ARCH} and ${BOPT} occuring in pathname will be replaced with appropriate values.
816 
817 .keywords: matrix, ordering, register
818 
819 .seealso: MatOrderingRegisterDestroy(), MatOrderingRegisterAll()
820 M*/
821 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
822 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
823 #else
824 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
825 #endif
826 
827 EXTERN PetscErrorCode        MatOrderingRegisterDestroy(void);
828 EXTERN PetscErrorCode        MatOrderingRegisterAll(const char[]);
829 extern PetscTruth MatOrderingRegisterAllCalled;
830 extern PetscFList MatOrderingList;
831 
832 EXTERN PetscErrorCode MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
833 
834 /*S
835    MatFactorInfo - Data based into the matrix factorization routines
836 
837    In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE
838 
839    Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC.
840 
841    Level: developer
842 
843 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor()
844 
845 S*/
846 typedef struct {
847   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
848   PetscReal     shift;          /* if true, shift until positive pivots */
849   PetscReal     shift_fraction; /* record shift fraction taken */
850   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
851   PetscReal     dt;             /* drop tolerance */
852   PetscReal     dtcol;          /* tolerance for pivoting */
853   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
854   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
855   PetscReal     levels;         /* ICC/ILU(levels) */
856   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
857                                    factorization may be faster if do not pivot */
858   PetscReal     zeropivot;      /* pivot is called zero if less than this */
859 } MatFactorInfo;
860 
861 EXTERN PetscErrorCode MatCholeskyFactor(Mat,IS,MatFactorInfo*);
862 EXTERN PetscErrorCode MatCholeskyFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*);
863 EXTERN PetscErrorCode MatCholeskyFactorNumeric(Mat,Mat*);
864 EXTERN PetscErrorCode MatLUFactor(Mat,IS,IS,MatFactorInfo*);
865 EXTERN PetscErrorCode MatILUFactor(Mat,IS,IS,MatFactorInfo*);
866 EXTERN PetscErrorCode MatLUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*);
867 EXTERN PetscErrorCode MatILUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*);
868 EXTERN PetscErrorCode MatICCFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*);
869 EXTERN PetscErrorCode MatICCFactor(Mat,IS,MatFactorInfo*);
870 EXTERN PetscErrorCode MatLUFactorNumeric(Mat,Mat*);
871 EXTERN PetscErrorCode MatILUDTFactor(Mat,MatFactorInfo*,IS,IS,Mat *);
872 EXTERN PetscErrorCode MatGetInertia(Mat,PetscInt*,PetscInt*,PetscInt*);
873 EXTERN PetscErrorCode MatSolve(Mat,Vec,Vec);
874 EXTERN PetscErrorCode MatForwardSolve(Mat,Vec,Vec);
875 EXTERN PetscErrorCode MatBackwardSolve(Mat,Vec,Vec);
876 EXTERN PetscErrorCode MatSolveAdd(Mat,Vec,Vec,Vec);
877 EXTERN PetscErrorCode MatSolveTranspose(Mat,Vec,Vec);
878 EXTERN PetscErrorCode MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
879 EXTERN PetscErrorCode MatSolves(Mat,Vecs,Vecs);
880 
881 EXTERN PetscErrorCode MatSetUnfactored(Mat);
882 
883 /*E
884     MatSORType - What type of (S)SOR to perform
885 
886     Level: beginner
887 
888    May be bitwise ORd together
889 
890    Any additions/changes here MUST also be made in include/finclude/petscmat.h
891 
892    MatSORType may be bitwise ORd together, so do not change the numbers
893 
894 .seealso: MatRelax(), MatPBRelax()
895 E*/
896 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
897               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
898               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
899               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
900 EXTERN PetscErrorCode MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,PetscInt,PetscInt,Vec);
901 EXTERN PetscErrorCode MatPBRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,PetscInt,PetscInt,Vec);
902 
903 /*
904     These routines are for efficiently computing Jacobians via finite differences.
905 */
906 
907 /*E
908     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
909        with an optional dynamic library name, for example
910        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
911 
912    Level: beginner
913 
914 .seealso: MatGetColoring()
915 E*/
916 #define MatColoringType char*
917 #define MATCOLORING_NATURAL "natural"
918 #define MATCOLORING_SL      "sl"
919 #define MATCOLORING_LF      "lf"
920 #define MATCOLORING_ID      "id"
921 
922 EXTERN PetscErrorCode MatGetColoring(Mat,const MatColoringType,ISColoring*);
923 EXTERN PetscErrorCode MatColoringRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,const MatColoringType,ISColoring *));
924 
925 /*MC
926    MatColoringRegisterDynamic - Adds a new sparse matrix coloring to the
927                                matrix package.
928 
929    Synopsis:
930    PetscErrorCode MatColoringRegisterDynamic(char *name_coloring,char *path,char *name_create,PetscErrorCode (*routine_create)(MatColoring))
931 
932    Not Collective
933 
934    Input Parameters:
935 +  sname - name of Coloring (for example MATCOLORING_SL)
936 .  path - location of library where creation routine is
937 .  name - name of function that creates the Coloring type, a string
938 -  function - function pointer that creates the coloring
939 
940    Level: developer
941 
942    If dynamic libraries are used, then the fourth input argument (function)
943    is ignored.
944 
945    Sample usage:
946 .vb
947    MatColoringRegisterDynamic("my_color",/home/username/my_lib/lib/libO/solaris/mylib.a,
948                "MyColor",MyColor);
949 .ve
950 
951    Then, your partitioner can be chosen with the procedural interface via
952 $     MatColoringSetType(part,"my_color")
953    or at runtime via the option
954 $     -mat_coloring_type my_color
955 
956    $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
957 
958 .keywords: matrix, Coloring, register
959 
960 .seealso: MatColoringRegisterDestroy(), MatColoringRegisterAll()
961 M*/
962 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
963 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
964 #else
965 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
966 #endif
967 
968 EXTERN PetscErrorCode        MatColoringRegisterAll(const char[]);
969 extern PetscTruth MatColoringRegisterAllCalled;
970 EXTERN PetscErrorCode        MatColoringRegisterDestroy(void);
971 EXTERN PetscErrorCode        MatColoringPatch(Mat,PetscInt,PetscInt,ISColoringValue[],ISColoring*);
972 
973 /*S
974      MatFDColoring - Object for computing a sparse Jacobian via finite differences
975         and coloring
976 
977    Level: beginner
978 
979   Concepts: coloring, sparse Jacobian, finite differences
980 
981 .seealso:  MatFDColoringCreate()
982 S*/
983 typedef struct _p_MatFDColoring *MatFDColoring;
984 
985 EXTERN PetscErrorCode MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
986 EXTERN PetscErrorCode MatFDColoringDestroy(MatFDColoring);
987 EXTERN PetscErrorCode MatFDColoringView(MatFDColoring,PetscViewer);
988 EXTERN PetscErrorCode MatFDColoringSetFunction(MatFDColoring,PetscErrorCode (*)(void),void*);
989 EXTERN PetscErrorCode MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
990 EXTERN PetscErrorCode MatFDColoringSetFrequency(MatFDColoring,PetscInt);
991 EXTERN PetscErrorCode MatFDColoringGetFrequency(MatFDColoring,PetscInt*);
992 EXTERN PetscErrorCode MatFDColoringSetFromOptions(MatFDColoring);
993 EXTERN PetscErrorCode MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
994 EXTERN PetscErrorCode MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
995 EXTERN PetscErrorCode MatFDColoringSetRecompute(MatFDColoring);
996 EXTERN PetscErrorCode MatFDColoringSetF(MatFDColoring,Vec);
997 EXTERN PetscErrorCode MatFDColoringGetPerturbedColumns(MatFDColoring,PetscInt*,PetscInt*[]);
998 /*
999     These routines are for partitioning matrices: currently used only
1000   for adjacency matrix, MatCreateMPIAdj().
1001 */
1002 
1003 /*S
1004      MatPartitioning - Object for managing the partitioning of a matrix or graph
1005 
1006    Level: beginner
1007 
1008   Concepts: partitioning
1009 
1010 .seealso:  MatPartitioningCreate(), MatPartitioningType
1011 S*/
1012 typedef struct _p_MatPartitioning *MatPartitioning;
1013 
1014 /*E
1015     MatPartitioningType - String with the name of a PETSc matrix partitioning or the creation function
1016        with an optional dynamic library name, for example
1017        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
1018 
1019    Level: beginner
1020 
1021 .seealso: MatPartitioningCreate(), MatPartitioning
1022 E*/
1023 #define MatPartitioningType char*
1024 #define MAT_PARTITIONING_CURRENT  "current"
1025 #define MAT_PARTITIONING_PARMETIS "parmetis"
1026 #define MAT_PARTITIONING_CHACO    "chaco"
1027 #define MAT_PARTITIONING_JOSTLE   "jostle"
1028 #define MAT_PARTITIONING_PARTY    "party"
1029 #define MAT_PARTITIONING_SCOTCH   "scotch"
1030 
1031 
1032 EXTERN PetscErrorCode MatPartitioningCreate(MPI_Comm,MatPartitioning*);
1033 EXTERN PetscErrorCode MatPartitioningSetType(MatPartitioning,const MatPartitioningType);
1034 EXTERN PetscErrorCode MatPartitioningSetNParts(MatPartitioning,PetscInt);
1035 EXTERN PetscErrorCode MatPartitioningSetAdjacency(MatPartitioning,Mat);
1036 EXTERN PetscErrorCode MatPartitioningSetVertexWeights(MatPartitioning,const PetscInt[]);
1037 EXTERN PetscErrorCode MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []);
1038 EXTERN PetscErrorCode MatPartitioningApply(MatPartitioning,IS*);
1039 EXTERN PetscErrorCode MatPartitioningDestroy(MatPartitioning);
1040 
1041 EXTERN PetscErrorCode MatPartitioningRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatPartitioning));
1042 
1043 /*MC
1044    MatPartitioningRegisterDynamic - Adds a new sparse matrix partitioning to the
1045    matrix package.
1046 
1047    Synopsis:
1048    PetscErrorCode MatPartitioningRegisterDynamic(char *name_partitioning,char *path,char *name_create,PetscErrorCode (*routine_create)(MatPartitioning))
1049 
1050    Not Collective
1051 
1052    Input Parameters:
1053 +  sname - name of partitioning (for example MAT_PARTITIONING_CURRENT) or parmetis
1054 .  path - location of library where creation routine is
1055 .  name - name of function that creates the partitioning type, a string
1056 -  function - function pointer that creates the partitioning type
1057 
1058    Level: developer
1059 
1060    If dynamic libraries are used, then the fourth input argument (function)
1061    is ignored.
1062 
1063    Sample usage:
1064 .vb
1065    MatPartitioningRegisterDynamic("my_part",/home/username/my_lib/lib/libO/solaris/mylib.a,
1066                "MyPartCreate",MyPartCreate);
1067 .ve
1068 
1069    Then, your partitioner can be chosen with the procedural interface via
1070 $     MatPartitioningSetType(part,"my_part")
1071    or at runtime via the option
1072 $     -mat_partitioning_type my_part
1073 
1074    $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
1075 
1076 .keywords: matrix, partitioning, register
1077 
1078 .seealso: MatPartitioningRegisterDestroy(), MatPartitioningRegisterAll()
1079 M*/
1080 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1081 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
1082 #else
1083 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
1084 #endif
1085 
1086 EXTERN PetscErrorCode        MatPartitioningRegisterAll(const char[]);
1087 extern PetscTruth MatPartitioningRegisterAllCalled;
1088 EXTERN PetscErrorCode        MatPartitioningRegisterDestroy(void);
1089 
1090 EXTERN PetscErrorCode MatPartitioningView(MatPartitioning,PetscViewer);
1091 EXTERN PetscErrorCode MatPartitioningSetFromOptions(MatPartitioning);
1092 EXTERN PetscErrorCode MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
1093 
1094 EXTERN PetscErrorCode MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
1095 
1096 EXTERN PetscErrorCode MatPartitioningJostleSetCoarseLevel(MatPartitioning,PetscReal);
1097 EXTERN PetscErrorCode MatPartitioningJostleSetCoarseSequential(MatPartitioning);
1098 
1099 typedef enum { MP_CHACO_MULTILEVEL_KL, MP_CHACO_SPECTRAL, MP_CHACO_LINEAR,
1100     MP_CHACO_RANDOM, MP_CHACO_SCATTERED } MPChacoGlobalType;
1101 EXTERN PetscErrorCode MatPartitioningChacoSetGlobal(MatPartitioning, MPChacoGlobalType);
1102 typedef enum { MP_CHACO_KERNIGHAN_LIN, MP_CHACO_NONE } MPChacoLocalType;
1103 EXTERN PetscErrorCode MatPartitioningChacoSetLocal(MatPartitioning, MPChacoLocalType);
1104 EXTERN PetscErrorCode MatPartitioningChacoSetCoarseLevel(MatPartitioning,PetscReal);
1105 typedef enum { MP_CHACO_LANCZOS, MP_CHACO_RQI_SYMMLQ } MPChacoEigenType;
1106 EXTERN PetscErrorCode MatPartitioningChacoSetEigenSolver(MatPartitioning,MPChacoEigenType);
1107 EXTERN PetscErrorCode MatPartitioningChacoSetEigenTol(MatPartitioning, PetscReal);
1108 EXTERN PetscErrorCode MatPartitioningChacoSetEigenNumber(MatPartitioning, PetscInt);
1109 
1110 #define MP_PARTY_OPT "opt"
1111 #define MP_PARTY_LIN "lin"
1112 #define MP_PARTY_SCA "sca"
1113 #define MP_PARTY_RAN "ran"
1114 #define MP_PARTY_GBF "gbf"
1115 #define MP_PARTY_GCF "gcf"
1116 #define MP_PARTY_BUB "bub"
1117 #define MP_PARTY_DEF "def"
1118 EXTERN PetscErrorCode MatPartitioningPartySetGlobal(MatPartitioning, const char*);
1119 #define MP_PARTY_HELPFUL_SETS "hs"
1120 #define MP_PARTY_KERNIGHAN_LIN "kl"
1121 #define MP_PARTY_NONE "no"
1122 EXTERN PetscErrorCode MatPartitioningPartySetLocal(MatPartitioning, const char*);
1123 EXTERN PetscErrorCode MatPartitioningPartySetCoarseLevel(MatPartitioning,PetscReal);
1124 EXTERN PetscErrorCode MatPartitioningPartySetBipart(MatPartitioning,PetscTruth);
1125 EXTERN PetscErrorCode MatPartitioningPartySetMatchOptimization(MatPartitioning,PetscTruth);
1126 
1127 typedef enum { MP_SCOTCH_GREEDY, MP_SCOTCH_GPS, MP_SCOTCH_GR_GPS } MPScotchGlobalType;
1128 EXTERN PetscErrorCode MatPartitioningScotchSetArch(MatPartitioning,const char*);
1129 EXTERN PetscErrorCode MatPartitioningScotchSetMultilevel(MatPartitioning);
1130 EXTERN PetscErrorCode MatPartitioningScotchSetGlobal(MatPartitioning,MPScotchGlobalType);
1131 EXTERN PetscErrorCode MatPartitioningScotchSetCoarseLevel(MatPartitioning,PetscReal);
1132 EXTERN PetscErrorCode MatPartitioningScotchSetHostList(MatPartitioning,const char*);
1133 typedef enum { MP_SCOTCH_KERNIGHAN_LIN, MP_SCOTCH_NONE } MPScotchLocalType;
1134 EXTERN PetscErrorCode MatPartitioningScotchSetLocal(MatPartitioning,MPScotchLocalType);
1135 EXTERN PetscErrorCode MatPartitioningScotchSetMapping(MatPartitioning);
1136 EXTERN PetscErrorCode MatPartitioningScotchSetStrategy(MatPartitioning,char*);
1137 
1138 /*
1139     If you add entries here you must also add them to finclude/petscmat.h
1140 */
1141 typedef enum { MATOP_SET_VALUES=0,
1142                MATOP_GET_ROW=1,
1143                MATOP_RESTORE_ROW=2,
1144                MATOP_MULT=3,
1145                MATOP_MULT_ADD=4,
1146                MATOP_MULT_TRANSPOSE=5,
1147                MATOP_MULT_TRANSPOSE_ADD=6,
1148                MATOP_SOLVE=7,
1149                MATOP_SOLVE_ADD=8,
1150                MATOP_SOLVE_TRANSPOSE=9,
1151                MATOP_SOLVE_TRANSPOSE_ADD=10,
1152                MATOP_LUFACTOR=11,
1153                MATOP_CHOLESKYFACTOR=12,
1154                MATOP_RELAX=13,
1155                MATOP_TRANSPOSE=14,
1156                MATOP_GETINFO=15,
1157                MATOP_EQUAL=16,
1158                MATOP_GET_DIAGONAL=17,
1159                MATOP_DIAGONAL_SCALE=18,
1160                MATOP_NORM=19,
1161                MATOP_ASSEMBLY_BEGIN=20,
1162                MATOP_ASSEMBLY_END=21,
1163                MATOP_COMPRESS=22,
1164                MATOP_SET_OPTION=23,
1165                MATOP_ZERO_ENTRIES=24,
1166                MATOP_ZERO_ROWS=25,
1167                MATOP_LUFACTOR_SYMBOLIC=26,
1168                MATOP_LUFACTOR_NUMERIC=27,
1169                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
1170                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
1171                MATOP_SETUP_PREALLOCATION=30,
1172                MATOP_ILUFACTOR_SYMBOLIC=31,
1173                MATOP_ICCFACTOR_SYMBOLIC=32,
1174                MATOP_GET_ARRAY=33,
1175                MATOP_RESTORE_ARRAY=34,
1176                MATOP_DUPLCIATE=35,
1177                MATOP_FORWARD_SOLVE=36,
1178                MATOP_BACKWARD_SOLVE=37,
1179                MATOP_ILUFACTOR=38,
1180                MATOP_ICCFACTOR=39,
1181                MATOP_AXPY=40,
1182                MATOP_GET_SUBMATRICES=41,
1183                MATOP_INCREASE_OVERLAP=42,
1184                MATOP_GET_VALUES=43,
1185                MATOP_COPY=44,
1186                MATOP_PRINT_HELP=45,
1187                MATOP_SCALE=46,
1188                MATOP_SHIFT=47,
1189                MATOP_DIAGONAL_SHIFT=48,
1190                MATOP_ILUDT_FACTOR=49,
1191                MATOP_GET_BLOCK_SIZE=50,
1192                MATOP_GET_ROW_IJ=51,
1193                MATOP_RESTORE_ROW_IJ=52,
1194                MATOP_GET_COLUMN_IJ=53,
1195                MATOP_RESTORE_COLUMN_IJ=54,
1196                MATOP_FDCOLORING_CREATE=55,
1197                MATOP_COLORING_PATCH=56,
1198                MATOP_SET_UNFACTORED=57,
1199                MATOP_PERMUTE=58,
1200                MATOP_SET_VALUES_BLOCKED=59,
1201                MATOP_GET_SUBMATRIX=60,
1202                MATOP_DESTROY=61,
1203                MATOP_VIEW=62,
1204                MATOP_GET_MAPS=63,
1205                MATOP_USE_SCALED_FORM=64,
1206                MATOP_SCALE_SYSTEM=65,
1207                MATOP_UNSCALE_SYSTEM=66,
1208                MATOP_SET_LOCAL_TO_GLOBAL_MAP=67,
1209                MATOP_SET_VALUES_LOCAL=68,
1210                MATOP_ZERO_ROWS_LOCAL=69,
1211                MATOP_GET_ROW_MAX=70,
1212                MATOP_CONVERT=71,
1213                MATOP_SET_COLORING=72,
1214                MATOP_SET_VALUES_ADIC=73,
1215                MATOP_SET_VALUES_ADIFOR=74,
1216                MATOP_FD_COLORING_APPLY=75,
1217                MATOP_SET_FROM_OPTIONS=76,
1218                MATOP_MULT_CON=77,
1219                MATOP_MULT_TRANSPOSE_CON=78,
1220                MATOP_ILU_FACTOR_SYMBOLIC_CON=79,
1221                MATOP_PERMUTE_SPARSIFY=80,
1222                MATOP_MULT_MULTIPLE=81,
1223                MATOP_SOLVE_MULTIPLE=82,
1224                MATOP_GET_INERTIA=83,
1225                MATOP_LOAD=84,
1226                MATOP_IS_SYMMETRIC=85,
1227                MATOP_IS_HERMITIAN=86,
1228                MATOP_IS_STRUCTURALLY_SYMMETRIC=87,
1229                MATOP_PB_RELAX=88,
1230                MATOP_GET_VECS=89,
1231                MATOP_MAT_MULT=90,
1232                MATOP_MAT_MULT_SYMBOLIC=91,
1233                MATOP_MAT_MULT_NUMERIC=92,
1234                MATOP_PTAP=93,
1235                MATOP_PTAP_SYMBOLIC=94,
1236                MATOP_PTAP_NUMERIC=95,
1237                MATOP_MAT_MULTTRANSPOSE=96,
1238                MATOP_MAT_MULTTRANSPOSE_SYMBOLIC=97,
1239                MATOP_MAT_MULTTRANSPOSE_NUMERIC=98
1240              } MatOperation;
1241 EXTERN PetscErrorCode MatHasOperation(Mat,MatOperation,PetscTruth*);
1242 EXTERN PetscErrorCode MatShellSetOperation(Mat,MatOperation,void(*)(void));
1243 EXTERN PetscErrorCode MatShellGetOperation(Mat,MatOperation,void(**)(void));
1244 EXTERN PetscErrorCode MatShellSetContext(Mat,void*);
1245 
1246 /*
1247    Codes for matrices stored on disk. By default they are
1248  stored in a universal format. By changing the format with
1249  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
1250  be stored in a way natural for the matrix, for example dense matrices
1251  would be stored as dense. Matrices stored this way may only be
1252  read into matrices of the same time.
1253 */
1254 #define MATRIX_BINARY_FORMAT_DENSE -1
1255 
1256 EXTERN PetscErrorCode MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
1257 EXTERN PetscErrorCode MatSeqAIJGetInodeSizes(Mat,PetscInt *,PetscInt *[],PetscInt *);
1258 EXTERN PetscErrorCode MatMPIRowbsGetColor(Mat,ISColoring *);
1259 
1260 EXTERN PetscErrorCode MatISGetLocalMat(Mat,Mat*);
1261 
1262 /*S
1263      MatNullSpace - Object that removes a null space from a vector, i.e.
1264          orthogonalizes the vector to a subsapce
1265 
1266    Level: advanced
1267 
1268   Concepts: matrix; linear operator, null space
1269 
1270   Users manual sections:
1271 .   sec_singular
1272 
1273 .seealso:  MatNullSpaceCreate()
1274 S*/
1275 typedef struct _p_MatNullSpace* MatNullSpace;
1276 
1277 EXTERN PetscErrorCode MatNullSpaceCreate(MPI_Comm,PetscTruth,PetscInt,const Vec[],MatNullSpace*);
1278 EXTERN PetscErrorCode MatNullSpaceDestroy(MatNullSpace);
1279 EXTERN PetscErrorCode MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
1280 EXTERN PetscErrorCode MatNullSpaceAttach(Mat,MatNullSpace);
1281 EXTERN PetscErrorCode MatNullSpaceTest(MatNullSpace,Mat);
1282 
1283 EXTERN PetscErrorCode MatReorderingSeqSBAIJ(Mat,IS);
1284 EXTERN PetscErrorCode MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
1285 EXTERN PetscErrorCode MatSeqSBAIJSetColumnIndices(Mat,PetscInt *);
1286 
1287 
1288 EXTERN PetscErrorCode MatCreateMAIJ(Mat,PetscInt,Mat*);
1289 EXTERN PetscErrorCode MatMAIJRedimension(Mat,PetscInt,Mat*);
1290 EXTERN PetscErrorCode MatMAIJGetAIJ(Mat,Mat*);
1291 
1292 EXTERN PetscErrorCode MatComputeExplicitOperator(Mat,Mat*);
1293 
1294 EXTERN PetscErrorCode MatESISetType(Mat,const char*);
1295 EXTERN PetscErrorCode MatESISetFromOptions(Mat);
1296 
1297 EXTERN PetscErrorCode MatDiagonalScaleLocal(Mat,Vec);
1298 
1299 EXTERN PetscErrorCode PetscViewerMathematicaPutMatrix(PetscViewer, PetscInt, PetscInt, PetscReal *);
1300 EXTERN PetscErrorCode PetscViewerMathematicaPutCSRMatrix(PetscViewer, PetscInt, PetscInt, PetscInt *, PetscInt *, PetscReal *);
1301 
1302 PETSC_EXTERN_CXX_END
1303 #endif
1304