xref: /petsc/include/petscmat.h (revision ecd1d7b800a8e5d54bd2bb04019759f2bc8b1326)
1 /*
2      Include file for the matrix component of PETSc
3 */
4 #ifndef __PETSCMAT_H
5 #define __PETSCMAT_H
6 #include <petscvec.h>
7 
8 /*S
9      Mat - Abstract PETSc matrix object used to manage all linear operators in PETSc, even those without
10            an explicit sparse representation (such as matrix-free operators)
11 
12    Level: beginner
13 
14   Concepts: matrix; linear operator
15 
16 .seealso:  MatCreate(), MatType, MatSetType(), MatDestroy()
17 S*/
18 typedef struct _p_Mat*           Mat;
19 
20 /*J
21     MatType - String with the name of a PETSc matrix type
22 
23    Level: beginner
24 
25 .seealso: MatSetType(), Mat, MatSolverPackage, MatRegister()
26 J*/
27 typedef const char* MatType;
28 #define MATSAME            "same"
29 #define MATMAIJ            "maij"
30 #define MATSEQMAIJ         "seqmaij"
31 #define MATMPIMAIJ         "mpimaij"
32 #define MATIS              "is"
33 #define MATAIJ             "aij"
34 #define MATSEQAIJ          "seqaij"
35 #define MATMPIAIJ          "mpiaij"
36 #define MATAIJCRL          "aijcrl"
37 #define MATSEQAIJCRL       "seqaijcrl"
38 #define MATMPIAIJCRL       "mpiaijcrl"
39 #define MATAIJCUSP         "aijcusp"
40 #define MATSEQAIJCUSP      "seqaijcusp"
41 #define MATMPIAIJCUSP      "mpiaijcusp"
42 #define MATAIJCUSPARSE     "aijcusparse"
43 #define MATSEQAIJCUSPARSE  "seqaijcusparse"
44 #define MATMPIAIJCUSPARSE  "mpiaijcusparse"
45 #define MATAIJVIENNACL     "aijviennacl"
46 #define MATSEQAIJVIENNACL  "seqaijviennacl"
47 #define MATMPIAIJVIENNACL  "mpiaijviennacl"
48 #define MATAIJPERM         "aijperm"
49 #define MATSEQAIJPERM      "seqaijperm"
50 #define MATMPIAIJPERM      "mpiaijperm"
51 #define MATSHELL           "shell"
52 #define MATDENSE           "dense"
53 #define MATSEQDENSE        "seqdense"
54 #define MATMPIDENSE        "mpidense"
55 #define MATELEMENTAL       "elemental"
56 #define MATBAIJ            "baij"
57 #define MATSEQBAIJ         "seqbaij"
58 #define MATMPIBAIJ         "mpibaij"
59 #define MATMPIADJ          "mpiadj"
60 #define MATSBAIJ           "sbaij"
61 #define MATSEQSBAIJ        "seqsbaij"
62 #define MATMPISBAIJ        "mpisbaij"
63 #define MATDAAD            "daad"
64 #define MATMFFD            "mffd"
65 #define MATNORMAL          "normal"
66 #define MATNORMALHERMITIAN "normalh"
67 #define MATLRC             "lrc"
68 #define MATSCATTER         "scatter"
69 #define MATBLOCKMAT        "blockmat"
70 #define MATCOMPOSITE       "composite"
71 #define MATFFT             "fft"
72 #define MATFFTW            "fftw"
73 #define MATSEQCUFFT        "seqcufft"
74 #define MATTRANSPOSEMAT    "transpose"
75 #define MATSCHURCOMPLEMENT "schurcomplement"
76 #define MATPYTHON          "python"
77 #define MATHYPRE           "hypre"
78 #define MATHYPRESTRUCT     "hyprestruct"
79 #define MATHYPRESSTRUCT    "hypresstruct"
80 #define MATSUBMATRIX       "submatrix"
81 #define MATLOCALREF        "localref"
82 #define MATNEST            "nest"
83 #define MATPREALLOCATOR    "preallocator"
84 
85 /*J
86     MatSolverPackage - String with the name of a PETSc matrix solver type.
87 
88     For example: "petsc" indicates what PETSc provides, "superlu_dist" the parallel SuperLU_DIST package etc
89 
90    Level: beginner
91 
92 .seealso: MatGetFactor(), Mat, MatSetType(), MatType
93 J*/
94 #define MatSolverPackage char*
95 #define MATSOLVERSUPERLU      "superlu"
96 #define MATSOLVERSUPERLU_DIST "superlu_dist"
97 #define MATSOLVERSTRUMPACK    "strumpack"
98 #define MATSOLVERUMFPACK      "umfpack"
99 #define MATSOLVERCHOLMOD      "cholmod"
100 #define MATSOLVERKLU          "klu"
101 #define MATSOLVERCLIQUE       "clique"
102 #define MATSOLVERELEMENTAL    "elemental"
103 #define MATSOLVERESSL         "essl"
104 #define MATSOLVERLUSOL        "lusol"
105 #define MATSOLVERMUMPS        "mumps"
106 #define MATSOLVERMKL_PARDISO  "mkl_pardiso"
107 #define MATSOLVERMKL_CPARDISO "mkl_cpardiso"
108 #define MATSOLVERPASTIX       "pastix"
109 #define MATSOLVERMATLAB       "matlab"
110 #define MATSOLVERPETSC        "petsc"
111 #define MATSOLVERBAS          "bas"
112 #define MATSOLVERCUSPARSE     "cusparse"
113 
114 /*E
115     MatFactorType - indicates what type of factorization is requested
116 
117     Level: beginner
118 
119    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
120 
121 .seealso: MatSolverPackage, MatGetFactor()
122 E*/
123 typedef enum {MAT_FACTOR_NONE, MAT_FACTOR_LU, MAT_FACTOR_CHOLESKY, MAT_FACTOR_ILU, MAT_FACTOR_ICC,MAT_FACTOR_ILUDT} MatFactorType;
124 PETSC_EXTERN const char *const MatFactorTypes[];
125 
126 PETSC_EXTERN PetscErrorCode MatGetFactor(Mat,const MatSolverPackage,MatFactorType,Mat*);
127 PETSC_EXTERN PetscErrorCode MatGetFactorAvailable(Mat,const MatSolverPackage,MatFactorType,PetscBool *);
128 PETSC_EXTERN PetscErrorCode MatFactorGetSolverPackage(Mat,const MatSolverPackage*);
129 PETSC_EXTERN PetscErrorCode MatGetFactorType(Mat,MatFactorType*);
130 PETSC_EXTERN PetscErrorCode MatSolverPackageRegister(const MatSolverPackage,const MatType,MatFactorType,PetscErrorCode(*)(Mat,MatFactorType,Mat*));
131 PETSC_EXTERN PetscErrorCode MatSolverPackageGet(const MatSolverPackage,const MatType,MatFactorType,PetscBool*,PetscBool*,PetscErrorCode (**)(Mat,MatFactorType,Mat*));
132 
133 /* Logging support */
134 #define    MAT_FILE_CLASSID 1211216    /* used to indicate matrices in binary files */
135 PETSC_EXTERN PetscClassId MAT_CLASSID;
136 PETSC_EXTERN PetscClassId MAT_COLORING_CLASSID;
137 PETSC_EXTERN PetscClassId MAT_FDCOLORING_CLASSID;
138 PETSC_EXTERN PetscClassId MAT_TRANSPOSECOLORING_CLASSID;
139 PETSC_EXTERN PetscClassId MAT_PARTITIONING_CLASSID;
140 PETSC_EXTERN PetscClassId MAT_COARSEN_CLASSID;
141 PETSC_EXTERN PetscClassId MAT_NULLSPACE_CLASSID;
142 PETSC_EXTERN PetscClassId MATMFFD_CLASSID;
143 
144 /*E
145     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
146      or MatGetSubMatrix() are to be reused to store the new matrix values. For MatConvert() is used to indicate
147      that the input matrix is to be replaced with the converted matrix.
148 
149     Level: beginner
150 
151    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
152 
153 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices(), MatConvert()
154 E*/
155 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX,MAT_IGNORE_MATRIX,MAT_INPLACE_MATRIX} MatReuse;
156 
157 /*E
158     MatGetSubMatrixOption - Indicates if matrices obtained from a call to MatGetSubMatrices()
159      include the matrix values. Currently it is only used by MatGetSeqNonzerostructure().
160 
161     Level: beginner
162 
163 .seealso: MatGetSeqNonzerostructure()
164 E*/
165 typedef enum {MAT_DO_NOT_GET_VALUES,MAT_GET_VALUES} MatGetSubMatrixOption;
166 
167 PETSC_EXTERN PetscErrorCode MatInitializePackage(void);
168 
169 PETSC_EXTERN PetscErrorCode MatCreate(MPI_Comm,Mat*);
170 PETSC_EXTERN PetscErrorCode MatSetSizes(Mat,PetscInt,PetscInt,PetscInt,PetscInt);
171 PETSC_EXTERN PetscErrorCode MatSetType(Mat,MatType);
172 PETSC_EXTERN PetscErrorCode MatSetFromOptions(Mat);
173 PETSC_STATIC_INLINE PetscErrorCode MatViewFromOptions(Mat A,PetscObject obj,const char name[]) {return PetscObjectViewFromOptions((PetscObject)A,obj,name);}
174 PETSC_EXTERN PetscErrorCode MatRegister(const char[],PetscErrorCode(*)(Mat));
175 PETSC_EXTERN PetscErrorCode MatRegisterBaseName(const char[],const char[],const char[]);
176 PETSC_EXTERN PetscErrorCode MatSetOptionsPrefix(Mat,const char[]);
177 PETSC_EXTERN PetscErrorCode MatAppendOptionsPrefix(Mat,const char[]);
178 PETSC_EXTERN PetscErrorCode MatGetOptionsPrefix(Mat,const char*[]);
179 PETSC_EXTERN PetscErrorCode MatSetErrorIfFailure(Mat,PetscBool);
180 
181 PETSC_EXTERN PetscFunctionList MatList;
182 PETSC_EXTERN PetscFunctionList MatColoringList;
183 PETSC_EXTERN PetscFunctionList MatPartitioningList;
184 
185 /*E
186     MatStructure - Indicates if two matrices have the same nonzero structure
187 
188     Level: beginner
189 
190    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
191 
192 .seealso: MatCopy(), MatAXPY()
193 E*/
194 typedef enum {DIFFERENT_NONZERO_PATTERN,SUBSET_NONZERO_PATTERN,SAME_NONZERO_PATTERN} MatStructure;
195 
196 PETSC_EXTERN PetscErrorCode MatCreateSeqDense(MPI_Comm,PetscInt,PetscInt,PetscScalar[],Mat*);
197 PETSC_EXTERN PetscErrorCode MatCreateDense(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar[],Mat*);
198 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
199 PETSC_EXTERN PetscErrorCode MatCreateAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
200 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *);
201 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithSplitArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],PetscInt[],PetscInt[],PetscScalar[],Mat*);
202 
203 PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
204 PETSC_EXTERN PetscErrorCode MatCreateBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
205 PETSC_EXTERN PetscErrorCode MatCreateMPIBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat*);
206 
207 PETSC_EXTERN PetscErrorCode MatCreateMPIAdj(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscInt[],Mat*);
208 PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
209 
210 PETSC_EXTERN PetscErrorCode MatCreateSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
211 PETSC_EXTERN PetscErrorCode MatCreateMPISBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *);
212 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
213 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
214 PETSC_EXTERN PetscErrorCode MatXAIJSetPreallocation(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscInt[],const PetscInt[]);
215 
216 PETSC_EXTERN PetscErrorCode MatCreateShell(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,void *,Mat*);
217 PETSC_EXTERN PetscErrorCode MatCreateNormal(Mat,Mat*);
218 PETSC_EXTERN PetscErrorCode MatCreateNormalHermitian(Mat,Mat*);
219 PETSC_EXTERN PetscErrorCode MatCreateLRC(Mat,Mat,Vec,Mat,Mat*);
220 PETSC_EXTERN PetscErrorCode MatLRCGetMats(Mat,Mat*,Mat*,Vec*,Mat*);
221 PETSC_EXTERN PetscErrorCode MatCreateIS(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,ISLocalToGlobalMapping,ISLocalToGlobalMapping,Mat*);
222 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
223 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
224 
225 PETSC_EXTERN PetscErrorCode MatCreateScatter(MPI_Comm,VecScatter,Mat*);
226 PETSC_EXTERN PetscErrorCode MatScatterSetVecScatter(Mat,VecScatter);
227 PETSC_EXTERN PetscErrorCode MatScatterGetVecScatter(Mat,VecScatter*);
228 PETSC_EXTERN PetscErrorCode MatCreateBlockMat(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt*,Mat*);
229 PETSC_EXTERN PetscErrorCode MatCompositeAddMat(Mat,Mat);
230 PETSC_EXTERN PetscErrorCode MatCompositeMerge(Mat);
231 PETSC_EXTERN PetscErrorCode MatCreateComposite(MPI_Comm,PetscInt,const Mat*,Mat*);
232 typedef enum {MAT_COMPOSITE_ADDITIVE,MAT_COMPOSITE_MULTIPLICATIVE} MatCompositeType;
233 PETSC_EXTERN PetscErrorCode MatCompositeSetType(Mat,MatCompositeType);
234 
235 PETSC_EXTERN PetscErrorCode MatCreateFFT(MPI_Comm,PetscInt,const PetscInt[],MatType,Mat*);
236 PETSC_EXTERN PetscErrorCode MatCreateSeqCUFFT(MPI_Comm,PetscInt,const PetscInt[],Mat*);
237 
238 PETSC_EXTERN PetscErrorCode MatCreateTranspose(Mat,Mat*);
239 PETSC_EXTERN PetscErrorCode MatTransposeGetMat(Mat,Mat*);
240 PETSC_EXTERN PetscErrorCode MatCreateHermitianTranspose(Mat,Mat*);
241 PETSC_EXTERN PetscErrorCode MatCreateSubMatrix(Mat,IS,IS,Mat*);
242 PETSC_EXTERN PetscErrorCode MatSubMatrixUpdate(Mat,Mat,IS,IS);
243 PETSC_EXTERN PetscErrorCode MatCreateLocalRef(Mat,IS,IS,Mat*);
244 
245 #if defined(PETSC_HAVE_HYPRE)
246 PETSC_EXTERN PetscErrorCode MatHYPRESetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
247 #endif
248 
249 PETSC_EXTERN PetscErrorCode MatPythonSetType(Mat,const char[]);
250 
251 PETSC_EXTERN PetscErrorCode MatSetUp(Mat);
252 PETSC_EXTERN PetscErrorCode MatDestroy(Mat*);
253 PETSC_EXTERN PetscErrorCode MatGetNonzeroState(Mat,PetscObjectState*);
254 
255 PETSC_EXTERN PetscErrorCode MatConjugate(Mat);
256 PETSC_EXTERN PetscErrorCode MatRealPart(Mat);
257 PETSC_EXTERN PetscErrorCode MatImaginaryPart(Mat);
258 PETSC_EXTERN PetscErrorCode MatGetDiagonalBlock(Mat,Mat*);
259 PETSC_EXTERN PetscErrorCode MatGetTrace(Mat,PetscScalar*);
260 PETSC_EXTERN PetscErrorCode MatInvertBlockDiagonal(Mat,const PetscScalar **);
261 
262 /* ------------------------------------------------------------*/
263 PETSC_EXTERN PetscErrorCode MatSetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
264 PETSC_EXTERN PetscErrorCode MatSetValuesBlocked(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
265 PETSC_EXTERN PetscErrorCode MatSetValuesRow(Mat,PetscInt,const PetscScalar[]);
266 PETSC_EXTERN PetscErrorCode MatSetValuesRowLocal(Mat,PetscInt,const PetscScalar[]);
267 PETSC_EXTERN PetscErrorCode MatSetValuesBatch(Mat,PetscInt,PetscInt,PetscInt[],const PetscScalar[]);
268 PETSC_EXTERN PetscErrorCode MatSetRandom(Mat,PetscRandom);
269 
270 /*S
271      MatStencil - Data structure (C struct) for storing information about a single row or
272         column of a matrix as indexed on an associated grid. These are arguments to MatSetStencil() and MatSetBlockStencil()
273 
274    The i,j, and k represent the logical coordinates over the entire grid (for 2 and 1 dimensional problems the k and j entries are ignored).
275    The c represents the the degrees of freedom at each grid point (the dof argument to DMDASetDOF()). If dof is 1 then this entry is ignored.
276 
277    For stencil access to vectors see DMDAVecGetArray(), DMDAVecGetArrayF90().
278 
279    Fortran usage is different, see MatSetValuesStencil() for details.
280 
281    Level: beginner
282 
283   Concepts: matrix; linear operator
284 
285 .seealso:  MatSetValuesStencil(), MatSetStencil(), MatSetValuesBlockedStencil(), DMDAVecGetArray(), DMDAVecGetArrayF90()
286 S*/
287 typedef struct {
288   PetscInt k,j,i,c;
289 } MatStencil;
290 
291 PETSC_EXTERN PetscErrorCode MatSetValuesStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
292 PETSC_EXTERN PetscErrorCode MatSetValuesBlockedStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
293 PETSC_EXTERN PetscErrorCode MatSetStencil(Mat,PetscInt,const PetscInt[],const PetscInt[],PetscInt);
294 
295 /*E
296     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
297      to continue to add or insert values to it
298 
299     Level: beginner
300 
301 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
302 E*/
303 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
304 PETSC_EXTERN PetscErrorCode MatAssemblyBegin(Mat,MatAssemblyType);
305 PETSC_EXTERN PetscErrorCode MatAssemblyEnd(Mat,MatAssemblyType);
306 PETSC_EXTERN PetscErrorCode MatAssembled(Mat,PetscBool *);
307 
308 
309 
310 /*E
311     MatOption - Options that may be set for a matrix and its behavior or storage
312 
313     Level: beginner
314 
315    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
316 
317    Developer Notes: Entries that are negative need not be called collectively by all processes.
318 
319 .seealso: MatSetOption()
320 E*/
321 typedef enum {MAT_OPTION_MIN = -3,
322               MAT_UNUSED_NONZERO_LOCATION_ERR = -2,
323               MAT_ROW_ORIENTED = -1,
324               MAT_SYMMETRIC = 1,
325               MAT_STRUCTURALLY_SYMMETRIC = 2,
326               MAT_NEW_DIAGONALS = 3,
327               MAT_IGNORE_OFF_PROC_ENTRIES = 4,
328               MAT_USE_HASH_TABLE = 5,
329               MAT_KEEP_NONZERO_PATTERN = 6,
330               MAT_IGNORE_ZERO_ENTRIES = 7,
331               MAT_USE_INODES = 8,
332               MAT_HERMITIAN = 9,
333               MAT_SYMMETRY_ETERNAL = 10,
334               MAT_NEW_NONZERO_LOCATION_ERR = 11,
335               MAT_IGNORE_LOWER_TRIANGULAR = 12,
336               MAT_ERROR_LOWER_TRIANGULAR = 13,
337               MAT_GETROW_UPPERTRIANGULAR = 14,
338               MAT_SPD = 15,
339               MAT_NO_OFF_PROC_ZERO_ROWS = 16,
340               MAT_NO_OFF_PROC_ENTRIES = 17,
341               MAT_NEW_NONZERO_LOCATIONS = 18,
342               MAT_NEW_NONZERO_ALLOCATION_ERR = 19,
343               MAT_SUBSET_OFF_PROC_ENTRIES = 20,
344               MAT_OPTION_MAX = 21} MatOption;
345 
346 PETSC_EXTERN const char *MatOptions[];
347 PETSC_EXTERN PetscErrorCode MatSetOption(Mat,MatOption,PetscBool);
348 PETSC_EXTERN PetscErrorCode MatGetOption(Mat,MatOption,PetscBool*);
349 PETSC_EXTERN PetscErrorCode MatGetType(Mat,MatType*);
350 
351 PETSC_EXTERN PetscErrorCode MatGetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscScalar[]);
352 PETSC_EXTERN PetscErrorCode MatGetRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
353 PETSC_EXTERN PetscErrorCode MatRestoreRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
354 PETSC_EXTERN PetscErrorCode MatGetRowUpperTriangular(Mat);
355 PETSC_EXTERN PetscErrorCode MatRestoreRowUpperTriangular(Mat);
356 PETSC_EXTERN PetscErrorCode MatGetColumnVector(Mat,Vec,PetscInt);
357 PETSC_EXTERN PetscErrorCode MatSeqAIJGetArray(Mat,PetscScalar *[]);
358 PETSC_EXTERN PetscErrorCode MatSeqAIJRestoreArray(Mat,PetscScalar *[]);
359 PETSC_EXTERN PetscErrorCode MatSeqAIJGetMaxRowNonzeros(Mat,PetscInt*);
360 PETSC_EXTERN PetscErrorCode MatSeqAIJSetValuesLocalFast(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
361 PETSC_EXTERN PetscErrorCode MatDenseGetArray(Mat,PetscScalar *[]);
362 PETSC_EXTERN PetscErrorCode MatDenseRestoreArray(Mat,PetscScalar *[]);
363 PETSC_EXTERN PetscErrorCode MatGetBlockSize(Mat,PetscInt *);
364 PETSC_EXTERN PetscErrorCode MatSetBlockSize(Mat,PetscInt);
365 PETSC_EXTERN PetscErrorCode MatGetBlockSizes(Mat,PetscInt *,PetscInt *);
366 PETSC_EXTERN PetscErrorCode MatSetBlockSizes(Mat,PetscInt,PetscInt);
367 PETSC_EXTERN PetscErrorCode MatSetBlockSizesFromMats(Mat,Mat,Mat);
368 
369 PETSC_EXTERN PetscErrorCode MatMult(Mat,Vec,Vec);
370 PETSC_EXTERN PetscErrorCode MatMultDiagonalBlock(Mat,Vec,Vec);
371 PETSC_EXTERN PetscErrorCode MatMultAdd(Mat,Vec,Vec,Vec);
372 PETSC_EXTERN PetscErrorCode MatMultTranspose(Mat,Vec,Vec);
373 PETSC_EXTERN PetscErrorCode MatMultHermitianTranspose(Mat,Vec,Vec);
374 PETSC_EXTERN PetscErrorCode MatIsTranspose(Mat,Mat,PetscReal,PetscBool *);
375 PETSC_EXTERN PetscErrorCode MatIsHermitianTranspose(Mat,Mat,PetscReal,PetscBool *);
376 PETSC_EXTERN PetscErrorCode MatMultTransposeAdd(Mat,Vec,Vec,Vec);
377 PETSC_EXTERN PetscErrorCode MatMultHermitianTransposeAdd(Mat,Vec,Vec,Vec);
378 PETSC_EXTERN PetscErrorCode MatMultConstrained(Mat,Vec,Vec);
379 PETSC_EXTERN PetscErrorCode MatMultTransposeConstrained(Mat,Vec,Vec);
380 PETSC_EXTERN PetscErrorCode MatMatSolve(Mat,Mat,Mat);
381 PETSC_EXTERN PetscErrorCode MatResidual(Mat,Vec,Vec,Vec);
382 
383 /*E
384     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
385   its numerical values copied over or just its nonzero structure.
386 
387     Level: beginner
388 
389    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
390 
391 $   MAT_SHARE_NONZERO_PATTERN - the i and j arrays in the new matrix will be shared with the original matrix
392 $                               this also triggers the MAT_DO_NOT_COPY_VALUES option. This is used when you
393 $                               have several matrices with the same nonzero pattern.
394 
395 .seealso: MatDuplicate()
396 E*/
397 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES,MAT_SHARE_NONZERO_PATTERN} MatDuplicateOption;
398 
399 PETSC_EXTERN PetscErrorCode MatConvert(Mat,MatType,MatReuse,Mat*);
400 PETSC_EXTERN PetscErrorCode MatDuplicate(Mat,MatDuplicateOption,Mat*);
401 
402 
403 PETSC_EXTERN PetscErrorCode MatCopy(Mat,Mat,MatStructure);
404 PETSC_EXTERN PetscErrorCode MatView(Mat,PetscViewer);
405 PETSC_EXTERN PetscErrorCode MatIsSymmetric(Mat,PetscReal,PetscBool *);
406 PETSC_EXTERN PetscErrorCode MatIsStructurallySymmetric(Mat,PetscBool *);
407 PETSC_EXTERN PetscErrorCode MatIsHermitian(Mat,PetscReal,PetscBool *);
408 PETSC_EXTERN PetscErrorCode MatIsSymmetricKnown(Mat,PetscBool *,PetscBool *);
409 PETSC_EXTERN PetscErrorCode MatIsHermitianKnown(Mat,PetscBool *,PetscBool *);
410 PETSC_EXTERN PetscErrorCode MatMissingDiagonal(Mat,PetscBool  *,PetscInt *);
411 PETSC_EXTERN PetscErrorCode MatLoad(Mat, PetscViewer);
412 
413 PETSC_EXTERN PetscErrorCode MatGetRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,const PetscInt *[],const PetscInt *[],PetscBool  *);
414 PETSC_EXTERN PetscErrorCode MatRestoreRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,const PetscInt *[],const PetscInt *[],PetscBool  *);
415 PETSC_EXTERN PetscErrorCode MatGetColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,const PetscInt *[],const PetscInt *[],PetscBool  *);
416 PETSC_EXTERN PetscErrorCode MatRestoreColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,const PetscInt *[],const PetscInt *[],PetscBool  *);
417 
418 /*S
419      MatInfo - Context of matrix information, used with MatGetInfo()
420 
421    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
422 
423    Level: intermediate
424 
425   Concepts: matrix^nonzero information
426 
427 .seealso:  MatGetInfo(), MatInfoType
428 S*/
429 typedef struct {
430   PetscLogDouble block_size;                         /* block size */
431   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
432   PetscLogDouble memory;                             /* memory allocated */
433   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
434   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
435   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
436   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
437 } MatInfo;
438 
439 /*E
440     MatInfoType - Indicates if you want information about the local part of the matrix,
441      the entire parallel matrix or the maximum over all the local parts.
442 
443     Level: beginner
444 
445    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
446 
447 .seealso: MatGetInfo(), MatInfo
448 E*/
449 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
450 PETSC_EXTERN PetscErrorCode MatGetInfo(Mat,MatInfoType,MatInfo*);
451 PETSC_EXTERN PetscErrorCode MatGetDiagonal(Mat,Vec);
452 PETSC_EXTERN PetscErrorCode MatGetRowMax(Mat,Vec,PetscInt[]);
453 PETSC_EXTERN PetscErrorCode MatGetRowMin(Mat,Vec,PetscInt[]);
454 PETSC_EXTERN PetscErrorCode MatGetRowMaxAbs(Mat,Vec,PetscInt[]);
455 PETSC_EXTERN PetscErrorCode MatGetRowMinAbs(Mat,Vec,PetscInt[]);
456 PETSC_EXTERN PetscErrorCode MatGetRowSum(Mat,Vec);
457 PETSC_EXTERN PetscErrorCode MatTranspose(Mat,MatReuse,Mat*);
458 PETSC_EXTERN PetscErrorCode MatHermitianTranspose(Mat,MatReuse,Mat*);
459 PETSC_EXTERN PetscErrorCode MatPermute(Mat,IS,IS,Mat*);
460 PETSC_EXTERN PetscErrorCode MatDiagonalScale(Mat,Vec,Vec);
461 PETSC_EXTERN PetscErrorCode MatDiagonalSet(Mat,Vec,InsertMode);
462 
463 PETSC_EXTERN PetscErrorCode MatEqual(Mat,Mat,PetscBool*);
464 PETSC_EXTERN PetscErrorCode MatMultEqual(Mat,Mat,PetscInt,PetscBool*);
465 PETSC_EXTERN PetscErrorCode MatMultAddEqual(Mat,Mat,PetscInt,PetscBool*);
466 PETSC_EXTERN PetscErrorCode MatMultTransposeEqual(Mat,Mat,PetscInt,PetscBool*);
467 PETSC_EXTERN PetscErrorCode MatMultTransposeAddEqual(Mat,Mat,PetscInt,PetscBool*);
468 PETSC_EXTERN PetscErrorCode MatMatMultEqual(Mat,Mat,Mat,PetscInt,PetscBool*);
469 PETSC_EXTERN PetscErrorCode MatTransposeMatMultEqual(Mat,Mat,Mat,PetscInt,PetscBool*);
470 
471 PETSC_EXTERN PetscErrorCode MatNorm(Mat,NormType,PetscReal*);
472 PETSC_EXTERN PetscErrorCode MatGetColumnNorms(Mat,NormType,PetscReal*);
473 PETSC_EXTERN PetscErrorCode MatZeroEntries(Mat);
474 PETSC_EXTERN PetscErrorCode MatZeroRows(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
475 PETSC_EXTERN PetscErrorCode MatZeroRowsIS(Mat,IS,PetscScalar,Vec,Vec);
476 PETSC_EXTERN PetscErrorCode MatZeroRowsStencil(Mat,PetscInt,const MatStencil [],PetscScalar,Vec,Vec);
477 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsStencil(Mat,PetscInt,const MatStencil[],PetscScalar,Vec,Vec);
478 PETSC_EXTERN PetscErrorCode MatZeroRowsColumns(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
479 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsIS(Mat,IS,PetscScalar,Vec,Vec);
480 
481 PETSC_EXTERN PetscErrorCode MatGetSize(Mat,PetscInt*,PetscInt*);
482 PETSC_EXTERN PetscErrorCode MatGetLocalSize(Mat,PetscInt*,PetscInt*);
483 PETSC_EXTERN PetscErrorCode MatGetOwnershipRange(Mat,PetscInt*,PetscInt*);
484 PETSC_EXTERN PetscErrorCode MatGetOwnershipRanges(Mat,const PetscInt**);
485 PETSC_EXTERN PetscErrorCode MatGetOwnershipRangeColumn(Mat,PetscInt*,PetscInt*);
486 PETSC_EXTERN PetscErrorCode MatGetOwnershipRangesColumn(Mat,const PetscInt**);
487 PETSC_EXTERN PetscErrorCode MatGetOwnershipIS(Mat,IS*,IS*);
488 
489 PETSC_EXTERN PetscErrorCode MatGetSubMatrices(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]);
490 PETSC_EXTERN PetscErrorCode MatGetSubMatricesMPI(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]);
491 PETSC_EXTERN PetscErrorCode MatDestroyMatrices(PetscInt,Mat *[]);
492 PETSC_EXTERN PetscErrorCode MatGetSubMatrix(Mat,IS,IS,MatReuse,Mat *);
493 PETSC_EXTERN PetscErrorCode MatGetLocalSubMatrix(Mat,IS,IS,Mat*);
494 PETSC_EXTERN PetscErrorCode MatRestoreLocalSubMatrix(Mat,IS,IS,Mat*);
495 PETSC_EXTERN PetscErrorCode MatGetSeqNonzeroStructure(Mat,Mat*);
496 PETSC_EXTERN PetscErrorCode MatDestroySeqNonzeroStructure(Mat*);
497 
498 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJ(MPI_Comm,Mat,PetscInt,PetscInt,MatReuse,Mat*);
499 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJSymbolic(MPI_Comm,Mat,PetscInt,PetscInt,Mat*);
500 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJNumeric(Mat,Mat);
501 PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMat(Mat,MatReuse,Mat*);
502 PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMatCondensed(Mat,MatReuse,IS*,IS*,Mat*);
503 PETSC_EXTERN PetscErrorCode MatGetBrowsOfAcols(Mat,Mat,MatReuse,IS*,IS*,Mat*);
504 PETSC_EXTERN PetscErrorCode MatGetGhosts(Mat, PetscInt *,const PetscInt *[]);
505 
506 PETSC_EXTERN PetscErrorCode MatIncreaseOverlap(Mat,PetscInt,IS[],PetscInt);
507 PETSC_EXTERN PetscErrorCode MatIncreaseOverlapSplit(Mat mat,PetscInt n,IS is[],PetscInt ov);
508 PETSC_EXTERN PetscErrorCode MatMPIAIJSetUseScalableIncreaseOverlap(Mat,PetscBool);
509 
510 PETSC_EXTERN PetscErrorCode MatMatMult(Mat,Mat,MatReuse,PetscReal,Mat*);
511 PETSC_EXTERN PetscErrorCode MatMatMultSymbolic(Mat,Mat,PetscReal,Mat*);
512 PETSC_EXTERN PetscErrorCode MatMatMultNumeric(Mat,Mat,Mat);
513 
514 PETSC_EXTERN PetscErrorCode MatMatMatMult(Mat,Mat,Mat,MatReuse,PetscReal,Mat*);
515 
516 PETSC_EXTERN PetscErrorCode MatPtAP(Mat,Mat,MatReuse,PetscReal,Mat*);
517 PETSC_EXTERN PetscErrorCode MatPtAPSymbolic(Mat,Mat,PetscReal,Mat*);
518 PETSC_EXTERN PetscErrorCode MatPtAPNumeric(Mat,Mat,Mat);
519 PETSC_EXTERN PetscErrorCode MatRARt(Mat,Mat,MatReuse,PetscReal,Mat*);
520 PETSC_EXTERN PetscErrorCode MatRARtSymbolic(Mat,Mat,PetscReal,Mat*);
521 PETSC_EXTERN PetscErrorCode MatRARtNumeric(Mat,Mat,Mat);
522 
523 PETSC_EXTERN PetscErrorCode MatTransposeMatMult(Mat,Mat,MatReuse,PetscReal,Mat*);
524 PETSC_EXTERN PetscErrorCode MatTransposetMatMultSymbolic(Mat,Mat,PetscReal,Mat*);
525 PETSC_EXTERN PetscErrorCode MatTransposetMatMultNumeric(Mat,Mat,Mat);
526 PETSC_EXTERN PetscErrorCode MatMatTransposeMult(Mat,Mat,MatReuse,PetscReal,Mat*);
527 PETSC_EXTERN PetscErrorCode MatMatTransposeMultSymbolic(Mat,Mat,PetscReal,Mat*);
528 PETSC_EXTERN PetscErrorCode MatMatTransposeMultNumeric(Mat,Mat,Mat);
529 
530 PETSC_EXTERN PetscErrorCode MatAXPY(Mat,PetscScalar,Mat,MatStructure);
531 PETSC_EXTERN PetscErrorCode MatAYPX(Mat,PetscScalar,Mat,MatStructure);
532 
533 PETSC_EXTERN PetscErrorCode MatScale(Mat,PetscScalar);
534 PETSC_EXTERN PetscErrorCode MatShift(Mat,PetscScalar);
535 
536 PETSC_EXTERN PetscErrorCode MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping,ISLocalToGlobalMapping);
537 PETSC_EXTERN PetscErrorCode MatGetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping*,ISLocalToGlobalMapping*);
538 PETSC_EXTERN PetscErrorCode MatGetLayouts(Mat,PetscLayout*,PetscLayout*);
539 PETSC_EXTERN PetscErrorCode MatZeroRowsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
540 PETSC_EXTERN PetscErrorCode MatZeroRowsLocalIS(Mat,IS,PetscScalar,Vec,Vec);
541 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
542 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocalIS(Mat,IS,PetscScalar,Vec,Vec);
543 PETSC_EXTERN PetscErrorCode MatSetValuesLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
544 PETSC_EXTERN PetscErrorCode MatSetValuesBlockedLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
545 
546 PETSC_EXTERN PetscErrorCode MatStashSetInitialSize(Mat,PetscInt,PetscInt);
547 PETSC_EXTERN PetscErrorCode MatStashGetInfo(Mat,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
548 
549 PETSC_EXTERN PetscErrorCode MatInterpolate(Mat,Vec,Vec);
550 PETSC_EXTERN PetscErrorCode MatInterpolateAdd(Mat,Vec,Vec,Vec);
551 PETSC_EXTERN PetscErrorCode MatRestrict(Mat,Vec,Vec);
552 PETSC_EXTERN PetscErrorCode MatCreateVecs(Mat,Vec*,Vec*);
553 PETSC_DEPRECATED("Use MatCreateVecs()") PETSC_STATIC_INLINE PetscErrorCode MatGetVecs(Mat mat,Vec *x,Vec *y) {return MatCreateVecs(mat,x,y);}
554 PETSC_EXTERN PetscErrorCode MatCreateRedundantMatrix(Mat,PetscInt,MPI_Comm,MatReuse,Mat*);
555 PETSC_EXTERN PetscErrorCode MatGetMultiProcBlock(Mat,MPI_Comm,MatReuse,Mat*);
556 PETSC_EXTERN PetscErrorCode MatFindZeroDiagonals(Mat,IS*);
557 PETSC_EXTERN PetscErrorCode MatFindOffBlockDiagonalEntries(Mat,IS*);
558 PETSC_EXTERN PetscErrorCode MatCreateMPIMatConcatenateSeqMat(MPI_Comm,Mat,PetscInt,MatReuse,Mat*);
559 
560 /*MC
561    MatSetValue - Set a single entry into a matrix.
562 
563    Not collective
564 
565    Synopsis:
566      #include <petscmat.h>
567      PetscErrorCode MatSetValue(Mat m,PetscInt row,PetscInt col,PetscScalar value,InsertMode mode)
568 
569    Input Parameters:
570 +  m - the matrix
571 .  row - the row location of the entry
572 .  col - the column location of the entry
573 .  value - the value to insert
574 -  mode - either INSERT_VALUES or ADD_VALUES
575 
576    Notes:
577    For efficiency one should use MatSetValues() and set several or many
578    values simultaneously if possible.
579 
580    Level: beginner
581 
582 .seealso: MatSetValues(), MatSetValueLocal()
583 M*/
584 PETSC_STATIC_INLINE PetscErrorCode MatSetValue(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValues(v,1,&i,1,&j,&va,mode);}
585 
586 PETSC_STATIC_INLINE PetscErrorCode MatGetValue(Mat v,PetscInt i,PetscInt j,PetscScalar *va) {return MatGetValues(v,1,&i,1,&j,va);}
587 
588 PETSC_STATIC_INLINE PetscErrorCode MatSetValueLocal(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValuesLocal(v,1,&i,1,&j,&va,mode);}
589 
590 /*MC
591    MatPreallocateInitialize - Begins the block of code that will count the number of nonzeros per
592        row in a matrix providing the data that one can use to correctly preallocate the matrix.
593 
594    Synopsis:
595    #include <petscmat.h>
596    PetscErrorCode MatPreallocateInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
597 
598    Collective on MPI_Comm
599 
600    Input Parameters:
601 +  comm - the communicator that will share the eventually allocated matrix
602 .  nrows - the number of LOCAL rows in the matrix
603 -  ncols - the number of LOCAL columns in the matrix
604 
605    Output Parameters:
606 +  dnz - the array that will be passed to the matrix preallocation routines
607 -  ozn - the other array passed to the matrix preallocation routines
608 
609    Level: intermediate
610 
611    Notes:
612     See Users-Manual: ch_performance for more details.
613 
614    Do not malloc or free dnz and onz, that is handled internally by these routines
615 
616    Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices)
617 
618    This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize().
619 
620   Concepts: preallocation^Matrix
621 
622 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateSetLocal(),
623           MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocalBlock()
624 M*/
625 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
626 { \
627   PetscErrorCode _4_ierr; PetscInt __nrows = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
628   _4_ierr = PetscCalloc2(__nrows,&dnz,__nrows,&onz);CHKERRQ(_4_ierr); \
629   __start = 0; __end = __start;                                         \
630   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
631   _4_ierr = MPI_Scan(&__nrows,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __nrows;
632 
633 /*MC
634    MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
635        inserted using a local number of the rows and columns
636 
637    Synopsis:
638    #include <petscmat.h>
639    PetscErrorCode MatPreallocateSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
640 
641    Not Collective
642 
643    Input Parameters:
644 +  map - the row mapping from local numbering to global numbering
645 .  nrows - the number of rows indicated
646 .  rows - the indices of the rows
647 .  cmap - the column mapping from local to global numbering
648 .  ncols - the number of columns in the matrix
649 .  cols - the columns indicated
650 .  dnz - the array that will be passed to the matrix preallocation routines
651 -  ozn - the other array passed to the matrix preallocation routines
652 
653    Level: intermediate
654 
655    Notes:
656     See Users-Manual: ch_performance for more details.
657 
658    Do not malloc or free dnz and onz, that is handled internally by these routines
659 
660   Concepts: preallocation^Matrix
661 
662 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateInitialize(),
663           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocalBlock()
664 M*/
665 #define MatPreallocateSetLocal(rmap,nrows,rows,cmap,ncols,cols,dnz,onz) 0; \
666 {\
667   PetscInt __l;\
668   _4_ierr = ISLocalToGlobalMappingApply(rmap,nrows,rows,rows);CHKERRQ(_4_ierr);\
669   _4_ierr = ISLocalToGlobalMappingApply(cmap,ncols,cols,cols);CHKERRQ(_4_ierr);\
670   for (__l=0;__l<nrows;__l++) {\
671     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
672   }\
673 }
674 
675 /*MC
676    MatPreallocateSetLocalBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be
677        inserted using a local number of the rows and columns
678 
679    Synopsis:
680    #include <petscmat.h>
681    PetscErrorCode MatPreallocateSetLocalBlock(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
682 
683    Not Collective
684 
685    Input Parameters:
686 +  map - the row mapping from local numbering to global numbering
687 .  nrows - the number of rows indicated
688 .  rows - the indices of the rows
689 .  cmap - the column mapping from local to global numbering
690 .  ncols - the number of columns in the matrix
691 .  cols - the columns indicated
692 .  dnz - the array that will be passed to the matrix preallocation routines
693 -  ozn - the other array passed to the matrix preallocation routines
694 
695    Level: intermediate
696 
697    Notes:
698     See Users-Manual: ch_performance for more details.
699 
700    Do not malloc or free dnz and onz, that is handled internally by these routines
701 
702   Concepts: preallocation^Matrix
703 
704 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateInitialize(),
705           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocalBlock()
706 M*/
707 #define MatPreallocateSetLocalBlock(rmap,nrows,rows,cmap,ncols,cols,dnz,onz) 0; \
708 {\
709   PetscInt __l;\
710   _4_ierr = ISLocalToGlobalMappingApplyBlock(rmap,nrows,rows,rows);CHKERRQ(_4_ierr);\
711   _4_ierr = ISLocalToGlobalMappingApplyBlock(cmap,ncols,cols,cols);CHKERRQ(_4_ierr);\
712   for (__l=0;__l<nrows;__l++) {\
713     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
714   }\
715 }
716 
717 /*MC
718    MatPreallocateSymmetricSetLocalBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be
719        inserted using a local number of the rows and columns
720 
721    Synopsis:
722    #include <petscmat.h>
723    PetscErrorCode MatPreallocateSymmetricSetLocalBlock(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
724 
725    Not Collective
726 
727    Input Parameters:
728 +  map - the mapping between local numbering and global numbering
729 .  nrows - the number of rows indicated
730 .  rows - the indices of the rows
731 .  ncols - the number of columns in the matrix
732 .  cols - the columns indicated
733 .  dnz - the array that will be passed to the matrix preallocation routines
734 -  ozn - the other array passed to the matrix preallocation routines
735 
736    Level: intermediate
737 
738    Notes:
739     See Users-Manual: ch_performance for more details.
740 
741    Do not malloc or free dnz and onz that is handled internally by these routines
742 
743   Concepts: preallocation^Matrix
744 
745 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateInitialize(),
746           MatPreallocateInitialize(),  MatPreallocateSetLocal()
747 M*/
748 #define MatPreallocateSymmetricSetLocalBlock(map,nrows,rows,ncols,cols,dnz,onz) 0;\
749 {\
750   PetscInt __l;\
751   _4_ierr = ISLocalToGlobalMappingApplyBlock(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
752   _4_ierr = ISLocalToGlobalMappingApplyBlock(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
753   for (__l=0;__l<nrows;__l++) {\
754     _4_ierr = MatPreallocateSymmetricSetBlock((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
755   }\
756 }
757 /*MC
758    MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
759        inserted using a local number of the rows and columns
760 
761    Synopsis:
762    #include <petscmat.h>
763    PetscErrorCode MatPreallocateSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
764 
765    Not Collective
766 
767    Input Parameters:
768 +  row - the row
769 .  ncols - the number of columns in the matrix
770 -  cols - the columns indicated
771 
772    Output Parameters:
773 +  dnz - the array that will be passed to the matrix preallocation routines
774 -  ozn - the other array passed to the matrix preallocation routines
775 
776    Level: intermediate
777 
778    Notes:
779     See Users-Manual: ch_performance for more details.
780 
781    Do not malloc or free dnz and onz that is handled internally by these routines
782 
783    This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize().
784 
785   Concepts: preallocation^Matrix
786 
787 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateInitialize(),
788           MatPreallocateInitialize(), MatPreallocateSetLocal()
789 M*/
790 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
791 { PetscInt __i; \
792   if (row < __rstart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D less than first local row %D",row,__rstart);\
793   if (row >= __rstart+__nrows) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D greater than last local row %D",row,__rstart+__nrows-1);\
794   for (__i=0; __i<nc; __i++) {\
795     if ((cols)[__i] < __start || (cols)[__i] >= __end) onz[row - __rstart]++; \
796     else dnz[row - __rstart]++;\
797   }\
798 }
799 
800 /*MC
801    MatPreallocateSymmetricSetBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be
802        inserted using a local number of the rows and columns
803 
804    Synopsis:
805    #include <petscmat.h>
806    PetscErrorCode MatPreallocateSymmetricSetBlock(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
807 
808    Not Collective
809 
810    Input Parameters:
811 +  nrows - the number of rows indicated
812 .  rows - the indices of the rows
813 .  ncols - the number of columns in the matrix
814 .  cols - the columns indicated
815 .  dnz - the array that will be passed to the matrix preallocation routines
816 -  ozn - the other array passed to the matrix preallocation routines
817 
818    Level: intermediate
819 
820    Notes:
821     See Users-Manual: ch_performance for more details.
822 
823    Do not malloc or free dnz and onz that is handled internally by these routines
824 
825    This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize().
826 
827   Concepts: preallocation^Matrix
828 
829 .seealso: MatPreallocateFinalize(), MatPreallocateSet(),  MatPreallocateInitialize(),
830           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocalBlock(), MatPreallocateSetLocal()
831 M*/
832 #define MatPreallocateSymmetricSetBlock(row,nc,cols,dnz,onz) 0;\
833 { PetscInt __i; \
834   for (__i=0; __i<nc; __i++) {\
835     if (cols[__i] >= __end) onz[row - __rstart]++; \
836     else if (cols[__i] >= row) dnz[row - __rstart]++;\
837   }\
838 }
839 
840 /*MC
841    MatPreallocateLocation -  An alternative to MatPreallocationSet() that puts the nonzero locations into the matrix if it exists
842 
843    Synopsis:
844    #include <petscmat.h>
845    PetscErrorCode MatPreallocateLocations(Mat A,PetscInt row,PetscInt ncols,PetscInt *cols,PetscInt *dnz,PetscInt *onz)
846 
847    Not Collective
848 
849    Input Parameters:
850 .  A - matrix
851 .  row - row where values exist (must be local to this process)
852 .  ncols - number of columns
853 .  cols - columns with nonzeros
854 .  dnz - the array that will be passed to the matrix preallocation routines
855 -  ozn - the other array passed to the matrix preallocation routines
856 
857    Level: intermediate
858 
859    Notes:
860     See Users-Manual: ch_performance for more details.
861 
862    Do not malloc or free dnz and onz that is handled internally by these routines
863 
864    This is a MACRO not a function because it uses a bunch of variables private to the MatPreallocation.... routines.
865 
866   Concepts: preallocation^Matrix
867 
868 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateSetLocal(),
869           MatPreallocateSymmetricSetLocalBlock()
870 M*/
871 #define MatPreallocateLocation(A,row,ncols,cols,dnz,onz) 0;if (A) {ierr = MatSetValues(A,1,&row,ncols,cols,NULL,INSERT_VALUES);CHKERRQ(ierr);} else {ierr =  MatPreallocateSet(row,ncols,cols,dnz,onz);CHKERRQ(ierr);}
872 
873 
874 /*MC
875    MatPreallocateFinalize - Ends the block of code that will count the number of nonzeros per
876        row in a matrix providing the data that one can use to correctly preallocate the matrix.
877 
878    Synopsis:
879    #include <petscmat.h>
880    PetscErrorCode MatPreallocateFinalize(PetscInt *dnz, PetscInt *onz)
881 
882    Collective on MPI_Comm
883 
884    Input Parameters:
885 +  dnz - the array that was be passed to the matrix preallocation routines
886 -  ozn - the other array passed to the matrix preallocation routines
887 
888    Level: intermediate
889 
890    Notes:
891     See Users-Manual: ch_performance for more details.
892 
893    Do not malloc or free dnz and onz that is handled internally by these routines
894 
895    This is a MACRO not a function because it closes the { started in MatPreallocateInitialize().
896 
897   Concepts: preallocation^Matrix
898 
899 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateSetLocal(),
900           MatPreallocateSymmetricSetLocalBlock()
901 M*/
902 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree2(dnz,onz);CHKERRQ(_4_ierr);}
903 
904 /* Routines unique to particular data structures */
905 PETSC_EXTERN PetscErrorCode MatShellGetContext(Mat,void *);
906 
907 PETSC_EXTERN PetscErrorCode MatInodeAdjustForInodes(Mat,IS*,IS*);
908 PETSC_EXTERN PetscErrorCode MatInodeGetInodeSizes(Mat,PetscInt *,PetscInt *[],PetscInt *);
909 
910 PETSC_EXTERN PetscErrorCode MatSeqAIJSetColumnIndices(Mat,PetscInt[]);
911 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetColumnIndices(Mat,PetscInt[]);
912 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
913 PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
914 PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
915 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJFromTriple(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*,PetscInt,PetscBool);
916 
917 #define MAT_SKIP_ALLOCATION -4
918 
919 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
920 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
921 PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocation(Mat,PetscInt,const PetscInt[]);
922 
923 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
924 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
925 PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
926 PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocationCSR(Mat,const PetscInt [],const PetscInt [],const PetscScalar []);
927 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
928 PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocationCSR(Mat,const PetscInt[],const PetscInt[],const PetscScalar[]);
929 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
930 PETSC_EXTERN PetscErrorCode MatMPIAdjSetPreallocation(Mat,PetscInt[],PetscInt[],PetscInt[]);
931 PETSC_EXTERN PetscErrorCode MatMPIDenseSetPreallocation(Mat,PetscScalar[]);
932 PETSC_EXTERN PetscErrorCode MatSeqDenseSetPreallocation(Mat,PetscScalar[]);
933 PETSC_EXTERN PetscErrorCode MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,const PetscInt*[]);
934 PETSC_EXTERN PetscErrorCode MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,const PetscInt*[]);
935 PETSC_EXTERN PetscErrorCode MatMPIAdjCreateNonemptySubcommMat(Mat,Mat*);
936 
937 PETSC_EXTERN PetscErrorCode MatISSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
938 PETSC_EXTERN PetscErrorCode MatSeqDenseSetLDA(Mat,PetscInt);
939 PETSC_EXTERN PetscErrorCode MatDenseGetLocalMatrix(Mat,Mat*);
940 
941 PETSC_EXTERN PetscErrorCode MatStoreValues(Mat);
942 PETSC_EXTERN PetscErrorCode MatRetrieveValues(Mat);
943 
944 PETSC_EXTERN PetscErrorCode MatDAADSetCtx(Mat,void*);
945 
946 PETSC_EXTERN PetscErrorCode MatFindNonzeroRows(Mat,IS*);
947 /*
948   These routines are not usually accessed directly, rather solving is
949   done through the KSP and PC interfaces.
950 */
951 
952 /*J
953     MatOrderingType - String with the name of a PETSc matrix ordering
954 
955    Level: beginner
956 
957 .seealso: MatGetOrdering()
958 J*/
959 typedef const char* MatOrderingType;
960 #define MATORDERINGNATURAL     "natural"
961 #define MATORDERINGND          "nd"
962 #define MATORDERING1WD         "1wd"
963 #define MATORDERINGRCM         "rcm"
964 #define MATORDERINGQMD         "qmd"
965 #define MATORDERINGROWLENGTH   "rowlength"
966 #define MATORDERINGWBM         "wbm"
967 #define MATORDERINGSPECTRAL    "spectral"
968 #define MATORDERINGAMD         "amd"            /* only works if UMFPACK is installed with PETSc */
969 
970 PETSC_EXTERN PetscErrorCode MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
971 PETSC_EXTERN PetscErrorCode MatGetOrderingList(PetscFunctionList*);
972 PETSC_EXTERN PetscErrorCode MatOrderingRegister(const char[],PetscErrorCode(*)(Mat,MatOrderingType,IS*,IS*));
973 PETSC_EXTERN PetscFunctionList MatOrderingList;
974 
975 PETSC_EXTERN PetscErrorCode MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
976 PETSC_EXTERN PetscErrorCode MatCreateLaplacian(Mat,PetscReal,PetscBool,Mat*);
977 
978 /*S
979     MatFactorShiftType - Numeric Shift.
980 
981    Level: beginner
982 
983 S*/
984 typedef enum {MAT_SHIFT_NONE,MAT_SHIFT_NONZERO,MAT_SHIFT_POSITIVE_DEFINITE,MAT_SHIFT_INBLOCKS} MatFactorShiftType;
985 PETSC_EXTERN const char *const MatFactorShiftTypes[];
986 PETSC_EXTERN const char *const MatFactorShiftTypesDetail[];
987 
988 /*S
989     MatFactorError - indicates what type of error in matrix factor
990 
991     Level: beginner
992 
993     Developer Notes: Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
994 
995 .seealso: MatGetFactor()
996 S*/
997 typedef enum {MAT_FACTOR_NOERROR,MAT_FACTOR_STRUCT_ZEROPIVOT,MAT_FACTOR_NUMERIC_ZEROPIVOT,MAT_FACTOR_OUTMEMORY,MAT_FACTOR_OTHER} MatFactorError;
998 
999 PETSC_EXTERN PetscErrorCode MatFactorGetError(Mat,MatFactorError*);
1000 PETSC_EXTERN PetscErrorCode MatFactorClearError(Mat);
1001 PETSC_EXTERN PetscErrorCode MatFactorGetErrorZeroPivot(Mat,PetscReal*,PetscInt*);
1002 
1003 /*S
1004    MatFactorInfo - Data passed into the matrix factorization routines, and information about the resulting factorization
1005 
1006    In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE, that is use
1007 $     MatFactorInfo  info(MAT_FACTORINFO_SIZE)
1008 
1009    Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC.
1010 
1011       You can use MatFactorInfoInitialize() to set default values.
1012 
1013    Level: developer
1014 
1015 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor(),
1016           MatFactorInfoInitialize()
1017 
1018 S*/
1019 typedef struct {
1020   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
1021   PetscReal     usedt;
1022   PetscReal     dt;             /* drop tolerance */
1023   PetscReal     dtcol;          /* tolerance for pivoting */
1024   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
1025   PetscReal     fill;           /* expected fill, nonzeros in factored matrix/nonzeros in original matrix */
1026   PetscReal     levels;         /* ICC/ILU(levels) */
1027   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
1028                                    factorization may be faster if do not pivot */
1029   PetscReal     zeropivot;      /* pivot is called zero if less than this */
1030   PetscReal     shifttype;      /* type of shift added to matrix factor to prevent zero pivots */
1031   PetscReal     shiftamount;     /* how large the shift is */
1032 } MatFactorInfo;
1033 
1034 PETSC_EXTERN PetscErrorCode MatFactorInfoInitialize(MatFactorInfo*);
1035 PETSC_EXTERN PetscErrorCode MatCholeskyFactor(Mat,IS,const MatFactorInfo*);
1036 PETSC_EXTERN PetscErrorCode MatCholeskyFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*);
1037 PETSC_EXTERN PetscErrorCode MatCholeskyFactorNumeric(Mat,Mat,const MatFactorInfo*);
1038 PETSC_EXTERN PetscErrorCode MatLUFactor(Mat,IS,IS,const MatFactorInfo*);
1039 PETSC_EXTERN PetscErrorCode MatILUFactor(Mat,IS,IS,const MatFactorInfo*);
1040 PETSC_EXTERN PetscErrorCode MatLUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*);
1041 PETSC_EXTERN PetscErrorCode MatILUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*);
1042 PETSC_EXTERN PetscErrorCode MatICCFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*);
1043 PETSC_EXTERN PetscErrorCode MatICCFactor(Mat,IS,const MatFactorInfo*);
1044 PETSC_EXTERN PetscErrorCode MatLUFactorNumeric(Mat,Mat,const MatFactorInfo*);
1045 PETSC_EXTERN PetscErrorCode MatGetInertia(Mat,PetscInt*,PetscInt*,PetscInt*);
1046 PETSC_EXTERN PetscErrorCode MatSolve(Mat,Vec,Vec);
1047 PETSC_EXTERN PetscErrorCode MatForwardSolve(Mat,Vec,Vec);
1048 PETSC_EXTERN PetscErrorCode MatBackwardSolve(Mat,Vec,Vec);
1049 PETSC_EXTERN PetscErrorCode MatSolveAdd(Mat,Vec,Vec,Vec);
1050 PETSC_EXTERN PetscErrorCode MatSolveTranspose(Mat,Vec,Vec);
1051 PETSC_EXTERN PetscErrorCode MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
1052 PETSC_EXTERN PetscErrorCode MatSolves(Mat,Vecs,Vecs);
1053 PETSC_EXTERN PetscErrorCode MatFactorSetSchurIS(Mat,IS);
1054 PETSC_EXTERN PetscErrorCode MatFactorGetSchurComplement(Mat,Mat*);
1055 PETSC_EXTERN PetscErrorCode MatFactorRestoreSchurComplement(Mat,Mat*);
1056 PETSC_EXTERN PetscErrorCode MatFactorInvertSchurComplement(Mat);
1057 PETSC_EXTERN PetscErrorCode MatFactorCreateSchurComplement(Mat,Mat*);
1058 PETSC_EXTERN PetscErrorCode MatFactorSolveSchurComplement(Mat,Vec,Vec);
1059 PETSC_EXTERN PetscErrorCode MatFactorSolveSchurComplementTranspose(Mat,Vec,Vec);
1060 PETSC_EXTERN PetscErrorCode MatSetUnfactored(Mat);
1061 
1062 /*E
1063     MatSORType - What type of (S)SOR to perform
1064 
1065     Level: beginner
1066 
1067    May be bitwise ORd together
1068 
1069    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
1070 
1071    MatSORType may be bitwise ORd together, so do not change the numbers
1072 
1073 .seealso: MatSOR()
1074 E*/
1075 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
1076               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
1077               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
1078               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
1079 PETSC_EXTERN PetscErrorCode MatSOR(Mat,Vec,PetscReal,MatSORType,PetscReal,PetscInt,PetscInt,Vec);
1080 
1081 /*
1082     These routines are for efficiently computing Jacobians via finite differences.
1083 */
1084 
1085 /*S
1086      MatColoring - Object for managing the coloring of matrices.
1087 
1088    Level: beginner
1089 
1090   Concepts: matrix, coloring
1091 
1092 .seealso:  MatFDColoringCreate() ISColoring MatFDColoring
1093 S*/
1094 typedef struct _p_MatColoring* MatColoring;
1095 /*J
1096     MatColoringType - String with the name of a PETSc matrix coloring
1097 
1098    Level: beginner
1099 
1100 .seealso: MatColoringSetType(), MatColoring
1101 J*/
1102 
1103 typedef const  char*           MatColoringType;
1104 #define MATCOLORINGJP      "jp"
1105 #define MATCOLORINGPOWER   "power"
1106 #define MATCOLORINGNATURAL "natural"
1107 #define MATCOLORINGSL      "sl"
1108 #define MATCOLORINGLF      "lf"
1109 #define MATCOLORINGID      "id"
1110 #define MATCOLORINGGREEDY  "greedy"
1111 
1112 /*E
1113    MatColoringWeightType - Type of weight scheme
1114 
1115     Not Collective
1116 
1117 +   MAT_COLORING_RANDOM  - Random weights
1118 .   MAT_COLORING_LEXICAL - Lexical weighting based upon global numbering.
1119 -   MAT_COLORING_LF      - Last-first weighting.
1120 
1121     Level: intermediate
1122 
1123    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
1124 
1125 .seealso: MatCUSPSetFormat(), MatCUSPFormatOperation
1126 E*/
1127 typedef enum {MAT_COLORING_WEIGHT_RANDOM,MAT_COLORING_WEIGHT_LEXICAL,MAT_COLORING_WEIGHT_LF,MAT_COLORING_WEIGHT_SL} MatColoringWeightType;
1128 
1129 PETSC_EXTERN PetscErrorCode MatColoringCreate(Mat,MatColoring*);
1130 PETSC_EXTERN PetscErrorCode MatColoringGetDegrees(Mat,PetscInt,PetscInt*);
1131 PETSC_EXTERN PetscErrorCode MatColoringDestroy(MatColoring*);
1132 PETSC_EXTERN PetscErrorCode MatColoringView(MatColoring,PetscViewer);
1133 PETSC_EXTERN PetscErrorCode MatColoringSetType(MatColoring,MatColoringType);
1134 PETSC_EXTERN PetscErrorCode MatColoringSetFromOptions(MatColoring);
1135 PETSC_EXTERN PetscErrorCode MatColoringSetDistance(MatColoring,PetscInt);
1136 PETSC_EXTERN PetscErrorCode MatColoringGetDistance(MatColoring,PetscInt*);
1137 PETSC_EXTERN PetscErrorCode MatColoringSetMaxColors(MatColoring,PetscInt);
1138 PETSC_EXTERN PetscErrorCode MatColoringGetMaxColors(MatColoring,PetscInt*);
1139 PETSC_EXTERN PetscErrorCode MatColoringApply(MatColoring,ISColoring*);
1140 PETSC_EXTERN PetscErrorCode MatColoringRegister(const char[],PetscErrorCode(*)(MatColoring));
1141 PETSC_EXTERN PetscErrorCode MatColoringPatch(Mat,PetscInt,PetscInt,ISColoringValue[],ISColoring*);
1142 PETSC_EXTERN PetscErrorCode MatColoringSetWeightType(MatColoring,MatColoringWeightType);
1143 PETSC_EXTERN PetscErrorCode MatColoringSetWeights(MatColoring,PetscReal*,PetscInt*);
1144 PETSC_EXTERN PetscErrorCode MatColoringCreateWeights(MatColoring,PetscReal **,PetscInt **lperm);
1145 PETSC_EXTERN PetscErrorCode MatColoringTestValid(MatColoring,ISColoring);
1146 
1147 /*S
1148      MatFDColoring - Object for computing a sparse Jacobian via finite differences
1149         and coloring
1150 
1151    Level: beginner
1152 
1153   Concepts: coloring, sparse Jacobian, finite differences
1154 
1155 .seealso:  MatFDColoringCreate()
1156 S*/
1157 typedef struct _p_MatFDColoring* MatFDColoring;
1158 
1159 PETSC_EXTERN PetscErrorCode MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
1160 PETSC_EXTERN PetscErrorCode MatFDColoringDestroy(MatFDColoring*);
1161 PETSC_EXTERN PetscErrorCode MatFDColoringView(MatFDColoring,PetscViewer);
1162 PETSC_EXTERN PetscErrorCode MatFDColoringSetFunction(MatFDColoring,PetscErrorCode (*)(void),void*);
1163 PETSC_EXTERN PetscErrorCode MatFDColoringGetFunction(MatFDColoring,PetscErrorCode (**)(void),void**);
1164 PETSC_EXTERN PetscErrorCode MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
1165 PETSC_EXTERN PetscErrorCode MatFDColoringSetFromOptions(MatFDColoring);
1166 PETSC_EXTERN PetscErrorCode MatFDColoringApply(Mat,MatFDColoring,Vec,void *);
1167 PETSC_EXTERN PetscErrorCode MatFDColoringSetF(MatFDColoring,Vec);
1168 PETSC_EXTERN PetscErrorCode MatFDColoringGetPerturbedColumns(MatFDColoring,PetscInt*,PetscInt*[]);
1169 PETSC_EXTERN PetscErrorCode MatFDColoringSetUp(Mat,ISColoring,MatFDColoring);
1170 PETSC_EXTERN PetscErrorCode MatFDColoringSetBlockSize(MatFDColoring,PetscInt,PetscInt);
1171 
1172 
1173 /*S
1174      MatTransposeColoring - Object for computing a sparse matrix product C=A*B^T via coloring
1175 
1176    Level: beginner
1177 
1178   Concepts: coloring, sparse matrix product
1179 
1180 .seealso:  MatTransposeColoringCreate()
1181 S*/
1182 typedef struct _p_MatTransposeColoring* MatTransposeColoring;
1183 
1184 PETSC_EXTERN PetscErrorCode MatTransposeColoringCreate(Mat,ISColoring,MatTransposeColoring *);
1185 PETSC_EXTERN PetscErrorCode MatTransColoringApplySpToDen(MatTransposeColoring,Mat,Mat);
1186 PETSC_EXTERN PetscErrorCode MatTransColoringApplyDenToSp(MatTransposeColoring,Mat,Mat);
1187 PETSC_EXTERN PetscErrorCode MatTransposeColoringDestroy(MatTransposeColoring*);
1188 
1189 /*
1190     These routines are for partitioning matrices: currently used only
1191   for adjacency matrix, MatCreateMPIAdj().
1192 */
1193 
1194 /*S
1195      MatPartitioning - Object for managing the partitioning of a matrix or graph
1196 
1197    Level: beginner
1198 
1199   Concepts: partitioning
1200 
1201 .seealso:  MatPartitioningCreate(), MatPartitioningType
1202 S*/
1203 typedef struct _p_MatPartitioning* MatPartitioning;
1204 
1205 /*J
1206     MatPartitioningType - String with the name of a PETSc matrix partitioning
1207 
1208    Level: beginner
1209 dm
1210 .seealso: MatPartitioningCreate(), MatPartitioning
1211 J*/
1212 typedef const char* MatPartitioningType;
1213 #define MATPARTITIONINGCURRENT  "current"
1214 #define MATPARTITIONINGAVERAGE   "average"
1215 #define MATPARTITIONINGSQUARE   "square"
1216 #define MATPARTITIONINGPARMETIS "parmetis"
1217 #define MATPARTITIONINGCHACO    "chaco"
1218 #define MATPARTITIONINGPARTY    "party"
1219 #define MATPARTITIONINGPTSCOTCH "ptscotch"
1220 #define MATPARTITIONINGHIERARCH  "hierarch"
1221 
1222 
1223 PETSC_EXTERN PetscErrorCode MatPartitioningCreate(MPI_Comm,MatPartitioning*);
1224 PETSC_EXTERN PetscErrorCode MatPartitioningSetType(MatPartitioning,MatPartitioningType);
1225 PETSC_EXTERN PetscErrorCode MatPartitioningSetNParts(MatPartitioning,PetscInt);
1226 PETSC_EXTERN PetscErrorCode MatPartitioningSetAdjacency(MatPartitioning,Mat);
1227 PETSC_EXTERN PetscErrorCode MatPartitioningSetVertexWeights(MatPartitioning,const PetscInt[]);
1228 PETSC_EXTERN PetscErrorCode MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []);
1229 PETSC_EXTERN PetscErrorCode MatPartitioningApply(MatPartitioning,IS*);
1230 PETSC_EXTERN PetscErrorCode MatPartitioningDestroy(MatPartitioning*);
1231 
1232 PETSC_EXTERN PetscErrorCode MatPartitioningRegister(const char[],PetscErrorCode (*)(MatPartitioning));
1233 
1234 
1235 
1236 PETSC_EXTERN PetscErrorCode MatPartitioningView(MatPartitioning,PetscViewer);
1237 PETSC_EXTERN PetscErrorCode MatPartitioningSetFromOptions(MatPartitioning);
1238 PETSC_EXTERN PetscErrorCode MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
1239 
1240 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisSetRepartition(MatPartitioning part);
1241 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
1242 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisGetEdgeCut(MatPartitioning, PetscInt *);
1243 
1244 typedef enum { MP_CHACO_MULTILEVEL=1,MP_CHACO_SPECTRAL=2,MP_CHACO_LINEAR=4,MP_CHACO_RANDOM=5,MP_CHACO_SCATTERED=6 } MPChacoGlobalType;
1245 PETSC_EXTERN const char *const MPChacoGlobalTypes[];
1246 typedef enum { MP_CHACO_KERNIGHAN=1,MP_CHACO_NONE=2 } MPChacoLocalType;
1247 PETSC_EXTERN const char *const MPChacoLocalTypes[];
1248 typedef enum { MP_CHACO_LANCZOS=0,MP_CHACO_RQI=1 } MPChacoEigenType;
1249 PETSC_EXTERN const char *const MPChacoEigenTypes[];
1250 
1251 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetGlobal(MatPartitioning,MPChacoGlobalType);
1252 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetGlobal(MatPartitioning,MPChacoGlobalType*);
1253 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetLocal(MatPartitioning,MPChacoLocalType);
1254 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetLocal(MatPartitioning,MPChacoLocalType*);
1255 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetCoarseLevel(MatPartitioning,PetscReal);
1256 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenSolver(MatPartitioning,MPChacoEigenType);
1257 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenSolver(MatPartitioning,MPChacoEigenType*);
1258 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenTol(MatPartitioning,PetscReal);
1259 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenTol(MatPartitioning,PetscReal*);
1260 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenNumber(MatPartitioning,PetscInt);
1261 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenNumber(MatPartitioning,PetscInt*);
1262 
1263 #define MP_PARTY_OPT "opt"
1264 #define MP_PARTY_LIN "lin"
1265 #define MP_PARTY_SCA "sca"
1266 #define MP_PARTY_RAN "ran"
1267 #define MP_PARTY_GBF "gbf"
1268 #define MP_PARTY_GCF "gcf"
1269 #define MP_PARTY_BUB "bub"
1270 #define MP_PARTY_DEF "def"
1271 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetGlobal(MatPartitioning,const char*);
1272 #define MP_PARTY_HELPFUL_SETS "hs"
1273 #define MP_PARTY_KERNIGHAN_LIN "kl"
1274 #define MP_PARTY_NONE "no"
1275 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetLocal(MatPartitioning,const char*);
1276 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetCoarseLevel(MatPartitioning,PetscReal);
1277 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetBipart(MatPartitioning,PetscBool);
1278 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetMatchOptimization(MatPartitioning,PetscBool);
1279 
1280 typedef enum { MP_PTSCOTCH_QUALITY,MP_PTSCOTCH_SPEED,MP_PTSCOTCH_BALANCE,MP_PTSCOTCH_SAFETY,MP_PTSCOTCH_SCALABILITY } MPPTScotchStrategyType;
1281 PETSC_EXTERN const char *const MPPTScotchStrategyTypes[];
1282 
1283 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetImbalance(MatPartitioning,PetscReal);
1284 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetImbalance(MatPartitioning,PetscReal*);
1285 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetStrategy(MatPartitioning,MPPTScotchStrategyType);
1286 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetStrategy(MatPartitioning,MPPTScotchStrategyType*);
1287 
1288 /*
1289  * hierarchical partitioning
1290  */
1291 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalGetFineparts(MatPartitioning,IS*);
1292 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalGetCoarseparts(MatPartitioning,IS*);
1293 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalSetNcoarseparts(MatPartitioning,PetscInt);
1294 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalSetNfineparts(MatPartitioning, PetscInt);
1295 
1296 PETSC_EXTERN PetscErrorCode MatMeshToVertexGraph(Mat,PetscInt,Mat*);
1297 PETSC_EXTERN PetscErrorCode MatMeshToCellGraph(Mat,PetscInt,Mat*);
1298 
1299 /*
1300     If you add entries here you must also add them to petsc/finclude/petscmat.h
1301 */
1302 typedef enum { MATOP_SET_VALUES=0,
1303                MATOP_GET_ROW=1,
1304                MATOP_RESTORE_ROW=2,
1305                MATOP_MULT=3,
1306                MATOP_MULT_ADD=4,
1307                MATOP_MULT_TRANSPOSE=5,
1308                MATOP_MULT_TRANSPOSE_ADD=6,
1309                MATOP_SOLVE=7,
1310                MATOP_SOLVE_ADD=8,
1311                MATOP_SOLVE_TRANSPOSE=9,
1312                MATOP_SOLVE_TRANSPOSE_ADD=10,
1313                MATOP_LUFACTOR=11,
1314                MATOP_CHOLESKYFACTOR=12,
1315                MATOP_SOR=13,
1316                MATOP_TRANSPOSE=14,
1317                MATOP_GETINFO=15,
1318                MATOP_EQUAL=16,
1319                MATOP_GET_DIAGONAL=17,
1320                MATOP_DIAGONAL_SCALE=18,
1321                MATOP_NORM=19,
1322                MATOP_ASSEMBLY_BEGIN=20,
1323                MATOP_ASSEMBLY_END=21,
1324                MATOP_SET_OPTION=22,
1325                MATOP_ZERO_ENTRIES=23,
1326                MATOP_ZERO_ROWS=24,
1327                MATOP_LUFACTOR_SYMBOLIC=25,
1328                MATOP_LUFACTOR_NUMERIC=26,
1329                MATOP_CHOLESKY_FACTOR_SYMBOLIC=27,
1330                MATOP_CHOLESKY_FACTOR_NUMERIC=28,
1331                MATOP_SETUP_PREALLOCATION=29,
1332                MATOP_ILUFACTOR_SYMBOLIC=30,
1333                MATOP_ICCFACTOR_SYMBOLIC=31,
1334                MATOP_GET_DIAGONAL_BLOCK=32,
1335                /* MATOP_PLACEHOLDER_33=33, */
1336                MATOP_DUPLICATE=34,
1337                MATOP_FORWARD_SOLVE=35,
1338                MATOP_BACKWARD_SOLVE=36,
1339                MATOP_ILUFACTOR=37,
1340                MATOP_ICCFACTOR=38,
1341                MATOP_AXPY=39,
1342                MATOP_GET_SUBMATRICES=40,
1343                MATOP_INCREASE_OVERLAP=41,
1344                MATOP_GET_VALUES=42,
1345                MATOP_COPY=43,
1346                MATOP_GET_ROW_MAX=44,
1347                MATOP_SCALE=45,
1348                MATOP_SHIFT=46,
1349                MATOP_DIAGONAL_SET=47,
1350                MATOP_ZERO_ROWS_COLUMNS=48,
1351                MATOP_SET_RANDOM=49,
1352                MATOP_GET_ROW_IJ=50,
1353                MATOP_RESTORE_ROW_IJ=51,
1354                MATOP_GET_COLUMN_IJ=52,
1355                MATOP_RESTORE_COLUMN_IJ=53,
1356                MATOP_FDCOLORING_CREATE=54,
1357                MATOP_COLORING_PATCH=55,
1358                MATOP_SET_UNFACTORED=56,
1359                MATOP_PERMUTE=57,
1360                MATOP_SET_VALUES_BLOCKED=58,
1361                MATOP_GET_SUBMATRIX=59,
1362                MATOP_DESTROY=60,
1363                MATOP_VIEW=61,
1364                MATOP_CONVERT_FROM=62,
1365                MATOP_MATMAT_MULT=63,
1366                MATOP_MATMAT_MULT_SYMBOLIC=64,
1367                MATOP_MATMAT_MULT_NUMERIC=65,
1368                MATOP_SET_LOCAL_TO_GLOBAL_MAP=66,
1369                MATOP_SET_VALUES_LOCAL=67,
1370                MATOP_ZERO_ROWS_LOCAL=68,
1371                MATOP_GET_ROW_MAX_ABS=69,
1372                MATOP_GET_ROW_MIN_ABS=70,
1373                MATOP_CONVERT=71,
1374                MATOP_SET_COLORING=72,
1375                /* MATOP_PLACEHOLDER_73=73, */
1376                MATOP_SET_VALUES_ADIFOR=74,
1377                MATOP_FD_COLORING_APPLY=75,
1378                MATOP_SET_FROM_OPTIONS=76,
1379                MATOP_MULT_CONSTRAINED=77,
1380                MATOP_MULT_TRANSPOSE_CONSTRAIN=78,
1381                MATOP_FIND_ZERO_DIAGONALS=79,
1382                MATOP_MULT_MULTIPLE=80,
1383                MATOP_SOLVE_MULTIPLE=81,
1384                MATOP_GET_INERTIA=82,
1385                MATOP_LOAD=83,
1386                MATOP_IS_SYMMETRIC=84,
1387                MATOP_IS_HERMITIAN=85,
1388                MATOP_IS_STRUCTURALLY_SYMMETRIC=86,
1389                MATOP_SET_VALUES_BLOCKEDLOCAL=87,
1390                MATOP_GET_VECS=88,
1391                MATOP_MAT_MULT=89,
1392                MATOP_MAT_MULT_SYMBOLIC=90,
1393                MATOP_MAT_MULT_NUMERIC=91,
1394                MATOP_PTAP=92,
1395                MATOP_PTAP_SYMBOLIC=93,
1396                MATOP_PTAP_NUMERIC=94,
1397                MATOP_MAT_TRANSPOSE_MULT=95,
1398                MATOP_MAT_TRANSPOSE_MULT_SYMBO=96,
1399                MATOP_MAT_TRANSPOSE_MULT_NUMER=97,
1400                /* MATOP_PLACEHOLDER_98=98, */
1401                /* MATOP_PLACEHOLDER_99=99, */
1402                /* MATOP_PLACEHOLDER_100=100, */
1403                /* MATOP_PLACEHOLDER_101=101, */
1404                MATOP_CONJUGATE=102,
1405                /* MATOP_PLACEHOLDER_103=103, */
1406                MATOP_SET_VALUES_ROW=104,
1407                MATOP_REAL_PART=105,
1408                MATOP_IMAGINARY_PART=106,
1409                MATOP_GET_ROW_UPPER_TRIANGULAR=107,
1410                MATOP_RESTORE_ROW_UPPER_TRIANG=108,
1411                MATOP_MAT_SOLVE=109,
1412                MATOP_GET_REDUNDANT_MATRIX=110,
1413                MATOP_GET_ROW_MIN=111,
1414                MATOP_GET_COLUMN_VECTOR=112,
1415                MATOP_MISSING_DIAGONAL=113,
1416                MATOP_GET_SEQ_NONZERO_STRUCTUR=114,
1417                MATOP_CREATE=115,
1418                MATOP_GET_GHOSTS=116,
1419                MATOP_GET_LOCAL_SUB_MATRIX=117,
1420                MATOP_RESTORE_LOCALSUB_MATRIX=118,
1421                MATOP_MULT_DIAGONAL_BLOCK=119,
1422                MATOP_HERMITIAN_TRANSPOSE=120,
1423                MATOP_MULT_HERMITIAN_TRANSPOSE=121,
1424                MATOP_MULT_HERMITIAN_TRANS_ADD=122,
1425                MATOP_GET_MULTI_PROC_BLOCK=123,
1426                MATOP_FIND_NONZERO_ROWS=124,
1427                MATOP_GET_COLUMN_NORMS=125,
1428                MATOP_INVERT_BLOCK_DIAGONAL=126,
1429                /* MATOP_PLACEHOLDER_127=127, */
1430                MATOP_GET_SUB_MATRICES_PARALLE=128,
1431                MATOP_SET_VALUES_BATCH=129,
1432                MATOP_TRANSPOSE_MAT_MULT=130,
1433                MATOP_TRANSPOSE_MAT_MULT_SYMBO=131,
1434                MATOP_TRANSPOSE_MAT_MULT_NUMER=132,
1435                MATOP_TRANSPOSE_COLORING_CREAT=133,
1436                MATOP_TRANS_COLORING_APPLY_SPT=134,
1437                MATOP_TRANS_COLORING_APPLY_DEN=135,
1438                MATOP_RART=136,
1439                MATOP_RART_SYMBOLIC=137,
1440                MATOP_RART_NUMERIC=138,
1441                MATOP_SET_BLOCK_SIZES=139,
1442                MATOP_AYPX=140,
1443                MATOP_RESIDUAL=141,
1444                MATOP_FDCOLORING_SETUP=142,
1445                MATOP_MPICONCATENATESEQ=144
1446              } MatOperation;
1447 PETSC_EXTERN PetscErrorCode MatHasOperation(Mat,MatOperation,PetscBool *);
1448 PETSC_EXTERN PetscErrorCode MatShellSetOperation(Mat,MatOperation,void(*)(void));
1449 PETSC_EXTERN PetscErrorCode MatShellGetOperation(Mat,MatOperation,void(**)(void));
1450 PETSC_EXTERN PetscErrorCode MatShellSetContext(Mat,void*);
1451 
1452 /*
1453    Codes for matrices stored on disk. By default they are
1454    stored in a universal format. By changing the format with
1455    PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE); the matrices will
1456    be stored in a way natural for the matrix, for example dense matrices
1457    would be stored as dense. Matrices stored this way may only be
1458    read into matrices of the same type.
1459 */
1460 #define MATRIX_BINARY_FORMAT_DENSE -1
1461 
1462 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
1463 PETSC_EXTERN PetscErrorCode MatISGetLocalMat(Mat,Mat*);
1464 PETSC_EXTERN PetscErrorCode MatISSetLocalMat(Mat,Mat);
1465 PETSC_EXTERN PetscErrorCode MatISGetMPIXAIJ(Mat,MatReuse,Mat*);
1466 
1467 /*S
1468      MatNullSpace - Object that removes a null space from a vector, i.e.
1469          orthogonalizes the vector to a subsapce
1470 
1471    Level: advanced
1472 
1473   Concepts: matrix; linear operator, null space
1474 
1475   Users manual sections:
1476 .   sec_singular
1477 
1478 .seealso:  MatNullSpaceCreate()
1479 S*/
1480 typedef struct _p_MatNullSpace* MatNullSpace;
1481 
1482 PETSC_EXTERN PetscErrorCode MatNullSpaceCreate(MPI_Comm,PetscBool ,PetscInt,const Vec[],MatNullSpace*);
1483 PETSC_EXTERN PetscErrorCode MatNullSpaceSetFunction(MatNullSpace,PetscErrorCode (*)(MatNullSpace,Vec,void*),void*);
1484 PETSC_EXTERN PetscErrorCode MatNullSpaceDestroy(MatNullSpace*);
1485 PETSC_EXTERN PetscErrorCode MatNullSpaceRemove(MatNullSpace,Vec);
1486 PETSC_EXTERN PetscErrorCode MatGetNullSpace(Mat, MatNullSpace *);
1487 PETSC_EXTERN PetscErrorCode MatGetTransposeNullSpace(Mat, MatNullSpace *);
1488 PETSC_EXTERN PetscErrorCode MatSetTransposeNullSpace(Mat,MatNullSpace);
1489 PETSC_EXTERN PetscErrorCode MatSetNullSpace(Mat,MatNullSpace);
1490 PETSC_EXTERN PetscErrorCode MatSetNearNullSpace(Mat,MatNullSpace);
1491 PETSC_EXTERN PetscErrorCode MatGetNearNullSpace(Mat,MatNullSpace*);
1492 PETSC_EXTERN PetscErrorCode MatNullSpaceTest(MatNullSpace,Mat,PetscBool  *);
1493 PETSC_EXTERN PetscErrorCode MatNullSpaceView(MatNullSpace,PetscViewer);
1494 PETSC_EXTERN PetscErrorCode MatNullSpaceGetVecs(MatNullSpace,PetscBool*,PetscInt*,const Vec**);
1495 PETSC_EXTERN PetscErrorCode MatNullSpaceCreateRigidBody(Vec,MatNullSpace*);
1496 
1497 PETSC_EXTERN PetscErrorCode MatReorderingSeqSBAIJ(Mat,IS);
1498 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
1499 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetColumnIndices(Mat,PetscInt *);
1500 PETSC_EXTERN PetscErrorCode MatSeqBAIJInvertBlockDiagonal(Mat);
1501 
1502 PETSC_EXTERN PetscErrorCode MatCreateMAIJ(Mat,PetscInt,Mat*);
1503 PETSC_EXTERN PetscErrorCode MatMAIJRedimension(Mat,PetscInt,Mat*);
1504 PETSC_EXTERN PetscErrorCode MatMAIJGetAIJ(Mat,Mat*);
1505 
1506 PETSC_EXTERN PetscErrorCode MatComputeExplicitOperator(Mat,Mat*);
1507 
1508 PETSC_EXTERN PetscErrorCode MatDiagonalScaleLocal(Mat,Vec);
1509 
1510 PETSC_EXTERN PetscErrorCode MatCreateMFFD(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,Mat*);
1511 PETSC_EXTERN PetscErrorCode MatMFFDSetBase(Mat,Vec,Vec);
1512 PETSC_EXTERN PetscErrorCode MatMFFDSetFunction(Mat,PetscErrorCode(*)(void*,Vec,Vec),void*);
1513 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioni(Mat,PetscErrorCode (*)(void*,PetscInt,Vec,PetscScalar*));
1514 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioniBase(Mat,PetscErrorCode (*)(void*,Vec));
1515 PETSC_EXTERN PetscErrorCode MatMFFDSetHHistory(Mat,PetscScalar[],PetscInt);
1516 PETSC_EXTERN PetscErrorCode MatMFFDResetHHistory(Mat);
1517 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctionError(Mat,PetscReal);
1518 PETSC_EXTERN PetscErrorCode MatMFFDSetPeriod(Mat,PetscInt);
1519 PETSC_EXTERN PetscErrorCode MatMFFDGetH(Mat,PetscScalar *);
1520 PETSC_EXTERN PetscErrorCode MatMFFDSetOptionsPrefix(Mat,const char[]);
1521 PETSC_EXTERN PetscErrorCode MatMFFDCheckPositivity(void*,Vec,Vec,PetscScalar*);
1522 PETSC_EXTERN PetscErrorCode MatMFFDSetCheckh(Mat,PetscErrorCode (*)(void*,Vec,Vec,PetscScalar*),void*);
1523 
1524 /*S
1525     MatMFFD - A data structured used to manage the computation of the h differencing parameter for matrix-free
1526               Jacobian vector products
1527 
1528     Notes: MATMFFD is a specific MatType which uses the MatMFFD data structure
1529 
1530            MatMFFD*() methods actually take the Mat as their first argument. Not a MatMFFD data structure
1531 
1532     Level: developer
1533 
1534 .seealso: MATMFFD, MatCreateMFFD(), MatMFFDSetFuction(), MatMFFDSetType(), MatMFFDRegister()
1535 S*/
1536 typedef struct _p_MatMFFD* MatMFFD;
1537 
1538 /*J
1539     MatMFFDType - algorithm used to compute the h used in computing matrix-vector products via differencing of the function
1540 
1541    Level: beginner
1542 
1543 .seealso: MatMFFDSetType(), MatMFFDRegister()
1544 J*/
1545 typedef const char* MatMFFDType;
1546 #define MATMFFD_DS  "ds"
1547 #define MATMFFD_WP  "wp"
1548 
1549 PETSC_EXTERN PetscErrorCode MatMFFDSetType(Mat,MatMFFDType);
1550 PETSC_EXTERN PetscErrorCode MatMFFDRegister(const char[],PetscErrorCode (*)(MatMFFD));
1551 
1552 PETSC_EXTERN PetscErrorCode MatMFFDDSSetUmin(Mat,PetscReal);
1553 PETSC_EXTERN PetscErrorCode MatMFFDWPSetComputeNormU(Mat,PetscBool );
1554 
1555 PETSC_EXTERN PetscErrorCode MatFDColoringSetType(MatFDColoring,MatMFFDType);
1556 
1557 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutMatrix(PetscViewer, PetscInt, PetscInt, PetscReal *);
1558 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutCSRMatrix(PetscViewer, PetscInt, PetscInt, PetscInt *, PetscInt *, PetscReal *);
1559 
1560 /*
1561    PETSc interface to MUMPS
1562 */
1563 #ifdef PETSC_HAVE_MUMPS
1564 PETSC_EXTERN PetscErrorCode MatMumpsSetIcntl(Mat,PetscInt,PetscInt);
1565 PETSC_EXTERN PetscErrorCode MatMumpsGetIcntl(Mat,PetscInt,PetscInt*);
1566 PETSC_EXTERN PetscErrorCode MatMumpsSetCntl(Mat,PetscInt,PetscReal);
1567 PETSC_EXTERN PetscErrorCode MatMumpsGetCntl(Mat,PetscInt,PetscReal*);
1568 
1569 PETSC_EXTERN PetscErrorCode MatMumpsGetInfo(Mat,PetscInt,PetscInt*);
1570 PETSC_EXTERN PetscErrorCode MatMumpsGetInfog(Mat,PetscInt,PetscInt*);
1571 PETSC_EXTERN PetscErrorCode MatMumpsGetRinfo(Mat,PetscInt,PetscReal*);
1572 PETSC_EXTERN PetscErrorCode MatMumpsGetRinfog(Mat,PetscInt,PetscReal*);
1573 #endif
1574 
1575 /*
1576    PETSc interface to Mkl_Pardiso
1577 */
1578 #ifdef PETSC_HAVE_MKL_PARDISO
1579 PETSC_EXTERN PetscErrorCode MatMkl_PardisoSetCntl(Mat,PetscInt,PetscInt);
1580 #endif
1581 
1582 /*
1583    PETSc interface to Mkl_CPardiso
1584 */
1585 #ifdef PETSC_HAVE_MKL_CPARDISO
1586 PETSC_EXTERN PetscErrorCode MatMkl_CPardisoSetCntl(Mat,PetscInt,PetscInt);
1587 #endif
1588 
1589 /*
1590    PETSc interface to SUPERLU
1591 */
1592 #ifdef PETSC_HAVE_SUPERLU
1593 PETSC_EXTERN PetscErrorCode MatSuperluSetILUDropTol(Mat,PetscReal);
1594 #endif
1595 
1596 /*
1597    PETSc interface to SUPERLU_DIST
1598 */
1599 #ifdef PETSC_HAVE_SUPERLU_DIST
1600 PETSC_EXTERN PetscErrorCode MatSuperluDistGetDiagU(Mat,PetscScalar*);
1601 #endif
1602 
1603 /*
1604    PETSc interface to STRUMPACK
1605 */
1606 #ifdef PETSC_HAVE_STRUMPACK
1607 PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSRelCompTol(Mat,PetscReal);
1608 PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSMinSize(Mat,PetscInt);
1609 PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetColPerm(Mat,PetscBool);
1610 #endif
1611 
1612 
1613 #ifdef PETSC_HAVE_CUDA
1614 /*E
1615     MatCUSPARSEStorageFormat - indicates the storage format for CUSPARSE (GPU)
1616     matrices.
1617 
1618     Not Collective
1619 
1620 +   MAT_CUSPARSE_CSR - Compressed Sparse Row
1621 .   MAT_CUSPARSE_ELL - Ellpack (requires CUDA 4.2 or later).
1622 -   MAT_CUSPARSE_HYB - Hybrid, a combination of Ellpack and Coordinate format (requires CUDA 4.2 or later).
1623 
1624     Level: intermediate
1625 
1626    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
1627 
1628 .seealso: MatCUSPARSESetFormat(), MatCUSPARSEFormatOperation
1629 E*/
1630 
1631 typedef enum {MAT_CUSPARSE_CSR, MAT_CUSPARSE_ELL, MAT_CUSPARSE_HYB} MatCUSPARSEStorageFormat;
1632 
1633 /* these will be strings associated with enumerated type defined above */
1634 PETSC_EXTERN const char *const MatCUSPARSEStorageFormats[];
1635 
1636 /*E
1637     MatCUSPARSEFormatOperation - indicates the operation of CUSPARSE (GPU)
1638     matrices whose operation should use a particular storage format.
1639 
1640     Not Collective
1641 
1642 +   MAT_CUSPARSE_MULT_DIAG - sets the storage format for the diagonal matrix in the parallel MatMult
1643 .   MAT_CUSPARSE_MULT_OFFDIAG - sets the storage format for the offdiagonal matrix in the parallel MatMult
1644 .   MAT_CUSPARSE_MULT - sets the storage format for the entire matrix in the serial (single GPU) MatMult
1645 -   MAT_CUSPARSE_ALL - sets the storage format for all CUSPARSE (GPU) matrices
1646 
1647     Level: intermediate
1648 
1649 .seealso: MatCUSPARSESetFormat(), MatCUSPARSEStorageFormat
1650 E*/
1651 typedef enum {MAT_CUSPARSE_MULT_DIAG, MAT_CUSPARSE_MULT_OFFDIAG, MAT_CUSPARSE_MULT, MAT_CUSPARSE_ALL} MatCUSPARSEFormatOperation;
1652 
1653 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCUSPARSE(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
1654 PETSC_EXTERN PetscErrorCode MatCreateAIJCUSPARSE(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
1655 PETSC_EXTERN PetscErrorCode MatCUSPARSESetFormat(Mat,MatCUSPARSEFormatOperation,MatCUSPARSEStorageFormat);
1656 #endif
1657 
1658 #if defined(PETSC_HAVE_CUSP)
1659 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCUSP(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
1660 PETSC_EXTERN PetscErrorCode MatCreateAIJCUSP(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
1661 
1662 /*E
1663     MatCUSPStorageFormat - indicates the storage format for CUSP (GPU)
1664     matrices.
1665 
1666     Not Collective
1667 
1668 +   MAT_CUSP_CSR - Compressed Sparse Row
1669 .   MAT_CUSP_DIA - Diagonal
1670 -   MAT_CUSP_ELL - Ellpack
1671 
1672     Level: intermediate
1673 
1674    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
1675 
1676 .seealso: MatCUSPSetFormat(), MatCUSPFormatOperation
1677 E*/
1678 typedef enum {MAT_CUSP_CSR, MAT_CUSP_DIA, MAT_CUSP_ELL} MatCUSPStorageFormat;
1679 
1680 /* these will be strings associated with enumerated type defined above */
1681 PETSC_EXTERN const char *const MatCUSPStorageFormats[];
1682 
1683 /*E
1684     MatCUSPFormatOperation - indicates the operation of CUSP (GPU)
1685     matrices whose operation should use a particular storage format.
1686 
1687     Not Collective
1688 
1689 +   MAT_CUSP_MULT_DIAG - sets the storage format for the diagonal matrix in the parallel MatMult
1690 .   MAT_CUSP_MULT_OFFDIAG - sets the storage format for the offdiagonal matrix in the parallel MatMult
1691 .   MAT_CUSP_MULT - sets the storage format for the entire matrix in the serial (single GPU) MatMult
1692 -   MAT_CUSP_ALL - sets the storage format for all CUSP (GPU) matrices
1693 
1694     Level: intermediate
1695 
1696    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
1697 
1698 .seealso: MatCUSPSetFormat(), MatCUSPStorageFormat
1699 E*/
1700 typedef enum {MAT_CUSP_MULT_DIAG, MAT_CUSP_MULT_OFFDIAG, MAT_CUSP_MULT, MAT_CUSP_ALL} MatCUSPFormatOperation;
1701 
1702 PETSC_EXTERN PetscErrorCode MatCUSPSetFormat(Mat,MatCUSPFormatOperation,MatCUSPStorageFormat);
1703 #endif
1704 
1705 #if defined(PETSC_HAVE_VIENNACL)
1706 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJViennaCL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
1707 PETSC_EXTERN PetscErrorCode MatCreateAIJViennaCL(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
1708 #endif
1709 
1710 /*
1711    PETSc interface to FFTW
1712 */
1713 #if defined(PETSC_HAVE_FFTW)
1714 PETSC_EXTERN PetscErrorCode VecScatterPetscToFFTW(Mat,Vec,Vec);
1715 PETSC_EXTERN PetscErrorCode VecScatterFFTWToPetsc(Mat,Vec,Vec);
1716 PETSC_EXTERN PetscErrorCode MatCreateVecsFFTW(Mat,Vec*,Vec*,Vec*);
1717 #endif
1718 
1719 PETSC_EXTERN PetscErrorCode MatCreateNest(MPI_Comm,PetscInt,const IS[],PetscInt,const IS[],const Mat[],Mat*);
1720 PETSC_EXTERN PetscErrorCode MatNestGetSize(Mat,PetscInt*,PetscInt*);
1721 PETSC_EXTERN PetscErrorCode MatNestGetISs(Mat,IS[],IS[]);
1722 PETSC_EXTERN PetscErrorCode MatNestGetLocalISs(Mat,IS[],IS[]);
1723 PETSC_EXTERN PetscErrorCode MatNestGetSubMats(Mat,PetscInt*,PetscInt*,Mat***);
1724 PETSC_EXTERN PetscErrorCode MatNestGetSubMat(Mat,PetscInt,PetscInt,Mat*);
1725 PETSC_EXTERN PetscErrorCode MatNestSetVecType(Mat,VecType);
1726 PETSC_EXTERN PetscErrorCode MatNestSetSubMats(Mat,PetscInt,const IS[],PetscInt,const IS[],const Mat[]);
1727 PETSC_EXTERN PetscErrorCode MatNestSetSubMat(Mat,PetscInt,PetscInt,Mat);
1728 
1729 PETSC_EXTERN PetscErrorCode MatChop(Mat,PetscReal);
1730 PETSC_EXTERN PetscErrorCode MatComputeBandwidth(Mat,PetscReal,PetscInt*);
1731 
1732 PETSC_EXTERN PetscErrorCode MatSubdomainsCreateCoalesce(Mat,PetscInt,PetscInt*,IS**);
1733 
1734 PETSC_EXTERN PetscErrorCode MatPreallocatorPreallocate(Mat,PetscBool,Mat);
1735 
1736 PETSC_INTERN PetscErrorCode MatHeaderMerge(Mat,Mat*);
1737 PETSC_EXTERN PetscErrorCode MatHeaderReplace(Mat,Mat*);
1738 
1739 #endif
1740