xref: /petsc/include/petscmat.h (revision aa370698b2a7d57bb11a7c88b6438736b4e2bc5c)
1 /* $Id: petscmat.h,v 1.197 2000/05/26 18:05:09 balay Exp bsmith $ */
2 /*
3      Include file for the matrix component of PETSc
4 */
5 #ifndef __PETSCMAT_H
6 #define __PETSCMAT_H
7 #include "petscvec.h"
8 
9 #define MAT_COOKIE         PETSC_COOKIE+5
10 
11 typedef struct _p_Mat*           Mat;
12 
13 #define MAX_MATRIX_TYPES 14
14 /*
15    The default matrix data storage formats and routines to create them.
16 
17    MATLASTTYPE is "end-of-list" marker that can be used to check that
18    MAX_MATRIX_TYPES is large enough.  The rule is
19    MAX_MATRIX_TYPES >= MATLASTTYPE .
20 
21    To do: add a test program that checks the consistency of these values.
22 */
23 typedef enum { MATSAME=-1,  MATSEQDENSE, MATSEQAIJ,   MATMPIAIJ,   MATSHELL,
24                MATMPIROWBS, MATSEQBDIAG, MATMPIBDIAG, MATMPIDENSE, MATSEQBAIJ,
25                MATMPIBAIJ,  MATMPICSN,   MATSEQCSN,   MATMPIADJ, MATSEQSBAIJ,
26                MATMPISBAIJ, MATLASTTYPE } MatType;
27 
28 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
29 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
30 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
31 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
32 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
33 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,Mat*);
34 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
35 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
36 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
37 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
38 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
39 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
40 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
41 
42 
43 EXTERN int MatDestroy(Mat);
44 
45 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
46 EXTERN int MatShellGetContext(Mat,void **);
47 
48 EXTERN int MatPrintHelp(Mat);
49 EXTERN int MatGetMaps(Mat,Map*,Map*);
50 
51 /* ------------------------------------------------------------*/
52 EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
53 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode);
54 
55 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
56 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
57 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
58 EXTERN int MatAssembled(Mat,PetscTruth*);
59 
60 #define MatSetValue(v,i,j,va,mode) \
61 {int _ierr,_row = i,_col = j; Scalar _va = va; \
62   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
63 }
64 #define MatGetValue(v,i,j,va) \
65 {int _ierr,_row = i,_col = j; \
66   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
67 }
68 /*
69    Any additions/changes here MUST also be made in include/finclude/petscmat.h
70 */
71 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
72               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
73               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
74               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
75               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
76               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
77               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
78               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
79               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
80               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
81               MAT_DO_NOT_USE_INODES=82} MatOption;
82 EXTERN int MatSetOption(Mat,MatOption);
83 EXTERN int MatGetType(Mat,MatType*,char**);
84 EXTERN int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,PetscTruth*);
85 
86 EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*);
87 EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**);
88 EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**);
89 EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**);
90 EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
91 EXTERN int MatGetColumnVector(Mat,Vec,int);
92 EXTERN int MatGetArray(Mat,Scalar **);
93 EXTERN int MatRestoreArray(Mat,Scalar **);
94 EXTERN int MatGetBlockSize(Mat,int *);
95 
96 EXTERN int MatMult(Mat,Vec,Vec);
97 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
98 EXTERN int MatMultTranspose(Mat,Vec,Vec);
99 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
100 
101 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
102 
103 EXTERN int MatConvert(Mat,MatType,Mat*);
104 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*);
105 EXTERN int MatConvertRegister(MatType,MatType,int (*)(Mat,MatType,Mat*));
106 EXTERN int MatConvertRegisterAll(void);
107 
108 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
109 
110 EXTERN int MatCopy(Mat,Mat,MatStructure);
111 EXTERN int MatView(Mat,Viewer);
112 EXTERN int MatLoad(Viewer,MatType,Mat*);
113 EXTERN int MatLoadRegister(MatType,int (*)(Viewer,MatType,Mat*));
114 EXTERN int MatLoadRegisterAll(void);
115 
116 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
117 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
118 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
119 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
120 
121 /*
122    Context of matrix information, used with MatGetInfo()
123    Note: If any entries are added to this context, be sure
124          to adjust MAT_INFO_SIZE in finclude/petscmat.h
125  */
126 typedef struct {
127   PLogDouble rows_global,columns_global;         /* number of global rows and columns */
128   PLogDouble rows_local,columns_local;           /* number of local rows and columns */
129   PLogDouble block_size;                          /* block size */
130   PLogDouble nz_allocated,nz_used,nz_unneeded;  /* number of nonzeros */
131   PLogDouble memory;                              /* memory allocated */
132   PLogDouble assemblies;                          /* number of matrix assemblies */
133   PLogDouble mallocs;                             /* number of mallocs during MatSetValues() */
134   PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
135   PLogDouble factor_mallocs;                      /* number of mallocs during factorization */
136 } MatInfo;
137 
138 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
139 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
140 EXTERN int MatValid(Mat,PetscTruth*);
141 EXTERN int MatGetDiagonal(Mat,Vec);
142 EXTERN int MatTranspose(Mat,Mat*);
143 EXTERN int MatPermute(Mat,IS,IS,Mat *);
144 EXTERN int MatDiagonalScale(Mat,Vec,Vec);
145 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
146 EXTERN int MatEqual(Mat,Mat,PetscTruth*);
147 
148 EXTERN int MatNorm(Mat,NormType,double *);
149 EXTERN int MatZeroEntries(Mat);
150 EXTERN int MatZeroRows(Mat,IS,Scalar*);
151 EXTERN int MatZeroColumns(Mat,IS,Scalar*);
152 
153 EXTERN int MatUseScaledForm(Mat,PetscTruth);
154 EXTERN int MatScaleSystem(Mat,Vec,Vec);
155 EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
156 
157 EXTERN int MatGetSize(Mat,int*,int*);
158 EXTERN int MatGetLocalSize(Mat,int*,int*);
159 EXTERN int MatGetOwnershipRange(Mat,int*,int*);
160 
161 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
162 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
163 EXTERN int MatDestroyMatrices(int,Mat **);
164 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
165 
166 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
167 
168 EXTERN int MatAXPY(Scalar *,Mat,Mat);
169 EXTERN int MatAYPX(Scalar *,Mat,Mat);
170 EXTERN int MatCompress(Mat);
171 
172 EXTERN int MatScale(Scalar *,Mat);
173 EXTERN int MatShift(Scalar *,Mat);
174 
175 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
176 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
177 EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*);
178 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
179 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
180 
181 EXTERN int MatSetStashInitialSize(Mat,int,int);
182 
183 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
184 EXTERN int MatInterpolate(Mat,Vec,Vec);
185 EXTERN int MatRestrict(Mat,Vec,Vec);
186 
187 /*
188       These three macros MUST be used together. The third one closes the open { of the first one
189 */
190 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) \
191 { \
192   int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
193   dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);onz = dnz + __tmp;\
194   __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\
195   __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\
196   __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp;
197 
198 #define MatPreallocateSet(row,nc,cols,dnz,onz)\
199 { int __i; \
200   for (__i=0; __i<nc; __i++) {\
201     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
202   }\
203   dnz[row - __rstart] = nc - onz[row - __rstart];\
204 }
205 
206 #define MatPreallocateFinalize(dnz,onz) __ierr = PetscFree(dnz);CHKERRQ(__ierr);}
207 
208 /* Routines unique to particular data structures */
209 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
210 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
211 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
212 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
213 
214 EXTERN int MatStoreValues(Mat);
215 EXTERN int MatRetrieveValues(Mat);
216 
217 /*
218   These routines are not usually accessed directly, rather solving is
219   done through the SLES, KSP and PC interfaces.
220 */
221 
222 typedef char* MatOrderingType;
223 #define MATORDERING_NATURAL   "natural"
224 #define MATORDERING_ND        "nd"
225 #define MATORDERING_1WD       "1wd"
226 #define MATORDERING_RCM       "rcm"
227 #define MATORDERING_QMD       "qmd"
228 #define MATORDERING_ROWLENGTH "rowlength"
229 
230 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
231 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
232 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
233 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
234 #else
235 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
236 #endif
237 EXTERN int        MatOrderingRegisterDestroy(void);
238 EXTERN int        MatOrderingRegisterAll(char*);
239 extern PetscTruth MatOrderingRegisterAllCalled;
240 
241 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
242 
243 EXTERN int MatCholeskyFactor(Mat,IS,double);
244 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
245 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
246 
247 /*
248    Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic()
249    of MatLUFactor() and MatLUFactorSymbolic()
250 
251    Note: If any entries are added to this context, be sure
252          to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h and/or
253          to adjust MAT_LUINFO_SIZE  in finclude/petscmat.h
254 
255    Note: The integer values below are passed in double to allow easy use from Fortran
256  */
257 typedef struct {
258   double     levels;  /* ILU(levels) */
259   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
260   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
261 
262   double     dt;             /* drop tolerance */
263   double     dtcol;          /* tolerance for pivoting */
264   double     dtcount;        /* maximum nonzeros to be allowed per row */
265 } MatILUInfo;
266 
267 typedef struct {
268   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
269   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
270 } MatLUInfo;
271 
272 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
273 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
274 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
275 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
276 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
277 EXTERN int MatLUFactorNumeric(Mat,Mat*);
278 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
279 
280 EXTERN int MatSolve(Mat,Vec,Vec);
281 EXTERN int MatForwardSolve(Mat,Vec,Vec);
282 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
283 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
284 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
285 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
286 
287 EXTERN int MatSetUnfactored(Mat);
288 
289 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
290 
291 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
292               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
293               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
294               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
295 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
296 
297 /*
298     These routines are for efficiently computing Jacobians via finite differences.
299 */
300 
301 typedef char* MatColoringType;
302 #define MATCOLORING_NATURAL "natural"
303 #define MATCOLORING_SL      "sl"
304 #define MATCOLORING_LF      "lf"
305 #define MATCOLORING_ID      "id"
306 
307 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
308 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
309 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
310 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
311 #else
312 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
313 #endif
314 EXTERN int        MatColoringRegisterAll(char *);
315 extern PetscTruth MatColoringRegisterAllCalled;
316 EXTERN int        MatColoringRegisterDestroy(void);
317 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
318 
319 /*
320     Data structures used to compute Jacobian vector products
321   efficiently using finite differences.
322 */
323 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
324 
325 typedef struct _p_MatFDColoring *MatFDColoring;
326 
327 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
328 EXTERN int MatFDColoringDestroy(MatFDColoring);
329 EXTERN int MatFDColoringView(MatFDColoring,Viewer);
330 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
331 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
332 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
333 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
334 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
335 EXTERN int MatFDColoringPrintHelp(MatFDColoring);
336 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
337 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
338 
339 /*
340     These routines are for partitioning matrices: currently used only
341   for adjacency matrix, MatCreateMPIAdj().
342 */
343 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
344 
345 typedef struct _p_MatPartitioning *MatPartitioning;
346 typedef char* MatPartitioningType;
347 #define MATPARTITIONING_CURRENT  "current"
348 #define MATPARTITIONING_PARMETIS "parmetis"
349 
350 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
351 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
352 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
353 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
354 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
355 EXTERN int MatPartitioningDestroy(MatPartitioning);
356 
357 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
358 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
359 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
360 #else
361 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
362 #endif
363 
364 EXTERN int        MatPartitioningRegisterAll(char *);
365 extern PetscTruth MatPartitioningRegisterAllCalled;
366 EXTERN int        MatPartitioningRegisterDestroy(void);
367 
368 EXTERN int MatPartitioningView(MatPartitioning,Viewer);
369 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
370 EXTERN int MatPartitioningPrintHelp(MatPartitioning);
371 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
372 
373 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
374 
375 /*
376     If you add entries here you must also add them to finclude/petscmat.h
377 */
378 typedef enum { MATOP_SET_VALUES=0,
379                MATOP_GET_ROW=1,
380                MATOP_RESTORE_ROW=2,
381                MATOP_MULT=3,
382                MATOP_MULT_ADD=4,
383                MATOP_MULT_TRANSPOSE=5,
384                MATOP_MULT_TRANSPOSE_ADD=6,
385                MATOP_SOLVE=7,
386                MATOP_SOLVE_ADD=8,
387                MATOP_SOLVE_TRANSPOSE=9,
388                MATOP_SOLVE_TRANSPOSE_ADD=10,
389                MATOP_LUFACTOR=11,
390                MATOP_CHOLESKYFACTOR=12,
391                MATOP_RELAX=13,
392                MATOP_TRANSPOSE=14,
393                MATOP_GETINFO=15,
394                MATOP_EQUAL=16,
395                MATOP_GET_DIAGONAL=17,
396                MATOP_DIAGONAL_SCALE=18,
397                MATOP_NORM=19,
398                MATOP_ASSEMBLY_BEGIN=20,
399                MATOP_ASSEMBLY_END=21,
400                MATOP_COMPRESS=22,
401                MATOP_SET_OPTION=23,
402                MATOP_ZERO_ENTRIES=24,
403                MATOP_ZERO_ROWS=25,
404                MATOP_LUFACTOR_SYMBOLIC=26,
405                MATOP_LUFACTOR_NUMERIC=27,
406                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
407                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
408                MATOP_GET_SIZE=30,
409                MATOP_GET_LOCAL_SIZE=31,
410                MATOP_GET_OWNERSHIP_RANGE=32,
411                MATOP_ILUFACTOR_SYMBOLIC=33,
412                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
413                MATOP_GET_ARRAY=35,
414                MATOP_RESTORE_ARRAY=36,
415 
416                MATOP_CONVERT_SAME_TYPE=37,
417                MATOP_FORWARD_SOLVE=38,
418                MATOP_BACKWARD_SOLVE=39,
419                MATOP_ILUFACTOR=40,
420                MATOP_INCOMPLETECHOLESKYFACTOR=41,
421                MATOP_AXPY=42,
422                MATOP_GET_SUBMATRICES=43,
423                MATOP_INCREASE_OVERLAP=44,
424                MATOP_GET_VALUES=45,
425                MATOP_COPY=46,
426                MATOP_PRINT_HELP=47,
427                MATOP_SCALE=48,
428                MATOP_SHIFT=49,
429                MATOP_DIAGONAL_SHIFT=50,
430                MATOP_ILUDT_FACTOR=51,
431                MATOP_GET_BLOCK_SIZE=52,
432                MATOP_GET_ROW_IJ=53,
433                MATOP_RESTORE_ROW_IJ=54,
434                MATOP_GET_COLUMN_IJ=55,
435                MATOP_RESTORE_COLUMN_IJ=56,
436                MATOP_FDCOLORING_CREATE=57,
437                MATOP_COLORING_PATCH=58,
438                MATOP_SET_UNFACTORED=59,
439                MATOP_PERMUTE=60,
440                MATOP_SET_VALUES_BLOCKED=61,
441                MATOP_DESTROY=250,
442                MATOP_VIEW=251
443              } MatOperation;
444 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
445 EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
446 EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
447 
448 /*
449    Codes for matrices stored on disk. By default they are
450  stored in a universal format. By changing the format with
451  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
452  be stored in a way natural for the matrix, for example dense matrices
453  would be stored as dense. Matrices stored this way may only be
454  read into matrices of the same time.
455 */
456 #define MATRIX_BINARY_FORMAT_DENSE -1
457 
458 /*
459      New matrix classes not yet distributed
460 */
461 /*
462     MatAIJIndices is a data structure for storing the nonzero location information
463   for sparse matrices. Several matrices with identical nonzero structure can share
464   the same MatAIJIndices.
465 */
466 typedef struct _p_MatAIJIndices* MatAIJIndices;
467 
468 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
469 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
470 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
471 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
472 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
473 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
474 EXTERN int MatShiftAIJIndices(MatAIJIndices);
475 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
476 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
477 
478 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
479 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
480 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
481 
482 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
483 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
484 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
485 
486 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double);
487 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
488 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
489 
490 typedef char* MATType;
491 EXTERN int MATCreate(MPI_Comm,int,int,int,int,Mat*);
492 EXTERN int MatSetType(Mat,MATType);
493 EXTERN int MatRegisterAll(char*);
494 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
495 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
496 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
497 #else
498 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
499 #endif
500 
501 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
502 EXTERN int MatSetTypeFromOptions(Mat);
503 
504 #define MATMAIJ "maij"
505 #endif
506 
507 
508 
509