xref: /petsc/include/petscmat.h (revision 09573ac72a50d3e7ecd55a2b7f0ef28450cd0a8b)
12eac72dbSBarry Smith /*
22eac72dbSBarry Smith      Include file for the matrix component of PETSc
32eac72dbSBarry Smith */
40a835dfdSSatish Balay #ifndef __PETSCMAT_H
50a835dfdSSatish Balay #define __PETSCMAT_H
60a835dfdSSatish Balay #include "petscvec.h"
7e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
82eac72dbSBarry Smith 
9d9274352SBarry Smith /*S
10d9274352SBarry Smith      Mat - Abstract PETSc matrix object
112eac72dbSBarry Smith 
12d91e6319SBarry Smith    Level: beginner
13d91e6319SBarry Smith 
14d9274352SBarry Smith   Concepts: matrix; linear operator
15d9274352SBarry Smith 
16d9274352SBarry Smith .seealso:  MatCreate(), MatType, MatSetType()
17d9274352SBarry Smith S*/
18d9274352SBarry Smith typedef struct _p_Mat*           Mat;
19d9274352SBarry Smith 
20d9274352SBarry Smith /*E
21d9274352SBarry Smith     MatType - String with the name of a PETSc matrix or the creation function
22d9274352SBarry Smith        with an optional dynamic library name, for example
23d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
24d9274352SBarry Smith 
25d9274352SBarry Smith    Level: beginner
26d9274352SBarry Smith 
27c7393fdbSBarry Smith .seealso: MatSetType(), Mat, MatSolverPackage
28d91e6319SBarry Smith E*/
29a313700dSBarry Smith #define MatType char*
30273d9f13SBarry Smith #define MATSAME            "same"
315a11e1b2SBarry Smith #define MATMAIJ            "maij"
32273d9f13SBarry Smith #define MATSEQMAIJ           "seqmaij"
33273d9f13SBarry Smith #define MATMPIMAIJ           "mpimaij"
34273d9f13SBarry Smith #define MATIS              "is"
355a11e1b2SBarry Smith #define MATAIJ             "aij"
36273d9f13SBarry Smith #define MATSEQAIJ            "seqaij"
37273d9f13SBarry Smith #define MATMPIAIJ            "mpiaij"
385a11e1b2SBarry Smith #define MATAIJCRL              "aijcrl"
395a11e1b2SBarry Smith #define MATSEQAIJCRL             "seqaijcrl"
405a11e1b2SBarry Smith #define MATMPIAIJCRL             "mpiaijcrl"
415a11e1b2SBarry Smith #define MATAIJCUDA             "aijcuda"
425a11e1b2SBarry Smith #define MATSEQAIJCUDA            "seqaijcuda"
435a11e1b2SBarry Smith #define MATMPIAIJCUDA            "mpiaijcuda"
445a11e1b2SBarry Smith #define MATAIJPERM             "aijperm"
455a11e1b2SBarry Smith #define MATSEQAIJPERM            "seqaijperm"
465a11e1b2SBarry Smith #define MATMPIAIJPERM            "mpiaijperm"
47273d9f13SBarry Smith #define MATSHELL           "shell"
485a11e1b2SBarry Smith #define MATDENSE           "dense"
49209238afSKris Buschelman #define MATSEQDENSE          "seqdense"
50273d9f13SBarry Smith #define MATMPIDENSE          "mpidense"
515a11e1b2SBarry Smith #define MATBAIJ            "baij"
52273d9f13SBarry Smith #define MATSEQBAIJ           "seqbaij"
53273d9f13SBarry Smith #define MATMPIBAIJ           "mpibaij"
54273d9f13SBarry Smith #define MATMPIADJ          "mpiadj"
555a11e1b2SBarry Smith #define MATSBAIJ           "sbaij"
56273d9f13SBarry Smith #define MATSEQSBAIJ          "seqsbaij"
57273d9f13SBarry Smith #define MATMPISBAIJ          "mpisbaij"
58cebc7f6cSBarry Smith #define MATDAAD            "daad"
59cebc7f6cSBarry Smith #define MATMFFD            "mffd"
60c8a8475eSBarry Smith #define MATNORMAL          "normal"
61ab92ecdeSBarry Smith #define MATLRC             "lrc"
622a6744ebSBarry Smith #define MATSCATTER         "scatter"
63421e10b8SBarry Smith #define MATBLOCKMAT        "blockmat"
64793850ffSBarry Smith #define MATCOMPOSITE       "composite"
655a7f1df3SHong Zhang #define MATSEQFFTW         "seqfftw"
66e133240eSMatthew G Knepley #define MATSEQCUFFT        "seqcufft"
67557cca28SSatish Balay #define MATTRANSPOSEMAT    "transpose"
6872ca8751SBarry Smith #define MATSCHURCOMPLEMENT "schurcomplement"
691d6018f0SLisandro Dalcin #define MATPYTHON          "python"
70f91d8e95SBarry Smith #define MATHYPRESTRUCT     "hyprestruct"
71a9e6138eSGlenn Hammond #define MATHYPRESSTRUCT    "hypresstruct"
72ee1cef2cSJed Brown #define MATSUBMATRIX       "submatrix"
73dbc6227fSDmitry Karpeev #define MATDD              "matdd"
74ba2f8784SDmitry Karpeev #define MATIM              "matim"
752c0dbf93SJed Brown #define MATLOCALREF        "localref"
76d8588912SDave May #define MATNEST            "nest"
77773941d6SBarry Smith 
789989ab13SBarry Smith /*E
79c7393fdbSBarry Smith     MatSolverPackage - String with the name of a PETSc matrix solver type.
809989ab13SBarry Smith 
819989ab13SBarry Smith     For example: "petsc" indicates what PETSc provides, "superlu" indicates either
829989ab13SBarry Smith        SuperLU or SuperLU_Dist etc.
839989ab13SBarry Smith 
849989ab13SBarry Smith 
859989ab13SBarry Smith    Level: beginner
869989ab13SBarry Smith 
875c9eb25fSBarry Smith .seealso: MatGetFactor(), Mat, MatSetType(), MatType
889989ab13SBarry Smith E*/
89c7393fdbSBarry Smith #define MatSolverPackage char*
902692d6eeSBarry Smith #define MATSOLVERSPOOLES      "spooles"
912692d6eeSBarry Smith #define MATSOLVERSUPERLU      "superlu"
922692d6eeSBarry Smith #define MATSOLVERSUPERLU_DIST "superlu_dist"
932692d6eeSBarry Smith #define MATSOLVERUMFPACK      "umfpack"
9420db9a53SJed Brown #define MATSOLVERCHOLMOD      "cholmod"
952692d6eeSBarry Smith #define MATSOLVERESSL         "essl"
962692d6eeSBarry Smith #define MATSOLVERLUSOL        "lusol"
972692d6eeSBarry Smith #define MATSOLVERMUMPS        "mumps"
982692d6eeSBarry Smith #define MATSOLVERPASTIX       "pastix"
992692d6eeSBarry Smith #define MATSOLVERDSCPACK      "dscpack"
1002692d6eeSBarry Smith #define MATSOLVERMATLAB       "matlab"
1012692d6eeSBarry Smith #define MATSOLVERPETSC        "petsc"
1022692d6eeSBarry Smith #define MATSOLVERPLAPACK      "plapack"
1032692d6eeSBarry Smith #define MATSOLVERBAS          "bas"
104773941d6SBarry Smith 
105b24902e0SBarry Smith /*E
106b24902e0SBarry Smith     MatFactorType - indicates what type of factorization is requested
107b24902e0SBarry Smith 
108b24902e0SBarry Smith     Level: beginner
109b24902e0SBarry Smith 
110b24902e0SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
111b24902e0SBarry Smith 
112c7393fdbSBarry Smith .seealso: MatSolverPackage, MatGetFactor()
113b24902e0SBarry Smith E*/
114599ef60dSHong Zhang typedef enum {MAT_FACTOR_NONE, MAT_FACTOR_LU, MAT_FACTOR_CHOLESKY, MAT_FACTOR_ILU, MAT_FACTOR_ICC,MAT_FACTOR_ILUDT} MatFactorType;
11534918c53SJed Brown extern const char *const MatFactorTypes[];
116e92e720dSBarry Smith 
117*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor(Mat,const MatSolverPackage,MatFactorType,Mat*);
118*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactorAvailable(Mat,const MatSolverPackage,MatFactorType,PetscBool *);
119*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFactorGetSolverPackage(Mat,const MatSolverPackage*);
120*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactorType(Mat,MatFactorType*);
1219989ab13SBarry Smith 
122c06d978dSMatthew Knepley /* Logging support */
1230700a824SBarry Smith #define    MAT_FILE_CLASSID 1211216    /* used to indicate matrices in binary files */
1240700a824SBarry Smith extern PetscClassId PETSCMAT_DLLEXPORT MAT_CLASSID;
1250700a824SBarry Smith extern PetscClassId PETSCMAT_DLLEXPORT MAT_FDCOLORING_CLASSID;
1260700a824SBarry Smith extern PetscClassId PETSCMAT_DLLEXPORT MAT_PARTITIONING_CLASSID;
1270700a824SBarry Smith extern PetscClassId PETSCMAT_DLLEXPORT MAT_NULLSPACE_CLASSID;
1280700a824SBarry Smith extern PetscClassId PETSCMAT_DLLEXPORT MATMFFD_CLASSID;
129c06d978dSMatthew Knepley 
130ceb03754SKris Buschelman /*E
131ceb03754SKris Buschelman     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
132d6eff37eSBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values. For MatConvert() is used to indicate
133d6eff37eSBarry Smith      that the input matrix is to be replaced with the converted matrix.
134ceb03754SKris Buschelman 
135ceb03754SKris Buschelman     Level: beginner
136ceb03754SKris Buschelman 
137ceb03754SKris Buschelman    Any additions/changes here MUST also be made in include/finclude/petscmat.h
138ceb03754SKris Buschelman 
1390c451bc4SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices(), MatConvert()
140ceb03754SKris Buschelman E*/
141dfe085dbSJed Brown typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX,MAT_IGNORE_MATRIX} MatReuse;
142ceb03754SKris Buschelman 
1435494a064SHong Zhang /*E
1445494a064SHong Zhang     MatGetSubMatrixOption - Indicates if matrices obtained from a call to MatGetSubMatrices()
145829201f2SHong Zhang      include the matrix values. Currently it is only used by MatGetSeqNonzerostructure().
1465494a064SHong Zhang 
1475494a064SHong Zhang     Level: beginner
1485494a064SHong Zhang 
149829201f2SHong Zhang .seealso: MatGetSeqNonzerostructure()
1505494a064SHong Zhang E*/
1515494a064SHong Zhang typedef enum {MAT_DO_NOT_GET_VALUES,MAT_GET_VALUES} MatGetSubMatrixOption;
1525494a064SHong Zhang 
153*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatInitializePackage(const char[]);
154c06d978dSMatthew Knepley 
155*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreate(MPI_Comm,Mat*);
156a69a960dSMatthew Knepley PetscPolymorphicFunction(MatCreate,(MPI_Comm comm),(comm,&A),Mat,A)
157a69a960dSMatthew Knepley PetscPolymorphicFunction(MatCreate,(),(PETSC_COMM_WORLD,&A),Mat,A)
158*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetSizes(Mat,PetscInt,PetscInt,PetscInt,PetscInt);
159*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetType(Mat,const MatType);
160*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetFromOptions(Mat);
161*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetUpPreallocation(Mat);
162*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRegisterAll(const char[]);
163*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat));
16430de9b25SBarry Smith 
165*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetOptionsPrefix(Mat,const char[]);
166*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatAppendOptionsPrefix(Mat,const char[]);
167*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetOptionsPrefix(Mat,const char*[]);
168f69a0ea3SMatthew Knepley 
16930de9b25SBarry Smith /*MC
17030de9b25SBarry Smith    MatRegisterDynamic - Adds a new matrix type
17130de9b25SBarry Smith 
17230de9b25SBarry Smith    Synopsis:
1731890ba74SBarry Smith    PetscErrorCode MatRegisterDynamic(const char *name,const char *path,const char *name_create,PetscErrorCode (*routine_create)(Mat))
17430de9b25SBarry Smith 
17530de9b25SBarry Smith    Not Collective
17630de9b25SBarry Smith 
17730de9b25SBarry Smith    Input Parameters:
17830de9b25SBarry Smith +  name - name of a new user-defined matrix type
17930de9b25SBarry Smith .  path - path (either absolute or relative) the library containing this solver
18030de9b25SBarry Smith .  name_create - name of routine to create method context
18130de9b25SBarry Smith -  routine_create - routine to create method context
18230de9b25SBarry Smith 
18330de9b25SBarry Smith    Notes:
18430de9b25SBarry Smith    MatRegisterDynamic() may be called multiple times to add several user-defined solvers.
18530de9b25SBarry Smith 
18630de9b25SBarry Smith    If dynamic libraries are used, then the fourth input argument (routine_create)
18730de9b25SBarry Smith    is ignored.
18830de9b25SBarry Smith 
18930de9b25SBarry Smith    Sample usage:
19030de9b25SBarry Smith .vb
19130de9b25SBarry Smith    MatRegisterDynamic("my_mat",/home/username/my_lib/lib/libO/solaris/mylib.a,
19230de9b25SBarry Smith                "MyMatCreate",MyMatCreate);
19330de9b25SBarry Smith .ve
19430de9b25SBarry Smith 
19530de9b25SBarry Smith    Then, your solver can be chosen with the procedural interface via
19630de9b25SBarry Smith $     MatSetType(Mat,"my_mat")
19730de9b25SBarry Smith    or at runtime via the option
19830de9b25SBarry Smith $     -mat_type my_mat
19930de9b25SBarry Smith 
20030de9b25SBarry Smith    Level: advanced
20130de9b25SBarry Smith 
202ab901514SBarry Smith    Notes: ${PETSC_ARCH} occuring in pathname will be replaced with appropriate values.
20330de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
20430de9b25SBarry Smith 
20530de9b25SBarry Smith .keywords: Mat, register
20630de9b25SBarry Smith 
20730de9b25SBarry Smith .seealso: MatRegisterAll(), MatRegisterDestroy()
20830de9b25SBarry Smith 
20930de9b25SBarry Smith M*/
210273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
211273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
212273d9f13SBarry Smith #else
213273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
21430de9b25SBarry Smith #endif
21530de9b25SBarry Smith 
216ace3abfcSBarry Smith extern PetscBool  MatRegisterAllCalled;
217b0a32e0cSBarry Smith extern PetscFList MatList;
218b022a5c1SBarry Smith extern PetscFList MatColoringList;
219b022a5c1SBarry Smith extern PetscFList MatPartitioningList;
22028988994SBarry Smith 
2213b224e63SBarry Smith /*E
2223b224e63SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
2233b224e63SBarry Smith 
2243b224e63SBarry Smith     Level: beginner
2253b224e63SBarry Smith 
2263b224e63SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
2273b224e63SBarry Smith 
2283b224e63SBarry Smith .seealso: MatCopy(), KSPSetOperators(), PCSetOperators()
2293b224e63SBarry Smith E*/
2303b224e63SBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER,SUBSET_NONZERO_PATTERN} MatStructure;
2313b224e63SBarry Smith 
232*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm,PetscInt,PetscInt,PetscScalar[],Mat*);
233*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIDense(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar[],Mat*);
234*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
235ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n,PetscInt nz,const PetscInt nnz[]),(PETSC_COMM_SELF,m,n,nz,nnz,&A),Mat,A)
236ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n,PetscInt nz),(PETSC_COMM_SELF,m,n,nz,PETSC_NULL,&A),Mat,A)
237ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n,const PetscInt nnz[]),(PETSC_COMM_SELF,m,n,0,nnz,&A),Mat,A)
238ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n),(PETSC_COMM_SELF,m,n,0,PETSC_NULL,&A),Mat,A)
239ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqAIJ,(PetscInt m,PetscInt n,PetscInt nz,Mat *A),(PETSC_COMM_SELF,m,n,nz,PETSC_NULL,A))
240ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqAIJ,(PetscInt m,PetscInt n,const PetscInt nnz[],Mat *A),(PETSC_COMM_SELF,m,n,0,nnz,A))
241ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqAIJ,(PetscInt m,PetscInt n,Mat *A),(PETSC_COMM_SELF,m,n,0,PETSC_NULL,A))
242*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
243ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,const PetscInt nnz[],PetscInt onz,const PetscInt onnz[]),(comm,m,n,M,N,nz,nnz,onz,onnz,&A),Mat,A)
244ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz),(comm,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,&A),Mat,A)
245ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[]),(comm,m,n,M,N,0,nnz,0,onz,&A),Mat,A)
246ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N),(comm,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,&A),Mat,A)
247ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIAIJ,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz,Mat *A),(comm,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,A))
248ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIAIJ,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[],Mat *A),(comm,m,n,M,N,0,nnz,0,onz,A))
249ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIAIJ,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *A),(comm,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,A))
250ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,const PetscInt nnz[],PetscInt onz,const PetscInt onnz[]),(PETSC_COMM_WORLD,m,n,M,N,nz,nnz,onz,onnz,&A),Mat,A)
251ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz),(PETSC_COMM_WORLD,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,&A),Mat,A)
252ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[]),(PETSC_COMM_WORLD,m,n,M,N,0,nnz,0,onz,&A),Mat,A)
253ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIAIJ,(PetscInt m,PetscInt n,PetscInt M,PetscInt N),(PETSC_COMM_WORLD,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,&A),Mat,A)
254ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIAIJ,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz,Mat *A),(PETSC_COMM_WORLD,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,A))
255ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIAIJ,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[],Mat *A),(PETSC_COMM_WORLD,m,n,M,N,0,nnz,0,onz,A))
256ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIAIJ,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *A),(PETSC_COMM_WORLD,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,A))
257*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *);
258*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAIJWithSplitArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],PetscInt[],PetscInt[],PetscScalar[],Mat*);
2598d7a6e47SBarry Smith 
260*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
261ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,nz,nnz,&A),Mat,A)
262ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,&A),Mat,A)
263ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,0,nnz,&A),Mat,A)
264ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,&A),Mat,A)
265ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,Mat *A),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,A))
266ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[],Mat *A),(PETSC_COMM_SELF,bs,m,n,0,nnz,A))
267ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,Mat *A),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,A))
268*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
269ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,const PetscInt nnz[],PetscInt onz,const PetscInt onnz[]),(comm,bs,m,n,M,N,nz,nnz,onz,onnz,&A),Mat,A)
270ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz),(comm,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,&A),Mat,A)
271ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[]),(comm,bs,m,n,M,N,0,nnz,0,onz,&A),Mat,A)
272ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N),(comm,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,&A),Mat,A)
273ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz,Mat *A),(comm,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,A))
274ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[],Mat *A),(comm,bs,m,n,M,N,0,nnz,0,onz,A))
275ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *A),(comm,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,A))
276ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,const PetscInt nnz[],PetscInt onz,const PetscInt onnz[]),(PETSC_COMM_WORLD,bs,m,n,M,N,nz,nnz,onz,onnz,&A),Mat,A)
277ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz),(PETSC_COMM_WORLD,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,&A),Mat,A)
278ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[]),(PETSC_COMM_WORLD,bs,m,n,M,N,0,nnz,0,onz,&A),Mat,A)
279ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPIBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N),(PETSC_COMM_WORLD,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,&A),Mat,A)
280ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz,Mat *A),(PETSC_COMM_WORLD,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,A))
281ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[],Mat *A),(PETSC_COMM_WORLD,bs,m,n,M,N,0,nnz,0,onz,A))
282ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPIBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *A),(PETSC_COMM_WORLD,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,A))
283*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat*);
284d21a29f3SJed Brown 
285*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAdj(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscInt[],Mat*);
286*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
287ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,nz,nnz,&A),Mat,A)
288ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,&A),Mat,A)
289ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,0,nnz,&A),Mat,A)
290ba966639SSatish Balay PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,&A),Mat,A)
291ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,Mat *A),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,A))
292ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[],Mat *A),(PETSC_COMM_SELF,bs,m,n,0,nnz,A))
293ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,Mat *A),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,A))
294d21a29f3SJed Brown 
295*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPISBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
296ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,const PetscInt nnz[],PetscInt onz,const PetscInt onnz[]),(comm,bs,m,n,M,N,nz,nnz,onz,onnz,&A),Mat,A)
297ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz),(comm,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,&A),Mat,A)
298ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[]),(comm,bs,m,n,M,N,0,nnz,0,onz,&A),Mat,A)
299ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N),(comm,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,&A),Mat,A)
300ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPISBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz,Mat *A),(comm,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,A))
301ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPISBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[],Mat *A),(comm,bs,m,n,M,N,0,nnz,0,onz,A))
302ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPISBAIJ,(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *A),(comm,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,A))
303ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,const PetscInt nnz[],PetscInt onz,const PetscInt onnz[]),(PETSC_COMM_WORLD,bs,m,n,M,N,nz,nnz,onz,onnz,&A),Mat,A)
304ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz),(PETSC_COMM_WORLD,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,&A),Mat,A)
305ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[]),(PETSC_COMM_WORLD,bs,m,n,M,N,0,nnz,0,onz,&A),Mat,A)
306ba966639SSatish Balay PetscPolymorphicFunction(MatCreateMPISBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N),(PETSC_COMM_WORLD,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,&A),Mat,A)
307ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPISBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt nz,PetscInt nnz,Mat *A),(PETSC_COMM_WORLD,bs,m,n,M,N,nz,PETSC_NULL,nnz,PETSC_NULL,A))
308ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPISBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,const PetscInt nnz[],const PetscInt onz[],Mat *A),(PETSC_COMM_WORLD,bs,m,n,M,N,0,nnz,0,onz,A))
309ba966639SSatish Balay PetscPolymorphicSubroutine(MatCreateMPISBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *A),(PETSC_COMM_WORLD,bs,m,n,M,N,0,PETSC_NULL,0,PETSC_NULL,A))
310*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPISBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *);
311*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPISBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
312dfb205c3SBarry Smith 
313*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateShell(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,void *,Mat*);
314ba966639SSatish Balay PetscPolymorphicFunction(MatCreateShell,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,void *ctx),(comm,m,n,M,N,ctx,&A),Mat,A)
315ba966639SSatish Balay PetscPolymorphicFunction(MatCreateShell,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,void *ctx),(PETSC_COMM_WORLD,m,n,M,N,ctx,&A),Mat,A)
316*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateAdic(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,void (*)(void),Mat*);
317*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateNormal(Mat,Mat*);
318ba966639SSatish Balay PetscPolymorphicFunction(MatCreateNormal,(Mat mat),(mat,&A),Mat,A)
319*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateLRC(Mat,Mat,Mat,Mat*);
320*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateIS(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,ISLocalToGlobalMapping,Mat*);
321*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
322*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
323*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateScatter(MPI_Comm,VecScatter,Mat*);
324*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatScatterSetVecScatter(Mat,VecScatter);
325*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatScatterGetVecScatter(Mat,VecScatter*);
326*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateBlockMat(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt*,Mat*);
327*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCompositeAddMat(Mat,Mat);
328*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCompositeMerge(Mat);
329*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateComposite(MPI_Comm,PetscInt,const Mat*,Mat*);
3306d7c1e57SBarry Smith typedef enum {MAT_COMPOSITE_ADDITIVE,MAT_COMPOSITE_MULTIPLICATIVE} MatCompositeType;
331*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCompositeSetType(Mat,MatCompositeType);
3326d7c1e57SBarry Smith 
33345b63f25SDmitry Karpeev #if defined PETSC_HAVE_MATDD
334*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDCreate(Mat A);
335d214e108SDmitry Karpeev typedef enum {MATDD_DOMAINS_COLUMN, MATDD_DOMAINS_ROW} MatDDDomainType;
336*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDSetDomainsLocal(Mat A, MatDDDomainType type, PetscInt domain_count, const PetscInt *supported_domains, const PetscInt *domain_limits, PetscBool covering);
337*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDSetDomainsLocalIS(Mat A, MatDDDomainType type, IS supported_domains, IS domain_limits, PetscBool covering);
338*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDSetScatter(Mat A, Mat S);
339*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDSetGather(Mat A,  Mat G);
340d214e108SDmitry Karpeev /**/
341dbc6227fSDmitry Karpeev typedef enum {MATDD_BLOCK_COMM_DEFAULT = 0, MATDD_BLOCK_COMM_SELF = -1, MATDD_BLOCK_COMM_DETERMINE = -2} MatDDBlockCommType;
342*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDGetDefaltBlockType(Mat A, const MatType *type);
343*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDSetDefaltBlockType(Mat A, const MatType type);
344*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDAddBlockLocal(Mat A, PetscInt rowblock, PetscInt colblock, const MatType blockmattype,  MatDDBlockCommType blockcommtype, Mat *block);
345*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDSetBlockLocal(Mat A, PetscInt rowblock, PetscInt colblock, Mat block);
346*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDGetBlockLocal(Mat A, PetscInt rowblock, PetscInt colblock, Mat *block);
347d214e108SDmitry Karpeev /**/
348*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDDAIJSetPreallocation(Mat A,PetscInt nz,PetscInt *nnz);
34945b63f25SDmitry Karpeev #endif
35062ee7b53SDmitry Karpeev 
351ba2f8784SDmitry Karpeev #if defined PETSC_HAVE_MATIM
352*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIMSetIS(Mat A, IS in, IS out);
353*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIMGetIS(Mat A, IS *in, IS *out);
354ba2f8784SDmitry Karpeev #endif
355ba2f8784SDmitry Karpeev 
356ba2f8784SDmitry Karpeev 
357a6a5cd3fSDmitry Karpeev 
358*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqFFTW(MPI_Comm,PetscInt,const PetscInt[],Mat*);
359*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqCUFFT(MPI_Comm,PetscInt,const PetscInt[],Mat*);
360*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateTranspose(Mat,Mat*);
361*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSubMatrix(Mat,IS,IS,Mat*);
362*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSubMatrixUpdate(Mat,Mat,IS,IS);
363*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateLocalRef(Mat,IS,IS,Mat*);
3641472f72bSBarry Smith 
365*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreatePython(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const char[],Mat*);
366*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPythonSetType(Mat,const char[]);
3671d6018f0SLisandro Dalcin 
3681d6018f0SLisandro Dalcin 
369*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetUp(Mat);
370*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDestroy(Mat);
37121c89e3eSBarry Smith 
372*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatConjugate(Mat);
373*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRealPart(Mat);
374*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatImaginaryPart(Mat);
375*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetDiagonalBlock(Mat,PetscBool *,MatReuse,Mat*);
376*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetTrace(Mat,PetscScalar*);
37799cafbc1SBarry Smith 
3788ed539a5SBarry Smith /* ------------------------------------------------------------*/
379*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
380*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlocked(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
381*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesRow(Mat,PetscInt,const PetscScalar[]);
382*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesRowLocal(Mat,PetscInt,const PetscScalar[]);
38384cb2905SBarry Smith 
3842ef4de8bSBarry Smith /*S
3852ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
3862ef4de8bSBarry Smith         column of a matrix as index on an associated grid.
3872ef4de8bSBarry Smith 
3882ef4de8bSBarry Smith    Level: beginner
3892ef4de8bSBarry Smith 
3902ef4de8bSBarry Smith   Concepts: matrix; linear operator
3912ef4de8bSBarry Smith 
392d7bd93baSBarry Smith .seealso:  MatSetValuesStencil(), MatSetStencil(), MatSetValuesBlockStencil()
3932ef4de8bSBarry Smith S*/
394435da068SBarry Smith typedef struct {
395c1ac3661SBarry Smith   PetscInt k,j,i,c;
396435da068SBarry Smith } MatStencil;
3972ef4de8bSBarry Smith 
398*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
399*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlockedStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
400*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetStencil(Mat,PetscInt,const PetscInt[],const PetscInt[],PetscInt);
401435da068SBarry Smith 
402*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetColoring(Mat,ISColoring);
403*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesAdic(Mat,void*);
404*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesAdifor(Mat,PetscInt,void*);
4053a7fca6bSBarry Smith 
406d91e6319SBarry Smith /*E
407d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
408d91e6319SBarry Smith      to continue to add values to it
409d91e6319SBarry Smith 
410d91e6319SBarry Smith     Level: beginner
411d91e6319SBarry Smith 
412d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
413d91e6319SBarry Smith E*/
4146d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
415*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatAssemblyBegin(Mat,MatAssemblyType);
416*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatAssemblyEnd(Mat,MatAssemblyType);
417*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatAssembled(Mat,PetscBool *);
4184f9c727eSBarry Smith 
4191d73ed98SBarry Smith 
42030de9b25SBarry Smith 
421d91e6319SBarry Smith /*E
422d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
423d91e6319SBarry Smith 
424d91e6319SBarry Smith     Level: beginner
425d91e6319SBarry Smith 
4260a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
427d91e6319SBarry Smith 
428d91e6319SBarry Smith .seealso: MatSetOption()
429d91e6319SBarry Smith E*/
430512a5fc5SBarry Smith typedef enum {MAT_ROW_ORIENTED,MAT_NEW_NONZERO_LOCATIONS,
4314e0d8c25SBarry Smith               MAT_SYMMETRIC,
4324e0d8c25SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC,
4338047e77bSBarry Smith               MAT_NEW_DIAGONALS,MAT_IGNORE_OFF_PROC_ENTRIES,
4344e0d8c25SBarry Smith               MAT_NEW_NONZERO_LOCATION_ERR,
4354e0d8c25SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR,MAT_USE_HASH_TABLE,
436a9817697SBarry Smith               MAT_KEEP_NONZERO_PATTERN,MAT_IGNORE_ZERO_ENTRIES,
4374e0d8c25SBarry Smith               MAT_USE_INODES,
4384e0d8c25SBarry Smith               MAT_HERMITIAN,
4394e0d8c25SBarry Smith               MAT_SYMMETRY_ETERNAL,
4404e0d8c25SBarry Smith               MAT_USE_COMPRESSEDROW,
4414e0d8c25SBarry Smith               MAT_IGNORE_LOWER_TRIANGULAR,MAT_ERROR_LOWER_TRIANGULAR,
44228b2fa4aSMatthew Knepley               MAT_GETROW_UPPERTRIANGULAR,MAT_UNUSED_NONZERO_LOCATION_ERR,
4434cb17eb5SBarry Smith               MAT_SPD,MAT_NO_OFF_PROC_ENTRIES,MAT_NO_OFF_PROC_ZERO_ROWS,
44428b2fa4aSMatthew Knepley               NUM_MAT_OPTIONS} MatOption;
445290bbb0aSBarry Smith extern const char *MatOptions[];
446*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetOption(Mat,MatOption,PetscBool );
447*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetType(Mat,const MatType*);
448a313700dSBarry Smith PetscPolymorphicFunction(MatGetType,(Mat mat),(mat,&t),const MatType,t)
44984cb2905SBarry Smith 
450*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscScalar[]);
451*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
452*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
453*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowUpperTriangular(Mat);
454*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRowUpperTriangular(Mat);
455*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetColumn(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
456*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreColumn(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
457*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetColumnVector(Mat,Vec,PetscInt);
458*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetArray(Mat,PetscScalar *[]);
459ba966639SSatish Balay PetscPolymorphicFunction(MatGetArray,(Mat mat),(mat,&a),PetscScalar*,a)
460*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreArray(Mat,PetscScalar *[]);
461*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetBlockSize(Mat,PetscInt *);
462ba966639SSatish Balay PetscPolymorphicFunction(MatGetBlockSize,(Mat mat),(mat,&a),PetscInt,a)
463*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetBlockSize(Mat,PetscInt);
4647b80b807SBarry Smith 
4651620fd73SBarry Smith 
466*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMult(Mat,Vec,Vec);
467*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultDiagonalBlock(Mat,Vec,Vec);
468*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultAdd(Mat,Vec,Vec,Vec);
469ba966639SSatish Balay PetscPolymorphicSubroutine(MatMultAdd,(Mat A,Vec x,Vec y),(A,x,y,y))
470*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultTranspose(Mat,Vec,Vec);
471*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultHermitianTranspose(Mat,Vec,Vec);
472*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIsTranspose(Mat,Mat,PetscReal,PetscBool *);
473ace3abfcSBarry Smith PetscPolymorphicFunction(MatIsTranspose,(Mat A,Mat B,PetscReal tol),(A,B,tol,&t),PetscBool ,t)
474ace3abfcSBarry Smith PetscPolymorphicFunction(MatIsTranspose,(Mat A,Mat B),(A,B,0,&t),PetscBool ,t)
475*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitianTranspose(Mat,Mat,PetscReal,PetscBool *);
476*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeAdd(Mat,Vec,Vec,Vec);
477*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultHermitianTransposeAdd(Mat,Vec,Vec,Vec);
478ba966639SSatish Balay PetscPolymorphicSubroutine(MatMultTransposeAdd,(Mat A,Vec x,Vec y),(A,x,y,y))
479*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultConstrained(Mat,Vec,Vec);
480*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeConstrained(Mat,Vec,Vec);
481*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMatSolve(Mat,Mat,Mat);
482f5edf698SHong Zhang 
483d91e6319SBarry Smith /*E
484d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
485d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
486d91e6319SBarry Smith 
487d91e6319SBarry Smith     Level: beginner
488d91e6319SBarry Smith 
489d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
490d91e6319SBarry Smith 
49170dcbbb9SBarry Smith $   MAT_SHARE_NONZERO_PATTERN - the i and j arrays in the new matrix will be shared with the original matrix
49270dcbbb9SBarry Smith $                               this also triggers the MAT_DO_NOT_COPY_VALUES option. This is used when you
49370dcbbb9SBarry Smith $                               have several matrices with the same nonzero pattern.
49470dcbbb9SBarry Smith 
495d91e6319SBarry Smith .seealso: MatDuplicate()
496d91e6319SBarry Smith E*/
49770dcbbb9SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES,MAT_SHARE_NONZERO_PATTERN} MatDuplicateOption;
4982e8a6d31SBarry Smith 
499*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatConvert(Mat,const MatType,MatReuse,Mat*);
500a313700dSBarry Smith PetscPolymorphicFunction(MatConvert,(Mat A,const MatType t),(A,t,MAT_INITIAL_MATRIX,&a),Mat,a)
501*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDuplicate(Mat,MatDuplicateOption,Mat*);
502ba966639SSatish Balay PetscPolymorphicFunction(MatDuplicate,(Mat A,MatDuplicateOption o),(A,o,&a),Mat,a)
503ba966639SSatish Balay PetscPolymorphicFunction(MatDuplicate,(Mat A),(A,MAT_COPY_VALUES,&a),Mat,a)
50494a9d846SBarry Smith 
505cb5b572fSBarry Smith 
506*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCopy(Mat,Mat,MatStructure);
507*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatView(Mat,PetscViewer);
508*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIsSymmetric(Mat,PetscReal,PetscBool *);
509ace3abfcSBarry Smith PetscPolymorphicFunction(MatIsSymmetric,(Mat A,PetscReal tol),(A,tol,&t),PetscBool ,t)
510ace3abfcSBarry Smith PetscPolymorphicFunction(MatIsSymmetric,(Mat A),(A,0,&t),PetscBool ,t)
511*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIsStructurallySymmetric(Mat,PetscBool *);
512ace3abfcSBarry Smith PetscPolymorphicFunction(MatIsStructurallySymmetric,(Mat A),(A,&t),PetscBool ,t)
513*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitian(Mat,PetscReal,PetscBool *);
514ace3abfcSBarry Smith PetscPolymorphicFunction(MatIsHermitian,(Mat A),(A,0,&t),PetscBool ,t)
515*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIsSymmetricKnown(Mat,PetscBool *,PetscBool *);
516*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitianKnown(Mat,PetscBool *,PetscBool *);
517*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMissingDiagonal(Mat,PetscBool  *,PetscInt *);
518*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatLoad(Mat, PetscViewer);
5197b80b807SBarry Smith 
520*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,PetscInt *[],PetscInt *[],PetscBool  *);
521*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,PetscInt *[],PetscInt *[],PetscBool  *);
522*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,PetscInt *[],PetscInt *[],PetscBool  *);
523*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,PetscInt *[],PetscInt *[],PetscBool  *);
524d4fbbf0eSBarry Smith 
525d91e6319SBarry Smith /*S
526d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
527d91e6319SBarry Smith 
528d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
529d91e6319SBarry Smith 
530d91e6319SBarry Smith    Level: intermediate
531d91e6319SBarry Smith 
532d91e6319SBarry Smith   Concepts: matrix^nonzero information
533d91e6319SBarry Smith 
534d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
535d91e6319SBarry Smith S*/
5364e220ebcSLois Curfman McInnes typedef struct {
537b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
538b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
539b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
540b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
541b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
542b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
543b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
5444e220ebcSLois Curfman McInnes } MatInfo;
5454e220ebcSLois Curfman McInnes 
546d9274352SBarry Smith /*E
547d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
548d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
549d9274352SBarry Smith 
550d9274352SBarry Smith     Level: beginner
551d9274352SBarry Smith 
552d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
553d9274352SBarry Smith 
554d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
555d9274352SBarry Smith E*/
5567b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
557*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetInfo(Mat,MatInfoType,MatInfo*);
558*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetDiagonal(Mat,Vec);
559*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMax(Mat,Vec,PetscInt[]);
560*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMin(Mat,Vec,PetscInt[]);
561*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMaxAbs(Mat,Vec,PetscInt[]);
562*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMinAbs(Mat,Vec,PetscInt[]);
563*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowSum(Mat,Vec);
564*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatTranspose(Mat,MatReuse,Mat*);
565fc4dec0aSBarry Smith PetscPolymorphicFunction(MatTranspose,(Mat A),(A,MAT_INITIAL_MATRIX,&t),Mat,t)
566*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatHermitianTranspose(Mat,MatReuse,Mat*);
567*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPermute(Mat,IS,IS,Mat *);
568ba966639SSatish Balay PetscPolymorphicFunction(MatPermute,(Mat A,IS is1,IS is2),(A,is1,is2,&t),Mat,t)
569*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPermuteSparsify(Mat,PetscInt,PetscReal,PetscReal,IS,IS,Mat *);
570*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalScale(Mat,Vec,Vec);
571*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalSet(Mat,Vec,InsertMode);
572*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatEqual(Mat,Mat,PetscBool *);
573ace3abfcSBarry Smith PetscPolymorphicFunction(MatEqual,(Mat A,Mat B),(A,B,&t),PetscBool ,t)
574*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultEqual(Mat,Mat,PetscInt,PetscBool *);
575*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultAddEqual(Mat,Mat,PetscInt,PetscBool *);
576*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeEqual(Mat,Mat,PetscInt,PetscBool *);
577*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeAddEqual(Mat,Mat,PetscInt,PetscBool *);
5787b80b807SBarry Smith 
579*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNorm(Mat,NormType,PetscReal *);
580ba966639SSatish Balay PetscPolymorphicFunction(MatNorm,(Mat A,NormType t),(A,t,&n),PetscReal,n)
581*09573ac7SBarry Smith extern PetscErrorCode MatGetColumnNorms(Mat,NormType,PetscReal *);
582*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroEntries(Mat);
583*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRows(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
584*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsIS(Mat,IS,PetscScalar,Vec,Vec);
585*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsStencil(Mat,PetscInt,const MatStencil [],PetscScalar,Vec,Vec);
586*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsColumns(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
587*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsColumnsIS(Mat,IS,PetscScalar,Vec,Vec);
5887b80b807SBarry Smith 
589*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatUseScaledForm(Mat,PetscBool );
590*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatScaleSystem(Mat,Vec,Vec);
591*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatUnScaleSystem(Mat,Vec,Vec);
5925ef9f2a5SBarry Smith 
593*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetSize(Mat,PetscInt*,PetscInt*);
594*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalSize(Mat,PetscInt*,PetscInt*);
595*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRange(Mat,PetscInt*,PetscInt*);
596*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRanges(Mat,const PetscInt**);
597*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRangeColumn(Mat,PetscInt*,PetscInt*);
598*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRangesColumn(Mat,const PetscInt**);
5997b80b807SBarry Smith 
600*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrices(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]);
601*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatricesParallel(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]);
602*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDestroyMatrices(PetscInt,Mat *[]);
603*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrix(Mat,IS,IS,MatReuse,Mat *);
604*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalSubMatrix(Mat,IS,IS,Mat*);
605*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreLocalSubMatrix(Mat,IS,IS,Mat*);
606*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetSeqNonzeroStructure(Mat,Mat*);
607*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDestroySeqNonzeroStructure(Mat*);
6085494a064SHong Zhang 
609*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMerge(MPI_Comm,Mat,PetscInt,MatReuse,Mat*);
610*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMerge_SeqsToMPI(MPI_Comm,Mat,PetscInt,PetscInt,MatReuse,Mat*);
611*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMerge_SeqsToMPISymbolic(MPI_Comm,Mat,PetscInt,PetscInt,Mat*);
612*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMerge_SeqsToMPINumeric(Mat,Mat);
613*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDestroy_MPIAIJ_SeqsToMPI(Mat);
614*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalMat(Mat,MatReuse,Mat*);
615*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalMatCondensed(Mat,MatReuse,IS*,IS*,Mat*);
616*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetBrowsOfAcols(Mat,Mat,MatReuse,IS*,IS*,PetscInt*,Mat*);
617*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetBrowsOfAoCols(Mat,Mat,MatReuse,PetscInt**,PetscInt**,MatScalar**,Mat*);
61843eb5e2fSMatthew Knepley #if defined (PETSC_USE_CTABLE)
619cd116e26SSatish Balay #include "petscctable.h"
620*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetCommunicationStructs(Mat, Vec *, PetscTable *, VecScatter *);
62143eb5e2fSMatthew Knepley #else
622*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetCommunicationStructs(Mat, Vec *, PetscInt *[], VecScatter *);
62343eb5e2fSMatthew Knepley #endif
624*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetGhosts(Mat, PetscInt *,const PetscInt *[]);
6258efafbd8SBarry Smith 
626*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatIncreaseOverlap(Mat,PetscInt,IS[],PetscInt);
6277b80b807SBarry Smith 
628*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMatMult(Mat,Mat,MatReuse,PetscReal,Mat*);
629*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultSymbolic(Mat,Mat,PetscReal,Mat*);
630*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultNumeric(Mat,Mat,Mat);
63122440eb1SKris Buschelman 
632*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPtAP(Mat,Mat,MatReuse,PetscReal,Mat*);
633*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPtAPSymbolic(Mat,Mat,PetscReal,Mat*);
634*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPtAPNumeric(Mat,Mat,Mat);
63522440eb1SKris Buschelman 
636*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultTranspose(Mat,Mat,MatReuse,PetscReal,Mat*);
637*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultTransposeSymbolic(Mat,Mat,PetscReal,Mat*);
638*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultTransposeNumeric(Mat,Mat,Mat);
639bc011b1eSHong Zhang 
640*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatAXPY(Mat,PetscScalar,Mat,MatStructure);
641*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatAYPX(Mat,PetscScalar,Mat,MatStructure);
6421c741599SHong Zhang 
643*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatScale(Mat,PetscScalar);
644*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatShift(Mat,PetscScalar);
6457b80b807SBarry Smith 
646*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping,ISLocalToGlobalMapping);
647*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping,ISLocalToGlobalMapping);
648*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping*,ISLocalToGlobalMapping*);
649*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping*,ISLocalToGlobalMapping*);
650*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
651*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsLocalIS(Mat,IS,PetscScalar,Vec,Vec);
652*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsColumnsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec);
653*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsColumnsLocalIS(Mat,IS,PetscScalar,Vec,Vec);
654*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
655*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlockedLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
656052efed2SBarry Smith 
657*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatStashSetInitialSize(Mat,PetscInt,PetscInt);
658*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatStashGetInfo(Mat,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
65990f02eecSBarry Smith 
660*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatInterpolate(Mat,Vec,Vec);
661*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatInterpolateAdd(Mat,Vec,Vec,Vec);
662ba966639SSatish Balay PetscPolymorphicSubroutine(MatInterpolateAdd,(Mat A,Vec x,Vec y),(A,x,y,y))
663*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRestrict(Mat,Vec,Vec);
664*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetVecs(Mat,Vec*,Vec*);
665*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetRedundantMatrix(Mat,PetscInt,MPI_Comm,PetscInt,MatReuse,Mat*);
666*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetMultiProcBlock(Mat,MPI_Comm,Mat*);
667bd481603SBarry Smith 
668bd481603SBarry Smith /*MC
6691620fd73SBarry Smith    MatSetValue - Set a single entry into a matrix.
6701620fd73SBarry Smith 
6711620fd73SBarry Smith    Not collective
6721620fd73SBarry Smith 
6731620fd73SBarry Smith    Input Parameters:
6741620fd73SBarry Smith +  m - the matrix
6751620fd73SBarry Smith .  row - the row location of the entry
6761620fd73SBarry Smith .  col - the column location of the entry
6771620fd73SBarry Smith .  value - the value to insert
6781620fd73SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
6791620fd73SBarry Smith 
6801620fd73SBarry Smith    Notes:
6811620fd73SBarry Smith    For efficiency one should use MatSetValues() and set several or many
6821620fd73SBarry Smith    values simultaneously if possible.
6831620fd73SBarry Smith 
6841620fd73SBarry Smith    Level: beginner
6851620fd73SBarry Smith 
6861620fd73SBarry Smith .seealso: MatSetValues(), MatSetValueLocal()
6871620fd73SBarry Smith M*/
6881620fd73SBarry Smith PETSC_STATIC_INLINE PetscErrorCode MatSetValue(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValues(v,1,&i,1,&j,&va,mode);}
6891620fd73SBarry Smith 
6901620fd73SBarry Smith PETSC_STATIC_INLINE PetscErrorCode MatGetValue(Mat v,PetscInt i,PetscInt j,PetscScalar *va) {return MatGetValues(v,1,&i,1,&j,va);}
6911620fd73SBarry Smith 
6921620fd73SBarry Smith PETSC_STATIC_INLINE PetscErrorCode MatSetValueLocal(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValuesLocal(v,1,&i,1,&j,&va,mode);}
6931620fd73SBarry Smith 
6941620fd73SBarry Smith /*MC
6950d2a7ff2SSatish Balay    MatPreallocateInitialize - Begins the block of code that will count the number of nonzeros per
696bd481603SBarry Smith        row in a matrix providing the data that one can use to correctly preallocate the matrix.
697bd481603SBarry Smith 
698bd481603SBarry Smith    Synopsis:
699c1ac3661SBarry Smith    PetscErrorCode MatPreallocateInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
700bd481603SBarry Smith 
701bd481603SBarry Smith    Collective on MPI_Comm
702bd481603SBarry Smith 
703bd481603SBarry Smith    Input Parameters:
704bd481603SBarry Smith +  comm - the communicator that will share the eventually allocated matrix
705859fcb39SBarry Smith .  nrows - the number of LOCAL rows in the matrix
706859fcb39SBarry Smith -  ncols - the number of LOCAL columns in the matrix
707bd481603SBarry Smith 
708bd481603SBarry Smith    Output Parameters:
709bd481603SBarry Smith +  dnz - the array that will be passed to the matrix preallocation routines
710bd481603SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
711bd481603SBarry Smith 
712bd481603SBarry Smith 
713bd481603SBarry Smith    Level: intermediate
714bd481603SBarry Smith 
715bd481603SBarry Smith    Notes:
7160598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
717bd481603SBarry Smith 
7181d73ed98SBarry Smith    Do not malloc or free dnz and onz, that is handled internally by these routines
719bd481603SBarry Smith 
720bd481603SBarry Smith    Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices)
721bd481603SBarry Smith 
7221620fd73SBarry Smith    This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize().
7231620fd73SBarry Smith 
724bd481603SBarry Smith   Concepts: preallocation^Matrix
725bd481603SBarry Smith 
726bd481603SBarry Smith .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
727bd481603SBarry Smith           MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocal()
728bd481603SBarry Smith M*/
729c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
7307c922b88SBarry Smith { \
731a89bc211SBarry Smith   PetscErrorCode _4_ierr; PetscInt __nrows = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
732a89bc211SBarry Smith   _4_ierr = PetscMalloc2(__nrows,PetscInt,&dnz,__nrows,PetscInt,&onz);CHKERRQ(_4_ierr); \
733a89bc211SBarry Smith   _4_ierr = PetscMemzero(dnz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
734a89bc211SBarry Smith   _4_ierr = PetscMemzero(onz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
735c1ac3661SBarry Smith   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
736a89bc211SBarry Smith   _4_ierr = MPI_Scan(&__nrows,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __nrows;
7377c922b88SBarry Smith 
738bd481603SBarry Smith /*MC
7390d2a7ff2SSatish Balay    MatPreallocateSymmetricInitialize - Begins the block of code that will count the number of nonzeros per
740bd481603SBarry Smith        row in a matrix providing the data that one can use to correctly preallocate the matrix.
741bd481603SBarry Smith 
742bd481603SBarry Smith    Synopsis:
743c1ac3661SBarry Smith    PetscErrorCode MatPreallocateSymmetricInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
744bd481603SBarry Smith 
745bd481603SBarry Smith    Collective on MPI_Comm
746bd481603SBarry Smith 
747bd481603SBarry Smith    Input Parameters:
748bd481603SBarry Smith +  comm - the communicator that will share the eventually allocated matrix
749859fcb39SBarry Smith .  nrows - the number of LOCAL rows in the matrix
750859fcb39SBarry Smith -  ncols - the number of LOCAL columns in the matrix
751bd481603SBarry Smith 
752bd481603SBarry Smith    Output Parameters:
753bd481603SBarry Smith +  dnz - the array that will be passed to the matrix preallocation routines
754bd481603SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
755bd481603SBarry Smith 
756bd481603SBarry Smith 
757bd481603SBarry Smith    Level: intermediate
758bd481603SBarry Smith 
759bd481603SBarry Smith    Notes:
7600598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
761bd481603SBarry Smith 
7621d73ed98SBarry Smith    Do not malloc or free dnz and onz, that is handled internally by these routines
763bd481603SBarry Smith 
7641620fd73SBarry Smith    This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize().
7651620fd73SBarry Smith 
766bd481603SBarry Smith   Concepts: preallocation^Matrix
767bd481603SBarry Smith 
768bd481603SBarry Smith .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
769bd481603SBarry Smith           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
770bd481603SBarry Smith M*/
771222b16d4SBarry Smith #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \
772222b16d4SBarry Smith { \
773a89bc211SBarry Smith   PetscErrorCode _4_ierr; PetscInt __nrows = (nrows),__ctmp = (ncols),__rstart,__end; \
774a89bc211SBarry Smith   _4_ierr = PetscMalloc2(__nrows,PetscInt,&dnz,__nrows,PetscInt,&onz);CHKERRQ(_4_ierr); \
775a89bc211SBarry Smith   _4_ierr = PetscMemzero(dnz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
776a89bc211SBarry Smith   _4_ierr = PetscMemzero(onz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
777c1ac3661SBarry Smith   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\
778a89bc211SBarry Smith   _4_ierr = MPI_Scan(&__nrows,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __nrows;
779222b16d4SBarry Smith 
780bd481603SBarry Smith /*MC
781bd481603SBarry Smith    MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
782bd481603SBarry Smith        inserted using a local number of the rows and columns
783bd481603SBarry Smith 
784bd481603SBarry Smith    Synopsis:
785c1ac3661SBarry Smith    PetscErrorCode MatPreallocateSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
786bd481603SBarry Smith 
787bd481603SBarry Smith    Not Collective
788bd481603SBarry Smith 
789bd481603SBarry Smith    Input Parameters:
790784ac674SJed Brown +  map - the row mapping from local numbering to global numbering
791bd481603SBarry Smith .  nrows - the number of rows indicated
7921d73ed98SBarry Smith .  rows - the indices of the rows
793784ac674SJed Brown .  cmap - the column mapping from local to global numbering
794bd481603SBarry Smith .  ncols - the number of columns in the matrix
795bd481603SBarry Smith .  cols - the columns indicated
796bd481603SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
797bd481603SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
798bd481603SBarry Smith 
799bd481603SBarry Smith 
800bd481603SBarry Smith    Level: intermediate
801bd481603SBarry Smith 
802bd481603SBarry Smith    Notes:
8030598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
804bd481603SBarry Smith 
8051d73ed98SBarry Smith    Do not malloc or free dnz and onz, that is handled internally by these routines
806bd481603SBarry Smith 
807bd481603SBarry Smith   Concepts: preallocation^Matrix
808bd481603SBarry Smith 
809bd481603SBarry Smith .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
810bd481603SBarry Smith           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
811bd481603SBarry Smith M*/
812784ac674SJed Brown #define MatPreallocateSetLocal(rmap,nrows,rows,cmap,ncols,cols,dnz,onz) 0; \
813c4f061fbSSatish Balay {\
814c1ac3661SBarry Smith   PetscInt __l;\
815784ac674SJed Brown   _4_ierr = ISLocalToGlobalMappingApply(rmap,nrows,rows,rows);CHKERRQ(_4_ierr);\
816784ac674SJed Brown   _4_ierr = ISLocalToGlobalMappingApply(cmap,ncols,cols,cols);CHKERRQ(_4_ierr);\
817c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
818ef66eb69SBarry Smith     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
819c4f061fbSSatish Balay   }\
820c4f061fbSSatish Balay }
821c4f061fbSSatish Balay 
822bd481603SBarry Smith /*MC
823bd481603SBarry Smith    MatPreallocateSymmetricSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
824bd481603SBarry Smith        inserted using a local number of the rows and columns
825bd481603SBarry Smith 
826bd481603SBarry Smith    Synopsis:
827c1ac3661SBarry Smith    PetscErrorCode MatPreallocateSymmetricSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
828bd481603SBarry Smith 
829bd481603SBarry Smith    Not Collective
830bd481603SBarry Smith 
831bd481603SBarry Smith    Input Parameters:
832bd481603SBarry Smith +  map - the mapping between local numbering and global numbering
833bd481603SBarry Smith .  nrows - the number of rows indicated
8341d73ed98SBarry Smith .  rows - the indices of the rows
835bd481603SBarry Smith .  ncols - the number of columns in the matrix
836bd481603SBarry Smith .  cols - the columns indicated
837bd481603SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
838bd481603SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
839bd481603SBarry Smith 
840bd481603SBarry Smith 
841bd481603SBarry Smith    Level: intermediate
842bd481603SBarry Smith 
843bd481603SBarry Smith    Notes:
8440598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
845bd481603SBarry Smith 
846bd481603SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
847bd481603SBarry Smith 
848bd481603SBarry Smith   Concepts: preallocation^Matrix
849bd481603SBarry Smith 
850bd481603SBarry Smith .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
851bd481603SBarry Smith           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
852bd481603SBarry Smith M*/
853d3d32019SBarry Smith #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
854d3d32019SBarry Smith {\
855c1ac3661SBarry Smith   PetscInt __l;\
856d3d32019SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
857d3d32019SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
858d3d32019SBarry Smith   for (__l=0;__l<nrows;__l++) {\
859d3d32019SBarry Smith     _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
860d3d32019SBarry Smith   }\
861d3d32019SBarry Smith }
862d3d32019SBarry Smith 
863bd481603SBarry Smith /*MC
864bd481603SBarry Smith    MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
865bd481603SBarry Smith        inserted using a local number of the rows and columns
866bd481603SBarry Smith 
867bd481603SBarry Smith    Synopsis:
868c1ac3661SBarry Smith    PetscErrorCode MatPreallocateSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
869bd481603SBarry Smith 
870bd481603SBarry Smith    Not Collective
871bd481603SBarry Smith 
872bd481603SBarry Smith    Input Parameters:
87364075487SBarry Smith +  row - the row
874bd481603SBarry Smith .  ncols - the number of columns in the matrix
875a50f8bf6SHong Zhang -  cols - the columns indicated
876a50f8bf6SHong Zhang 
877a50f8bf6SHong Zhang    Output Parameters:
878a50f8bf6SHong Zhang +  dnz - the array that will be passed to the matrix preallocation routines
879bd481603SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
880bd481603SBarry Smith 
881bd481603SBarry Smith 
882bd481603SBarry Smith    Level: intermediate
883bd481603SBarry Smith 
884bd481603SBarry Smith    Notes:
8850598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
886bd481603SBarry Smith 
887bd481603SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
888bd481603SBarry Smith 
8891620fd73SBarry Smith    This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize().
8901620fd73SBarry Smith 
891bd481603SBarry Smith   Concepts: preallocation^Matrix
892bd481603SBarry Smith 
893bd481603SBarry Smith .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
894bd481603SBarry Smith           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
895bd481603SBarry Smith M*/
896c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
897c1ac3661SBarry Smith { PetscInt __i; \
898e32f2f54SBarry Smith   if (row < __rstart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D less than first local row %D",row,__rstart);\
899e32f2f54SBarry Smith   if (row >= __rstart+__nrows) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D greater than last local row %D",row,__rstart+__nrows-1);\
9007c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
90164075487SBarry Smith     if ((cols)[__i] < __start || (cols)[__i] >= __end) onz[row - __rstart]++; \
9027cc688d7SBarry Smith     else dnz[row - __rstart]++;\
9037c922b88SBarry Smith   }\
9047c922b88SBarry Smith }
9057c922b88SBarry Smith 
906bd481603SBarry Smith /*MC
907bd481603SBarry Smith    MatPreallocateSymmetricSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
908bd481603SBarry Smith        inserted using a local number of the rows and columns
909bd481603SBarry Smith 
910bd481603SBarry Smith    Synopsis:
911c1ac3661SBarry Smith    PetscErrorCode MatPreallocateSymmetricSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
912bd481603SBarry Smith 
913bd481603SBarry Smith    Not Collective
914bd481603SBarry Smith 
915bd481603SBarry Smith    Input Parameters:
916bd481603SBarry Smith +  nrows - the number of rows indicated
9171d73ed98SBarry Smith .  rows - the indices of the rows
918bd481603SBarry Smith .  ncols - the number of columns in the matrix
919bd481603SBarry Smith .  cols - the columns indicated
920bd481603SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
921bd481603SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
922bd481603SBarry Smith 
923bd481603SBarry Smith 
924bd481603SBarry Smith    Level: intermediate
925bd481603SBarry Smith 
926bd481603SBarry Smith    Notes:
9270598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
928bd481603SBarry Smith 
929bd481603SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
930bd481603SBarry Smith 
9311620fd73SBarry Smith    This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize().
9321620fd73SBarry Smith 
933bd481603SBarry Smith   Concepts: preallocation^Matrix
934bd481603SBarry Smith 
935bd481603SBarry Smith .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
936bd481603SBarry Smith           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
937bd481603SBarry Smith M*/
938d3d32019SBarry Smith #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\
939c1ac3661SBarry Smith { PetscInt __i; \
940d3d32019SBarry Smith   for (__i=0; __i<nc; __i++) {\
941d3d32019SBarry Smith     if (cols[__i] >= __end) onz[row - __rstart]++; \
942d3d32019SBarry Smith     else if (cols[__i] >= row) dnz[row - __rstart]++;\
943d3d32019SBarry Smith   }\
944d3d32019SBarry Smith }
945d3d32019SBarry Smith 
946bd481603SBarry Smith /*MC
94716371a99SBarry Smith    MatPreallocateLocation -  An alternative to MatPreallocationSet() that puts the nonzero locations into the matrix if it exists
94816371a99SBarry Smith 
94916371a99SBarry Smith    Synopsis:
95016371a99SBarry Smith    PetscErrorCode MatPreallocateLocations(Mat A,PetscInt row,PetscInt ncols,PetscInt *cols,PetscInt *dnz,PetscInt *onz)
95116371a99SBarry Smith 
95216371a99SBarry Smith    Not Collective
95316371a99SBarry Smith 
95416371a99SBarry Smith    Input Parameters:
95516371a99SBarry Smith .  A - matrix
95616371a99SBarry Smith .  row - row where values exist (must be local to this process)
95716371a99SBarry Smith .  ncols - number of columns
95816371a99SBarry Smith .  cols - columns with nonzeros
95916371a99SBarry Smith .  dnz - the array that will be passed to the matrix preallocation routines
96016371a99SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
96116371a99SBarry Smith 
96216371a99SBarry Smith 
96316371a99SBarry Smith    Level: intermediate
96416371a99SBarry Smith 
96516371a99SBarry Smith    Notes:
9660598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
96716371a99SBarry Smith 
96816371a99SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
96916371a99SBarry Smith 
97016371a99SBarry Smith    This is a MACRO not a function because it uses a bunch of variables private to the MatPreallocation.... routines.
97116371a99SBarry Smith 
97216371a99SBarry Smith   Concepts: preallocation^Matrix
97316371a99SBarry Smith 
97416371a99SBarry Smith .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
97516371a99SBarry Smith           MatPreallocateSymmetricInitialize(), MatPreallocateSymmetricSetLocal()
97616371a99SBarry Smith M*/
97716371a99SBarry Smith #define MatPreallocateLocation(A,row,ncols,cols,dnz,onz) 0;if (A) {ierr = MatSetValues(A,1,&row,ncols,cols,PETSC_NULL,INSERT_VALUES);CHKERRQ(ierr);} else {ierr =  MatPreallocateSet(row,ncols,cols,dnz,onz);CHKERRQ(ierr);}
97816371a99SBarry Smith 
97916371a99SBarry Smith 
98016371a99SBarry Smith /*MC
9810d2a7ff2SSatish Balay    MatPreallocateFinalize - Ends the block of code that will count the number of nonzeros per
982bd481603SBarry Smith        row in a matrix providing the data that one can use to correctly preallocate the matrix.
983bd481603SBarry Smith 
984bd481603SBarry Smith    Synopsis:
985c1ac3661SBarry Smith    PetscErrorCode MatPreallocateFinalize(PetscInt *dnz, PetscInt *onz)
986bd481603SBarry Smith 
987bd481603SBarry Smith    Collective on MPI_Comm
988bd481603SBarry Smith 
989bd481603SBarry Smith    Input Parameters:
99016371a99SBarry Smith +  dnz - the array that was be passed to the matrix preallocation routines
991bd481603SBarry Smith -  ozn - the other array passed to the matrix preallocation routines
992bd481603SBarry Smith 
993bd481603SBarry Smith 
994bd481603SBarry Smith    Level: intermediate
995bd481603SBarry Smith 
996bd481603SBarry Smith    Notes:
9970598bfebSBarry Smith     See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details.
998bd481603SBarry Smith 
999bd481603SBarry Smith    Do not malloc or free dnz and onz that is handled internally by these routines
1000bd481603SBarry Smith 
10011620fd73SBarry Smith    This is a MACRO not a function because it closes the { started in MatPreallocateInitialize().
10021620fd73SBarry Smith 
1003bd481603SBarry Smith   Concepts: preallocation^Matrix
1004bd481603SBarry Smith 
1005bd481603SBarry Smith .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
1006bd481603SBarry Smith           MatPreallocateSymmetricInitialize(), MatPreallocateSymmetricSetLocal()
1007bd481603SBarry Smith M*/
1008a89bc211SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree2(dnz,onz);CHKERRQ(_4_ierr);}
10097c922b88SBarry Smith 
1010bd481603SBarry Smith 
1011bd481603SBarry Smith 
10127b80b807SBarry Smith /* Routines unique to particular data structures */
1013*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatShellGetContext(Mat,void **);
1014ba966639SSatish Balay PetscPolymorphicFunction(MatShellGetContext,(Mat A),(A,&t),void*,t)
1015698d4c6aSKris Buschelman 
1016*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatInodeAdjustForInodes(Mat,IS*,IS*);
1017*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatInodeGetInodeSizes(Mat,PetscInt *,PetscInt *[],PetscInt *);
1018698d4c6aSKris Buschelman 
1019*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetColumnIndices(Mat,PetscInt[]);
1020*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJSetColumnIndices(Mat,PetscInt[]);
1021*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
1022*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
1023*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqSBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
10247b80b807SBarry Smith 
1025a96a251dSBarry Smith #define MAT_SKIP_ALLOCATION -4
1026a96a251dSBarry Smith 
1027*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
1028ba966639SSatish Balay PetscPolymorphicSubroutine(MatSeqBAIJSetPreallocation,(Mat A,PetscInt bs,const PetscInt nnz[]),(A,bs,0,nnz))
1029*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqSBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
1030ba966639SSatish Balay PetscPolymorphicSubroutine(MatSeqSBAIJSetPreallocation,(Mat A,PetscInt bs,const PetscInt nnz[]),(A,bs,0,nnz))
1031*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetPreallocation(Mat,PetscInt,const PetscInt[]);
1032ba966639SSatish Balay PetscPolymorphicSubroutine(MatSeqAIJSetPreallocation,(Mat A,const PetscInt nnz[]),(A,0,nnz))
1033273d9f13SBarry Smith 
1034*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
1035ba966639SSatish Balay PetscPolymorphicSubroutine(MatMPIBAIJSetPreallocation,(Mat A,PetscInt bs,const PetscInt nnz[],const PetscInt onz[]),(A,bs,0,nnz,0,onz))
1036*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPISBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
1037*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAIJSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
1038*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetPreallocationCSR(Mat,const PetscInt [],const PetscInt [],const PetscScalar []);
1039*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
1040*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAIJSetPreallocationCSR(Mat,const PetscInt[],const PetscInt[],const PetscScalar[]);
1041*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
1042*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAdjSetPreallocation(Mat,PetscInt[],PetscInt[],PetscInt[]);
1043*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIDenseSetPreallocation(Mat,PetscScalar[]);
1044*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat,PetscScalar[]);
1045*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,PetscInt*[]);
1046*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,PetscInt*[]);
1047*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatAdicSetLocalFunction(Mat,void (*)(void));
1048273d9f13SBarry Smith 
1049*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat,PetscInt);
1050*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDenseGetLocalMatrix(Mat,Mat*);
10511b807ce4Svictorle 
1052*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatStoreValues(Mat);
1053*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatRetrieveValues(Mat);
10542e8a6d31SBarry Smith 
1055*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDAADSetCtx(Mat,void*);
10563a7fca6bSBarry Smith 
10577b80b807SBarry Smith /*
10587b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
105994b7f48cSBarry Smith   done through the KSP and PC interfaces.
10607b80b807SBarry Smith */
10617b80b807SBarry Smith 
1062d9274352SBarry Smith /*E
1063d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
1064d9274352SBarry Smith        with an optional dynamic library name, for example
1065d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
1066d9274352SBarry Smith 
1067d9274352SBarry Smith    Level: beginner
1068d9274352SBarry Smith 
1069e5a9bf91SBarry Smith    Cannot use const because the PC objects manipulate the string
1070e5a9bf91SBarry Smith 
1071d9274352SBarry Smith .seealso: MatGetOrdering()
1072d9274352SBarry Smith E*/
10733eaad2caSSatish Balay #define MatOrderingType char*
10742692d6eeSBarry Smith #define MATORDERINGNATURAL     "natural"
10752692d6eeSBarry Smith #define MATORDERINGND          "nd"
10762692d6eeSBarry Smith #define MATORDERING1WD         "1wd"
10772692d6eeSBarry Smith #define MATORDERINGRCM         "rcm"
10782692d6eeSBarry Smith #define MATORDERINGQMD         "qmd"
10792692d6eeSBarry Smith #define MATORDERINGROWLENGTH   "rowlength"
10802692d6eeSBarry Smith #define MATORDERINGDSC_ND      "dsc_nd"         /* these three are only for DSCPACK, see its documentation for details */
10812692d6eeSBarry Smith #define MATORDERINGDSC_MMD     "dsc_mmd"
10822692d6eeSBarry Smith #define MATORDERINGDSC_MDF     "dsc_mdf"
1083312e372aSBarry Smith #define MATORDERINGAMD         "amd"            /* only works if UMFPACK is installed with PETSc */
1084b12f92e5SBarry Smith 
1085*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetOrdering(Mat,const MatOrderingType,IS*,IS*);
1086*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetOrderingList(PetscFList *list);
1087*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatOrderingRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,const MatOrderingType,IS*,IS*));
108830de9b25SBarry Smith 
108930de9b25SBarry Smith /*MC
10901890ba74SBarry Smith    MatOrderingRegisterDynamic - Adds a new sparse matrix ordering to the matrix package.
109130de9b25SBarry Smith 
109230de9b25SBarry Smith    Synopsis:
10931890ba74SBarry Smith    PetscErrorCode MatOrderingRegisterDynamic(const char *name_ordering,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatOrdering))
109430de9b25SBarry Smith 
109530de9b25SBarry Smith    Not Collective
109630de9b25SBarry Smith 
109730de9b25SBarry Smith    Input Parameters:
10982692d6eeSBarry Smith +  sname - name of ordering (for example MATORDERINGND)
109930de9b25SBarry Smith .  path - location of library where creation routine is
110030de9b25SBarry Smith .  name - name of function that creates the ordering type,a string
110130de9b25SBarry Smith -  function - function pointer that creates the ordering
110230de9b25SBarry Smith 
110330de9b25SBarry Smith    Level: developer
110430de9b25SBarry Smith 
110530de9b25SBarry Smith    If dynamic libraries are used, then the fourth input argument (function)
110630de9b25SBarry Smith    is ignored.
110730de9b25SBarry Smith 
110830de9b25SBarry Smith    Sample usage:
110930de9b25SBarry Smith .vb
111030de9b25SBarry Smith    MatOrderingRegisterDynamic("my_order",/home/username/my_lib/lib/libO/solaris/mylib.a,
111130de9b25SBarry Smith                "MyOrder",MyOrder);
111230de9b25SBarry Smith .ve
111330de9b25SBarry Smith 
111430de9b25SBarry Smith    Then, your partitioner can be chosen with the procedural interface via
111530de9b25SBarry Smith $     MatOrderingSetType(part,"my_order)
111630de9b25SBarry Smith    or at runtime via the option
11172401956bSBarry Smith $     -pc_factor_mat_ordering_type my_order
111830de9b25SBarry Smith 
1119ab901514SBarry Smith    ${PETSC_ARCH} occuring in pathname will be replaced with appropriate values.
112030de9b25SBarry Smith 
112130de9b25SBarry Smith .keywords: matrix, ordering, register
112230de9b25SBarry Smith 
112330de9b25SBarry Smith .seealso: MatOrderingRegisterDestroy(), MatOrderingRegisterAll()
112430de9b25SBarry Smith M*/
1125aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1126f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
1127b12f92e5SBarry Smith #else
1128f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
1129b12f92e5SBarry Smith #endif
113030de9b25SBarry Smith 
1131*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatOrderingRegisterDestroy(void);
1132*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatOrderingRegisterAll(const char[]);
1133ace3abfcSBarry Smith extern PetscBool  MatOrderingRegisterAllCalled;
1134b0a32e0cSBarry Smith extern PetscFList MatOrderingList;
1135d4fbbf0eSBarry Smith 
1136*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
1137a2ce50c7SBarry Smith 
1138d91e6319SBarry Smith /*S
1139d90ac83dSHong Zhang     MatFactorShiftType - Numeric Shift.
1140d90ac83dSHong Zhang 
1141d90ac83dSHong Zhang    Level: beginner
1142d90ac83dSHong Zhang 
1143d90ac83dSHong Zhang S*/
1144d90ac83dSHong Zhang typedef enum {MAT_SHIFT_NONE,MAT_SHIFT_NONZERO,MAT_SHIFT_POSITIVE_DEFINITE,MAT_SHIFT_INBLOCKS} MatFactorShiftType;
1145d90ac83dSHong Zhang extern const char *MatFactorShiftTypes[];
1146d90ac83dSHong Zhang 
1147d90ac83dSHong Zhang /*S
11482401956bSBarry Smith    MatFactorInfo - Data passed into the matrix factorization routines
1149b00f7748SHong Zhang 
115061cad860SBarry Smith    In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE, that is use
115161cad860SBarry Smith $     MatFactorInfo  info(MAT_FACTORINFO_SIZE)
1152b00f7748SHong Zhang 
115315e8a5b3SHong Zhang    Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC.
1154b00f7748SHong Zhang 
115561cad860SBarry Smith       You can use MatFactorInfoInitialize() to set default values.
115661cad860SBarry Smith 
1157b00f7748SHong Zhang    Level: developer
1158b00f7748SHong Zhang 
1159d7d82daaSBarry Smith .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor(),
1160d7d82daaSBarry Smith           MatFactorInfoInitialize()
1161b00f7748SHong Zhang 
1162b00f7748SHong Zhang S*/
1163b00f7748SHong Zhang typedef struct {
116415e8a5b3SHong Zhang   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
116585317021SBarry Smith   PetscReal     usedt;
116615e8a5b3SHong Zhang   PetscReal     dt;             /* drop tolerance */
1167b00f7748SHong Zhang   PetscReal     dtcol;          /* tolerance for pivoting */
116815e8a5b3SHong Zhang   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
116967e28bfeSBarry Smith   PetscReal     fill;           /* expected fill, nonzeros in factored matrix/nonzeros in original matrix */
1170348344bbSBarry Smith   PetscReal     levels;         /* ICC/ILU(levels) */
1171bcd9e38bSBarry Smith   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
1172bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
117315e8a5b3SHong Zhang   PetscReal     zeropivot;      /* pivot is called zero if less than this */
1174f4db908eSBarry Smith   PetscReal     shifttype;      /* type of shift added to matrix factor to prevent zero pivots */
1175f4db908eSBarry Smith   PetscReal     shiftamount;     /* how large the shift is */
117615e8a5b3SHong Zhang } MatFactorInfo;
1177ffa6d0a5SLois Curfman McInnes 
1178*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFactorInfoInitialize(MatFactorInfo*);
1179*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactor(Mat,IS,const MatFactorInfo*);
1180*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*);
1181*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactorNumeric(Mat,Mat,const MatFactorInfo*);
1182*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactor(Mat,IS,IS,const MatFactorInfo*);
1183*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatILUFactor(Mat,IS,IS,const MatFactorInfo*);
1184*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*);
1185*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatILUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*);
1186*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatICCFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*);
1187*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatICCFactor(Mat,IS,const MatFactorInfo*);
1188*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactorNumeric(Mat,Mat,const MatFactorInfo*);
1189*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetInertia(Mat,PetscInt*,PetscInt*,PetscInt*);
1190*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSolve(Mat,Vec,Vec);
1191*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatForwardSolve(Mat,Vec,Vec);
1192*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatBackwardSolve(Mat,Vec,Vec);
1193*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSolveAdd(Mat,Vec,Vec,Vec);
1194*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSolveTranspose(Mat,Vec,Vec);
1195*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
1196*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSolves(Mat,Vecs,Vecs);
11978ed539a5SBarry Smith 
1198*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetUnfactored(Mat);
1199bb5a7306SBarry Smith 
1200d91e6319SBarry Smith /*E
1201d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
1202bb1eb677SSatish Balay 
1203d91e6319SBarry Smith     Level: beginner
1204d91e6319SBarry Smith 
1205d9274352SBarry Smith    May be bitwise ORd together
1206d9274352SBarry Smith 
1207d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
1208d91e6319SBarry Smith 
12094e7234bfSBarry Smith    MatSORType may be bitwise ORd together, so do not change the numbers
12104e7234bfSBarry Smith 
121141f059aeSBarry Smith .seealso: MatSOR()
1212d91e6319SBarry Smith E*/
1213ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
1214ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
1215ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
121684cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
1217*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSOR(Mat,Vec,PetscReal,MatSORType,PetscReal,PetscInt,PetscInt,Vec);
12188ed539a5SBarry Smith 
1219d4fbbf0eSBarry Smith /*
1220639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
1221639f9d9dSBarry Smith */
1222b12f92e5SBarry Smith 
1223d9274352SBarry Smith /*E
1224d9274352SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
1225d9274352SBarry Smith        with an optional dynamic library name, for example
1226d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
1227d9274352SBarry Smith 
1228d9274352SBarry Smith    Level: beginner
1229d9274352SBarry Smith 
1230d9274352SBarry Smith .seealso: MatGetColoring()
1231d9274352SBarry Smith E*/
1232a313700dSBarry Smith #define MatColoringType char*
12332692d6eeSBarry Smith #define MATCOLORINGNATURAL "natural"
12342692d6eeSBarry Smith #define MATCOLORINGSL      "sl"
12352692d6eeSBarry Smith #define MATCOLORINGLF      "lf"
12362692d6eeSBarry Smith #define MATCOLORINGID      "id"
1237b12f92e5SBarry Smith 
1238*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetColoring(Mat,const MatColoringType,ISColoring*);
1239*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatColoringRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,MatColoringType,ISColoring *));
124030de9b25SBarry Smith 
124130de9b25SBarry Smith /*MC
124230de9b25SBarry Smith    MatColoringRegisterDynamic - Adds a new sparse matrix coloring to the
124330de9b25SBarry Smith                                matrix package.
124430de9b25SBarry Smith 
124530de9b25SBarry Smith    Synopsis:
12461890ba74SBarry Smith    PetscErrorCode MatColoringRegisterDynamic(const char *name_coloring,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatColoring))
124730de9b25SBarry Smith 
124830de9b25SBarry Smith    Not Collective
124930de9b25SBarry Smith 
125030de9b25SBarry Smith    Input Parameters:
12512692d6eeSBarry Smith +  sname - name of Coloring (for example MATCOLORINGSL)
125230de9b25SBarry Smith .  path - location of library where creation routine is
125330de9b25SBarry Smith .  name - name of function that creates the Coloring type, a string
125430de9b25SBarry Smith -  function - function pointer that creates the coloring
125530de9b25SBarry Smith 
125630de9b25SBarry Smith    Level: developer
125730de9b25SBarry Smith 
125830de9b25SBarry Smith    If dynamic libraries are used, then the fourth input argument (function)
125930de9b25SBarry Smith    is ignored.
126030de9b25SBarry Smith 
126130de9b25SBarry Smith    Sample usage:
126230de9b25SBarry Smith .vb
126330de9b25SBarry Smith    MatColoringRegisterDynamic("my_color",/home/username/my_lib/lib/libO/solaris/mylib.a,
126430de9b25SBarry Smith                "MyColor",MyColor);
126530de9b25SBarry Smith .ve
126630de9b25SBarry Smith 
126730de9b25SBarry Smith    Then, your partitioner can be chosen with the procedural interface via
126830de9b25SBarry Smith $     MatColoringSetType(part,"my_color")
126930de9b25SBarry Smith    or at runtime via the option
127030de9b25SBarry Smith $     -mat_coloring_type my_color
127130de9b25SBarry Smith 
1272ab901514SBarry Smith    $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
127330de9b25SBarry Smith 
127430de9b25SBarry Smith .keywords: matrix, Coloring, register
127530de9b25SBarry Smith 
127630de9b25SBarry Smith .seealso: MatColoringRegisterDestroy(), MatColoringRegisterAll()
127730de9b25SBarry Smith M*/
1278aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1279f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
1280b12f92e5SBarry Smith #else
1281f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
1282b12f92e5SBarry Smith #endif
128330de9b25SBarry Smith 
1284ace3abfcSBarry Smith extern PetscBool  MatColoringRegisterAllCalled;
1285f1144a30SSatish Balay 
1286*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatColoringRegisterAll(const char[]);
1287*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatColoringRegisterDestroy(void);
1288*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatColoringPatch(Mat,PetscInt,PetscInt,ISColoringValue[],ISColoring*);
1289639f9d9dSBarry Smith 
1290d9274352SBarry Smith /*S
1291d9274352SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences
1292d9274352SBarry Smith         and coloring
1293639f9d9dSBarry Smith 
1294d9274352SBarry Smith    Level: beginner
1295d9274352SBarry Smith 
1296d9274352SBarry Smith   Concepts: coloring, sparse Jacobian, finite differences
1297d9274352SBarry Smith 
1298d9274352SBarry Smith .seealso:  MatFDColoringCreate()
1299d9274352SBarry Smith S*/
1300e2a1c21fSSatish Balay typedef struct _p_MatFDColoring* MatFDColoring;
1301639f9d9dSBarry Smith 
1302*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
1303*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringDestroy(MatFDColoring);
1304*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringView(MatFDColoring,PetscViewer);
1305*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetFunction(MatFDColoring,PetscErrorCode (*)(void),void*);
1306*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringGetFunction(MatFDColoring,PetscErrorCode (**)(void),void**);
1307*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
1308*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetFromOptions(MatFDColoring);
1309*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
1310*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
1311*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetF(MatFDColoring,Vec);
1312*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringGetPerturbedColumns(MatFDColoring,PetscInt*,PetscInt*[]);
1313639f9d9dSBarry Smith /*
13140752156aSBarry Smith     These routines are for partitioning matrices: currently used only
13153eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
13160752156aSBarry Smith */
1317ca161407SBarry Smith 
1318d9274352SBarry Smith /*S
1319d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
1320d9274352SBarry Smith 
1321d9274352SBarry Smith    Level: beginner
1322d9274352SBarry Smith 
1323d9274352SBarry Smith   Concepts: partitioning
1324d9274352SBarry Smith 
1325743a1026Svictorle .seealso:  MatPartitioningCreate(), MatPartitioningType
1326d9274352SBarry Smith S*/
132791e9ee9fSBarry Smith typedef struct _p_MatPartitioning* MatPartitioning;
1328d9274352SBarry Smith 
1329d9274352SBarry Smith /*E
13305bc6e7ccSvictorle     MatPartitioningType - String with the name of a PETSc matrix partitioning or the creation function
1331d9274352SBarry Smith        with an optional dynamic library name, for example
1332d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
1333d9274352SBarry Smith 
1334d9274352SBarry Smith    Level: beginner
1335d9274352SBarry Smith 
1336b547a13bSvictorle .seealso: MatPartitioningCreate(), MatPartitioning
1337d9274352SBarry Smith E*/
1338a313700dSBarry Smith #define MatPartitioningType char*
13392692d6eeSBarry Smith #define MATPARTITIONINGCURRENT  "current"
13402692d6eeSBarry Smith #define MATPARTITIONINGSQUARE   "square"
13412692d6eeSBarry Smith #define MATPARTITIONINGPARMETIS "parmetis"
13422692d6eeSBarry Smith #define MATPARTITIONINGCHACO    "chaco"
13432692d6eeSBarry Smith #define MATPARTITIONINGJOSTLE   "jostle"
13442692d6eeSBarry Smith #define MATPARTITIONINGPARTY    "party"
13452692d6eeSBarry Smith #define MATPARTITIONINGSCOTCH   "scotch"
134671306c60Sjroman 
1347ca161407SBarry Smith 
1348*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningCreate(MPI_Comm,MatPartitioning*);
1349*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetType(MatPartitioning,const MatPartitioningType);
1350*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetNParts(MatPartitioning,PetscInt);
1351*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetAdjacency(MatPartitioning,Mat);
1352*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetVertexWeights(MatPartitioning,const PetscInt[]);
1353*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []);
1354*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningApply(MatPartitioning,IS*);
1355*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningDestroy(MatPartitioning);
13562aabb6bbSBarry Smith 
1357*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatPartitioning));
135830de9b25SBarry Smith 
135930de9b25SBarry Smith /*MC
136030de9b25SBarry Smith    MatPartitioningRegisterDynamic - Adds a new sparse matrix partitioning to the
136130de9b25SBarry Smith    matrix package.
136230de9b25SBarry Smith 
136330de9b25SBarry Smith    Synopsis:
13641890ba74SBarry Smith    PetscErrorCode MatPartitioningRegisterDynamic(const char *name_partitioning,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatPartitioning))
136530de9b25SBarry Smith 
136630de9b25SBarry Smith    Not Collective
136730de9b25SBarry Smith 
136830de9b25SBarry Smith    Input Parameters:
13692692d6eeSBarry Smith +  sname - name of partitioning (for example MATPARTITIONINGCURRENT) or parmetis
137030de9b25SBarry Smith .  path - location of library where creation routine is
137130de9b25SBarry Smith .  name - name of function that creates the partitioning type, a string
137230de9b25SBarry Smith -  function - function pointer that creates the partitioning type
137330de9b25SBarry Smith 
137430de9b25SBarry Smith    Level: developer
137530de9b25SBarry Smith 
137630de9b25SBarry Smith    If dynamic libraries are used, then the fourth input argument (function)
137730de9b25SBarry Smith    is ignored.
137830de9b25SBarry Smith 
137930de9b25SBarry Smith    Sample usage:
138030de9b25SBarry Smith .vb
138130de9b25SBarry Smith    MatPartitioningRegisterDynamic("my_part",/home/username/my_lib/lib/libO/solaris/mylib.a,
138230de9b25SBarry Smith                "MyPartCreate",MyPartCreate);
138330de9b25SBarry Smith .ve
138430de9b25SBarry Smith 
138530de9b25SBarry Smith    Then, your partitioner can be chosen with the procedural interface via
138630de9b25SBarry Smith $     MatPartitioningSetType(part,"my_part")
138730de9b25SBarry Smith    or at runtime via the option
138830de9b25SBarry Smith $     -mat_partitioning_type my_part
138930de9b25SBarry Smith 
1390ab901514SBarry Smith    $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
139130de9b25SBarry Smith 
139230de9b25SBarry Smith .keywords: matrix, partitioning, register
139330de9b25SBarry Smith 
139430de9b25SBarry Smith .seealso: MatPartitioningRegisterDestroy(), MatPartitioningRegisterAll()
139530de9b25SBarry Smith M*/
1396aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1397f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
13982aabb6bbSBarry Smith #else
1399f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
14002aabb6bbSBarry Smith #endif
14012aabb6bbSBarry Smith 
1402ace3abfcSBarry Smith extern PetscBool  MatPartitioningRegisterAllCalled;
1403f1144a30SSatish Balay 
1404*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningRegisterAll(const char[]);
1405*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningRegisterDestroy(void);
14062bad1931SBarry Smith 
1407*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningView(MatPartitioning,PetscViewer);
1408*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetFromOptions(MatPartitioning);
1409*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningGetType(MatPartitioning,const MatPartitioningType*);
1410ca161407SBarry Smith 
1411*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
1412*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningParmetisGetEdgeCut(MatPartitioning, PetscInt *);
14130752156aSBarry Smith 
1414*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningJostleSetCoarseLevel(MatPartitioning,PetscReal);
1415*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningJostleSetCoarseSequential(MatPartitioning);
141671306c60Sjroman 
1417954b3ec6SBarry Smith typedef enum {MP_CHACO_MULTILEVEL_KL,MP_CHACO_SPECTRAL,MP_CHACO_LINEAR,MP_CHACO_RANDOM, MP_CHACO_SCATTERED} MPChacoGlobalType;
1418*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetGlobal(MatPartitioning, MPChacoGlobalType);
141971306c60Sjroman typedef enum { MP_CHACO_KERNIGHAN_LIN, MP_CHACO_NONE } MPChacoLocalType;
1420*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetLocal(MatPartitioning, MPChacoLocalType);
1421*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetCoarseLevel(MatPartitioning,PetscReal);
142271306c60Sjroman typedef enum { MP_CHACO_LANCZOS, MP_CHACO_RQI_SYMMLQ } MPChacoEigenType;
1423*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetEigenSolver(MatPartitioning,MPChacoEigenType);
1424*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetEigenTol(MatPartitioning, PetscReal);
1425*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetEigenNumber(MatPartitioning, PetscInt);
142671306c60Sjroman 
142771306c60Sjroman #define MP_PARTY_OPT "opt"
142871306c60Sjroman #define MP_PARTY_LIN "lin"
142971306c60Sjroman #define MP_PARTY_SCA "sca"
143071306c60Sjroman #define MP_PARTY_RAN "ran"
143171306c60Sjroman #define MP_PARTY_GBF "gbf"
143271306c60Sjroman #define MP_PARTY_GCF "gcf"
143371306c60Sjroman #define MP_PARTY_BUB "bub"
143471306c60Sjroman #define MP_PARTY_DEF "def"
1435*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetGlobal(MatPartitioning, const char*);
143671306c60Sjroman #define MP_PARTY_HELPFUL_SETS "hs"
143771306c60Sjroman #define MP_PARTY_KERNIGHAN_LIN "kl"
143871306c60Sjroman #define MP_PARTY_NONE "no"
1439*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetLocal(MatPartitioning, const char*);
1440*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetCoarseLevel(MatPartitioning,PetscReal);
1441*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetBipart(MatPartitioning,PetscBool );
1442*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetMatchOptimization(MatPartitioning,PetscBool );
144371306c60Sjroman 
144471306c60Sjroman typedef enum { MP_SCOTCH_GREEDY, MP_SCOTCH_GPS, MP_SCOTCH_GR_GPS } MPScotchGlobalType;
1445*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetArch(MatPartitioning,const char*);
1446*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetMultilevel(MatPartitioning);
1447*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetGlobal(MatPartitioning,MPScotchGlobalType);
1448*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetCoarseLevel(MatPartitioning,PetscReal);
1449*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetHostList(MatPartitioning,const char*);
145071306c60Sjroman typedef enum { MP_SCOTCH_KERNIGHAN_LIN, MP_SCOTCH_NONE } MPScotchLocalType;
1451*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetLocal(MatPartitioning,MPScotchLocalType);
1452*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetMapping(MatPartitioning);
1453*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetStrategy(MatPartitioning,char*);
145471306c60Sjroman 
1455*09573ac7SBarry Smith extern PetscErrorCode MatMeshToVertexGraph(Mat,PetscInt,Mat*);
1456*09573ac7SBarry Smith extern PetscErrorCode MatMeshToCellGraph(Mat,PetscInt,Mat*);
1457591294e4SBarry Smith 
14580752156aSBarry Smith /*
14590a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
1460d4fbbf0eSBarry Smith */
14611c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
14621c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
14631c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
14641c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
14651c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
14667c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
14677c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
14681c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
14691c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
14707c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
14717c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
14721c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
14731c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
1474a714c06dSBarry Smith                MATOP_SOR=13,
14751c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
14761c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
14771c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
14781c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
14791c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
14801c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
14811c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
14821c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
1483d519adbfSMatthew Knepley                MATOP_SET_OPTION=22,
1484d519adbfSMatthew Knepley                MATOP_ZERO_ENTRIES=23,
1485d519adbfSMatthew Knepley                MATOP_ZERO_ROWS=24,
1486d519adbfSMatthew Knepley                MATOP_LUFACTOR_SYMBOLIC=25,
1487d519adbfSMatthew Knepley                MATOP_LUFACTOR_NUMERIC=26,
1488d519adbfSMatthew Knepley                MATOP_CHOLESKY_FACTOR_SYMBOLIC=27,
1489d519adbfSMatthew Knepley                MATOP_CHOLESKY_FACTOR_NUMERIC=28,
1490d519adbfSMatthew Knepley                MATOP_SETUP_PREALLOCATION=29,
1491d519adbfSMatthew Knepley                MATOP_ILUFACTOR_SYMBOLIC=30,
1492d519adbfSMatthew Knepley                MATOP_ICCFACTOR_SYMBOLIC=31,
1493d519adbfSMatthew Knepley                MATOP_GET_ARRAY=32,
1494d519adbfSMatthew Knepley                MATOP_RESTORE_ARRAY=33,
1495d519adbfSMatthew Knepley                MATOP_DUPLICATE=34,
1496d519adbfSMatthew Knepley                MATOP_FORWARD_SOLVE=35,
1497d519adbfSMatthew Knepley                MATOP_BACKWARD_SOLVE=36,
1498d519adbfSMatthew Knepley                MATOP_ILUFACTOR=37,
1499d519adbfSMatthew Knepley                MATOP_ICCFACTOR=38,
1500d519adbfSMatthew Knepley                MATOP_AXPY=39,
1501d519adbfSMatthew Knepley                MATOP_GET_SUBMATRICES=40,
1502d519adbfSMatthew Knepley                MATOP_INCREASE_OVERLAP=41,
1503d519adbfSMatthew Knepley                MATOP_GET_VALUES=42,
1504d519adbfSMatthew Knepley                MATOP_COPY=43,
1505d519adbfSMatthew Knepley                MATOP_GET_ROW_MAX=44,
1506d519adbfSMatthew Knepley                MATOP_SCALE=45,
1507d519adbfSMatthew Knepley                MATOP_SHIFT=46,
150835153367SBarry Smith                MATOP_DIAGONAL_SET=47,
1509d519adbfSMatthew Knepley                MATOP_ILUDT_FACTOR=48,
1510d519adbfSMatthew Knepley                MATOP_SET_BLOCK_SIZE=49,
1511d519adbfSMatthew Knepley                MATOP_GET_ROW_IJ=50,
1512d519adbfSMatthew Knepley                MATOP_RESTORE_ROW_IJ=51,
1513d519adbfSMatthew Knepley                MATOP_GET_COLUMN_IJ=52,
1514d519adbfSMatthew Knepley                MATOP_RESTORE_COLUMN_IJ=53,
1515d519adbfSMatthew Knepley                MATOP_FDCOLORING_CREATE=54,
1516d519adbfSMatthew Knepley                MATOP_COLORING_PATCH=55,
1517d519adbfSMatthew Knepley                MATOP_SET_UNFACTORED=56,
1518d519adbfSMatthew Knepley                MATOP_PERMUTE=57,
1519d519adbfSMatthew Knepley                MATOP_SET_VALUES_BLOCKED=58,
1520d519adbfSMatthew Knepley                MATOP_GET_SUBMATRIX=59,
1521d519adbfSMatthew Knepley                MATOP_DESTROY=60,
1522d519adbfSMatthew Knepley                MATOP_VIEW=61,
1523d519adbfSMatthew Knepley                MATOP_CONVERT_FROM=62,
1524d519adbfSMatthew Knepley                MATOP_USE_SCALED_FORM=63,
1525d519adbfSMatthew Knepley                MATOP_SCALE_SYSTEM=64,
1526d519adbfSMatthew Knepley                MATOP_UNSCALE_SYSTEM=65,
1527d519adbfSMatthew Knepley                MATOP_SET_LOCAL_TO_GLOBAL_MAP=66,
1528d519adbfSMatthew Knepley                MATOP_SET_VALUES_LOCAL=67,
1529d519adbfSMatthew Knepley                MATOP_ZERO_ROWS_LOCAL=68,
1530d519adbfSMatthew Knepley                MATOP_GET_ROW_MAX_ABS=69,
1531d519adbfSMatthew Knepley                MATOP_GET_ROW_MIN_ABS=70,
1532d519adbfSMatthew Knepley                MATOP_CONVERT=71,
1533d519adbfSMatthew Knepley                MATOP_SET_COLORING=72,
1534d519adbfSMatthew Knepley                MATOP_SET_VALUES_ADIC=73,
1535d519adbfSMatthew Knepley                MATOP_SET_VALUES_ADIFOR=74,
1536d519adbfSMatthew Knepley                MATOP_FD_COLORING_APPLY=75,
1537d519adbfSMatthew Knepley                MATOP_SET_FROM_OPTIONS=76,
1538d519adbfSMatthew Knepley                MATOP_MULT_CON=77,
1539d519adbfSMatthew Knepley                MATOP_MULT_TRANSPOSE_CON=78,
1540d519adbfSMatthew Knepley                MATOP_PERMUTE_SPARSIFY=79,
1541d519adbfSMatthew Knepley                MATOP_MULT_MULTIPLE=80,
1542d519adbfSMatthew Knepley                MATOP_SOLVE_MULTIPLE=81,
1543d519adbfSMatthew Knepley                MATOP_GET_INERTIA=82,
1544d519adbfSMatthew Knepley                MATOP_LOAD=83,
1545d519adbfSMatthew Knepley                MATOP_IS_SYMMETRIC=84,
1546d519adbfSMatthew Knepley                MATOP_IS_HERMITIAN=85,
1547d519adbfSMatthew Knepley                MATOP_IS_STRUCTURALLY_SYMMETRIC=86,
154841f059aeSBarry Smith                MATOP_DUMMY=87,
1549d519adbfSMatthew Knepley                MATOP_GET_VECS=88,
1550d519adbfSMatthew Knepley                MATOP_MAT_MULT=89,
1551d519adbfSMatthew Knepley                MATOP_MAT_MULT_SYMBOLIC=90,
1552d519adbfSMatthew Knepley                MATOP_MAT_MULT_NUMERIC=91,
1553d519adbfSMatthew Knepley                MATOP_PTAP=92,
1554d519adbfSMatthew Knepley                MATOP_PTAP_SYMBOLIC=93,
1555d519adbfSMatthew Knepley                MATOP_PTAP_NUMERIC=94,
1556d519adbfSMatthew Knepley                MATOP_MAT_MULTTRANSPOSE=95,
15571763ac4eSSatish Balay                MATOP_MAT_MULTTRANSPOSE_SYM=96,
15581763ac4eSSatish Balay                MATOP_MAT_MULTTRANSPOSE_NUM=97,
1559d519adbfSMatthew Knepley                MATOP_PTAP_SYMBOLIC_SEQAIJ=98,
1560d519adbfSMatthew Knepley                MATOP_PTAP_NUMERIC_SEQAIJ=99,
1561d519adbfSMatthew Knepley                MATOP_PTAP_SYMBOLIC_MPIAIJ=100,
1562d519adbfSMatthew Knepley                MATOP_PTAP_NUMERIC_MPIAIJ=101,
1563d519adbfSMatthew Knepley                MATOP_CONJUGATE=102,
1564d519adbfSMatthew Knepley                MATOP_SET_SIZES=103,
1565d519adbfSMatthew Knepley                MATOP_SET_VALUES_ROW=104,
1566d519adbfSMatthew Knepley                MATOP_REAL_PART=105,
1567d519adbfSMatthew Knepley                MATOP_IMAG_PART=106,
1568d519adbfSMatthew Knepley                MATOP_GET_ROW_UTRIANGULAR=107,
1569d519adbfSMatthew Knepley                MATOP_RESTORE_ROW_UTRIANGULAR=108,
1570d519adbfSMatthew Knepley                MATOP_MATSOLVE=109,
1571d519adbfSMatthew Knepley                MATOP_GET_REDUNDANTMATRIX=110,
1572d519adbfSMatthew Knepley                MATOP_GET_ROW_MIN=111,
1573d519adbfSMatthew Knepley                MATOP_GET_COLUMN_VEC=112,
1574d519adbfSMatthew Knepley                MATOP_MISSING_DIAGONAL=113,
1575d519adbfSMatthew Knepley                MATOP_MATGETSEQNONZEROSTRUCTURE=114,
157689c6957cSBarry Smith                MATOP_CREATE=115,
157789c6957cSBarry Smith                MATOP_GET_GHOSTS=116,
1578ea38565cSJed Brown                MATOP_GET_LOCALSUBMATRIX=117,
1579ea38565cSJed Brown                MATOP_RESTORE_LOCALSUBMATRIX=118,
1580eeffb40dSHong Zhang                MATOP_MULT_DIAGONAL_BLOCK=119,
1581547795f9SHong Zhang                MATOP_HERMITIANTRANSPOSE=120,
1582547795f9SHong Zhang                MATOP_MULTHERMITIANTRANSPOSE=121,
1583fbdbba38SShri Abhyankar                MATOP_MULTHERMITIANTRANSPOSEADD=122,
1584b9614d88SDmitry Karpeev                MATOP_GETMULTIPROCBLOCK=123,
1585b9614d88SDmitry Karpeev 	       MATOP_GET_SUBMATRICES_PARALLEL=128
1586fae171e0SBarry Smith              } MatOperation;
1587*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatHasOperation(Mat,MatOperation,PetscBool *);
1588*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatShellSetOperation(Mat,MatOperation,void(*)(void));
1589*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatShellGetOperation(Mat,MatOperation,void(**)(void));
1590*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatShellSetContext(Mat,void*);
1591112a2221SBarry Smith 
159290ace30eSBarry Smith /*
159390ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
159490ace30eSBarry Smith    stored in a universal format. By changing the format with
15957973ad04SBarry Smith    PetscViewerSetFormat(viewer,PETSC_VIEWER_NATIVE); the matrices will
159690ace30eSBarry Smith    be stored in a way natural for the matrix, for example dense matrices
159790ace30eSBarry Smith    would be stored as dense. Matrices stored this way may only be
1598f4403165SShri Abhyankar    read into matrices of the same type.
159990ace30eSBarry Smith */
160090ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
160190ace30eSBarry Smith 
1602*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
1603*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatISGetLocalMat(Mat,Mat*);
16041f4e1ec7SBarry Smith 
1605d9274352SBarry Smith /*S
1606d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
1607d9274352SBarry Smith          orthogonalizes the vector to a subsapce
1608d9274352SBarry Smith 
1609f7a9e4ceSBarry Smith    Level: advanced
1610d9274352SBarry Smith 
1611d9274352SBarry Smith   Concepts: matrix; linear operator, null space
1612d9274352SBarry Smith 
16136e1639daSBarry Smith   Users manual sections:
16146e1639daSBarry Smith .   sec_singular
16156e1639daSBarry Smith 
1616d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
1617d9274352SBarry Smith S*/
161874637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
1619d9274352SBarry Smith 
1620*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceCreate(MPI_Comm,PetscBool ,PetscInt,const Vec[],MatNullSpace*);
1621*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceSetFunction(MatNullSpace,PetscErrorCode (*)(MatNullSpace,Vec,void*),void*);
1622*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceDestroy(MatNullSpace);
1623*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
1624*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceAttach(Mat,MatNullSpace);
1625*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceTest(MatNullSpace,Mat,PetscBool  *);
162674637425SBarry Smith 
1627*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatReorderingSeqSBAIJ(Mat,IS);
1628*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
1629*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqSBAIJSetColumnIndices(Mat,PetscInt *);
1630*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJInvertBlockDiagonal(Mat);
16313f1d51d7SBarry Smith 
1632*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMAIJ(Mat,PetscInt,Mat*);
1633*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMAIJRedimension(Mat,PetscInt,Mat*);
1634*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMAIJGetAIJ(Mat,Mat*);
1635c4f061fbSSatish Balay 
1636*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatComputeExplicitOperator(Mat,Mat*);
1637b0a32e0cSBarry Smith 
1638*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalScaleLocal(Mat,Vec);
163904f1ad80SBarry Smith 
1640*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMFFD(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,Mat*);
1641*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetBase(Mat,Vec,Vec);
1642*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunction(Mat,PetscErrorCode(*)(void*,Vec,Vec),void*);
1643*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunctioni(Mat,PetscErrorCode (*)(void*,PetscInt,Vec,PetscScalar*));
1644*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunctioniBase(Mat,PetscErrorCode (*)(void*,Vec));
1645*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDAddNullSpace(Mat,MatNullSpace);
1646*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetHHistory(Mat,PetscScalar[],PetscInt);
1647*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDResetHHistory(Mat);
1648*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunctionError(Mat,PetscReal);
1649*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetPeriod(Mat,PetscInt);
1650*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDGetH(Mat,PetscScalar *);
1651*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetOptionsPrefix(Mat,const char[]);
1652*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFromOptions(Mat);
1653*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDCheckPositivity(void*,Vec,Vec,PetscScalar*);
1654*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetCheckh(Mat,PetscErrorCode (*)(void*,Vec,Vec,PetscScalar*),void*);
1655e884886fSBarry Smith 
16566370053bSBarry Smith /*S
16576370053bSBarry Smith     MatMFFD - A data structured used to manage the computation of the h differencing parameter for matrix-free
16586370053bSBarry Smith               Jacobian vector products
1659e884886fSBarry Smith 
16606370053bSBarry Smith     Notes: MATMFFD is a specific MatType which uses the MatMFFD data structure
16616370053bSBarry Smith 
16626370053bSBarry Smith            MatMFFD*() methods actually take the Mat as their first argument. Not a MatMFFD data structure
16636370053bSBarry Smith 
16646370053bSBarry Smith     Level: developer
16656370053bSBarry Smith 
16666370053bSBarry Smith .seealso: MATMFFD, MatCreateMFFD(), MatMFFDSetFuction(), MatMFFDSetType(), MatMFFDRegister()
16676370053bSBarry Smith S*/
1668e884886fSBarry Smith typedef struct _p_MatMFFD* MatMFFD;
1669e884886fSBarry Smith 
1670e884886fSBarry Smith /*E
1671e884886fSBarry Smith     MatMFFDType - algorithm used to compute the h used in computing matrix-vector products via differencing of the function
1672e884886fSBarry Smith 
1673e884886fSBarry Smith    Level: beginner
1674e884886fSBarry Smith 
1675e884886fSBarry Smith .seealso: MatMFFDSetType(), MatMFFDRegister()
1676e884886fSBarry Smith E*/
1677a313700dSBarry Smith #define MatMFFDType char*
1678e884886fSBarry Smith #define MATMFFD_DS  "ds"
1679e884886fSBarry Smith #define MATMFFD_WP  "wp"
1680e884886fSBarry Smith 
1681*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetType(Mat,const MatMFFDType);
1682*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatMFFD));
1683e884886fSBarry Smith 
1684e884886fSBarry Smith /*MC
1685e884886fSBarry Smith    MatMFFDRegisterDynamic - Adds a method to the MatMFFD registry.
1686e884886fSBarry Smith 
1687e884886fSBarry Smith    Synopsis:
16881890ba74SBarry Smith    PetscErrorCode MatMFFDRegisterDynamic(const char *name_solver,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatMFFD))
1689e884886fSBarry Smith 
1690e884886fSBarry Smith    Not Collective
1691e884886fSBarry Smith 
1692e884886fSBarry Smith    Input Parameters:
1693e884886fSBarry Smith +  name_solver - name of a new user-defined compute-h module
1694e884886fSBarry Smith .  path - path (either absolute or relative) the library containing this solver
1695e884886fSBarry Smith .  name_create - name of routine to create method context
1696e884886fSBarry Smith -  routine_create - routine to create method context
1697e884886fSBarry Smith 
1698e884886fSBarry Smith    Level: developer
1699e884886fSBarry Smith 
1700e884886fSBarry Smith    Notes:
1701e884886fSBarry Smith    MatMFFDRegisterDynamic() may be called multiple times to add several user-defined solvers.
1702e884886fSBarry Smith 
1703e884886fSBarry Smith    If dynamic libraries are used, then the fourth input argument (routine_create)
1704e884886fSBarry Smith    is ignored.
1705e884886fSBarry Smith 
1706e884886fSBarry Smith    Sample usage:
1707e884886fSBarry Smith .vb
1708e884886fSBarry Smith    MatMFFDRegisterDynamic("my_h",/home/username/my_lib/lib/libO/solaris/mylib.a,
1709e884886fSBarry Smith                "MyHCreate",MyHCreate);
1710e884886fSBarry Smith .ve
1711e884886fSBarry Smith 
1712e884886fSBarry Smith    Then, your solver can be chosen with the procedural interface via
1713e884886fSBarry Smith $     MatMFFDSetType(mfctx,"my_h")
1714e884886fSBarry Smith    or at runtime via the option
1715e884886fSBarry Smith $     -snes_mf_type my_h
1716e884886fSBarry Smith 
1717e884886fSBarry Smith .keywords: MatMFFD, register
1718e884886fSBarry Smith 
1719e884886fSBarry Smith .seealso: MatMFFDRegisterAll(), MatMFFDRegisterDestroy()
1720e884886fSBarry Smith M*/
1721e884886fSBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1722e884886fSBarry Smith #define MatMFFDRegisterDynamic(a,b,c,d) MatMFFDRegister(a,b,c,0)
1723e884886fSBarry Smith #else
1724e884886fSBarry Smith #define MatMFFDRegisterDynamic(a,b,c,d) MatMFFDRegister(a,b,c,d)
1725e884886fSBarry Smith #endif
1726e884886fSBarry Smith 
1727*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDRegisterAll(const char[]);
1728*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDRegisterDestroy(void);
1729*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDDSSetUmin(Mat,PetscReal);
1730*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDWPSetComputeNormU(Mat,PetscBool );
1731e884886fSBarry Smith 
1732e884886fSBarry Smith 
1733*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT PetscViewerMathematicaPutMatrix(PetscViewer, PetscInt, PetscInt, PetscReal *);
1734*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT PetscViewerMathematicaPutCSRMatrix(PetscViewer, PetscInt, PetscInt, PetscInt *, PetscInt *, PetscReal *);
17357dbadf16SMatthew Knepley 
173697969023SHong Zhang /*
173797969023SHong Zhang    PETSc interface to MUMPS
173897969023SHong Zhang */
173997969023SHong Zhang #ifdef PETSC_HAVE_MUMPS
1740*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatSetMumpsIcntl(Mat,PetscInt,PetscInt);
174197969023SHong Zhang #endif
174223a5497aSJed Brown 
1743*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatCreateNest(MPI_Comm comm,PetscInt,const IS[],PetscInt,const IS[],const Mat[],Mat*);
1744*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNestGetSize(Mat A,PetscInt *M,PetscInt *N);
1745*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNestGetSubMats(Mat A,PetscInt *M,PetscInt *N,Mat ***mat);
1746*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNestGetSubMat(Mat A,PetscInt idxm,PetscInt jdxm,Mat *sub);
1747*09573ac7SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatNestSetVecType(Mat,const VecType);
1748d8588912SDave May 
174923a5497aSJed Brown PETSC_EXTERN_CXX_END
175023a5497aSJed Brown #endif
1751