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