xref: /petsc/include/petscmat.h (revision f22f69f01ec1ca0bb29797ff3752b65f1e1c47db)
1 /*
2      Include file for the matrix component of PETSc
3 */
4 #ifndef __PETSCMAT_H
5 #define __PETSCMAT_H
6 #include "petscvec.h"
7 PETSC_EXTERN_CXX_BEGIN
8 
9 /*S
10      Mat - Abstract PETSc matrix object
11 
12    Level: beginner
13 
14   Concepts: matrix; linear operator
15 
16 .seealso:  MatCreate(), MatType, MatSetType()
17 S*/
18 typedef struct _p_Mat*           Mat;
19 
20 /*E
21     MatType - String with the name of a PETSc matrix or the creation function
22        with an optional dynamic library name, for example
23        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
24 
25    Level: beginner
26 
27 .seealso: MatSetType(), Mat, MatSolverPackage
28 E*/
29 #define MatType char*
30 #define MATSAME            "same"
31 #define MATSEQMAIJ         "seqmaij"
32 #define MATMPIMAIJ         "mpimaij"
33 #define MATMAIJ            "maij"
34 #define MATIS              "is"
35 #define MATSEQAIJ          "seqaij"
36 #define MATMPIAIJ          "mpiaij"
37 #define MATAIJ             "aij"
38 #define MATSHELL           "shell"
39 #define MATSEQDENSE        "seqdense"
40 #define MATMPIDENSE        "mpidense"
41 #define MATDENSE           "dense"
42 #define MATSEQBAIJ         "seqbaij"
43 #define MATMPIBAIJ         "mpibaij"
44 #define MATBAIJ            "baij"
45 #define MATMPIADJ          "mpiadj"
46 #define MATSEQSBAIJ        "seqsbaij"
47 #define MATMPISBAIJ        "mpisbaij"
48 #define MATSBAIJ           "sbaij"
49 #define MATDAAD            "daad"
50 #define MATMFFD            "mffd"
51 #define MATNORMAL          "normal"
52 #define MATLRC             "lrc"
53 #define MATSEQCSRPERM      "seqcsrperm"
54 #define MATMPICSRPERM      "mpicsrperm"
55 #define MATCSRPERM         "csrperm"
56 #define MATSEQCRL          "seqcrl"
57 #define MATMPICRL          "mpicrl"
58 #define MATCRL             "crl"
59 #define MATSCATTER         "scatter"
60 #define MATBLOCKMAT        "blockmat"
61 #define MATCOMPOSITE       "composite"
62 #define MATSEQFFTW         "seqfftw"
63 #define MATTRANSPOSEMAT    "transpose"
64 #define MATSCHURCOMPLEMENT "schurcomplement"
65 #define MATPYTHON          "python"
66 #define MATHYPRESTRUCT     "hyprestruct"
67 #define MATHYPRESSTRUCT    "hypresstruct"
68 #define MATSUBMATRIX       "submatrix"
69 
70 
71 #define MATFWK             "matfwk"
72 
73 #define MATIM              "matim"
74 
75 
76 /*E
77     MatSolverPackage - String with the name of a PETSc matrix solver type.
78 
79     For example: "petsc" indicates what PETSc provides, "superlu" indicates either
80        SuperLU or SuperLU_Dist etc.
81 
82 
83    Level: beginner
84 
85 .seealso: MatGetFactor(), Mat, MatSetType(), MatType
86 E*/
87 #define MatSolverPackage char*
88 #define MAT_SOLVER_SPOOLES      "spooles"
89 #define MAT_SOLVER_SUPERLU      "superlu"
90 #define MAT_SOLVER_SUPERLU_DIST "superlu_dist"
91 #define MAT_SOLVER_UMFPACK      "umfpack"
92 #define MAT_SOLVER_ESSL         "essl"
93 #define MAT_SOLVER_LUSOL        "lusol"
94 #define MAT_SOLVER_MUMPS        "mumps"
95 #define MAT_SOLVER_PASTIX       "pastix"
96 #define MAT_SOLVER_DSCPACK      "dscpack"
97 #define MAT_SOLVER_MATLAB       "matlab"
98 #define MAT_SOLVER_PETSC        "petsc"
99 #define MAT_SOLVER_PLAPACK      "plapack"
100 #define MAT_SOLVER_BAS          "bas"
101 
102 /*E
103     MatFactorType - indicates what type of factorization is requested
104 
105     Level: beginner
106 
107    Any additions/changes here MUST also be made in include/finclude/petscmat.h
108 
109 .seealso: MatSolverPackage, MatGetFactor()
110 E*/
111 typedef enum {MAT_FACTOR_NONE, MAT_FACTOR_LU, MAT_FACTOR_CHOLESKY, MAT_FACTOR_ILU, MAT_FACTOR_ICC,MAT_FACTOR_ILUDT} MatFactorType;
112 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor(Mat,const MatSolverPackage,MatFactorType,Mat*);
113 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactorAvailable(Mat,const MatSolverPackage,MatFactorType,PetscTruth*);
114 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFactorGetSolverPackage(Mat,const MatSolverPackage*);
115 
116 
117 /* Logging support */
118 #define    MAT_FILE_CLASSID 1211216    /* used to indicate matrices in binary files */
119 extern PetscClassId PETSCMAT_DLLEXPORT MAT_CLASSID;
120 extern PetscClassId PETSCMAT_DLLEXPORT MAT_FDCOLORING_CLASSID;
121 extern PetscClassId PETSCMAT_DLLEXPORT MAT_PARTITIONING_CLASSID;
122 extern PetscClassId PETSCMAT_DLLEXPORT MAT_NULLSPACE_CLASSID;
123 extern PetscClassId PETSCMAT_DLLEXPORT MATMFFD_CLASSID;
124 
125 /*E
126     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
127      or MatGetSubMatrix() are to be reused to store the new matrix values.
128 
129     Level: beginner
130 
131    Any additions/changes here MUST also be made in include/finclude/petscmat.h
132 
133 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices(), MatConvert()
134 E*/
135 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX,MAT_IGNORE_MATRIX} MatReuse;
136 
137 /*E
138     MatGetSubMatrixOption - Indicates if matrices obtained from a call to MatGetSubMatrices()
139      include the matrix values. Currently it is only used by MatGetSeqNonzerostructure().
140 
141     Level: beginner
142 
143 .seealso: MatGetSeqNonzerostructure()
144 E*/
145 typedef enum {MAT_DO_NOT_GET_VALUES,MAT_GET_VALUES} MatGetSubMatrixOption;
146 
147 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatInitializePackage(const char[]);
148 
149 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreate(MPI_Comm,Mat*);
150 PetscPolymorphicFunction(MatCreate,(MPI_Comm comm),(comm,&A),Mat,A)
151 PetscPolymorphicFunction(MatCreate,(),(PETSC_COMM_WORLD,&A),Mat,A)
152 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetSizes(Mat,PetscInt,PetscInt,PetscInt,PetscInt);
153 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetType(Mat,const MatType);
154 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetFromOptions(Mat);
155 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetUpPreallocation(Mat);
156 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRegisterAll(const char[]);
157 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat));
158 
159 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetOptionsPrefix(Mat,const char[]);
160 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatAppendOptionsPrefix(Mat,const char[]);
161 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetOptionsPrefix(Mat,const char*[]);
162 
163 /*MC
164    MatRegisterDynamic - Adds a new matrix type
165 
166    Synopsis:
167    PetscErrorCode MatRegisterDynamic(const char *name,const char *path,const char *name_create,PetscErrorCode (*routine_create)(Mat))
168 
169    Not Collective
170 
171    Input Parameters:
172 +  name - name of a new user-defined matrix type
173 .  path - path (either absolute or relative) the library containing this solver
174 .  name_create - name of routine to create method context
175 -  routine_create - routine to create method context
176 
177    Notes:
178    MatRegisterDynamic() may be called multiple times to add several user-defined solvers.
179 
180    If dynamic libraries are used, then the fourth input argument (routine_create)
181    is ignored.
182 
183    Sample usage:
184 .vb
185    MatRegisterDynamic("my_mat",/home/username/my_lib/lib/libO/solaris/mylib.a,
186                "MyMatCreate",MyMatCreate);
187 .ve
188 
189    Then, your solver can be chosen with the procedural interface via
190 $     MatSetType(Mat,"my_mat")
191    or at runtime via the option
192 $     -mat_type my_mat
193 
194    Level: advanced
195 
196    Notes: ${PETSC_ARCH} occuring in pathname will be replaced with appropriate values.
197          If your function is not being put into a shared library then use VecRegister() instead
198 
199 .keywords: Mat, register
200 
201 .seealso: MatRegisterAll(), MatRegisterDestroy()
202 
203 M*/
204 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
205 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
206 #else
207 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
208 #endif
209 
210 extern PetscTruth MatRegisterAllCalled;
211 extern PetscFList MatList;
212 extern PetscFList MatColoringList;
213 extern PetscFList MatPartitioningList;
214 
215 /*E
216     MatStructure - Indicates if the matrix has the same nonzero structure
217 
218     Level: beginner
219 
220    Any additions/changes here MUST also be made in include/finclude/petscmat.h
221 
222 .seealso: MatCopy(), KSPSetOperators(), PCSetOperators()
223 E*/
224 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER,SUBSET_NONZERO_PATTERN} MatStructure;
225 
226 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm,PetscInt,PetscInt,PetscScalar[],Mat*);
227 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIDense(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar[],Mat*);
228 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
229 PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n,PetscInt nz,const PetscInt nnz[]),(PETSC_COMM_SELF,m,n,nz,nnz,&A),Mat,A)
230 PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n,PetscInt nz),(PETSC_COMM_SELF,m,n,nz,PETSC_NULL,&A),Mat,A)
231 PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n,const PetscInt nnz[]),(PETSC_COMM_SELF,m,n,0,nnz,&A),Mat,A)
232 PetscPolymorphicFunction(MatCreateSeqAIJ,(PetscInt m,PetscInt n),(PETSC_COMM_SELF,m,n,0,PETSC_NULL,&A),Mat,A)
233 PetscPolymorphicSubroutine(MatCreateSeqAIJ,(PetscInt m,PetscInt n,PetscInt nz,Mat *A),(PETSC_COMM_SELF,m,n,nz,PETSC_NULL,A))
234 PetscPolymorphicSubroutine(MatCreateSeqAIJ,(PetscInt m,PetscInt n,const PetscInt nnz[],Mat *A),(PETSC_COMM_SELF,m,n,0,nnz,A))
235 PetscPolymorphicSubroutine(MatCreateSeqAIJ,(PetscInt m,PetscInt n,Mat *A),(PETSC_COMM_SELF,m,n,0,PETSC_NULL,A))
236 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
237 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)
238 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)
239 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)
240 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)
241 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))
242 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))
243 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))
244 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)
245 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)
246 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)
247 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)
248 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))
249 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))
250 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))
251 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *);
252 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAIJWithSplitArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],PetscInt[],PetscInt[],PetscScalar[],Mat*);
253 
254 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
255 PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,nz,nnz,&A),Mat,A)
256 PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,&A),Mat,A)
257 PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,0,nnz,&A),Mat,A)
258 PetscPolymorphicFunction(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,&A),Mat,A)
259 PetscPolymorphicSubroutine(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,Mat *A),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,A))
260 PetscPolymorphicSubroutine(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[],Mat *A),(PETSC_COMM_SELF,bs,m,n,0,nnz,A))
261 PetscPolymorphicSubroutine(MatCreateSeqBAIJ,(PetscInt bs,PetscInt m,PetscInt n,Mat *A),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,A))
262 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
263 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)
264 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)
265 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)
266 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)
267 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))
268 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))
269 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))
270 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)
271 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)
272 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)
273 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)
274 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))
275 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))
276 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))
277 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPIAdj(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscInt[],Mat*);
278 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
279 PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,nz,nnz,&A),Mat,A)
280 PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,&A),Mat,A)
281 PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[]),(PETSC_COMM_SELF,bs,m,n,0,nnz,&A),Mat,A)
282 PetscPolymorphicFunction(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,&A),Mat,A)
283 PetscPolymorphicSubroutine(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,PetscInt nz,Mat *A),(PETSC_COMM_SELF,bs,m,n,nz,PETSC_NULL,A))
284 PetscPolymorphicSubroutine(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,const PetscInt nnz[],Mat *A),(PETSC_COMM_SELF,bs,m,n,0,nnz,A))
285 PetscPolymorphicSubroutine(MatCreateSeqSBAIJ,(PetscInt bs,PetscInt m,PetscInt n,Mat *A),(PETSC_COMM_SELF,bs,m,n,0,PETSC_NULL,A))
286 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPISBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
287 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)
288 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)
289 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)
290 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)
291 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))
292 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))
293 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))
294 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)
295 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)
296 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)
297 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)
298 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))
299 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))
300 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))
301 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateShell(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,void *,Mat*);
302 PetscPolymorphicFunction(MatCreateShell,(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,void *ctx),(comm,m,n,M,N,ctx,&A),Mat,A)
303 PetscPolymorphicFunction(MatCreateShell,(PetscInt m,PetscInt n,PetscInt M,PetscInt N,void *ctx),(PETSC_COMM_WORLD,m,n,M,N,ctx,&A),Mat,A)
304 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateAdic(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,void (*)(void),Mat*);
305 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateNormal(Mat,Mat*);
306 PetscPolymorphicFunction(MatCreateNormal,(Mat mat),(mat,&A),Mat,A)
307 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateLRC(Mat,Mat,Mat,Mat*);
308 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateIS(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,ISLocalToGlobalMapping,Mat*);
309 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*);
310 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMPICRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*);
311 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateScatter(MPI_Comm,VecScatter,Mat*);
312 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatScatterSetVecScatter(Mat,VecScatter);
313 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatScatterGetVecScatter(Mat,VecScatter*);
314 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateBlockMat(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt*,Mat*);
315 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCompositeAddMat(Mat,Mat);
316 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCompositeMerge(Mat);
317 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateComposite(MPI_Comm,PetscInt,const Mat*,Mat*);
318 typedef enum {MAT_COMPOSITE_ADDITIVE,MAT_COMPOSITE_MULTIPLICATIVE} MatCompositeType;
319 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCompositeSetType(Mat,MatCompositeType);
320 
321 typedef enum {MATFWK_BLOCK_COMM_DEFAULT = 0, MATFWK_BLOCK_COMM_SELF = -1, MATFWK_BLOCK_COMM_DETERMINE = -2} MatFwkBlockCommType;
322 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkAIJSetPreallocation(Mat A,PetscInt nz,PetscInt *nnz);
323 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkGetDefaltBlockType(Mat A, const MatType *type);
324 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkSetDefaltBlockType(Mat A, const MatType type);
325 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkSetPreallocation_AIJ(Mat A,PetscInt nz,PetscInt *nnz);
326 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkAddBlock(Mat A, PetscInt rowblock, PetscInt colblock, const MatType blockmattype,  MatFwkBlockCommType blockcommtype, Mat *block);
327 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkSetBlock(Mat A, PetscInt rowblock, PetscInt colblock, Mat block);
328 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkGetBlock(Mat A, PetscInt rowblock, PetscInt colblock, Mat *block);
329 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkSetScatters(Mat A, PetscInt blockcount, Mat scatters[]);
330 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFwkSetGathers(Mat A, PetscInt blockcount,  Mat gathers[]);
331 
332 #if defined PETSC_HAVE_MATIM
333 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIMSetIS(Mat A, IS in, IS out);
334 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIMGetIS(Mat A, IS *in, IS *out);
335 #endif
336 
337 
338 
339 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqFFTW(MPI_Comm,PetscInt,const PetscInt[],Mat*);
340 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateTranspose(Mat,Mat*);
341 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSubMatrix(Mat,IS,IS,Mat*);
342 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSubMatrixUpdate(Mat,Mat,IS,IS);
343 
344 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreatePython(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const char[],Mat*);
345 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPythonSetType(Mat,const char[]);
346 
347 
348 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetUp(Mat);
349 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDestroy(Mat);
350 
351 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatConjugate(Mat);
352 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRealPart(Mat);
353 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatImaginaryPart(Mat);
354 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetDiagonalBlock(Mat,PetscTruth*,MatReuse,Mat*);
355 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetTrace(Mat,PetscScalar*);
356 
357 /* ------------------------------------------------------------*/
358 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
359 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlocked(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
360 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesRow(Mat,PetscInt,const PetscScalar[]);
361 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesRowLocal(Mat,PetscInt,const PetscScalar[]);
362 
363 /*S
364      MatStencil - Data structure (C struct) for storing information about a single row or
365         column of a matrix as index on an associated grid.
366 
367    Level: beginner
368 
369   Concepts: matrix; linear operator
370 
371 .seealso:  MatSetValuesStencil(), MatSetStencil(), MatSetValuesBlockStencil()
372 S*/
373 typedef struct {
374   PetscInt k,j,i,c;
375 } MatStencil;
376 
377 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
378 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlockedStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode);
379 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetStencil(Mat,PetscInt,const PetscInt[],const PetscInt[],PetscInt);
380 
381 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetColoring(Mat,ISColoring);
382 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesAdic(Mat,void*);
383 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesAdifor(Mat,PetscInt,void*);
384 
385 /*E
386     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
387      to continue to add values to it
388 
389     Level: beginner
390 
391 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
392 E*/
393 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
394 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatAssemblyBegin(Mat,MatAssemblyType);
395 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatAssemblyEnd(Mat,MatAssemblyType);
396 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatAssembled(Mat,PetscTruth*);
397 
398 
399 
400 /*E
401     MatOption - Options that may be set for a matrix and its behavior or storage
402 
403     Level: beginner
404 
405    Any additions/changes here MUST also be made in include/finclude/petscmat.h
406 
407 .seealso: MatSetOption()
408 E*/
409 typedef enum {MAT_ROW_ORIENTED,MAT_NEW_NONZERO_LOCATIONS,
410               MAT_SYMMETRIC,
411               MAT_STRUCTURALLY_SYMMETRIC,
412               MAT_NEW_DIAGONALS,MAT_IGNORE_OFF_PROC_ENTRIES,
413               MAT_NEW_NONZERO_LOCATION_ERR,
414               MAT_NEW_NONZERO_ALLOCATION_ERR,MAT_USE_HASH_TABLE,
415               MAT_KEEP_NONZERO_PATTERN,MAT_IGNORE_ZERO_ENTRIES,
416               MAT_USE_INODES,
417               MAT_HERMITIAN,
418               MAT_SYMMETRY_ETERNAL,
419               MAT_USE_COMPRESSEDROW,
420               MAT_IGNORE_LOWER_TRIANGULAR,MAT_ERROR_LOWER_TRIANGULAR,
421               MAT_GETROW_UPPERTRIANGULAR,MAT_UNUSED_NONZERO_LOCATION_ERR,
422               NUM_MAT_OPTIONS} MatOption;
423 extern const char *MatOptions[];
424 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetOption(Mat,MatOption,PetscTruth);
425 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetType(Mat,const MatType*);
426 PetscPolymorphicFunction(MatGetType,(Mat mat),(mat,&t),const MatType,t)
427 
428 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscScalar[]);
429 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
430 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
431 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowUpperTriangular(Mat);
432 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRowUpperTriangular(Mat);
433 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetColumn(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
434 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreColumn(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]);
435 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetColumnVector(Mat,Vec,PetscInt);
436 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetArray(Mat,PetscScalar *[]);
437 PetscPolymorphicFunction(MatGetArray,(Mat mat),(mat,&a),PetscScalar*,a)
438 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreArray(Mat,PetscScalar *[]);
439 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetBlockSize(Mat,PetscInt *);
440 PetscPolymorphicFunction(MatGetBlockSize,(Mat mat),(mat,&a),PetscInt,a)
441 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetBlockSize(Mat,PetscInt);
442 
443 
444 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMult(Mat,Vec,Vec);
445 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultDiagonalBlock(Mat,Vec,Vec);
446 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultAdd(Mat,Vec,Vec,Vec);
447 PetscPolymorphicSubroutine(MatMultAdd,(Mat A,Vec x,Vec y),(A,x,y,y))
448 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultTranspose(Mat,Vec,Vec);
449 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultHermitianTranspose(Mat,Vec,Vec);
450 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIsTranspose(Mat,Mat,PetscReal,PetscTruth*);
451 PetscPolymorphicFunction(MatIsTranspose,(Mat A,Mat B,PetscReal tol),(A,B,tol,&t),PetscTruth,t)
452 PetscPolymorphicFunction(MatIsTranspose,(Mat A,Mat B),(A,B,0,&t),PetscTruth,t)
453 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitianTranspose(Mat,Mat,PetscReal,PetscTruth*);
454 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeAdd(Mat,Vec,Vec,Vec);
455 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultHermitianTransposeAdd(Mat,Vec,Vec,Vec);
456 PetscPolymorphicSubroutine(MatMultTransposeAdd,(Mat A,Vec x,Vec y),(A,x,y,y))
457 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultConstrained(Mat,Vec,Vec);
458 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeConstrained(Mat,Vec,Vec);
459 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMatSolve(Mat,Mat,Mat);
460 
461 /*E
462     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
463   its numerical values copied over or just its nonzero structure.
464 
465     Level: beginner
466 
467    Any additions/changes here MUST also be made in include/finclude/petscmat.h
468 
469 $   MAT_SHARE_NONZERO_PATTERN - the i and j arrays in the new matrix will be shared with the original matrix
470 $                               this also triggers the MAT_DO_NOT_COPY_VALUES option. This is used when you
471 $                               have several matrices with the same nonzero pattern.
472 
473 .seealso: MatDuplicate()
474 E*/
475 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES,MAT_SHARE_NONZERO_PATTERN} MatDuplicateOption;
476 
477 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatConvert(Mat,const MatType,MatReuse,Mat*);
478 PetscPolymorphicFunction(MatConvert,(Mat A,const MatType t),(A,t,MAT_INITIAL_MATRIX,&a),Mat,a)
479 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDuplicate(Mat,MatDuplicateOption,Mat*);
480 PetscPolymorphicFunction(MatDuplicate,(Mat A,MatDuplicateOption o),(A,o,&a),Mat,a)
481 PetscPolymorphicFunction(MatDuplicate,(Mat A),(A,MAT_COPY_VALUES,&a),Mat,a)
482 
483 
484 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCopy(Mat,Mat,MatStructure);
485 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatView(Mat,PetscViewer);
486 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIsSymmetric(Mat,PetscReal,PetscTruth*);
487 PetscPolymorphicFunction(MatIsSymmetric,(Mat A,PetscReal tol),(A,tol,&t),PetscTruth,t)
488 PetscPolymorphicFunction(MatIsSymmetric,(Mat A),(A,0,&t),PetscTruth,t)
489 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIsStructurallySymmetric(Mat,PetscTruth*);
490 PetscPolymorphicFunction(MatIsStructurallySymmetric,(Mat A),(A,&t),PetscTruth,t)
491 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitian(Mat,PetscReal,PetscTruth*);
492 PetscPolymorphicFunction(MatIsHermitian,(Mat A),(A,0,&t),PetscTruth,t)
493 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIsSymmetricKnown(Mat,PetscTruth*,PetscTruth*);
494 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitianKnown(Mat,PetscTruth*,PetscTruth*);
495 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMissingDiagonal(Mat,PetscTruth *,PetscInt *);
496 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatLoad(PetscViewer,const MatType,Mat*);
497 PetscPolymorphicFunction(MatLoad,(PetscViewer v,const MatType t),(v,t,&a),Mat,a)
498 
499 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowIJ(Mat,PetscInt,PetscTruth,PetscTruth,PetscInt*,PetscInt *[],PetscInt *[],PetscTruth *);
500 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRowIJ(Mat,PetscInt,PetscTruth,PetscTruth,PetscInt *,PetscInt *[],PetscInt *[],PetscTruth *);
501 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetColumnIJ(Mat,PetscInt,PetscTruth,PetscTruth,PetscInt*,PetscInt *[],PetscInt *[],PetscTruth *);
502 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreColumnIJ(Mat,PetscInt,PetscTruth,PetscTruth,PetscInt *,PetscInt *[],PetscInt *[],PetscTruth *);
503 
504 /*S
505      MatInfo - Context of matrix information, used with MatGetInfo()
506 
507    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
508 
509    Level: intermediate
510 
511   Concepts: matrix^nonzero information
512 
513 .seealso:  MatGetInfo(), MatInfoType
514 S*/
515 typedef struct {
516   PetscLogDouble block_size;                         /* block size */
517   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
518   PetscLogDouble memory;                             /* memory allocated */
519   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
520   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
521   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
522   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
523 } MatInfo;
524 
525 /*E
526     MatInfoType - Indicates if you want information about the local part of the matrix,
527      the entire parallel matrix or the maximum over all the local parts.
528 
529     Level: beginner
530 
531    Any additions/changes here MUST also be made in include/finclude/petscmat.h
532 
533 .seealso: MatGetInfo(), MatInfo
534 E*/
535 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
536 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetInfo(Mat,MatInfoType,MatInfo*);
537 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatValid(Mat,PetscTruth*);
538 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetDiagonal(Mat,Vec);
539 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMax(Mat,Vec,PetscInt[]);
540 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMin(Mat,Vec,PetscInt[]);
541 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMaxAbs(Mat,Vec,PetscInt[]);
542 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMinAbs(Mat,Vec,PetscInt[]);
543 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowSum(Mat,Vec);
544 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatTranspose(Mat,MatReuse,Mat*);
545 PetscPolymorphicFunction(MatTranspose,(Mat A),(A,MAT_INITIAL_MATRIX,&t),Mat,t)
546 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatHermitianTranspose(Mat,MatReuse,Mat*);
547 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPermute(Mat,IS,IS,Mat *);
548 PetscPolymorphicFunction(MatPermute,(Mat A,IS is1,IS is2),(A,is1,is2,&t),Mat,t)
549 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPermuteSparsify(Mat,PetscInt,PetscReal,PetscReal,IS,IS,Mat *);
550 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalScale(Mat,Vec,Vec);
551 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalSet(Mat,Vec,InsertMode);
552 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatEqual(Mat,Mat,PetscTruth*);
553 PetscPolymorphicFunction(MatEqual,(Mat A,Mat B),(A,B,&t),PetscTruth,t)
554 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultEqual(Mat,Mat,PetscInt,PetscTruth*);
555 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultAddEqual(Mat,Mat,PetscInt,PetscTruth*);
556 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeEqual(Mat,Mat,PetscInt,PetscTruth*);
557 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeAddEqual(Mat,Mat,PetscInt,PetscTruth*);
558 
559 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatNorm(Mat,NormType,PetscReal *);
560 PetscPolymorphicFunction(MatNorm,(Mat A,NormType t),(A,t,&n),PetscReal,n)
561 EXTERN PetscErrorCode MatGetColumnNorms(Mat,NormType,PetscReal *);
562 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatZeroEntries(Mat);
563 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRows(Mat,PetscInt,const PetscInt [],PetscScalar);
564 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsIS(Mat,IS,PetscScalar);
565 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatZeroColumns(Mat,PetscInt,const PetscInt [],const PetscScalar*);
566 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatZeroColumnsIS(Mat,IS,const PetscScalar*);
567 
568 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatUseScaledForm(Mat,PetscTruth);
569 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatScaleSystem(Mat,Vec,Vec);
570 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatUnScaleSystem(Mat,Vec,Vec);
571 
572 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetSize(Mat,PetscInt*,PetscInt*);
573 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalSize(Mat,PetscInt*,PetscInt*);
574 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRange(Mat,PetscInt*,PetscInt*);
575 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRanges(Mat,const PetscInt**);
576 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRangeColumn(Mat,PetscInt*,PetscInt*);
577 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRangesColumn(Mat,const PetscInt**);
578 
579 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrices(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]);
580 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDestroyMatrices(PetscInt,Mat *[]);
581 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrix(Mat,IS,IS,MatReuse,Mat *);
582 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetSeqNonzeroStructure(Mat,Mat*);
583 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDestroySeqNonzeroStructure(Mat*);
584 
585 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMerge(MPI_Comm,Mat,PetscInt,MatReuse,Mat*);
586 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMerge_SeqsToMPI(MPI_Comm,Mat,PetscInt,PetscInt,MatReuse,Mat*);
587 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMerge_SeqsToMPISymbolic(MPI_Comm,Mat,PetscInt,PetscInt,Mat*);
588 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMerge_SeqsToMPINumeric(Mat,Mat);
589 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDestroy_MPIAIJ_SeqsToMPI(Mat);
590 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalMat(Mat,MatReuse,Mat*);
591 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalMatCondensed(Mat,MatReuse,IS*,IS*,Mat*);
592 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetBrowsOfAcols(Mat,Mat,MatReuse,IS*,IS*,PetscInt*,Mat*);
593 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetBrowsOfAoCols(Mat,Mat,MatReuse,PetscInt**,PetscInt**,MatScalar**,Mat*);
594 #if defined (PETSC_USE_CTABLE)
595 #include "petscctable.h"
596 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetCommunicationStructs(Mat, Vec *, PetscTable *, VecScatter *);
597 #else
598 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetCommunicationStructs(Mat, Vec *, PetscInt *[], VecScatter *);
599 #endif
600 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetGhosts(Mat, PetscInt *,const PetscInt *[]);
601 
602 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatIncreaseOverlap(Mat,PetscInt,IS[],PetscInt);
603 
604 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMatMult(Mat,Mat,MatReuse,PetscReal,Mat*);
605 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultSymbolic(Mat,Mat,PetscReal,Mat*);
606 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultNumeric(Mat,Mat,Mat);
607 
608 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPtAP(Mat,Mat,MatReuse,PetscReal,Mat*);
609 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPtAPSymbolic(Mat,Mat,PetscReal,Mat*);
610 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPtAPNumeric(Mat,Mat,Mat);
611 
612 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultTranspose(Mat,Mat,MatReuse,PetscReal,Mat*);
613 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultTransposeSymbolic(Mat,Mat,PetscReal,Mat*);
614 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultTransposeNumeric(Mat,Mat,Mat);
615 
616 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatAXPY(Mat,PetscScalar,Mat,MatStructure);
617 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatAYPX(Mat,PetscScalar,Mat,MatStructure);
618 
619 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatScale(Mat,PetscScalar);
620 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatShift(Mat,PetscScalar);
621 
622 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
623 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
624 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsLocal(Mat,PetscInt,const PetscInt [],PetscScalar);
625 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsLocalIS(Mat,IS,PetscScalar);
626 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
627 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlockedLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
628 
629 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatStashSetInitialSize(Mat,PetscInt,PetscInt);
630 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatStashGetInfo(Mat,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
631 
632 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatInterpolate(Mat,Vec,Vec);
633 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatInterpolateAdd(Mat,Vec,Vec,Vec);
634 PetscPolymorphicSubroutine(MatInterpolateAdd,(Mat A,Vec x,Vec y),(A,x,y,y))
635 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRestrict(Mat,Vec,Vec);
636 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetVecs(Mat,Vec*,Vec*);
637 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetRedundantMatrix(Mat,PetscInt,MPI_Comm,PetscInt,MatReuse,Mat*);
638 
639 /*MC
640    MatSetValue - Set a single entry into a matrix.
641 
642    Not collective
643 
644    Input Parameters:
645 +  m - the matrix
646 .  row - the row location of the entry
647 .  col - the column location of the entry
648 .  value - the value to insert
649 -  mode - either INSERT_VALUES or ADD_VALUES
650 
651    Notes:
652    For efficiency one should use MatSetValues() and set several or many
653    values simultaneously if possible.
654 
655    Level: beginner
656 
657 .seealso: MatSetValues(), MatSetValueLocal()
658 M*/
659 PETSC_STATIC_INLINE PetscErrorCode MatSetValue(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValues(v,1,&i,1,&j,&va,mode);}
660 
661 PETSC_STATIC_INLINE PetscErrorCode MatGetValue(Mat v,PetscInt i,PetscInt j,PetscScalar *va) {return MatGetValues(v,1,&i,1,&j,va);}
662 
663 PETSC_STATIC_INLINE PetscErrorCode MatSetValueLocal(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValuesLocal(v,1,&i,1,&j,&va,mode);}
664 
665 /*MC
666    MatPreallocateInitialize - Begins the block of code that will count the number of nonzeros per
667        row in a matrix providing the data that one can use to correctly preallocate the matrix.
668 
669    Synopsis:
670    PetscErrorCode MatPreallocateInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
671 
672    Collective on MPI_Comm
673 
674    Input Parameters:
675 +  comm - the communicator that will share the eventually allocated matrix
676 .  nrows - the number of LOCAL rows in the matrix
677 -  ncols - the number of LOCAL columns in the matrix
678 
679    Output Parameters:
680 +  dnz - the array that will be passed to the matrix preallocation routines
681 -  ozn - the other array passed to the matrix preallocation routines
682 
683 
684    Level: intermediate
685 
686    Notes:
687    See the chapter in the users manual on performance for more details
688 
689    Do not malloc or free dnz and onz, that is handled internally by these routines
690 
691    Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices)
692 
693    This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize().
694 
695   Concepts: preallocation^Matrix
696 
697 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
698           MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocal()
699 M*/
700 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
701 { \
702   PetscErrorCode _4_ierr; PetscInt __nrows = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
703   _4_ierr = PetscMalloc2(__nrows,PetscInt,&dnz,__nrows,PetscInt,&onz);CHKERRQ(_4_ierr); \
704   _4_ierr = PetscMemzero(dnz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
705   _4_ierr = PetscMemzero(onz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
706   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
707   _4_ierr = MPI_Scan(&__nrows,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __nrows;
708 
709 /*MC
710    MatPreallocateSymmetricInitialize - Begins the block of code that will count the number of nonzeros per
711        row in a matrix providing the data that one can use to correctly preallocate the matrix.
712 
713    Synopsis:
714    PetscErrorCode MatPreallocateSymmetricInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz)
715 
716    Collective on MPI_Comm
717 
718    Input Parameters:
719 +  comm - the communicator that will share the eventually allocated matrix
720 .  nrows - the number of LOCAL rows in the matrix
721 -  ncols - the number of LOCAL columns in the matrix
722 
723    Output Parameters:
724 +  dnz - the array that will be passed to the matrix preallocation routines
725 -  ozn - the other array passed to the matrix preallocation routines
726 
727 
728    Level: intermediate
729 
730    Notes:
731    See the chapter in the users manual on performance for more details
732 
733    Do not malloc or free dnz and onz, that is handled internally by these routines
734 
735    This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize().
736 
737   Concepts: preallocation^Matrix
738 
739 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
740           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
741 M*/
742 #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \
743 { \
744   PetscErrorCode _4_ierr; PetscInt __nrows = (nrows),__ctmp = (ncols),__rstart,__end; \
745   _4_ierr = PetscMalloc2(__nrows,PetscInt,&dnz,__nrows,PetscInt,&onz);CHKERRQ(_4_ierr); \
746   _4_ierr = PetscMemzero(dnz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
747   _4_ierr = PetscMemzero(onz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\
748   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\
749   _4_ierr = MPI_Scan(&__nrows,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __nrows;
750 
751 /*MC
752    MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
753        inserted using a local number of the rows and columns
754 
755    Synopsis:
756    PetscErrorCode MatPreallocateSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
757 
758    Not Collective
759 
760    Input Parameters:
761 +  map - the mapping between local numbering and global numbering
762 .  nrows - the number of rows indicated
763 .  rows - the indices of the rows
764 .  ncols - the number of columns in the matrix
765 .  cols - the columns indicated
766 .  dnz - the array that will be passed to the matrix preallocation routines
767 -  ozn - the other array passed to the matrix preallocation routines
768 
769 
770    Level: intermediate
771 
772    Notes:
773    See the chapter in the users manual on performance for more details
774 
775    Do not malloc or free dnz and onz, that is handled internally by these routines
776 
777   Concepts: preallocation^Matrix
778 
779 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
780           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
781 M*/
782 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
783 {\
784   PetscInt __l;\
785   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
786   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
787   for (__l=0;__l<nrows;__l++) {\
788     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
789   }\
790 }
791 
792 /*MC
793    MatPreallocateSymmetricSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
794        inserted using a local number of the rows and columns
795 
796    Synopsis:
797    PetscErrorCode MatPreallocateSymmetricSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
798 
799    Not Collective
800 
801    Input Parameters:
802 +  map - the mapping between local numbering and global numbering
803 .  nrows - the number of rows indicated
804 .  rows - the indices of the rows
805 .  ncols - the number of columns in the matrix
806 .  cols - the columns indicated
807 .  dnz - the array that will be passed to the matrix preallocation routines
808 -  ozn - the other array passed to the matrix preallocation routines
809 
810 
811    Level: intermediate
812 
813    Notes:
814    See the chapter in the users manual on performance for more details
815 
816    Do not malloc or free dnz and onz that is handled internally by these routines
817 
818   Concepts: preallocation^Matrix
819 
820 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
821           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
822 M*/
823 #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
824 {\
825   PetscInt __l;\
826   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
827   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
828   for (__l=0;__l<nrows;__l++) {\
829     _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
830   }\
831 }
832 
833 /*MC
834    MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
835        inserted using a local number of the rows and columns
836 
837    Synopsis:
838    PetscErrorCode MatPreallocateSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
839 
840    Not Collective
841 
842    Input Parameters:
843 +  row - the row
844 .  ncols - the number of columns in the matrix
845 -  cols - the columns indicated
846 
847    Output Parameters:
848 +  dnz - the array that will be passed to the matrix preallocation routines
849 -  ozn - the other array passed to the matrix preallocation routines
850 
851 
852    Level: intermediate
853 
854    Notes:
855    See the chapter in the users manual on performance for more details
856 
857    Do not malloc or free dnz and onz that is handled internally by these routines
858 
859    This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize().
860 
861   Concepts: preallocation^Matrix
862 
863 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
864           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
865 M*/
866 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
867 { PetscInt __i; \
868   if (row < __rstart) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D less than first local row %D",row,__rstart);\
869   if (row >= __rstart+__nrows) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D greater than last local row %D",row,__rstart+__nrows-1);\
870   for (__i=0; __i<nc; __i++) {\
871     if ((cols)[__i] < __start || (cols)[__i] >= __end) onz[row - __rstart]++; \
872     else dnz[row - __rstart]++;\
873   }\
874 }
875 
876 /*MC
877    MatPreallocateSymmetricSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
878        inserted using a local number of the rows and columns
879 
880    Synopsis:
881    PetscErrorCode MatPreallocateSymmetricSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz)
882 
883    Not Collective
884 
885    Input Parameters:
886 +  nrows - the number of rows indicated
887 .  rows - the indices of the rows
888 .  ncols - the number of columns in the matrix
889 .  cols - the columns indicated
890 .  dnz - the array that will be passed to the matrix preallocation routines
891 -  ozn - the other array passed to the matrix preallocation routines
892 
893 
894    Level: intermediate
895 
896    Notes:
897    See the chapter in the users manual on performance for more details
898 
899    Do not malloc or free dnz and onz that is handled internally by these routines
900 
901    This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize().
902 
903   Concepts: preallocation^Matrix
904 
905 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
906           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
907 M*/
908 #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\
909 { PetscInt __i; \
910   for (__i=0; __i<nc; __i++) {\
911     if (cols[__i] >= __end) onz[row - __rstart]++; \
912     else if (cols[__i] >= row) dnz[row - __rstart]++;\
913   }\
914 }
915 
916 /*MC
917    MatPreallocateLocation -  An alternative to MatPreallocationSet() that puts the nonzero locations into the matrix if it exists
918 
919    Synopsis:
920    PetscErrorCode MatPreallocateLocations(Mat A,PetscInt row,PetscInt ncols,PetscInt *cols,PetscInt *dnz,PetscInt *onz)
921 
922    Not Collective
923 
924    Input Parameters:
925 .  A - matrix
926 .  row - row where values exist (must be local to this process)
927 .  ncols - number of columns
928 .  cols - columns with nonzeros
929 .  dnz - the array that will be passed to the matrix preallocation routines
930 -  ozn - the other array passed to the matrix preallocation routines
931 
932 
933    Level: intermediate
934 
935    Notes:
936    See the chapter in the users manual on performance for more details
937 
938    Do not malloc or free dnz and onz that is handled internally by these routines
939 
940    This is a MACRO not a function because it uses a bunch of variables private to the MatPreallocation.... routines.
941 
942   Concepts: preallocation^Matrix
943 
944 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
945           MatPreallocateSymmetricInitialize(), MatPreallocateSymmetricSetLocal()
946 M*/
947 #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);}
948 
949 
950 /*MC
951    MatPreallocateFinalize - Ends the block of code that will count the number of nonzeros per
952        row in a matrix providing the data that one can use to correctly preallocate the matrix.
953 
954    Synopsis:
955    PetscErrorCode MatPreallocateFinalize(PetscInt *dnz, PetscInt *onz)
956 
957    Collective on MPI_Comm
958 
959    Input Parameters:
960 +  dnz - the array that was be passed to the matrix preallocation routines
961 -  ozn - the other array passed to the matrix preallocation routines
962 
963 
964    Level: intermediate
965 
966    Notes:
967    See the chapter in the users manual on performance for more details
968 
969    Do not malloc or free dnz and onz that is handled internally by these routines
970 
971    This is a MACRO not a function because it closes the { started in MatPreallocateInitialize().
972 
973   Concepts: preallocation^Matrix
974 
975 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
976           MatPreallocateSymmetricInitialize(), MatPreallocateSymmetricSetLocal()
977 M*/
978 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree2(dnz,onz);CHKERRQ(_4_ierr);}
979 
980 
981 
982 /* Routines unique to particular data structures */
983 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatShellGetContext(Mat,void **);
984 PetscPolymorphicFunction(MatShellGetContext,(Mat A),(A,&t),void*,t)
985 
986 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatInodeAdjustForInodes(Mat,IS*,IS*);
987 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatInodeGetInodeSizes(Mat,PetscInt *,PetscInt *[],PetscInt *);
988 
989 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetColumnIndices(Mat,PetscInt[]);
990 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJSetColumnIndices(Mat,PetscInt[]);
991 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
992 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
993 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqSBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*);
994 
995 #define MAT_SKIP_ALLOCATION -4
996 
997 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
998 PetscPolymorphicSubroutine(MatSeqBAIJSetPreallocation,(Mat A,PetscInt bs,const PetscInt nnz[]),(A,bs,0,nnz))
999 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqSBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]);
1000 PetscPolymorphicSubroutine(MatSeqSBAIJSetPreallocation,(Mat A,PetscInt bs,const PetscInt nnz[]),(A,bs,0,nnz))
1001 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetPreallocation(Mat,PetscInt,const PetscInt[]);
1002 PetscPolymorphicSubroutine(MatSeqAIJSetPreallocation,(Mat A,const PetscInt nnz[]),(A,0,nnz))
1003 
1004 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
1005 PetscPolymorphicSubroutine(MatMPIBAIJSetPreallocation,(Mat A,PetscInt bs,const PetscInt nnz[],const PetscInt onz[]),(A,bs,0,nnz,0,onz))
1006 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPISBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
1007 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAIJSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]);
1008 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetPreallocationCSR(Mat,const PetscInt [],const PetscInt [],const PetscScalar []);
1009 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
1010 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAIJSetPreallocationCSR(Mat,const PetscInt[],const PetscInt[],const PetscScalar[]);
1011 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]);
1012 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAdjSetPreallocation(Mat,PetscInt[],PetscInt[],PetscInt[]);
1013 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIDenseSetPreallocation(Mat,PetscScalar[]);
1014 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat,PetscScalar[]);
1015 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,PetscInt*[]);
1016 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,PetscInt*[]);
1017 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatAdicSetLocalFunction(Mat,void (*)(void));
1018 
1019 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat,PetscInt);
1020 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDenseGetLocalMatrix(Mat,Mat*);
1021 
1022 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatStoreValues(Mat);
1023 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatRetrieveValues(Mat);
1024 
1025 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDAADSetCtx(Mat,void*);
1026 
1027 /*
1028   These routines are not usually accessed directly, rather solving is
1029   done through the KSP and PC interfaces.
1030 */
1031 
1032 /*E
1033     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
1034        with an optional dynamic library name, for example
1035        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
1036 
1037    Level: beginner
1038 
1039    Cannot use const because the PC objects manipulate the string
1040 
1041 .seealso: MatGetOrdering()
1042 E*/
1043 #define MatOrderingType char*
1044 #define MATORDERING_NATURAL     "natural"
1045 #define MATORDERING_ND          "nd"
1046 #define MATORDERING_1WD         "1wd"
1047 #define MATORDERING_RCM         "rcm"
1048 #define MATORDERING_QMD         "qmd"
1049 #define MATORDERING_ROWLENGTH   "rowlength"
1050 #define MATORDERING_DSC_ND      "dsc_nd"         /* these three are only for DSCPACK, see its documentation for details */
1051 #define MATORDERING_DSC_MMD     "dsc_mmd"
1052 #define MATORDERING_DSC_MDF     "dsc_mdf"
1053 #define MATORDERING_CONSTRAINED "constrained"
1054 #define MATORDERING_IDENTITY    "identity"
1055 #define MATORDERING_REVERSE     "reverse"
1056 #define MATORDERING_FLOW        "flow"
1057 #define MATORDERING_AMD         "amd"
1058 
1059 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetOrdering(Mat,const MatOrderingType,IS*,IS*);
1060 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetOrderingList(PetscFList *list);
1061 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatOrderingRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,const MatOrderingType,IS*,IS*));
1062 
1063 /*MC
1064    MatOrderingRegisterDynamic - Adds a new sparse matrix ordering to the matrix package.
1065 
1066    Synopsis:
1067    PetscErrorCode MatOrderingRegisterDynamic(const char *name_ordering,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatOrdering))
1068 
1069    Not Collective
1070 
1071    Input Parameters:
1072 +  sname - name of ordering (for example MATORDERING_ND)
1073 .  path - location of library where creation routine is
1074 .  name - name of function that creates the ordering type,a string
1075 -  function - function pointer that creates the ordering
1076 
1077    Level: developer
1078 
1079    If dynamic libraries are used, then the fourth input argument (function)
1080    is ignored.
1081 
1082    Sample usage:
1083 .vb
1084    MatOrderingRegisterDynamic("my_order",/home/username/my_lib/lib/libO/solaris/mylib.a,
1085                "MyOrder",MyOrder);
1086 .ve
1087 
1088    Then, your partitioner can be chosen with the procedural interface via
1089 $     MatOrderingSetType(part,"my_order)
1090    or at runtime via the option
1091 $     -pc_factor_mat_ordering_type my_order
1092 
1093    ${PETSC_ARCH} occuring in pathname will be replaced with appropriate values.
1094 
1095 .keywords: matrix, ordering, register
1096 
1097 .seealso: MatOrderingRegisterDestroy(), MatOrderingRegisterAll()
1098 M*/
1099 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1100 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
1101 #else
1102 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
1103 #endif
1104 
1105 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatOrderingRegisterDestroy(void);
1106 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatOrderingRegisterAll(const char[]);
1107 extern PetscTruth MatOrderingRegisterAllCalled;
1108 extern PetscFList MatOrderingList;
1109 
1110 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
1111 
1112 /*S
1113     MatFactorShiftType - Numeric Shift.
1114 
1115    Level: beginner
1116 
1117 S*/
1118 typedef enum {MAT_SHIFT_NONE,MAT_SHIFT_NONZERO,MAT_SHIFT_POSITIVE_DEFINITE,MAT_SHIFT_INBLOCKS} MatFactorShiftType;
1119 extern const char *MatFactorShiftTypes[];
1120 
1121 /*S
1122    MatFactorInfo - Data passed into the matrix factorization routines
1123 
1124    In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE, that is use
1125 $     MatFactorInfo  info(MAT_FACTORINFO_SIZE)
1126 
1127    Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC.
1128 
1129       You can use MatFactorInfoInitialize() to set default values.
1130 
1131    Level: developer
1132 
1133 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor(),
1134           MatFactorInfoInitialize()
1135 
1136 S*/
1137 typedef struct {
1138   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
1139   PetscReal     usedt;
1140   PetscReal     dt;             /* drop tolerance */
1141   PetscReal     dtcol;          /* tolerance for pivoting */
1142   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
1143   PetscReal     fill;           /* expected fill, nonzeros in factored matrix/nonzeros in original matrix */
1144   PetscReal     levels;         /* ICC/ILU(levels) */
1145   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
1146                                    factorization may be faster if do not pivot */
1147   PetscReal     zeropivot;      /* pivot is called zero if less than this */
1148   PetscReal     shifttype;      /* type of shift added to matrix factor to prevent zero pivots */
1149   PetscReal     shiftamount;     /* how large the shift is */
1150 } MatFactorInfo;
1151 
1152 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFactorInfoInitialize(MatFactorInfo*);
1153 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactor(Mat,IS,const MatFactorInfo*);
1154 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*);
1155 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactorNumeric(Mat,Mat,const MatFactorInfo*);
1156 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactor(Mat,IS,IS,const MatFactorInfo*);
1157 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatILUFactor(Mat,IS,IS,const MatFactorInfo*);
1158 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*);
1159 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatILUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*);
1160 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatICCFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*);
1161 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatICCFactor(Mat,IS,const MatFactorInfo*);
1162 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactorNumeric(Mat,Mat,const MatFactorInfo*);
1163 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetInertia(Mat,PetscInt*,PetscInt*,PetscInt*);
1164 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSolve(Mat,Vec,Vec);
1165 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatForwardSolve(Mat,Vec,Vec);
1166 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatBackwardSolve(Mat,Vec,Vec);
1167 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSolveAdd(Mat,Vec,Vec,Vec);
1168 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSolveTranspose(Mat,Vec,Vec);
1169 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
1170 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSolves(Mat,Vecs,Vecs);
1171 
1172 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSetUnfactored(Mat);
1173 
1174 /*E
1175     MatSORType - What type of (S)SOR to perform
1176 
1177     Level: beginner
1178 
1179    May be bitwise ORd together
1180 
1181    Any additions/changes here MUST also be made in include/finclude/petscmat.h
1182 
1183    MatSORType may be bitwise ORd together, so do not change the numbers
1184 
1185 .seealso: MatSOR()
1186 E*/
1187 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
1188               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
1189               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
1190               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
1191 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSOR(Mat,Vec,PetscReal,MatSORType,PetscReal,PetscInt,PetscInt,Vec);
1192 
1193 /*
1194     These routines are for efficiently computing Jacobians via finite differences.
1195 */
1196 
1197 /*E
1198     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
1199        with an optional dynamic library name, for example
1200        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
1201 
1202    Level: beginner
1203 
1204 .seealso: MatGetColoring()
1205 E*/
1206 #define MatColoringType char*
1207 #define MATCOLORING_NATURAL "natural"
1208 #define MATCOLORING_SL      "sl"
1209 #define MATCOLORING_LF      "lf"
1210 #define MATCOLORING_ID      "id"
1211 
1212 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatGetColoring(Mat,const MatColoringType,ISColoring*);
1213 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatColoringRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,MatColoringType,ISColoring *));
1214 
1215 /*MC
1216    MatColoringRegisterDynamic - Adds a new sparse matrix coloring to the
1217                                matrix package.
1218 
1219    Synopsis:
1220    PetscErrorCode MatColoringRegisterDynamic(const char *name_coloring,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatColoring))
1221 
1222    Not Collective
1223 
1224    Input Parameters:
1225 +  sname - name of Coloring (for example MATCOLORING_SL)
1226 .  path - location of library where creation routine is
1227 .  name - name of function that creates the Coloring type, a string
1228 -  function - function pointer that creates the coloring
1229 
1230    Level: developer
1231 
1232    If dynamic libraries are used, then the fourth input argument (function)
1233    is ignored.
1234 
1235    Sample usage:
1236 .vb
1237    MatColoringRegisterDynamic("my_color",/home/username/my_lib/lib/libO/solaris/mylib.a,
1238                "MyColor",MyColor);
1239 .ve
1240 
1241    Then, your partitioner can be chosen with the procedural interface via
1242 $     MatColoringSetType(part,"my_color")
1243    or at runtime via the option
1244 $     -mat_coloring_type my_color
1245 
1246    $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
1247 
1248 .keywords: matrix, Coloring, register
1249 
1250 .seealso: MatColoringRegisterDestroy(), MatColoringRegisterAll()
1251 M*/
1252 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1253 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
1254 #else
1255 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
1256 #endif
1257 
1258 extern PetscTruth MatColoringRegisterAllCalled;
1259 
1260 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatColoringRegisterAll(const char[]);
1261 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatColoringRegisterDestroy(void);
1262 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatColoringPatch(Mat,PetscInt,PetscInt,ISColoringValue[],ISColoring*);
1263 
1264 /*S
1265      MatFDColoring - Object for computing a sparse Jacobian via finite differences
1266         and coloring
1267 
1268    Level: beginner
1269 
1270   Concepts: coloring, sparse Jacobian, finite differences
1271 
1272 .seealso:  MatFDColoringCreate()
1273 S*/
1274 typedef struct _p_MatFDColoring* MatFDColoring;
1275 
1276 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
1277 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringDestroy(MatFDColoring);
1278 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringView(MatFDColoring,PetscViewer);
1279 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetFunction(MatFDColoring,PetscErrorCode (*)(void),void*);
1280 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringGetFunction(MatFDColoring,PetscErrorCode (**)(void),void**);
1281 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
1282 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetFromOptions(MatFDColoring);
1283 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
1284 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
1285 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringSetF(MatFDColoring,Vec);
1286 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringGetPerturbedColumns(MatFDColoring,PetscInt*,PetscInt*[]);
1287 /*
1288     These routines are for partitioning matrices: currently used only
1289   for adjacency matrix, MatCreateMPIAdj().
1290 */
1291 
1292 /*S
1293      MatPartitioning - Object for managing the partitioning of a matrix or graph
1294 
1295    Level: beginner
1296 
1297   Concepts: partitioning
1298 
1299 .seealso:  MatPartitioningCreate(), MatPartitioningType
1300 S*/
1301 typedef struct _p_MatPartitioning* MatPartitioning;
1302 
1303 /*E
1304     MatPartitioningType - String with the name of a PETSc matrix partitioning or the creation function
1305        with an optional dynamic library name, for example
1306        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
1307 
1308    Level: beginner
1309 
1310 .seealso: MatPartitioningCreate(), MatPartitioning
1311 E*/
1312 #define MatPartitioningType char*
1313 #define MAT_PARTITIONING_CURRENT  "current"
1314 #define MAT_PARTITIONING_SQUARE   "square"
1315 #define MAT_PARTITIONING_PARMETIS "parmetis"
1316 #define MAT_PARTITIONING_CHACO    "chaco"
1317 #define MAT_PARTITIONING_JOSTLE   "jostle"
1318 #define MAT_PARTITIONING_PARTY    "party"
1319 #define MAT_PARTITIONING_SCOTCH   "scotch"
1320 
1321 
1322 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningCreate(MPI_Comm,MatPartitioning*);
1323 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetType(MatPartitioning,const MatPartitioningType);
1324 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetNParts(MatPartitioning,PetscInt);
1325 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetAdjacency(MatPartitioning,Mat);
1326 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetVertexWeights(MatPartitioning,const PetscInt[]);
1327 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []);
1328 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningApply(MatPartitioning,IS*);
1329 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningDestroy(MatPartitioning);
1330 
1331 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatPartitioning));
1332 
1333 /*MC
1334    MatPartitioningRegisterDynamic - Adds a new sparse matrix partitioning to the
1335    matrix package.
1336 
1337    Synopsis:
1338    PetscErrorCode MatPartitioningRegisterDynamic(const char *name_partitioning,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatPartitioning))
1339 
1340    Not Collective
1341 
1342    Input Parameters:
1343 +  sname - name of partitioning (for example MAT_PARTITIONING_CURRENT) or parmetis
1344 .  path - location of library where creation routine is
1345 .  name - name of function that creates the partitioning type, a string
1346 -  function - function pointer that creates the partitioning type
1347 
1348    Level: developer
1349 
1350    If dynamic libraries are used, then the fourth input argument (function)
1351    is ignored.
1352 
1353    Sample usage:
1354 .vb
1355    MatPartitioningRegisterDynamic("my_part",/home/username/my_lib/lib/libO/solaris/mylib.a,
1356                "MyPartCreate",MyPartCreate);
1357 .ve
1358 
1359    Then, your partitioner can be chosen with the procedural interface via
1360 $     MatPartitioningSetType(part,"my_part")
1361    or at runtime via the option
1362 $     -mat_partitioning_type my_part
1363 
1364    $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
1365 
1366 .keywords: matrix, partitioning, register
1367 
1368 .seealso: MatPartitioningRegisterDestroy(), MatPartitioningRegisterAll()
1369 M*/
1370 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1371 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
1372 #else
1373 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
1374 #endif
1375 
1376 extern PetscTruth MatPartitioningRegisterAllCalled;
1377 
1378 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningRegisterAll(const char[]);
1379 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningRegisterDestroy(void);
1380 
1381 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningView(MatPartitioning,PetscViewer);
1382 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningSetFromOptions(MatPartitioning);
1383 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningGetType(MatPartitioning,const MatPartitioningType*);
1384 
1385 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
1386 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningParmetisGetEdgeCut(MatPartitioning, PetscInt *);
1387 
1388 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningJostleSetCoarseLevel(MatPartitioning,PetscReal);
1389 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningJostleSetCoarseSequential(MatPartitioning);
1390 
1391 typedef enum {MP_CHACO_MULTILEVEL_KL,MP_CHACO_SPECTRAL,MP_CHACO_LINEAR,MP_CHACO_RANDOM, MP_CHACO_SCATTERED} MPChacoGlobalType;
1392 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetGlobal(MatPartitioning, MPChacoGlobalType);
1393 typedef enum { MP_CHACO_KERNIGHAN_LIN, MP_CHACO_NONE } MPChacoLocalType;
1394 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetLocal(MatPartitioning, MPChacoLocalType);
1395 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetCoarseLevel(MatPartitioning,PetscReal);
1396 typedef enum { MP_CHACO_LANCZOS, MP_CHACO_RQI_SYMMLQ } MPChacoEigenType;
1397 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetEigenSolver(MatPartitioning,MPChacoEigenType);
1398 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetEigenTol(MatPartitioning, PetscReal);
1399 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningChacoSetEigenNumber(MatPartitioning, PetscInt);
1400 
1401 #define MP_PARTY_OPT "opt"
1402 #define MP_PARTY_LIN "lin"
1403 #define MP_PARTY_SCA "sca"
1404 #define MP_PARTY_RAN "ran"
1405 #define MP_PARTY_GBF "gbf"
1406 #define MP_PARTY_GCF "gcf"
1407 #define MP_PARTY_BUB "bub"
1408 #define MP_PARTY_DEF "def"
1409 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetGlobal(MatPartitioning, const char*);
1410 #define MP_PARTY_HELPFUL_SETS "hs"
1411 #define MP_PARTY_KERNIGHAN_LIN "kl"
1412 #define MP_PARTY_NONE "no"
1413 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetLocal(MatPartitioning, const char*);
1414 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetCoarseLevel(MatPartitioning,PetscReal);
1415 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetBipart(MatPartitioning,PetscTruth);
1416 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningPartySetMatchOptimization(MatPartitioning,PetscTruth);
1417 
1418 typedef enum { MP_SCOTCH_GREEDY, MP_SCOTCH_GPS, MP_SCOTCH_GR_GPS } MPScotchGlobalType;
1419 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetArch(MatPartitioning,const char*);
1420 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetMultilevel(MatPartitioning);
1421 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetGlobal(MatPartitioning,MPScotchGlobalType);
1422 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetCoarseLevel(MatPartitioning,PetscReal);
1423 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetHostList(MatPartitioning,const char*);
1424 typedef enum { MP_SCOTCH_KERNIGHAN_LIN, MP_SCOTCH_NONE } MPScotchLocalType;
1425 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetLocal(MatPartitioning,MPScotchLocalType);
1426 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetMapping(MatPartitioning);
1427 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatPartitioningScotchSetStrategy(MatPartitioning,char*);
1428 
1429 EXTERN PetscErrorCode MatMeshToVertexGraph(Mat,PetscInt,Mat*);
1430 EXTERN PetscErrorCode MatMeshToCellGraph(Mat,PetscInt,Mat*);
1431 
1432 /*
1433     If you add entries here you must also add them to finclude/petscmat.h
1434 */
1435 typedef enum { MATOP_SET_VALUES=0,
1436                MATOP_GET_ROW=1,
1437                MATOP_RESTORE_ROW=2,
1438                MATOP_MULT=3,
1439                MATOP_MULT_ADD=4,
1440                MATOP_MULT_TRANSPOSE=5,
1441                MATOP_MULT_TRANSPOSE_ADD=6,
1442                MATOP_SOLVE=7,
1443                MATOP_SOLVE_ADD=8,
1444                MATOP_SOLVE_TRANSPOSE=9,
1445                MATOP_SOLVE_TRANSPOSE_ADD=10,
1446                MATOP_LUFACTOR=11,
1447                MATOP_CHOLESKYFACTOR=12,
1448                MATOP_SOR=13,
1449                MATOP_TRANSPOSE=14,
1450                MATOP_GETINFO=15,
1451                MATOP_EQUAL=16,
1452                MATOP_GET_DIAGONAL=17,
1453                MATOP_DIAGONAL_SCALE=18,
1454                MATOP_NORM=19,
1455                MATOP_ASSEMBLY_BEGIN=20,
1456                MATOP_ASSEMBLY_END=21,
1457                MATOP_SET_OPTION=22,
1458                MATOP_ZERO_ENTRIES=23,
1459                MATOP_ZERO_ROWS=24,
1460                MATOP_LUFACTOR_SYMBOLIC=25,
1461                MATOP_LUFACTOR_NUMERIC=26,
1462                MATOP_CHOLESKY_FACTOR_SYMBOLIC=27,
1463                MATOP_CHOLESKY_FACTOR_NUMERIC=28,
1464                MATOP_SETUP_PREALLOCATION=29,
1465                MATOP_ILUFACTOR_SYMBOLIC=30,
1466                MATOP_ICCFACTOR_SYMBOLIC=31,
1467                MATOP_GET_ARRAY=32,
1468                MATOP_RESTORE_ARRAY=33,
1469                MATOP_DUPLICATE=34,
1470                MATOP_FORWARD_SOLVE=35,
1471                MATOP_BACKWARD_SOLVE=36,
1472                MATOP_ILUFACTOR=37,
1473                MATOP_ICCFACTOR=38,
1474                MATOP_AXPY=39,
1475                MATOP_GET_SUBMATRICES=40,
1476                MATOP_INCREASE_OVERLAP=41,
1477                MATOP_GET_VALUES=42,
1478                MATOP_COPY=43,
1479                MATOP_GET_ROW_MAX=44,
1480                MATOP_SCALE=45,
1481                MATOP_SHIFT=46,
1482                MATOP_DIAGONAL_SET=47,
1483                MATOP_ILUDT_FACTOR=48,
1484                MATOP_SET_BLOCK_SIZE=49,
1485                MATOP_GET_ROW_IJ=50,
1486                MATOP_RESTORE_ROW_IJ=51,
1487                MATOP_GET_COLUMN_IJ=52,
1488                MATOP_RESTORE_COLUMN_IJ=53,
1489                MATOP_FDCOLORING_CREATE=54,
1490                MATOP_COLORING_PATCH=55,
1491                MATOP_SET_UNFACTORED=56,
1492                MATOP_PERMUTE=57,
1493                MATOP_SET_VALUES_BLOCKED=58,
1494                MATOP_GET_SUBMATRIX=59,
1495                MATOP_DESTROY=60,
1496                MATOP_VIEW=61,
1497                MATOP_CONVERT_FROM=62,
1498                MATOP_USE_SCALED_FORM=63,
1499                MATOP_SCALE_SYSTEM=64,
1500                MATOP_UNSCALE_SYSTEM=65,
1501                MATOP_SET_LOCAL_TO_GLOBAL_MAP=66,
1502                MATOP_SET_VALUES_LOCAL=67,
1503                MATOP_ZERO_ROWS_LOCAL=68,
1504                MATOP_GET_ROW_MAX_ABS=69,
1505                MATOP_GET_ROW_MIN_ABS=70,
1506                MATOP_CONVERT=71,
1507                MATOP_SET_COLORING=72,
1508                MATOP_SET_VALUES_ADIC=73,
1509                MATOP_SET_VALUES_ADIFOR=74,
1510                MATOP_FD_COLORING_APPLY=75,
1511                MATOP_SET_FROM_OPTIONS=76,
1512                MATOP_MULT_CON=77,
1513                MATOP_MULT_TRANSPOSE_CON=78,
1514                MATOP_PERMUTE_SPARSIFY=79,
1515                MATOP_MULT_MULTIPLE=80,
1516                MATOP_SOLVE_MULTIPLE=81,
1517                MATOP_GET_INERTIA=82,
1518                MATOP_LOAD=83,
1519                MATOP_IS_SYMMETRIC=84,
1520                MATOP_IS_HERMITIAN=85,
1521                MATOP_IS_STRUCTURALLY_SYMMETRIC=86,
1522                MATOP_DUMMY=87,
1523                MATOP_GET_VECS=88,
1524                MATOP_MAT_MULT=89,
1525                MATOP_MAT_MULT_SYMBOLIC=90,
1526                MATOP_MAT_MULT_NUMERIC=91,
1527                MATOP_PTAP=92,
1528                MATOP_PTAP_SYMBOLIC=93,
1529                MATOP_PTAP_NUMERIC=94,
1530                MATOP_MAT_MULTTRANSPOSE=95,
1531                MATOP_MAT_MULTTRANSPOSE_SYM=96,
1532                MATOP_MAT_MULTTRANSPOSE_NUM=97,
1533                MATOP_PTAP_SYMBOLIC_SEQAIJ=98,
1534                MATOP_PTAP_NUMERIC_SEQAIJ=99,
1535                MATOP_PTAP_SYMBOLIC_MPIAIJ=100,
1536                MATOP_PTAP_NUMERIC_MPIAIJ=101,
1537                MATOP_CONJUGATE=102,
1538                MATOP_SET_SIZES=103,
1539                MATOP_SET_VALUES_ROW=104,
1540                MATOP_REAL_PART=105,
1541                MATOP_IMAG_PART=106,
1542                MATOP_GET_ROW_UTRIANGULAR=107,
1543                MATOP_RESTORE_ROW_UTRIANGULAR=108,
1544                MATOP_MATSOLVE=109,
1545                MATOP_GET_REDUNDANTMATRIX=110,
1546                MATOP_GET_ROW_MIN=111,
1547                MATOP_GET_COLUMN_VEC=112,
1548                MATOP_MISSING_DIAGONAL=113,
1549                MATOP_MATGETSEQNONZEROSTRUCTURE=114,
1550                MATOP_CREATE=115,
1551                MATOP_GET_GHOSTS=116,
1552                MATOP_MULT_DIAGONAL_BLOCK=119,
1553                MATOP_HERMITIANTRANSPOSE=120,
1554                MATOP_MULTHERMITIANTRANSPOSE=121,
1555                MATOP_MULTHERMITIANTRANSPOSEADD=122
1556              } MatOperation;
1557 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatHasOperation(Mat,MatOperation,PetscTruth*);
1558 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatShellSetOperation(Mat,MatOperation,void(*)(void));
1559 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatShellGetOperation(Mat,MatOperation,void(**)(void));
1560 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatShellSetContext(Mat,void*);
1561 
1562 /*
1563    Codes for matrices stored on disk. By default they are
1564  stored in a universal format. By changing the format with
1565  PetscViewerSetFormat(viewer,PETSC_VIEWER_NATIVE); the matrices will
1566  be stored in a way natural for the matrix, for example dense matrices
1567  would be stored as dense. Matrices stored this way may only be
1568  read into matrices of the same time.
1569 */
1570 #define MATRIX_BINARY_FORMAT_DENSE -1
1571 
1572 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
1573 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatISGetLocalMat(Mat,Mat*);
1574 
1575 /*S
1576      MatNullSpace - Object that removes a null space from a vector, i.e.
1577          orthogonalizes the vector to a subsapce
1578 
1579    Level: advanced
1580 
1581   Concepts: matrix; linear operator, null space
1582 
1583   Users manual sections:
1584 .   sec_singular
1585 
1586 .seealso:  MatNullSpaceCreate()
1587 S*/
1588 typedef struct _p_MatNullSpace* MatNullSpace;
1589 
1590 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceCreate(MPI_Comm,PetscTruth,PetscInt,const Vec[],MatNullSpace*);
1591 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceSetFunction(MatNullSpace,PetscErrorCode (*)(MatNullSpace,Vec,void*),void*);
1592 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceDestroy(MatNullSpace);
1593 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
1594 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceAttach(Mat,MatNullSpace);
1595 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceTest(MatNullSpace,Mat,PetscTruth *);
1596 
1597 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatReorderingSeqSBAIJ(Mat,IS);
1598 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
1599 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqSBAIJSetColumnIndices(Mat,PetscInt *);
1600 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatSeqBAIJInvertBlockDiagonal(Mat);
1601 
1602 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMAIJ(Mat,PetscInt,Mat*);
1603 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMAIJRedimension(Mat,PetscInt,Mat*);
1604 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMAIJGetAIJ(Mat,Mat*);
1605 
1606 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatComputeExplicitOperator(Mat,Mat*);
1607 
1608 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalScaleLocal(Mat,Vec);
1609 
1610 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatCreateMFFD(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,Mat*);
1611 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetBase(Mat,Vec,Vec);
1612 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunction(Mat,PetscErrorCode(*)(void*,Vec,Vec),void*);
1613 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunctioni(Mat,PetscErrorCode (*)(void*,PetscInt,Vec,PetscScalar*));
1614 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunctioniBase(Mat,PetscErrorCode (*)(void*,Vec));
1615 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDAddNullSpace(Mat,MatNullSpace);
1616 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetHHistory(Mat,PetscScalar[],PetscInt);
1617 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDResetHHistory(Mat);
1618 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFunctionError(Mat,PetscReal);
1619 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetPeriod(Mat,PetscInt);
1620 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDGetH(Mat,PetscScalar *);
1621 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetOptionsPrefix(Mat,const char[]);
1622 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetFromOptions(Mat);
1623 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDCheckPositivity(void*,Vec,Vec,PetscScalar*);
1624 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetCheckh(Mat,PetscErrorCode (*)(void*,Vec,Vec,PetscScalar*),void*);
1625 
1626 
1627 typedef struct _p_MatMFFD* MatMFFD;
1628 
1629 /*E
1630     MatMFFDType - algorithm used to compute the h used in computing matrix-vector products via differencing of the function
1631 
1632    Level: beginner
1633 
1634 .seealso: MatMFFDSetType(), MatMFFDRegister()
1635 E*/
1636 #define MatMFFDType char*
1637 #define MATMFFD_DS  "ds"
1638 #define MATMFFD_WP  "wp"
1639 
1640 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDSetType(Mat,const MatMFFDType);
1641 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatMFFD));
1642 
1643 /*MC
1644    MatMFFDRegisterDynamic - Adds a method to the MatMFFD registry.
1645 
1646    Synopsis:
1647    PetscErrorCode MatMFFDRegisterDynamic(const char *name_solver,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatMFFD))
1648 
1649    Not Collective
1650 
1651    Input Parameters:
1652 +  name_solver - name of a new user-defined compute-h module
1653 .  path - path (either absolute or relative) the library containing this solver
1654 .  name_create - name of routine to create method context
1655 -  routine_create - routine to create method context
1656 
1657    Level: developer
1658 
1659    Notes:
1660    MatMFFDRegisterDynamic() may be called multiple times to add several user-defined solvers.
1661 
1662    If dynamic libraries are used, then the fourth input argument (routine_create)
1663    is ignored.
1664 
1665    Sample usage:
1666 .vb
1667    MatMFFDRegisterDynamic("my_h",/home/username/my_lib/lib/libO/solaris/mylib.a,
1668                "MyHCreate",MyHCreate);
1669 .ve
1670 
1671    Then, your solver can be chosen with the procedural interface via
1672 $     MatMFFDSetType(mfctx,"my_h")
1673    or at runtime via the option
1674 $     -snes_mf_type my_h
1675 
1676 .keywords: MatMFFD, register
1677 
1678 .seealso: MatMFFDRegisterAll(), MatMFFDRegisterDestroy()
1679 M*/
1680 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1681 #define MatMFFDRegisterDynamic(a,b,c,d) MatMFFDRegister(a,b,c,0)
1682 #else
1683 #define MatMFFDRegisterDynamic(a,b,c,d) MatMFFDRegister(a,b,c,d)
1684 #endif
1685 
1686 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDRegisterAll(const char[]);
1687 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDRegisterDestroy(void);
1688 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDDSSetUmin(Mat,PetscReal);
1689 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMFFDWPSetComputeNormU(Mat,PetscTruth);
1690 
1691 
1692 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT PetscViewerMathematicaPutMatrix(PetscViewer, PetscInt, PetscInt, PetscReal *);
1693 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT PetscViewerMathematicaPutCSRMatrix(PetscViewer, PetscInt, PetscInt, PetscInt *, PetscInt *, PetscReal *);
1694 
1695 /*
1696    PETSc interface to MUMPS
1697 */
1698 #ifdef PETSC_HAVE_MUMPS
1699 EXTERN PetscErrorCode PETSCMAT_DLLEXPORT MatMumpsSetIcntl(Mat,PetscInt,PetscInt);
1700 #endif
1701 
1702 PETSC_EXTERN_CXX_END
1703 #endif
1704