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