xref: /petsc/include/petscmat.h (revision c4f061fb6633e7c656f2cf8c5dc94ffee4bba6ce)
1 /* $Id: petscmat.h,v 1.198 2000/06/01 22:26:28 bsmith 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*,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 (or four) macros MUST be used together. The third one closes the open { of the first one
189 */
190 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
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 MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
199 {\
200   int __l;\
201   __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\
202   __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\
203   for (__l=0;__l<nrows;__l++) {\
204     __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\
205   }\
206 }
207 
208 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
209 { int __i; \
210   for (__i=0; __i<nc; __i++) {\
211     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
212   }\
213   dnz[row - __rstart] = nc - onz[row - __rstart];\
214 }
215 
216 #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);}
217 
218 /* Routines unique to particular data structures */
219 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
220 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
221 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
222 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
223 
224 EXTERN int MatStoreValues(Mat);
225 EXTERN int MatRetrieveValues(Mat);
226 
227 /*
228   These routines are not usually accessed directly, rather solving is
229   done through the SLES, KSP and PC interfaces.
230 */
231 
232 typedef char* MatOrderingType;
233 #define MATORDERING_NATURAL   "natural"
234 #define MATORDERING_ND        "nd"
235 #define MATORDERING_1WD       "1wd"
236 #define MATORDERING_RCM       "rcm"
237 #define MATORDERING_QMD       "qmd"
238 #define MATORDERING_ROWLENGTH "rowlength"
239 
240 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
241 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
242 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
243 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
244 #else
245 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
246 #endif
247 EXTERN int        MatOrderingRegisterDestroy(void);
248 EXTERN int        MatOrderingRegisterAll(char*);
249 extern PetscTruth MatOrderingRegisterAllCalled;
250 
251 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
252 
253 EXTERN int MatCholeskyFactor(Mat,IS,double);
254 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
255 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
256 
257 /*
258    Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic()
259    of MatLUFactor() and MatLUFactorSymbolic()
260 
261    Note: If any entries are added to this context, be sure
262          to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h and/or
263          to adjust MAT_LUINFO_SIZE  in finclude/petscmat.h
264 
265    Note: The integer values below are passed in double to allow easy use from Fortran
266  */
267 typedef struct {
268   double     levels;  /* ILU(levels) */
269   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
270   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
271 
272   double     dt;             /* drop tolerance */
273   double     dtcol;          /* tolerance for pivoting */
274   double     dtcount;        /* maximum nonzeros to be allowed per row */
275   PetscTruth damp;    /* if factorization fails, damp until successful */
276   double     damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */
277 } MatILUInfo;
278 
279 typedef struct {
280   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
281   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
282   PetscTruth damp;    /* if factorization fails, damp until successful */
283   double     damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */
284 } MatLUInfo;
285 
286 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
287 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
288 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
289 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
290 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
291 EXTERN int MatLUFactorNumeric(Mat,Mat*);
292 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
293 
294 EXTERN int MatSolve(Mat,Vec,Vec);
295 EXTERN int MatForwardSolve(Mat,Vec,Vec);
296 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
297 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
298 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
299 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
300 
301 EXTERN int MatSetUnfactored(Mat);
302 
303 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
304 
305 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
306               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
307               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
308               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
309 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
310 
311 /*
312     These routines are for efficiently computing Jacobians via finite differences.
313 */
314 
315 typedef char* MatColoringType;
316 #define MATCOLORING_NATURAL "natural"
317 #define MATCOLORING_SL      "sl"
318 #define MATCOLORING_LF      "lf"
319 #define MATCOLORING_ID      "id"
320 
321 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
322 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
323 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
324 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
325 #else
326 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
327 #endif
328 EXTERN int        MatColoringRegisterAll(char *);
329 extern PetscTruth MatColoringRegisterAllCalled;
330 EXTERN int        MatColoringRegisterDestroy(void);
331 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
332 
333 /*
334     Data structures used to compute Jacobian vector products
335   efficiently using finite differences.
336 */
337 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
338 
339 typedef struct _p_MatFDColoring *MatFDColoring;
340 
341 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
342 EXTERN int MatFDColoringDestroy(MatFDColoring);
343 EXTERN int MatFDColoringView(MatFDColoring,Viewer);
344 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
345 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
346 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
347 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
348 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
349 EXTERN int MatFDColoringPrintHelp(MatFDColoring);
350 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
351 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
352 
353 /*
354     These routines are for partitioning matrices: currently used only
355   for adjacency matrix, MatCreateMPIAdj().
356 */
357 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
358 
359 typedef struct _p_MatPartitioning *MatPartitioning;
360 typedef char* MatPartitioningType;
361 #define MATPARTITIONING_CURRENT  "current"
362 #define MATPARTITIONING_PARMETIS "parmetis"
363 
364 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
365 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
366 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
367 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
368 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
369 EXTERN int MatPartitioningDestroy(MatPartitioning);
370 
371 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
372 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
373 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
374 #else
375 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
376 #endif
377 
378 EXTERN int        MatPartitioningRegisterAll(char *);
379 extern PetscTruth MatPartitioningRegisterAllCalled;
380 EXTERN int        MatPartitioningRegisterDestroy(void);
381 
382 EXTERN int MatPartitioningView(MatPartitioning,Viewer);
383 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
384 EXTERN int MatPartitioningPrintHelp(MatPartitioning);
385 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
386 
387 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
388 
389 /*
390     If you add entries here you must also add them to finclude/petscmat.h
391 */
392 typedef enum { MATOP_SET_VALUES=0,
393                MATOP_GET_ROW=1,
394                MATOP_RESTORE_ROW=2,
395                MATOP_MULT=3,
396                MATOP_MULT_ADD=4,
397                MATOP_MULT_TRANSPOSE=5,
398                MATOP_MULT_TRANSPOSE_ADD=6,
399                MATOP_SOLVE=7,
400                MATOP_SOLVE_ADD=8,
401                MATOP_SOLVE_TRANSPOSE=9,
402                MATOP_SOLVE_TRANSPOSE_ADD=10,
403                MATOP_LUFACTOR=11,
404                MATOP_CHOLESKYFACTOR=12,
405                MATOP_RELAX=13,
406                MATOP_TRANSPOSE=14,
407                MATOP_GETINFO=15,
408                MATOP_EQUAL=16,
409                MATOP_GET_DIAGONAL=17,
410                MATOP_DIAGONAL_SCALE=18,
411                MATOP_NORM=19,
412                MATOP_ASSEMBLY_BEGIN=20,
413                MATOP_ASSEMBLY_END=21,
414                MATOP_COMPRESS=22,
415                MATOP_SET_OPTION=23,
416                MATOP_ZERO_ENTRIES=24,
417                MATOP_ZERO_ROWS=25,
418                MATOP_LUFACTOR_SYMBOLIC=26,
419                MATOP_LUFACTOR_NUMERIC=27,
420                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
421                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
422                MATOP_GET_SIZE=30,
423                MATOP_GET_LOCAL_SIZE=31,
424                MATOP_GET_OWNERSHIP_RANGE=32,
425                MATOP_ILUFACTOR_SYMBOLIC=33,
426                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
427                MATOP_GET_ARRAY=35,
428                MATOP_RESTORE_ARRAY=36,
429 
430                MATOP_CONVERT_SAME_TYPE=37,
431                MATOP_FORWARD_SOLVE=38,
432                MATOP_BACKWARD_SOLVE=39,
433                MATOP_ILUFACTOR=40,
434                MATOP_INCOMPLETECHOLESKYFACTOR=41,
435                MATOP_AXPY=42,
436                MATOP_GET_SUBMATRICES=43,
437                MATOP_INCREASE_OVERLAP=44,
438                MATOP_GET_VALUES=45,
439                MATOP_COPY=46,
440                MATOP_PRINT_HELP=47,
441                MATOP_SCALE=48,
442                MATOP_SHIFT=49,
443                MATOP_DIAGONAL_SHIFT=50,
444                MATOP_ILUDT_FACTOR=51,
445                MATOP_GET_BLOCK_SIZE=52,
446                MATOP_GET_ROW_IJ=53,
447                MATOP_RESTORE_ROW_IJ=54,
448                MATOP_GET_COLUMN_IJ=55,
449                MATOP_RESTORE_COLUMN_IJ=56,
450                MATOP_FDCOLORING_CREATE=57,
451                MATOP_COLORING_PATCH=58,
452                MATOP_SET_UNFACTORED=59,
453                MATOP_PERMUTE=60,
454                MATOP_SET_VALUES_BLOCKED=61,
455                MATOP_DESTROY=250,
456                MATOP_VIEW=251
457              } MatOperation;
458 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
459 EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
460 EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
461 
462 /*
463    Codes for matrices stored on disk. By default they are
464  stored in a universal format. By changing the format with
465  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
466  be stored in a way natural for the matrix, for example dense matrices
467  would be stored as dense. Matrices stored this way may only be
468  read into matrices of the same time.
469 */
470 #define MATRIX_BINARY_FORMAT_DENSE -1
471 
472 /*
473      New matrix classes not yet distributed
474 */
475 /*
476     MatAIJIndices is a data structure for storing the nonzero location information
477   for sparse matrices. Several matrices with identical nonzero structure can share
478   the same MatAIJIndices.
479 */
480 typedef struct _p_MatAIJIndices* MatAIJIndices;
481 
482 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
483 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
484 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
485 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
486 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
487 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
488 EXTERN int MatShiftAIJIndices(MatAIJIndices);
489 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
490 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
491 
492 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
493 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
494 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
495 
496 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
497 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
498 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
499 
500 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double);
501 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
502 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
503 
504 typedef char* MATType;
505 EXTERN int MATCreate(MPI_Comm,int,int,int,int,Mat*);
506 EXTERN int MatSetType(Mat,MATType);
507 EXTERN int MatRegisterAll(char*);
508 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
509 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
510 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
511 #else
512 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
513 #endif
514 
515 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
516 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
517 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
518 
519 EXTERN int MatSetTypeFromOptions(Mat);
520 
521 #define MATSEQMAIJ "seqmaij"
522 #define MATMPIMAIJ "mpimaij"
523 #define MATNN   "nn"
524 #endif
525 
526 
527 
528