xref: /petsc/include/petscmat.h (revision 22191285a759e9daa5754a314f71c0b335787bcf)
1 /* $Id: petscmat.h,v 1.228 2001/09/07 20:09:08 bsmith Exp $ */
2 /*
3      Include file for the matrix component of PETSc
4 */
5 #ifndef __PETSCMAT_H
6 #define __PETSCMAT_H
7 #include "petscvec.h"
8 
9 /*S
10      Mat - Abstract PETSc matrix object
11 
12    Level: beginner
13 
14   Concepts: matrix; linear operator
15 
16 .seealso:  MatCreate(), MatType, MatSetType()
17 S*/
18 typedef struct _p_Mat*           Mat;
19 
20 /*E
21     MatType - String with the name of a PETSc matrix or the creation function
22        with an optional dynamic library name, for example
23        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
24 
25    Level: beginner
26 
27 .seealso: MatSetType(), Mat
28 E*/
29 #define MATSAME     "same"
30 #define MATSEQMAIJ  "seqmaij"
31 #define MATMPIMAIJ  "mpimaij"
32 #define MATIS       "is"
33 #define MATMPIROWBS "mpirowbs"
34 #define MATSEQDENSE "seqdense"
35 #define MATSEQAIJ   "seqaij"
36 #define MATMPIAIJ   "mpiaij"
37 #define MATSHELL    "shell"
38 #define MATSEQBDIAG "seqbdiag"
39 #define MATMPIBDIAG "mpibdiag"
40 #define MATMPIDENSE "mpidense"
41 #define MATSEQBAIJ  "seqbaij"
42 #define MATMPIBAIJ  "mpibaij"
43 #define MATMPIADJ   "mpiadj"
44 #define MATSEQSBAIJ "seqsbaij"
45 #define MATMPISBAIJ "mpisbaij"
46 #define MATDAAD     "daad"
47 #define MATMFFD     "mffd"
48 #define MATESI      "esi"
49 #define MATPETSCESI "petscesi"
50 #define MATNORMAL   "normal"
51 #define MATSEQAIJSPOOLES   "seqaijspooles"
52 #define MATMPIAIJSPOOLES   "mpiaijspooles"
53 #define MATSEQSBAIJSPOOLES "seqsbaijspooles"
54 #define MATMPISBAIJSPOOLES "mpisbaijspooles"
55 typedef char* MatType;
56 
57 #define MAT_SER_SEQAIJ_BINARY "seqaij_binary"
58 #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary"
59 typedef char *MatSerializeType;
60 
61 /* Logging support */
62 #define    MAT_FILE_COOKIE 1211216    /* used to indicate matrices in binary files */
63 extern int MAT_COOKIE;
64 extern int MATSNESMFCTX_COOKIE;
65 extern int MAT_FDCOLORING_COOKIE;
66 extern int MAT_PARTITIONING_COOKIE;
67 extern int MAT_NULLSPACE_COOKIE;
68 extern int MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
69 extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose;
70 extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
71 extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
72 extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
73 extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
74 extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
75 extern int MAT_FDColoringApply, MAT_Transpose, MAT_FDColoringFunction;
76 
77 EXTERN int MatInitializePackage(char *);
78 
79 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
80 EXTERN int MatSetType(Mat,MatType);
81 EXTERN int MatSetFromOptions(Mat);
82 EXTERN int MatSetUpPreallocation(Mat);
83 EXTERN int MatRegisterAll(char*);
84 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
85 EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
86 
87 /*MC
88    MatRegisterDynamic - Adds a new matrix type
89 
90    Synopsis:
91    int MatRegisterDynamic(char *name,char *path,char *name_create,int (*routine_create)(Mat))
92 
93    Not Collective
94 
95    Input Parameters:
96 +  name - name of a new user-defined matrix type
97 .  path - path (either absolute or relative) the library containing this solver
98 .  name_create - name of routine to create method context
99 -  routine_create - routine to create method context
100 
101    Notes:
102    MatRegisterDynamic() may be called multiple times to add several user-defined solvers.
103 
104    If dynamic libraries are used, then the fourth input argument (routine_create)
105    is ignored.
106 
107    Sample usage:
108 .vb
109    MatRegisterDynamic("my_mat",/home/username/my_lib/lib/libO/solaris/mylib.a,
110                "MyMatCreate",MyMatCreate);
111 .ve
112 
113    Then, your solver can be chosen with the procedural interface via
114 $     MatSetType(Mat,"my_mat")
115    or at runtime via the option
116 $     -mat_type my_mat
117 
118    Level: advanced
119 
120    Notes: ${PETSC_ARCH} and ${BOPT} occuring in pathname will be replaced with appropriate values.
121          If your function is not being put into a shared library then use VecRegister() instead
122 
123 .keywords: Mat, register
124 
125 .seealso: MatRegisterAll(), MatRegisterDestroy()
126 
127 M*/
128 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
129 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
130 #else
131 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
132 #endif
133 
134 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
135 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
136 #else
137 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
138 #endif
139 
140 extern PetscTruth MatRegisterAllCalled;
141 extern PetscFList MatList;
142 
143 EXTERN PetscFList MatSerializeList;
144 EXTERN int MatSerializeRegisterAll(const char []);
145 EXTERN int MatSerializeRegisterDestroy(void);
146 EXTERN int MatSerializeRegisterAllCalled;
147 EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
148 EXTERN int MatSetSerializeType(Mat, MatSerializeType);
149 
150 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar[],Mat*);
151 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar[],Mat*);
152 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,const int[],Mat*);
153 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,const int[],int,const int[],Mat*);
154 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,const int[],Mat*);
155 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,const int[],PetscScalar*[],Mat*);
156 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,const int[],PetscScalar*[],Mat*);
157 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,const int[],Mat*);
158 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,const int[],int,const int[],Mat*);
159 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int[],int[],int[],Mat*);
160 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,const int[],Mat*);
161 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,const int[],int,const int[],Mat*);
162 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
163 EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
164 EXTERN int MatCreateNormal(Mat,Mat*);
165 EXTERN int MatDestroy(Mat);
166 
167 EXTERN int MatPrintHelp(Mat);
168 EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
169 
170 /* ------------------------------------------------------------*/
171 EXTERN int MatSetValues(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode);
172 EXTERN int MatSetValuesBlocked(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode);
173 
174 /*S
175      MatStencil - Data structure (C struct) for storing information about a single row or
176         column of a matrix as index on an associated grid.
177 
178    Level: beginner
179 
180   Concepts: matrix; linear operator
181 
182 .seealso:  MatSetValuesStencil(), MatSetStencil()
183 S*/
184 typedef struct {
185   int k,j,i,c;
186 } MatStencil;
187 
188 EXTERN int MatSetValuesStencil(Mat,int,const MatStencil[],int,const MatStencil[],const PetscScalar[],InsertMode);
189 EXTERN int MatSetValuesBlockedStencil(Mat,int,const MatStencil[],int,const MatStencil[],const PetscScalar[],InsertMode);
190 EXTERN int MatSetStencil(Mat,int,const int[],const int[],int);
191 
192 EXTERN int MatSetColoring(Mat,ISColoring);
193 EXTERN int MatSetValuesAdic(Mat,void*);
194 EXTERN int MatSetValuesAdifor(Mat,int,void*);
195 
196 /*E
197     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
198      to continue to add values to it
199 
200     Level: beginner
201 
202 .seealso: MatAssemblyBegin(), MatAssemblyEnd()
203 E*/
204 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
205 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
206 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
207 EXTERN int MatAssembled(Mat,PetscTruth*);
208 
209 /*MC
210    MatSetValue - Set a single entry into a matrix.
211 
212    Synopsis:
213    int MatSetValue(Mat m,int row,int col,PetscScalar value,InsertMode mode);
214 
215    Not collective
216 
217    Input Parameters:
218 +  m - the matrix
219 .  row - the row location of the entry
220 .  col - the column location of the entry
221 .  value - the value to insert
222 -  mode - either INSERT_VALUES or ADD_VALUES
223 
224    Notes:
225    For efficiency one should use MatSetValues() and set several or many
226    values simultaneously if possible.
227 
228    Note that MatSetValue() does NOT return an error code (since this
229    is checked internally).
230 
231    Level: beginner
232 
233 .seealso: MatSetValues(), MatSetValueLocal()
234 M*/
235 #define MatSetValue(v,i,j,va,mode) \
236 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
237   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
238 }
239 
240 #define MatGetValue(v,i,j,va) \
241 0; {int _ierr,_row = i,_col = j; \
242   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
243 }
244 
245 #define MatSetValueLocal(v,i,j,va,mode) \
246 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
247   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
248 }
249 
250 /*E
251     MatOption - Options that may be set for a matrix and its behavior or storage
252 
253     Level: beginner
254 
255    Any additions/changes here MUST also be made in include/finclude/petscmat.h
256 
257 .seealso: MatSetOption()
258 E*/
259 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
260               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
261               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
262               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
263               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
264               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
265               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
266               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
267               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
268               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
269               MAT_DO_NOT_USE_INODES=82} MatOption;
270 EXTERN int MatSetOption(Mat,MatOption);
271 EXTERN int MatGetType(Mat,MatType*);
272 
273 EXTERN int MatGetValues(Mat,int,const int[],int,const int[],PetscScalar[]);
274 EXTERN int MatGetRow(Mat,int,int *,int *[],PetscScalar*[]);
275 EXTERN int MatRestoreRow(Mat,int,int *,int *[],PetscScalar*[]);
276 EXTERN int MatGetColumn(Mat,int,int *,int *[],PetscScalar*[]);
277 EXTERN int MatRestoreColumn(Mat,int,int *,int *[],PetscScalar*[]);
278 EXTERN int MatGetColumnVector(Mat,Vec,int);
279 EXTERN int MatGetArray(Mat,PetscScalar *[]);
280 EXTERN int MatRestoreArray(Mat,PetscScalar *[]);
281 EXTERN int MatGetBlockSize(Mat,int *);
282 
283 EXTERN int MatMult(Mat,Vec,Vec);
284 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
285 EXTERN int MatMultTranspose(Mat,Vec,Vec);
286 EXTERN int MatIsSymmetric(Mat,Mat,PetscTruth*);
287 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
288 EXTERN int MatMultConstrained(Mat,Vec,Vec);
289 EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
290 
291 /*E
292     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
293   its numerical values copied over or just its nonzero structure.
294 
295     Level: beginner
296 
297    Any additions/changes here MUST also be made in include/finclude/petscmat.h
298 
299 .seealso: MatDuplicate()
300 E*/
301 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
302 
303 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
304 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
305 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
306 #else
307 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
308 #endif
309 EXTERN int        MatConvertRegisterAll(char*);
310 EXTERN int        MatConvertRegisterDestroy(void);
311 extern PetscTruth MatConvertRegisterAllCalled;
312 extern PetscFList MatConvertList;
313 EXTERN int        MatConvert(Mat,MatType,Mat*);
314 EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
315 
316 /*E
317     MatStructure - Indicates if the matrix has the same nonzero structure
318 
319     Level: beginner
320 
321    Any additions/changes here MUST also be made in include/finclude/petscmat.h
322 
323 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
324 E*/
325 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER,SUBSET_NONZERO_PATTERN} MatStructure;
326 
327 EXTERN int MatCopy(Mat,Mat,MatStructure);
328 EXTERN int MatView(Mat,PetscViewer);
329 
330 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
331 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
332 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
333 #else
334 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
335 #endif
336 EXTERN int        MatLoadRegisterAll(char*);
337 EXTERN int        MatLoadRegisterDestroy(void);
338 extern PetscTruth MatLoadRegisterAllCalled;
339 extern PetscFList MatLoadList;
340 EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
341 EXTERN int        MatMerge(MPI_Comm,Mat,Mat*);
342 
343 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int *[],int *[],PetscTruth *);
344 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int *[],int *[],PetscTruth *);
345 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int *[],int *[],PetscTruth *);
346 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int *[],int *[],PetscTruth *);
347 
348 /*S
349      MatInfo - Context of matrix information, used with MatGetInfo()
350 
351    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
352 
353    Level: intermediate
354 
355   Concepts: matrix^nonzero information
356 
357 .seealso:  MatGetInfo(), MatInfoType
358 S*/
359 typedef struct {
360   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
361   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
362   PetscLogDouble block_size;                         /* block size */
363   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
364   PetscLogDouble memory;                             /* memory allocated */
365   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
366   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
367   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
368   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
369 } MatInfo;
370 
371 /*E
372     MatInfoType - Indicates if you want information about the local part of the matrix,
373      the entire parallel matrix or the maximum over all the local parts.
374 
375     Level: beginner
376 
377    Any additions/changes here MUST also be made in include/finclude/petscmat.h
378 
379 .seealso: MatGetInfo(), MatInfo
380 E*/
381 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
382 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
383 EXTERN int MatValid(Mat,PetscTruth*);
384 EXTERN int MatGetDiagonal(Mat,Vec);
385 EXTERN int MatGetRowMax(Mat,Vec);
386 EXTERN int MatTranspose(Mat,Mat*);
387 EXTERN int MatPermute(Mat,IS,IS,Mat *);
388 EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *);
389 EXTERN int MatDiagonalScale(Mat,Vec,Vec);
390 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
391 EXTERN int MatEqual(Mat,Mat,PetscTruth*);
392 
393 EXTERN int MatNorm(Mat,NormType,PetscReal *);
394 EXTERN int MatZeroEntries(Mat);
395 EXTERN int MatZeroRows(Mat,IS,const PetscScalar*);
396 EXTERN int MatZeroColumns(Mat,IS,const PetscScalar*);
397 
398 EXTERN int MatUseScaledForm(Mat,PetscTruth);
399 EXTERN int MatScaleSystem(Mat,Vec,Vec);
400 EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
401 
402 EXTERN int MatGetSize(Mat,int*,int*);
403 EXTERN int MatGetLocalSize(Mat,int*,int*);
404 EXTERN int MatGetOwnershipRange(Mat,int*,int*);
405 
406 /*E
407     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
408      or MatGetSubMatrix() are to be reused to store the new matrix values.
409 
410     Level: beginner
411 
412    Any additions/changes here MUST also be made in include/finclude/petscmat.h
413 
414 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
415 E*/
416 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
417 EXTERN int MatGetSubMatrices(Mat,int,const IS[],const IS[],MatReuse,Mat *[]);
418 EXTERN int MatDestroyMatrices(int,Mat *[]);
419 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
420 
421 EXTERN int MatIncreaseOverlap(Mat,int,IS[],int);
422 
423 EXTERN int MatAXPY(const PetscScalar *,Mat,Mat,MatStructure);
424 EXTERN int MatAYPX(const PetscScalar *,Mat,Mat);
425 EXTERN int MatCompress(Mat);
426 
427 EXTERN int MatScale(const PetscScalar *,Mat);
428 EXTERN int MatShift(const PetscScalar *,Mat);
429 
430 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
431 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
432 EXTERN int MatZeroRowsLocal(Mat,IS,const PetscScalar*);
433 EXTERN int MatSetValuesLocal(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode);
434 EXTERN int MatSetValuesBlockedLocal(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode);
435 
436 EXTERN int MatSetStashInitialSize(Mat,int,int);
437 
438 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
439 EXTERN int MatInterpolate(Mat,Vec,Vec);
440 EXTERN int MatRestrict(Mat,Vec,Vec);
441 
442 
443 /*MC
444    MatPreallocInitialize - Begins the block of code that will count the number of nonzeros per
445        row in a matrix providing the data that one can use to correctly preallocate the matrix.
446 
447    Synopsis:
448    int MatPreallocateInitialize(MPI_Comm comm, int nrows, int ncols, int *dnz, int *onz)
449 
450    Collective on MPI_Comm
451 
452    Input Parameters:
453 +  comm - the communicator that will share the eventually allocated matrix
454 .  nrows - the number of rows in the matrix
455 -  ncols - the number of columns in the matrix
456 
457    Output Parameters:
458 +  dnz - the array that will be passed to the matrix preallocation routines
459 -  ozn - the other array passed to the matrix preallocation routines
460 
461 
462    Level: intermediate
463 
464    Notes:
465    See the chapter in the users manual on performance for more details
466 
467    Do not malloc or free dnz and onz that is handled internally by these routines
468 
469    Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices)
470 
471   Concepts: preallocation^Matrix
472 
473 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
474           MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocal()
475 M*/
476 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
477 { \
478   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
479   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
480   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
481   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
482   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
483 
484 /*MC
485    MatPreallocSymmetricInitialize - Begins the block of code that will count the number of nonzeros per
486        row in a matrix providing the data that one can use to correctly preallocate the matrix.
487 
488    Synopsis:
489    int MatPreallocateSymmetricInitialize(MPI_Comm comm, int nrows, int ncols, int *dnz, int *onz)
490 
491    Collective on MPI_Comm
492 
493    Input Parameters:
494 +  comm - the communicator that will share the eventually allocated matrix
495 .  nrows - the number of rows in the matrix
496 -  ncols - the number of columns in the matrix
497 
498    Output Parameters:
499 +  dnz - the array that will be passed to the matrix preallocation routines
500 -  ozn - the other array passed to the matrix preallocation routines
501 
502 
503    Level: intermediate
504 
505    Notes:
506    See the chapter in the users manual on performance for more details
507 
508    Do not malloc or free dnz and onz that is handled internally by these routines
509 
510   Concepts: preallocation^Matrix
511 
512 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
513           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
514 M*/
515 #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \
516 { \
517   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__end; \
518   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
519   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
520   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\
521   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
522 
523 /*MC
524    MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
525        inserted using a local number of the rows and columns
526 
527    Synopsis:
528    int MatPreallocateSetLocal(ISLocalToGlobalMappping map,int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz)
529 
530    Not Collective
531 
532    Input Parameters:
533 +  map - the mapping between local numbering and global numbering
534 .  nrows - the number of rows indicated
535 .  rows - the indices of the rows (these will be mapped in the
536 .  ncols - the number of columns in the matrix
537 .  cols - the columns indicated
538 .  dnz - the array that will be passed to the matrix preallocation routines
539 -  ozn - the other array passed to the matrix preallocation routines
540 
541 
542    Level: intermediate
543 
544    Notes:
545    See the chapter in the users manual on performance for more details
546 
547    Do not malloc or free dnz and onz that is handled internally by these routines
548 
549   Concepts: preallocation^Matrix
550 
551 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
552           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal()
553 M*/
554 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
555 {\
556   int __l;\
557   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
558   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
559   for (__l=0;__l<nrows;__l++) {\
560     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
561   }\
562 }
563 
564 /*MC
565    MatPreallocateSymmetricSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be
566        inserted using a local number of the rows and columns
567 
568    Synopsis:
569    int MatPreallocateSymmetricSetLocal(ISLocalToGlobalMappping map,int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz)
570 
571    Not Collective
572 
573    Input Parameters:
574 +  map - the mapping between local numbering and global numbering
575 .  nrows - the number of rows indicated
576 .  rows - the indices of the rows (these will be mapped in the
577 .  ncols - the number of columns in the matrix
578 .  cols - the columns indicated
579 .  dnz - the array that will be passed to the matrix preallocation routines
580 -  ozn - the other array passed to the matrix preallocation routines
581 
582 
583    Level: intermediate
584 
585    Notes:
586    See the chapter in the users manual on performance for more details
587 
588    Do not malloc or free dnz and onz that is handled internally by these routines
589 
590   Concepts: preallocation^Matrix
591 
592 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
593           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
594 M*/
595 #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
596 {\
597   int __l;\
598   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
599   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
600   for (__l=0;__l<nrows;__l++) {\
601     _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
602   }\
603 }
604 
605 /*MC
606    MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
607        inserted using a local number of the rows and columns
608 
609    Synopsis:
610    int MatPreallocateSet(int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz)
611 
612    Not Collective
613 
614    Input Parameters:
615 +  nrows - the number of rows indicated
616 .  rows - the indices of the rows (these will be mapped in the
617 .  ncols - the number of columns in the matrix
618 .  cols - the columns indicated
619 .  dnz - the array that will be passed to the matrix preallocation routines
620 -  ozn - the other array passed to the matrix preallocation routines
621 
622 
623    Level: intermediate
624 
625    Notes:
626    See the chapter in the users manual on performance for more details
627 
628    Do not malloc or free dnz and onz that is handled internally by these routines
629 
630   Concepts: preallocation^Matrix
631 
632 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
633           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
634 M*/
635 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
636 { int __i; \
637   for (__i=0; __i<nc; __i++) {\
638     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
639   }\
640   dnz[row - __rstart] = nc - onz[row - __rstart];\
641 }
642 
643 /*MC
644    MatPreallocateSymmetricSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be
645        inserted using a local number of the rows and columns
646 
647    Synopsis:
648    int MatPreallocateSymmetricSet(int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz)
649 
650    Not Collective
651 
652    Input Parameters:
653 +  nrows - the number of rows indicated
654 .  rows - the indices of the rows (these will be mapped in the
655 .  ncols - the number of columns in the matrix
656 .  cols - the columns indicated
657 .  dnz - the array that will be passed to the matrix preallocation routines
658 -  ozn - the other array passed to the matrix preallocation routines
659 
660 
661    Level: intermediate
662 
663    Notes:
664    See the chapter in the users manual on performance for more details
665 
666    Do not malloc or free dnz and onz that is handled internally by these routines
667 
668   Concepts: preallocation^Matrix
669 
670 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(),
671           MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal()
672 M*/
673 #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\
674 { int __i; \
675   for (__i=0; __i<nc; __i++) {\
676     if (cols[__i] >= __end) onz[row - __rstart]++; \
677     else if (cols[__i] >= row) dnz[row - __rstart]++;\
678   }\
679 }
680 
681 /*MC
682    MatPreallocFinalize - Ends the block of code that will count the number of nonzeros per
683        row in a matrix providing the data that one can use to correctly preallocate the matrix.
684 
685    Synopsis:
686    int MatPreallocateFinalize(int *dnz, int *onz)
687 
688    Collective on MPI_Comm
689 
690    Input Parameters:
691 +  dnz - the array that will be passed to the matrix preallocation routines
692 -  ozn - the other array passed to the matrix preallocation routines
693 
694 
695    Level: intermediate
696 
697    Notes:
698    See the chapter in the users manual on performance for more details
699 
700    Do not malloc or free dnz and onz that is handled internally by these routines
701 
702   Concepts: preallocation^Matrix
703 
704 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(),
705           MatPreallocateSymmetricInitialize(), MatPreallocateSymmetricSetLocal()
706 M*/
707 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
708 
709 
710 
711 /* Routines unique to particular data structures */
712 EXTERN int MatShellGetContext(Mat,void **);
713 
714 EXTERN int MatBDiagGetData(Mat,int*,int*,int*[],int*[],PetscScalar***);
715 EXTERN int MatSeqAIJSetColumnIndices(Mat,int[]);
716 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int[]);
717 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int[],int[],PetscScalar[],Mat*);
718 
719 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,const int[]);
720 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,const int[]);
721 EXTERN int MatSeqAIJSetPreallocation(Mat,int,const int[]);
722 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar[]);
723 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,const int[],PetscScalar*[]);
724 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar[]);
725 
726 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,const int[],int,const int[]);
727 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,const int[],int,const int[]);
728 EXTERN int MatMPIAIJSetPreallocation(Mat,int,const int[],int,const int[]);
729 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar[]);
730 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,const int[],PetscScalar*[]);
731 EXTERN int MatMPIAdjSetPreallocation(Mat,int[],int[],int[]);
732 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar[]);
733 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,const int[]);
734 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int*[]);
735 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int*[]);
736 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
737 
738 EXTERN int MatSeqDenseSetLDA(Mat,int);
739 
740 EXTERN int MatStoreValues(Mat);
741 EXTERN int MatRetrieveValues(Mat);
742 
743 EXTERN int MatDAADSetCtx(Mat,void*);
744 
745 /*
746   These routines are not usually accessed directly, rather solving is
747   done through the SLES, KSP and PC interfaces.
748 */
749 
750 /*E
751     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
752        with an optional dynamic library name, for example
753        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
754 
755    Level: beginner
756 
757 .seealso: MatGetOrdering()
758 E*/
759 typedef char* MatOrderingType;
760 #define MATORDERING_NATURAL   "natural"
761 #define MATORDERING_ND        "nd"
762 #define MATORDERING_1WD       "1wd"
763 #define MATORDERING_RCM       "rcm"
764 #define MATORDERING_QMD       "qmd"
765 #define MATORDERING_ROWLENGTH "rowlength"
766 #define MATORDERING_DSC_ND    "dsc_nd"
767 #define MATORDERING_DSC_MMD   "dsc_mmd"
768 #define MATORDERING_DSC_MDF   "dsc_mdf"
769 #define MATORDERING_CONSTRAINED "constrained"
770 #define MATORDERING_IDENTITY  "identity"
771 #define MATORDERING_REVERSE   "reverse"
772 
773 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
774 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
775 
776 /*MC
777    MatOrderingRegisterDynamic - Adds a new sparse matrix ordering to the
778                                matrix package.
779 
780    Synopsis:
781    int MatOrderingRegisterDynamic(char *name_ordering,char *path,char *name_create,int (*routine_create)(MatOrdering))
782 
783    Not Collective
784 
785    Input Parameters:
786 +  sname - name of ordering (for example MATORDERING_ND)
787 .  path - location of library where creation routine is
788 .  name - name of function that creates the ordering type,a string
789 -  function - function pointer that creates the ordering
790 
791    Level: developer
792 
793    If dynamic libraries are used, then the fourth input argument (function)
794    is ignored.
795 
796    Sample usage:
797 .vb
798    MatOrderingRegisterDynamic("my_order",/home/username/my_lib/lib/libO/solaris/mylib.a,
799                "MyOrder",MyOrder);
800 .ve
801 
802    Then, your partitioner can be chosen with the procedural interface via
803 $     MatOrderingSetType(part,"my_order)
804    or at runtime via the option
805 $     -pc_ilu_mat_ordering_type my_order
806 $     -pc_lu_mat_ordering_type my_order
807 
808    ${PETSC_ARCH} and ${BOPT} occuring in pathname will be replaced with appropriate values.
809 
810 .keywords: matrix, ordering, register
811 
812 .seealso: MatOrderingRegisterDestroy(), MatOrderingRegisterAll()
813 M*/
814 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
815 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
816 #else
817 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
818 #endif
819 
820 EXTERN int        MatOrderingRegisterDestroy(void);
821 EXTERN int        MatOrderingRegisterAll(char*);
822 extern PetscTruth MatOrderingRegisterAllCalled;
823 extern PetscFList MatOrderingList;
824 
825 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
826 
827 /*S
828    MatFactorInfo - Data based into the matrix factorization routines
829 
830    In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE
831 
832    Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC.
833 
834    Level: developer
835 
836 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor()
837 
838 S*/
839 typedef struct {
840   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
841   PetscReal     shift;          /* if true, shift until positive pivots */
842   PetscReal     shift_fraction; /* record shift fraction taken */
843   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
844   PetscReal     dt;             /* drop tolerance */
845   PetscReal     dtcol;          /* tolerance for pivoting */
846   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
847   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
848   PetscReal     levels;         /* ICC/ILU(levels) */
849   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
850                                    factorization may be faster if do not pivot */
851   PetscReal     zeropivot;      /* pivot is called zero if less than this */
852 } MatFactorInfo;
853 
854 EXTERN int MatCholeskyFactor(Mat,IS,MatFactorInfo*);
855 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*);
856 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
857 EXTERN int MatLUFactor(Mat,IS,IS,MatFactorInfo*);
858 EXTERN int MatILUFactor(Mat,IS,IS,MatFactorInfo*);
859 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*);
860 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*);
861 EXTERN int MatICCFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*);
862 EXTERN int MatICCFactor(Mat,IS,MatFactorInfo*);
863 EXTERN int MatLUFactorNumeric(Mat,Mat*);
864 EXTERN int MatILUDTFactor(Mat,MatFactorInfo*,IS,IS,Mat *);
865 EXTERN int MatGetInertia(Mat,int*,int*,int*);
866 EXTERN int MatSolve(Mat,Vec,Vec);
867 EXTERN int MatForwardSolve(Mat,Vec,Vec);
868 EXTERN int MatBackwardSolve(Mat,Vec,Vec);
869 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
870 EXTERN int MatSolveTranspose(Mat,Vec,Vec);
871 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
872 EXTERN int MatSolves(Mat,Vecs,Vecs);
873 
874 EXTERN int MatSetUnfactored(Mat);
875 
876 /*E
877     MatSORType - What type of (S)SOR to perform
878 
879     Level: beginner
880 
881    May be bitwise ORd together
882 
883    Any additions/changes here MUST also be made in include/finclude/petscmat.h
884 
885    MatSORType may be bitwise ORd together, so do not change the numbers
886 
887 .seealso: MatRelax()
888 E*/
889 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
890               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
891               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
892               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
893 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec);
894 
895 /*
896     These routines are for efficiently computing Jacobians via finite differences.
897 */
898 
899 /*E
900     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
901        with an optional dynamic library name, for example
902        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
903 
904    Level: beginner
905 
906 .seealso: MatGetColoring()
907 E*/
908 typedef char* MatColoringType;
909 #define MATCOLORING_NATURAL "natural"
910 #define MATCOLORING_SL      "sl"
911 #define MATCOLORING_LF      "lf"
912 #define MATCOLORING_ID      "id"
913 
914 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
915 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
916 
917 /*MC
918    MatColoringRegisterDynamic - Adds a new sparse matrix coloring to the
919                                matrix package.
920 
921    Synopsis:
922    int MatColoringRegisterDynamic(char *name_coloring,char *path,char *name_create,int (*routine_create)(MatColoring))
923 
924    Not Collective
925 
926    Input Parameters:
927 +  sname - name of Coloring (for example MATCOLORING_SL)
928 .  path - location of library where creation routine is
929 .  name - name of function that creates the Coloring type, a string
930 -  function - function pointer that creates the coloring
931 
932    Level: developer
933 
934    If dynamic libraries are used, then the fourth input argument (function)
935    is ignored.
936 
937    Sample usage:
938 .vb
939    MatColoringRegisterDynamic("my_color",/home/username/my_lib/lib/libO/solaris/mylib.a,
940                "MyColor",MyColor);
941 .ve
942 
943    Then, your partitioner can be chosen with the procedural interface via
944 $     MatColoringSetType(part,"my_color")
945    or at runtime via the option
946 $     -mat_coloring_type my_color
947 
948    $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
949 
950 .keywords: matrix, Coloring, register
951 
952 .seealso: MatColoringRegisterDestroy(), MatColoringRegisterAll()
953 M*/
954 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
955 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
956 #else
957 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
958 #endif
959 
960 EXTERN int        MatColoringRegisterAll(char *);
961 extern PetscTruth MatColoringRegisterAllCalled;
962 EXTERN int        MatColoringRegisterDestroy(void);
963 EXTERN int        MatColoringPatch(Mat,int,int,const ISColoringValue[],ISColoring*);
964 
965 /*S
966      MatFDColoring - Object for computing a sparse Jacobian via finite differences
967         and coloring
968 
969    Level: beginner
970 
971   Concepts: coloring, sparse Jacobian, finite differences
972 
973 .seealso:  MatFDColoringCreate()
974 S*/
975 typedef struct _p_MatFDColoring *MatFDColoring;
976 
977 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
978 EXTERN int MatFDColoringDestroy(MatFDColoring);
979 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
980 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
981 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
982 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
983 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
984 EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
985 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
986 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
987 EXTERN int MatFDColoringSetRecompute(MatFDColoring);
988 EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
989 EXTERN int MatFDColoringGetPerturbedColumns(MatFDColoring,int*,int*[]);
990 /*
991     These routines are for partitioning matrices: currently used only
992   for adjacency matrix, MatCreateMPIAdj().
993 */
994 
995 /*S
996      MatPartitioning - Object for managing the partitioning of a matrix or graph
997 
998    Level: beginner
999 
1000   Concepts: partitioning
1001 
1002 .seealso:  MatPartitioningCreate(), MatPartitioningType
1003 S*/
1004 typedef struct _p_MatPartitioning *MatPartitioning;
1005 
1006 /*E
1007     MatPartitioningType - String with the name of a PETSc matrix partitioning or the creation function
1008        with an optional dynamic library name, for example
1009        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
1010 
1011    Level: beginner
1012 
1013 .seealso: MatPartitioningCreate(), MatPartitioning
1014 E*/
1015 typedef char* MatPartitioningType;
1016 #define MAT_PARTITIONING_CURRENT  "current"
1017 #define MAT_PARTITIONING_PARMETIS "parmetis"
1018 
1019 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
1020 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
1021 EXTERN int MatPartitioningSetNParts(MatPartitioning,int);
1022 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
1023 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,const int[]);
1024 EXTERN int MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []);
1025 EXTERN int MatPartitioningApply(MatPartitioning,IS*);
1026 EXTERN int MatPartitioningDestroy(MatPartitioning);
1027 
1028 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
1029 
1030 /*MC
1031    MatPartitioningRegisterDynamic - Adds a new sparse matrix partitioning to the
1032    matrix package.
1033 
1034    Synopsis:
1035    int MatPartitioningRegisterDynamic(char *name_partitioning,char *path,char *name_create,int (*routine_create)(MatPartitioning))
1036 
1037    Not Collective
1038 
1039    Input Parameters:
1040 +  sname - name of partitioning (for example MAT_PARTITIONING_CURRENT) or parmetis
1041 .  path - location of library where creation routine is
1042 .  name - name of function that creates the partitioning type, a string
1043 -  function - function pointer that creates the partitioning type
1044 
1045    Level: developer
1046 
1047    If dynamic libraries are used, then the fourth input argument (function)
1048    is ignored.
1049 
1050    Sample usage:
1051 .vb
1052    MatPartitioningRegisterDynamic("my_part",/home/username/my_lib/lib/libO/solaris/mylib.a,
1053                "MyPartCreate",MyPartCreate);
1054 .ve
1055 
1056    Then, your partitioner can be chosen with the procedural interface via
1057 $     MatPartitioningSetType(part,"my_part")
1058    or at runtime via the option
1059 $     -mat_partitioning_type my_part
1060 
1061    $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
1062 
1063 .keywords: matrix, partitioning, register
1064 
1065 .seealso: MatPartitioningRegisterDestroy(), MatPartitioningRegisterAll()
1066 M*/
1067 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1068 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
1069 #else
1070 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
1071 #endif
1072 
1073 EXTERN int        MatPartitioningRegisterAll(char *);
1074 extern PetscTruth MatPartitioningRegisterAllCalled;
1075 EXTERN int        MatPartitioningRegisterDestroy(void);
1076 
1077 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
1078 EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
1079 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
1080 
1081 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
1082 
1083 /*
1084     If you add entries here you must also add them to finclude/petscmat.h
1085 */
1086 typedef enum { MATOP_SET_VALUES=0,
1087                MATOP_GET_ROW=1,
1088                MATOP_RESTORE_ROW=2,
1089                MATOP_MULT=3,
1090                MATOP_MULT_ADD=4,
1091                MATOP_MULT_TRANSPOSE=5,
1092                MATOP_MULT_TRANSPOSE_ADD=6,
1093                MATOP_SOLVE=7,
1094                MATOP_SOLVE_ADD=8,
1095                MATOP_SOLVE_TRANSPOSE=9,
1096                MATOP_SOLVE_TRANSPOSE_ADD=10,
1097                MATOP_LUFACTOR=11,
1098                MATOP_CHOLESKYFACTOR=12,
1099                MATOP_RELAX=13,
1100                MATOP_TRANSPOSE=14,
1101                MATOP_GETINFO=15,
1102                MATOP_EQUAL=16,
1103                MATOP_GET_DIAGONAL=17,
1104                MATOP_DIAGONAL_SCALE=18,
1105                MATOP_NORM=19,
1106                MATOP_ASSEMBLY_BEGIN=20,
1107                MATOP_ASSEMBLY_END=21,
1108                MATOP_COMPRESS=22,
1109                MATOP_SET_OPTION=23,
1110                MATOP_ZERO_ENTRIES=24,
1111                MATOP_ZERO_ROWS=25,
1112                MATOP_LUFACTOR_SYMBOLIC=26,
1113                MATOP_LUFACTOR_NUMERIC=27,
1114                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
1115                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
1116                MATOP_SETUP_PREALLOCATION=30,
1117                MATOP_ILUFACTOR_SYMBOLIC=31,
1118                MATOP_ICCFACTOR_SYMBOLIC=32,
1119                MATOP_GET_ARRAY=33,
1120                MATOP_RESTORE_ARRAY=34,
1121                MATOP_DUPLCIATE=35,
1122                MATOP_FORWARD_SOLVE=36,
1123                MATOP_BACKWARD_SOLVE=37,
1124                MATOP_ILUFACTOR=38,
1125                MATOP_ICCFACTOR=39,
1126                MATOP_AXPY=40,
1127                MATOP_GET_SUBMATRICES=41,
1128                MATOP_INCREASE_OVERLAP=42,
1129                MATOP_GET_VALUES=43,
1130                MATOP_COPY=44,
1131                MATOP_PRINT_HELP=45,
1132                MATOP_SCALE=46,
1133                MATOP_SHIFT=47,
1134                MATOP_DIAGONAL_SHIFT=48,
1135                MATOP_ILUDT_FACTOR=49,
1136                MATOP_GET_BLOCK_SIZE=50,
1137                MATOP_GET_ROW_IJ=51,
1138                MATOP_RESTORE_ROW_IJ=52,
1139                MATOP_GET_COLUMN_IJ=53,
1140                MATOP_RESTORE_COLUMN_IJ=54,
1141                MATOP_FDCOLORING_CREATE=55,
1142                MATOP_COLORING_PATCH=56,
1143                MATOP_SET_UNFACTORED=57,
1144                MATOP_PERMUTE=58,
1145                MATOP_SET_VALUES_BLOCKED=59,
1146                MATOP_GET_SUBMATRIX=60,
1147                MATOP_DESTROY=61,
1148                MATOP_VIEW=62,
1149                MATOP_GET_MAPS=63,
1150                MATOP_USE_SCALED_FORM=64,
1151                MATOP_SCALE_SYSTEM=65,
1152                MATOP_UNSCALE_SYSTEM=66,
1153                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
1154                MATOP_SET_VALUES_LOCAL=68,
1155                MATOP_ZERO_ROWS_LOCAL=69,
1156                MATOP_GET_ROW_MAX=70,
1157                MATOP_CONVERT=71,
1158                MATOP_SET_COLORING=72,
1159                MATOP_SET_VALUES_ADIC=73,
1160                MATOP_SET_VALUES_ADIFOR=74,
1161                MATOP_FD_COLORING_APPLY=75,
1162                MATOP_SET_FROM_OPTIONS=76,
1163                MATOP_MULT_CONSTRAINED=77,
1164                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
1165                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
1166                MATOP_PERMUTE_SPARSIFY=80,
1167                MATOP_MULT_MULTIPLE=81,
1168                MATOP_SOLVE_MULTIPLE=82
1169              } MatOperation;
1170 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
1171 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void));
1172 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void));
1173 EXTERN int MatShellSetContext(Mat,void*);
1174 
1175 /*
1176    Codes for matrices stored on disk. By default they are
1177  stored in a universal format. By changing the format with
1178  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
1179  be stored in a way natural for the matrix, for example dense matrices
1180  would be stored as dense. Matrices stored this way may only be
1181  read into matrices of the same time.
1182 */
1183 #define MATRIX_BINARY_FORMAT_DENSE -1
1184 
1185 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
1186 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
1187 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
1188 
1189 /*S
1190      MatNullSpace - Object that removes a null space from a vector, i.e.
1191          orthogonalizes the vector to a subsapce
1192 
1193    Level: advanced
1194 
1195   Concepts: matrix; linear operator, null space
1196 
1197   Users manual sections:
1198 .   sec_singular
1199 
1200 .seealso:  MatNullSpaceCreate()
1201 S*/
1202 typedef struct _p_MatNullSpace* MatNullSpace;
1203 
1204 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,const Vec[],MatNullSpace*);
1205 EXTERN int MatNullSpaceDestroy(MatNullSpace);
1206 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
1207 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
1208 EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
1209 
1210 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
1211 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
1212 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
1213 
1214 EXTERN int MatMatMult(Mat A,Mat B, Mat *C);
1215 EXTERN int MatMatMultSymbolic(Mat A,Mat B,Mat *C);
1216 EXTERN int MatMatMultNumeric(Mat A,Mat B,Mat C);
1217 
1218 EXTERN int MatCreateMAIJ(Mat,int,Mat*);
1219 EXTERN int MatMAIJRedimension(Mat,int,Mat*);
1220 EXTERN int MatMAIJGetAIJ(Mat,Mat*);
1221 
1222 EXTERN int MatComputeExplicitOperator(Mat,Mat*);
1223 
1224 EXTERN int MatESISetType(Mat,char*);
1225 EXTERN int MatESISetFromOptions(Mat);
1226 
1227 EXTERN int MatDiagonalScaleLocal(Mat,Vec);
1228 
1229 EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *);
1230 EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *);
1231 
1232 EXTERN int MatUseSpooles_SeqAIJ(Mat);
1233 EXTERN int MatUseUMFPACK_SeqAIJ(Mat);
1234 EXTERN int MatUseSuperLU_SeqAIJ(Mat);
1235 EXTERN int MatUseEssl_SeqAIJ(Mat);
1236 EXTERN int MatUseLUSOL_SeqAIJ(Mat);
1237 EXTERN int MatUseMatlab_SeqAIJ(Mat);
1238 EXTERN int MatUseDXML_SeqAIJ(Mat);
1239 EXTERN int MatUsePETSc_SeqAIJ(Mat);
1240 EXTERN int MatUseSuperLU_DIST_MPIAIJ(Mat);
1241 EXTERN int MatUseSpooles_MPIAIJ(Mat);
1242 EXTERN int MatUseSpooles_SeqSBAIJ(Mat);
1243 EXTERN int MatUseSpooles_MPISBAIJ(Mat);
1244 EXTERN int MatUseMUMPS_MPIAIJ(Mat);
1245 
1246 #endif
1247 
1248 
1249 
1250