xref: /petsc/include/petscmat.h (revision 000e7ae39bfc97192f514518b0dadcfe7b458034)
1 /* $Id: petscmat.h,v 1.228 2001/09/07 20:09:08 bsmith Exp $ */
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 /*S
12      Mat - Abstract PETSc matrix object
13 
14    Level: beginner
15 
16   Concepts: matrix; linear operator
17 
18 .seealso:  MatCreate(), MatType, MatSetType()
19 S*/
20 typedef struct _p_Mat*           Mat;
21 
22 /*E
23     MatType - String with the name of a PETSc matrix or the creation function
24        with an optional dynamic library name, for example
25        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
26 
27    Level: beginner
28 
29 .seealso: MatSetType(), Mat
30 E*/
31 #define MATSAME     "same"
32 #define MATSEQMAIJ  "seqmaij"
33 #define MATMPIMAIJ  "mpimaij"
34 #define MATIS       "is"
35 #define MATMPIROWBS "mpirowbs"
36 #define MATSEQDENSE "seqdense"
37 #define MATSEQAIJ   "seqaij"
38 #define MATMPIAIJ   "mpiaij"
39 #define MATSHELL    "shell"
40 #define MATSEQBDIAG "seqbdiag"
41 #define MATMPIBDIAG "mpibdiag"
42 #define MATMPIDENSE "mpidense"
43 #define MATSEQBAIJ  "seqbaij"
44 #define MATMPIBAIJ  "mpibaij"
45 #define MATMPIADJ   "mpiadj"
46 #define MATSEQSBAIJ "seqsbaij"
47 #define MATMPISBAIJ "mpisbaij"
48 #define MATDAAD     "daad"
49 #define MATMFFD     "mffd"
50 typedef char* MatType;
51 
52 #define MAT_SER_SEQAIJ_BINARY "seqaij_binary"
53 #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary"
54 typedef char *MatSerializeType;
55 
56 #ifdef PETSC_USE_NEW_LOGGING
57 /* Logging support */
58 extern int MAT_COOKIE;
59 extern int MAT_FDCOLORING_COOKIE;
60 extern int MATPARTITIONING_COOKIE;
61 enum {MAT_Mult, MAT_MultMultiple, MAT_MultConstrained, MAT_MultTrans, MAT_MultAdd, MAT_MultTransAdd, MAT_MultMatrixFree,
62       MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTrans, MAT_SolveTransAdd, MAT_Relax, MAT_ForwardSolve,
63       MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic, MAT_LUFactorNumeric, MAT_CholeskyFactor,
64       MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor, MAT_ILUFactorSymbolic,
65       MAT_IncompleteCholeskyFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin, MAT_AssemblyEnd,
66       MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering, MAT_IncreaseOverlap,
67       MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_MAX_EVENTS};
68 extern int MatEvents[MAT_MAX_EVENTS];
69 #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(MatEvents[e],o1,o2,o3,o4)
70 #define MatLogEventEnd(e,o1,o2,o3,o4)   PetscLogEventEnd(MatEvents[e],o1,o2,o3,o4)
71 
72 #else
73 
74 enum {MAT_MultConstrained};
75 #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(e,o1,o2,o3,o4)
76 #define MatLogEventEnd(e,o1,o2,o3,o4)   PetscLogEventEnd(e,o1,o2,o3,o4)
77 #endif
78 
79 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
80 EXTERN int MatSetType(Mat,MatType);
81 EXTERN int MatSetFromOptions(Mat);
82 EXTERN int MatSetUpPreallocation(Mat);
83 EXTERN int MatRegisterAll(char*);
84 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
85 EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
86 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
87 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
88 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
89 #else
90 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
91 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
92 #endif
93 extern PetscTruth MatRegisterAllCalled;
94 extern PetscFList MatList;
95 
96 EXTERN PetscFList MatSerializeList;
97 EXTERN int MatSerializeRegisterAll(const char []);
98 EXTERN int MatSerializeRegisterDestroy();
99 EXTERN int MatSerializeRegisterAllCalled;
100 EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
101 EXTERN int MatSetSerializeType(Mat, MatSerializeType);
102 
103 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
104 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
105 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
106 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
107 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
108 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
109 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
110 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
111 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
112 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
113 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
114 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
115 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
116 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
117 EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
118 EXTERN int MatDestroy(Mat);
119 
120 EXTERN int MatPrintHelp(Mat);
121 EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
122 
123 /* ------------------------------------------------------------*/
124 EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
125 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
126 
127 /*S
128      MatStencil - Data structure (C struct) for storing information about a single row or
129         column of a matrix as index on an associated grid.
130 
131    Level: beginner
132 
133   Concepts: matrix; linear operator
134 
135 .seealso:  MatSetValuesStencil(), MatSetStencil()
136 S*/
137 typedef struct {
138   int k,j,i,c;
139 } MatStencil;
140 
141 EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
142 EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
143 EXTERN int MatSetStencil(Mat,int,int*,int*,int);
144 
145 EXTERN int MatSetColoring(Mat,ISColoring);
146 EXTERN int MatSetValuesAdic(Mat,void*);
147 EXTERN int MatSetValuesAdifor(Mat,int,void*);
148 
149 /*E
150     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
151      to continue to add values to it
152 
153     Level: beginner
154 
155 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
156 E*/
157 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
158 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
159 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
160 EXTERN int MatAssembled(Mat,PetscTruth*);
161 
162 #define MatSetValue(v,i,j,va,mode) \
163 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
164   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
165 }
166 #define MatGetValue(v,i,j,va) \
167 0; {int _ierr,_row = i,_col = j; \
168   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
169 }
170 #define MatSetValueLocal(v,i,j,va,mode) \
171 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
172   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
173 }
174 /*E
175     MatOption - Options that may be set for a matrix and its behavior or storage
176 
177     Level: beginner
178 
179    Any additions/changes here MUST also be made in include/finclude/petscmat.h
180 
181 .seealso: MatSetOption()
182 E*/
183 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
184               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
185               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
186               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
187               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
188               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
189               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
190               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
191               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
192               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
193               MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption;
194 EXTERN int MatSetOption(Mat,MatOption);
195 EXTERN int MatGetType(Mat,MatType*);
196 
197 EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
198 EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
199 EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
200 EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
201 EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
202 EXTERN int MatGetColumnVector(Mat,Vec,int);
203 EXTERN int MatGetArray(Mat,PetscScalar **);
204 EXTERN int MatRestoreArray(Mat,PetscScalar **);
205 EXTERN int MatGetBlockSize(Mat,int *);
206 
207 EXTERN int MatMult(Mat,Vec,Vec);
208 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
209 EXTERN int MatMultTranspose(Mat,Vec,Vec);
210 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
211 EXTERN int MatMultConstrained(Mat,Vec,Vec);
212 
213 /*E
214     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
215   its numerical values copied over or just its nonzero structure.
216 
217     Level: beginner
218 
219    Any additions/changes here MUST also be made in include/finclude/petscmat.h
220 
221 .seealso: MatDuplicate()
222 E*/
223 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
224 
225 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
226 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
227 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
228 #else
229 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
230 #endif
231 EXTERN int        MatConvertRegisterAll(char*);
232 EXTERN int        MatConvertRegisterDestroy(void);
233 extern PetscTruth MatConvertRegisterAllCalled;
234 extern PetscFList MatConvertList;
235 EXTERN int        MatConvert(Mat,MatType,Mat*);
236 EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
237 
238 /*E
239     MatStructure - Indicates if the matrix has the same nonzero structure
240 
241     Level: beginner
242 
243    Any additions/changes here MUST also be made in include/finclude/petscmat.h
244 
245 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
246 E*/
247 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
248 
249 EXTERN int MatCopy(Mat,Mat,MatStructure);
250 EXTERN int MatView(Mat,PetscViewer);
251 
252 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
253 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
254 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
255 #else
256 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
257 #endif
258 EXTERN int        MatLoadRegisterAll(char*);
259 EXTERN int        MatLoadRegisterDestroy(void);
260 extern PetscTruth MatLoadRegisterAllCalled;
261 extern PetscFList MatLoadList;
262 EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
263 
264 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
265 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
266 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
267 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
268 
269 /*S
270      MatInfo - Context of matrix information, used with MatGetInfo()
271 
272    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
273 
274    Level: intermediate
275 
276   Concepts: matrix^nonzero information
277 
278 .seealso:  MatGetInfo(), MatInfoType
279 S*/
280 typedef struct {
281   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
282   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
283   PetscLogDouble block_size;                         /* block size */
284   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
285   PetscLogDouble memory;                             /* memory allocated */
286   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
287   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
288   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
289   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
290 } MatInfo;
291 
292 /*E
293     MatInfoType - Indicates if you want information about the local part of the matrix,
294      the entire parallel matrix or the maximum over all the local parts.
295 
296     Level: beginner
297 
298    Any additions/changes here MUST also be made in include/finclude/petscmat.h
299 
300 .seealso: MatGetInfo(), MatInfo
301 E*/
302 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
303 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
304 EXTERN int MatValid(Mat,PetscTruth*);
305 EXTERN int MatGetDiagonal(Mat,Vec);
306 EXTERN int MatGetRowMax(Mat,Vec);
307 EXTERN int MatTranspose(Mat,Mat*);
308 EXTERN int MatPermute(Mat,IS,IS,Mat *);
309 EXTERN int MatPermuteSparsify(Mat,int,double,double,IS,IS,Mat *);
310 EXTERN int MatDiagonalScale(Mat,Vec,Vec);
311 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
312 EXTERN int MatEqual(Mat,Mat,PetscTruth*);
313 
314 EXTERN int MatNorm(Mat,NormType,PetscReal *);
315 EXTERN int MatZeroEntries(Mat);
316 EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
317 EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
318 
319 EXTERN int MatUseScaledForm(Mat,PetscTruth);
320 EXTERN int MatScaleSystem(Mat,Vec,Vec);
321 EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
322 
323 EXTERN int MatGetSize(Mat,int*,int*);
324 EXTERN int MatGetLocalSize(Mat,int*,int*);
325 EXTERN int MatGetOwnershipRange(Mat,int*,int*);
326 
327 /*E
328     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
329      or MatGetSubMatrix() are to be reused to store the new matrix values.
330 
331     Level: beginner
332 
333    Any additions/changes here MUST also be made in include/finclude/petscmat.h
334 
335 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
336 E*/
337 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
338 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
339 EXTERN int MatDestroyMatrices(int,Mat **);
340 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
341 
342 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
343 
344 EXTERN int MatAXPY(PetscScalar *,Mat,Mat);
345 EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
346 EXTERN int MatCompress(Mat);
347 
348 EXTERN int MatScale(PetscScalar *,Mat);
349 EXTERN int MatShift(PetscScalar *,Mat);
350 
351 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
352 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
353 EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
354 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
355 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
356 
357 EXTERN int MatSetStashInitialSize(Mat,int,int);
358 
359 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
360 EXTERN int MatInterpolate(Mat,Vec,Vec);
361 EXTERN int MatRestrict(Mat,Vec,Vec);
362 
363 /*
364       These three (or four) macros MUST be used together. The third one closes the open { of the first one
365 */
366 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
367 { \
368   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
369   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
370   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
371   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
372   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
373 
374 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
375 {\
376   int __l;\
377   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
378   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
379   for (__l=0;__l<nrows;__l++) {\
380     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
381   }\
382 }
383 
384 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
385 { int __i; \
386   for (__i=0; __i<nc; __i++) {\
387     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
388   }\
389   dnz[row - __rstart] = nc - onz[row - __rstart];\
390 }
391 
392 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
393 
394 /* Routines unique to particular data structures */
395 EXTERN int MatShellGetContext(Mat,void **);
396 
397 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
398 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
399 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
400 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
401 
402 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
403 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
404 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
405 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
406 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
407 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
408 
409 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
410 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
411 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
412 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
413 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
414 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
415 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
416 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
417 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
418 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
419 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
420 
421 EXTERN int MatStoreValues(Mat);
422 EXTERN int MatRetrieveValues(Mat);
423 
424 EXTERN int MatDAADSetCtx(Mat,void*);
425 
426 /*
427   These routines are not usually accessed directly, rather solving is
428   done through the SLES, KSP and PC interfaces.
429 */
430 
431 /*E
432     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
433        with an optional dynamic library name, for example
434        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
435 
436    Level: beginner
437 
438 .seealso: MatGetOrdering()
439 E*/
440 typedef char* MatOrderingType;
441 #define MATORDERING_NATURAL   "natural"
442 #define MATORDERING_ND        "nd"
443 #define MATORDERING_1WD       "1wd"
444 #define MATORDERING_RCM       "rcm"
445 #define MATORDERING_QMD       "qmd"
446 #define MATORDERING_ROWLENGTH "rowlength"
447 #define MATORDERING_DSC_ND    "dsc_nd"
448 #define MATORDERING_DSC_MMD   "dsc_mmd"
449 #define MATORDERING_DSC_MDF   "dsc_mdf"
450 #define MATORDERING_CONSTRAINED "constrained"
451 #define MATORDERING_IDENTITY  "identity"
452 #define MATORDERING_REVERSE   "reverse"
453 
454 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
455 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
456 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
457 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
458 #else
459 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
460 #endif
461 EXTERN int        MatOrderingRegisterDestroy(void);
462 EXTERN int        MatOrderingRegisterAll(char*);
463 extern PetscTruth MatOrderingRegisterAllCalled;
464 extern PetscFList      MatOrderingList;
465 
466 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
467 
468 EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
469 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
470 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
471 
472 /*S
473    MatILUInfo - Data based into the matrix ILU factorization routines
474 
475    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
476 
477    Notes: These are not usually directly used by users, instead use the PC type of ILU
478           All entries are double precision.
479 
480    Level: developer
481 
482 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
483 
484 S*/
485 typedef struct {
486   PetscReal     levels;         /* ILU(levels) */
487   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
488   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
489   PetscReal     dt;             /* drop tolerance */
490   PetscReal     dtcol;          /* tolerance for pivoting */
491   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
492   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
493   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
494   PetscReal     zeropivot; /* pivot is called zero if less than this */
495 } MatILUInfo;
496 
497 /*S
498    MatLUInfo - Data based into the matrix LU factorization routines
499 
500    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
501 
502    Notes: These are not usually directly used by users, instead use the PC type of LU
503           All entries are double precision.
504 
505    Level: developer
506 
507 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
508 
509 S*/
510 typedef struct {
511   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
512   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
513   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
514   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
515   PetscReal     zeropivot; /* pivot is called zero if less than this */
516 } MatLUInfo;
517 
518 /*S
519    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
520 
521    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
522 
523    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
524           All entries are double precision.
525 
526    Level: developer
527 
528 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
529 
530 S*/
531 typedef struct {
532   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
533   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
534   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
535 } MatCholeskyInfo;
536 
537 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
538 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
539 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
540 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
541 EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*);
542 EXTERN int MatICCFactor(Mat,IS,PetscReal,int);
543 EXTERN int MatLUFactorNumeric(Mat,Mat*);
544 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
545 
546 EXTERN int MatSolve(Mat,Vec,Vec);
547 EXTERN int MatForwardSolve(Mat,Vec,Vec);
548 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
549 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
550 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
551 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
552 
553 EXTERN int MatSetUnfactored(Mat);
554 
555 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
556 /*E
557     MatSORType - What type of (S)SOR to perform
558 
559     Level: beginner
560 
561    May be bitwise ORd together
562 
563    Any additions/changes here MUST also be made in include/finclude/petscmat.h
564 
565 .seealso: MatRelax()
566 E*/
567 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
568               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
569               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
570               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
571 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,Vec);
572 
573 /*
574     These routines are for efficiently computing Jacobians via finite differences.
575 */
576 
577 /*E
578     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
579        with an optional dynamic library name, for example
580        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
581 
582    Level: beginner
583 
584 .seealso: MatGetColoring()
585 E*/
586 typedef char* MatColoringType;
587 #define MATCOLORING_NATURAL "natural"
588 #define MATCOLORING_SL      "sl"
589 #define MATCOLORING_LF      "lf"
590 #define MATCOLORING_ID      "id"
591 
592 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
593 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
594 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
595 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
596 #else
597 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
598 #endif
599 EXTERN int        MatColoringRegisterAll(char *);
600 extern PetscTruth MatColoringRegisterAllCalled;
601 EXTERN int        MatColoringRegisterDestroy(void);
602 EXTERN int        MatColoringPatch(Mat,int,int,int *,ISColoring*);
603 
604 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
605 /*S
606      MatFDColoring - Object for computing a sparse Jacobian via finite differences
607         and coloring
608 
609    Level: beginner
610 
611   Concepts: coloring, sparse Jacobian, finite differences
612 
613 .seealso:  MatFDColoringCreate()
614 S*/
615 typedef struct _p_MatFDColoring *MatFDColoring;
616 
617 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
618 EXTERN int MatFDColoringDestroy(MatFDColoring);
619 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
620 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
621 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
622 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
623 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
624 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
625 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
626 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
627 EXTERN int MatFDColoringSetRecompute(MatFDColoring);
628 EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
629 
630 /*
631     These routines are for partitioning matrices: currently used only
632   for adjacency matrix, MatCreateMPIAdj().
633 */
634 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
635 
636 /*S
637      MatPartitioning - Object for managing the partitioning of a matrix or graph
638 
639    Level: beginner
640 
641   Concepts: partitioning
642 
643 .seealso:  MatParitioningCreate(), MatPartitioningType
644 S*/
645 typedef struct _p_MatPartitioning *MatPartitioning;
646 
647 /*E
648     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
649        with an optional dynamic library name, for example
650        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
651 
652    Level: beginner
653 
654 .seealso: MatPartitioingCreate(), MatPartitioning
655 E*/
656 typedef char* MatPartitioningType;
657 #define MATPARTITIONING_CURRENT  "current"
658 #define MATPARTITIONING_PARMETIS "parmetis"
659 
660 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
661 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
662 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
663 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
664 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
665 EXTERN int MatPartitioningDestroy(MatPartitioning);
666 
667 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
668 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
669 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
670 #else
671 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
672 #endif
673 
674 EXTERN int        MatPartitioningRegisterAll(char *);
675 extern PetscTruth MatPartitioningRegisterAllCalled;
676 EXTERN int        MatPartitioningRegisterDestroy(void);
677 
678 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
679 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
680 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
681 
682 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
683 
684 /*
685     If you add entries here you must also add them to finclude/petscmat.h
686 */
687 typedef enum { MATOP_SET_VALUES=0,
688                MATOP_GET_ROW=1,
689                MATOP_RESTORE_ROW=2,
690                MATOP_MULT=3,
691                MATOP_MULT_ADD=4,
692                MATOP_MULT_TRANSPOSE=5,
693                MATOP_MULT_TRANSPOSE_ADD=6,
694                MATOP_SOLVE=7,
695                MATOP_SOLVE_ADD=8,
696                MATOP_SOLVE_TRANSPOSE=9,
697                MATOP_SOLVE_TRANSPOSE_ADD=10,
698                MATOP_LUFACTOR=11,
699                MATOP_CHOLESKYFACTOR=12,
700                MATOP_RELAX=13,
701                MATOP_TRANSPOSE=14,
702                MATOP_GETINFO=15,
703                MATOP_EQUAL=16,
704                MATOP_GET_DIAGONAL=17,
705                MATOP_DIAGONAL_SCALE=18,
706                MATOP_NORM=19,
707                MATOP_ASSEMBLY_BEGIN=20,
708                MATOP_ASSEMBLY_END=21,
709                MATOP_COMPRESS=22,
710                MATOP_SET_OPTION=23,
711                MATOP_ZERO_ENTRIES=24,
712                MATOP_ZERO_ROWS=25,
713                MATOP_LUFACTOR_SYMBOLIC=26,
714                MATOP_LUFACTOR_NUMERIC=27,
715                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
716                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
717                MATOP_GET_SIZE=30,
718                MATOP_GET_LOCAL_SIZE=31,
719                MATOP_GET_OWNERSHIP_RANGE=32,
720                MATOP_ILUFACTOR_SYMBOLIC=33,
721                MATOP_ICCFACTOR_SYMBOLIC=34,
722                MATOP_GET_ARRAY=35,
723                MATOP_RESTORE_ARRAY=36,
724 
725                MATOP_CONVERT_SAME_TYPE=37,
726                MATOP_FORWARD_SOLVE=38,
727                MATOP_BACKWARD_SOLVE=39,
728                MATOP_ILUFACTOR=40,
729                MATOP_ICCFACTOR=41,
730                MATOP_AXPY=42,
731                MATOP_GET_SUBMATRICES=43,
732                MATOP_INCREASE_OVERLAP=44,
733                MATOP_GET_VALUES=45,
734                MATOP_COPY=46,
735                MATOP_PRINT_HELP=47,
736                MATOP_SCALE=48,
737                MATOP_SHIFT=49,
738                MATOP_DIAGONAL_SHIFT=50,
739                MATOP_ILUDT_FACTOR=51,
740                MATOP_GET_BLOCK_SIZE=52,
741                MATOP_GET_ROW_IJ=53,
742                MATOP_RESTORE_ROW_IJ=54,
743                MATOP_GET_COLUMN_IJ=55,
744                MATOP_RESTORE_COLUMN_IJ=56,
745                MATOP_FDCOLORING_CREATE=57,
746                MATOP_COLORING_PATCH=58,
747                MATOP_SET_UNFACTORED=59,
748                MATOP_PERMUTE=60,
749                MATOP_SET_VALUES_BLOCKED=61,
750                MATOP_GET_SUBMATRIX=62,
751                MATOP_GET_MAPS=65,
752                MATOP_USE_SCALED_FORM=66,
753                MATOP_SCALE_SYSTEM=67,
754                MATOP_UNSCALE_SYSTEM=68,
755                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=69,
756                MATOP_SET_VALUES_LOCAL=70,
757                MATOP_ZERO_ROWS_LOCAL=71,
758                MATOP_GET_ROW_MAX=72,
759                MATOP_CONVERT=73,
760                MATOP_SET_COLORING=74,
761                MATOP_SET_VALUES_ADIC=75,
762                MATOP_SET_VALUES_ADIFOR=76,
763                MATOP_FD_COLORING_APPLY=77,
764                MATOP_SET_FROM_OPTIONS=78,
765                MATOP_MULT_CONSTRAINED=79,
766                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=80,
767                MATOP_SERIALIZE=81,
768                MATOP_PERMUTE_SPARSIFY=82,
769                MATOP_MULT_MULTIPLE=83,
770                MATOP_SOLVE_MULTIPLE=84,
771                MATOP_DESTROY=250,
772                MATOP_VIEW=251
773              } MatOperation;
774 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
775 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)());
776 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)());
777 EXTERN int MatShellSetContext(Mat,void*);
778 
779 /*
780    Codes for matrices stored on disk. By default they are
781  stored in a universal format. By changing the format with
782  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
783  be stored in a way natural for the matrix, for example dense matrices
784  would be stored as dense. Matrices stored this way may only be
785  read into matrices of the same time.
786 */
787 #define MATRIX_BINARY_FORMAT_DENSE -1
788 
789 /*
790      New matrix classes not yet distributed
791 */
792 /*
793     MatAIJIndices is a data structure for storing the nonzero location information
794   for sparse matrices. Several matrices with identical nonzero structure can share
795   the same MatAIJIndices.
796 */
797 typedef struct _p_MatAIJIndices* MatAIJIndices;
798 
799 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
800 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
801 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
802 EXTERN int MatDestroyAIJIndices(MatAIJIndices);
803 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
804 EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
805 EXTERN int MatShiftAIJIndices(MatAIJIndices);
806 EXTERN int MatShrinkAIJIndices(MatAIJIndices);
807 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
808 
809 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
810 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
811 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
812 
813 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
814 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
815 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
816 
817 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
818 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
819 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
820 
821 /*S
822      MatNullSpace - Object that removes a null space from a vector, i.e.
823          orthogonalizes the vector to a subsapce
824 
825    Level: beginner
826 
827   Concepts: matrix; linear operator, null space
828 
829 .seealso:  MatNullSpaceCreate()
830 S*/
831 typedef struct _p_MatNullSpace* MatNullSpace;
832 
833 #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
834 
835 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
836 EXTERN int MatNullSpaceDestroy(MatNullSpace);
837 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
838 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
839 EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
840 
841 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
842 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
843 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
844 
845 
846 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
847 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
848 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
849 
850 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
851 
852 EXTERN int MatComputeExplicitOperator(Mat,Mat*);
853 
854 #endif
855 
856 
857 
858