xref: /petsc/include/petscmat.h (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
12eac72dbSBarry Smith /*
22eac72dbSBarry Smith      Include file for the matrix component of PETSc
32eac72dbSBarry Smith */
426bd1501SBarry Smith #ifndef PETSCMAT_H
526bd1501SBarry Smith #define PETSCMAT_H
6ac09b921SBarry Smith 
72c8e378dSBarry Smith #include <petscvec.h>
82eac72dbSBarry Smith 
9ac09b921SBarry Smith /* SUBMANSEC = Mat */
10ac09b921SBarry Smith 
11d9274352SBarry Smith /*S
128f6c3df8SBarry Smith      Mat - Abstract PETSc matrix object used to manage all linear operators in PETSc, even those without
138f6c3df8SBarry Smith            an explicit sparse representation (such as matrix-free operators)
142eac72dbSBarry Smith 
15d91e6319SBarry Smith    Level: beginner
16d91e6319SBarry Smith 
17db781477SPatrick Sanan .seealso: `MatCreate()`, `MatType`, `MatSetType()`, `MatDestroy()`
18d9274352SBarry Smith S*/
19d9274352SBarry Smith typedef struct _p_Mat *Mat;
20d9274352SBarry Smith 
2176bdecfbSBarry Smith /*J
228f6c3df8SBarry Smith     MatType - String with the name of a PETSc matrix type
23d9274352SBarry Smith 
24d9274352SBarry Smith    Level: beginner
25d9274352SBarry Smith 
26db781477SPatrick Sanan .seealso: `MatSetType()`, `Mat`, `MatSolverType`, `MatRegister()`
2776bdecfbSBarry Smith J*/
2819fd82e9SBarry Smith typedef const char *MatType;
29273d9f13SBarry Smith #define MATSAME              "same"
305a11e1b2SBarry Smith #define MATMAIJ              "maij"
31273d9f13SBarry Smith #define MATSEQMAIJ           "seqmaij"
32273d9f13SBarry Smith #define MATMPIMAIJ           "mpimaij"
3349bd79ccSDebojyoti Ghosh #define MATKAIJ              "kaij"
3449bd79ccSDebojyoti Ghosh #define MATSEQKAIJ           "seqkaij"
3549bd79ccSDebojyoti Ghosh #define MATMPIKAIJ           "mpikaij"
36273d9f13SBarry Smith #define MATIS                "is"
375a11e1b2SBarry Smith #define MATAIJ               "aij"
38273d9f13SBarry Smith #define MATSEQAIJ            "seqaij"
39273d9f13SBarry Smith #define MATMPIAIJ            "mpiaij"
405a11e1b2SBarry Smith #define MATAIJCRL            "aijcrl"
415a11e1b2SBarry Smith #define MATSEQAIJCRL         "seqaijcrl"
425a11e1b2SBarry Smith #define MATMPIAIJCRL         "mpiaijcrl"
439ae82921SPaul Mullowney #define MATAIJCUSPARSE       "aijcusparse"
449ae82921SPaul Mullowney #define MATSEQAIJCUSPARSE    "seqaijcusparse"
459ae82921SPaul Mullowney #define MATMPIAIJCUSPARSE    "mpiaijcusparse"
468c3ff71bSJunchao Zhang #define MATAIJKOKKOS         "aijkokkos"
478c3ff71bSJunchao Zhang #define MATSEQAIJKOKKOS      "seqaijkokkos"
488c3ff71bSJunchao Zhang #define MATMPIAIJKOKKOS      "mpiaijkokkos"
49d67ff14aSKarl Rupp #define MATAIJVIENNACL       "aijviennacl"
50d67ff14aSKarl Rupp #define MATSEQAIJVIENNACL    "seqaijviennacl"
51d67ff14aSKarl Rupp #define MATMPIAIJVIENNACL    "mpiaijviennacl"
525a11e1b2SBarry Smith #define MATAIJPERM           "aijperm"
535a11e1b2SBarry Smith #define MATSEQAIJPERM        "seqaijperm"
545a11e1b2SBarry Smith #define MATMPIAIJPERM        "mpiaijperm"
554dfdc2d9SRichard Tran Mills #define MATAIJSELL           "aijsell"
564dfdc2d9SRichard Tran Mills #define MATSEQAIJSELL        "seqaijsell"
574dfdc2d9SRichard Tran Mills #define MATMPIAIJSELL        "mpiaijsell"
584a2a386eSRichard Tran Mills #define MATAIJMKL            "aijmkl"
594a2a386eSRichard Tran Mills #define MATSEQAIJMKL         "seqaijmkl"
604a2a386eSRichard Tran Mills #define MATMPIAIJMKL         "mpiaijmkl"
61b5b72c8aSIrina Sokolova #define MATBAIJMKL           "baijmkl"
62b5b72c8aSIrina Sokolova #define MATSEQBAIJMKL        "seqbaijmkl"
63b5b72c8aSIrina Sokolova #define MATMPIBAIJMKL        "mpibaijmkl"
64273d9f13SBarry Smith #define MATSHELL             "shell"
65c1fff1c6SRichard Tran Mills #define MATCENTERING         "centering"
665a11e1b2SBarry Smith #define MATDENSE             "dense"
67637a0070SStefano Zampini #define MATDENSECUDA         "densecuda"
68209238afSKris Buschelman #define MATSEQDENSE          "seqdense"
69bfc799aaSStefano Zampini #define MATSEQDENSECUDA      "seqdensecuda"
70273d9f13SBarry Smith #define MATMPIDENSE          "mpidense"
71637a0070SStefano Zampini #define MATMPIDENSECUDA      "mpidensecuda"
72db31f6deSJed Brown #define MATELEMENTAL         "elemental"
73d24d4204SJose E. Roman #define MATSCALAPACK         "scalapack"
745a11e1b2SBarry Smith #define MATBAIJ              "baij"
75273d9f13SBarry Smith #define MATSEQBAIJ           "seqbaij"
76273d9f13SBarry Smith #define MATMPIBAIJ           "mpibaij"
77273d9f13SBarry Smith #define MATMPIADJ            "mpiadj"
785a11e1b2SBarry Smith #define MATSBAIJ             "sbaij"
79273d9f13SBarry Smith #define MATSEQSBAIJ          "seqsbaij"
80273d9f13SBarry Smith #define MATMPISBAIJ          "mpisbaij"
81cebc7f6cSBarry Smith #define MATMFFD              "mffd"
82c8a8475eSBarry Smith #define MATNORMAL            "normal"
83c5e4d11fSDmitry Karpeev #define MATNORMALHERMITIAN   "normalh"
84ab92ecdeSBarry Smith #define MATLRC               "lrc"
852a6744ebSBarry Smith #define MATSCATTER           "scatter"
86421e10b8SBarry Smith #define MATBLOCKMAT          "blockmat"
87793850ffSBarry Smith #define MATCOMPOSITE         "composite"
881f8c7532SHong Zhang #define MATFFT               "fft"
891f8c7532SHong Zhang #define MATFFTW              "fftw"
90e133240eSMatthew G Knepley #define MATSEQCUFFT          "seqcufft"
91557cca28SSatish Balay #define MATTRANSPOSEMAT      "transpose"
9272ca8751SBarry Smith #define MATSCHURCOMPLEMENT   "schurcomplement"
931d6018f0SLisandro Dalcin #define MATPYTHON            "python"
9463c07aadSStefano Zampini #define MATHYPRE             "hypre"
95f91d8e95SBarry Smith #define MATHYPRESTRUCT       "hyprestruct"
96a9e6138eSGlenn Hammond #define MATHYPRESSTRUCT      "hypresstruct"
97ee1cef2cSJed Brown #define MATSUBMATRIX         "submatrix"
982c0dbf93SJed Brown #define MATLOCALREF          "localref"
99d8588912SDave May #define MATNEST              "nest"
100c094ef40SMatthew G. Knepley #define MATPREALLOCATOR      "preallocator"
101d4002b98SHong Zhang #define MATSELL              "sell"
102d4002b98SHong Zhang #define MATSEQSELL           "seqsell"
103d4002b98SHong Zhang #define MATMPISELL           "mpisell"
104a3b2e22bSHong Zhang #define MATDUMMY             "dummy"
105cd929ea3SAlp Dener #define MATLMVM              "lmvm"
10678e4361aSAlp Dener #define MATLMVMDFP           "lmvmdfp"
10778e4361aSAlp Dener #define MATLMVMBFGS          "lmvmbfgs"
10878e4361aSAlp Dener #define MATLMVMSR1           "lmvmsr1"
109864588a7SAlp Dener #define MATLMVMBROYDEN       "lmvmbroyden"
110864588a7SAlp Dener #define MATLMVMBADBROYDEN    "lmvmbadbroyden"
111864588a7SAlp Dener #define MATLMVMSYMBROYDEN    "lmvmsymbroyden"
112864588a7SAlp Dener #define MATLMVMSYMBADBROYDEN "lmvmsymbadbroyden"
113864588a7SAlp Dener #define MATLMVMDIAGBROYDEN   "lmvmdiagbroyden"
1143423f386SBarry Smith #define MATCONSTANTDIAGONAL  "constantdiagonal"
115c7a4214aSPierre Jolivet #define MATHTOOL             "htool"
11653022affSStefano Zampini #define MATH2OPUS            "h2opus"
117773941d6SBarry Smith 
11876bdecfbSBarry Smith /*J
1193ca39a21SBarry Smith     MatSolverType - String with the name of a PETSc matrix solver type.
1209989ab13SBarry Smith 
121c2b89b5dSBarry Smith     For example: "petsc" indicates what PETSc provides, "superlu_dist" the parallel SuperLU_DIST package etc
1229989ab13SBarry Smith 
1239989ab13SBarry Smith    Level: beginner
1249989ab13SBarry Smith 
1253f498edaSToby Isaac    Notes:  MATSOLVERUMFPACK, MATSOLVERCHOLMOD, MATSOLVERKLU, MATSOLVERSPQR form the SuiteSparse package for which you can use --download-suitesparse
126c7ccbb75SBarry Smith 
127db781477SPatrick Sanan .seealso: `MatGetFactor()`, `PCFactorSetMatSolverType()`, `PCFactorGetMatSolverType()`
12876bdecfbSBarry Smith J*/
129ea799195SBarry Smith typedef const char *MatSolverType;
1302692d6eeSBarry Smith #define MATSOLVERSUPERLU         "superlu"
1312692d6eeSBarry Smith #define MATSOLVERSUPERLU_DIST    "superlu_dist"
13208f5efcfSPieter Ghysels #define MATSOLVERSTRUMPACK       "strumpack"
1332692d6eeSBarry Smith #define MATSOLVERUMFPACK         "umfpack"
13420db9a53SJed Brown #define MATSOLVERCHOLMOD         "cholmod"
135d89f5e7aSBarry Smith #define MATSOLVERKLU             "klu"
136418810c4SBarry Smith #define MATSOLVERSPARSEELEMENTAL "sparseelemental"
137d89f5e7aSBarry Smith #define MATSOLVERELEMENTAL       "elemental"
138d24d4204SJose E. Roman #define MATSOLVERSCALAPACK       "scalapack"
1392692d6eeSBarry Smith #define MATSOLVERESSL            "essl"
1402692d6eeSBarry Smith #define MATSOLVERLUSOL           "lusol"
1412692d6eeSBarry Smith #define MATSOLVERMUMPS           "mumps"
142d615f992SSatish Balay #define MATSOLVERMKL_PARDISO     "mkl_pardiso"
143d305a81bSVasiliy Kozyrev #define MATSOLVERMKL_CPARDISO    "mkl_cpardiso"
1442692d6eeSBarry Smith #define MATSOLVERPASTIX          "pastix"
1452692d6eeSBarry Smith #define MATSOLVERMATLAB          "matlab"
1462692d6eeSBarry Smith #define MATSOLVERPETSC           "petsc"
1472692d6eeSBarry Smith #define MATSOLVERBAS             "bas"
1489ae82921SPaul Mullowney #define MATSOLVERCUSPARSE        "cusparse"
149bddcd29dSMark Adams #define MATSOLVERCUSPARSEBAND    "cusparseband"
150bfc799aaSStefano Zampini #define MATSOLVERCUDA            "cuda"
151930e68a5SMark Adams #define MATSOLVERKOKKOS          "kokkos"
1528f7e8f9dSMark Adams #define MATSOLVERKOKKOSDEVICE    "kokkosdevice"
153a2fc1e05SToby Isaac #define MATSOLVERSPQR            "spqr"
154c0cdd4a1SDahai Guo 
155b24902e0SBarry Smith /*E
156b24902e0SBarry Smith     MatFactorType - indicates what type of factorization is requested
157b24902e0SBarry Smith 
158b24902e0SBarry Smith     Level: beginner
159b24902e0SBarry Smith 
160af0996ceSBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
161b24902e0SBarry Smith 
162db781477SPatrick Sanan .seealso: `MatSolverType`, `MatGetFactor()`, `MatGetFactorAvailable()`, `MatSolverTypeRegister()`
163b24902e0SBarry Smith E*/
164*9371c9d4SSatish Balay typedef enum {
165*9371c9d4SSatish Balay   MAT_FACTOR_NONE,
166*9371c9d4SSatish Balay   MAT_FACTOR_LU,
167*9371c9d4SSatish Balay   MAT_FACTOR_CHOLESKY,
168*9371c9d4SSatish Balay   MAT_FACTOR_ILU,
169*9371c9d4SSatish Balay   MAT_FACTOR_ICC,
170*9371c9d4SSatish Balay   MAT_FACTOR_ILUDT,
171*9371c9d4SSatish Balay   MAT_FACTOR_QR,
172*9371c9d4SSatish Balay   MAT_FACTOR_NUM_TYPES
173*9371c9d4SSatish Balay } MatFactorType;
174014dd563SJed Brown PETSC_EXTERN const char *const MatFactorTypes[];
175e92e720dSBarry Smith 
176ea799195SBarry Smith PETSC_EXTERN PetscErrorCode MatGetFactor(Mat, MatSolverType, MatFactorType, Mat *);
177ea799195SBarry Smith PETSC_EXTERN PetscErrorCode MatGetFactorAvailable(Mat, MatSolverType, MatFactorType, PetscBool *);
178f73b0415SBarry Smith PETSC_EXTERN PetscErrorCode MatFactorGetCanUseOrdering(Mat, PetscBool *);
179*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatFactorGetCanUseOrdering() (since version 3.15)") static inline PetscErrorCode MatFactorGetUseOrdering(Mat A, PetscBool *b) {
180*9371c9d4SSatish Balay   return MatFactorGetCanUseOrdering(A, b);
181*9371c9d4SSatish Balay }
182ea799195SBarry Smith PETSC_EXTERN PetscErrorCode MatFactorGetSolverType(Mat, MatSolverType *);
183014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactorType(Mat, MatFactorType *);
1847abd51d3SMatthew G. Knepley PETSC_EXTERN PetscErrorCode MatSetFactorType(Mat, MatFactorType);
1852430ea28SJose E. Roman PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*MatSolverFunction)(Mat, MatFactorType, Mat *);
1862430ea28SJose E. Roman PETSC_EXTERN PetscErrorCode            MatSolverTypeRegister(MatSolverType, MatType, MatFactorType, MatSolverFunction);
1872430ea28SJose E. Roman PETSC_EXTERN PetscErrorCode            MatSolverTypeGet(MatSolverType, MatType, MatFactorType, PetscBool *, PetscBool *, MatSolverFunction *);
18825ef9dfeSBarry Smith typedef MatSolverType MatSolverPackage PETSC_DEPRECATED_TYPEDEF("Use MatSolverType (since version 3.9)");
189*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatSolverTypeRegister() (since version 3.9)") static inline PetscErrorCode MatSolverPackageRegister(MatSolverType stype, MatType mtype, MatFactorType ftype, MatSolverFunction f) {
190*9371c9d4SSatish Balay   return MatSolverTypeRegister(stype, mtype, ftype, f);
191*9371c9d4SSatish Balay }
192*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatSolverTypeGet() (since version 3.9)") static inline PetscErrorCode MatSolverPackageGet(MatSolverType stype, MatType mtype, MatFactorType ftype, PetscBool *foundmtype, PetscBool *foundstype, MatSolverFunction *f) {
193*9371c9d4SSatish Balay   return MatSolverTypeGet(stype, mtype, ftype, foundmtype, foundstype, f);
194*9371c9d4SSatish Balay }
1959989ab13SBarry Smith 
1964222ddf1SHong Zhang /*E
1974222ddf1SHong Zhang     MatProductType - indicates what type of matrix product is requested
1984222ddf1SHong Zhang 
1994222ddf1SHong Zhang     Level: beginner
2004222ddf1SHong Zhang 
201db781477SPatrick Sanan .seealso: `MatProductSetType()`
2024222ddf1SHong Zhang E*/
203*9371c9d4SSatish Balay typedef enum {
204*9371c9d4SSatish Balay   MATPRODUCT_UNSPECIFIED = 0,
205*9371c9d4SSatish Balay   MATPRODUCT_AB,
206*9371c9d4SSatish Balay   MATPRODUCT_AtB,
207*9371c9d4SSatish Balay   MATPRODUCT_ABt,
208*9371c9d4SSatish Balay   MATPRODUCT_PtAP,
209*9371c9d4SSatish Balay   MATPRODUCT_RARt,
210*9371c9d4SSatish Balay   MATPRODUCT_ABC
211*9371c9d4SSatish Balay } MatProductType;
212544a5e07SHong Zhang PETSC_EXTERN const char *const MatProductTypes[];
2134222ddf1SHong Zhang 
2144222ddf1SHong Zhang /*J
2154222ddf1SHong Zhang     MatProductAlgorithm - String with the name of an algorithm for a PETSc matrix product implementation
2164222ddf1SHong Zhang 
2174222ddf1SHong Zhang    Level: beginner
2184222ddf1SHong Zhang 
219db781477SPatrick Sanan .seealso: `MatSetType()`, `Mat`, `MatProductSetAlgorithm()`, `MatProductType`
2204222ddf1SHong Zhang J*/
2214222ddf1SHong Zhang typedef const char *MatProductAlgorithm;
2223e662e0bSHong Zhang #define MATPRODUCTALGORITHMDEFAULT         "default"
2233e662e0bSHong Zhang #define MATPRODUCTALGORITHMSORTED          "sorted"
2243e662e0bSHong Zhang #define MATPRODUCTALGORITHMSCALABLE        "scalable"
2253e662e0bSHong Zhang #define MATPRODUCTALGORITHMSCALABLEFAST    "scalable_fast"
2263e662e0bSHong Zhang #define MATPRODUCTALGORITHMHEAP            "heap"
2273e662e0bSHong Zhang #define MATPRODUCTALGORITHMBHEAP           "btheap"
2283e662e0bSHong Zhang #define MATPRODUCTALGORITHMLLCONDENSED     "llcondensed"
2293e662e0bSHong Zhang #define MATPRODUCTALGORITHMROWMERGE        "rowmerge"
2303e662e0bSHong Zhang #define MATPRODUCTALGORITHMOUTERPRODUCT    "outerproduct"
2313e662e0bSHong Zhang #define MATPRODUCTALGORITHMATB             "at*b"
2323e662e0bSHong Zhang #define MATPRODUCTALGORITHMRAP             "rap"
2333e662e0bSHong Zhang #define MATPRODUCTALGORITHMNONSCALABLE     "nonscalable"
2343e662e0bSHong Zhang #define MATPRODUCTALGORITHMSEQMPI          "seqmpi"
2353e662e0bSHong Zhang #define MATPRODUCTALGORITHMBACKEND         "backend"
2363e662e0bSHong Zhang #define MATPRODUCTALGORITHMOVERLAPPING     "overlapping"
2373e662e0bSHong Zhang #define MATPRODUCTALGORITHMMERGED          "merged"
2383e662e0bSHong Zhang #define MATPRODUCTALGORITHMALLATONCE       "allatonce"
2393e662e0bSHong Zhang #define MATPRODUCTALGORITHMALLATONCEMERGED "allatonce_merged"
2403e662e0bSHong Zhang #define MATPRODUCTALGORITHMALLGATHERV      "allgatherv"
2413e662e0bSHong Zhang #define MATPRODUCTALGORITHMCYCLIC          "cyclic"
2423e662e0bSHong Zhang #if defined(PETSC_HAVE_HYPRE)
2433e662e0bSHong Zhang #define MATPRODUCTALGORITHMHYPRE "hypre"
2443e662e0bSHong Zhang #endif
2454222ddf1SHong Zhang 
2464222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductCreate(Mat, Mat, Mat, Mat *);
2474222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductCreateWithMat(Mat, Mat, Mat, Mat);
2484222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductSetType(Mat, MatProductType);
2494222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductSetAlgorithm(Mat, MatProductAlgorithm);
2504222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductSetFill(Mat, PetscReal);
2514222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductSetFromOptions(Mat);
2524222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductSymbolic(Mat);
2534222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductNumeric(Mat);
2544222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatProductReplaceMats(Mat, Mat, Mat, Mat);
2554417c5e8SHong Zhang PETSC_EXTERN PetscErrorCode MatProductClear(Mat);
2566718818eSStefano Zampini PETSC_EXTERN PetscErrorCode MatProductView(Mat, PetscViewer);
257c600787bSStefano Zampini PETSC_EXTERN PetscErrorCode MatProductGetType(Mat, MatProductType *);
258c600787bSStefano Zampini PETSC_EXTERN PetscErrorCode MatProductGetMats(Mat, Mat *, Mat *, Mat *);
2594222ddf1SHong Zhang 
260c06d978dSMatthew Knepley /* Logging support */
2610700a824SBarry Smith #define MAT_FILE_CLASSID 1211216 /* used to indicate matrices in binary files */
262014dd563SJed Brown PETSC_EXTERN PetscClassId MAT_CLASSID;
263335efc43SPeter Brune PETSC_EXTERN PetscClassId MAT_COLORING_CLASSID;
264014dd563SJed Brown PETSC_EXTERN PetscClassId MAT_FDCOLORING_CLASSID;
265014dd563SJed Brown PETSC_EXTERN PetscClassId MAT_TRANSPOSECOLORING_CLASSID;
266014dd563SJed Brown PETSC_EXTERN PetscClassId MAT_PARTITIONING_CLASSID;
267014dd563SJed Brown PETSC_EXTERN PetscClassId MAT_COARSEN_CLASSID;
268014dd563SJed Brown PETSC_EXTERN PetscClassId MAT_NULLSPACE_CLASSID;
269014dd563SJed Brown PETSC_EXTERN PetscClassId MATMFFD_CLASSID;
270c06d978dSMatthew Knepley 
271ceb03754SKris Buschelman /*E
2727dae84e0SHong Zhang     MatReuse - Indicates if matrices obtained from a previous call to MatCreateSubMatrices(), MatCreateSubMatrix(), MatConvert() or several other functions
273cf37664fSBarry Smith      are to be reused to store the new matrix values.
274cf37664fSBarry Smith 
275cf37664fSBarry Smith $  MAT_INITIAL_MATRIX - create a new matrix
276cf37664fSBarry Smith $  MAT_REUSE_MATRIX - reuse the matrix created with a previous call that used MAT_INITIAL_MATRIX
277cf37664fSBarry Smith $  MAT_INPLACE_MATRIX - replace the first input matrix with the new matrix (not applicable to all functions)
278cf37664fSBarry Smith $  MAT_IGNORE_MATRIX - do not create a new matrix or reuse a give matrix, just ignore that matrix argument (not applicable to all functions)
279ceb03754SKris Buschelman 
280ceb03754SKris Buschelman     Level: beginner
281ceb03754SKris Buschelman 
282af0996ceSBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
283ceb03754SKris Buschelman 
284db781477SPatrick Sanan .seealso: `MatCreateSubMatrices()`, `MatCreateSubMatrix()`, `MatDestroyMatrices()`, `MatConvert()`
285ceb03754SKris Buschelman E*/
286*9371c9d4SSatish Balay typedef enum {
287*9371c9d4SSatish Balay   MAT_INITIAL_MATRIX,
288*9371c9d4SSatish Balay   MAT_REUSE_MATRIX,
289*9371c9d4SSatish Balay   MAT_IGNORE_MATRIX,
290*9371c9d4SSatish Balay   MAT_INPLACE_MATRIX
291*9371c9d4SSatish Balay } MatReuse;
292ceb03754SKris Buschelman 
2935494a064SHong Zhang /*E
2947dae84e0SHong Zhang     MatCreateSubMatrixOption - Indicates if matrices obtained from a call to MatCreateSubMatrices()
295446c23c1SPierre Jolivet      include the matrix values. Currently it is only used by MatGetSeqNonzeroStructure().
2965494a064SHong Zhang 
2975494a064SHong Zhang     Level: beginner
2985494a064SHong Zhang 
299db781477SPatrick Sanan .seealso: `MatGetSeqNonzeroStructure()`
3005494a064SHong Zhang E*/
301*9371c9d4SSatish Balay typedef enum {
302*9371c9d4SSatish Balay   MAT_DO_NOT_GET_VALUES,
303*9371c9d4SSatish Balay   MAT_GET_VALUES
304*9371c9d4SSatish Balay } MatCreateSubMatrixOption;
3055494a064SHong Zhang 
306607a6623SBarry Smith PETSC_EXTERN PetscErrorCode MatInitializePackage(void);
307c06d978dSMatthew Knepley 
308014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreate(MPI_Comm, Mat *);
309014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetSizes(Mat, PetscInt, PetscInt, PetscInt, PetscInt);
31019fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode MatSetType(Mat, MatType);
3110d229a57SStefano Zampini PETSC_EXTERN PetscErrorCode MatGetVecType(Mat, VecType *);
3120d229a57SStefano Zampini PETSC_EXTERN PetscErrorCode MatSetVecType(Mat, VecType);
313014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetFromOptions(Mat);
314fe2efc57SMark PETSC_EXTERN PetscErrorCode MatViewFromOptions(Mat, PetscObject, const char[]);
315bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode MatRegister(const char[], PetscErrorCode (*)(Mat));
31623bebc0bSBarry Smith PETSC_EXTERN PetscErrorCode MatRegisterRootName(const char[], const char[], const char[]);
317014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetOptionsPrefix(Mat, const char[]);
31826cc229bSBarry Smith PETSC_EXTERN PetscErrorCode MatSetOptionsPrefixFactor(Mat, const char[]);
31926cc229bSBarry Smith PETSC_EXTERN PetscErrorCode MatAppendOptionsPrefixFactor(Mat, const char[]);
320014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatAppendOptionsPrefix(Mat, const char[]);
321014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetOptionsPrefix(Mat, const char *[]);
32284d44b13SHong Zhang PETSC_EXTERN PetscErrorCode MatSetErrorIfFailure(Mat, PetscBool);
323f69a0ea3SMatthew Knepley 
324140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList MatList;
325140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList MatColoringList;
326140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList MatPartitioningList;
32728988994SBarry Smith 
3283b224e63SBarry Smith /*E
329aa6c7ce3SBarry Smith     MatStructure - Indicates if two matrices have the same nonzero structure
3303b224e63SBarry Smith 
3313b224e63SBarry Smith     Level: beginner
3323b224e63SBarry Smith 
333531d0c6aSBarry Smith $  SAME_NONZERO_PATTERN  - the two matrices have identical nonzero patterns
334531d0c6aSBarry Smith $  DIFFERENT_NONZERO_PATTERN - the two matrices may have different nonzero patterns
335531d0c6aSBarry Smith $  SUBSET_NONZERO_PATTERN - the nonzero pattern of the second matrix is a subset of the nonzero pattern of the first matrix
336531d0c6aSBarry Smith $  UNKNOWN_NONZERO_PATTERN - there is no known relationship between the nonzero patterns. In this case the implementations may try to detect a relationship to optimize the operation
337531d0c6aSBarry Smith 
338531d0c6aSBarry Smith    Developer Notes:
339d60b7d5cSBarry Smith      Any additions/changes here MUST also be made in src/mat/f90-mod/petscmat.h
3403b224e63SBarry Smith 
341db781477SPatrick Sanan .seealso: `MatCopy()`, `MatAXPY()`, `MatAYPX()`
3423b224e63SBarry Smith E*/
343*9371c9d4SSatish Balay typedef enum {
344*9371c9d4SSatish Balay   DIFFERENT_NONZERO_PATTERN,
345*9371c9d4SSatish Balay   SUBSET_NONZERO_PATTERN,
346*9371c9d4SSatish Balay   SAME_NONZERO_PATTERN,
347*9371c9d4SSatish Balay   UNKNOWN_NONZERO_PATTERN
348*9371c9d4SSatish Balay } MatStructure;
349d60b7d5cSBarry Smith PETSC_EXTERN const char *const MatStructures[];
3503b224e63SBarry Smith 
3519779e05dSSatish Balay #if defined                 PETSC_HAVE_MKL_SPARSE
352ddee360bSSatish Balay PETSC_EXTERN PetscErrorCode MatCreateSeqAIJMKL(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
353ddee360bSSatish Balay PETSC_EXTERN PetscErrorCode MatCreateMPIAIJMKL(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
35480095d54SIrina Sokolova PETSC_EXTERN PetscErrorCode MatCreateBAIJMKL(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
355ddee360bSSatish Balay PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJMKL(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
35680095d54SIrina Sokolova #endif
357cd929ea3SAlp Dener 
358d4002b98SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateSeqSELL(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
359d4002b98SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateSELL(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
360d4002b98SHong Zhang PETSC_EXTERN PetscErrorCode MatSeqSELLSetPreallocation(Mat, PetscInt, const PetscInt[]);
361d4002b98SHong Zhang PETSC_EXTERN PetscErrorCode MatMPISELLSetPreallocation(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[]);
36280095d54SIrina Sokolova 
363014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqDense(MPI_Comm, PetscInt, PetscInt, PetscScalar[], Mat *);
364014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateDense(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar[], Mat *);
365014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqAIJ(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
366014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateAIJ(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
367014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithArrays(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], Mat *);
3688f8f2f0dSBarry Smith PETSC_EXTERN PetscErrorCode MatUpdateMPIAIJWithArrays(Mat, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[]);
3696a3d2595SBarry Smith PETSC_EXTERN PetscErrorCode MatUpdateMPIAIJWithArray(Mat, const PetscScalar[]);
370014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithSplitArrays(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt[], PetscInt[], PetscScalar[], PetscInt[], PetscInt[], PetscScalar[], Mat *);
3713b00a383SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithSeqAIJ(MPI_Comm, Mat, Mat, const PetscInt[], Mat *);
3723b00a383SHong Zhang 
373014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJ(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
374014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateBAIJ(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
375014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIBAIJWithArrays(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], Mat *);
3767e8381f9SStefano Zampini 
377e8729f6fSJunchao Zhang PETSC_EXTERN PetscErrorCode MatSetPreallocationCOO(Mat, PetscCount, PetscInt[], PetscInt[]);
37882a78a4eSJed Brown PETSC_EXTERN PetscErrorCode MatSetPreallocationCOOLocal(Mat, PetscCount, PetscInt[], PetscInt[]);
3797e8381f9SStefano Zampini PETSC_EXTERN PetscErrorCode MatSetValuesCOO(Mat, const PetscScalar[], InsertMode);
380d21a29f3SJed Brown 
381014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIAdj(MPI_Comm, PetscInt, PetscInt, PetscInt[], PetscInt[], PetscInt[], Mat *);
382014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJ(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
383d21a29f3SJed Brown 
384014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSBAIJ(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
385014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPISBAIJWithArrays(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], Mat *);
38638f409ebSLisandro Dalcin PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetPreallocationCSR(Mat, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[]);
387014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocationCSR(Mat, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[]);
3884cce697cSJed Brown PETSC_EXTERN PetscErrorCode MatXAIJSetPreallocation(Mat, PetscInt, const PetscInt[], const PetscInt[], const PetscInt[], const PetscInt[]);
389dfb205c3SBarry Smith 
390014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateShell(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, void *, Mat *);
391c1fff1c6SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatCreateCentering(MPI_Comm, PetscInt, PetscInt, Mat *);
392014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateNormal(Mat, Mat *);
393c5e4d11fSDmitry Karpeev PETSC_EXTERN PetscErrorCode MatCreateNormalHermitian(Mat, Mat *);
394986c4d72SJose E. Roman PETSC_EXTERN PetscErrorCode MatCreateLRC(Mat, Mat, Vec, Mat, Mat *);
395267ca84cSJose E. Roman PETSC_EXTERN PetscErrorCode MatLRCGetMats(Mat, Mat *, Mat *, Vec *, Mat *);
396c5e4d11fSDmitry Karpeev PETSC_EXTERN PetscErrorCode MatCreateIS(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, ISLocalToGlobalMapping, ISLocalToGlobalMapping, Mat *);
397014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCRL(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
398014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIAIJCRL(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
399c0cdd4a1SDahai Guo 
400014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateScatter(MPI_Comm, VecScatter, Mat *);
401014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatScatterSetVecScatter(Mat, VecScatter);
402014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatScatterGetVecScatter(Mat, VecScatter *);
403014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateBlockMat(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt *, Mat *);
404014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCompositeAddMat(Mat, Mat);
405014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCompositeMerge(Mat);
406*9371c9d4SSatish Balay typedef enum {
407*9371c9d4SSatish Balay   MAT_COMPOSITE_MERGE_RIGHT,
408*9371c9d4SSatish Balay   MAT_COMPOSITE_MERGE_LEFT
409*9371c9d4SSatish Balay } MatCompositeMergeType;
4108c8613bfSJakub Kruzik PETSC_EXTERN PetscErrorCode MatCompositeSetMergeType(Mat, MatCompositeMergeType);
411014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateComposite(MPI_Comm, PetscInt, const Mat *, Mat *);
412*9371c9d4SSatish Balay typedef enum {
413*9371c9d4SSatish Balay   MAT_COMPOSITE_ADDITIVE,
414*9371c9d4SSatish Balay   MAT_COMPOSITE_MULTIPLICATIVE
415*9371c9d4SSatish Balay } MatCompositeType;
416014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCompositeSetType(Mat, MatCompositeType);
4176dbc55e5SJakub Kruzik PETSC_EXTERN PetscErrorCode MatCompositeGetType(Mat, MatCompositeType *);
4183b35acafSJakub Kruzik PETSC_EXTERN PetscErrorCode MatCompositeSetMatStructure(Mat, MatStructure);
4193b35acafSJakub Kruzik PETSC_EXTERN PetscErrorCode MatCompositeGetMatStructure(Mat, MatStructure *);
4206d0add67SJakub Kruzik PETSC_EXTERN PetscErrorCode MatCompositeGetNumberMat(Mat, PetscInt *);
4218b5c3584SJakub Kruzik PETSC_EXTERN PetscErrorCode MatCompositeGetMat(Mat, PetscInt, Mat *);
42203049c21SJunchao Zhang PETSC_EXTERN PetscErrorCode MatCompositeSetScalings(Mat, const PetscScalar *);
4236d7c1e57SBarry Smith 
42419fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode MatCreateFFT(MPI_Comm, PetscInt, const PetscInt[], MatType, Mat *);
425014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqCUFFT(MPI_Comm, PetscInt, const PetscInt[], Mat *);
426dedccee8SHong Zhang 
427014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateTranspose(Mat, Mat *);
4288060fb66Sstefano_zampini PETSC_EXTERN PetscErrorCode MatTransposeGetMat(Mat, Mat *);
429d0de2241SAndrew Spott PETSC_EXTERN PetscErrorCode MatCreateHermitianTranspose(Mat, Mat *);
43006511a5cSPierre Jolivet PETSC_EXTERN PetscErrorCode MatHermitianTransposeGetMat(Mat, Mat *);
431fa80d070SPierre Jolivet PETSC_EXTERN PetscErrorCode MatNormalGetMat(Mat, Mat *);
43265f45395SPierre Jolivet PETSC_EXTERN PetscErrorCode MatNormalHermitianGetMat(Mat, Mat *);
43354e05e6cSHong Zhang PETSC_EXTERN PetscErrorCode MatCreateSubMatrixVirtual(Mat, IS, IS, Mat *);
43454e05e6cSHong Zhang PETSC_EXTERN PetscErrorCode MatSubMatrixVirtualUpdate(Mat, Mat, IS, IS);
435014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateLocalRef(Mat, IS, IS, Mat *);
4363423f386SBarry Smith PETSC_EXTERN PetscErrorCode MatCreateConstantDiagonal(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar, Mat *);
4371472f72bSBarry Smith 
438978814f1SStefano Zampini #if defined(PETSC_HAVE_HYPRE)
439d975228cSstefano_zampini PETSC_EXTERN PetscErrorCode MatHYPRESetPreallocation(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[]);
440978814f1SStefano Zampini #endif
441978814f1SStefano Zampini 
442014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPythonSetType(Mat, const char[]);
443ebead697SStefano Zampini PETSC_EXTERN PetscErrorCode MatPythonGetType(Mat, const char *[]);
4441d6018f0SLisandro Dalcin 
445846b4da1SFande Kong PETSC_EXTERN PetscErrorCode MatResetPreallocation(Mat);
446014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetUp(Mat);
447014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDestroy(Mat *);
448e56f5c9eSBarry Smith PETSC_EXTERN PetscErrorCode MatGetNonzeroState(Mat, PetscObjectState *);
44921c89e3eSBarry Smith 
450014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatConjugate(Mat);
451014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatRealPart(Mat);
452014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatImaginaryPart(Mat);
453014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetDiagonalBlock(Mat, Mat *);
454014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetTrace(Mat, PetscScalar *);
455713ccfa9SJed Brown PETSC_EXTERN PetscErrorCode MatInvertBlockDiagonal(Mat, const PetscScalar **);
4560da83c2eSBarry Smith PETSC_EXTERN PetscErrorCode MatInvertVariableBlockDiagonal(Mat, PetscInt, const PetscInt *, PetscScalar *);
457479a70c0SJed Brown PETSC_EXTERN PetscErrorCode MatInvertBlockDiagonalMat(Mat, Mat);
4588a9c020eSBarry Smith PETSC_EXTERN PetscErrorCode MatInvertVariableBlockEnvelope(Mat, MatReuse, Mat *);
45999cafbc1SBarry Smith 
4608ed539a5SBarry Smith /* ------------------------------------------------------------*/
461014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValues(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
4628a9c020eSBarry Smith PETSC_EXTERN PetscErrorCode MatSetValuesIS(Mat, IS, IS, const PetscScalar[], InsertMode);
463014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesBlocked(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
464014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesRow(Mat, PetscInt, const PetscScalar[]);
465014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesRowLocal(Mat, PetscInt, const PetscScalar[]);
466014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesBatch(Mat, PetscInt, PetscInt, PetscInt[], const PetscScalar[]);
46773a71a0fSBarry Smith PETSC_EXTERN PetscErrorCode MatSetRandom(Mat, PetscRandom);
46884cb2905SBarry Smith 
4692ef4de8bSBarry Smith /*S
4702ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
47187497f52SBarry Smith         column of a matrix as indexed on an associated grid. These are arguments to `MatSetStencil()` and `MatSetBlockStencil()`
47262ef0227SBarry Smith 
47362ef0227SBarry Smith    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).
47487497f52SBarry Smith    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.
47562ef0227SBarry Smith 
47687497f52SBarry Smith    For stencil access to vectors see `DMDAVecGetArray()`, `DMDAVecGetArrayF90()`.
477be479b30SJed Brown 
47887497f52SBarry Smith    Fortran usage is different, see `MatSetValuesStencil()` for details.
4792ef4de8bSBarry Smith 
4802ef4de8bSBarry Smith    Level: beginner
4812ef4de8bSBarry Smith 
482db781477SPatrick Sanan .seealso: `MatSetValuesStencil()`, `MatSetStencil()`, `MatSetValuesBlockedStencil()`, `DMDAVecGetArray()`, `DMDAVecGetArrayF90()`
4832ef4de8bSBarry Smith S*/
484435da068SBarry Smith typedef struct {
485c1ac3661SBarry Smith   PetscInt k, j, i, c;
486435da068SBarry Smith } MatStencil;
4872ef4de8bSBarry Smith 
488014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesStencil(Mat, PetscInt, const MatStencil[], PetscInt, const MatStencil[], const PetscScalar[], InsertMode);
489014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesBlockedStencil(Mat, PetscInt, const MatStencil[], PetscInt, const MatStencil[], const PetscScalar[], InsertMode);
490014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetStencil(Mat, PetscInt, const PetscInt[], const PetscInt[], PetscInt);
491435da068SBarry Smith 
492d91e6319SBarry Smith /*E
49387497f52SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, for example in a solver, or if you plan
49462ef0227SBarry Smith      to continue to add or insert values to it
495d91e6319SBarry Smith 
496d91e6319SBarry Smith     Level: beginner
497d91e6319SBarry Smith 
498db781477SPatrick Sanan .seealso: `MatAssemblyBegin()`, `MatAssemblyEnd()`
499d91e6319SBarry Smith E*/
500*9371c9d4SSatish Balay typedef enum {
501*9371c9d4SSatish Balay   MAT_FLUSH_ASSEMBLY = 1,
502*9371c9d4SSatish Balay   MAT_FINAL_ASSEMBLY = 0
503*9371c9d4SSatish Balay } MatAssemblyType;
504014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatAssemblyBegin(Mat, MatAssemblyType);
505014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatAssemblyEnd(Mat, MatAssemblyType);
506014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatAssembled(Mat, PetscBool *);
5074f9c727eSBarry Smith 
508d91e6319SBarry Smith /*E
509d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
510d91e6319SBarry Smith 
511d91e6319SBarry Smith     Level: beginner
512d91e6319SBarry Smith 
51395452b02SPatrick Sanan    Developer Notes:
51495452b02SPatrick Sanan    Entries that are negative need not be called collectively by all processes.
515382164b0SBarry Smith 
51687497f52SBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
51787497f52SBarry Smith 
51887497f52SBarry Smith    Any additions/changes here must also be made in src/mat/interface/dlregismat.c in MatOptions[]
51987497f52SBarry Smith 
520db781477SPatrick Sanan .seealso: `MatSetOption()`
521d91e6319SBarry Smith E*/
522*9371c9d4SSatish Balay typedef enum {
523*9371c9d4SSatish Balay   MAT_OPTION_MIN                  = -3,
524c5e4d11fSDmitry Karpeev   MAT_UNUSED_NONZERO_LOCATION_ERR = -2,
52592d4d306SBarry Smith   MAT_ROW_ORIENTED                = -1,
526382164b0SBarry Smith   MAT_SYMMETRIC                   = 1,
527382164b0SBarry Smith   MAT_STRUCTURALLY_SYMMETRIC      = 2,
5288c78258cSHong Zhang   MAT_FORCE_DIAGONAL_ENTRIES      = 3,
529382164b0SBarry Smith   MAT_IGNORE_OFF_PROC_ENTRIES     = 4,
530382164b0SBarry Smith   MAT_USE_HASH_TABLE              = 5,
531382164b0SBarry Smith   MAT_KEEP_NONZERO_PATTERN        = 6,
532382164b0SBarry Smith   MAT_IGNORE_ZERO_ENTRIES         = 7,
533382164b0SBarry Smith   MAT_USE_INODES                  = 8,
534382164b0SBarry Smith   MAT_HERMITIAN                   = 9,
535382164b0SBarry Smith   MAT_SYMMETRY_ETERNAL            = 10,
536c5e4d11fSDmitry Karpeev   MAT_NEW_NONZERO_LOCATION_ERR    = 11,
537382164b0SBarry Smith   MAT_IGNORE_LOWER_TRIANGULAR     = 12,
538382164b0SBarry Smith   MAT_ERROR_LOWER_TRIANGULAR      = 13,
539382164b0SBarry Smith   MAT_GETROW_UPPERTRIANGULAR      = 14,
540382164b0SBarry Smith   MAT_SPD                         = 15,
54192d4d306SBarry Smith   MAT_NO_OFF_PROC_ZERO_ROWS       = 16,
54292d4d306SBarry Smith   MAT_NO_OFF_PROC_ENTRIES         = 17,
54392d4d306SBarry Smith   MAT_NEW_NONZERO_LOCATIONS       = 18,
544c5e4d11fSDmitry Karpeev   MAT_NEW_NONZERO_ALLOCATION_ERR  = 19,
545c5e4d11fSDmitry Karpeev   MAT_SUBSET_OFF_PROC_ENTRIES     = 20,
546c10200c1SHong Zhang   MAT_SUBMAT_SINGLEIS             = 21,
547957cac9fSHong Zhang   MAT_STRUCTURE_ONLY              = 22,
548071fcb05SBarry Smith   MAT_SORTED_FULL                 = 23,
5491a2c6b5cSJunchao Zhang   MAT_FORM_EXPLICIT_TRANSPOSE     = 24,
550b94d7dedSBarry Smith   MAT_STRUCTURAL_SYMMETRY_ETERNAL = 25,
551b94d7dedSBarry Smith   MAT_SPD_ETERNAL                 = 26,
552*9371c9d4SSatish Balay   MAT_OPTION_MAX                  = 27
553*9371c9d4SSatish Balay } MatOption;
554e057df02SPaul Mullowney 
5550f8fb01aSBarry Smith PETSC_EXTERN const char *const *MatOptions;
556014dd563SJed Brown PETSC_EXTERN PetscErrorCode     MatSetOption(Mat, MatOption, PetscBool);
5577d68702bSBarry Smith PETSC_EXTERN PetscErrorCode     MatGetOption(Mat, MatOption, PetscBool *);
558856afa8bSStefano Zampini PETSC_EXTERN PetscErrorCode     MatPropagateSymmetryOptions(Mat, Mat);
55919fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode     MatGetType(Mat, MatType *);
56084cb2905SBarry Smith 
561014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatGetValues(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[], PetscScalar[]);
562014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatGetRow(Mat, PetscInt, PetscInt *, const PetscInt *[], const PetscScalar *[]);
563014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatRestoreRow(Mat, PetscInt, PetscInt *, const PetscInt *[], const PetscScalar *[]);
564014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatGetRowUpperTriangular(Mat);
565014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatRestoreRowUpperTriangular(Mat);
566014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatGetColumnVector(Mat, Vec, PetscInt);
5678c778c55SBarry Smith PETSC_EXTERN PetscErrorCode    MatSeqAIJGetArray(Mat, PetscScalar *[]);
5688f1ea47aSStefano Zampini PETSC_EXTERN PetscErrorCode    MatSeqAIJGetArrayRead(Mat, const PetscScalar *[]);
569d67d9f35SJunchao Zhang PETSC_EXTERN PetscErrorCode    MatSeqAIJGetArrayWrite(Mat, PetscScalar *[]);
5708c778c55SBarry Smith PETSC_EXTERN PetscErrorCode    MatSeqAIJRestoreArray(Mat, PetscScalar *[]);
5718f1ea47aSStefano Zampini PETSC_EXTERN PetscErrorCode    MatSeqAIJRestoreArrayRead(Mat, const PetscScalar *[]);
572d67d9f35SJunchao Zhang PETSC_EXTERN PetscErrorCode    MatSeqAIJRestoreArrayWrite(Mat, PetscScalar *[]);
57321e72a00SBarry Smith PETSC_EXTERN PetscErrorCode    MatSeqAIJGetMaxRowNonzeros(Mat, PetscInt *);
574bd04181cSBarry Smith PETSC_EXTERN PetscErrorCode    MatSeqAIJSetValuesLocalFast(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
5754099cc6bSBarry Smith PETSC_EXTERN PetscErrorCode    MatSeqAIJSetType(Mat, MatType);
576ad7e164aSPierre Jolivet PETSC_EXTERN PetscErrorCode    MatSeqAIJKron(Mat, Mat, MatReuse, Mat *);
577388d47a6SSatish Balay PETSC_EXTERN PetscErrorCode    MatSeqAIJRegister(const char[], PetscErrorCode (*)(Mat, MatType, MatReuse, Mat *));
5784099cc6bSBarry Smith PETSC_EXTERN PetscFunctionList MatSeqAIJList;
579cda14afcSprj- PETSC_EXTERN PetscErrorCode    MatSeqBAIJGetArray(Mat, PetscScalar *[]);
580cda14afcSprj- PETSC_EXTERN PetscErrorCode    MatSeqBAIJRestoreArray(Mat, PetscScalar *[]);
5818397e458SBarry Smith PETSC_EXTERN PetscErrorCode    MatSeqSBAIJGetArray(Mat, PetscScalar *[]);
5828397e458SBarry Smith PETSC_EXTERN PetscErrorCode    MatSeqSBAIJRestoreArray(Mat, PetscScalar *[]);
5838c778c55SBarry Smith PETSC_EXTERN PetscErrorCode    MatDenseGetArray(Mat, PetscScalar *[]);
5848c778c55SBarry Smith PETSC_EXTERN PetscErrorCode    MatDenseRestoreArray(Mat, PetscScalar *[]);
585d3042a70SBarry Smith PETSC_EXTERN PetscErrorCode    MatDensePlaceArray(Mat, const PetscScalar[]);
586d5ea218eSStefano Zampini PETSC_EXTERN PetscErrorCode    MatDenseReplaceArray(Mat, const PetscScalar[]);
587d3042a70SBarry Smith PETSC_EXTERN PetscErrorCode    MatDenseResetArray(Mat);
5888572280aSBarry Smith PETSC_EXTERN PetscErrorCode    MatDenseGetArrayRead(Mat, const PetscScalar *[]);
5898572280aSBarry Smith PETSC_EXTERN PetscErrorCode    MatDenseRestoreArrayRead(Mat, const PetscScalar *[]);
5906947451fSStefano Zampini PETSC_EXTERN PetscErrorCode    MatDenseGetArrayWrite(Mat, PetscScalar *[]);
5916947451fSStefano Zampini PETSC_EXTERN PetscErrorCode    MatDenseRestoreArrayWrite(Mat, PetscScalar *[]);
592014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatGetBlockSize(Mat, PetscInt *);
593014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatSetBlockSize(Mat, PetscInt);
594014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatGetBlockSizes(Mat, PetscInt *, PetscInt *);
595014dd563SJed Brown PETSC_EXTERN PetscErrorCode    MatSetBlockSizes(Mat, PetscInt, PetscInt);
59633d57670SJed Brown PETSC_EXTERN PetscErrorCode    MatSetBlockSizesFromMats(Mat, Mat, Mat);
5970da83c2eSBarry Smith PETSC_EXTERN PetscErrorCode    MatSetVariableBlockSizes(Mat, PetscInt, PetscInt *);
5980da83c2eSBarry Smith PETSC_EXTERN PetscErrorCode    MatGetVariableBlockSizes(Mat, PetscInt *, const PetscInt **);
5990da83c2eSBarry Smith 
60086aefd0dSHong Zhang PETSC_EXTERN PetscErrorCode MatDenseGetColumn(Mat, PetscInt, PetscScalar *[]);
60186aefd0dSHong Zhang PETSC_EXTERN PetscErrorCode MatDenseRestoreColumn(Mat, PetscScalar *[]);
6026947451fSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseGetColumnVec(Mat, PetscInt, Vec *);
6036947451fSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseRestoreColumnVec(Mat, PetscInt, Vec *);
6046947451fSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseGetColumnVecRead(Mat, PetscInt, Vec *);
6056947451fSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseRestoreColumnVecRead(Mat, PetscInt, Vec *);
6066947451fSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseGetColumnVecWrite(Mat, PetscInt, Vec *);
6076947451fSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseRestoreColumnVecWrite(Mat, PetscInt, Vec *);
608a2748737SPierre Jolivet PETSC_EXTERN PetscErrorCode MatDenseGetSubMatrix(Mat, PetscInt, PetscInt, PetscInt, PetscInt, Mat *);
6095ea7661aSPierre Jolivet PETSC_EXTERN PetscErrorCode MatDenseRestoreSubMatrix(Mat, Mat *);
6101620fd73SBarry Smith 
611014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMult(Mat, Vec, Vec);
612014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultDiagonalBlock(Mat, Vec, Vec);
613014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultAdd(Mat, Vec, Vec, Vec);
614014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultTranspose(Mat, Vec, Vec);
615014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultHermitianTranspose(Mat, Vec, Vec);
616014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIsTranspose(Mat, Mat, PetscReal, PetscBool *);
617014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIsHermitianTranspose(Mat, Mat, PetscReal, PetscBool *);
618014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultTransposeAdd(Mat, Vec, Vec, Vec);
619014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultHermitianTransposeAdd(Mat, Vec, Vec, Vec);
620014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMatSolve(Mat, Mat, Mat);
621bdc285e1SStefano Zampini PETSC_EXTERN PetscErrorCode MatMatSolveTranspose(Mat, Mat, Mat);
622eb3ef3b2SHong Zhang PETSC_EXTERN PetscErrorCode MatMatTransposeSolve(Mat, Mat, Mat);
623f9426fe0SMark Adams PETSC_EXTERN PetscErrorCode MatResidual(Mat, Vec, Vec, Vec);
624f5edf698SHong Zhang 
625d91e6319SBarry Smith /*E
626d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
627d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
628d91e6319SBarry Smith 
629d91e6319SBarry Smith     Level: beginner
630d91e6319SBarry Smith 
631af0996ceSBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
632d91e6319SBarry Smith 
63387497f52SBarry Smith $   `MAT_DO_NOT_COPY_VALUES`    - Create a matrix using the same nonzero pattern as the original matrix,
6340018da39SRichard Tran Mills $                               with zeros for the numerical values.
63587497f52SBarry Smith $   `MAT_COPY_VALUES`           - Create a matrix with the same nonzero pattern as the original matrix
6360018da39SRichard Tran Mills $                               and with the same numerical values.
63787497f52SBarry Smith $   `MAT_SHARE_NONZERO_PATTERN` - Create a matrix that shares the nonzero structure with the previous matrix
6380018da39SRichard Tran Mills $                               and does not copy it, using zeros for the numerical values. The parent and
6390018da39SRichard Tran Mills $                               child matrices will share their index (i and j) arrays, and you cannot
6400018da39SRichard Tran Mills $                               insert new nonzero entries into either matrix.
6410018da39SRichard Tran Mills 
64287497f52SBarry Smith   Note:
64387497f52SBarry Smith   Many matrix types (including `MATSEQAIJ`) do not support the `MAT_SHARE_NONZERO_PATTERN` optimization; in
64487497f52SBarry Smith   this case the behavior is as if `MAT_DO_NOT_COPY_VALUES` has been specified.
64570dcbbb9SBarry Smith 
646db781477SPatrick Sanan .seealso: `MatDuplicate()`
647d91e6319SBarry Smith E*/
648*9371c9d4SSatish Balay typedef enum {
649*9371c9d4SSatish Balay   MAT_DO_NOT_COPY_VALUES,
650*9371c9d4SSatish Balay   MAT_COPY_VALUES,
651*9371c9d4SSatish Balay   MAT_SHARE_NONZERO_PATTERN
652*9371c9d4SSatish Balay } MatDuplicateOption;
6532e8a6d31SBarry Smith 
65419fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode MatConvert(Mat, MatType, MatReuse, Mat *);
655014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDuplicate(Mat, MatDuplicateOption, Mat *);
65694a9d846SBarry Smith 
657014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCopy(Mat, Mat, MatStructure);
658014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatView(Mat, PetscViewer);
659014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIsSymmetric(Mat, PetscReal, PetscBool *);
660014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIsStructurallySymmetric(Mat, PetscBool *);
661014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIsHermitian(Mat, PetscReal, PetscBool *);
662014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIsSymmetricKnown(Mat, PetscBool *, PetscBool *);
663014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIsHermitianKnown(Mat, PetscBool *, PetscBool *);
664b94d7dedSBarry Smith PETSC_EXTERN PetscErrorCode MatIsStructurallySymmetricKnown(Mat, PetscBool *, PetscBool *);
665b94d7dedSBarry Smith PETSC_EXTERN PetscErrorCode MatIsSPDKnown(Mat, PetscBool *, PetscBool *);
666014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMissingDiagonal(Mat, PetscBool *, PetscInt *);
667014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatLoad(Mat, PetscViewer);
6687b80b807SBarry Smith 
6691a83f524SJed Brown PETSC_EXTERN PetscErrorCode MatGetRowIJ(Mat, PetscInt, PetscBool, PetscBool, PetscInt *, const PetscInt *[], const PetscInt *[], PetscBool *);
6701a83f524SJed Brown PETSC_EXTERN PetscErrorCode MatRestoreRowIJ(Mat, PetscInt, PetscBool, PetscBool, PetscInt *, const PetscInt *[], const PetscInt *[], PetscBool *);
6711a83f524SJed Brown PETSC_EXTERN PetscErrorCode MatGetColumnIJ(Mat, PetscInt, PetscBool, PetscBool, PetscInt *, const PetscInt *[], const PetscInt *[], PetscBool *);
6721a83f524SJed Brown PETSC_EXTERN PetscErrorCode MatRestoreColumnIJ(Mat, PetscInt, PetscBool, PetscBool, PetscInt *, const PetscInt *[], const PetscInt *[], PetscBool *);
673d4fbbf0eSBarry Smith 
674d91e6319SBarry Smith /*S
67587497f52SBarry Smith      MatInfo - Context of matrix information, used with `MatGetInfo()`
676d91e6319SBarry Smith 
67787497f52SBarry Smith    In Fortran this is simply a double precision array of dimension `MAT_INFO_SIZE`
678d91e6319SBarry Smith 
679d91e6319SBarry Smith    Level: intermediate
680d91e6319SBarry Smith 
681db781477SPatrick Sanan .seealso: `MatGetInfo()`, `MatInfoType`
682d91e6319SBarry Smith S*/
6834e220ebcSLois Curfman McInnes typedef struct {
684b0a32e0cSBarry Smith   PetscLogDouble block_size;                          /* block size */
685b0a32e0cSBarry Smith   PetscLogDouble nz_allocated, nz_used, nz_unneeded;  /* number of nonzeros */
686b0a32e0cSBarry Smith   PetscLogDouble memory;                              /* memory allocated */
687b0a32e0cSBarry Smith   PetscLogDouble assemblies;                          /* number of matrix assemblies called */
688b0a32e0cSBarry Smith   PetscLogDouble mallocs;                             /* number of mallocs during MatSetValues() */
689b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given, fill_ratio_needed; /* fill ratio for LU/ILU */
690b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                      /* number of mallocs during factorization */
6914e220ebcSLois Curfman McInnes } MatInfo;
6924e220ebcSLois Curfman McInnes 
693d9274352SBarry Smith /*E
694d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
695d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
696d9274352SBarry Smith 
697d9274352SBarry Smith     Level: beginner
698d9274352SBarry Smith 
699af0996ceSBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
700d9274352SBarry Smith 
701db781477SPatrick Sanan .seealso: `MatGetInfo()`, `MatInfo`
702d9274352SBarry Smith E*/
703*9371c9d4SSatish Balay typedef enum {
704*9371c9d4SSatish Balay   MAT_LOCAL      = 1,
705*9371c9d4SSatish Balay   MAT_GLOBAL_MAX = 2,
706*9371c9d4SSatish Balay   MAT_GLOBAL_SUM = 3
707*9371c9d4SSatish Balay } MatInfoType;
708014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetInfo(Mat, MatInfoType, MatInfo *);
709014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetDiagonal(Mat, Vec);
710014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetRowMax(Mat, Vec, PetscInt[]);
711014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetRowMin(Mat, Vec, PetscInt[]);
712014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetRowMaxAbs(Mat, Vec, PetscInt[]);
713014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetRowMinAbs(Mat, Vec, PetscInt[]);
714014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetRowSum(Mat, Vec);
715014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatTranspose(Mat, MatReuse, Mat *);
7167fb60732SBarry Smith PETSC_EXTERN PetscErrorCode MatTransposeSymbolic(Mat, Mat *);
7177fb60732SBarry Smith PETSC_EXTERN PetscErrorCode MatTransposeSetPrecursor(Mat, Mat);
718014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatHermitianTranspose(Mat, MatReuse, Mat *);
719014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPermute(Mat, IS, IS, Mat *);
720014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDiagonalScale(Mat, Vec, Vec);
721014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDiagonalSet(Mat, Vec, InsertMode);
722a52676ecSHong Zhang 
723014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatEqual(Mat, Mat, PetscBool *);
724014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultEqual(Mat, Mat, PetscInt, PetscBool *);
725014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultAddEqual(Mat, Mat, PetscInt, PetscBool *);
726014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultTransposeEqual(Mat, Mat, PetscInt, PetscBool *);
727014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMultTransposeAddEqual(Mat, Mat, PetscInt, PetscBool *);
728e573050aSPierre Jolivet PETSC_EXTERN PetscErrorCode MatMultHermitianTransposeEqual(Mat, Mat, PetscInt, PetscBool *);
729e573050aSPierre Jolivet PETSC_EXTERN PetscErrorCode MatMultHermitianTransposeAddEqual(Mat, Mat, PetscInt, PetscBool *);
730a52676ecSHong Zhang PETSC_EXTERN PetscErrorCode MatMatMultEqual(Mat, Mat, Mat, PetscInt, PetscBool *);
731a52676ecSHong Zhang PETSC_EXTERN PetscErrorCode MatTransposeMatMultEqual(Mat, Mat, Mat, PetscInt, PetscBool *);
732cc48ffa7SToby Isaac PETSC_EXTERN PetscErrorCode MatMatTransposeMultEqual(Mat, Mat, Mat, PetscInt, PetscBool *);
7334222ddf1SHong Zhang PETSC_EXTERN PetscErrorCode MatPtAPMultEqual(Mat, Mat, Mat, PetscInt, PetscBool *);
734447fed29SStefano Zampini PETSC_EXTERN PetscErrorCode MatRARtMultEqual(Mat, Mat, Mat, PetscInt, PetscBool *);
73586919fd6SHong Zhang PETSC_EXTERN PetscErrorCode MatIsLinear(Mat, PetscInt, PetscBool *);
7367b80b807SBarry Smith 
737014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNorm(Mat, NormType, PetscReal *);
738014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetColumnNorms(Mat, NormType, PetscReal *);
739857cbf51SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetColumnSums(Mat, PetscScalar *);
740857cbf51SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetColumnSumsRealPart(Mat, PetscReal *);
741857cbf51SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetColumnSumsImaginaryPart(Mat, PetscReal *);
742857cbf51SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetColumnMeans(Mat, PetscScalar *);
743857cbf51SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetColumnMeansRealPart(Mat, PetscReal *);
744857cbf51SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetColumnMeansImaginaryPart(Mat, PetscReal *);
745857cbf51SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetColumnReductions(Mat, PetscInt, PetscReal *);
746014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroEntries(Mat);
7471b2b9847SBarry Smith PETSC_EXTERN PetscErrorCode MatSetInf(Mat);
748014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRows(Mat, PetscInt, const PetscInt[], PetscScalar, Vec, Vec);
749014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsIS(Mat, IS, PetscScalar, Vec, Vec);
750014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsStencil(Mat, PetscInt, const MatStencil[], PetscScalar, Vec, Vec);
751014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsStencil(Mat, PetscInt, const MatStencil[], PetscScalar, Vec, Vec);
752014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsColumns(Mat, PetscInt, const PetscInt[], PetscScalar, Vec, Vec);
753014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsIS(Mat, IS, PetscScalar, Vec, Vec);
7547b80b807SBarry Smith 
755014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetSize(Mat, PetscInt *, PetscInt *);
756014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetLocalSize(Mat, PetscInt *, PetscInt *);
757014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetOwnershipRange(Mat, PetscInt *, PetscInt *);
758014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetOwnershipRanges(Mat, const PetscInt **);
759014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetOwnershipRangeColumn(Mat, PetscInt *, PetscInt *);
760014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetOwnershipRangesColumn(Mat, const PetscInt **);
761566876eaSJed Brown PETSC_EXTERN PetscErrorCode MatGetOwnershipIS(Mat, IS *, IS *);
7625ef9f2a5SBarry Smith 
7637dae84e0SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateSubMatrices(Mat, PetscInt, const IS[], const IS[], MatReuse, Mat *[]);
764*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatCreateSubMatrices() (since version 3.8)") static inline PetscErrorCode MatGetSubMatrices(Mat mat, PetscInt n, const IS irow[], const IS icol[], MatReuse scall, Mat *submat[]) {
765*9371c9d4SSatish Balay   return MatCreateSubMatrices(mat, n, irow, icol, scall, submat);
766*9371c9d4SSatish Balay }
7677dae84e0SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateSubMatricesMPI(Mat, PetscInt, const IS[], const IS[], MatReuse, Mat *[]);
768*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatCreateSubMatricesMPI() (since version 3.8)") static inline PetscErrorCode MatGetSubMatricesMPI(Mat mat, PetscInt n, const IS irow[], const IS icol[], MatReuse scall, Mat *submat[]) {
769*9371c9d4SSatish Balay   return MatCreateSubMatricesMPI(mat, n, irow, icol, scall, submat);
770*9371c9d4SSatish Balay }
771014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDestroyMatrices(PetscInt, Mat *[]);
772df750dc8SHong Zhang PETSC_EXTERN PetscErrorCode MatDestroySubMatrices(PetscInt, Mat *[]);
7737dae84e0SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateSubMatrix(Mat, IS, IS, MatReuse, Mat *);
774*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatCreateSubMatrix() (since version 3.8)") static inline PetscErrorCode MatGetSubMatrix(Mat mat, IS isrow, IS iscol, MatReuse cll, Mat *newmat) {
775*9371c9d4SSatish Balay   return MatCreateSubMatrix(mat, isrow, iscol, cll, newmat);
776*9371c9d4SSatish Balay }
777014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetLocalSubMatrix(Mat, IS, IS, Mat *);
778014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatRestoreLocalSubMatrix(Mat, IS, IS, Mat *);
779014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetSeqNonzeroStructure(Mat, Mat *);
780014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDestroySeqNonzeroStructure(Mat *);
7817b80b807SBarry Smith 
782014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJ(MPI_Comm, Mat, PetscInt, PetscInt, MatReuse, Mat *);
783014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJSymbolic(MPI_Comm, Mat, PetscInt, PetscInt, Mat *);
784014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJNumeric(Mat, Mat);
785014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMat(Mat, MatReuse, Mat *);
7868a9c020eSBarry Smith PETSC_EXTERN PetscErrorCode MatAIJGetLocalMat(Mat, Mat *);
787014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMatCondensed(Mat, MatReuse, IS *, IS *, Mat *);
788ed502f03SStefano Zampini PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMatMerge(Mat, MatReuse, IS *, Mat *);
789f2afee66SBarry Smith PETSC_EXTERN PetscErrorCode MatMPIAIJGetNumberNonzeros(Mat, PetscCount *);
790014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetBrowsOfAcols(Mat, Mat, MatReuse, IS *, IS *, Mat *);
791014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetGhosts(Mat, PetscInt *, const PetscInt *[]);
7928efafbd8SBarry Smith 
793014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatIncreaseOverlap(Mat, PetscInt, IS[], PetscInt);
794aa1e27eaSFande Kong PETSC_EXTERN PetscErrorCode MatIncreaseOverlapSplit(Mat mat, PetscInt n, IS is[], PetscInt ov);
795d2b2a242SBarry Smith PETSC_EXTERN PetscErrorCode MatMPIAIJSetUseScalableIncreaseOverlap(Mat, PetscBool);
7967b80b807SBarry Smith 
797014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMatMult(Mat, Mat, MatReuse, PetscReal, Mat *);
79822440eb1SKris Buschelman 
7997bab7c10SHong Zhang PETSC_EXTERN PetscErrorCode MatMatMatMult(Mat, Mat, Mat, MatReuse, PetscReal, Mat *);
8002df6c5c3SPatrick Farrell PETSC_EXTERN PetscErrorCode MatGalerkin(Mat, Mat, Mat, MatReuse, PetscReal, Mat *);
8017bab7c10SHong Zhang 
802014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPtAP(Mat, Mat, MatReuse, PetscReal, Mat *);
803014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatRARt(Mat, Mat, MatReuse, PetscReal, Mat *);
80422440eb1SKris Buschelman 
805014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatTransposeMatMult(Mat, Mat, MatReuse, PetscReal, Mat *);
806014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMatTransposeMult(Mat, Mat, MatReuse, PetscReal, Mat *);
807bc011b1eSHong Zhang 
808014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatAXPY(Mat, PetscScalar, Mat, MatStructure);
809014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatAYPX(Mat, PetscScalar, Mat, MatStructure);
8101c741599SHong Zhang 
811014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatScale(Mat, PetscScalar);
812014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatShift(Mat, PetscScalar);
8137b80b807SBarry Smith 
814014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetLocalToGlobalMapping(Mat, ISLocalToGlobalMapping, ISLocalToGlobalMapping);
815014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetLocalToGlobalMapping(Mat, ISLocalToGlobalMapping *, ISLocalToGlobalMapping *);
816a93ff8c4SPeter Brune PETSC_EXTERN PetscErrorCode MatGetLayouts(Mat, PetscLayout *, PetscLayout *);
81781fa06acSBarry Smith PETSC_EXTERN PetscErrorCode MatSetLayouts(Mat, PetscLayout, PetscLayout);
818014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsLocal(Mat, PetscInt, const PetscInt[], PetscScalar, Vec, Vec);
819014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsLocalIS(Mat, IS, PetscScalar, Vec, Vec);
820014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocal(Mat, PetscInt, const PetscInt[], PetscScalar, Vec, Vec);
821014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocalIS(Mat, IS, PetscScalar, Vec, Vec);
822e265f6d6SPatrick Sanan PETSC_EXTERN PetscErrorCode MatGetValuesLocal(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[], PetscScalar[]);
823014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesLocal(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
824014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetValuesBlockedLocal(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
825052efed2SBarry Smith 
826014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatStashSetInitialSize(Mat, PetscInt, PetscInt);
827014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatStashGetInfo(Mat, PetscInt *, PetscInt *, PetscInt *, PetscInt *);
82890f02eecSBarry Smith 
829014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatInterpolate(Mat, Vec, Vec);
830014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatInterpolateAdd(Mat, Vec, Vec, Vec);
831014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatRestrict(Mat, Vec, Vec);
83230b0564aSStefano Zampini PETSC_EXTERN PetscErrorCode MatMatInterpolate(Mat, Mat, Mat *);
83330b0564aSStefano Zampini PETSC_EXTERN PetscErrorCode MatMatInterpolateAdd(Mat, Mat, Mat, Mat *);
83430b0564aSStefano Zampini PETSC_EXTERN PetscErrorCode MatMatRestrict(Mat, Mat, Mat *);
8352a7a6963SBarry Smith PETSC_EXTERN PetscErrorCode MatCreateVecs(Mat, Vec *, Vec *);
836*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatCreateVecs() (since version 3.6)") static inline PetscErrorCode MatGetVecs(Mat mat, Vec *x, Vec *y) {
837*9371c9d4SSatish Balay   return MatCreateVecs(mat, x, y);
838*9371c9d4SSatish Balay }
83953cd1579SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateRedundantMatrix(Mat, PetscInt, MPI_Comm, MatReuse, Mat *);
840014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetMultiProcBlock(Mat, MPI_Comm, MatReuse, Mat *);
841014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFindZeroDiagonals(Mat, IS *);
8423a062f41SBarry Smith PETSC_EXTERN PetscErrorCode MatFindOffBlockDiagonalEntries(Mat, IS *);
8439c8f2541SHong Zhang PETSC_EXTERN PetscErrorCode MatCreateMPIMatConcatenateSeqMat(MPI_Comm, Mat, PetscInt, MatReuse, Mat *);
844bd481603SBarry Smith 
845bd481603SBarry Smith /*MC
8461620fd73SBarry Smith    MatSetValue - Set a single entry into a matrix.
8471620fd73SBarry Smith 
8481620fd73SBarry Smith    Not collective
8491620fd73SBarry Smith 
850a9834a7dSSatish Balay    Synopsis:
851a9834a7dSSatish Balay      #include <petscmat.h>
852a9834a7dSSatish Balay      PetscErrorCode MatSetValue(Mat m,PetscInt row,PetscInt col,PetscScalar value,InsertMode mode)
853a9834a7dSSatish Balay 
8541620fd73SBarry Smith    Input Parameters:
8551620fd73SBarry Smith +  m - the matrix
8561620fd73SBarry Smith .  row - the row location of the entry
8571620fd73SBarry Smith .  col - the column location of the entry
8581620fd73SBarry Smith .  value - the value to insert
85987497f52SBarry Smith -  mode - either `INSERT_VALUES` or `ADD_VALUES`
8601620fd73SBarry Smith 
8611620fd73SBarry Smith    Notes:
86287497f52SBarry Smith    For efficiency one should use `MatSetValues()` and set several values simultaneously.
8631620fd73SBarry Smith 
8641620fd73SBarry Smith    Level: beginner
8651620fd73SBarry Smith 
866db781477SPatrick Sanan .seealso: `MatGetValue()`, `MatSetValues()`, `MatSetValueLocal()`, `MatSetValuesLocal()`
8671620fd73SBarry Smith M*/
868*9371c9d4SSatish Balay static inline PetscErrorCode MatSetValue(Mat v, PetscInt i, PetscInt j, PetscScalar va, InsertMode mode) {
869*9371c9d4SSatish Balay   return MatSetValues(v, 1, &i, 1, &j, &va, mode);
870*9371c9d4SSatish Balay }
8711620fd73SBarry Smith 
872e5e5a7b5SPatrick Sanan /*@C
873e5e5a7b5SPatrick Sanan    MatGetValue - Gets a single value from a matrix
8741620fd73SBarry Smith 
875e5e5a7b5SPatrick Sanan    Not Collective; can only return a value owned by the given process
876e5e5a7b5SPatrick Sanan 
877e5e5a7b5SPatrick Sanan    Input Parameters:
878e5e5a7b5SPatrick Sanan +  mat - the matrix
879e5e5a7b5SPatrick Sanan .  row - the row location of the entry
880e5e5a7b5SPatrick Sanan -  col - the column location of the entry
881e5e5a7b5SPatrick Sanan 
882e5e5a7b5SPatrick Sanan    Output Parameter:
883e5e5a7b5SPatrick Sanan .  va - the value
884e5e5a7b5SPatrick Sanan 
885e5e5a7b5SPatrick Sanan    Notes:
88687497f52SBarry Smith    For efficiency one should use `MatGetValues()` and get several values simultaneously.
887e5e5a7b5SPatrick Sanan 
88887497f52SBarry Smith    See notes for `MatGetValues()`.
889e5e5a7b5SPatrick Sanan 
890e5e5a7b5SPatrick Sanan    Level: advanced
891e5e5a7b5SPatrick Sanan 
892db781477SPatrick Sanan .seealso: `MatSetValue()`, `MatGetValueLocal()`, `MatGetValues()`
893e5e5a7b5SPatrick Sanan @*/
894*9371c9d4SSatish Balay static inline PetscErrorCode MatGetValue(Mat mat, PetscInt row, PetscInt col, PetscScalar *va) {
895*9371c9d4SSatish Balay   return MatGetValues(mat, 1, &row, 1, &col, va);
896*9371c9d4SSatish Balay }
897e5e5a7b5SPatrick Sanan 
898e5e5a7b5SPatrick Sanan /*MC
899e5e5a7b5SPatrick Sanan    MatSetValueLocal - Inserts or adds a single value into a matrix,
900e5e5a7b5SPatrick Sanan    using a local numbering of the nodes.
901e5e5a7b5SPatrick Sanan 
902e5e5a7b5SPatrick Sanan    Not Collective
903e5e5a7b5SPatrick Sanan 
904e5e5a7b5SPatrick Sanan    Input Parameters:
905e5e5a7b5SPatrick Sanan +  m - the matrix
906e5e5a7b5SPatrick Sanan .  row - the row location of the entry
907e5e5a7b5SPatrick Sanan .  col - the column location of the entry
908e5e5a7b5SPatrick Sanan .  value - the value to insert
90987497f52SBarry Smith -  mode - either `INSERT_VALUES` or `ADD_VALUES`
910e5e5a7b5SPatrick Sanan 
911e5e5a7b5SPatrick Sanan    Notes:
91287497f52SBarry Smith    For efficiency one should use `MatSetValuesLocal()` and set several values simultaneously.
913e5e5a7b5SPatrick Sanan 
91487497f52SBarry Smith    See notes for `MatSetValuesLocal()` for additional information on when and how this function can be used.
915e5e5a7b5SPatrick Sanan 
916e5e5a7b5SPatrick Sanan    Level: intermediate
917e5e5a7b5SPatrick Sanan 
918db781477SPatrick Sanan .seealso: `MatSetValue()`, `MatSetValuesLocal()`
919e5e5a7b5SPatrick Sanan M*/
920*9371c9d4SSatish Balay static inline PetscErrorCode MatSetValueLocal(Mat v, PetscInt i, PetscInt j, PetscScalar va, InsertMode mode) {
921*9371c9d4SSatish Balay   return MatSetValuesLocal(v, 1, &i, 1, &j, &va, mode);
922*9371c9d4SSatish Balay }
9231620fd73SBarry Smith 
9241620fd73SBarry Smith /*MC
925d0609cedSBarry Smith    MatPreallocateBegin - Begins the block of code that will count the number of nonzeros per
926bd481603SBarry Smith        row in a matrix providing the data that one can use to correctly preallocate the matrix.
927bd481603SBarry Smith 
928bd481603SBarry Smith    Synopsis:
929aaa7dc30SBarry Smith    #include <petscmat.h>
930d0609cedSBarry Smith    PetscErrorCode MatPreallocateBegin(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
931bd481603SBarry Smith 
932d083f849SBarry Smith    Collective
933bd481603SBarry Smith 
934bd481603SBarry Smith    Input Parameters:
935bd481603SBarry Smith +  comm - the communicator that will share the eventually allocated matrix
936859fcb39SBarry Smith .  nrows - the number of LOCAL rows in the matrix
937859fcb39SBarry Smith -  ncols - the number of LOCAL columns in the matrix
938bd481603SBarry Smith 
939bd481603SBarry Smith    Output Parameters:
940bd481603SBarry Smith +  dnz - the array that will be passed to the matrix preallocation routines
941a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
942bd481603SBarry Smith 
943bd481603SBarry Smith    Level: intermediate
944bd481603SBarry Smith 
945bd481603SBarry Smith    Notes:
946d0609cedSBarry Smith     This is a macro that handles its own error checking, it does not return an error code.
947d0609cedSBarry Smith 
948a7f22e61SSatish Balay     See Users-Manual: ch_performance for more details.
949bd481603SBarry Smith 
9501d73ed98SBarry Smith     Do not malloc or free dnz and onz, that is handled internally by these routines
951bd481603SBarry Smith 
952d0609cedSBarry Smith    Developer Notes:
9531620fd73SBarry Smith     This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize().
9541620fd73SBarry Smith 
955db781477SPatrick Sanan .seealso: `MatPreallocateEnd()`, `MatPreallocateSet()`, `MatPreallocateSymmetricSetBlock()`, `MatPreallocateSetLocal()`,
956db781477SPatrick Sanan           `MatPreallocateSymmetricSetLocalBlock()`
957bd481603SBarry Smith M*/
958*9371c9d4SSatish Balay #define MatPreallocateBegin(comm, nrows, ncols, dnz, onz) \
959*9371c9d4SSatish Balay   do { \
9605f80ce2aSJacob Faibussowitsch     PetscInt __nrows = (nrows), __ncols = (ncols), __rstart, __start, __end = 0; \
9619566063dSJacob Faibussowitsch     PetscCall(PetscCalloc2(__nrows, &(dnz), __nrows, &(onz))); \
9629566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Scan(&__ncols, &__end, 1, MPIU_INT, MPI_SUM, comm)); \
963*9371c9d4SSatish Balay     __start = __end - __ncols; \
964*9371c9d4SSatish Balay     (void)__start; \
9659566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Scan(&__nrows, &__rstart, 1, MPIU_INT, MPI_SUM, comm)); \
9665f80ce2aSJacob Faibussowitsch   __rstart -= __nrows
9677c922b88SBarry Smith 
968d0609cedSBarry Smith #define MatPreallocateInitialize(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use MatPreallocateBegin() (since version 3.18)\"") MatPreallocateBegin(__VA_ARGS__)
969d0609cedSBarry Smith 
970bd481603SBarry Smith /*MC
971bd481603SBarry Smith    MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
972bd481603SBarry Smith        inserted using a local number of the rows and columns
973bd481603SBarry Smith 
974bd481603SBarry Smith    Synopsis:
975aaa7dc30SBarry Smith    #include <petscmat.h>
976c1ac3661SBarry Smith    PetscErrorCode MatPreallocateSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
977bd481603SBarry Smith 
978bd481603SBarry Smith    Not Collective
979bd481603SBarry Smith 
980bd481603SBarry Smith    Input Parameters:
981784ac674SJed Brown +  map - the row mapping from local numbering to global numbering
982bd481603SBarry Smith .  nrows - the number of rows indicated
9831d73ed98SBarry Smith .  rows - the indices of the rows
984784ac674SJed Brown .  cmap - the column mapping from local to global numbering
985bd481603SBarry Smith .  ncols - the number of columns in the matrix
986bd481603SBarry Smith .  cols - the columns indicated
987bd481603SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
988a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
989bd481603SBarry Smith 
990bd481603SBarry Smith    Level: intermediate
991bd481603SBarry Smith 
992bd481603SBarry Smith    Notes:
993a7f22e61SSatish Balay     See Users-Manual: ch_performance for more details.
994bd481603SBarry Smith 
9951d73ed98SBarry Smith    Do not malloc or free dnz and onz, that is handled internally by these routines
996bd481603SBarry Smith 
997db781477SPatrick Sanan .seealso: `MatPreallocateEnd()`, `MatPreallocateSet()`, `MatPreallocateSymmetricSetBlock()`
998db781477SPatrick Sanan           `MatPreallocateBegin()`, `MatPreallocateSymmetricSetLocalBlock()`, `MatPreallocateSetLocalRemoveDups()`
999bd481603SBarry Smith M*/
100094bad497SJacob Faibussowitsch #define MatPreallocateSetLocal(rmap, nrows, rows, cmap, ncols, cols, dnz, onz) \
1001*9371c9d4SSatish Balay   PetscMacroReturnStandard(PetscCall(ISLocalToGlobalMappingApply(rmap, nrows, rows, rows)); PetscCall(ISLocalToGlobalMappingApply(cmap, ncols, cols, cols)); for (PetscInt __l = 0; __l < nrows; __l++) PetscCall(MatPreallocateSet((rows)[__l], ncols, cols, dnz, onz));)
1002c4f061fbSSatish Balay 
1003bd481603SBarry Smith /*MC
1004c1154cd5SBarry Smith    MatPreallocateSetLocalRemoveDups - Indicates the locations (rows and columns) in the matrix where nonzeros will be
1005c1154cd5SBarry Smith        inserted using a local number of the rows and columns. This version removes any duplicate columns in cols
1006c1154cd5SBarry Smith 
1007c1154cd5SBarry Smith    Synopsis:
1008c1154cd5SBarry Smith    #include <petscmat.h>
1009c1154cd5SBarry Smith    PetscErrorCode MatPreallocateSetLocalRemoveDups(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
1010c1154cd5SBarry Smith 
1011c1154cd5SBarry Smith    Not Collective
1012c1154cd5SBarry Smith 
1013c1154cd5SBarry Smith    Input Parameters:
1014c1154cd5SBarry Smith +  map - the row mapping from local numbering to global numbering
1015c1154cd5SBarry Smith .  nrows - the number of rows indicated
1016c1154cd5SBarry Smith .  rows - the indices of the rows (these values are mapped to the global values)
1017c1154cd5SBarry Smith .  cmap - the column mapping from local to global numbering
1018c1154cd5SBarry Smith .  ncols - the number of columns in the matrix   (this value will be changed if duplicate columns are found)
1019c1154cd5SBarry Smith .  cols - the columns indicated (these values are mapped to the global values, they are then sorted and duplicates removed)
1020c1154cd5SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
1021a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
1022c1154cd5SBarry Smith 
1023c1154cd5SBarry Smith    Level: intermediate
1024c1154cd5SBarry Smith 
1025c1154cd5SBarry Smith    Notes:
1026c1154cd5SBarry Smith     See Users-Manual: ch_performance for more details.
1027c1154cd5SBarry Smith 
1028c1154cd5SBarry Smith    Do not malloc or free dnz and onz, that is handled internally by these routines
1029c1154cd5SBarry Smith 
1030db781477SPatrick Sanan .seealso: `MatPreallocateEnd()`, `MatPreallocateSet()`, `MatPreallocateSymmetricSetBlock()`
1031db781477SPatrick Sanan           `MatPreallocateBegin()`, `MatPreallocateSymmetricSetLocalBlock()`, `MatPreallocateSetLocal()`
1032c1154cd5SBarry Smith M*/
103394bad497SJacob Faibussowitsch #define MatPreallocateSetLocalRemoveDups(rmap, nrows, rows, cmap, ncols, cols, dnz, onz) \
1034*9371c9d4SSatish Balay   PetscMacroReturnStandard(PetscCall(ISLocalToGlobalMappingApply(rmap, nrows, rows, rows)); PetscCall(ISLocalToGlobalMappingApply(cmap, ncols, cols, cols)); PetscCall(PetscSortRemoveDupsInt(&ncols, cols)); for (PetscInt __l = 0; __l < nrows; __l++) PetscCall(MatPreallocateSet((rows)[__l], ncols, cols, dnz, onz));)
1035c1154cd5SBarry Smith 
1036c1154cd5SBarry Smith /*MC
1037d6e23781SBarry Smith    MatPreallocateSetLocalBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be
1038bd481603SBarry Smith        inserted using a local number of the rows and columns
1039bd481603SBarry Smith 
1040bd481603SBarry Smith    Synopsis:
1041aaa7dc30SBarry Smith    #include <petscmat.h>
1042d6e23781SBarry Smith    PetscErrorCode MatPreallocateSetLocalBlock(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
1043d6e23781SBarry Smith 
1044d6e23781SBarry Smith    Not Collective
1045d6e23781SBarry Smith 
1046d6e23781SBarry Smith    Input Parameters:
1047d6e23781SBarry Smith +  map - the row mapping from local numbering to global numbering
1048d6e23781SBarry Smith .  nrows - the number of rows indicated
1049d6e23781SBarry Smith .  rows - the indices of the rows
1050d6e23781SBarry Smith .  cmap - the column mapping from local to global numbering
1051d6e23781SBarry Smith .  ncols - the number of columns in the matrix
1052d6e23781SBarry Smith .  cols - the columns indicated
1053d6e23781SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
1054a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
1055d6e23781SBarry Smith 
1056d6e23781SBarry Smith    Level: intermediate
1057d6e23781SBarry Smith 
1058d6e23781SBarry Smith    Notes:
1059d6e23781SBarry Smith     See Users-Manual: ch_performance for more details.
1060d6e23781SBarry Smith 
1061d6e23781SBarry Smith    Do not malloc or free dnz and onz, that is handled internally by these routines
1062d6e23781SBarry Smith 
1063db781477SPatrick Sanan .seealso: `MatPreallocateEnd()`, `MatPreallocateSet()`, `MatPreallocateSymmetricSetBlock()`
1064db781477SPatrick Sanan           `MatPreallocateBegin()`, `MatPreallocateSymmetricSetLocalBlock()`
1065d6e23781SBarry Smith M*/
106694bad497SJacob Faibussowitsch #define MatPreallocateSetLocalBlock(rmap, nrows, rows, cmap, ncols, cols, dnz, onz) \
1067*9371c9d4SSatish Balay   PetscMacroReturnStandard(PetscCall(ISLocalToGlobalMappingApplyBlock(rmap, nrows, rows, rows)); PetscCall(ISLocalToGlobalMappingApplyBlock(cmap, ncols, cols, cols)); for (PetscInt __l = 0; __l < nrows; __l++) PetscCall(MatPreallocateSet((rows)[__l], ncols, cols, dnz, onz));)
1068d6e23781SBarry Smith 
1069d6e23781SBarry Smith /*MC
1070d6e23781SBarry Smith    MatPreallocateSymmetricSetLocalBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be
1071d6e23781SBarry Smith        inserted using a local number of the rows and columns
1072d6e23781SBarry Smith 
1073d6e23781SBarry Smith    Synopsis:
1074d6e23781SBarry Smith    #include <petscmat.h>
1075d6e23781SBarry Smith    PetscErrorCode MatPreallocateSymmetricSetLocalBlock(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
1076bd481603SBarry Smith 
1077bd481603SBarry Smith    Not Collective
1078bd481603SBarry Smith 
1079bd481603SBarry Smith    Input Parameters:
1080bd481603SBarry Smith +  map - the mapping between local numbering and global numbering
1081bd481603SBarry Smith .  nrows - the number of rows indicated
10821d73ed98SBarry Smith .  rows - the indices of the rows
1083bd481603SBarry Smith .  ncols - the number of columns in the matrix
1084bd481603SBarry Smith .  cols - the columns indicated
1085bd481603SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
1086a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
1087bd481603SBarry Smith 
1088bd481603SBarry Smith    Level: intermediate
1089bd481603SBarry Smith 
1090bd481603SBarry Smith    Notes:
1091a7f22e61SSatish Balay     See Users-Manual: ch_performance for more details.
1092bd481603SBarry Smith 
1093bd481603SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
1094bd481603SBarry Smith 
1095db781477SPatrick Sanan .seealso: `MatPreallocateEnd()`, `MatPreallocateSet()`
1096db781477SPatrick Sanan           `MatPreallocateBegin()`, `MatPreallocateSetLocal()`
1097bd481603SBarry Smith M*/
109894bad497SJacob Faibussowitsch #define MatPreallocateSymmetricSetLocalBlock(map, nrows, rows, ncols, cols, dnz, onz) \
1099*9371c9d4SSatish Balay   PetscMacroReturnStandard(PetscCall(ISLocalToGlobalMappingApplyBlock(map, nrows, rows, rows)); PetscCall(ISLocalToGlobalMappingApplyBlock(map, ncols, cols, cols)); for (PetscInt __l = 0; __l < nrows; __l++) PetscCall(MatPreallocateSymmetricSetBlock((rows)[__l], ncols, cols, dnz, onz));)
1100e83a5d19SLisandro Dalcin 
1101bd481603SBarry Smith /*MC
1102bd481603SBarry Smith    MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
1103bd481603SBarry Smith        inserted using a local number of the rows and columns
1104bd481603SBarry Smith 
1105bd481603SBarry Smith    Synopsis:
1106aaa7dc30SBarry Smith    #include <petscmat.h>
1107c1ac3661SBarry Smith    PetscErrorCode MatPreallocateSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
1108bd481603SBarry Smith 
1109bd481603SBarry Smith    Not Collective
1110bd481603SBarry Smith 
1111bd481603SBarry Smith    Input Parameters:
111264075487SBarry Smith +  row - the row
1113bd481603SBarry Smith .  ncols - the number of columns in the matrix
1114a50f8bf6SHong Zhang -  cols - the columns indicated
1115a50f8bf6SHong Zhang 
1116a50f8bf6SHong Zhang    Output Parameters:
1117a50f8bf6SHong Zhang +  dnz - the array that will be passed to the matrix preallocation routines
1118a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
1119bd481603SBarry Smith 
1120bd481603SBarry Smith    Level: intermediate
1121bd481603SBarry Smith 
1122bd481603SBarry Smith    Notes:
1123a7f22e61SSatish Balay     See Users-Manual: ch_performance for more details.
1124bd481603SBarry Smith 
1125bd481603SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
1126bd481603SBarry Smith 
1127d0609cedSBarry Smith    This is a MACRO not a function because it uses variables declared in MatPreallocateBegin().
11281620fd73SBarry Smith 
1129db781477SPatrick Sanan .seealso: `MatPreallocateEnd()`, `MatPreallocateSet()`, `MatPreallocateSymmetricSetBlock()`
1130db781477SPatrick Sanan           `MatPreallocateBegin()`, `MatPreallocateSetLocal()`
1131bd481603SBarry Smith M*/
1132*9371c9d4SSatish Balay #define MatPreallocateSet(row, nc, cols, dnz, onz) \
1133*9371c9d4SSatish Balay   PetscMacroReturnStandard(PetscCheck(row >= __rstart, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Trying to set preallocation for row %" PetscInt_FMT " less than first local row %" PetscInt_FMT, row, __rstart); PetscCheck(row < __rstart + __nrows, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Trying to set preallocation for row %" PetscInt_FMT " greater than last local row %" PetscInt_FMT, row, __rstart + __nrows - 1); for (PetscInt __i = 0; __i < nc; ++__i) { \
113464075487SBarry Smith     if ((cols)[__i] < __start || (cols)[__i] >= __end) onz[row - __rstart]++; \
1135a6042fd4SStefano Zampini     else if (dnz[row - __rstart] < __ncols) dnz[row - __rstart]++; \
1136*9371c9d4SSatish Balay   })
11377c922b88SBarry Smith 
1138bd481603SBarry Smith /*MC
1139d6e23781SBarry Smith    MatPreallocateSymmetricSetBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be
1140bd481603SBarry Smith        inserted using a local number of the rows and columns
1141bd481603SBarry Smith 
1142bd481603SBarry Smith    Synopsis:
1143aaa7dc30SBarry Smith    #include <petscmat.h>
1144d6e23781SBarry Smith    PetscErrorCode MatPreallocateSymmetricSetBlock(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
1145bd481603SBarry Smith 
1146bd481603SBarry Smith    Not Collective
1147bd481603SBarry Smith 
1148bd481603SBarry Smith    Input Parameters:
1149bd481603SBarry Smith +  nrows - the number of rows indicated
11501d73ed98SBarry Smith .  rows - the indices of the rows
1151bd481603SBarry Smith .  ncols - the number of columns in the matrix
1152bd481603SBarry Smith .  cols - the columns indicated
1153bd481603SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
1154a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
1155bd481603SBarry Smith 
1156bd481603SBarry Smith    Level: intermediate
1157bd481603SBarry Smith 
1158bd481603SBarry Smith    Notes:
1159a7f22e61SSatish Balay     See Users-Manual: ch_performance for more details.
1160bd481603SBarry Smith 
1161bd481603SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
1162bd481603SBarry Smith 
1163d0609cedSBarry Smith    This is a MACRO not a function because it uses variables declared in MatPreallocateBegin().
11641620fd73SBarry Smith 
1165db781477SPatrick Sanan .seealso: `MatPreallocateEnd()`, `MatPreallocateSet()`, `MatPreallocateBegin()`,
1166db781477SPatrick Sanan           `MatPreallocateSymmetricSetLocalBlock()`, `MatPreallocateSetLocal()`
1167bd481603SBarry Smith M*/
116894bad497SJacob Faibussowitsch #define MatPreallocateSymmetricSetBlock(row, nc, cols, dnz, onz) \
1169*9371c9d4SSatish Balay   PetscMacroReturnStandard(for (PetscInt __i = 0; __i < nc; __i++) { \
1170d3d32019SBarry Smith     if (cols[__i] >= __end) onz[row - __rstart]++; \
1171a6042fd4SStefano Zampini     else if (cols[__i] >= row && dnz[row - __rstart] < __ncols) dnz[row - __rstart]++; \
1172*9371c9d4SSatish Balay   })
1173d3d32019SBarry Smith 
1174bd481603SBarry Smith /*MC
1175a6042fd4SStefano Zampini    MatPreallocateLocation -  An alternative to MatPreallocateSet() that puts the nonzero locations into the matrix if it exists
117616371a99SBarry Smith 
117716371a99SBarry Smith    Synopsis:
1178aaa7dc30SBarry Smith    #include <petscmat.h>
117916371a99SBarry Smith    PetscErrorCode MatPreallocateLocations(Mat A,PetscInt row,PetscInt ncols,PetscInt *cols,PetscInt *dnz,PetscInt *onz)
118016371a99SBarry Smith 
118116371a99SBarry Smith    Not Collective
118216371a99SBarry Smith 
118316371a99SBarry Smith    Input Parameters:
1184a2b725a8SWilliam Gropp +  A - matrix
118516371a99SBarry Smith .  row - row where values exist (must be local to this process)
118616371a99SBarry Smith .  ncols - number of columns
118716371a99SBarry Smith .  cols - columns with nonzeros
118816371a99SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
1189a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
119016371a99SBarry Smith 
119116371a99SBarry Smith    Level: intermediate
119216371a99SBarry Smith 
119316371a99SBarry Smith    Notes:
1194a7f22e61SSatish Balay     See Users-Manual: ch_performance for more details.
119516371a99SBarry Smith 
119616371a99SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
119716371a99SBarry Smith 
119816371a99SBarry Smith    This is a MACRO not a function because it uses a bunch of variables private to the MatPreallocation.... routines.
119916371a99SBarry Smith 
1200db781477SPatrick Sanan .seealso: `MatPreallocateBegin()`, `MatPreallocateSet()`, `MatPreallocateSymmetricSetBlock()`, `MatPreallocateSetLocal()`,
1201db781477SPatrick Sanan           `MatPreallocateSymmetricSetLocalBlock()`
120216371a99SBarry Smith M*/
1203d0609cedSBarry Smith #define MatPreallocateLocation(A, row, ncols, cols, dnz, onz) (A ? MatSetValues(A, 1, &row, ncols, cols, NULL, INSERT_VALUES) : MatPreallocateSet(row, ncols, cols, dnz, onz))
120416371a99SBarry Smith 
120516371a99SBarry Smith /*MC
1206d0609cedSBarry Smith    MatPreallocateEnd - Ends the block of code that will count the number of nonzeros per
1207bd481603SBarry Smith        row in a matrix providing the data that one can use to correctly preallocate the matrix.
1208bd481603SBarry Smith 
1209bd481603SBarry Smith    Synopsis:
1210aaa7dc30SBarry Smith    #include <petscmat.h>
1211d0609cedSBarry Smith    PetscErrorCode MatPreallocateEnd(PetscInt *dnz, PetscInt *onz)
1212bd481603SBarry Smith 
1213d083f849SBarry Smith    Collective
1214bd481603SBarry Smith 
1215bd481603SBarry Smith    Input Parameters:
121616371a99SBarry Smith +  dnz - the array that was be passed to the matrix preallocation routines
1217a6042fd4SStefano Zampini -  onz - the other array passed to the matrix preallocation routines
1218bd481603SBarry Smith 
1219bd481603SBarry Smith    Level: intermediate
1220bd481603SBarry Smith 
1221bd481603SBarry Smith    Notes:
1222d0609cedSBarry Smith     This is a macro that handles its own error checking, it does not return an error code.
1223d0609cedSBarry Smith 
1224a7f22e61SSatish Balay     See Users-Manual: ch_performance for more details.
1225bd481603SBarry Smith 
1226d0609cedSBarry Smith     Do not malloc or free dnz and onz, that is handled internally by these routines
1227bd481603SBarry Smith 
1228d0609cedSBarry Smith    Developer Notes:
1229d0609cedSBarry Smith     This is a MACRO not a function because it closes the { started in MatPreallocateBegin().
12301620fd73SBarry Smith 
1231db781477SPatrick Sanan .seealso: `MatPreallocateBegin()`, `MatPreallocateSet()`, `MatPreallocateSymmetricSetBlock()`, `MatPreallocateSetLocal()`,
1232db781477SPatrick Sanan           `MatPreallocateSymmetricSetLocalBlock()`
1233bd481603SBarry Smith M*/
1234*9371c9d4SSatish Balay #define MatPreallocateEnd(dnz, onz) \
1235*9371c9d4SSatish Balay   PetscCall(PetscFree2(dnz, onz)); \
1236*9371c9d4SSatish Balay   } \
1237*9371c9d4SSatish Balay   while (0)
1238d0609cedSBarry Smith 
1239d0609cedSBarry Smith #define MatPreallocateFinalize(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use MatPreallocateEnd() (since version 3.18)\"") MatPreallocateEnd(__VA_ARGS__)
12407c922b88SBarry Smith 
12417b80b807SBarry Smith /* Routines unique to particular data structures */
1242014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatShellGetContext(Mat, void *);
1243698d4c6aSKris Buschelman 
1244014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatInodeAdjustForInodes(Mat, IS *, IS *);
1245014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatInodeGetInodeSizes(Mat, PetscInt *, PetscInt *[], PetscInt *);
1246698d4c6aSKris Buschelman 
1247014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqAIJSetColumnIndices(Mat, PetscInt[]);
1248014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqBAIJSetColumnIndices(Mat, PetscInt[]);
1249014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqAIJWithArrays(MPI_Comm, PetscInt, PetscInt, PetscInt[], PetscInt[], PetscScalar[], Mat *);
1250014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJWithArrays(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt[], PetscInt[], PetscScalar[], Mat *);
1251014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJWithArrays(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt[], PetscInt[], PetscScalar[], Mat *);
1252014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSeqAIJFromTriple(MPI_Comm, PetscInt, PetscInt, PetscInt[], PetscInt[], PetscScalar[], Mat *, PetscInt, PetscBool);
12537b80b807SBarry Smith 
1254a96a251dSBarry Smith #define MAT_SKIP_ALLOCATION -4
1255a96a251dSBarry Smith 
1256014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocation(Mat, PetscInt, PetscInt, const PetscInt[]);
1257014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetPreallocation(Mat, PetscInt, PetscInt, const PetscInt[]);
1258014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocation(Mat, PetscInt, const PetscInt[]);
125919b08ed1SBarry Smith PETSC_EXTERN PetscErrorCode MatSeqAIJSetTotalPreallocation(Mat, PetscInt);
1260273d9f13SBarry Smith 
1261014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocation(Mat, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[]);
1262014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocation(Mat, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[]);
1263014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocation(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[]);
1264014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocationCSR(Mat, const PetscInt[], const PetscInt[], const PetscScalar[]);
1265014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocationCSR(Mat, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[]);
1266014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocationCSR(Mat, const PetscInt[], const PetscInt[], const PetscScalar[]);
1267014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocationCSR(Mat, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[]);
1268014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIAdjSetPreallocation(Mat, PetscInt[], PetscInt[], PetscInt[]);
1269b44e7856SBarry Smith PETSC_EXTERN PetscErrorCode MatMPIAdjToSeq(Mat, Mat *);
1270252a1336SBarry Smith PETSC_EXTERN PetscErrorCode MatMPIAdjToSeqRankZero(Mat, Mat *);
1271014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIDenseSetPreallocation(Mat, PetscScalar[]);
1272014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqDenseSetPreallocation(Mat, PetscScalar[]);
12739230625dSJed Brown PETSC_EXTERN PetscErrorCode MatMPIAIJGetSeqAIJ(Mat, Mat *, Mat *, const PetscInt *[]);
12749230625dSJed Brown PETSC_EXTERN PetscErrorCode MatMPIBAIJGetSeqBAIJ(Mat, Mat *, Mat *, const PetscInt *[]);
1275014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIAdjCreateNonemptySubcommMat(Mat, Mat *);
1276273d9f13SBarry Smith 
127749a6ff4bSBarry Smith PETSC_EXTERN PetscErrorCode MatDenseGetLDA(Mat, PetscInt *);
1278ad16ce7aSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseSetLDA(Mat, PetscInt);
1279*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatDenseSetLDA() (since version 3.14)") static inline PetscErrorCode MatSeqDenseSetLDA(Mat A, PetscInt lda) {
1280*9371c9d4SSatish Balay   return MatDenseSetLDA(A, lda);
1281*9371c9d4SSatish Balay }
1282014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDenseGetLocalMatrix(Mat, Mat *);
12831b807ce4Svictorle 
1284621e819fSSatish Balay PETSC_EXTERN PetscErrorCode MatBlockMatSetPreallocation(Mat, PetscInt, PetscInt, const PetscInt[]);
1285621e819fSSatish Balay 
1286014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatStoreValues(Mat);
1287014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatRetrieveValues(Mat);
12882e8a6d31SBarry Smith 
1289014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFindNonzeroRows(Mat, IS *);
12907cfe41e4SPatrick Farrell PETSC_EXTERN PetscErrorCode MatFindZeroRows(Mat, IS *);
12917b80b807SBarry Smith /*
12927b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
129394b7f48cSBarry Smith   done through the KSP and PC interfaces.
12947b80b807SBarry Smith */
12957b80b807SBarry Smith 
129676bdecfbSBarry Smith /*J
12978f6c3df8SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering
1298d9274352SBarry Smith 
1299d9274352SBarry Smith    Level: beginner
1300d9274352SBarry Smith 
13012c7c0729SBarry Smith    Notes:
130287497f52SBarry Smith       If `MATORDERINGEXTERNAL` is used then PETSc does not compute an ordering and utilizes one built into the factorization package
13032c7c0729SBarry Smith 
1304db781477SPatrick Sanan .seealso: `MatGetOrdering()`
130576bdecfbSBarry Smith J*/
130619fd82e9SBarry Smith typedef const char *MatOrderingType;
13072692d6eeSBarry Smith #define MATORDERINGNATURAL       "natural"
13082692d6eeSBarry Smith #define MATORDERINGND            "nd"
13092692d6eeSBarry Smith #define MATORDERING1WD           "1wd"
13102692d6eeSBarry Smith #define MATORDERINGRCM           "rcm"
13112692d6eeSBarry Smith #define MATORDERINGQMD           "qmd"
13122692d6eeSBarry Smith #define MATORDERINGROWLENGTH     "rowlength"
1313510184a7SJed Brown #define MATORDERINGWBM           "wbm"
1314fc1bef75SJed Brown #define MATORDERINGSPECTRAL      "spectral"
1315312e372aSBarry Smith #define MATORDERINGAMD           "amd"           /* only works if UMFPACK is installed with PETSc */
1316048412efSPablo Brubeck #define MATORDERINGMETISND       "metisnd"       /* only works if METIS is installed with PETSc */
13179bd791bbSBarry Smith #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 */
13182c7c0729SBarry Smith #define MATORDERINGEXTERNAL      "external"      /* uses an ordering type internal to the factorization package */
1319b12f92e5SBarry Smith 
132019fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode    MatGetOrdering(Mat, MatOrderingType, IS *, IS *);
1321140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode    MatGetOrderingList(PetscFunctionList *);
1322bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode    MatOrderingRegister(const char[], PetscErrorCode (*)(Mat, MatOrderingType, IS *, IS *));
1323140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList MatOrderingList;
1324d4fbbf0eSBarry Smith 
1325014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatReorderForNonzeroDiagonal(Mat, PetscReal, IS, IS);
1326fc1bef75SJed Brown PETSC_EXTERN PetscErrorCode MatCreateLaplacian(Mat, PetscReal, PetscBool, Mat *);
1327a2ce50c7SBarry Smith 
13284ac6704cSBarry Smith PETSC_EXTERN PetscErrorCode MatFactorGetPreferredOrdering(Mat, MatFactorType, MatOrderingType *);
13294ac6704cSBarry Smith 
1330d91e6319SBarry Smith /*S
1331ec5066bdSBarry Smith     MatFactorShiftType - Numeric Shift for factorizations
1332d90ac83dSHong Zhang 
1333d90ac83dSHong Zhang    Level: beginner
1334d90ac83dSHong Zhang 
1335db781477SPatrick Sanan .seealso: `MatGetFactor()`
1336d90ac83dSHong Zhang S*/
1337*9371c9d4SSatish Balay typedef enum {
1338*9371c9d4SSatish Balay   MAT_SHIFT_NONE,
1339*9371c9d4SSatish Balay   MAT_SHIFT_NONZERO,
1340*9371c9d4SSatish Balay   MAT_SHIFT_POSITIVE_DEFINITE,
1341*9371c9d4SSatish Balay   MAT_SHIFT_INBLOCKS
1342*9371c9d4SSatish Balay } MatFactorShiftType;
13436a6fc655SJed Brown PETSC_EXTERN const char *const MatFactorShiftTypes[];
13445e9742b9SJed Brown PETSC_EXTERN const char *const MatFactorShiftTypesDetail[];
1345d90ac83dSHong Zhang 
1346d90ac83dSHong Zhang /*S
1347ec5066bdSBarry Smith     MatFactorError - indicates what type of error was generated in a matrix factorization
13489aa7eafdSHong Zhang 
13499aa7eafdSHong Zhang     Level: beginner
13509aa7eafdSHong Zhang 
135187497f52SBarry Smith     Developer Note:
135295452b02SPatrick Sanan     Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
135300e125f8SBarry Smith 
1354db781477SPatrick Sanan .seealso: `MatGetFactor()`
13559aa7eafdSHong Zhang S*/
1356*9371c9d4SSatish Balay typedef enum {
1357*9371c9d4SSatish Balay   MAT_FACTOR_NOERROR,
1358*9371c9d4SSatish Balay   MAT_FACTOR_STRUCT_ZEROPIVOT,
1359*9371c9d4SSatish Balay   MAT_FACTOR_NUMERIC_ZEROPIVOT,
1360*9371c9d4SSatish Balay   MAT_FACTOR_OUTMEMORY,
1361*9371c9d4SSatish Balay   MAT_FACTOR_OTHER
1362*9371c9d4SSatish Balay } MatFactorError;
13639aa7eafdSHong Zhang 
136400e125f8SBarry Smith PETSC_EXTERN PetscErrorCode MatFactorGetError(Mat, MatFactorError *);
1365b8b68cfdSBarry Smith PETSC_EXTERN PetscErrorCode MatFactorClearError(Mat);
13667b6c816cSBarry Smith PETSC_EXTERN PetscErrorCode MatFactorGetErrorZeroPivot(Mat, PetscReal *, PetscInt *);
136700e125f8SBarry Smith 
13689aa7eafdSHong Zhang /*S
1369422a814eSBarry Smith    MatFactorInfo - Data passed into the matrix factorization routines, and information about the resulting factorization
1370b00f7748SHong Zhang 
137187497f52SBarry Smith    In Fortran these are simply double precision arrays of size `MAT_FACTORINFO_SIZE`, that is use
137261cad860SBarry Smith $     MatFactorInfo  info(MAT_FACTORINFO_SIZE)
1373b00f7748SHong Zhang 
137495452b02SPatrick Sanan    Notes:
137587497f52SBarry Smith     These are not usually directly used by users, instead use `PC` type of `PCLU`, `PCILU`, `PCCHOLESKY` or `PCICC`.
1376b00f7748SHong Zhang 
137787497f52SBarry Smith       You can use `MatFactorInfoInitialize()` to set default values.
137861cad860SBarry Smith 
1379b00f7748SHong Zhang    Level: developer
1380b00f7748SHong Zhang 
1381db781477SPatrick Sanan .seealso: `MatLUFactorSymbolic()`, `MatILUFactorSymbolic()`, `MatCholeskyFactorSymbolic()`, `MatICCFactorSymbolic()`, `MatICCFactor()`,
1382db781477SPatrick Sanan           `MatFactorInfoInitialize()`
1383b00f7748SHong Zhang 
1384b00f7748SHong Zhang S*/
1385b00f7748SHong Zhang typedef struct {
138615e8a5b3SHong Zhang   PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */
138785317021SBarry Smith   PetscReal usedt;
138815e8a5b3SHong Zhang   PetscReal dt;            /* drop tolerance */
1389b00f7748SHong Zhang   PetscReal dtcol;         /* tolerance for pivoting */
139015e8a5b3SHong Zhang   PetscReal dtcount;       /* maximum nonzeros to be allowed per row */
139167e28bfeSBarry Smith   PetscReal fill;          /* expected fill, nonzeros in factored matrix/nonzeros in original matrix */
1392348344bbSBarry Smith   PetscReal levels;        /* ICC/ILU(levels) */
1393bcd9e38bSBarry Smith   PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
1394bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
139515e8a5b3SHong Zhang   PetscReal zeropivot;     /* pivot is called zero if less than this */
1396f4db908eSBarry Smith   PetscReal shifttype;     /* type of shift added to matrix factor to prevent zero pivots */
1397f4db908eSBarry Smith   PetscReal shiftamount;   /* how large the shift is */
139815e8a5b3SHong Zhang } MatFactorInfo;
1399ffa6d0a5SLois Curfman McInnes 
1400014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFactorInfoInitialize(MatFactorInfo *);
14019a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatCholeskyFactor(Mat, IS, const MatFactorInfo *);
14029a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatCholeskyFactorSymbolic(Mat, Mat, IS, const MatFactorInfo *);
14039a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatCholeskyFactorNumeric(Mat, Mat, const MatFactorInfo *);
14049a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatLUFactor(Mat, IS, IS, const MatFactorInfo *);
14059a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatILUFactor(Mat, IS, IS, const MatFactorInfo *);
14069a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatLUFactorSymbolic(Mat, Mat, IS, IS, const MatFactorInfo *);
14079a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatILUFactorSymbolic(Mat, Mat, IS, IS, const MatFactorInfo *);
14089a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatICCFactorSymbolic(Mat, Mat, IS, const MatFactorInfo *);
14099a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatICCFactor(Mat, IS, const MatFactorInfo *);
14109a625307SHong Zhang PETSC_EXTERN PetscErrorCode MatLUFactorNumeric(Mat, Mat, const MatFactorInfo *);
14113f498edaSToby Isaac PETSC_EXTERN PetscErrorCode MatQRFactor(Mat, IS, const MatFactorInfo *);
14123f498edaSToby Isaac PETSC_EXTERN PetscErrorCode MatQRFactorSymbolic(Mat, Mat, IS, const MatFactorInfo *);
14133f498edaSToby Isaac PETSC_EXTERN PetscErrorCode MatQRFactorNumeric(Mat, Mat, const MatFactorInfo *);
1414014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetInertia(Mat, PetscInt *, PetscInt *, PetscInt *);
1415014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSolve(Mat, Vec, Vec);
1416014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatForwardSolve(Mat, Vec, Vec);
1417014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatBackwardSolve(Mat, Vec, Vec);
1418014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSolveAdd(Mat, Vec, Vec, Vec);
1419014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSolveTranspose(Mat, Vec, Vec);
1420014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSolveTransposeAdd(Mat, Vec, Vec, Vec);
1421014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSolves(Mat, Vecs, Vecs);
14227c2f51b8SStefano Zampini PETSC_EXTERN PetscErrorCode MatSetUnfactored(Mat);
14237c2f51b8SStefano Zampini 
1424*9371c9d4SSatish Balay typedef enum {
1425*9371c9d4SSatish Balay   MAT_FACTOR_SCHUR_UNFACTORED,
1426*9371c9d4SSatish Balay   MAT_FACTOR_SCHUR_FACTORED,
1427*9371c9d4SSatish Balay   MAT_FACTOR_SCHUR_INVERTED
1428*9371c9d4SSatish Balay } MatFactorSchurStatus;
14298e7ba810SStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorSetSchurIS(Mat, IS);
14307c2f51b8SStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorGetSchurComplement(Mat, Mat *, MatFactorSchurStatus *);
14317c2f51b8SStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorRestoreSchurComplement(Mat, Mat *, MatFactorSchurStatus);
14325a05ddb0SStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorInvertSchurComplement(Mat);
14337c2f51b8SStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorCreateSchurComplement(Mat, Mat *, MatFactorSchurStatus *);
14345a05ddb0SStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorSolveSchurComplement(Mat, Vec, Vec);
14355a05ddb0SStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorSolveSchurComplementTranspose(Mat, Vec, Vec);
14366dba178dSStefano Zampini PETSC_EXTERN PetscErrorCode MatFactorFactorizeSchurComplement(Mat);
1437bb5a7306SBarry Smith 
14388a9c020eSBarry Smith PETSC_EXTERN PetscErrorCode MatSeqDenseInvert(Mat);
1439d91e6319SBarry Smith /*E
1440d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
1441bb1eb677SSatish Balay 
1442d91e6319SBarry Smith     Level: beginner
1443d91e6319SBarry Smith 
1444d9274352SBarry Smith    May be bitwise ORd together
1445d9274352SBarry Smith 
144687497f52SBarry Smith    Developer Notes:
1447af0996ceSBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
1448d91e6319SBarry Smith 
144987497f52SBarry Smith   `MatSORType` may be bitwise ORd together, so do not change the numerical values
14504e7234bfSBarry Smith 
1451db781477SPatrick Sanan .seealso: `MatSOR()`
1452d91e6319SBarry Smith E*/
1453*9371c9d4SSatish Balay typedef enum {
1454*9371c9d4SSatish Balay   SOR_FORWARD_SWEEP         = 1,
1455*9371c9d4SSatish Balay   SOR_BACKWARD_SWEEP        = 2,
1456*9371c9d4SSatish Balay   SOR_SYMMETRIC_SWEEP       = 3,
1457*9371c9d4SSatish Balay   SOR_LOCAL_FORWARD_SWEEP   = 4,
1458*9371c9d4SSatish Balay   SOR_LOCAL_BACKWARD_SWEEP  = 8,
1459*9371c9d4SSatish Balay   SOR_LOCAL_SYMMETRIC_SWEEP = 12,
1460*9371c9d4SSatish Balay   SOR_ZERO_INITIAL_GUESS    = 16,
1461*9371c9d4SSatish Balay   SOR_EISENSTAT             = 32,
1462*9371c9d4SSatish Balay   SOR_APPLY_UPPER           = 64,
1463*9371c9d4SSatish Balay   SOR_APPLY_LOWER           = 128
1464*9371c9d4SSatish Balay } MatSORType;
1465014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSOR(Mat, Vec, PetscReal, MatSORType, PetscReal, PetscInt, PetscInt, Vec);
14668ed539a5SBarry Smith 
14677086a01eSPeter Brune /*S
14687086a01eSPeter Brune      MatColoring - Object for managing the coloring of matrices.
14697086a01eSPeter Brune 
14707086a01eSPeter Brune    Level: beginner
14717086a01eSPeter Brune 
1472ec5066bdSBarry Smith     Notes:
147387497f52SBarry Smith        Coloring of matrices can be computed directly from the sparse matrix nonzero structure via the `MatColoring` object or from the mesh from which the
147487497f52SBarry Smith        matrix comes from via `DMCreateColoring()`. In general using the mesh produces a more optimal coloring (fewer colors).
1475ec5066bdSBarry Smith 
147687497f52SBarry Smith        Once a coloring is available `MatFDColoringCreate()` creates an object that can be used to efficiently compute Jacobians using that coloring. This
1477ec5066bdSBarry Smith        same object can also be used to efficiently convert data created by Automatic Differentation tools to PETSc sparse matrices.
1478ec5066bdSBarry Smith 
1479db781477SPatrick Sanan .seealso: `MatFDColoringCreate()`, `MatColoringWeightType`, `ISColoring`, `MatFDColoring`, `DMCreateColoring()`, `MatColoringCreate()`, `MatOrdering`, `MatPartitioning`, `MatColoringType`
14807086a01eSPeter Brune S*/
1481d4db15c4SBarry Smith typedef struct _p_MatColoring *MatColoring;
1482d4db15c4SBarry Smith 
1483d4db15c4SBarry Smith /*J
1484d4db15c4SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring
1485d9274352SBarry Smith 
1486d9274352SBarry Smith    Level: beginner
1487d9274352SBarry Smith 
1488db781477SPatrick Sanan .seealso: `MatColoringSetType()`, `MatColoring`
148976bdecfbSBarry Smith J*/
149019fd82e9SBarry Smith typedef const char *MatColoringType;
14915567d71aSPeter Brune #define MATCOLORINGJP      "jp"
1492b9acb617SPeter Brune #define MATCOLORINGPOWER   "power"
14932692d6eeSBarry Smith #define MATCOLORINGNATURAL "natural"
14942692d6eeSBarry Smith #define MATCOLORINGSL      "sl"
14952692d6eeSBarry Smith #define MATCOLORINGLF      "lf"
14962692d6eeSBarry Smith #define MATCOLORINGID      "id"
14978121bdceSPeter Brune #define MATCOLORINGGREEDY  "greedy"
1498b12f92e5SBarry Smith 
14998ac6da0aSPeter Brune /*E
15008ac6da0aSPeter Brune    MatColoringWeightType - Type of weight scheme
15018ac6da0aSPeter Brune 
15028ac6da0aSPeter Brune     Not Collective
15038ac6da0aSPeter Brune 
150487497f52SBarry Smith +   `MAT_COLORING_RANDOM`  - Random weights
150587497f52SBarry Smith .   `MAT_COLORING_LEXICAL` - Lexical weighting based upon global numbering.
150687497f52SBarry Smith -   `MAT_COLORING_LF`      - Last-first weighting.
15078ac6da0aSPeter Brune 
15088ac6da0aSPeter Brune     Level: intermediate
15098ac6da0aSPeter Brune 
151087497f52SBarry Smith    Developer Note:
1511af0996ceSBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
1512ec5066bdSBarry Smith 
1513db781477SPatrick Sanan .seealso: `MatColoring`, `MatColoringCreate()`
15148ac6da0aSPeter Brune E*/
1515*9371c9d4SSatish Balay typedef enum {
1516*9371c9d4SSatish Balay   MAT_COLORING_WEIGHT_RANDOM,
1517*9371c9d4SSatish Balay   MAT_COLORING_WEIGHT_LEXICAL,
1518*9371c9d4SSatish Balay   MAT_COLORING_WEIGHT_LF,
1519*9371c9d4SSatish Balay   MAT_COLORING_WEIGHT_SL
1520*9371c9d4SSatish Balay } MatColoringWeightType;
15218ac6da0aSPeter Brune 
1522335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringCreate(Mat, MatColoring *);
1523d7f2a307SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringGetDegrees(Mat, PetscInt, PetscInt *);
1524335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringDestroy(MatColoring *);
1525335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringView(MatColoring, PetscViewer);
1526335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringSetType(MatColoring, MatColoringType);
1527335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringSetFromOptions(MatColoring);
1528335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringSetDistance(MatColoring, PetscInt);
1529335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringGetDistance(MatColoring, PetscInt *);
1530335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringSetMaxColors(MatColoring, PetscInt);
1531335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringGetMaxColors(MatColoring, PetscInt *);
1532335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringApply(MatColoring, ISColoring *);
1533335efc43SPeter Brune PETSC_EXTERN PetscErrorCode MatColoringRegister(const char[], PetscErrorCode (*)(MatColoring));
1534014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatColoringPatch(Mat, PetscInt, PetscInt, ISColoringValue[], ISColoring *);
15358ac6da0aSPeter Brune PETSC_EXTERN PetscErrorCode MatColoringSetWeightType(MatColoring, MatColoringWeightType);
1536c29971fcSPeter Brune PETSC_EXTERN PetscErrorCode MatColoringSetWeights(MatColoring, PetscReal *, PetscInt *);
15378ac6da0aSPeter Brune PETSC_EXTERN PetscErrorCode MatColoringCreateWeights(MatColoring, PetscReal **, PetscInt **lperm);
1538bc76d17bSHong Zhang PETSC_EXTERN PetscErrorCode MatColoringTest(MatColoring, ISColoring);
1539*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatColoringTest() (since version 3.10)") static inline PetscErrorCode MatColoringTestValid(MatColoring matcoloring, ISColoring iscoloring) {
1540*9371c9d4SSatish Balay   return MatColoringTest(matcoloring, iscoloring);
1541*9371c9d4SSatish Balay }
1542bc76d17bSHong Zhang PETSC_EXTERN PetscErrorCode MatISColoringTest(Mat, ISColoring);
1543639f9d9dSBarry Smith 
1544d9274352SBarry Smith /*S
154587497f52SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences with coloring
1546639f9d9dSBarry Smith 
1547d9274352SBarry Smith    Level: beginner
1548d9274352SBarry Smith 
1549ec5066bdSBarry Smith    Notes:
155087497f52SBarry Smith       This object is creating utilizing a coloring provided by the `MatColoring` object or `DMCreateColoring()`
1551ec5066bdSBarry Smith 
155287497f52SBarry Smith .seealso: `MatFDColoringCreate()`, `MatFDColoringSetFunction()`, `MatColoring`, `DMCreateColoring()`
1553d9274352SBarry Smith S*/
1554e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
1555639f9d9dSBarry Smith 
1556014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringCreate(Mat, ISColoring, MatFDColoring *);
1557014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringDestroy(MatFDColoring *);
1558014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringView(MatFDColoring, PetscViewer);
1559014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringSetFunction(MatFDColoring, PetscErrorCode (*)(void), void *);
1560014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringGetFunction(MatFDColoring, PetscErrorCode (**)(void), void **);
1561014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringSetParameters(MatFDColoring, PetscReal, PetscReal);
1562014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringSetFromOptions(MatFDColoring);
1563d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode MatFDColoringApply(Mat, MatFDColoring, Vec, void *);
1564014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatFDColoringSetF(MatFDColoring, Vec);
1565edaa7c33SBarry Smith PETSC_EXTERN PetscErrorCode MatFDColoringGetPerturbedColumns(MatFDColoring, PetscInt *, const PetscInt *[]);
1566f86b9fbaSHong Zhang PETSC_EXTERN PetscErrorCode MatFDColoringSetUp(Mat, ISColoring, MatFDColoring);
1567f86b9fbaSHong Zhang PETSC_EXTERN PetscErrorCode MatFDColoringSetBlockSize(MatFDColoring, PetscInt, PetscInt);
1568bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode MatFDColoringSetValues(Mat, MatFDColoring, const PetscScalar *);
1569b1683b59SHong Zhang 
1570b1683b59SHong Zhang /*S
1571b9af6bddSHong Zhang      MatTransposeColoring - Object for computing a sparse matrix product C=A*B^T via coloring
1572b1683b59SHong Zhang 
1573b1683b59SHong Zhang    Level: beginner
1574b1683b59SHong Zhang 
1575db781477SPatrick Sanan .seealso: `MatTransposeColoringCreate()`
1576b1683b59SHong Zhang S*/
1577b9af6bddSHong Zhang typedef struct _p_MatTransposeColoring *MatTransposeColoring;
1578b1683b59SHong Zhang 
1579014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatTransposeColoringCreate(Mat, ISColoring, MatTransposeColoring *);
1580014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatTransColoringApplySpToDen(MatTransposeColoring, Mat, Mat);
1581014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatTransColoringApplyDenToSp(MatTransposeColoring, Mat, Mat);
1582014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatTransposeColoringDestroy(MatTransposeColoring *);
1583b1683b59SHong Zhang 
1584d9274352SBarry Smith /*S
1585d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
1586d9274352SBarry Smith 
1587d9274352SBarry Smith    Level: beginner
1588d9274352SBarry Smith 
158987497f52SBarry Smith    Note:
159087497f52SBarry Smith      There is also a `PetscPartitioner` object that provides the same functionality. It can utilize the `MatPartitioning` operations
159187497f52SBarry Smith      via `PetscPartitionerSetType`(p,`PETSCPARTITIONERMATPARTITIONING`)
1592ec5066bdSBarry Smith 
1593ec5066bdSBarry Smith    Developers Note:
1594ec5066bdSBarry Smith      It is an extra maintainance and documentation cost to have two objects with the same functionality.
1595ec5066bdSBarry Smith 
1596db781477SPatrick Sanan .seealso: `MatPartitioningCreate()`, `MatPartitioningType`, `MatColoring`, `MatGetOrdering()`
1597d9274352SBarry Smith S*/
159891e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
1599d9274352SBarry Smith 
160076bdecfbSBarry Smith /*J
16018f6c3df8SBarry Smith     MatPartitioningType - String with the name of a PETSc matrix partitioning
1602d9274352SBarry Smith 
1603d9274352SBarry Smith    Level: beginner
16040d04baf8SBarry Smith dm
160587497f52SBarry Smith .seealso: `MatPartitioningCreate()`, `MatPartitioning`, `MatPartitioningSetType()`
160676bdecfbSBarry Smith J*/
160719fd82e9SBarry Smith typedef const char *MatPartitioningType;
16082692d6eeSBarry Smith #define MATPARTITIONINGCURRENT  "current"
1609aa1e27eaSFande Kong #define MATPARTITIONINGAVERAGE  "average"
16102692d6eeSBarry Smith #define MATPARTITIONINGSQUARE   "square"
16112692d6eeSBarry Smith #define MATPARTITIONINGPARMETIS "parmetis"
16122692d6eeSBarry Smith #define MATPARTITIONINGCHACO    "chaco"
16132692d6eeSBarry Smith #define MATPARTITIONINGPARTY    "party"
161450d91057SBarry Smith #define MATPARTITIONINGPTSCOTCH "ptscotch"
161588d2ac2bSFande Kong #define MATPARTITIONINGHIERARCH "hierarch"
161671306c60Sjroman 
1617014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningCreate(MPI_Comm, MatPartitioning *);
161819fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode MatPartitioningSetType(MatPartitioning, MatPartitioningType);
1619014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningSetNParts(MatPartitioning, PetscInt);
1620014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningSetAdjacency(MatPartitioning, Mat);
1621252a1336SBarry Smith PETSC_EXTERN PetscErrorCode MatPartitioningSetNumberVertexWeights(MatPartitioning, PetscInt);
1622014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningSetVertexWeights(MatPartitioning, const PetscInt[]);
1623014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningSetPartitionWeights(MatPartitioning, const PetscReal[]);
1624ebf67979SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningSetUseEdgeWeights(MatPartitioning, PetscBool);
1625ebf67979SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningGetUseEdgeWeights(MatPartitioning, PetscBool *);
1626014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningApply(MatPartitioning, IS *);
1627fdd1c351SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningImprove(MatPartitioning, IS *);
1628668144dbSFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningViewImbalance(MatPartitioning, IS);
1629f3ad2dabSStefano Zampini PETSC_EXTERN PetscErrorCode MatPartitioningApplyND(MatPartitioning, IS *);
1630014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningDestroy(MatPartitioning *);
1631bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode MatPartitioningRegister(const char[], PetscErrorCode (*)(MatPartitioning));
1632014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningView(MatPartitioning, PetscViewer);
1633fe2efc57SMark PETSC_EXTERN PetscErrorCode MatPartitioningViewFromOptions(MatPartitioning, PetscObject, const char[]);
1634014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningSetFromOptions(MatPartitioning);
163519fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode MatPartitioningGetType(MatPartitioning, MatPartitioningType *);
1636ca161407SBarry Smith 
163727538973SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningParmetisSetRepartition(MatPartitioning part);
1638014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
1639014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningParmetisGetEdgeCut(MatPartitioning, PetscInt *);
16400752156aSBarry Smith 
1641*9371c9d4SSatish Balay typedef enum {
1642*9371c9d4SSatish Balay   MP_CHACO_MULTILEVEL = 1,
1643*9371c9d4SSatish Balay   MP_CHACO_SPECTRAL   = 2,
1644*9371c9d4SSatish Balay   MP_CHACO_LINEAR     = 4,
1645*9371c9d4SSatish Balay   MP_CHACO_RANDOM     = 5,
1646*9371c9d4SSatish Balay   MP_CHACO_SCATTERED  = 6
1647*9371c9d4SSatish Balay } MPChacoGlobalType;
16486a6fc655SJed Brown PETSC_EXTERN const char *const MPChacoGlobalTypes[];
1649*9371c9d4SSatish Balay typedef enum {
1650*9371c9d4SSatish Balay   MP_CHACO_KERNIGHAN = 1,
1651*9371c9d4SSatish Balay   MP_CHACO_NONE      = 2
1652*9371c9d4SSatish Balay } MPChacoLocalType;
16536a6fc655SJed Brown PETSC_EXTERN const char *const MPChacoLocalTypes[];
1654*9371c9d4SSatish Balay typedef enum {
1655*9371c9d4SSatish Balay   MP_CHACO_LANCZOS = 0,
1656*9371c9d4SSatish Balay   MP_CHACO_RQI     = 1
1657*9371c9d4SSatish Balay } MPChacoEigenType;
16586a6fc655SJed Brown PETSC_EXTERN const char *const MPChacoEigenTypes[];
1659b6956c12SJose Roman 
1660014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetGlobal(MatPartitioning, MPChacoGlobalType);
1661014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetGlobal(MatPartitioning, MPChacoGlobalType *);
1662014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetLocal(MatPartitioning, MPChacoLocalType);
1663014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetLocal(MatPartitioning, MPChacoLocalType *);
1664014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetCoarseLevel(MatPartitioning, PetscReal);
1665014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenSolver(MatPartitioning, MPChacoEigenType);
1666014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenSolver(MatPartitioning, MPChacoEigenType *);
1667014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenTol(MatPartitioning, PetscReal);
1668014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenTol(MatPartitioning, PetscReal *);
1669014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenNumber(MatPartitioning, PetscInt);
1670014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenNumber(MatPartitioning, PetscInt *);
167171306c60Sjroman 
167271306c60Sjroman #define MP_PARTY_OPT "opt"
167371306c60Sjroman #define MP_PARTY_LIN "lin"
167471306c60Sjroman #define MP_PARTY_SCA "sca"
167571306c60Sjroman #define MP_PARTY_RAN "ran"
167671306c60Sjroman #define MP_PARTY_GBF "gbf"
167771306c60Sjroman #define MP_PARTY_GCF "gcf"
167871306c60Sjroman #define MP_PARTY_BUB "bub"
167971306c60Sjroman #define MP_PARTY_DEF "def"
1680014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPartySetGlobal(MatPartitioning, const char *);
168171306c60Sjroman #define MP_PARTY_HELPFUL_SETS  "hs"
168271306c60Sjroman #define MP_PARTY_KERNIGHAN_LIN "kl"
168371306c60Sjroman #define MP_PARTY_NONE          "no"
1684014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPartySetLocal(MatPartitioning, const char *);
1685014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPartySetCoarseLevel(MatPartitioning, PetscReal);
1686014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPartySetBipart(MatPartitioning, PetscBool);
1687014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPartySetMatchOptimization(MatPartitioning, PetscBool);
168871306c60Sjroman 
1689*9371c9d4SSatish Balay typedef enum {
1690*9371c9d4SSatish Balay   MP_PTSCOTCH_DEFAULT,
1691*9371c9d4SSatish Balay   MP_PTSCOTCH_QUALITY,
1692*9371c9d4SSatish Balay   MP_PTSCOTCH_SPEED,
1693*9371c9d4SSatish Balay   MP_PTSCOTCH_BALANCE,
1694*9371c9d4SSatish Balay   MP_PTSCOTCH_SAFETY,
1695*9371c9d4SSatish Balay   MP_PTSCOTCH_SCALABILITY
1696*9371c9d4SSatish Balay } MPPTScotchStrategyType;
16976a6fc655SJed Brown PETSC_EXTERN const char *const MPPTScotchStrategyTypes[];
1698e0f1cffaSJose Roman 
1699014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetImbalance(MatPartitioning, PetscReal);
1700014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetImbalance(MatPartitioning, PetscReal *);
1701014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetStrategy(MatPartitioning, MPPTScotchStrategyType);
1702014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetStrategy(MatPartitioning, MPPTScotchStrategyType *);
170371306c60Sjroman 
1704b43b03e9SMark F. Adams /*
17056294fa2bSFande Kong  * hierarchical partitioning
17066294fa2bSFande Kong  */
17074e713f55SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalGetFineparts(MatPartitioning, IS *);
17084e713f55SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalGetCoarseparts(MatPartitioning, IS *);
17094e713f55SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalSetNcoarseparts(MatPartitioning, PetscInt);
17104e713f55SFande Kong PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalSetNfineparts(MatPartitioning, PetscInt);
17116294fa2bSFande Kong 
1712014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMeshToVertexGraph(Mat, PetscInt, Mat *);
1713014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMeshToCellGraph(Mat, PetscInt, Mat *);
1714591294e4SBarry Smith 
17150752156aSBarry Smith /*
1716c786d857SStefano Zampini     If you add entries here you must also add them to src/mat/f90-mod/petscmat.h
1717c786d857SStefano Zampini     If any of the enum values are changed, also update dMatOps dict at src/binding/petsc4py/src/libpetsc4py/libpetsc4py.pyx
1718d4fbbf0eSBarry Smith */
1719*9371c9d4SSatish Balay typedef enum {
1720*9371c9d4SSatish Balay   MATOP_SET_VALUES                = 0,
17211c1c02c0SLois Curfman McInnes   MATOP_GET_ROW                   = 1,
17221c1c02c0SLois Curfman McInnes   MATOP_RESTORE_ROW               = 2,
17231c1c02c0SLois Curfman McInnes   MATOP_MULT                      = 3,
17241c1c02c0SLois Curfman McInnes   MATOP_MULT_ADD                  = 4,
17257c922b88SBarry Smith   MATOP_MULT_TRANSPOSE            = 5,
17267c922b88SBarry Smith   MATOP_MULT_TRANSPOSE_ADD        = 6,
17271c1c02c0SLois Curfman McInnes   MATOP_SOLVE                     = 7,
17281c1c02c0SLois Curfman McInnes   MATOP_SOLVE_ADD                 = 8,
17297c922b88SBarry Smith   MATOP_SOLVE_TRANSPOSE           = 9,
17307c922b88SBarry Smith   MATOP_SOLVE_TRANSPOSE_ADD       = 10,
17311c1c02c0SLois Curfman McInnes   MATOP_LUFACTOR                  = 11,
17321c1c02c0SLois Curfman McInnes   MATOP_CHOLESKYFACTOR            = 12,
1733a714c06dSBarry Smith   MATOP_SOR                       = 13,
17341c1c02c0SLois Curfman McInnes   MATOP_TRANSPOSE                 = 14,
17351c1c02c0SLois Curfman McInnes   MATOP_GETINFO                   = 15,
17361c1c02c0SLois Curfman McInnes   MATOP_EQUAL                     = 16,
17371c1c02c0SLois Curfman McInnes   MATOP_GET_DIAGONAL              = 17,
17381c1c02c0SLois Curfman McInnes   MATOP_DIAGONAL_SCALE            = 18,
17391c1c02c0SLois Curfman McInnes   MATOP_NORM                      = 19,
17401c1c02c0SLois Curfman McInnes   MATOP_ASSEMBLY_BEGIN            = 20,
17411c1c02c0SLois Curfman McInnes   MATOP_ASSEMBLY_END              = 21,
1742d519adbfSMatthew Knepley   MATOP_SET_OPTION                = 22,
1743d519adbfSMatthew Knepley   MATOP_ZERO_ENTRIES              = 23,
1744d519adbfSMatthew Knepley   MATOP_ZERO_ROWS                 = 24,
1745d519adbfSMatthew Knepley   MATOP_LUFACTOR_SYMBOLIC         = 25,
1746d519adbfSMatthew Knepley   MATOP_LUFACTOR_NUMERIC          = 26,
1747d519adbfSMatthew Knepley   MATOP_CHOLESKY_FACTOR_SYMBOLIC  = 27,
1748d519adbfSMatthew Knepley   MATOP_CHOLESKY_FACTOR_NUMERIC   = 28,
1749e5f2d425SStefano Zampini   MATOP_SETUP                     = 29,
1750d519adbfSMatthew Knepley   MATOP_ILUFACTOR_SYMBOLIC        = 30,
1751d519adbfSMatthew Knepley   MATOP_ICCFACTOR_SYMBOLIC        = 31,
1752a5b7ff6bSBarry Smith   MATOP_GET_DIAGONAL_BLOCK        = 32,
1753e5f2d425SStefano Zampini   MATOP_SET_INF                   = 33,
1754d519adbfSMatthew Knepley   MATOP_DUPLICATE                 = 34,
1755d519adbfSMatthew Knepley   MATOP_FORWARD_SOLVE             = 35,
1756d519adbfSMatthew Knepley   MATOP_BACKWARD_SOLVE            = 36,
1757d519adbfSMatthew Knepley   MATOP_ILUFACTOR                 = 37,
1758d519adbfSMatthew Knepley   MATOP_ICCFACTOR                 = 38,
1759d519adbfSMatthew Knepley   MATOP_AXPY                      = 39,
17607dae84e0SHong Zhang   MATOP_CREATE_SUBMATRICES        = 40,
1761d519adbfSMatthew Knepley   MATOP_INCREASE_OVERLAP          = 41,
1762d519adbfSMatthew Knepley   MATOP_GET_VALUES                = 42,
1763d519adbfSMatthew Knepley   MATOP_COPY                      = 43,
1764d519adbfSMatthew Knepley   MATOP_GET_ROW_MAX               = 44,
1765d519adbfSMatthew Knepley   MATOP_SCALE                     = 45,
1766d519adbfSMatthew Knepley   MATOP_SHIFT                     = 46,
176735153367SBarry Smith   MATOP_DIAGONAL_SET              = 47,
17689d39f69dSJed Brown   MATOP_ZERO_ROWS_COLUMNS         = 48,
17699d39f69dSJed Brown   MATOP_SET_RANDOM                = 49,
1770d519adbfSMatthew Knepley   MATOP_GET_ROW_IJ                = 50,
1771d519adbfSMatthew Knepley   MATOP_RESTORE_ROW_IJ            = 51,
1772d519adbfSMatthew Knepley   MATOP_GET_COLUMN_IJ             = 52,
1773d519adbfSMatthew Knepley   MATOP_RESTORE_COLUMN_IJ         = 53,
1774d519adbfSMatthew Knepley   MATOP_FDCOLORING_CREATE         = 54,
1775d519adbfSMatthew Knepley   MATOP_COLORING_PATCH            = 55,
1776d519adbfSMatthew Knepley   MATOP_SET_UNFACTORED            = 56,
1777d519adbfSMatthew Knepley   MATOP_PERMUTE                   = 57,
1778d519adbfSMatthew Knepley   MATOP_SET_VALUES_BLOCKED        = 58,
17797dae84e0SHong Zhang   MATOP_CREATE_SUBMATRIX          = 59,
1780d519adbfSMatthew Knepley   MATOP_DESTROY                   = 60,
1781d519adbfSMatthew Knepley   MATOP_VIEW                      = 61,
1782d519adbfSMatthew Knepley   MATOP_CONVERT_FROM              = 62,
1783e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_63=63 */
17847bab7c10SHong Zhang   MATOP_MATMAT_MULT_SYMBOLIC      = 64,
17857bab7c10SHong Zhang   MATOP_MATMAT_MULT_NUMERIC       = 65,
1786d519adbfSMatthew Knepley   MATOP_SET_LOCAL_TO_GLOBAL_MAP   = 66,
1787d519adbfSMatthew Knepley   MATOP_SET_VALUES_LOCAL          = 67,
1788d519adbfSMatthew Knepley   MATOP_ZERO_ROWS_LOCAL           = 68,
1789d519adbfSMatthew Knepley   MATOP_GET_ROW_MAX_ABS           = 69,
1790d519adbfSMatthew Knepley   MATOP_GET_ROW_MIN_ABS           = 70,
1791d519adbfSMatthew Knepley   MATOP_CONVERT                   = 71,
1792e5f2d425SStefano Zampini   MATOP_HAS_OPERATION             = 72,
17939d39f69dSJed Brown   /* MATOP_PLACEHOLDER_73=73, */
1794d519adbfSMatthew Knepley   MATOP_SET_VALUES_ADIFOR         = 74,
1795d519adbfSMatthew Knepley   MATOP_FD_COLORING_APPLY         = 75,
1796d519adbfSMatthew Knepley   MATOP_SET_FROM_OPTIONS          = 76,
1797e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_77=77, */
1798e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_78=78, */
17999d39f69dSJed Brown   MATOP_FIND_ZERO_DIAGONALS       = 79,
1800d519adbfSMatthew Knepley   MATOP_MULT_MULTIPLE             = 80,
1801d519adbfSMatthew Knepley   MATOP_SOLVE_MULTIPLE            = 81,
1802d519adbfSMatthew Knepley   MATOP_GET_INERTIA               = 82,
1803d519adbfSMatthew Knepley   MATOP_LOAD                      = 83,
1804d519adbfSMatthew Knepley   MATOP_IS_SYMMETRIC              = 84,
1805d519adbfSMatthew Knepley   MATOP_IS_HERMITIAN              = 85,
1806d519adbfSMatthew Knepley   MATOP_IS_STRUCTURALLY_SYMMETRIC = 86,
1807820469bcSHong Zhang   MATOP_SET_VALUES_BLOCKEDLOCAL   = 87,
1808b41ce5d5SBarry Smith   MATOP_CREATE_VECS               = 88,
1809e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_89=89, */
1810d519adbfSMatthew Knepley   MATOP_MAT_MULT_SYMBOLIC         = 90,
1811d519adbfSMatthew Knepley   MATOP_MAT_MULT_NUMERIC          = 91,
1812e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_92=92, */
1813d519adbfSMatthew Knepley   MATOP_PTAP_SYMBOLIC             = 93,
1814d519adbfSMatthew Knepley   MATOP_PTAP_NUMERIC              = 94,
1815e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_95=95, */
1816bda6c4cbSBarry Smith   MATOP_MAT_TRANSPOSE_MULT_SYMBO  = 96,
1817bda6c4cbSBarry Smith   MATOP_MAT_TRANSPOSE_MULT_NUMER  = 97,
1818e5f2d425SStefano Zampini   MATOP_BIND_TO_CPU               = 98,
18197a3c3d58SStefano Zampini   MATOP_PRODUCTSETFROMOPTIONS     = 99,
18207a3c3d58SStefano Zampini   MATOP_PRODUCTSYMBOLIC           = 100,
18217a3c3d58SStefano Zampini   MATOP_PRODUCTNUMERIC            = 101,
1822d519adbfSMatthew Knepley   MATOP_CONJUGATE                 = 102,
1823e5f2d425SStefano Zampini   MATOP_VIEW_NATIVE               = 103,
1824d519adbfSMatthew Knepley   MATOP_SET_VALUES_ROW            = 104,
1825d519adbfSMatthew Knepley   MATOP_REAL_PART                 = 105,
1826bda6c4cbSBarry Smith   MATOP_IMAGINARY_PART            = 106,
1827bda6c4cbSBarry Smith   MATOP_GET_ROW_UPPER_TRIANGULAR  = 107,
1828bda6c4cbSBarry Smith   MATOP_RESTORE_ROW_UPPER_TRIANG  = 108,
1829bda6c4cbSBarry Smith   MATOP_MAT_SOLVE                 = 109,
183029eadf9eSStefano Zampini   MATOP_MAT_SOLVE_TRANSPOSE       = 110,
1831d519adbfSMatthew Knepley   MATOP_GET_ROW_MIN               = 111,
18320e8d04f7SBarry Smith   MATOP_GET_COLUMN_VECTOR         = 112,
1833d519adbfSMatthew Knepley   MATOP_MISSING_DIAGONAL          = 113,
18340e8d04f7SBarry Smith   MATOP_GET_SEQ_NONZERO_STRUCTUR  = 114,
183589c6957cSBarry Smith   MATOP_CREATE                    = 115,
183689c6957cSBarry Smith   MATOP_GET_GHOSTS                = 116,
18370e8d04f7SBarry Smith   MATOP_GET_LOCAL_SUB_MATRIX      = 117,
18380e8d04f7SBarry Smith   MATOP_RESTORE_LOCALSUB_MATRIX   = 118,
1839eeffb40dSHong Zhang   MATOP_MULT_DIAGONAL_BLOCK       = 119,
18400e8d04f7SBarry Smith   MATOP_HERMITIAN_TRANSPOSE       = 120,
18410e8d04f7SBarry Smith   MATOP_MULT_HERMITIAN_TRANSPOSE  = 121,
18420e8d04f7SBarry Smith   MATOP_MULT_HERMITIAN_TRANS_ADD  = 122,
18430e8d04f7SBarry Smith   MATOP_GET_MULTI_PROC_BLOCK      = 123,
18449d39f69dSJed Brown   MATOP_FIND_NONZERO_ROWS         = 124,
18450e8d04f7SBarry Smith   MATOP_GET_COLUMN_NORMS          = 125,
18469d39f69dSJed Brown   MATOP_INVERT_BLOCK_DIAGONAL     = 126,
1847e5f2d425SStefano Zampini   MATOP_INVERT_VBLOCK_DIAGONAL    = 127,
1848b41ce5d5SBarry Smith   MATOP_CREATE_SUB_MATRICES_MPI   = 128,
18492b8ad9a3SHong Zhang   MATOP_SET_VALUES_BATCH          = 129,
1850e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_130=130, */
18510e8d04f7SBarry Smith   MATOP_TRANSPOSE_MAT_MULT_SYMBO  = 131,
1852e9b602ebSSatish Balay   MATOP_TRANSPOSE_MAT_MULT_NUMER  = 132,
18530e8d04f7SBarry Smith   MATOP_TRANSPOSE_COLORING_CREAT  = 133,
18540e8d04f7SBarry Smith   MATOP_TRANS_COLORING_APPLY_SPT  = 134,
18550e8d04f7SBarry Smith   MATOP_TRANS_COLORING_APPLY_DEN  = 135,
1856e5f2d425SStefano Zampini   /* MATOP_PLACEHOLDER_136=136, */
18570e8d04f7SBarry Smith   MATOP_RART_SYMBOLIC             = 137,
18580e8d04f7SBarry Smith   MATOP_RART_NUMERIC              = 138,
1859e09a3074SHong Zhang   MATOP_SET_BLOCK_SIZES           = 139,
1860f9426fe0SMark Adams   MATOP_AYPX                      = 140,
18611919a2e2SJed Brown   MATOP_RESIDUAL                  = 141,
18629c8f2541SHong Zhang   MATOP_FDCOLORING_SETUP          = 142,
1863e5f2d425SStefano Zampini   MATOP_FIND_OFFBLOCK_ENTRIES     = 143,
18642d033e1fSHong Zhang   MATOP_MPICONCATENATESEQ         = 144,
1865bb01b7b0SPatrick Sanan   MATOP_DESTROYSUBMATRICES        = 145,
1866e265f6d6SPatrick Sanan   MATOP_TRANSPOSE_SOLVE           = 146,
1867e265f6d6SPatrick Sanan   MATOP_GET_VALUES_LOCAL          = 147
1868fae171e0SBarry Smith } MatOperation;
18690c0fd78eSBarry Smith PETSC_EXTERN PetscErrorCode MatSetOperation(Mat, MatOperation, void (*)(void));
1870976e8c5aSLisandro Dalcin PETSC_EXTERN PetscErrorCode MatGetOperation(Mat, MatOperation, void (**)(void));
1871976e8c5aSLisandro Dalcin PETSC_EXTERN PetscErrorCode MatHasOperation(Mat, MatOperation, PetscBool *);
187294342113SStefano Zampini PETSC_EXTERN PetscErrorCode MatHasCongruentLayouts(Mat, PetscBool *);
1873*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatProductClear() (since version 3.14)") static inline PetscErrorCode MatFreeIntermediateDataStructures(Mat A) {
1874*9371c9d4SSatish Balay   return MatProductClear(A);
1875*9371c9d4SSatish Balay }
1876014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatShellSetOperation(Mat, MatOperation, void (*)(void));
1877014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatShellGetOperation(Mat, MatOperation, void (**)(void));
1878014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatShellSetContext(Mat, void *);
1879800f99ffSJeremy L Thompson PETSC_EXTERN PetscErrorCode MatShellSetContextDestroy(Mat, PetscErrorCode (*)(void *));
1880db77db73SJeremy L Thompson PETSC_EXTERN PetscErrorCode MatShellSetVecType(Mat, VecType);
1881f3b1f45cSBarry Smith PETSC_EXTERN PetscErrorCode MatShellTestMult(Mat, PetscErrorCode (*)(void *, Vec, Vec), Vec, void *, PetscBool *);
1882f3b1f45cSBarry Smith PETSC_EXTERN PetscErrorCode MatShellTestMultTranspose(Mat, PetscErrorCode (*)(void *, Vec, Vec), Vec, void *, PetscBool *);
18830c0fd78eSBarry Smith PETSC_EXTERN PetscErrorCode MatShellSetManageScalingShifts(Mat);
1884b77ba244SStefano Zampini PETSC_EXTERN PetscErrorCode MatShellSetMatProductOperation(Mat, MatProductType, PetscErrorCode (*)(Mat, Mat, Mat, void **), PetscErrorCode (*)(Mat, Mat, Mat, void *), PetscErrorCode (*)(void *), MatType, MatType);
1885b77ba244SStefano Zampini PETSC_EXTERN PetscErrorCode MatIsShell(Mat, PetscBool *);
1886112a2221SBarry Smith 
188790ace30eSBarry Smith /*
188890ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
188990ace30eSBarry Smith    stored in a universal format. By changing the format with
18906a9046bcSBarry Smith    PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE); the matrices will
189190ace30eSBarry Smith    be stored in a way natural for the matrix, for example dense matrices
189290ace30eSBarry Smith    would be stored as dense. Matrices stored this way may only be
1893f4403165SShri Abhyankar    read into matrices of the same type.
189490ace30eSBarry Smith */
189590ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
189690ace30eSBarry Smith 
1897014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPIBAIJSetHashTableFactor(Mat, PetscReal);
189875d48cdbSStefano Zampini 
18998546b261SStefano Zampini PETSC_EXTERN PetscErrorCode MatISSetLocalMatType(Mat, MatType);
190075d48cdbSStefano Zampini PETSC_EXTERN PetscErrorCode MatISSetPreallocation(Mat, PetscInt, const PetscInt[], PetscInt, const PetscInt[]);
190175d48cdbSStefano Zampini PETSC_EXTERN PetscErrorCode MatISStoreL2L(Mat, PetscBool);
1902f03112d0SStefano Zampini PETSC_EXTERN PetscErrorCode MatISFixLocalEmpty(Mat, PetscBool);
1903014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatISGetLocalMat(Mat, Mat *);
19043b3b1effSJed Brown PETSC_EXTERN PetscErrorCode MatISRestoreLocalMat(Mat, Mat *);
1905014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatISSetLocalMat(Mat, Mat);
1906e432b41dSStefano Zampini PETSC_EXTERN PetscErrorCode MatISGetLocalToGlobalMapping(Mat, ISLocalToGlobalMapping *, ISLocalToGlobalMapping *);
190725ef9dfeSBarry Smith PETSC_EXTERN                PETSC_DEPRECATED_FUNCTION("Use the MatConvert() interface (since version 3.10)") PetscErrorCode MatISGetMPIXAIJ(Mat, MatReuse, Mat *);
19081f4e1ec7SBarry Smith 
1909d9274352SBarry Smith /*S
1910d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
1911cb6b9846SMatthew Knepley          orthogonalizes the vector to a subspace
1912d9274352SBarry Smith 
1913f7a9e4ceSBarry Smith    Level: advanced
1914d9274352SBarry Smith 
191587497f52SBarry Smith .seealso: `MatNullSpaceCreate()`, `MatNullSpaceSetFunction()`, `MatGetNullSpace()`, `MatSetNullSpace()`
1916d9274352SBarry Smith S*/
191774637425SBarry Smith typedef struct _p_MatNullSpace *MatNullSpace;
1918d9274352SBarry Smith 
1919014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceCreate(MPI_Comm, PetscBool, PetscInt, const Vec[], MatNullSpace *);
1920014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceSetFunction(MatNullSpace, PetscErrorCode (*)(MatNullSpace, Vec, void *), void *);
1921014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceDestroy(MatNullSpace *);
1922d0195637SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceRemove(MatNullSpace, Vec);
1923014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetNullSpace(Mat, MatNullSpace *);
19245fa7ec2dSBarry Smith PETSC_EXTERN PetscErrorCode MatGetTransposeNullSpace(Mat, MatNullSpace *);
19255fa7ec2dSBarry Smith PETSC_EXTERN PetscErrorCode MatSetTransposeNullSpace(Mat, MatNullSpace);
1926014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetNullSpace(Mat, MatNullSpace);
1927014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSetNearNullSpace(Mat, MatNullSpace);
1928014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatGetNearNullSpace(Mat, MatNullSpace *);
1929014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceTest(MatNullSpace, Mat, PetscBool *);
1930014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceView(MatNullSpace, PetscViewer);
1931014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceGetVecs(MatNullSpace, PetscBool *, PetscInt *, const Vec **);
1932014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNullSpaceCreateRigidBody(Vec, MatNullSpace *);
193374637425SBarry Smith 
1934014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatReorderingSeqSBAIJ(Mat, IS);
1935014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMPISBAIJSetHashTableFactor(Mat, PetscReal);
1936014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetColumnIndices(Mat, PetscInt *);
19373f1d51d7SBarry Smith 
1938014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMAIJ(Mat, PetscInt, Mat *);
1939014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMAIJRedimension(Mat, PetscInt, Mat *);
1940014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMAIJGetAIJ(Mat, Mat *);
1941c4f061fbSSatish Balay 
19420bacdadaSStefano Zampini PETSC_EXTERN PetscErrorCode MatComputeOperator(Mat, MatType, Mat *);
19430bacdadaSStefano Zampini PETSC_EXTERN PetscErrorCode MatComputeOperatorTranspose(Mat, MatType, Mat *);
19440bacdadaSStefano Zampini 
1945*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatComputeOperator() (since version 3.12)") static inline PetscErrorCode MatComputeExplicitOperator(Mat A, Mat *B) {
1946*9371c9d4SSatish Balay   return MatComputeOperator(A, NULL, B);
1947*9371c9d4SSatish Balay }
1948*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatComputeOperatorTranspose() (since version 3.12)") static inline PetscErrorCode MatComputeExplicitOperatorTranspose(Mat A, Mat *B) {
1949*9371c9d4SSatish Balay   return MatComputeOperatorTranspose(A, NULL, B);
1950*9371c9d4SSatish Balay }
1951b0a32e0cSBarry Smith 
195249bd79ccSDebojyoti Ghosh PETSC_EXTERN PetscErrorCode MatCreateKAIJ(Mat, PetscInt, PetscInt, const PetscScalar[], const PetscScalar[], Mat *);
195349bd79ccSDebojyoti Ghosh PETSC_EXTERN PetscErrorCode MatKAIJGetAIJ(Mat, Mat *);
1954a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJGetS(Mat, PetscInt *, PetscInt *, PetscScalar **);
1955a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJGetSRead(Mat, PetscInt *, PetscInt *, const PetscScalar **);
1956a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJRestoreS(Mat, PetscScalar **);
1957a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJRestoreSRead(Mat, const PetscScalar **);
1958a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJGetT(Mat, PetscInt *, PetscInt *, PetscScalar **);
1959a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJGetTRead(Mat, PetscInt *, PetscInt *, const PetscScalar **);
1960a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJRestoreT(Mat, PetscScalar **);
1961a5b5c723SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJRestoreTRead(Mat, const PetscScalar **);
1962dbb4b592SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJSetAIJ(Mat, Mat);
1963dbb4b592SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJSetS(Mat, PetscInt, PetscInt, const PetscScalar[]);
1964dbb4b592SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatKAIJSetT(Mat, PetscInt, PetscInt, const PetscScalar[]);
1965910cf402Sprj- PETSC_EXTERN PetscErrorCode MatKAIJGetScaledIdentity(Mat, PetscBool *);
196649bd79ccSDebojyoti Ghosh 
1967014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatDiagonalScaleLocal(Mat, Vec);
196804f1ad80SBarry Smith 
1969014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateMFFD(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, Mat *);
1970014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetBase(Mat, Vec, Vec);
1971014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetFunction(Mat, PetscErrorCode (*)(void *, Vec, Vec), void *);
1972014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioni(Mat, PetscErrorCode (*)(void *, PetscInt, Vec, PetscScalar *));
1973014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioniBase(Mat, PetscErrorCode (*)(void *, Vec));
1974014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetHHistory(Mat, PetscScalar[], PetscInt);
1975014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDResetHHistory(Mat);
1976014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetFunctionError(Mat, PetscReal);
1977014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetPeriod(Mat, PetscInt);
1978014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDGetH(Mat, PetscScalar *);
1979014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetOptionsPrefix(Mat, const char[]);
1980014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDCheckPositivity(void *, Vec, Vec, PetscScalar *);
1981014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDSetCheckh(Mat, PetscErrorCode (*)(void *, Vec, Vec, PetscScalar *), void *);
1982e884886fSBarry Smith 
19836370053bSBarry Smith /*S
19846370053bSBarry Smith     MatMFFD - A data structured used to manage the computation of the h differencing parameter for matrix-free
19856370053bSBarry Smith               Jacobian vector products
1986e884886fSBarry Smith 
198795452b02SPatrick Sanan     Notes:
198887497f52SBarry Smith     `MATMFFD` is a specific `MatType` which uses the `MatMFFD` data structure
19896370053bSBarry Smith 
199087497f52SBarry Smith     MatMFFD*() methods actually take the Mat as their first argument. Not a `MatMFFD` data structure
19916370053bSBarry Smith 
19926370053bSBarry Smith     Level: developer
19936370053bSBarry Smith 
1994db781477SPatrick Sanan .seealso: `MATMFFD`, `MatCreateMFFD()`, `MatMFFDSetFuction()`, `MatMFFDSetType()`, `MatMFFDRegister()`
19956370053bSBarry Smith S*/
1996e884886fSBarry Smith typedef struct _p_MatMFFD *MatMFFD;
1997e884886fSBarry Smith 
199876bdecfbSBarry Smith /*J
1999e884886fSBarry Smith     MatMFFDType - algorithm used to compute the h used in computing matrix-vector products via differencing of the function
2000e884886fSBarry Smith 
2001e884886fSBarry Smith    Level: beginner
2002e884886fSBarry Smith 
2003db781477SPatrick Sanan .seealso: `MatMFFDSetType()`, `MatMFFDRegister()`
200476bdecfbSBarry Smith J*/
200519fd82e9SBarry Smith typedef const char *MatMFFDType;
2006e884886fSBarry Smith #define MATMFFD_DS "ds"
2007e884886fSBarry Smith #define MATMFFD_WP "wp"
2008e884886fSBarry Smith 
200919fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode MatMFFDSetType(Mat, MatMFFDType);
2010bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode MatMFFDRegister(const char[], PetscErrorCode (*)(MatMFFD));
2011e884886fSBarry Smith 
2012014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDDSSetUmin(Mat, PetscReal);
2013014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMFFDWPSetComputeNormU(Mat, PetscBool);
2014e884886fSBarry Smith 
201561ab5df0SBarry Smith PETSC_EXTERN PetscErrorCode MatFDColoringSetType(MatFDColoring, MatMFFDType);
201661ab5df0SBarry Smith 
2017014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutMatrix(PetscViewer, PetscInt, PetscInt, PetscReal *);
2018014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutCSRMatrix(PetscViewer, PetscInt, PetscInt, PetscInt *, PetscInt *, PetscReal *);
20197dbadf16SMatthew Knepley 
202053022affSStefano Zampini #ifdef PETSC_HAVE_H2OPUS
202153022affSStefano Zampini PETSC_EXTERN_TYPEDEF typedef PetscScalar (*MatH2OpusKernel)(PetscInt, PetscReal[], PetscReal[], void *);
202253022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatCreateH2OpusFromKernel(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscReal[], PetscBool, MatH2OpusKernel, void *, PetscReal, PetscInt, PetscInt, Mat *);
202353022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatCreateH2OpusFromMat(Mat, PetscInt, const PetscReal[], PetscBool, PetscReal, PetscInt, PetscInt, PetscInt, PetscReal, Mat *);
202453022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusSetSamplingMat(Mat, Mat, PetscInt, PetscReal);
202553022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusOrthogonalize(Mat);
202653022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusCompress(Mat, PetscReal);
202753022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusSetNativeMult(Mat, PetscBool);
202853022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusGetNativeMult(Mat, PetscBool *);
202953022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusGetIndexMap(Mat, IS *);
203053022affSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusMapVec(Mat, PetscBool, Vec, Vec *);
2031300d917bSStefano Zampini PETSC_EXTERN PetscErrorCode MatH2OpusLowRankUpdate(Mat, Mat, Mat, PetscScalar);
2032a0d2e7d8SStefano Zampini #endif
2033a0d2e7d8SStefano Zampini 
2034c7a4214aSPierre Jolivet #ifdef PETSC_HAVE_HTOOL
203598e73e17SPierre Jolivet PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*MatHtoolKernel)(PetscInt, PetscInt, PetscInt, const PetscInt *, const PetscInt *, PetscScalar *, void *);
2036c7a4214aSPierre Jolivet PETSC_EXTERN PetscErrorCode MatCreateHtoolFromKernel(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscReal[], const PetscReal[], MatHtoolKernel, void *, Mat *);
2037c7a4214aSPierre Jolivet PETSC_EXTERN PetscErrorCode MatHtoolSetKernel(Mat, MatHtoolKernel, void *);
203898e73e17SPierre Jolivet PETSC_EXTERN PetscErrorCode MatHtoolGetPermutationSource(Mat, IS *);
203998e73e17SPierre Jolivet PETSC_EXTERN PetscErrorCode MatHtoolGetPermutationTarget(Mat, IS *);
204098e73e17SPierre Jolivet PETSC_EXTERN PetscErrorCode MatHtoolUsePermutation(Mat, PetscBool);
2041c7a4214aSPierre Jolivet /*E
204287497f52SBarry Smith      MatHtoolCompressorType - Indicates the type of compressor used by a `MATHTOOL`
2043c7a4214aSPierre Jolivet 
2044c7a4214aSPierre Jolivet    Level: beginner
2045c7a4214aSPierre Jolivet 
2046c7a4214aSPierre Jolivet     Values:
204787497f52SBarry Smith +   `MAT_HTOOL_COMPRESSOR_SYMPARTIAL_ACA` (default) - symmetric partial adaptive cross approximation
204887497f52SBarry Smith .   `MAT_HTOOL_COMPRESSOR_FULL_ACA` - full adaptive cross approximation
204987497f52SBarry Smith -   `MAT_HTOOL_COMPRESSOR_SVD` - singular value decomposition
2050c7a4214aSPierre Jolivet 
2051db781477SPatrick Sanan .seealso: `MatCreateHtoolFromKernel()`, `MATHTOOL`, `MatHtoolClusteringType`
2052c7a4214aSPierre Jolivet E*/
2053*9371c9d4SSatish Balay typedef enum {
2054*9371c9d4SSatish Balay   MAT_HTOOL_COMPRESSOR_SYMPARTIAL_ACA,
2055*9371c9d4SSatish Balay   MAT_HTOOL_COMPRESSOR_FULL_ACA,
2056*9371c9d4SSatish Balay   MAT_HTOOL_COMPRESSOR_SVD
2057*9371c9d4SSatish Balay } MatHtoolCompressorType;
205898e73e17SPierre Jolivet /*E
205987497f52SBarry Smith      MatHtoolClusteringType - Indicates the type of clustering used by a `MATHTOOL`
206098e73e17SPierre Jolivet 
206198e73e17SPierre Jolivet    Level: beginner
206298e73e17SPierre Jolivet 
206398e73e17SPierre Jolivet     Values:
206487497f52SBarry Smith +   `MAT_HTOOL_CLUSTERING_PCA_REGULAR` (default) - axis computed via principle component analysis, split uniformly
206587497f52SBarry Smith .   `MAT_HTOOL_CLUSTERING_PCA_GEOMETRIC` - axis computed via principle component analysis, split barycentrically
206687497f52SBarry Smith .   `MAT_HTOOL_CLUSTERING_BOUNDING_BOX_1_REGULAR` - axis along the largest extent of the bounding box, split uniformly
206787497f52SBarry Smith -   `MAT_HTOOL_CLUSTERING_BOUNDING_BOX_1_GEOMETRIC` - axis along the largest extent of the bounding box, split barycentrically
206898e73e17SPierre Jolivet 
206998e73e17SPierre Jolivet     Notes: higher-dimensional clustering is not yet supported in Htool, but once it is, one should add BOUNDING_BOX_{2,3} types
207098e73e17SPierre Jolivet 
2071db781477SPatrick Sanan .seealso: `MatCreateHtoolFromKernel()`, `MATHTOOL`, `MatHtoolCompressorType`
207298e73e17SPierre Jolivet E*/
2073*9371c9d4SSatish Balay typedef enum {
2074*9371c9d4SSatish Balay   MAT_HTOOL_CLUSTERING_PCA_REGULAR,
2075*9371c9d4SSatish Balay   MAT_HTOOL_CLUSTERING_PCA_GEOMETRIC,
2076*9371c9d4SSatish Balay   MAT_HTOOL_CLUSTERING_BOUNDING_BOX_1_REGULAR,
2077*9371c9d4SSatish Balay   MAT_HTOOL_CLUSTERING_BOUNDING_BOX_1_GEOMETRIC
2078*9371c9d4SSatish Balay } MatHtoolClusteringType;
2079c7a4214aSPierre Jolivet #endif
2080c7a4214aSPierre Jolivet 
208197969023SHong Zhang #ifdef PETSC_HAVE_MUMPS
2082014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatMumpsSetIcntl(Mat, PetscInt, PetscInt);
2083bc6112feSHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetIcntl(Mat, PetscInt, PetscInt *);
2084b9e9ea26SSatish Balay PETSC_EXTERN PetscErrorCode MatMumpsSetCntl(Mat, PetscInt, PetscReal);
2085bc6112feSHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetCntl(Mat, PetscInt, PetscReal *);
2086bc6112feSHong Zhang 
2087ca810319SHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetInfo(Mat, PetscInt, PetscInt *);
2088ca810319SHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetInfog(Mat, PetscInt, PetscInt *);
2089ca810319SHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetRinfo(Mat, PetscInt, PetscReal *);
2090ca810319SHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetRinfog(Mat, PetscInt, PetscReal *);
209189a9c03aSHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetInverse(Mat, Mat);
20920e6b8875SHong Zhang PETSC_EXTERN PetscErrorCode MatMumpsGetInverseTranspose(Mat, Mat);
209397969023SHong Zhang #endif
209423a5497aSJed Brown 
2095b500a6b7SJose David Bermeol #ifdef PETSC_HAVE_MKL_PARDISO
2096d615f992SSatish Balay PETSC_EXTERN PetscErrorCode MatMkl_PardisoSetCntl(Mat, PetscInt, PetscInt);
2097b500a6b7SJose David Bermeol #endif
2098b500a6b7SJose David Bermeol 
2099d305a81bSVasiliy Kozyrev #ifdef PETSC_HAVE_MKL_CPARDISO
2100d305a81bSVasiliy Kozyrev PETSC_EXTERN PetscErrorCode MatMkl_CPardisoSetCntl(Mat, PetscInt, PetscInt);
2101d305a81bSVasiliy Kozyrev #endif
2102d305a81bSVasiliy Kozyrev 
2103d954db57SHong Zhang #ifdef PETSC_HAVE_SUPERLU
2104014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatSuperluSetILUDropTol(Mat, PetscReal);
2105d954db57SHong Zhang #endif
2106d954db57SHong Zhang 
2107fb785984SHong Zhang #ifdef PETSC_HAVE_SUPERLU_DIST
2108fb785984SHong Zhang PETSC_EXTERN PetscErrorCode MatSuperluDistGetDiagU(Mat, PetscScalar *);
2109fb785984SHong Zhang #endif
2110fb785984SHong Zhang 
2111575704cbSPieter Ghysels #ifdef PETSC_HAVE_STRUMPACK
2112542aee0fSPieter Ghysels /*E
211387497f52SBarry Smith     MatSTRUMPACKReordering - sparsity reducing ordering to be used in `STRUMPACK`
2114542aee0fSPieter Ghysels 
2115542aee0fSPieter Ghysels     Level: intermediate
2116542aee0fSPieter Ghysels E*/
2117*9371c9d4SSatish Balay typedef enum {
2118*9371c9d4SSatish Balay   MAT_STRUMPACK_NATURAL  = 0,
211934f43fa5SPieter Ghysels   MAT_STRUMPACK_METIS    = 1,
212034f43fa5SPieter Ghysels   MAT_STRUMPACK_PARMETIS = 2,
212134f43fa5SPieter Ghysels   MAT_STRUMPACK_SCOTCH   = 3,
212234f43fa5SPieter Ghysels   MAT_STRUMPACK_PTSCOTCH = 4,
2123*9371c9d4SSatish Balay   MAT_STRUMPACK_RCM      = 5
2124*9371c9d4SSatish Balay } MatSTRUMPACKReordering;
212534f43fa5SPieter Ghysels PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetReordering(Mat, MatSTRUMPACKReordering);
2126575704cbSPieter Ghysels PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetColPerm(Mat, PetscBool);
212734f43fa5SPieter Ghysels PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSRelTol(Mat, PetscReal);
2128*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatSTRUMPACKSetHSSRelTol() (since version 3.9)") static inline PetscErrorCode MatSTRUMPACKSetHSSRelCompTol(Mat mat, PetscReal rtol) {
2129*9371c9d4SSatish Balay   return MatSTRUMPACKSetHSSRelTol(mat, rtol);
2130*9371c9d4SSatish Balay }
213134f43fa5SPieter Ghysels PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSAbsTol(Mat, PetscReal);
213234f43fa5SPieter Ghysels PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSMinSepSize(Mat, PetscInt);
2133*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatSTRUMPACKSetHSSMinSepSize() (since version 3.9)") static inline PetscErrorCode MatSTRUMPACKSetHSSMinSize(Mat mat, PetscInt hssminsize) {
2134*9371c9d4SSatish Balay   return MatSTRUMPACKSetHSSMinSepSize(mat, hssminsize);
2135*9371c9d4SSatish Balay }
213634f43fa5SPieter Ghysels PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSMaxRank(Mat, PetscInt);
2137a36bf211SPieter Ghysels PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSLeafSize(Mat, PetscInt);
2138575704cbSPieter Ghysels #endif
2139575704cbSPieter Ghysels 
2140b470e4b4SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatBindToCPU(Mat, PetscBool);
21412216c58aSStefano Zampini PETSC_EXTERN PetscErrorCode MatBoundToCPU(Mat, PetscBool *);
2142*9371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use MatBindToCPU (since v3.13)") static inline PetscErrorCode MatPinToCPU(Mat A, PetscBool flg) {
2143*9371c9d4SSatish Balay   return MatBindToCPU(A, flg);
2144*9371c9d4SSatish Balay }
214565a9ecf2SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatSetBindingPropagates(Mat, PetscBool);
2146e9c74fd6SRichard Tran Mills PETSC_EXTERN PetscErrorCode MatGetBindingPropagates(Mat, PetscBool *);
2147e7e92044SBarry Smith 
2148042217e8SBarry Smith typedef struct _n_SplitCSRMat *PetscSplitCSRDataStructure;
2149042217e8SBarry Smith PETSC_EXTERN PetscErrorCode    MatCUSPARSEGetDeviceMatWrite(Mat, PetscSplitCSRDataStructure *);
2150a587d139SMark 
2151a587d139SMark #ifdef PETSC_HAVE_KOKKOS_KERNELS
2152042217e8SBarry Smith PETSC_EXTERN PetscErrorCode MatKokkosGetDeviceMatWrite(Mat, PetscSplitCSRDataStructure *);
2153042217e8SBarry Smith PETSC_EXTERN PetscErrorCode MatSeqAIJKokkosSetDeviceMat(Mat, PetscSplitCSRDataStructure);
2154042217e8SBarry Smith PETSC_EXTERN PetscErrorCode MatSeqAIJKokkosGetDeviceMat(Mat, PetscSplitCSRDataStructure *);
2155a587d139SMark #endif
2156a587d139SMark 
2157aa372e3fSPaul Mullowney #ifdef PETSC_HAVE_CUDA
21583f9c0db1SPaul Mullowney /*E
2159e057df02SPaul Mullowney     MatCUSPARSEStorageFormat - indicates the storage format for CUSPARSE (GPU)
21602692e278SPaul Mullowney     matrices.
2161e057df02SPaul Mullowney 
2162e057df02SPaul Mullowney     Not Collective
2163e057df02SPaul Mullowney 
216487497f52SBarry Smith +   `MAT_CUSPARSE_CSR` - Compressed Sparse Row
216587497f52SBarry Smith .   `MAT_CUSPARSE_ELL` - Ellpack (requires CUDA 4.2 or later).
216687497f52SBarry Smith -   `MAT_CUSPARSE_HYB` - Hybrid, a combination of Ellpack and Coordinate format (requires CUDA 4.2 or later).
2167e057df02SPaul Mullowney 
2168e057df02SPaul Mullowney     Level: intermediate
2169e057df02SPaul Mullowney 
217087497f52SBarry Smith    Developer Note:
2171af0996ceSBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h
2172e057df02SPaul Mullowney 
2173db781477SPatrick Sanan .seealso: `MatCUSPARSESetFormat()`, `MatCUSPARSEFormatOperation`
2174e057df02SPaul Mullowney E*/
2175e057df02SPaul Mullowney 
2176*9371c9d4SSatish Balay typedef enum {
2177*9371c9d4SSatish Balay   MAT_CUSPARSE_CSR,
2178*9371c9d4SSatish Balay   MAT_CUSPARSE_ELL,
2179*9371c9d4SSatish Balay   MAT_CUSPARSE_HYB
2180*9371c9d4SSatish Balay } MatCUSPARSEStorageFormat;
2181e057df02SPaul Mullowney 
2182e057df02SPaul Mullowney /* these will be strings associated with enumerated type defined above */
2183e057df02SPaul Mullowney PETSC_EXTERN const char *const MatCUSPARSEStorageFormats[];
2184e057df02SPaul Mullowney 
21853f9c0db1SPaul Mullowney /*E
2186e057df02SPaul Mullowney     MatCUSPARSEFormatOperation - indicates the operation of CUSPARSE (GPU)
21872692e278SPaul Mullowney     matrices whose operation should use a particular storage format.
2188e057df02SPaul Mullowney 
2189e057df02SPaul Mullowney     Not Collective
2190e057df02SPaul Mullowney 
219187497f52SBarry Smith +   `MAT_CUSPARSE_MULT_DIAG` - sets the storage format for the diagonal matrix in the parallel MatMult
219287497f52SBarry Smith .   `MAT_CUSPARSE_MULT_OFFDIAG` - sets the storage format for the offdiagonal matrix in the parallel MatMult
219387497f52SBarry Smith .   `MAT_CUSPARSE_MULT` - sets the storage format for the entire matrix in the serial (single GPU) MatMult
219487497f52SBarry Smith -   `MAT_CUSPARSE_ALL` - sets the storage format for all CUSPARSE (GPU) matrices
2195e057df02SPaul Mullowney 
2196e057df02SPaul Mullowney     Level: intermediate
2197e057df02SPaul Mullowney 
2198db781477SPatrick Sanan .seealso: `MatCUSPARSESetFormat()`, `MatCUSPARSEStorageFormat`
2199e057df02SPaul Mullowney E*/
2200*9371c9d4SSatish Balay typedef enum {
2201*9371c9d4SSatish Balay   MAT_CUSPARSE_MULT_DIAG,
2202*9371c9d4SSatish Balay   MAT_CUSPARSE_MULT_OFFDIAG,
2203*9371c9d4SSatish Balay   MAT_CUSPARSE_MULT,
2204*9371c9d4SSatish Balay   MAT_CUSPARSE_ALL
2205*9371c9d4SSatish Balay } MatCUSPARSEFormatOperation;
2206e057df02SPaul Mullowney 
220710e9db80SPaul Mullowney PETSC_EXTERN PetscErrorCode                  MatCreateSeqAIJCUSPARSE(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
220810e9db80SPaul Mullowney PETSC_EXTERN PetscErrorCode                  MatCreateAIJCUSPARSE(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
2209e057df02SPaul Mullowney PETSC_EXTERN PetscErrorCode                  MatCUSPARSESetFormat(Mat, MatCUSPARSEFormatOperation, MatCUSPARSEStorageFormat);
2210365b711fSMark Adams PETSC_EXTERN PetscErrorCode                  MatCUSPARSESetUseCPUSolve(Mat, PetscBool);
2211e8d2b73aSMark Adams typedef struct Mat_SeqAIJCUSPARSETriFactors *Mat_SeqAIJCUSPARSETriFactors_p;
22125f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSEGetIJ(Mat, PetscBool, const int **, const int **);
22135f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSERestoreIJ(Mat, PetscBool, const int **, const int **);
22145f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSEGetArrayRead(Mat, const PetscScalar **);
22155f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSERestoreArrayRead(Mat, const PetscScalar **);
22165f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSEGetArrayWrite(Mat, PetscScalar **);
22175f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSERestoreArrayWrite(Mat, PetscScalar **);
22185f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSEGetArray(Mat, PetscScalar **);
22195f101d05SStefano Zampini PETSC_EXTERN PetscErrorCode                  MatSeqAIJCUSPARSERestoreArray(Mat, PetscScalar **);
2220637a0070SStefano Zampini 
2221637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatCreateDenseCUDA(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar[], Mat *);
2222637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatCreateSeqDenseCUDA(MPI_Comm, PetscInt, PetscInt, PetscScalar[], Mat *);
2223637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatMPIDenseCUDASetPreallocation(Mat, PetscScalar[]);
2224637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatSeqDenseCUDASetPreallocation(Mat, PetscScalar[]);
2225637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDAGetArrayWrite(Mat, PetscScalar **);
2226637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDAGetArrayRead(Mat, const PetscScalar **);
2227637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDAGetArray(Mat, PetscScalar **);
2228637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDARestoreArrayWrite(Mat, PetscScalar **);
2229637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDARestoreArrayRead(Mat, const PetscScalar **);
2230637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDARestoreArray(Mat, PetscScalar **);
2231637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDAPlaceArray(Mat, const PetscScalar *);
2232d5ea218eSStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDAReplaceArray(Mat, const PetscScalar *);
2233637a0070SStefano Zampini PETSC_EXTERN PetscErrorCode MatDenseCUDAResetArray(Mat);
22343fa6b06aSMark Adams 
22359ae82921SPaul Mullowney #endif
22369ae82921SPaul Mullowney 
2237d67ff14aSKarl Rupp #if defined(PETSC_HAVE_VIENNACL)
2238d67ff14aSKarl Rupp PETSC_EXTERN PetscErrorCode MatCreateSeqAIJViennaCL(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], Mat *);
2239d67ff14aSKarl Rupp PETSC_EXTERN PetscErrorCode MatCreateAIJViennaCL(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], PetscInt, const PetscInt[], Mat *);
2240d67ff14aSKarl Rupp #endif
2241d67ff14aSKarl Rupp 
224254efbe56SHong Zhang #if defined(PETSC_HAVE_FFTW)
2243014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterPetscToFFTW(Mat, Vec, Vec);
2244014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterFFTWToPetsc(Mat, Vec, Vec);
22452a7a6963SBarry Smith PETSC_EXTERN PetscErrorCode MatCreateVecsFFTW(Mat, Vec *, Vec *, Vec *);
224654efbe56SHong Zhang #endif
224754efbe56SHong Zhang 
2248d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK)
2249d24d4204SJose E. Roman PETSC_EXTERN PetscErrorCode MatCreateScaLAPACK(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, Mat *);
2250d24d4204SJose E. Roman PETSC_EXTERN PetscErrorCode MatScaLAPACKSetBlockSizes(Mat, PetscInt, PetscInt);
2251d24d4204SJose E. Roman PETSC_EXTERN PetscErrorCode MatScaLAPACKGetBlockSizes(Mat, PetscInt *, PetscInt *);
2252d24d4204SJose E. Roman #endif
2253d24d4204SJose E. Roman 
2254014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateNest(MPI_Comm, PetscInt, const IS[], PetscInt, const IS[], const Mat[], Mat *);
2255014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNestGetSize(Mat, PetscInt *, PetscInt *);
2256014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNestGetISs(Mat, IS[], IS[]);
2257014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNestGetLocalISs(Mat, IS[], IS[]);
2258014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNestGetSubMats(Mat, PetscInt *, PetscInt *, Mat ***);
2259014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNestGetSubMat(Mat, PetscInt, PetscInt, Mat *);
226019fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode MatNestSetVecType(Mat, VecType);
2261014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNestSetSubMats(Mat, PetscInt, const IS[], PetscInt, const IS[], const Mat[]);
2262014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatNestSetSubMat(Mat, PetscInt, PetscInt, Mat);
2263d8588912SDave May 
22644325cce7SMatthew G Knepley PETSC_EXTERN PetscErrorCode MatChop(Mat, PetscReal);
2265e0a58c10SMatthew G. Knepley PETSC_EXTERN PetscErrorCode MatComputeBandwidth(Mat, PetscReal, PetscInt *);
22664325cce7SMatthew G Knepley 
2267b541e6a4SDmitry Karpeev PETSC_EXTERN PetscErrorCode MatSubdomainsCreateCoalesce(Mat, PetscInt, PetscInt *, IS **);
226853dd7562SDmitry Karpeev 
2269c094ef40SMatthew G. Knepley PETSC_EXTERN PetscErrorCode MatPreallocatorPreallocate(Mat, PetscBool, Mat);
2270c094ef40SMatthew G. Knepley 
2271539c167fSBarry Smith PETSC_INTERN PetscErrorCode MatHeaderMerge(Mat, Mat *);
2272539c167fSBarry Smith PETSC_EXTERN PetscErrorCode MatHeaderReplace(Mat, Mat *);
22731a2c6b5cSJunchao Zhang 
22747ee59b9bSJunchao Zhang PETSC_EXTERN PetscErrorCode MatSeqAIJGetCSRAndMemType(Mat, const PetscInt **, const PetscInt **, PetscScalar **, PetscMemType *);
227572833a62Smarkadams4 
227672833a62Smarkadams4 PETSC_EXTERN PetscErrorCode MatCreateGraph(Mat, PetscBool, PetscBool, Mat *);
227772833a62Smarkadams4 PETSC_EXTERN PetscErrorCode MatFilter(Mat, PetscReal, Mat *);
227872833a62Smarkadams4 
227923a5497aSJed Brown #endif
2280