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