xref: /petsc/include/petscmat.h (revision 273d9f13de75c4ed17021f7f2c11eebb99d26f0d)
1*273d9f13SBarry Smith /* $Id: petscmat.h,v 1.207 2000/09/25 18:43:53 curfman 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;
122eac72dbSBarry Smith 
13*273d9f13SBarry Smith #define MATSAME     "same"
14*273d9f13SBarry Smith #define MATSEQMAIJ  "seqmaij"
15*273d9f13SBarry Smith #define MATMPIMAIJ  "mpimaij"
16*273d9f13SBarry Smith #define MATIS       "is"
17*273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs"
18*273d9f13SBarry Smith #define MATSEQDENSE "seqdense"
19*273d9f13SBarry Smith #define MATSEQAIJ   "seqaij"
20*273d9f13SBarry Smith #define MATMPIAIJ   "mpiaij"
21*273d9f13SBarry Smith #define MATSHELL    "shell"
22*273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag"
23*273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag"
24*273d9f13SBarry Smith #define MATMPIDENSE "mpidense"
25*273d9f13SBarry Smith #define MATSEQBAIJ  "seqbaij"
26*273d9f13SBarry Smith #define MATMPIBAIJ  "mpibaij"
27*273d9f13SBarry Smith #define MATMPIADJ   "mpiadj"
28*273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij"
29*273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij"
30f1d1b154SWilliam Gropp 
31*273d9f13SBarry Smith typedef char* MatType;
32*273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
33*273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
34*273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
35*273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
36*273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
37*273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
38*273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
39*273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
40*273d9f13SBarry Smith #else
41*273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
42*273d9f13SBarry Smith #endif
43*273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
44*273d9f13SBarry Smith extern FList      MatList;
4528988994SBarry Smith 
46ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
47ca44d042SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
48ca44d042SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
49ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
50ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
51c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
52ca44d042SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
53ca44d042SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
54ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
55ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
56ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
57ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
58ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
598a3eeb68SSatish Balay 
60ca44d042SBarry Smith EXTERN int MatDestroy(Mat);
617b80b807SBarry Smith 
62ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
63ca44d042SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
6421c89e3eSBarry Smith 
65ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
66ca44d042SBarry Smith EXTERN int MatGetMaps(Mat,Map*,Map*);
67ec0117caSBarry Smith 
688ed539a5SBarry Smith /* ------------------------------------------------------------*/
69ca44d042SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
70ca44d042SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode);
7184cb2905SBarry Smith 
726d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
73ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
74ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
75ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
764f9c727eSBarry Smith 
77b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
78b951964fSBarry Smith {int _ierr,_row = i,_col = j; Scalar _va = va; \
79b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
80b951964fSBarry Smith }
81ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
82ea06a074SBarry Smith {int _ierr,_row = i,_col = j; \
83ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
84ea06a074SBarry Smith }
856ca9ecd3SBarry Smith /*
860a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
876ca9ecd3SBarry Smith */
886d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
896d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
906d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
916ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
926ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
936ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
946ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
954787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
967c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
972bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
98f9d29acdSSatish Balay               MAT_DO_NOT_USE_INODES=82} MatOption;
99ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
100*273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
10184cb2905SBarry Smith 
102ca44d042SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*);
103ca44d042SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**);
104ca44d042SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**);
105ca44d042SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**);
106ca44d042SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
107ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
108ca44d042SBarry Smith EXTERN int MatGetArray(Mat,Scalar **);
109ca44d042SBarry Smith EXTERN int MatRestoreArray(Mat,Scalar **);
110ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
1117b80b807SBarry Smith 
112ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
113ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
114ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
115ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
1162eac72dbSBarry Smith 
1172e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
1182e8a6d31SBarry Smith 
119*273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
120*273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
121*273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
122*273d9f13SBarry Smith #else
123*273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
124*273d9f13SBarry Smith #endif
125*273d9f13SBarry Smith EXTERN int MatConvertRegisterAll(char*);
126*273d9f13SBarry Smith EXTERN int MatConvertRegisterDestroy(void);
127*273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
128*273d9f13SBarry Smith extern FList      MatConvertList;
129ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*);
130ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*);
13194a9d846SBarry Smith 
132cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
133cb5b572fSBarry Smith 
134ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
135ca44d042SBarry Smith EXTERN int MatView(Mat,Viewer);
136*273d9f13SBarry Smith 
137*273d9f13SBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(Viewer,MatType,Mat*));
138*273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
139*273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
140*273d9f13SBarry Smith #else
141*273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
142*273d9f13SBarry Smith #endif
143*273d9f13SBarry Smith EXTERN int MatLoadRegisterAll(char*);
144*273d9f13SBarry Smith EXTERN int MatLoadRegisterDestroy(void);
145*273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
146*273d9f13SBarry Smith extern FList      MatLoadList;
147ca44d042SBarry Smith EXTERN int MatLoad(Viewer,MatType,Mat*);
1487b80b807SBarry Smith 
149ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
150ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
151ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
152ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
153d4fbbf0eSBarry Smith 
1541d607229SLois Curfman McInnes /*
1551d607229SLois Curfman McInnes    Context of matrix information, used with MatGetInfo()
1561d607229SLois Curfman McInnes    Note: If any entries are added to this context, be sure
1570a835dfdSSatish Balay          to adjust MAT_INFO_SIZE in finclude/petscmat.h
1581d607229SLois Curfman McInnes  */
1594e220ebcSLois Curfman McInnes typedef struct {
16037f753daSBarry Smith   PLogDouble rows_global,columns_global;         /* number of global rows and columns */
16137f753daSBarry Smith   PLogDouble rows_local,columns_local;           /* number of local rows and columns */
16237f753daSBarry Smith   PLogDouble block_size;                          /* block size */
16337f753daSBarry Smith   PLogDouble nz_allocated,nz_used,nz_unneeded;  /* number of nonzeros */
16437f753daSBarry Smith   PLogDouble memory;                              /* memory allocated */
16537f753daSBarry Smith   PLogDouble assemblies;                          /* number of matrix assemblies */
16637f753daSBarry Smith   PLogDouble mallocs;                             /* number of mallocs during MatSetValues() */
16737f753daSBarry Smith   PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
16837f753daSBarry Smith   PLogDouble factor_mallocs;                      /* number of mallocs during factorization */
1694e220ebcSLois Curfman McInnes } MatInfo;
1704e220ebcSLois Curfman McInnes 
1717b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
172ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
173ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
174ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
175*273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
176ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
177ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
178ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
17906ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
180ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
1817b80b807SBarry Smith 
182ca44d042SBarry Smith EXTERN int MatNorm(Mat,NormType,double *);
183ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
184ca44d042SBarry Smith EXTERN int MatZeroRows(Mat,IS,Scalar*);
185ca44d042SBarry Smith EXTERN int MatZeroColumns(Mat,IS,Scalar*);
1867b80b807SBarry Smith 
187ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
188ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
189ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
1905ef9f2a5SBarry Smith 
191ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
192ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
193ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
1947b80b807SBarry Smith 
1957b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
196ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
197ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
198ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
1998efafbd8SBarry Smith 
200ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
2017b80b807SBarry Smith 
202ca44d042SBarry Smith EXTERN int MatAXPY(Scalar *,Mat,Mat);
203ca44d042SBarry Smith EXTERN int MatAYPX(Scalar *,Mat,Mat);
204ca44d042SBarry Smith EXTERN int MatCompress(Mat);
2057b80b807SBarry Smith 
206ca44d042SBarry Smith EXTERN int MatScale(Scalar *,Mat);
207ca44d042SBarry Smith EXTERN int MatShift(Scalar *,Mat);
208052efed2SBarry Smith 
209ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
210ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
211ca44d042SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*);
212ca44d042SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
213ca44d042SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
21490f02eecSBarry Smith 
215ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
216649db694SBarry Smith 
217ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
218ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
219ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
2207c922b88SBarry Smith 
2217c922b88SBarry Smith /*
222c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
2237c922b88SBarry Smith */
224c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
2257c922b88SBarry Smith { \
2267c922b88SBarry Smith   int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
2277c922b88SBarry Smith   dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);onz = dnz + __tmp;\
2287c922b88SBarry Smith   __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\
2297c922b88SBarry Smith   __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\
2307c922b88SBarry Smith   __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp;
2317c922b88SBarry Smith 
232c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
233c4f061fbSSatish Balay {\
234c4f061fbSSatish Balay   int __l;\
235c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\
236c4f061fbSSatish Balay   __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\
237c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
238c4f061fbSSatish Balay     __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\
239c4f061fbSSatish Balay   }\
240c4f061fbSSatish Balay }
241c4f061fbSSatish Balay 
242c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
2437c922b88SBarry Smith { int __i; \
2447c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
2457c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
2467c922b88SBarry Smith   }\
2477c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
2487c922b88SBarry Smith }
2497c922b88SBarry Smith 
250c4f061fbSSatish Balay #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);}
2517c922b88SBarry Smith 
2527b80b807SBarry Smith /* Routines unique to particular data structures */
253ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
254ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
255ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
256ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
2577b80b807SBarry Smith 
258*273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
259*273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
260*273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
261*273d9f13SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,Scalar*);
262*273d9f13SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
263*273d9f13SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*);
264*273d9f13SBarry Smith 
265*273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
266*273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
267*273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
268*273d9f13SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,Scalar*);
269*273d9f13SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**);
270*273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
271*273d9f13SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*);
272*273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
273*273d9f13SBarry Smith 
274ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
275ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
2762e8a6d31SBarry Smith 
2777b80b807SBarry Smith /*
2787b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
2797b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
2807b80b807SBarry Smith */
2817b80b807SBarry Smith 
282b12f92e5SBarry Smith typedef char* MatOrderingType;
283b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
284b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
285b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
286b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
287b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
288b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
289b12f92e5SBarry Smith 
290ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
291ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
292aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
293f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
294b12f92e5SBarry Smith #else
295f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
296b12f92e5SBarry Smith #endif
297ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
298ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
2992bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
3004bbc92c1SBarry Smith extern FList      MatOrderingList;
301d4fbbf0eSBarry Smith 
302ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
303a2ce50c7SBarry Smith 
304ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double);
305ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
306ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
307a2ce50c7SBarry Smith 
3085ef9f2a5SBarry Smith /*
3095ef9f2a5SBarry Smith    Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic()
31014822f30SBarry Smith    of MatLUFactor() and MatLUFactorSymbolic()
3115ef9f2a5SBarry Smith 
31214822f30SBarry Smith    Note: If any entries are added to this context, be sure
31314822f30SBarry Smith          to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h and/or
31414822f30SBarry Smith          to adjust MAT_LUINFO_SIZE  in finclude/petscmat.h
31514822f30SBarry Smith 
31614822f30SBarry Smith    Note: The integer values below are passed in double to allow easy use from Fortran
3175ef9f2a5SBarry Smith  */
3185ef9f2a5SBarry Smith typedef struct {
3195ef9f2a5SBarry Smith   double     levels;  /* ILU(levels) */
3205ef9f2a5SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
3215ef9f2a5SBarry Smith   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
32236db0b34SBarry Smith 
32336db0b34SBarry Smith   double     dt;             /* drop tolerance */
32436db0b34SBarry Smith   double     dtcol;          /* tolerance for pivoting */
32536db0b34SBarry Smith   double     dtcount;        /* maximum nonzeros to be allowed per row */
326c4f061fbSSatish Balay   double     damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */
327b08993e5SBarry Smith   double     damp;    /* if factorization fails, damp until successful */
3285ef9f2a5SBarry Smith } MatILUInfo;
3295ef9f2a5SBarry Smith 
33014822f30SBarry Smith typedef struct {
33114822f30SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
33214822f30SBarry Smith   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
333c4f061fbSSatish Balay   double     damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */
334b08993e5SBarry Smith   double     damp;    /* if factorization fails, damp until successful */
33514822f30SBarry Smith } MatLUInfo;
33614822f30SBarry Smith 
337ffa6d0a5SLois Curfman McInnes typedef struct {
338ffa6d0a5SLois Curfman McInnes   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
339ffa6d0a5SLois Curfman McInnes   double     damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */
340ffa6d0a5SLois Curfman McInnes   double     damp;    /* if factorization fails, damp until successful */
341ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
342ffa6d0a5SLois Curfman McInnes 
34314822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
344ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
34514822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
346ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
347ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
34874637425SBarry Smith EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int);
349ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
350ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
351a2ce50c7SBarry Smith 
352ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
353ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
354ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
355ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
356ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
357ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
3588ed539a5SBarry Smith 
359ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
360bb5a7306SBarry Smith 
361bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
362bb1eb677SSatish Balay 
363ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
364ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
365ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
36684cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
367ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
3688ed539a5SBarry Smith 
369d4fbbf0eSBarry Smith /*
370639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
371639f9d9dSBarry Smith */
372b12f92e5SBarry Smith 
373b12f92e5SBarry Smith typedef char* MatColoringType;
374b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
375b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
376b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
377b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
378b12f92e5SBarry Smith 
379ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
380ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
381aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
382f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
383b12f92e5SBarry Smith #else
384f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
385b12f92e5SBarry Smith #endif
386ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
3872bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
388ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
389ca44d042SBarry Smith EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
390639f9d9dSBarry Smith 
39184cb2905SBarry Smith /*
39284cb2905SBarry Smith     Data structures used to compute Jacobian vector products
39384cb2905SBarry Smith   efficiently using finite differences.
39484cb2905SBarry Smith */
3951a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
396639f9d9dSBarry Smith 
397e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
398639f9d9dSBarry Smith 
399ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
400ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
401ca44d042SBarry Smith EXTERN int MatFDColoringView(MatFDColoring,Viewer);
402ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
403ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
404ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
405ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
406ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
407ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
408ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
409639f9d9dSBarry Smith 
410639f9d9dSBarry Smith /*
4110752156aSBarry Smith     These routines are for partitioning matrices: currently used only
4123eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
4130752156aSBarry Smith */
41491e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
415ca161407SBarry Smith 
41691e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
4172aabb6bbSBarry Smith typedef char* MatPartitioningType;
4182aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
4192aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
420ca161407SBarry Smith 
421ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
422ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
423ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
424ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
425ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
426ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
4272aabb6bbSBarry Smith 
428ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
429aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
430f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
4312aabb6bbSBarry Smith #else
432f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
4332aabb6bbSBarry Smith #endif
4342aabb6bbSBarry Smith 
435ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
4362bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
437ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
4382bad1931SBarry Smith 
439ca44d042SBarry Smith EXTERN int MatPartitioningView(MatPartitioning,Viewer);
440ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
441ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
442ca161407SBarry Smith 
443ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
4440752156aSBarry Smith 
4450752156aSBarry Smith /*
4460a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
447d4fbbf0eSBarry Smith */
4481c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
4491c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
4501c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
4511c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
4521c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
4537c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
4547c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
4551c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
4561c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
4577c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
4587c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
4591c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
4601c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
4611c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
4621c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
4631c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
4641c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
4651c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
4661c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
4671c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
4681c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
4691c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
4701c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
4711c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
4721c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
4731c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
4741c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
4751c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
4761c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
4771c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
4781c1c02c0SLois Curfman McInnes                MATOP_GET_SIZE=30,
4791c1c02c0SLois Curfman McInnes                MATOP_GET_LOCAL_SIZE=31,
4801c1c02c0SLois Curfman McInnes                MATOP_GET_OWNERSHIP_RANGE=32,
4811c1c02c0SLois Curfman McInnes                MATOP_ILUFACTOR_SYMBOLIC=33,
4821c1c02c0SLois Curfman McInnes                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
4831c1c02c0SLois Curfman McInnes                MATOP_GET_ARRAY=35,
4841c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ARRAY=36,
4857bf97ca4SSatish Balay 
486005c665bSBarry Smith                MATOP_CONVERT_SAME_TYPE=37,
487005c665bSBarry Smith                MATOP_FORWARD_SOLVE=38,
488005c665bSBarry Smith                MATOP_BACKWARD_SOLVE=39,
489005c665bSBarry Smith                MATOP_ILUFACTOR=40,
490005c665bSBarry Smith                MATOP_INCOMPLETECHOLESKYFACTOR=41,
491005c665bSBarry Smith                MATOP_AXPY=42,
492005c665bSBarry Smith                MATOP_GET_SUBMATRICES=43,
493005c665bSBarry Smith                MATOP_INCREASE_OVERLAP=44,
494005c665bSBarry Smith                MATOP_GET_VALUES=45,
495005c665bSBarry Smith                MATOP_COPY=46,
496005c665bSBarry Smith                MATOP_PRINT_HELP=47,
497005c665bSBarry Smith                MATOP_SCALE=48,
498005c665bSBarry Smith                MATOP_SHIFT=49,
499005c665bSBarry Smith                MATOP_DIAGONAL_SHIFT=50,
500005c665bSBarry Smith                MATOP_ILUDT_FACTOR=51,
501005c665bSBarry Smith                MATOP_GET_BLOCK_SIZE=52,
502005c665bSBarry Smith                MATOP_GET_ROW_IJ=53,
503005c665bSBarry Smith                MATOP_RESTORE_ROW_IJ=54,
504005c665bSBarry Smith                MATOP_GET_COLUMN_IJ=55,
505005c665bSBarry Smith                MATOP_RESTORE_COLUMN_IJ=56,
506005c665bSBarry Smith                MATOP_FDCOLORING_CREATE=57,
507005c665bSBarry Smith                MATOP_COLORING_PATCH=58,
508005c665bSBarry Smith                MATOP_SET_UNFACTORED=59,
509005c665bSBarry Smith                MATOP_PERMUTE=60,
510005c665bSBarry Smith                MATOP_SET_VALUES_BLOCKED=61,
5111c1c02c0SLois Curfman McInnes                MATOP_DESTROY=250,
5121c1c02c0SLois Curfman McInnes                MATOP_VIEW=251
513fae171e0SBarry Smith              } MatOperation;
514ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
515ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
516ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
517*273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
518112a2221SBarry Smith 
51990ace30eSBarry Smith /*
52090ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
52190ace30eSBarry Smith  stored in a universal format. By changing the format with
522639f9d9dSBarry Smith  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
52390ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
52490ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
52590ace30eSBarry Smith  read into matrices of the same time.
52690ace30eSBarry Smith */
52790ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
52890ace30eSBarry Smith 
5293f1d51d7SBarry Smith /*
5303f1d51d7SBarry Smith      New matrix classes not yet distributed
5313f1d51d7SBarry Smith */
5323f1d51d7SBarry Smith /*
5333f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
5343f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
5353f1d51d7SBarry Smith   the same MatAIJIndices.
5363f1d51d7SBarry Smith */
537e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
5383f1d51d7SBarry Smith 
539ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
540ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
541ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
542ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
543ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
544ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
545ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
546ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
547ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
5483f1d51d7SBarry Smith 
549ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
550ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
551ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
5523f1d51d7SBarry Smith 
553ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
554ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
555ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
5563f1d51d7SBarry Smith 
5576d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
558ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
55908918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
560860d1616SSatish Balay 
56174637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
56274637425SBarry Smith #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
56374637425SBarry Smith 
56474637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
56574637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
56674637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
56774637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
56874637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
56974637425SBarry Smith 
570*273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
571*273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
572*273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
573*273d9f13SBarry Smith 
5743f1d51d7SBarry Smith 
575f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
576c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
577c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
578c4f061fbSSatish Balay 
579*273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
580f069c275SSatish Balay 
5812eac72dbSBarry Smith #endif
5822eac72dbSBarry Smith 
5832eac72dbSBarry Smith 
5849d00d63dSBarry Smith 
585