xref: /petsc/include/petscmat.h (revision d91e631973c258cae641722b7fe8a6f365dd6339)
1*d91e6319SBarry Smith /* $Id: petscmat.h,v 1.208 2000/10/24 20:28:06 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;
12*d91e6319SBarry Smith /*E
13*d91e6319SBarry Smith     MatType - String with the name of a PETSc matrix or the creation function
14*d91e6319SBarry Smith        with an optional dynamic library name
152eac72dbSBarry Smith 
16*d91e6319SBarry Smith    Level: beginner
17*d91e6319SBarry Smith 
18*d91e6319SBarry Smith .seealso: MatSetType()
19*d91e6319SBarry 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;
38*d91e6319SBarry 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;
51273d9f13SBarry Smith extern FList      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 
79*d91e6319SBarry Smith /*E
80*d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
81*d91e6319SBarry Smith      to continue to add values to it
82*d91e6319SBarry Smith 
83*d91e6319SBarry Smith     Level: beginner
84*d91e6319SBarry Smith 
85*d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
86*d91e6319SBarry 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) \
93*d91e6319SBarry 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) \
97*d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
98ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
99ea06a074SBarry Smith }
100*d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
101*d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \
102*d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
103*d91e6319SBarry Smith }
104*d91e6319SBarry Smith /*E
105*d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
106*d91e6319SBarry Smith 
107*d91e6319SBarry Smith     Level: beginner
108*d91e6319SBarry Smith 
1090a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
110*d91e6319SBarry Smith 
111*d91e6319SBarry Smith .seealso: MatSetOption()
112*d91e6319SBarry 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 
142*d91e6319SBarry Smith /*E
143*d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
144*d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
145*d91e6319SBarry Smith 
146*d91e6319SBarry Smith     Level: beginner
147*d91e6319SBarry Smith 
148*d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
149*d91e6319SBarry Smith 
150*d91e6319SBarry Smith .seealso: MatDuplicate()
151*d91e6319SBarry 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;
163273d9f13SBarry Smith extern FList      MatConvertList;
164ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*);
165ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*);
16694a9d846SBarry Smith 
167*d91e6319SBarry Smith /*E
168*d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
169*d91e6319SBarry Smith 
170*d91e6319SBarry Smith     Level: beginner
171*d91e6319SBarry Smith 
172*d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
173*d91e6319SBarry Smith 
174*d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
175*d91e6319SBarry 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);
179ca44d042SBarry Smith EXTERN int MatView(Mat,Viewer);
180273d9f13SBarry Smith 
181273d9f13SBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(Viewer,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;
190273d9f13SBarry Smith extern FList      MatLoadList;
191ca44d042SBarry Smith EXTERN int MatLoad(Viewer,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 
198*d91e6319SBarry Smith /*S
199*d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
200*d91e6319SBarry Smith 
201*d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
202*d91e6319SBarry Smith 
203*d91e6319SBarry Smith    Level: intermediate
204*d91e6319SBarry Smith 
205*d91e6319SBarry Smith   Concepts: matrix^nonzero information
206*d91e6319SBarry Smith 
207*d91e6319SBarry Smith .seealso:  MatGetInfo()
208*d91e6319SBarry Smith S*/
2094e220ebcSLois Curfman McInnes typedef struct {
21037f753daSBarry Smith   PLogDouble rows_global,columns_global;         /* number of global rows and columns */
21137f753daSBarry Smith   PLogDouble rows_local,columns_local;           /* number of local rows and columns */
21237f753daSBarry Smith   PLogDouble block_size;                         /* block size */
21337f753daSBarry Smith   PLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
21437f753daSBarry Smith   PLogDouble memory;                             /* memory allocated */
215*d91e6319SBarry Smith   PLogDouble assemblies;                         /* number of matrix assemblies called */
21637f753daSBarry Smith   PLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
21737f753daSBarry Smith   PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
21837f753daSBarry Smith   PLogDouble 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 
245*d91e6319SBarry Smith /*E
246*d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
247*d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
248*d91e6319SBarry Smith 
249*d91e6319SBarry Smith     Level: beginner
250*d91e6319SBarry Smith 
251*d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
252*d91e6319SBarry Smith 
253*d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
254*d91e6319SBarry 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; \
2877c922b88SBarry Smith   dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);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"
349b12f92e5SBarry Smith 
350ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
351ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
352aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
353f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
354b12f92e5SBarry Smith #else
355f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
356b12f92e5SBarry Smith #endif
357ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
358ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
3592bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
3604bbc92c1SBarry Smith extern FList      MatOrderingList;
361d4fbbf0eSBarry Smith 
362ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
363a2ce50c7SBarry Smith 
364ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double);
365ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
366ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
367a2ce50c7SBarry Smith 
368*d91e6319SBarry Smith /*S
369*d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
3705ef9f2a5SBarry Smith 
371*d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
37214822f30SBarry Smith 
373*d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
374*d91e6319SBarry Smith           All entries are double precision.
375*d91e6319SBarry Smith 
376*d91e6319SBarry Smith    Level: developer
377*d91e6319SBarry Smith 
378*d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
379*d91e6319SBarry Smith 
380*d91e6319SBarry Smith S*/
3815ef9f2a5SBarry Smith typedef struct {
3825ef9f2a5SBarry Smith   double     levels;         /* ILU(levels) */
3835ef9f2a5SBarry Smith   double     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
3845ef9f2a5SBarry Smith   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
38536db0b34SBarry Smith   double     dt;             /* drop tolerance */
38636db0b34SBarry Smith   double     dtcol;          /* tolerance for pivoting */
38736db0b34SBarry Smith   double     dtcount;        /* maximum nonzeros to be allowed per row */
388*d91e6319SBarry Smith   double     damping;        /* scaling of identity added to matrix to prevent zero pivots */
389*d91e6319SBarry Smith   double     damp;           /* if is 1.0 and factorization fails, damp until successful */
3905ef9f2a5SBarry Smith } MatILUInfo;
3915ef9f2a5SBarry Smith 
392*d91e6319SBarry Smith /*S
393*d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
394*d91e6319SBarry Smith 
395*d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
396*d91e6319SBarry Smith 
397*d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
398*d91e6319SBarry Smith           All entries are double precision.
399*d91e6319SBarry Smith 
400*d91e6319SBarry Smith    Level: developer
401*d91e6319SBarry Smith 
402*d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
403*d91e6319SBarry Smith 
404*d91e6319SBarry Smith S*/
40514822f30SBarry Smith typedef struct {
40614822f30SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
40714822f30SBarry Smith   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
408*d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
409*d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
41014822f30SBarry Smith } MatLUInfo;
41114822f30SBarry Smith 
412*d91e6319SBarry Smith /*S
413*d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
414*d91e6319SBarry Smith 
415*d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
416*d91e6319SBarry Smith 
417*d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
418*d91e6319SBarry Smith           All entries are double precision.
419*d91e6319SBarry Smith 
420*d91e6319SBarry Smith    Level: developer
421*d91e6319SBarry Smith 
422*d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
423*d91e6319SBarry Smith 
424*d91e6319SBarry Smith S*/
425ffa6d0a5SLois Curfman McInnes typedef struct {
426ffa6d0a5SLois Curfman McInnes   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
427*d91e6319SBarry Smith   double     damping; /* scaling of identity added to matrix to prevent zero pivots */
428*d91e6319SBarry Smith   double     damp;    /* if this is 1.0 and factorization fails, damp until successful */
429ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
430ffa6d0a5SLois Curfman McInnes 
43114822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
432ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
43314822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
434ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
435ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
43674637425SBarry Smith EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int);
437ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
438ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
439a2ce50c7SBarry Smith 
440ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
441ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
442ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
443ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
444ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
445ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
4468ed539a5SBarry Smith 
447ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
448bb5a7306SBarry Smith 
449bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
450*d91e6319SBarry Smith /*E
451*d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
452bb1eb677SSatish Balay 
453*d91e6319SBarry Smith     Level: beginner
454*d91e6319SBarry Smith 
455*d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
456*d91e6319SBarry Smith 
457*d91e6319SBarry Smith .seealso: MatRelax()
458*d91e6319SBarry Smith E*/
459ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
460ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
461ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
46284cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
463ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
4648ed539a5SBarry Smith 
465d4fbbf0eSBarry Smith /*
466639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
467639f9d9dSBarry Smith */
468b12f92e5SBarry Smith 
469b12f92e5SBarry Smith typedef char* MatColoringType;
470b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
471b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
472b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
473b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
474b12f92e5SBarry Smith 
475ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
476ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
477aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
478f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
479b12f92e5SBarry Smith #else
480f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
481b12f92e5SBarry Smith #endif
482ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
4832bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
484ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
485ca44d042SBarry Smith EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
486639f9d9dSBarry Smith 
48784cb2905SBarry Smith /*
48884cb2905SBarry Smith     Data structures used to compute Jacobian vector products
48984cb2905SBarry Smith   efficiently using finite differences.
49084cb2905SBarry Smith */
4911a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
492639f9d9dSBarry Smith 
493e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
494639f9d9dSBarry Smith 
495ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
496ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
497ca44d042SBarry Smith EXTERN int MatFDColoringView(MatFDColoring,Viewer);
498ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
499ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
500ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
501ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
502ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
503ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
504ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
505639f9d9dSBarry Smith 
506639f9d9dSBarry Smith /*
5070752156aSBarry Smith     These routines are for partitioning matrices: currently used only
5083eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
5090752156aSBarry Smith */
51091e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
511ca161407SBarry Smith 
51291e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
5132aabb6bbSBarry Smith typedef char* MatPartitioningType;
5142aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
5152aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
516ca161407SBarry Smith 
517ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
518ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
519ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
520ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
521ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
522ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
5232aabb6bbSBarry Smith 
524ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
525aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
526f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
5272aabb6bbSBarry Smith #else
528f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
5292aabb6bbSBarry Smith #endif
5302aabb6bbSBarry Smith 
531ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
5322bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
533ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
5342bad1931SBarry Smith 
535ca44d042SBarry Smith EXTERN int MatPartitioningView(MatPartitioning,Viewer);
536ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
537ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
538ca161407SBarry Smith 
539ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
5400752156aSBarry Smith 
5410752156aSBarry Smith /*
5420a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
543d4fbbf0eSBarry Smith */
5441c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
5451c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
5461c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
5471c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
5481c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
5497c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
5507c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
5511c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
5521c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
5537c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
5547c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
5551c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
5561c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
5571c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
5581c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
5591c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
5601c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
5611c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
5621c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
5631c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
5641c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
5651c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
5661c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
5671c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
5681c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
5691c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
5701c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
5711c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
5721c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
5731c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
5741c1c02c0SLois Curfman McInnes                MATOP_GET_SIZE=30,
5751c1c02c0SLois Curfman McInnes                MATOP_GET_LOCAL_SIZE=31,
5761c1c02c0SLois Curfman McInnes                MATOP_GET_OWNERSHIP_RANGE=32,
5771c1c02c0SLois Curfman McInnes                MATOP_ILUFACTOR_SYMBOLIC=33,
5781c1c02c0SLois Curfman McInnes                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
5791c1c02c0SLois Curfman McInnes                MATOP_GET_ARRAY=35,
5801c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ARRAY=36,
5817bf97ca4SSatish Balay 
582005c665bSBarry Smith                MATOP_CONVERT_SAME_TYPE=37,
583005c665bSBarry Smith                MATOP_FORWARD_SOLVE=38,
584005c665bSBarry Smith                MATOP_BACKWARD_SOLVE=39,
585005c665bSBarry Smith                MATOP_ILUFACTOR=40,
586005c665bSBarry Smith                MATOP_INCOMPLETECHOLESKYFACTOR=41,
587005c665bSBarry Smith                MATOP_AXPY=42,
588005c665bSBarry Smith                MATOP_GET_SUBMATRICES=43,
589005c665bSBarry Smith                MATOP_INCREASE_OVERLAP=44,
590005c665bSBarry Smith                MATOP_GET_VALUES=45,
591005c665bSBarry Smith                MATOP_COPY=46,
592005c665bSBarry Smith                MATOP_PRINT_HELP=47,
593005c665bSBarry Smith                MATOP_SCALE=48,
594005c665bSBarry Smith                MATOP_SHIFT=49,
595005c665bSBarry Smith                MATOP_DIAGONAL_SHIFT=50,
596005c665bSBarry Smith                MATOP_ILUDT_FACTOR=51,
597005c665bSBarry Smith                MATOP_GET_BLOCK_SIZE=52,
598005c665bSBarry Smith                MATOP_GET_ROW_IJ=53,
599005c665bSBarry Smith                MATOP_RESTORE_ROW_IJ=54,
600005c665bSBarry Smith                MATOP_GET_COLUMN_IJ=55,
601005c665bSBarry Smith                MATOP_RESTORE_COLUMN_IJ=56,
602005c665bSBarry Smith                MATOP_FDCOLORING_CREATE=57,
603005c665bSBarry Smith                MATOP_COLORING_PATCH=58,
604005c665bSBarry Smith                MATOP_SET_UNFACTORED=59,
605005c665bSBarry Smith                MATOP_PERMUTE=60,
606005c665bSBarry Smith                MATOP_SET_VALUES_BLOCKED=61,
6071c1c02c0SLois Curfman McInnes                MATOP_DESTROY=250,
6081c1c02c0SLois Curfman McInnes                MATOP_VIEW=251
609fae171e0SBarry Smith              } MatOperation;
610ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
611ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
612ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
613273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
614112a2221SBarry Smith 
61590ace30eSBarry Smith /*
61690ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
61790ace30eSBarry Smith  stored in a universal format. By changing the format with
618639f9d9dSBarry Smith  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
61990ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
62090ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
62190ace30eSBarry Smith  read into matrices of the same time.
62290ace30eSBarry Smith */
62390ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
62490ace30eSBarry Smith 
6253f1d51d7SBarry Smith /*
6263f1d51d7SBarry Smith      New matrix classes not yet distributed
6273f1d51d7SBarry Smith */
6283f1d51d7SBarry Smith /*
6293f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
6303f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
6313f1d51d7SBarry Smith   the same MatAIJIndices.
6323f1d51d7SBarry Smith */
633e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
6343f1d51d7SBarry Smith 
635ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
636ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
637ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
638ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
639ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
640ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
641ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
642ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
643ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
6443f1d51d7SBarry Smith 
645ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
646ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
647ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
6483f1d51d7SBarry Smith 
649ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
650ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
651ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
6523f1d51d7SBarry Smith 
6536d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
654ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
65508918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
656860d1616SSatish Balay 
65774637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
65874637425SBarry Smith #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
65974637425SBarry Smith 
66074637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
66174637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
66274637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
66374637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
66474637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
66574637425SBarry Smith 
666273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
667273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
668273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
669273d9f13SBarry Smith 
6703f1d51d7SBarry Smith 
671f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
672c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
673c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
674c4f061fbSSatish Balay 
675273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
676f069c275SSatish Balay 
6772eac72dbSBarry Smith #endif
6782eac72dbSBarry Smith 
6792eac72dbSBarry Smith 
6809d00d63dSBarry Smith 
681