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