xref: /petsc/include/petscmat.h (revision 3a7fca6b988f1faea172e46abdf950477dbfaf76)
1*3a7fca6bSBarry Smith /* $Id: petscmat.h,v 1.219 2001/04/10 22:35:01 balay Exp bsmith $ */
22eac72dbSBarry Smith /*
32eac72dbSBarry Smith      Include file for the matrix component of PETSc
42eac72dbSBarry Smith */
50a835dfdSSatish Balay #ifndef __PETSCMAT_H
60a835dfdSSatish Balay #define __PETSCMAT_H
70a835dfdSSatish Balay #include "petscvec.h"
82eac72dbSBarry Smith 
99cd28387SBarry Smith #define MAT_COOKIE         PETSC_COOKIE+5
10f0479e8cSBarry Smith 
11d9274352SBarry Smith /*S
12d9274352SBarry Smith      Mat - Abstract PETSc matrix object
132eac72dbSBarry Smith 
14d91e6319SBarry Smith    Level: beginner
15d91e6319SBarry Smith 
16d9274352SBarry Smith   Concepts: matrix; linear operator
17d9274352SBarry Smith 
18d9274352SBarry Smith .seealso:  MatCreate(), MatType, MatSetType()
19d9274352SBarry Smith S*/
20d9274352SBarry Smith typedef struct _p_Mat*           Mat;
21d9274352SBarry Smith 
22d9274352SBarry Smith /*E
23d9274352SBarry Smith     MatType - String with the name of a PETSc matrix or the creation function
24d9274352SBarry Smith        with an optional dynamic library name, for example
25d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
26d9274352SBarry Smith 
27d9274352SBarry Smith    Level: beginner
28d9274352SBarry Smith 
29d9274352SBarry Smith .seealso: MatSetType(), Mat
30d91e6319SBarry Smith E*/
31273d9f13SBarry Smith #define MATSAME     "same"
32273d9f13SBarry Smith #define MATSEQMAIJ  "seqmaij"
33273d9f13SBarry Smith #define MATMPIMAIJ  "mpimaij"
34273d9f13SBarry Smith #define MATIS       "is"
35273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs"
36273d9f13SBarry Smith #define MATSEQDENSE "seqdense"
37273d9f13SBarry Smith #define MATSEQAIJ   "seqaij"
38273d9f13SBarry Smith #define MATMPIAIJ   "mpiaij"
39273d9f13SBarry Smith #define MATSHELL    "shell"
40273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag"
41273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag"
42273d9f13SBarry Smith #define MATMPIDENSE "mpidense"
43273d9f13SBarry Smith #define MATSEQBAIJ  "seqbaij"
44273d9f13SBarry Smith #define MATMPIBAIJ  "mpibaij"
45273d9f13SBarry Smith #define MATMPIADJ   "mpiadj"
46273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij"
47273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij"
48*3a7fca6bSBarry Smith #define MATDAAD     "matdaad"
49273d9f13SBarry Smith typedef char* MatType;
50d91e6319SBarry Smith 
51273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
52273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
53273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
54273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
55273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
56273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
57273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
58273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
59273d9f13SBarry Smith #else
60273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
61273d9f13SBarry Smith #endif
62273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
63b0a32e0cSBarry Smith extern PetscFList MatList;
6428988994SBarry Smith 
65ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
66ca44d042SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
67ca44d042SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
68ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
69ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
70c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
71ca44d042SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
72ca44d042SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
73ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
74ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
75ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
76ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
77ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
78ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
79*3a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
80435da068SBarry Smith EXTERN int MatDestroy(Mat);
8121c89e3eSBarry Smith 
82ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
83ca44d042SBarry Smith EXTERN int MatGetMaps(Mat,Map*,Map*);
84ec0117caSBarry Smith 
858ed539a5SBarry Smith /* ------------------------------------------------------------*/
86ca44d042SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
87ca44d042SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode);
8884cb2905SBarry Smith 
892ef4de8bSBarry Smith /*S
902ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
912ef4de8bSBarry Smith         column of a matrix as index on an associated grid.
922ef4de8bSBarry Smith 
932ef4de8bSBarry Smith    Level: beginner
942ef4de8bSBarry Smith 
952ef4de8bSBarry Smith   Concepts: matrix; linear operator
962ef4de8bSBarry Smith 
972ef4de8bSBarry Smith .seealso:  MatSetValuesStencil(), MatSetStencil()
982ef4de8bSBarry Smith S*/
99435da068SBarry Smith typedef struct {
100435da068SBarry Smith   int k,j,i,c;
101435da068SBarry Smith } MatStencil;
1022ef4de8bSBarry Smith 
103435da068SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,Scalar*,InsertMode);
104435da068SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,Scalar*,InsertMode);
105435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int);
106435da068SBarry Smith 
107*3a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring);
108*3a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*);
109*3a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*);
110*3a7fca6bSBarry Smith 
111d91e6319SBarry Smith /*E
112d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
113d91e6319SBarry Smith      to continue to add values to it
114d91e6319SBarry Smith 
115d91e6319SBarry Smith     Level: beginner
116d91e6319SBarry Smith 
117d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
118d91e6319SBarry Smith E*/
1196d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
120ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
121ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
122ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
1234f9c727eSBarry Smith 
124b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
125d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
126b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
127b951964fSBarry Smith }
128ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
129d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
130ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
131ea06a074SBarry Smith }
132d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
133d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
134d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
135d91e6319SBarry Smith }
136d91e6319SBarry Smith /*E
137d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
138d91e6319SBarry Smith 
139d91e6319SBarry Smith     Level: beginner
140d91e6319SBarry Smith 
1410a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
142d91e6319SBarry Smith 
143d91e6319SBarry Smith .seealso: MatSetOption()
144d91e6319SBarry Smith E*/
1456d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1466d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1476d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1486ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1496ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1506ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1516ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1524787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1537c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1542bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
155f9d29acdSSatish Balay               MAT_DO_NOT_USE_INODES=82} MatOption;
156ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
157273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
15884cb2905SBarry Smith 
159ca44d042SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*);
160ca44d042SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**);
161ca44d042SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**);
162ca44d042SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**);
163ca44d042SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
164ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
165ca44d042SBarry Smith EXTERN int MatGetArray(Mat,Scalar **);
166ca44d042SBarry Smith EXTERN int MatRestoreArray(Mat,Scalar **);
167ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
1687b80b807SBarry Smith 
169ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
170ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
171ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
172ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
1732eac72dbSBarry Smith 
174d91e6319SBarry Smith /*E
175d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
176d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
177d91e6319SBarry Smith 
178d91e6319SBarry Smith     Level: beginner
179d91e6319SBarry Smith 
180d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
181d91e6319SBarry Smith 
182d91e6319SBarry Smith .seealso: MatDuplicate()
183d91e6319SBarry Smith E*/
1842e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
1852e8a6d31SBarry Smith 
186273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
187273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
188273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
189273d9f13SBarry Smith #else
190273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
191273d9f13SBarry Smith #endif
192273d9f13SBarry Smith EXTERN int        MatConvertRegisterAll(char*);
193273d9f13SBarry Smith EXTERN int        MatConvertRegisterDestroy(void);
194273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
195b0a32e0cSBarry Smith extern PetscFList MatConvertList;
196ca44d042SBarry Smith EXTERN int        MatConvert(Mat,MatType,Mat*);
197ca44d042SBarry Smith EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
19894a9d846SBarry Smith 
199d91e6319SBarry Smith /*E
200d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
201d91e6319SBarry Smith 
202d91e6319SBarry Smith     Level: beginner
203d91e6319SBarry Smith 
204d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
205d91e6319SBarry Smith 
206d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
207d91e6319SBarry Smith E*/
208cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
209cb5b572fSBarry Smith 
210ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
211b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
212273d9f13SBarry Smith 
213b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
214273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
215273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
216273d9f13SBarry Smith #else
217273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
218273d9f13SBarry Smith #endif
219273d9f13SBarry Smith EXTERN int        MatLoadRegisterAll(char*);
220273d9f13SBarry Smith EXTERN int        MatLoadRegisterDestroy(void);
221273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
222b0a32e0cSBarry Smith extern PetscFList MatLoadList;
223b0a32e0cSBarry Smith EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
2247b80b807SBarry Smith 
225ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
226ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
227ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
228ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
229d4fbbf0eSBarry Smith 
230d91e6319SBarry Smith /*S
231d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
232d91e6319SBarry Smith 
233d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
234d91e6319SBarry Smith 
235d91e6319SBarry Smith    Level: intermediate
236d91e6319SBarry Smith 
237d91e6319SBarry Smith   Concepts: matrix^nonzero information
238d91e6319SBarry Smith 
239d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
240d91e6319SBarry Smith S*/
2414e220ebcSLois Curfman McInnes typedef struct {
242b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
243b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
244b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
245b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
246b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
247b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
248b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
249b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
250b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2514e220ebcSLois Curfman McInnes } MatInfo;
2524e220ebcSLois Curfman McInnes 
253d9274352SBarry Smith /*E
254d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
255d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
256d9274352SBarry Smith 
257d9274352SBarry Smith     Level: beginner
258d9274352SBarry Smith 
259d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
260d9274352SBarry Smith 
261d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
262d9274352SBarry Smith E*/
2637b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
264ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
265ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
266ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
267273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
268ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
269ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
270ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
27106ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
272ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
2737b80b807SBarry Smith 
274ca44d042SBarry Smith EXTERN int MatNorm(Mat,NormType,double *);
275ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
276ca44d042SBarry Smith EXTERN int MatZeroRows(Mat,IS,Scalar*);
277ca44d042SBarry Smith EXTERN int MatZeroColumns(Mat,IS,Scalar*);
2787b80b807SBarry Smith 
279ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
280ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
281ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
2825ef9f2a5SBarry Smith 
283ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
284ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
285ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
2867b80b807SBarry Smith 
287d91e6319SBarry Smith /*E
288d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
289d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
290d91e6319SBarry Smith 
291d91e6319SBarry Smith     Level: beginner
292d91e6319SBarry Smith 
293d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
294d91e6319SBarry Smith 
295d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
296d91e6319SBarry Smith E*/
2977b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
298ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
299ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
300ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
3018efafbd8SBarry Smith 
302ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
3037b80b807SBarry Smith 
304ca44d042SBarry Smith EXTERN int MatAXPY(Scalar *,Mat,Mat);
305ca44d042SBarry Smith EXTERN int MatAYPX(Scalar *,Mat,Mat);
306ca44d042SBarry Smith EXTERN int MatCompress(Mat);
3077b80b807SBarry Smith 
308ca44d042SBarry Smith EXTERN int MatScale(Scalar *,Mat);
309ca44d042SBarry Smith EXTERN int MatShift(Scalar *,Mat);
310052efed2SBarry Smith 
311ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
312ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
313ca44d042SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*);
314ca44d042SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
315ca44d042SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
31690f02eecSBarry Smith 
317ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
318649db694SBarry Smith 
319ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
320ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
321ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
3227c922b88SBarry Smith 
3237c922b88SBarry Smith /*
324c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
3257c922b88SBarry Smith */
326c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
3277c922b88SBarry Smith { \
3287c922b88SBarry Smith   int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
32982502324SSatish Balay   __ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(__ierr);onz = dnz + __tmp;\
3307c922b88SBarry Smith   __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\
3317c922b88SBarry Smith   __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\
3327c922b88SBarry Smith   __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp;
3337c922b88SBarry Smith 
334c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
335c4f061fbSSatish Balay {\
336c4f061fbSSatish Balay   int __l;\
337c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\
338c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\
339c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
340435da068SBarry Smith     __ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\
341c4f061fbSSatish Balay   }\
342c4f061fbSSatish Balay }
343c4f061fbSSatish Balay 
344c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3457c922b88SBarry Smith { int __i; \
3467c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3477c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3487c922b88SBarry Smith   }\
3497c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3507c922b88SBarry Smith }
3517c922b88SBarry Smith 
352c4f061fbSSatish Balay #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);}
3537c922b88SBarry Smith 
3547b80b807SBarry Smith /* Routines unique to particular data structures */
355435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
356435da068SBarry Smith 
357ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
358ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
359ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
360ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
3617b80b807SBarry Smith 
362273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
363273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
364273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
365273d9f13SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,Scalar*);
366273d9f13SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
367273d9f13SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*);
368273d9f13SBarry Smith 
369273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
370273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
371273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
372273d9f13SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,Scalar*);
373273d9f13SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
374273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
375273d9f13SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*);
376273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
377435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
378435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
379*3a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
380273d9f13SBarry Smith 
381ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
382ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
3832e8a6d31SBarry Smith 
384*3a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*);
385*3a7fca6bSBarry Smith 
3867b80b807SBarry Smith /*
3877b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
3887b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
3897b80b807SBarry Smith */
3907b80b807SBarry Smith 
391d9274352SBarry Smith /*E
392d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
393d9274352SBarry Smith        with an optional dynamic library name, for example
394d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
395d9274352SBarry Smith 
396d9274352SBarry Smith    Level: beginner
397d9274352SBarry Smith 
398d9274352SBarry Smith .seealso: MatGetOrdering()
399d9274352SBarry Smith E*/
400b12f92e5SBarry Smith typedef char* MatOrderingType;
401b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
402b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
403b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
404b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
405b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
406b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
40762152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
40862152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
40962152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
410b12f92e5SBarry Smith 
411ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
412ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
413aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
414f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
415b12f92e5SBarry Smith #else
416f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
417b12f92e5SBarry Smith #endif
418ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
419ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
4202bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
421b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
422d4fbbf0eSBarry Smith 
423ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
424a2ce50c7SBarry Smith 
425ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double);
426ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
427ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
428a2ce50c7SBarry Smith 
429d91e6319SBarry Smith /*S
430d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
4315ef9f2a5SBarry Smith 
432d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
43314822f30SBarry Smith 
434d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
435d91e6319SBarry Smith           All entries are double precision.
436d91e6319SBarry Smith 
437d91e6319SBarry Smith    Level: developer
438d91e6319SBarry Smith 
439d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
440d91e6319SBarry Smith 
441d91e6319SBarry Smith S*/
4425ef9f2a5SBarry Smith typedef struct {
4435ef9f2a5SBarry Smith   double     levels;         /* ILU(levels) */
4445ef9f2a5SBarry Smith   double     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
4455ef9f2a5SBarry Smith   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
44636db0b34SBarry Smith   double     dt;             /* drop tolerance */
44736db0b34SBarry Smith   double     dtcol;          /* tolerance for pivoting */
44836db0b34SBarry Smith   double     dtcount;        /* maximum nonzeros to be allowed per row */
449d91e6319SBarry Smith   double     damping;        /* scaling of identity added to matrix to prevent zero pivots */
450d91e6319SBarry Smith   double     damp;           /* if is 1.0 and factorization fails, damp until successful */
4515ef9f2a5SBarry Smith } MatILUInfo;
4525ef9f2a5SBarry Smith 
453d91e6319SBarry Smith /*S
454d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
455d91e6319SBarry Smith 
456d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
457d91e6319SBarry Smith 
458d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
459d91e6319SBarry Smith           All entries are double precision.
460d91e6319SBarry Smith 
461d91e6319SBarry Smith    Level: developer
462d91e6319SBarry Smith 
463d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
464d91e6319SBarry Smith 
465d91e6319SBarry Smith S*/
46614822f30SBarry Smith typedef struct {
46714822f30SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
46814822f30SBarry Smith   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
469d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
470d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
47114822f30SBarry Smith } MatLUInfo;
47214822f30SBarry Smith 
473d91e6319SBarry Smith /*S
474d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
475d91e6319SBarry Smith 
476d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
477d91e6319SBarry Smith 
478d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
479d91e6319SBarry Smith           All entries are double precision.
480d91e6319SBarry Smith 
481d91e6319SBarry Smith    Level: developer
482d91e6319SBarry Smith 
483d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
484d91e6319SBarry Smith 
485d91e6319SBarry Smith S*/
486ffa6d0a5SLois Curfman McInnes typedef struct {
487ffa6d0a5SLois Curfman McInnes   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
488d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
489d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
490ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
491ffa6d0a5SLois Curfman McInnes 
49214822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
493ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
49414822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
495ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
4964d101231SSatish Balay EXTERN int MatICCFactorSymbolic(Mat,IS,double,int,Mat*);
4974d101231SSatish Balay EXTERN int MatICCFactor(Mat,IS,double,int);
498ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
499ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
500a2ce50c7SBarry Smith 
501ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
502ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
503ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
504ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
505ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
506ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
5078ed539a5SBarry Smith 
508ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
509bb5a7306SBarry Smith 
510bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
511d91e6319SBarry Smith /*E
512d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
513bb1eb677SSatish Balay 
514d91e6319SBarry Smith     Level: beginner
515d91e6319SBarry Smith 
516d9274352SBarry Smith    May be bitwise ORd together
517d9274352SBarry Smith 
518d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
519d91e6319SBarry Smith 
520d91e6319SBarry Smith .seealso: MatRelax()
521d91e6319SBarry Smith E*/
522ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
523ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
524ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
52584cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
526ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
5278ed539a5SBarry Smith 
528d4fbbf0eSBarry Smith /*
529639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
530639f9d9dSBarry Smith */
531b12f92e5SBarry Smith 
532d9274352SBarry Smith /*E
533d9274352SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
534d9274352SBarry Smith        with an optional dynamic library name, for example
535d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
536d9274352SBarry Smith 
537d9274352SBarry Smith    Level: beginner
538d9274352SBarry Smith 
539d9274352SBarry Smith .seealso: MatGetColoring()
540d9274352SBarry Smith E*/
541b12f92e5SBarry Smith typedef char* MatColoringType;
542b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
543b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
544b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
545b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
546b12f92e5SBarry Smith 
547ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
548ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
549aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
550f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
551b12f92e5SBarry Smith #else
552f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
553b12f92e5SBarry Smith #endif
554ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
5552bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
556ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
557b9617806SBarry Smith EXTERN int        MatColoringPatch(Mat,int,int,int *,ISColoring*);
558639f9d9dSBarry Smith 
5591a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
560d9274352SBarry Smith /*S
561d9274352SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences
562d9274352SBarry Smith         and coloring
563639f9d9dSBarry Smith 
564d9274352SBarry Smith    Level: beginner
565d9274352SBarry Smith 
566d9274352SBarry Smith   Concepts: coloring, sparse Jacobian, finite differences
567d9274352SBarry Smith 
568d9274352SBarry Smith .seealso:  MatFDColoringCreate()
569d9274352SBarry Smith S*/
570e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
571639f9d9dSBarry Smith 
572ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
573ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
574b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
575ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
576ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
577ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
578ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
579ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
580ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
581ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
58262152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring);
583*3a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
584639f9d9dSBarry Smith 
585639f9d9dSBarry Smith /*
5860752156aSBarry Smith     These routines are for partitioning matrices: currently used only
5873eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
5880752156aSBarry Smith */
58991e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
590ca161407SBarry Smith 
591d9274352SBarry Smith /*S
592d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
593d9274352SBarry Smith 
594d9274352SBarry Smith    Level: beginner
595d9274352SBarry Smith 
596d9274352SBarry Smith   Concepts: partitioning
597d9274352SBarry Smith 
598d9274352SBarry Smith .seealso:  MatParitioningCreate(), MatPartitioningType
599d9274352SBarry Smith S*/
60091e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
601d9274352SBarry Smith 
602d9274352SBarry Smith /*E
603d9274352SBarry Smith     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
604d9274352SBarry Smith        with an optional dynamic library name, for example
605d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
606d9274352SBarry Smith 
607d9274352SBarry Smith    Level: beginner
608d9274352SBarry Smith 
609d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning
610d9274352SBarry Smith E*/
6112aabb6bbSBarry Smith typedef char* MatPartitioningType;
6122aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
6132aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
614ca161407SBarry Smith 
615ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
616ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
617ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
618ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
619ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
620ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
6212aabb6bbSBarry Smith 
622ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
623aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
624f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
6252aabb6bbSBarry Smith #else
626f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
6272aabb6bbSBarry Smith #endif
6282aabb6bbSBarry Smith 
629ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
6302bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
631ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
6322bad1931SBarry Smith 
633b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
634ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
635ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
636ca161407SBarry Smith 
637ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
6380752156aSBarry Smith 
6390752156aSBarry Smith /*
6400a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
641d4fbbf0eSBarry Smith */
6421c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
6431c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
6441c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
6451c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
6461c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
6477c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
6487c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
6491c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
6501c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
6517c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
6527c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
6531c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
6541c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
6551c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
6561c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
6571c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
6581c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
6591c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
6601c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
6611c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
6621c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
6631c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
6641c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
6651c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
6661c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
6671c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
6681c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
6691c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
6701c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
6711c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
6721c1c02c0SLois Curfman McInnes                MATOP_GET_SIZE=30,
6731c1c02c0SLois Curfman McInnes                MATOP_GET_LOCAL_SIZE=31,
6741c1c02c0SLois Curfman McInnes                MATOP_GET_OWNERSHIP_RANGE=32,
6751c1c02c0SLois Curfman McInnes                MATOP_ILUFACTOR_SYMBOLIC=33,
6764d101231SSatish Balay                MATOP_ICCFACTOR_SYMBOLIC=34,
6771c1c02c0SLois Curfman McInnes                MATOP_GET_ARRAY=35,
6781c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ARRAY=36,
6797bf97ca4SSatish Balay 
680005c665bSBarry Smith                MATOP_CONVERT_SAME_TYPE=37,
681005c665bSBarry Smith                MATOP_FORWARD_SOLVE=38,
682005c665bSBarry Smith                MATOP_BACKWARD_SOLVE=39,
683005c665bSBarry Smith                MATOP_ILUFACTOR=40,
6844d101231SSatish Balay                MATOP_ICCFACTOR=41,
685005c665bSBarry Smith                MATOP_AXPY=42,
686005c665bSBarry Smith                MATOP_GET_SUBMATRICES=43,
687005c665bSBarry Smith                MATOP_INCREASE_OVERLAP=44,
688005c665bSBarry Smith                MATOP_GET_VALUES=45,
689005c665bSBarry Smith                MATOP_COPY=46,
690005c665bSBarry Smith                MATOP_PRINT_HELP=47,
691005c665bSBarry Smith                MATOP_SCALE=48,
692005c665bSBarry Smith                MATOP_SHIFT=49,
693005c665bSBarry Smith                MATOP_DIAGONAL_SHIFT=50,
694005c665bSBarry Smith                MATOP_ILUDT_FACTOR=51,
695005c665bSBarry Smith                MATOP_GET_BLOCK_SIZE=52,
696005c665bSBarry Smith                MATOP_GET_ROW_IJ=53,
697005c665bSBarry Smith                MATOP_RESTORE_ROW_IJ=54,
698005c665bSBarry Smith                MATOP_GET_COLUMN_IJ=55,
699005c665bSBarry Smith                MATOP_RESTORE_COLUMN_IJ=56,
700005c665bSBarry Smith                MATOP_FDCOLORING_CREATE=57,
701005c665bSBarry Smith                MATOP_COLORING_PATCH=58,
702005c665bSBarry Smith                MATOP_SET_UNFACTORED=59,
703005c665bSBarry Smith                MATOP_PERMUTE=60,
704005c665bSBarry Smith                MATOP_SET_VALUES_BLOCKED=61,
7051c1c02c0SLois Curfman McInnes                MATOP_DESTROY=250,
7061c1c02c0SLois Curfman McInnes                MATOP_VIEW=251
707fae171e0SBarry Smith              } MatOperation;
708ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
70937bd1cefSSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)());
71037bd1cefSSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)());
711273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
712112a2221SBarry Smith 
71390ace30eSBarry Smith /*
71490ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
71590ace30eSBarry Smith  stored in a universal format. By changing the format with
716fb9695e5SSatish Balay  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
71790ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
71890ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
71990ace30eSBarry Smith  read into matrices of the same time.
72090ace30eSBarry Smith */
72190ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
72290ace30eSBarry Smith 
7233f1d51d7SBarry Smith /*
7243f1d51d7SBarry Smith      New matrix classes not yet distributed
7253f1d51d7SBarry Smith */
7263f1d51d7SBarry Smith /*
7273f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
7283f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
7293f1d51d7SBarry Smith   the same MatAIJIndices.
7303f1d51d7SBarry Smith */
731e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
7323f1d51d7SBarry Smith 
733ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
734ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
735ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
736ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
737ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
738ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
739ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
740ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
741ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
7423f1d51d7SBarry Smith 
743ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
744ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
745ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
7463f1d51d7SBarry Smith 
747ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
748ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
749ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
7503f1d51d7SBarry Smith 
7516d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
752ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
75308918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
754860d1616SSatish Balay 
755d9274352SBarry Smith /*S
756d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
757d9274352SBarry Smith          orthogonalizes the vector to a subsapce
758d9274352SBarry Smith 
759d9274352SBarry Smith    Level: beginner
760d9274352SBarry Smith 
761d9274352SBarry Smith   Concepts: matrix; linear operator, null space
762d9274352SBarry Smith 
763d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
764d9274352SBarry Smith S*/
76574637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
766d9274352SBarry Smith 
76774637425SBarry Smith #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
76874637425SBarry Smith 
76974637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
77074637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
77174637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
77274637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
77374637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
77474637425SBarry Smith 
775273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
776273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
777273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
778273d9f13SBarry Smith 
7793f1d51d7SBarry Smith 
780f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
781c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
782c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
783c4f061fbSSatish Balay 
784273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
785f069c275SSatish Balay 
786b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
787b0a32e0cSBarry Smith 
7882eac72dbSBarry Smith #endif
7892eac72dbSBarry Smith 
7902eac72dbSBarry Smith 
7919d00d63dSBarry Smith 
792