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