xref: /petsc/include/petscmat.h (revision 895147d2f268e2f35cdbefae1953318f3b79da40)
1 /* $Id: petscmat.h,v 1.208 2000/10/24 20:28:06 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 /*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 FList      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 FList      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,Viewer);
180 
181 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(Viewer,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 FList      MatLoadList;
191 EXTERN int MatLoad(Viewer,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   PLogDouble rows_global,columns_global;         /* number of global rows and columns */
211   PLogDouble rows_local,columns_local;           /* number of local rows and columns */
212   PLogDouble block_size;                         /* block size */
213   PLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
214   PLogDouble memory;                             /* memory allocated */
215   PLogDouble assemblies;                         /* number of matrix assemblies called */
216   PLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
217   PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
218   PLogDouble 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   dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);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 
350 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
351 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
352 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
353 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
354 #else
355 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
356 #endif
357 EXTERN int        MatOrderingRegisterDestroy(void);
358 EXTERN int        MatOrderingRegisterAll(char*);
359 extern PetscTruth MatOrderingRegisterAllCalled;
360 extern FList      MatOrderingList;
361 
362 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
363 
364 EXTERN int MatCholeskyFactor(Mat,IS,double);
365 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
366 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
367 
368 /*S
369    MatILUInfo - Data based into the matrix ILU factorization routines
370 
371    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
372 
373    Notes: These are not usually directly used by users, instead use the PC type of ILU
374           All entries are double precision.
375 
376    Level: developer
377 
378 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
379 
380 S*/
381 typedef struct {
382   double     levels;         /* ILU(levels) */
383   double     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
384   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
385   double     dt;             /* drop tolerance */
386   double     dtcol;          /* tolerance for pivoting */
387   double     dtcount;        /* maximum nonzeros to be allowed per row */
388   double     damping;        /* scaling of identity added to matrix to prevent zero pivots */
389   double     damp;           /* if is 1.0 and factorization fails, damp until successful */
390 } MatILUInfo;
391 
392 /*S
393    MatLUInfo - Data based into the matrix LU factorization routines
394 
395    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
396 
397    Notes: These are not usually directly used by users, instead use the PC type of LU
398           All entries are double precision.
399 
400    Level: developer
401 
402 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
403 
404 S*/
405 typedef struct {
406   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
407   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
408   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
409   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
410 } MatLUInfo;
411 
412 /*S
413    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
414 
415    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
416 
417    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
418           All entries are double precision.
419 
420    Level: developer
421 
422 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
423 
424 S*/
425 typedef struct {
426   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
427   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
428   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
429 } MatCholeskyInfo;
430 
431 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
432 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
433 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
434 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
435 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
436 EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int);
437 EXTERN int MatLUFactorNumeric(Mat,Mat*);
438 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
439 
440 EXTERN int MatSolve(Mat,Vec,Vec);
441 EXTERN int MatForwardSolve(Mat,Vec,Vec);
442 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
443 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
444 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
445 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
446 
447 EXTERN int MatSetUnfactored(Mat);
448 
449 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
450 /*E
451     MatSORType - What type of (S)SOR to perform
452 
453     Level: beginner
454 
455    Any additions/changes here MUST also be made in include/finclude/petscmat.h
456 
457 .seealso: MatRelax()
458 E*/
459 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
460               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
461               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
462               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
463 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
464 
465 /*
466     These routines are for efficiently computing Jacobians via finite differences.
467 */
468 
469 typedef char* MatColoringType;
470 #define MATCOLORING_NATURAL "natural"
471 #define MATCOLORING_SL      "sl"
472 #define MATCOLORING_LF      "lf"
473 #define MATCOLORING_ID      "id"
474 
475 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
476 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
477 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
478 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
479 #else
480 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
481 #endif
482 EXTERN int        MatColoringRegisterAll(char *);
483 extern PetscTruth MatColoringRegisterAllCalled;
484 EXTERN int        MatColoringRegisterDestroy(void);
485 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
486 
487 /*
488     Data structures used to compute Jacobian vector products
489   efficiently using finite differences.
490 */
491 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
492 
493 typedef struct _p_MatFDColoring *MatFDColoring;
494 
495 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
496 EXTERN int MatFDColoringDestroy(MatFDColoring);
497 EXTERN int MatFDColoringView(MatFDColoring,Viewer);
498 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
499 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
500 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
501 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
502 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
503 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
504 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
505 
506 /*
507     These routines are for partitioning matrices: currently used only
508   for adjacency matrix, MatCreateMPIAdj().
509 */
510 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
511 
512 typedef struct _p_MatPartitioning *MatPartitioning;
513 typedef char* MatPartitioningType;
514 #define MATPARTITIONING_CURRENT  "current"
515 #define MATPARTITIONING_PARMETIS "parmetis"
516 
517 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
518 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
519 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
520 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
521 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
522 EXTERN int MatPartitioningDestroy(MatPartitioning);
523 
524 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
525 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
526 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
527 #else
528 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
529 #endif
530 
531 EXTERN int        MatPartitioningRegisterAll(char *);
532 extern PetscTruth MatPartitioningRegisterAllCalled;
533 EXTERN int        MatPartitioningRegisterDestroy(void);
534 
535 EXTERN int MatPartitioningView(MatPartitioning,Viewer);
536 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
537 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
538 
539 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
540 
541 /*
542     If you add entries here you must also add them to finclude/petscmat.h
543 */
544 typedef enum { MATOP_SET_VALUES=0,
545                MATOP_GET_ROW=1,
546                MATOP_RESTORE_ROW=2,
547                MATOP_MULT=3,
548                MATOP_MULT_ADD=4,
549                MATOP_MULT_TRANSPOSE=5,
550                MATOP_MULT_TRANSPOSE_ADD=6,
551                MATOP_SOLVE=7,
552                MATOP_SOLVE_ADD=8,
553                MATOP_SOLVE_TRANSPOSE=9,
554                MATOP_SOLVE_TRANSPOSE_ADD=10,
555                MATOP_LUFACTOR=11,
556                MATOP_CHOLESKYFACTOR=12,
557                MATOP_RELAX=13,
558                MATOP_TRANSPOSE=14,
559                MATOP_GETINFO=15,
560                MATOP_EQUAL=16,
561                MATOP_GET_DIAGONAL=17,
562                MATOP_DIAGONAL_SCALE=18,
563                MATOP_NORM=19,
564                MATOP_ASSEMBLY_BEGIN=20,
565                MATOP_ASSEMBLY_END=21,
566                MATOP_COMPRESS=22,
567                MATOP_SET_OPTION=23,
568                MATOP_ZERO_ENTRIES=24,
569                MATOP_ZERO_ROWS=25,
570                MATOP_LUFACTOR_SYMBOLIC=26,
571                MATOP_LUFACTOR_NUMERIC=27,
572                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
573                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
574                MATOP_GET_SIZE=30,
575                MATOP_GET_LOCAL_SIZE=31,
576                MATOP_GET_OWNERSHIP_RANGE=32,
577                MATOP_ILUFACTOR_SYMBOLIC=33,
578                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
579                MATOP_GET_ARRAY=35,
580                MATOP_RESTORE_ARRAY=36,
581 
582                MATOP_CONVERT_SAME_TYPE=37,
583                MATOP_FORWARD_SOLVE=38,
584                MATOP_BACKWARD_SOLVE=39,
585                MATOP_ILUFACTOR=40,
586                MATOP_INCOMPLETECHOLESKYFACTOR=41,
587                MATOP_AXPY=42,
588                MATOP_GET_SUBMATRICES=43,
589                MATOP_INCREASE_OVERLAP=44,
590                MATOP_GET_VALUES=45,
591                MATOP_COPY=46,
592                MATOP_PRINT_HELP=47,
593                MATOP_SCALE=48,
594                MATOP_SHIFT=49,
595                MATOP_DIAGONAL_SHIFT=50,
596                MATOP_ILUDT_FACTOR=51,
597                MATOP_GET_BLOCK_SIZE=52,
598                MATOP_GET_ROW_IJ=53,
599                MATOP_RESTORE_ROW_IJ=54,
600                MATOP_GET_COLUMN_IJ=55,
601                MATOP_RESTORE_COLUMN_IJ=56,
602                MATOP_FDCOLORING_CREATE=57,
603                MATOP_COLORING_PATCH=58,
604                MATOP_SET_UNFACTORED=59,
605                MATOP_PERMUTE=60,
606                MATOP_SET_VALUES_BLOCKED=61,
607                MATOP_DESTROY=250,
608                MATOP_VIEW=251
609              } MatOperation;
610 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
611 EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
612 EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
613 EXTERN int MatShellSetContext(Mat,void*);
614 
615 /*
616    Codes for matrices stored on disk. By default they are
617  stored in a universal format. By changing the format with
618  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
619  be stored in a way natural for the matrix, for example dense matrices
620  would be stored as dense. Matrices stored this way may only be
621  read into matrices of the same time.
622 */
623 #define MATRIX_BINARY_FORMAT_DENSE -1
624 
625 /*
626      New matrix classes not yet distributed
627 */
628 /*
629     MatAIJIndices is a data structure for storing the nonzero location information
630   for sparse matrices. Several matrices with identical nonzero structure can share
631   the same MatAIJIndices.
632 */
633 typedef struct _p_MatAIJIndices* MatAIJIndices;
634 
635 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
636 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
637 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
638 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
639 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
640 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
641 EXTERN int MatShiftAIJIndices(MatAIJIndices);
642 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
643 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
644 
645 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
646 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
647 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
648 
649 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
650 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
651 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
652 
653 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
654 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
655 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
656 
657 typedef struct _p_MatNullSpace* MatNullSpace;
658 #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
659 
660 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
661 EXTERN int MatNullSpaceDestroy(MatNullSpace);
662 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
663 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
664 EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
665 
666 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
667 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
668 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
669 
670 
671 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
672 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
673 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
674 
675 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
676 
677 #endif
678 
679 
680 
681