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