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