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