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