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