xref: /petsc/include/petscmat.h (revision 435da068ed131cbb9cf235815d431601925f48e7)
1*435da068SBarry Smith /* $Id: petscmat.h,v 1.214 2001/01/20 23:57:52 bsmith 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"
48273d9f13SBarry Smith typedef char* MatType;
49d91e6319SBarry Smith 
50273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
51273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
52273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
53273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
54273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
55273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
56273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
57273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
58273d9f13SBarry Smith #else
59273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
60273d9f13SBarry Smith #endif
61273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
62b0a32e0cSBarry Smith extern PetscFList MatList;
6328988994SBarry Smith 
64ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
65ca44d042SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
66ca44d042SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
67ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
68ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
69c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
70ca44d042SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
71ca44d042SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
72ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
73ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
74ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
75ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
76ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
77ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
78*435da068SBarry Smith EXTERN int MatDestroy(Mat);
7921c89e3eSBarry Smith 
80ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
81ca44d042SBarry Smith EXTERN int MatGetMaps(Mat,Map*,Map*);
82ec0117caSBarry Smith 
838ed539a5SBarry Smith /* ------------------------------------------------------------*/
84ca44d042SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
85ca44d042SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode);
8684cb2905SBarry Smith 
87*435da068SBarry Smith typedef struct {
88*435da068SBarry Smith   int k,j,i,c;
89*435da068SBarry Smith } MatStencil;
90*435da068SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,Scalar*,InsertMode);
91*435da068SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,Scalar*,InsertMode);
92*435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int);
93*435da068SBarry Smith 
94d91e6319SBarry Smith /*E
95d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
96d91e6319SBarry Smith      to continue to add values to it
97d91e6319SBarry Smith 
98d91e6319SBarry Smith     Level: beginner
99d91e6319SBarry Smith 
100d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
101d91e6319SBarry Smith E*/
1026d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
103ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
104ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
105ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
1064f9c727eSBarry Smith 
107b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
108d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
109b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
110b951964fSBarry Smith }
111ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
112d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
113ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
114ea06a074SBarry Smith }
115d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
116d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
117d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
118d91e6319SBarry Smith }
119d91e6319SBarry Smith /*E
120d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
121d91e6319SBarry Smith 
122d91e6319SBarry Smith     Level: beginner
123d91e6319SBarry Smith 
1240a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
125d91e6319SBarry Smith 
126d91e6319SBarry Smith .seealso: MatSetOption()
127d91e6319SBarry Smith E*/
1286d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1296d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1306d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1316ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1326ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1336ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1346ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1354787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1367c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1372bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
138f9d29acdSSatish Balay               MAT_DO_NOT_USE_INODES=82} MatOption;
139ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
140273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
14184cb2905SBarry Smith 
142ca44d042SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*);
143ca44d042SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**);
144ca44d042SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**);
145ca44d042SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**);
146ca44d042SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
147ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
148ca44d042SBarry Smith EXTERN int MatGetArray(Mat,Scalar **);
149ca44d042SBarry Smith EXTERN int MatRestoreArray(Mat,Scalar **);
150ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
1517b80b807SBarry Smith 
152ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
153ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
154ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
155ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
1562eac72dbSBarry Smith 
157d91e6319SBarry Smith /*E
158d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
159d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
160d91e6319SBarry Smith 
161d91e6319SBarry Smith     Level: beginner
162d91e6319SBarry Smith 
163d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
164d91e6319SBarry Smith 
165d91e6319SBarry Smith .seealso: MatDuplicate()
166d91e6319SBarry Smith E*/
1672e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
1682e8a6d31SBarry Smith 
169273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
170273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
171273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
172273d9f13SBarry Smith #else
173273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
174273d9f13SBarry Smith #endif
175273d9f13SBarry Smith EXTERN int        MatConvertRegisterAll(char*);
176273d9f13SBarry Smith EXTERN int        MatConvertRegisterDestroy(void);
177273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
178b0a32e0cSBarry Smith extern PetscFList MatConvertList;
179ca44d042SBarry Smith EXTERN int        MatConvert(Mat,MatType,Mat*);
180ca44d042SBarry Smith EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
18194a9d846SBarry Smith 
182d91e6319SBarry Smith /*E
183d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
184d91e6319SBarry Smith 
185d91e6319SBarry Smith     Level: beginner
186d91e6319SBarry Smith 
187d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
188d91e6319SBarry Smith 
189d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
190d91e6319SBarry Smith E*/
191cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
192cb5b572fSBarry Smith 
193ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
194b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
195273d9f13SBarry Smith 
196b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
197273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
198273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
199273d9f13SBarry Smith #else
200273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
201273d9f13SBarry Smith #endif
202273d9f13SBarry Smith EXTERN int        MatLoadRegisterAll(char*);
203273d9f13SBarry Smith EXTERN int        MatLoadRegisterDestroy(void);
204273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
205b0a32e0cSBarry Smith extern PetscFList MatLoadList;
206b0a32e0cSBarry Smith EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
2077b80b807SBarry Smith 
208ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
209ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
210ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
211ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
212d4fbbf0eSBarry Smith 
213d91e6319SBarry Smith /*S
214d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
215d91e6319SBarry Smith 
216d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
217d91e6319SBarry Smith 
218d91e6319SBarry Smith    Level: intermediate
219d91e6319SBarry Smith 
220d91e6319SBarry Smith   Concepts: matrix^nonzero information
221d91e6319SBarry Smith 
222d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
223d91e6319SBarry Smith S*/
2244e220ebcSLois Curfman McInnes typedef struct {
225b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
226b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
227b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
228b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
229b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
230b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
231b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
232b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
233b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2344e220ebcSLois Curfman McInnes } MatInfo;
2354e220ebcSLois Curfman McInnes 
236d9274352SBarry Smith /*E
237d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
238d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
239d9274352SBarry Smith 
240d9274352SBarry Smith     Level: beginner
241d9274352SBarry Smith 
242d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
243d9274352SBarry Smith 
244d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
245d9274352SBarry Smith E*/
2467b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
247ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
248ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
249ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
250273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
251ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
252ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
253ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
25406ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
255ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
2567b80b807SBarry Smith 
257ca44d042SBarry Smith EXTERN int MatNorm(Mat,NormType,double *);
258ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
259ca44d042SBarry Smith EXTERN int MatZeroRows(Mat,IS,Scalar*);
260ca44d042SBarry Smith EXTERN int MatZeroColumns(Mat,IS,Scalar*);
2617b80b807SBarry Smith 
262ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
263ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
264ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
2655ef9f2a5SBarry Smith 
266ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
267ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
268ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
2697b80b807SBarry Smith 
270d91e6319SBarry Smith /*E
271d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
272d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
273d91e6319SBarry Smith 
274d91e6319SBarry Smith     Level: beginner
275d91e6319SBarry Smith 
276d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
277d91e6319SBarry Smith 
278d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
279d91e6319SBarry Smith E*/
2807b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
281ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
282ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
283ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
2848efafbd8SBarry Smith 
285ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
2867b80b807SBarry Smith 
287ca44d042SBarry Smith EXTERN int MatAXPY(Scalar *,Mat,Mat);
288ca44d042SBarry Smith EXTERN int MatAYPX(Scalar *,Mat,Mat);
289ca44d042SBarry Smith EXTERN int MatCompress(Mat);
2907b80b807SBarry Smith 
291ca44d042SBarry Smith EXTERN int MatScale(Scalar *,Mat);
292ca44d042SBarry Smith EXTERN int MatShift(Scalar *,Mat);
293052efed2SBarry Smith 
294ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
295ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
296ca44d042SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*);
297ca44d042SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
298ca44d042SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
29990f02eecSBarry Smith 
300ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
301649db694SBarry Smith 
302ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
303ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
304ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
3057c922b88SBarry Smith 
3067c922b88SBarry Smith /*
307c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
3087c922b88SBarry Smith */
309c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
3107c922b88SBarry Smith { \
3117c922b88SBarry Smith   int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
31282502324SSatish Balay   __ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(__ierr);onz = dnz + __tmp;\
3137c922b88SBarry Smith   __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\
3147c922b88SBarry Smith   __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\
3157c922b88SBarry Smith   __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp;
3167c922b88SBarry Smith 
317c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
318c4f061fbSSatish Balay {\
319c4f061fbSSatish Balay   int __l;\
320c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\
321c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\
322c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
323*435da068SBarry Smith     __ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\
324c4f061fbSSatish Balay   }\
325c4f061fbSSatish Balay }
326c4f061fbSSatish Balay 
327c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3287c922b88SBarry Smith { int __i; \
3297c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3307c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3317c922b88SBarry Smith   }\
3327c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3337c922b88SBarry Smith }
3347c922b88SBarry Smith 
335c4f061fbSSatish Balay #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);}
3367c922b88SBarry Smith 
3377b80b807SBarry Smith /* Routines unique to particular data structures */
338*435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
339*435da068SBarry Smith 
340ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
341ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
342ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
343ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
3447b80b807SBarry Smith 
345273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
346273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
347273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
348273d9f13SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,Scalar*);
349273d9f13SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
350273d9f13SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*);
351273d9f13SBarry Smith 
352273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
353273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
354273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
355273d9f13SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,Scalar*);
356273d9f13SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
357273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
358273d9f13SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*);
359273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
360*435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
361*435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
362273d9f13SBarry Smith 
363ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
364ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
3652e8a6d31SBarry Smith 
3667b80b807SBarry Smith /*
3677b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
3687b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
3697b80b807SBarry Smith */
3707b80b807SBarry Smith 
371d9274352SBarry Smith /*E
372d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
373d9274352SBarry Smith        with an optional dynamic library name, for example
374d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
375d9274352SBarry Smith 
376d9274352SBarry Smith    Level: beginner
377d9274352SBarry Smith 
378d9274352SBarry Smith .seealso: MatGetOrdering()
379d9274352SBarry Smith E*/
380b12f92e5SBarry Smith typedef char* MatOrderingType;
381b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
382b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
383b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
384b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
385b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
386b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
38762152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
38862152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
38962152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
390b12f92e5SBarry Smith 
391ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
392ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
393aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
394f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
395b12f92e5SBarry Smith #else
396f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
397b12f92e5SBarry Smith #endif
398ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
399ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
4002bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
401b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
402d4fbbf0eSBarry Smith 
403ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
404a2ce50c7SBarry Smith 
405ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double);
406ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
407ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
408a2ce50c7SBarry Smith 
409d91e6319SBarry Smith /*S
410d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
4115ef9f2a5SBarry Smith 
412d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
41314822f30SBarry Smith 
414d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
415d91e6319SBarry Smith           All entries are double precision.
416d91e6319SBarry Smith 
417d91e6319SBarry Smith    Level: developer
418d91e6319SBarry Smith 
419d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
420d91e6319SBarry Smith 
421d91e6319SBarry Smith S*/
4225ef9f2a5SBarry Smith typedef struct {
4235ef9f2a5SBarry Smith   double     levels;         /* ILU(levels) */
4245ef9f2a5SBarry Smith   double     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
4255ef9f2a5SBarry Smith   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
42636db0b34SBarry Smith   double     dt;             /* drop tolerance */
42736db0b34SBarry Smith   double     dtcol;          /* tolerance for pivoting */
42836db0b34SBarry Smith   double     dtcount;        /* maximum nonzeros to be allowed per row */
429d91e6319SBarry Smith   double     damping;        /* scaling of identity added to matrix to prevent zero pivots */
430d91e6319SBarry Smith   double     damp;           /* if is 1.0 and factorization fails, damp until successful */
4315ef9f2a5SBarry Smith } MatILUInfo;
4325ef9f2a5SBarry Smith 
433d91e6319SBarry Smith /*S
434d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
435d91e6319SBarry Smith 
436d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
437d91e6319SBarry Smith 
438d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
439d91e6319SBarry Smith           All entries are double precision.
440d91e6319SBarry Smith 
441d91e6319SBarry Smith    Level: developer
442d91e6319SBarry Smith 
443d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
444d91e6319SBarry Smith 
445d91e6319SBarry Smith S*/
44614822f30SBarry Smith typedef struct {
44714822f30SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
44814822f30SBarry Smith   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
449d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
450d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
45114822f30SBarry Smith } MatLUInfo;
45214822f30SBarry Smith 
453d91e6319SBarry Smith /*S
454d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
455d91e6319SBarry Smith 
456d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
457d91e6319SBarry Smith 
458d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
459d91e6319SBarry Smith           All entries are double precision.
460d91e6319SBarry Smith 
461d91e6319SBarry Smith    Level: developer
462d91e6319SBarry Smith 
463d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
464d91e6319SBarry Smith 
465d91e6319SBarry Smith S*/
466ffa6d0a5SLois Curfman McInnes typedef struct {
467ffa6d0a5SLois Curfman McInnes   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
468d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
469d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
470ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
471ffa6d0a5SLois Curfman McInnes 
47214822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
473ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
47414822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
475ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
476ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
47774637425SBarry Smith EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int);
478ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
479ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
480a2ce50c7SBarry Smith 
481ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
482ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
483ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
484ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
485ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
486ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
4878ed539a5SBarry Smith 
488ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
489bb5a7306SBarry Smith 
490bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
491d91e6319SBarry Smith /*E
492d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
493bb1eb677SSatish Balay 
494d91e6319SBarry Smith     Level: beginner
495d91e6319SBarry Smith 
496d9274352SBarry Smith    May be bitwise ORd together
497d9274352SBarry Smith 
498d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
499d91e6319SBarry Smith 
500d91e6319SBarry Smith .seealso: MatRelax()
501d91e6319SBarry Smith E*/
502ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
503ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
504ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
50584cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
506ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
5078ed539a5SBarry Smith 
508d4fbbf0eSBarry Smith /*
509639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
510639f9d9dSBarry Smith */
511b12f92e5SBarry Smith 
512d9274352SBarry Smith /*E
513d9274352SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
514d9274352SBarry Smith        with an optional dynamic library name, for example
515d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
516d9274352SBarry Smith 
517d9274352SBarry Smith    Level: beginner
518d9274352SBarry Smith 
519d9274352SBarry Smith .seealso: MatGetColoring()
520d9274352SBarry Smith E*/
521b12f92e5SBarry Smith typedef char* MatColoringType;
522b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
523b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
524b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
525b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
526b12f92e5SBarry Smith 
527ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
528ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
529aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
530f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
531b12f92e5SBarry Smith #else
532f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
533b12f92e5SBarry Smith #endif
534ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
5352bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
536ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
537ca44d042SBarry Smith EXTERN int        MatColoringPatch(Mat,int,int *,ISColoring*);
538639f9d9dSBarry Smith 
5391a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
540d9274352SBarry Smith /*S
541d9274352SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences
542d9274352SBarry Smith         and coloring
543639f9d9dSBarry Smith 
544d9274352SBarry Smith    Level: beginner
545d9274352SBarry Smith 
546d9274352SBarry Smith   Concepts: coloring, sparse Jacobian, finite differences
547d9274352SBarry Smith 
548d9274352SBarry Smith .seealso:  MatFDColoringCreate()
549d9274352SBarry Smith S*/
550e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
551639f9d9dSBarry Smith 
552ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
553ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
554b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
555ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
556ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
557ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
558ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
559ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
560ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
561ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
56262152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring);
563639f9d9dSBarry Smith 
564639f9d9dSBarry Smith /*
5650752156aSBarry Smith     These routines are for partitioning matrices: currently used only
5663eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
5670752156aSBarry Smith */
56891e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
569ca161407SBarry Smith 
570d9274352SBarry Smith /*S
571d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
572d9274352SBarry Smith 
573d9274352SBarry Smith    Level: beginner
574d9274352SBarry Smith 
575d9274352SBarry Smith   Concepts: partitioning
576d9274352SBarry Smith 
577d9274352SBarry Smith .seealso:  MatParitioningCreate(), MatPartitioningType
578d9274352SBarry Smith S*/
57991e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
580d9274352SBarry Smith 
581d9274352SBarry Smith /*E
582d9274352SBarry Smith     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
583d9274352SBarry Smith        with an optional dynamic library name, for example
584d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
585d9274352SBarry Smith 
586d9274352SBarry Smith    Level: beginner
587d9274352SBarry Smith 
588d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning
589d9274352SBarry Smith E*/
5902aabb6bbSBarry Smith typedef char* MatPartitioningType;
5912aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
5922aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
593ca161407SBarry Smith 
594ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
595ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
596ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
597ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
598ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
599ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
6002aabb6bbSBarry Smith 
601ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
602aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
603f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
6042aabb6bbSBarry Smith #else
605f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
6062aabb6bbSBarry Smith #endif
6072aabb6bbSBarry Smith 
608ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
6092bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
610ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
6112bad1931SBarry Smith 
612b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
613ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
614ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
615ca161407SBarry Smith 
616ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
6170752156aSBarry Smith 
6180752156aSBarry Smith /*
6190a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
620d4fbbf0eSBarry Smith */
6211c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
6221c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
6231c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
6241c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
6251c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
6267c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
6277c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
6281c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
6291c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
6307c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
6317c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
6321c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
6331c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
6341c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
6351c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
6361c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
6371c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
6381c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
6391c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
6401c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
6411c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
6421c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
6431c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
6441c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
6451c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
6461c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
6471c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
6481c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
6491c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
6501c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
6511c1c02c0SLois Curfman McInnes                MATOP_GET_SIZE=30,
6521c1c02c0SLois Curfman McInnes                MATOP_GET_LOCAL_SIZE=31,
6531c1c02c0SLois Curfman McInnes                MATOP_GET_OWNERSHIP_RANGE=32,
6541c1c02c0SLois Curfman McInnes                MATOP_ILUFACTOR_SYMBOLIC=33,
6551c1c02c0SLois Curfman McInnes                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
6561c1c02c0SLois Curfman McInnes                MATOP_GET_ARRAY=35,
6571c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ARRAY=36,
6587bf97ca4SSatish Balay 
659005c665bSBarry Smith                MATOP_CONVERT_SAME_TYPE=37,
660005c665bSBarry Smith                MATOP_FORWARD_SOLVE=38,
661005c665bSBarry Smith                MATOP_BACKWARD_SOLVE=39,
662005c665bSBarry Smith                MATOP_ILUFACTOR=40,
663005c665bSBarry Smith                MATOP_INCOMPLETECHOLESKYFACTOR=41,
664005c665bSBarry Smith                MATOP_AXPY=42,
665005c665bSBarry Smith                MATOP_GET_SUBMATRICES=43,
666005c665bSBarry Smith                MATOP_INCREASE_OVERLAP=44,
667005c665bSBarry Smith                MATOP_GET_VALUES=45,
668005c665bSBarry Smith                MATOP_COPY=46,
669005c665bSBarry Smith                MATOP_PRINT_HELP=47,
670005c665bSBarry Smith                MATOP_SCALE=48,
671005c665bSBarry Smith                MATOP_SHIFT=49,
672005c665bSBarry Smith                MATOP_DIAGONAL_SHIFT=50,
673005c665bSBarry Smith                MATOP_ILUDT_FACTOR=51,
674005c665bSBarry Smith                MATOP_GET_BLOCK_SIZE=52,
675005c665bSBarry Smith                MATOP_GET_ROW_IJ=53,
676005c665bSBarry Smith                MATOP_RESTORE_ROW_IJ=54,
677005c665bSBarry Smith                MATOP_GET_COLUMN_IJ=55,
678005c665bSBarry Smith                MATOP_RESTORE_COLUMN_IJ=56,
679005c665bSBarry Smith                MATOP_FDCOLORING_CREATE=57,
680005c665bSBarry Smith                MATOP_COLORING_PATCH=58,
681005c665bSBarry Smith                MATOP_SET_UNFACTORED=59,
682005c665bSBarry Smith                MATOP_PERMUTE=60,
683005c665bSBarry Smith                MATOP_SET_VALUES_BLOCKED=61,
6841c1c02c0SLois Curfman McInnes                MATOP_DESTROY=250,
6851c1c02c0SLois Curfman McInnes                MATOP_VIEW=251
686fae171e0SBarry Smith              } MatOperation;
687ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
688ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
689ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
690273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
691112a2221SBarry Smith 
69290ace30eSBarry Smith /*
69390ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
69490ace30eSBarry Smith  stored in a universal format. By changing the format with
695fb9695e5SSatish Balay  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
69690ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
69790ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
69890ace30eSBarry Smith  read into matrices of the same time.
69990ace30eSBarry Smith */
70090ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
70190ace30eSBarry Smith 
7023f1d51d7SBarry Smith /*
7033f1d51d7SBarry Smith      New matrix classes not yet distributed
7043f1d51d7SBarry Smith */
7053f1d51d7SBarry Smith /*
7063f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
7073f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
7083f1d51d7SBarry Smith   the same MatAIJIndices.
7093f1d51d7SBarry Smith */
710e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
7113f1d51d7SBarry Smith 
712ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
713ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
714ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
715ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
716ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
717ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
718ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
719ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
720ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
7213f1d51d7SBarry Smith 
722ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
723ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
724ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
7253f1d51d7SBarry Smith 
726ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
727ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
728ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
7293f1d51d7SBarry Smith 
7306d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
731ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
73208918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
733860d1616SSatish Balay 
734d9274352SBarry Smith /*S
735d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
736d9274352SBarry Smith          orthogonalizes the vector to a subsapce
737d9274352SBarry Smith 
738d9274352SBarry Smith    Level: beginner
739d9274352SBarry Smith 
740d9274352SBarry Smith   Concepts: matrix; linear operator, null space
741d9274352SBarry Smith 
742d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
743d9274352SBarry Smith S*/
74474637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
745d9274352SBarry Smith 
74674637425SBarry Smith #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
74774637425SBarry Smith 
74874637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
74974637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
75074637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
75174637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
75274637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
75374637425SBarry Smith 
754273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
755273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
756273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
757273d9f13SBarry Smith 
7583f1d51d7SBarry Smith 
759f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
760c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
761c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
762c4f061fbSSatish Balay 
763273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
764f069c275SSatish Balay 
765b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
766b0a32e0cSBarry Smith 
7672eac72dbSBarry Smith #endif
7682eac72dbSBarry Smith 
7692eac72dbSBarry Smith 
7709d00d63dSBarry Smith 
771