xref: /petsc/include/petscmat.h (revision 323b833ffd2abbc021b1f705dc98117c2173689c)
1 /* $Id: petscmat.h,v 1.211 2001/01/15 21:45:26 bsmith 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 /*E
13     MatType - String with the name of a PETSc matrix or the creation function
14        with an optional dynamic library name
15 
16    Level: beginner
17 
18 .seealso: MatSetType()
19 E*/
20 #define MATSAME     "same"
21 #define MATSEQMAIJ  "seqmaij"
22 #define MATMPIMAIJ  "mpimaij"
23 #define MATIS       "is"
24 #define MATMPIROWBS "mpirowbs"
25 #define MATSEQDENSE "seqdense"
26 #define MATSEQAIJ   "seqaij"
27 #define MATMPIAIJ   "mpiaij"
28 #define MATSHELL    "shell"
29 #define MATSEQBDIAG "seqbdiag"
30 #define MATMPIBDIAG "mpibdiag"
31 #define MATMPIDENSE "mpidense"
32 #define MATSEQBAIJ  "seqbaij"
33 #define MATMPIBAIJ  "mpibaij"
34 #define MATMPIADJ   "mpiadj"
35 #define MATSEQSBAIJ "seqsbaij"
36 #define MATMPISBAIJ "mpisbaij"
37 typedef char* MatType;
38 
39 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
40 EXTERN int MatSetType(Mat,MatType);
41 EXTERN int MatSetFromOptions(Mat);
42 EXTERN int MatSetUpPreallocation(Mat);
43 EXTERN int MatRegisterAll(char*);
44 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
45 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
46 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
47 #else
48 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
49 #endif
50 extern PetscTruth MatRegisterAllCalled;
51 extern PetscFList      MatList;
52 
53 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
54 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
55 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
56 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
57 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
58 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
59 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
60 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
61 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
62 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
63 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
64 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
65 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
66 
67 EXTERN int MatDestroy(Mat);
68 
69 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
70 EXTERN int MatShellGetContext(Mat,void **);
71 
72 EXTERN int MatPrintHelp(Mat);
73 EXTERN int MatGetMaps(Mat,Map*,Map*);
74 
75 /* ------------------------------------------------------------*/
76 EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
77 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode);
78 
79 /*E
80     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
81      to continue to add values to it
82 
83     Level: beginner
84 
85 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
86 E*/
87 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
88 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
89 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
90 EXTERN int MatAssembled(Mat,PetscTruth*);
91 
92 #define MatSetValue(v,i,j,va,mode) \
93 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
94   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
95 }
96 #define MatGetValue(v,i,j,va) \
97 0; {int _ierr,_row = i,_col = j; \
98   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
99 }
100 #define MatSetValueLocal(v,i,j,va,mode) \
101 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
102   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
103 }
104 /*E
105     MatOption - Options that may be set for a matrix and its behavior or storage
106 
107     Level: beginner
108 
109    Any additions/changes here MUST also be made in include/finclude/petscmat.h
110 
111 .seealso: MatSetOption()
112 E*/
113 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
114               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
115               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
116               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
117               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
118               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
119               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
120               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
121               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
122               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
123               MAT_DO_NOT_USE_INODES=82} MatOption;
124 EXTERN int MatSetOption(Mat,MatOption);
125 EXTERN int MatGetType(Mat,MatType*);
126 
127 EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*);
128 EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**);
129 EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**);
130 EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**);
131 EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
132 EXTERN int MatGetColumnVector(Mat,Vec,int);
133 EXTERN int MatGetArray(Mat,Scalar **);
134 EXTERN int MatRestoreArray(Mat,Scalar **);
135 EXTERN int MatGetBlockSize(Mat,int *);
136 
137 EXTERN int MatMult(Mat,Vec,Vec);
138 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
139 EXTERN int MatMultTranspose(Mat,Vec,Vec);
140 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
141 
142 /*E
143     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
144   its numerical values copied over or just its nonzero structure.
145 
146     Level: beginner
147 
148    Any additions/changes here MUST also be made in include/finclude/petscmat.h
149 
150 .seealso: MatDuplicate()
151 E*/
152 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
153 
154 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
155 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
156 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
157 #else
158 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
159 #endif
160 EXTERN int MatConvertRegisterAll(char*);
161 EXTERN int MatConvertRegisterDestroy(void);
162 extern PetscTruth MatConvertRegisterAllCalled;
163 extern PetscFList      MatConvertList;
164 EXTERN int MatConvert(Mat,MatType,Mat*);
165 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*);
166 
167 /*E
168     MatStructure - Indicates if the matrix has the same nonzero structure
169 
170     Level: beginner
171 
172    Any additions/changes here MUST also be made in include/finclude/petscmat.h
173 
174 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
175 E*/
176 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
177 
178 EXTERN int MatCopy(Mat,Mat,MatStructure);
179 EXTERN int MatView(Mat,PetscViewer);
180 
181 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
182 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
183 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
184 #else
185 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
186 #endif
187 EXTERN int MatLoadRegisterAll(char*);
188 EXTERN int MatLoadRegisterDestroy(void);
189 extern PetscTruth MatLoadRegisterAllCalled;
190 extern PetscFList      MatLoadList;
191 EXTERN int MatLoad(PetscViewer,MatType,Mat*);
192 
193 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
194 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
195 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
196 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
197 
198 /*S
199      MatInfo - Context of matrix information, used with MatGetInfo()
200 
201    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
202 
203    Level: intermediate
204 
205   Concepts: matrix^nonzero information
206 
207 .seealso:  MatGetInfo()
208 S*/
209 typedef struct {
210   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
211   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
212   PetscLogDouble block_size;                         /* block size */
213   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
214   PetscLogDouble memory;                             /* memory allocated */
215   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
216   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
217   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
218   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
219 } MatInfo;
220 
221 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
222 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
223 EXTERN int MatValid(Mat,PetscTruth*);
224 EXTERN int MatGetDiagonal(Mat,Vec);
225 EXTERN int MatGetRowMax(Mat,Vec);
226 EXTERN int MatTranspose(Mat,Mat*);
227 EXTERN int MatPermute(Mat,IS,IS,Mat *);
228 EXTERN int MatDiagonalScale(Mat,Vec,Vec);
229 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
230 EXTERN int MatEqual(Mat,Mat,PetscTruth*);
231 
232 EXTERN int MatNorm(Mat,NormType,double *);
233 EXTERN int MatZeroEntries(Mat);
234 EXTERN int MatZeroRows(Mat,IS,Scalar*);
235 EXTERN int MatZeroColumns(Mat,IS,Scalar*);
236 
237 EXTERN int MatUseScaledForm(Mat,PetscTruth);
238 EXTERN int MatScaleSystem(Mat,Vec,Vec);
239 EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
240 
241 EXTERN int MatGetSize(Mat,int*,int*);
242 EXTERN int MatGetLocalSize(Mat,int*,int*);
243 EXTERN int MatGetOwnershipRange(Mat,int*,int*);
244 
245 /*E
246     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
247      or MatGetSubMatrix() are to be reused to store the new matrix values.
248 
249     Level: beginner
250 
251    Any additions/changes here MUST also be made in include/finclude/petscmat.h
252 
253 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
254 E*/
255 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
256 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
257 EXTERN int MatDestroyMatrices(int,Mat **);
258 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
259 
260 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
261 
262 EXTERN int MatAXPY(Scalar *,Mat,Mat);
263 EXTERN int MatAYPX(Scalar *,Mat,Mat);
264 EXTERN int MatCompress(Mat);
265 
266 EXTERN int MatScale(Scalar *,Mat);
267 EXTERN int MatShift(Scalar *,Mat);
268 
269 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
270 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
271 EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*);
272 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
273 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
274 
275 EXTERN int MatSetStashInitialSize(Mat,int,int);
276 
277 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
278 EXTERN int MatInterpolate(Mat,Vec,Vec);
279 EXTERN int MatRestrict(Mat,Vec,Vec);
280 
281 /*
282       These three (or four) macros MUST be used together. The third one closes the open { of the first one
283 */
284 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
285 { \
286   int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
287   __ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(__ierr);onz = dnz + __tmp;\
288   __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\
289   __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\
290   __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp;
291 
292 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
293 {\
294   int __l;\
295   __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\
296   __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\
297   for (__l=0;__l<nrows;__l++) {\
298     __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\
299   }\
300 }
301 
302 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
303 { int __i; \
304   for (__i=0; __i<nc; __i++) {\
305     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
306   }\
307   dnz[row - __rstart] = nc - onz[row - __rstart];\
308 }
309 
310 #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);}
311 
312 /* Routines unique to particular data structures */
313 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
314 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
315 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
316 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
317 
318 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
319 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
320 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
321 EXTERN int MatSeqDensePreallocation(Mat,Scalar*);
322 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
323 EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*);
324 
325 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
326 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
327 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
328 EXTERN int MatMPIDensePreallocation(Mat,Scalar*);
329 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
330 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
331 EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*);
332 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
333 
334 EXTERN int MatStoreValues(Mat);
335 EXTERN int MatRetrieveValues(Mat);
336 
337 /*
338   These routines are not usually accessed directly, rather solving is
339   done through the SLES, KSP and PC interfaces.
340 */
341 
342 typedef char* MatOrderingType;
343 #define MATORDERING_NATURAL   "natural"
344 #define MATORDERING_ND        "nd"
345 #define MATORDERING_1WD       "1wd"
346 #define MATORDERING_RCM       "rcm"
347 #define MATORDERING_QMD       "qmd"
348 #define MATORDERING_ROWLENGTH "rowlength"
349 #define MATORDERING_DSC_ND    "dsc_nd"
350 #define MATORDERING_DSC_MMD   "dsc_mmd"
351 #define MATORDERING_DSC_MDF   "dsc_mdf"
352 
353 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
354 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
355 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
356 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
357 #else
358 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
359 #endif
360 EXTERN int        MatOrderingRegisterDestroy(void);
361 EXTERN int        MatOrderingRegisterAll(char*);
362 extern PetscTruth MatOrderingRegisterAllCalled;
363 extern PetscFList      MatOrderingList;
364 
365 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
366 
367 EXTERN int MatCholeskyFactor(Mat,IS,double);
368 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
369 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
370 
371 /*S
372    MatILUInfo - Data based into the matrix ILU factorization routines
373 
374    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
375 
376    Notes: These are not usually directly used by users, instead use the PC type of ILU
377           All entries are double precision.
378 
379    Level: developer
380 
381 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
382 
383 S*/
384 typedef struct {
385   double     levels;         /* ILU(levels) */
386   double     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
387   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
388   double     dt;             /* drop tolerance */
389   double     dtcol;          /* tolerance for pivoting */
390   double     dtcount;        /* maximum nonzeros to be allowed per row */
391   double     damping;        /* scaling of identity added to matrix to prevent zero pivots */
392   double     damp;           /* if is 1.0 and factorization fails, damp until successful */
393 } MatILUInfo;
394 
395 /*S
396    MatLUInfo - Data based into the matrix LU factorization routines
397 
398    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
399 
400    Notes: These are not usually directly used by users, instead use the PC type of LU
401           All entries are double precision.
402 
403    Level: developer
404 
405 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
406 
407 S*/
408 typedef struct {
409   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
410   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
411   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
412   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
413 } MatLUInfo;
414 
415 /*S
416    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
417 
418    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
419 
420    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
421           All entries are double precision.
422 
423    Level: developer
424 
425 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
426 
427 S*/
428 typedef struct {
429   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
430   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
431   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
432 } MatCholeskyInfo;
433 
434 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
435 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
436 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
437 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
438 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
439 EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int);
440 EXTERN int MatLUFactorNumeric(Mat,Mat*);
441 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
442 
443 EXTERN int MatSolve(Mat,Vec,Vec);
444 EXTERN int MatForwardSolve(Mat,Vec,Vec);
445 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
446 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
447 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
448 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
449 
450 EXTERN int MatSetUnfactored(Mat);
451 
452 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
453 /*E
454     MatSORType - What type of (S)SOR to perform
455 
456     Level: beginner
457 
458    Any additions/changes here MUST also be made in include/finclude/petscmat.h
459 
460 .seealso: MatRelax()
461 E*/
462 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
463               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
464               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
465               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
466 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
467 
468 /*
469     These routines are for efficiently computing Jacobians via finite differences.
470 */
471 
472 typedef char* MatColoringType;
473 #define MATCOLORING_NATURAL "natural"
474 #define MATCOLORING_SL      "sl"
475 #define MATCOLORING_LF      "lf"
476 #define MATCOLORING_ID      "id"
477 
478 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
479 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
480 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
481 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
482 #else
483 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
484 #endif
485 EXTERN int        MatColoringRegisterAll(char *);
486 extern PetscTruth MatColoringRegisterAllCalled;
487 EXTERN int        MatColoringRegisterDestroy(void);
488 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
489 
490 /*
491     Data structures used to compute Jacobian vector products
492   efficiently using finite differences.
493 */
494 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
495 
496 typedef struct _p_MatFDColoring *MatFDColoring;
497 
498 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
499 EXTERN int MatFDColoringDestroy(MatFDColoring);
500 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
501 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
502 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
503 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
504 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
505 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
506 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
507 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
508 EXTERN int MatFDColoringSetRecompute(MatFDColoring);
509 
510 /*
511     These routines are for partitioning matrices: currently used only
512   for adjacency matrix, MatCreateMPIAdj().
513 */
514 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
515 
516 typedef struct _p_MatPartitioning *MatPartitioning;
517 typedef char* MatPartitioningType;
518 #define MATPARTITIONING_CURRENT  "current"
519 #define MATPARTITIONING_PARMETIS "parmetis"
520 
521 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
522 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
523 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
524 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
525 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
526 EXTERN int MatPartitioningDestroy(MatPartitioning);
527 
528 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
529 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
530 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
531 #else
532 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
533 #endif
534 
535 EXTERN int        MatPartitioningRegisterAll(char *);
536 extern PetscTruth MatPartitioningRegisterAllCalled;
537 EXTERN int        MatPartitioningRegisterDestroy(void);
538 
539 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
540 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
541 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
542 
543 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
544 
545 /*
546     If you add entries here you must also add them to finclude/petscmat.h
547 */
548 typedef enum { MATOP_SET_VALUES=0,
549                MATOP_GET_ROW=1,
550                MATOP_RESTORE_ROW=2,
551                MATOP_MULT=3,
552                MATOP_MULT_ADD=4,
553                MATOP_MULT_TRANSPOSE=5,
554                MATOP_MULT_TRANSPOSE_ADD=6,
555                MATOP_SOLVE=7,
556                MATOP_SOLVE_ADD=8,
557                MATOP_SOLVE_TRANSPOSE=9,
558                MATOP_SOLVE_TRANSPOSE_ADD=10,
559                MATOP_LUFACTOR=11,
560                MATOP_CHOLESKYFACTOR=12,
561                MATOP_RELAX=13,
562                MATOP_TRANSPOSE=14,
563                MATOP_GETINFO=15,
564                MATOP_EQUAL=16,
565                MATOP_GET_DIAGONAL=17,
566                MATOP_DIAGONAL_SCALE=18,
567                MATOP_NORM=19,
568                MATOP_ASSEMBLY_BEGIN=20,
569                MATOP_ASSEMBLY_END=21,
570                MATOP_COMPRESS=22,
571                MATOP_SET_OPTION=23,
572                MATOP_ZERO_ENTRIES=24,
573                MATOP_ZERO_ROWS=25,
574                MATOP_LUFACTOR_SYMBOLIC=26,
575                MATOP_LUFACTOR_NUMERIC=27,
576                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
577                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
578                MATOP_GET_SIZE=30,
579                MATOP_GET_LOCAL_SIZE=31,
580                MATOP_GET_OWNERSHIP_RANGE=32,
581                MATOP_ILUFACTOR_SYMBOLIC=33,
582                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
583                MATOP_GET_ARRAY=35,
584                MATOP_RESTORE_ARRAY=36,
585 
586                MATOP_CONVERT_SAME_TYPE=37,
587                MATOP_FORWARD_SOLVE=38,
588                MATOP_BACKWARD_SOLVE=39,
589                MATOP_ILUFACTOR=40,
590                MATOP_INCOMPLETECHOLESKYFACTOR=41,
591                MATOP_AXPY=42,
592                MATOP_GET_SUBMATRICES=43,
593                MATOP_INCREASE_OVERLAP=44,
594                MATOP_GET_VALUES=45,
595                MATOP_COPY=46,
596                MATOP_PRINT_HELP=47,
597                MATOP_SCALE=48,
598                MATOP_SHIFT=49,
599                MATOP_DIAGONAL_SHIFT=50,
600                MATOP_ILUDT_FACTOR=51,
601                MATOP_GET_BLOCK_SIZE=52,
602                MATOP_GET_ROW_IJ=53,
603                MATOP_RESTORE_ROW_IJ=54,
604                MATOP_GET_COLUMN_IJ=55,
605                MATOP_RESTORE_COLUMN_IJ=56,
606                MATOP_FDCOLORING_CREATE=57,
607                MATOP_COLORING_PATCH=58,
608                MATOP_SET_UNFACTORED=59,
609                MATOP_PERMUTE=60,
610                MATOP_SET_VALUES_BLOCKED=61,
611                MATOP_DESTROY=250,
612                MATOP_VIEW=251
613              } MatOperation;
614 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
615 EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
616 EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
617 EXTERN int MatShellSetContext(Mat,void*);
618 
619 /*
620    Codes for matrices stored on disk. By default they are
621  stored in a universal format. By changing the format with
622  PetscViewerSetFormat(viewer,PETSC_VIEWER_FORMAT_BINARY_NATIVE); the matrices will
623  be stored in a way natural for the matrix, for example dense matrices
624  would be stored as dense. Matrices stored this way may only be
625  read into matrices of the same time.
626 */
627 #define MATRIX_BINARY_FORMAT_DENSE -1
628 
629 /*
630      New matrix classes not yet distributed
631 */
632 /*
633     MatAIJIndices is a data structure for storing the nonzero location information
634   for sparse matrices. Several matrices with identical nonzero structure can share
635   the same MatAIJIndices.
636 */
637 typedef struct _p_MatAIJIndices* MatAIJIndices;
638 
639 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
640 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
641 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
642 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
643 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
644 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
645 EXTERN int MatShiftAIJIndices(MatAIJIndices);
646 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
647 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
648 
649 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
650 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
651 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
652 
653 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
654 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
655 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
656 
657 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
658 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
659 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
660 
661 typedef struct _p_MatNullSpace* MatNullSpace;
662 #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
663 
664 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
665 EXTERN int MatNullSpaceDestroy(MatNullSpace);
666 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
667 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
668 EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
669 
670 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
671 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
672 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
673 
674 
675 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
676 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
677 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
678 
679 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
680 
681 EXTERN int MatComputeExplicitOperator(Mat,Mat*);
682 
683 #endif
684 
685 
686 
687