xref: /petsc/include/petscmat.h (revision b0a32e0c6855ee6a6cd3495fa7da12ea9885bc5d)
1*b0a32e0cSBarry Smith /* $Id: petscmat.h,v 1.210 2000/12/01 16:07:39 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 
11e2a1c21fSSatish Balay typedef struct _p_Mat*           Mat;
12d91e6319SBarry Smith /*E
13d91e6319SBarry Smith     MatType - String with the name of a PETSc matrix or the creation function
14d91e6319SBarry Smith        with an optional dynamic library name
152eac72dbSBarry Smith 
16d91e6319SBarry Smith    Level: beginner
17d91e6319SBarry Smith 
18d91e6319SBarry Smith .seealso: MatSetType()
19d91e6319SBarry Smith E*/
20273d9f13SBarry Smith #define MATSAME     "same"
21273d9f13SBarry Smith #define MATSEQMAIJ  "seqmaij"
22273d9f13SBarry Smith #define MATMPIMAIJ  "mpimaij"
23273d9f13SBarry Smith #define MATIS       "is"
24273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs"
25273d9f13SBarry Smith #define MATSEQDENSE "seqdense"
26273d9f13SBarry Smith #define MATSEQAIJ   "seqaij"
27273d9f13SBarry Smith #define MATMPIAIJ   "mpiaij"
28273d9f13SBarry Smith #define MATSHELL    "shell"
29273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag"
30273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag"
31273d9f13SBarry Smith #define MATMPIDENSE "mpidense"
32273d9f13SBarry Smith #define MATSEQBAIJ  "seqbaij"
33273d9f13SBarry Smith #define MATMPIBAIJ  "mpibaij"
34273d9f13SBarry Smith #define MATMPIADJ   "mpiadj"
35273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij"
36273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij"
37273d9f13SBarry Smith typedef char* MatType;
38d91e6319SBarry Smith 
39273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
40273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
41273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
42273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
43273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
44273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
45273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
46273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
47273d9f13SBarry Smith #else
48273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
49273d9f13SBarry Smith #endif
50273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
51*b0a32e0cSBarry Smith extern PetscFList      MatList;
5228988994SBarry Smith 
53ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
54ca44d042SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
55ca44d042SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
56ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
57ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
58c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
59ca44d042SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
60ca44d042SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
61ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
62ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
63ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
64ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
65ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
668a3eeb68SSatish Balay 
67ca44d042SBarry Smith EXTERN int MatDestroy(Mat);
687b80b807SBarry Smith 
69ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
70ca44d042SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
7121c89e3eSBarry Smith 
72ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
73ca44d042SBarry Smith EXTERN int MatGetMaps(Mat,Map*,Map*);
74ec0117caSBarry Smith 
758ed539a5SBarry Smith /* ------------------------------------------------------------*/
76ca44d042SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
77ca44d042SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode);
7884cb2905SBarry Smith 
79d91e6319SBarry Smith /*E
80d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
81d91e6319SBarry Smith      to continue to add values to it
82d91e6319SBarry Smith 
83d91e6319SBarry Smith     Level: beginner
84d91e6319SBarry Smith 
85d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
86d91e6319SBarry Smith E*/
876d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
88ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
89ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
90ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
914f9c727eSBarry Smith 
92b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
93d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
94b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
95b951964fSBarry Smith }
96ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
97d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
98ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
99ea06a074SBarry Smith }
100d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
101d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
102d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
103d91e6319SBarry Smith }
104d91e6319SBarry Smith /*E
105d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
106d91e6319SBarry Smith 
107d91e6319SBarry Smith     Level: beginner
108d91e6319SBarry Smith 
1090a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
110d91e6319SBarry Smith 
111d91e6319SBarry Smith .seealso: MatSetOption()
112d91e6319SBarry Smith E*/
1136d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1146d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1156d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1166ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1176ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1186ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1196ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1204787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1217c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1222bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
123f9d29acdSSatish Balay               MAT_DO_NOT_USE_INODES=82} MatOption;
124ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
125273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
12684cb2905SBarry Smith 
127ca44d042SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*);
128ca44d042SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**);
129ca44d042SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**);
130ca44d042SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**);
131ca44d042SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
132ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
133ca44d042SBarry Smith EXTERN int MatGetArray(Mat,Scalar **);
134ca44d042SBarry Smith EXTERN int MatRestoreArray(Mat,Scalar **);
135ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
1367b80b807SBarry Smith 
137ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
138ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
139ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
140ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
1412eac72dbSBarry Smith 
142d91e6319SBarry Smith /*E
143d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
144d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
145d91e6319SBarry Smith 
146d91e6319SBarry Smith     Level: beginner
147d91e6319SBarry Smith 
148d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
149d91e6319SBarry Smith 
150d91e6319SBarry Smith .seealso: MatDuplicate()
151d91e6319SBarry Smith E*/
1522e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
1532e8a6d31SBarry Smith 
154273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
155273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
156273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
157273d9f13SBarry Smith #else
158273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
159273d9f13SBarry Smith #endif
160273d9f13SBarry Smith EXTERN int MatConvertRegisterAll(char*);
161273d9f13SBarry Smith EXTERN int MatConvertRegisterDestroy(void);
162273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
163*b0a32e0cSBarry Smith extern PetscFList      MatConvertList;
164ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*);
165ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*);
16694a9d846SBarry Smith 
167d91e6319SBarry Smith /*E
168d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
169d91e6319SBarry Smith 
170d91e6319SBarry Smith     Level: beginner
171d91e6319SBarry Smith 
172d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
173d91e6319SBarry Smith 
174d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
175d91e6319SBarry Smith E*/
176cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
177cb5b572fSBarry Smith 
178ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
179*b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
180273d9f13SBarry Smith 
181*b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
182273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
183273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
184273d9f13SBarry Smith #else
185273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
186273d9f13SBarry Smith #endif
187273d9f13SBarry Smith EXTERN int MatLoadRegisterAll(char*);
188273d9f13SBarry Smith EXTERN int MatLoadRegisterDestroy(void);
189273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
190*b0a32e0cSBarry Smith extern PetscFList      MatLoadList;
191*b0a32e0cSBarry Smith EXTERN int MatLoad(PetscViewer,MatType,Mat*);
1927b80b807SBarry Smith 
193ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
194ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
195ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
196ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
197d4fbbf0eSBarry Smith 
198d91e6319SBarry Smith /*S
199d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
200d91e6319SBarry Smith 
201d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
202d91e6319SBarry Smith 
203d91e6319SBarry Smith    Level: intermediate
204d91e6319SBarry Smith 
205d91e6319SBarry Smith   Concepts: matrix^nonzero information
206d91e6319SBarry Smith 
207d91e6319SBarry Smith .seealso:  MatGetInfo()
208d91e6319SBarry Smith S*/
2094e220ebcSLois Curfman McInnes typedef struct {
210*b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
211*b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
212*b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
213*b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
214*b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
215*b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
216*b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
217*b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
218*b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2194e220ebcSLois Curfman McInnes } MatInfo;
2204e220ebcSLois Curfman McInnes 
2217b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
222ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
223ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
224ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
225273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
226ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
227ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
228ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
22906ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
230ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
2317b80b807SBarry Smith 
232ca44d042SBarry Smith EXTERN int MatNorm(Mat,NormType,double *);
233ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
234ca44d042SBarry Smith EXTERN int MatZeroRows(Mat,IS,Scalar*);
235ca44d042SBarry Smith EXTERN int MatZeroColumns(Mat,IS,Scalar*);
2367b80b807SBarry Smith 
237ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
238ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
239ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
2405ef9f2a5SBarry Smith 
241ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
242ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
243ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
2447b80b807SBarry Smith 
245d91e6319SBarry Smith /*E
246d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
247d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
248d91e6319SBarry Smith 
249d91e6319SBarry Smith     Level: beginner
250d91e6319SBarry Smith 
251d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
252d91e6319SBarry Smith 
253d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
254d91e6319SBarry Smith E*/
2557b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
256ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
257ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
258ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
2598efafbd8SBarry Smith 
260ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
2617b80b807SBarry Smith 
262ca44d042SBarry Smith EXTERN int MatAXPY(Scalar *,Mat,Mat);
263ca44d042SBarry Smith EXTERN int MatAYPX(Scalar *,Mat,Mat);
264ca44d042SBarry Smith EXTERN int MatCompress(Mat);
2657b80b807SBarry Smith 
266ca44d042SBarry Smith EXTERN int MatScale(Scalar *,Mat);
267ca44d042SBarry Smith EXTERN int MatShift(Scalar *,Mat);
268052efed2SBarry Smith 
269ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
270ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
271ca44d042SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*);
272ca44d042SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
273ca44d042SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
27490f02eecSBarry Smith 
275ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
276649db694SBarry Smith 
277ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
278ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
279ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
2807c922b88SBarry Smith 
2817c922b88SBarry Smith /*
282c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
2837c922b88SBarry Smith */
284c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
2857c922b88SBarry Smith { \
2867c922b88SBarry Smith   int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
287*b0a32e0cSBarry Smith ierr = PetscMalloc(2*__tmp*sizeof(int),&(  dnz ));CHKERRQ(ierr);onz = dnz + __tmp;\
2887c922b88SBarry Smith   __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\
2897c922b88SBarry Smith   __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\
2907c922b88SBarry Smith   __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp;
2917c922b88SBarry Smith 
292c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
293c4f061fbSSatish Balay {\
294c4f061fbSSatish Balay   int __l;\
295c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\
296c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\
297c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
298c4f061fbSSatish Balay     __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\
299c4f061fbSSatish Balay   }\
300c4f061fbSSatish Balay }
301c4f061fbSSatish Balay 
302c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3037c922b88SBarry Smith { int __i; \
3047c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3057c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3067c922b88SBarry Smith   }\
3077c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3087c922b88SBarry Smith }
3097c922b88SBarry Smith 
310c4f061fbSSatish Balay #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);}
3117c922b88SBarry Smith 
3127b80b807SBarry Smith /* Routines unique to particular data structures */
313ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
314ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
315ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
316ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
3177b80b807SBarry Smith 
318273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
319273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
320273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
321273d9f13SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,Scalar*);
322273d9f13SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
323273d9f13SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*);
324273d9f13SBarry Smith 
325273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
326273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
327273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
328273d9f13SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,Scalar*);
329273d9f13SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
330273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
331273d9f13SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*);
332273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
333273d9f13SBarry Smith 
334ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
335ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
3362e8a6d31SBarry Smith 
3377b80b807SBarry Smith /*
3387b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
3397b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
3407b80b807SBarry Smith */
3417b80b807SBarry Smith 
342b12f92e5SBarry Smith typedef char* MatOrderingType;
343b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
344b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
345b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
346b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
347b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
348b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
34962152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
35062152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
35162152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
352b12f92e5SBarry Smith 
353ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
354ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
355aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
356f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
357b12f92e5SBarry Smith #else
358f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
359b12f92e5SBarry Smith #endif
360ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
361ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
3622bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
363*b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
364d4fbbf0eSBarry Smith 
365ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
366a2ce50c7SBarry Smith 
367ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double);
368ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
369ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
370a2ce50c7SBarry Smith 
371d91e6319SBarry Smith /*S
372d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
3735ef9f2a5SBarry Smith 
374d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
37514822f30SBarry Smith 
376d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
377d91e6319SBarry Smith           All entries are double precision.
378d91e6319SBarry Smith 
379d91e6319SBarry Smith    Level: developer
380d91e6319SBarry Smith 
381d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
382d91e6319SBarry Smith 
383d91e6319SBarry Smith S*/
3845ef9f2a5SBarry Smith typedef struct {
3855ef9f2a5SBarry Smith   double     levels;         /* ILU(levels) */
3865ef9f2a5SBarry Smith   double     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
3875ef9f2a5SBarry Smith   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
38836db0b34SBarry Smith   double     dt;             /* drop tolerance */
38936db0b34SBarry Smith   double     dtcol;          /* tolerance for pivoting */
39036db0b34SBarry Smith   double     dtcount;        /* maximum nonzeros to be allowed per row */
391d91e6319SBarry Smith   double     damping;        /* scaling of identity added to matrix to prevent zero pivots */
392d91e6319SBarry Smith   double     damp;           /* if is 1.0 and factorization fails, damp until successful */
3935ef9f2a5SBarry Smith } MatILUInfo;
3945ef9f2a5SBarry Smith 
395d91e6319SBarry Smith /*S
396d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
397d91e6319SBarry Smith 
398d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
399d91e6319SBarry Smith 
400d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
401d91e6319SBarry Smith           All entries are double precision.
402d91e6319SBarry Smith 
403d91e6319SBarry Smith    Level: developer
404d91e6319SBarry Smith 
405d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
406d91e6319SBarry Smith 
407d91e6319SBarry Smith S*/
40814822f30SBarry Smith typedef struct {
40914822f30SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
41014822f30SBarry Smith   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
411d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
412d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
41314822f30SBarry Smith } MatLUInfo;
41414822f30SBarry Smith 
415d91e6319SBarry Smith /*S
416d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
417d91e6319SBarry Smith 
418d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
419d91e6319SBarry Smith 
420d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
421d91e6319SBarry Smith           All entries are double precision.
422d91e6319SBarry Smith 
423d91e6319SBarry Smith    Level: developer
424d91e6319SBarry Smith 
425d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
426d91e6319SBarry Smith 
427d91e6319SBarry Smith S*/
428ffa6d0a5SLois Curfman McInnes typedef struct {
429ffa6d0a5SLois Curfman McInnes   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
430d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
431d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
432ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
433ffa6d0a5SLois Curfman McInnes 
43414822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
435ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
43614822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
437ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
438ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
43974637425SBarry Smith EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int);
440ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
441ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
442a2ce50c7SBarry Smith 
443ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
444ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
445ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
446ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
447ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
448ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
4498ed539a5SBarry Smith 
450ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
451bb5a7306SBarry Smith 
452bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
453d91e6319SBarry Smith /*E
454d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
455bb1eb677SSatish Balay 
456d91e6319SBarry Smith     Level: beginner
457d91e6319SBarry Smith 
458d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
459d91e6319SBarry Smith 
460d91e6319SBarry Smith .seealso: MatRelax()
461d91e6319SBarry Smith E*/
462ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
463ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
464ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
46584cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
466ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
4678ed539a5SBarry Smith 
468d4fbbf0eSBarry Smith /*
469639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
470639f9d9dSBarry Smith */
471b12f92e5SBarry Smith 
472b12f92e5SBarry Smith typedef char* MatColoringType;
473b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
474b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
475b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
476b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
477b12f92e5SBarry Smith 
478ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
479ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
480aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
481f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
482b12f92e5SBarry Smith #else
483f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
484b12f92e5SBarry Smith #endif
485ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
4862bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
487ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
488ca44d042SBarry Smith EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
489639f9d9dSBarry Smith 
49084cb2905SBarry Smith /*
49184cb2905SBarry Smith     Data structures used to compute Jacobian vector products
49284cb2905SBarry Smith   efficiently using finite differences.
49384cb2905SBarry Smith */
4941a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
495639f9d9dSBarry Smith 
496e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
497639f9d9dSBarry Smith 
498ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
499ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
500*b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
501ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
502ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
503ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
504ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
505ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
506ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
507ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
50862152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring);
509639f9d9dSBarry Smith 
510639f9d9dSBarry Smith /*
5110752156aSBarry Smith     These routines are for partitioning matrices: currently used only
5123eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
5130752156aSBarry Smith */
51491e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
515ca161407SBarry Smith 
51691e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
5172aabb6bbSBarry Smith typedef char* MatPartitioningType;
5182aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
5192aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
520ca161407SBarry Smith 
521ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
522ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
523ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
524ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
525ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
526ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
5272aabb6bbSBarry Smith 
528ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
529aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
530f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
5312aabb6bbSBarry Smith #else
532f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
5332aabb6bbSBarry Smith #endif
5342aabb6bbSBarry Smith 
535ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
5362bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
537ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
5382bad1931SBarry Smith 
539*b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
540ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
541ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
542ca161407SBarry Smith 
543ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
5440752156aSBarry Smith 
5450752156aSBarry Smith /*
5460a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
547d4fbbf0eSBarry Smith */
5481c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
5491c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
5501c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
5511c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
5521c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
5537c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
5547c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
5551c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
5561c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
5577c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
5587c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
5591c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
5601c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
5611c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
5621c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
5631c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
5641c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
5651c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
5661c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
5671c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
5681c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
5691c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
5701c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
5711c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
5721c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
5731c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
5741c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
5751c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
5761c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
5771c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
5781c1c02c0SLois Curfman McInnes                MATOP_GET_SIZE=30,
5791c1c02c0SLois Curfman McInnes                MATOP_GET_LOCAL_SIZE=31,
5801c1c02c0SLois Curfman McInnes                MATOP_GET_OWNERSHIP_RANGE=32,
5811c1c02c0SLois Curfman McInnes                MATOP_ILUFACTOR_SYMBOLIC=33,
5821c1c02c0SLois Curfman McInnes                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
5831c1c02c0SLois Curfman McInnes                MATOP_GET_ARRAY=35,
5841c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ARRAY=36,
5857bf97ca4SSatish Balay 
586005c665bSBarry Smith                MATOP_CONVERT_SAME_TYPE=37,
587005c665bSBarry Smith                MATOP_FORWARD_SOLVE=38,
588005c665bSBarry Smith                MATOP_BACKWARD_SOLVE=39,
589005c665bSBarry Smith                MATOP_ILUFACTOR=40,
590005c665bSBarry Smith                MATOP_INCOMPLETECHOLESKYFACTOR=41,
591005c665bSBarry Smith                MATOP_AXPY=42,
592005c665bSBarry Smith                MATOP_GET_SUBMATRICES=43,
593005c665bSBarry Smith                MATOP_INCREASE_OVERLAP=44,
594005c665bSBarry Smith                MATOP_GET_VALUES=45,
595005c665bSBarry Smith                MATOP_COPY=46,
596005c665bSBarry Smith                MATOP_PRINT_HELP=47,
597005c665bSBarry Smith                MATOP_SCALE=48,
598005c665bSBarry Smith                MATOP_SHIFT=49,
599005c665bSBarry Smith                MATOP_DIAGONAL_SHIFT=50,
600005c665bSBarry Smith                MATOP_ILUDT_FACTOR=51,
601005c665bSBarry Smith                MATOP_GET_BLOCK_SIZE=52,
602005c665bSBarry Smith                MATOP_GET_ROW_IJ=53,
603005c665bSBarry Smith                MATOP_RESTORE_ROW_IJ=54,
604005c665bSBarry Smith                MATOP_GET_COLUMN_IJ=55,
605005c665bSBarry Smith                MATOP_RESTORE_COLUMN_IJ=56,
606005c665bSBarry Smith                MATOP_FDCOLORING_CREATE=57,
607005c665bSBarry Smith                MATOP_COLORING_PATCH=58,
608005c665bSBarry Smith                MATOP_SET_UNFACTORED=59,
609005c665bSBarry Smith                MATOP_PERMUTE=60,
610005c665bSBarry Smith                MATOP_SET_VALUES_BLOCKED=61,
6111c1c02c0SLois Curfman McInnes                MATOP_DESTROY=250,
6121c1c02c0SLois Curfman McInnes                MATOP_VIEW=251
613fae171e0SBarry Smith              } MatOperation;
614ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
615ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
616ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
617273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
618112a2221SBarry Smith 
61990ace30eSBarry Smith /*
62090ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
62190ace30eSBarry Smith  stored in a universal format. By changing the format with
622*b0a32e0cSBarry Smith  PetscViewerSetFormat(viewer,PETSC_VIEWER_FORMAT_BINARY_NATIVE); the matrices will
62390ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
62490ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
62590ace30eSBarry Smith  read into matrices of the same time.
62690ace30eSBarry Smith */
62790ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
62890ace30eSBarry Smith 
6293f1d51d7SBarry Smith /*
6303f1d51d7SBarry Smith      New matrix classes not yet distributed
6313f1d51d7SBarry Smith */
6323f1d51d7SBarry Smith /*
6333f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
6343f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
6353f1d51d7SBarry Smith   the same MatAIJIndices.
6363f1d51d7SBarry Smith */
637e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
6383f1d51d7SBarry Smith 
639ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
640ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
641ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
642ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
643ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
644ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
645ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
646ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
647ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
6483f1d51d7SBarry Smith 
649ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
650ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
651ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
6523f1d51d7SBarry Smith 
653ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
654ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
655ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
6563f1d51d7SBarry Smith 
6576d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
658ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
65908918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
660860d1616SSatish Balay 
66174637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
66274637425SBarry Smith #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
66374637425SBarry Smith 
66474637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
66574637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
66674637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
66774637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
66874637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
66974637425SBarry Smith 
670273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
671273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
672273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
673273d9f13SBarry Smith 
6743f1d51d7SBarry Smith 
675f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
676c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
677c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
678c4f061fbSSatish Balay 
679273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
680f069c275SSatish Balay 
681*b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
682*b0a32e0cSBarry Smith 
6832eac72dbSBarry Smith #endif
6842eac72dbSBarry Smith 
6852eac72dbSBarry Smith 
6869d00d63dSBarry Smith 
687