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