xref: /petsc/include/petscmat.h (revision ca44d042d6f86ecc01fa7a52a5213a5161f95f53)
1 /* $Id: petscmat.h,v 1.190 2000/05/08 15:09:50 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} 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 MatDiagonalShift(Mat,Vec);
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    Note: If any entries are added to this context, be sure
250          to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h
251 
252    Note: The integer values below are passed in double to allow easy use from
253          Fortran
254  */
255 typedef struct {
256   double     levels;  /* ILU(levels) */
257   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
258   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
259 
260   double     dt;             /* drop tolerance */
261   double     dtcol;          /* tolerance for pivoting */
262   double     dtcount;        /* maximum nonzeros to be allowed per row */
263 } MatILUInfo;
264 
265 EXTERN int MatLUFactor(Mat,IS,IS,double);
266 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
267 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*);
268 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
269 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
270 EXTERN int MatLUFactorNumeric(Mat,Mat*);
271 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
272 
273 EXTERN int MatSolve(Mat,Vec,Vec);
274 EXTERN int MatForwardSolve(Mat,Vec,Vec);
275 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
276 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
277 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
278 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
279 
280 EXTERN int MatSetUnfactored(Mat);
281 
282 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
283 
284 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
285               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
286               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
287               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
288 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
289 
290 /*
291     These routines are for efficiently computing Jacobians via finite differences.
292 */
293 
294 typedef char* MatColoringType;
295 #define MATCOLORING_NATURAL "natural"
296 #define MATCOLORING_SL      "sl"
297 #define MATCOLORING_LF      "lf"
298 #define MATCOLORING_ID      "id"
299 
300 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
301 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
302 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
303 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
304 #else
305 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
306 #endif
307 EXTERN int        MatColoringRegisterAll(char *);
308 extern PetscTruth MatColoringRegisterAllCalled;
309 EXTERN int        MatColoringRegisterDestroy(void);
310 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
311 
312 /*
313     Data structures used to compute Jacobian vector products
314   efficiently using finite differences.
315 */
316 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
317 
318 typedef struct _p_MatFDColoring *MatFDColoring;
319 
320 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
321 EXTERN int MatFDColoringDestroy(MatFDColoring);
322 EXTERN int MatFDColoringView(MatFDColoring,Viewer);
323 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
324 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
325 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
326 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
327 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
328 EXTERN int MatFDColoringPrintHelp(MatFDColoring);
329 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
330 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
331 
332 /*
333     These routines are for partitioning matrices: currently used only
334   for adjacency matrix, MatCreateMPIAdj().
335 */
336 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
337 
338 typedef struct _p_MatPartitioning *MatPartitioning;
339 typedef char* MatPartitioningType;
340 #define MATPARTITIONING_CURRENT  "current"
341 #define MATPARTITIONING_PARMETIS "parmetis"
342 
343 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
344 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
345 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
346 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
347 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
348 EXTERN int MatPartitioningDestroy(MatPartitioning);
349 
350 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
351 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
352 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
353 #else
354 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
355 #endif
356 
357 EXTERN int        MatPartitioningRegisterAll(char *);
358 extern PetscTruth MatPartitioningRegisterAllCalled;
359 EXTERN int        MatPartitioningRegisterDestroy(void);
360 
361 EXTERN int MatPartitioningView(MatPartitioning,Viewer);
362 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
363 EXTERN int MatPartitioningPrintHelp(MatPartitioning);
364 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
365 
366 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
367 
368 /*
369     If you add entries here you must also add them to finclude/petscmat.h
370 */
371 typedef enum { MATOP_SET_VALUES=0,
372                MATOP_GET_ROW=1,
373                MATOP_RESTORE_ROW=2,
374                MATOP_MULT=3,
375                MATOP_MULT_ADD=4,
376                MATOP_MULT_TRANSPOSE=5,
377                MATOP_MULT_TRANSPOSE_ADD=6,
378                MATOP_SOLVE=7,
379                MATOP_SOLVE_ADD=8,
380                MATOP_SOLVE_TRANSPOSE=9,
381                MATOP_SOLVE_TRANSPOSE_ADD=10,
382                MATOP_LUFACTOR=11,
383                MATOP_CHOLESKYFACTOR=12,
384                MATOP_RELAX=13,
385                MATOP_TRANSPOSE=14,
386                MATOP_GETINFO=15,
387                MATOP_EQUAL=16,
388                MATOP_GET_DIAGONAL=17,
389                MATOP_DIAGONAL_SCALE=18,
390                MATOP_NORM=19,
391                MATOP_ASSEMBLY_BEGIN=20,
392                MATOP_ASSEMBLY_END=21,
393                MATOP_COMPRESS=22,
394                MATOP_SET_OPTION=23,
395                MATOP_ZERO_ENTRIES=24,
396                MATOP_ZERO_ROWS=25,
397                MATOP_LUFACTOR_SYMBOLIC=26,
398                MATOP_LUFACTOR_NUMERIC=27,
399                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
400                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
401                MATOP_GET_SIZE=30,
402                MATOP_GET_LOCAL_SIZE=31,
403                MATOP_GET_OWNERSHIP_RANGE=32,
404                MATOP_ILUFACTOR_SYMBOLIC=33,
405                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
406                MATOP_GET_ARRAY=35,
407                MATOP_RESTORE_ARRAY=36,
408 
409                MATOP_CONVERT_SAME_TYPE=37,
410                MATOP_FORWARD_SOLVE=38,
411                MATOP_BACKWARD_SOLVE=39,
412                MATOP_ILUFACTOR=40,
413                MATOP_INCOMPLETECHOLESKYFACTOR=41,
414                MATOP_AXPY=42,
415                MATOP_GET_SUBMATRICES=43,
416                MATOP_INCREASE_OVERLAP=44,
417                MATOP_GET_VALUES=45,
418                MATOP_COPY=46,
419                MATOP_PRINT_HELP=47,
420                MATOP_SCALE=48,
421                MATOP_SHIFT=49,
422                MATOP_DIAGONAL_SHIFT=50,
423                MATOP_ILUDT_FACTOR=51,
424                MATOP_GET_BLOCK_SIZE=52,
425                MATOP_GET_ROW_IJ=53,
426                MATOP_RESTORE_ROW_IJ=54,
427                MATOP_GET_COLUMN_IJ=55,
428                MATOP_RESTORE_COLUMN_IJ=56,
429                MATOP_FDCOLORING_CREATE=57,
430                MATOP_COLORING_PATCH=58,
431                MATOP_SET_UNFACTORED=59,
432                MATOP_PERMUTE=60,
433                MATOP_SET_VALUES_BLOCKED=61,
434                MATOP_DESTROY=250,
435                MATOP_VIEW=251
436              } MatOperation;
437 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
438 EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
439 EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
440 
441 /*
442    Codes for matrices stored on disk. By default they are
443  stored in a universal format. By changing the format with
444  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
445  be stored in a way natural for the matrix, for example dense matrices
446  would be stored as dense. Matrices stored this way may only be
447  read into matrices of the same time.
448 */
449 #define MATRIX_BINARY_FORMAT_DENSE -1
450 
451 /*
452      New matrix classes not yet distributed
453 */
454 /*
455     MatAIJIndices is a data structure for storing the nonzero location information
456   for sparse matrices. Several matrices with identical nonzero structure can share
457   the same MatAIJIndices.
458 */
459 typedef struct _p_MatAIJIndices* MatAIJIndices;
460 
461 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
462 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
463 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
464 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
465 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
466 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
467 EXTERN int MatShiftAIJIndices(MatAIJIndices);
468 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
469 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
470 
471 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
472 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
473 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
474 
475 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
476 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
477 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
478 
479 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double);
480 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
481 
482 
483 #endif
484 
485 
486 
487