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