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