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