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