xref: /petsc/include/petscmat.h (revision 71d41ebea002c39c9b5b507d620e850321ba9750)
173f4d377SMatthew Knepley /* $Id: petscmat.h,v 1.228 2001/09/07 20:09:08 bsmith Exp $ */
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 
9d9274352SBarry Smith /*S
10d9274352SBarry Smith      Mat - Abstract PETSc matrix object
112eac72dbSBarry Smith 
12d91e6319SBarry Smith    Level: beginner
13d91e6319SBarry Smith 
14d9274352SBarry Smith   Concepts: matrix; linear operator
15d9274352SBarry Smith 
16d9274352SBarry Smith .seealso:  MatCreate(), MatType, MatSetType()
17d9274352SBarry Smith S*/
18d9274352SBarry Smith typedef struct _p_Mat*           Mat;
19d9274352SBarry Smith 
20d9274352SBarry Smith /*E
21d9274352SBarry Smith     MatType - String with the name of a PETSc matrix or the creation function
22d9274352SBarry Smith        with an optional dynamic library name, for example
23d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
24d9274352SBarry Smith 
25d9274352SBarry Smith    Level: beginner
26d9274352SBarry Smith 
27d9274352SBarry Smith .seealso: MatSetType(), Mat
28d91e6319SBarry Smith E*/
29273d9f13SBarry Smith #define MATSAME     "same"
30273d9f13SBarry Smith #define MATSEQMAIJ  "seqmaij"
31273d9f13SBarry Smith #define MATMPIMAIJ  "mpimaij"
32273d9f13SBarry Smith #define MATIS       "is"
33273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs"
34273d9f13SBarry Smith #define MATSEQDENSE "seqdense"
35273d9f13SBarry Smith #define MATSEQAIJ   "seqaij"
36273d9f13SBarry Smith #define MATMPIAIJ   "mpiaij"
37273d9f13SBarry Smith #define MATSHELL    "shell"
38273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag"
39273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag"
40273d9f13SBarry Smith #define MATMPIDENSE "mpidense"
41273d9f13SBarry Smith #define MATSEQBAIJ  "seqbaij"
42273d9f13SBarry Smith #define MATMPIBAIJ  "mpibaij"
43273d9f13SBarry Smith #define MATMPIADJ   "mpiadj"
44273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij"
45273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij"
46cebc7f6cSBarry Smith #define MATDAAD     "daad"
47cebc7f6cSBarry Smith #define MATMFFD     "mffd"
486d88219bSBarry Smith #define MATESI      "esi"
496d88219bSBarry Smith #define MATPETSCESI "petscesi"
50273d9f13SBarry Smith typedef char* MatType;
51d91e6319SBarry Smith 
52c06d978dSMatthew Knepley #define MAT_SER_SEQAIJ_BINARY "seqaij_binary"
53c06d978dSMatthew Knepley #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary"
54c06d978dSMatthew Knepley typedef char *MatSerializeType;
55c06d978dSMatthew Knepley 
56c06d978dSMatthew Knepley /* Logging support */
57552e946dSBarry Smith #define    MAT_FILE_COOKIE 1211216    /* used to indicate matrices in binary files */
58c06d978dSMatthew Knepley extern int MAT_COOKIE;
59*71d41ebeSBarry Smith extern int MATSNESMFCTX_COOKIE;
60c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE;
618ba1e511SMatthew Knepley extern int MAT_PARTITIONING_COOKIE;
628ba1e511SMatthew Knepley extern int MAT_NULLSPACE_COOKIE;
63d5ba7fb7SMatthew Knepley extern int MAT_Mult, MAT_MultMatrixFree, MAT_MultMultiple, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
64d5ba7fb7SMatthew Knepley extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTranspose;
65d5ba7fb7SMatthew Knepley extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
66d5ba7fb7SMatthew Knepley extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
67d5ba7fb7SMatthew Knepley extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
68d5ba7fb7SMatthew Knepley extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
69d5ba7fb7SMatthew Knepley extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
7094e3eecaSKris Buschelman extern int MAT_FDColoringApply, MAT_Transpose;
71c06d978dSMatthew Knepley 
728ba1e511SMatthew Knepley EXTERN int MatInitializePackage(char *);
73c06d978dSMatthew Knepley 
74273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
75273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
76273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
77273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
78273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
79273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
80c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
81273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
82273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
83c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
84273d9f13SBarry Smith #else
85273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
86c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
87273d9f13SBarry Smith #endif
88273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
89b0a32e0cSBarry Smith extern PetscFList MatList;
9028988994SBarry Smith 
91c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList;
92c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []);
9365804fbbSSatish Balay EXTERN int MatSerializeRegisterDestroy(void);
94c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled;
95c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
96c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType);
97c06d978dSMatthew Knepley 
98ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
9987828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
10087828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
101ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
102ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
103c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
10487828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
10587828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
106ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
107ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
108ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
109ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
110ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
111ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
1123a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
113435da068SBarry Smith EXTERN int MatDestroy(Mat);
11421c89e3eSBarry Smith 
115ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
1168a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
117ec0117caSBarry Smith 
1188ed539a5SBarry Smith /* ------------------------------------------------------------*/
11987828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12087828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12184cb2905SBarry Smith 
1222ef4de8bSBarry Smith /*S
1232ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
1242ef4de8bSBarry Smith         column of a matrix as index on an associated grid.
1252ef4de8bSBarry Smith 
1262ef4de8bSBarry Smith    Level: beginner
1272ef4de8bSBarry Smith 
1282ef4de8bSBarry Smith   Concepts: matrix; linear operator
1292ef4de8bSBarry Smith 
1302ef4de8bSBarry Smith .seealso:  MatSetValuesStencil(), MatSetStencil()
1312ef4de8bSBarry Smith S*/
132435da068SBarry Smith typedef struct {
133435da068SBarry Smith   int k,j,i,c;
134435da068SBarry Smith } MatStencil;
1352ef4de8bSBarry Smith 
13687828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
13787828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
138435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int);
139435da068SBarry Smith 
1403a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring);
1413a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*);
1423a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*);
1433a7fca6bSBarry Smith 
144d91e6319SBarry Smith /*E
145d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
146d91e6319SBarry Smith      to continue to add values to it
147d91e6319SBarry Smith 
148d91e6319SBarry Smith     Level: beginner
149d91e6319SBarry Smith 
150d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
151d91e6319SBarry Smith E*/
1526d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
153ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
154ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
155ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
1564f9c727eSBarry Smith 
157b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
158ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
159b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
160b951964fSBarry Smith }
161ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
162d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
163ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
164ea06a074SBarry Smith }
165d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
166ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
167d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
168d91e6319SBarry Smith }
169d91e6319SBarry Smith /*E
170d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
171d91e6319SBarry Smith 
172d91e6319SBarry Smith     Level: beginner
173d91e6319SBarry Smith 
1740a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
175d91e6319SBarry Smith 
176d91e6319SBarry Smith .seealso: MatSetOption()
177d91e6319SBarry Smith E*/
1786d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1796d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1806d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1816ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1826ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1836ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1846ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1854787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1867c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1872bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
1888b43beb6SKris Buschelman               MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption;
189ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
190273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
19184cb2905SBarry Smith 
19287828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
19387828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
19487828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
19587828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
19687828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
197ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
19887828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **);
19987828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **);
200ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
2017b80b807SBarry Smith 
202ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
203ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
204ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
205ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
206c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec);
2076d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
2082eac72dbSBarry Smith 
209d91e6319SBarry Smith /*E
210d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
211d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
212d91e6319SBarry Smith 
213d91e6319SBarry Smith     Level: beginner
214d91e6319SBarry Smith 
215d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
216d91e6319SBarry Smith 
217d91e6319SBarry Smith .seealso: MatDuplicate()
218d91e6319SBarry Smith E*/
2192e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
2202e8a6d31SBarry Smith 
221273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
222273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
223273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
224273d9f13SBarry Smith #else
225273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
226273d9f13SBarry Smith #endif
227273d9f13SBarry Smith EXTERN int        MatConvertRegisterAll(char*);
228273d9f13SBarry Smith EXTERN int        MatConvertRegisterDestroy(void);
229273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
230b0a32e0cSBarry Smith extern PetscFList MatConvertList;
231ca44d042SBarry Smith EXTERN int        MatConvert(Mat,MatType,Mat*);
232ca44d042SBarry Smith EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
23394a9d846SBarry Smith 
234d91e6319SBarry Smith /*E
235d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
236d91e6319SBarry Smith 
237d91e6319SBarry Smith     Level: beginner
238d91e6319SBarry Smith 
239d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
240d91e6319SBarry Smith 
241d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
242d91e6319SBarry Smith E*/
243cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
244cb5b572fSBarry Smith 
245ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
246b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
247273d9f13SBarry Smith 
248b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
249273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
250273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
251273d9f13SBarry Smith #else
252273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
253273d9f13SBarry Smith #endif
254273d9f13SBarry Smith EXTERN int        MatLoadRegisterAll(char*);
255273d9f13SBarry Smith EXTERN int        MatLoadRegisterDestroy(void);
256273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
257b0a32e0cSBarry Smith extern PetscFList MatLoadList;
258b0a32e0cSBarry Smith EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
2597b80b807SBarry Smith 
260ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
261ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
262ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
263ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
264d4fbbf0eSBarry Smith 
265d91e6319SBarry Smith /*S
266d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
267d91e6319SBarry Smith 
268d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
269d91e6319SBarry Smith 
270d91e6319SBarry Smith    Level: intermediate
271d91e6319SBarry Smith 
272d91e6319SBarry Smith   Concepts: matrix^nonzero information
273d91e6319SBarry Smith 
274d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
275d91e6319SBarry Smith S*/
2764e220ebcSLois Curfman McInnes typedef struct {
277b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
278b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
279b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
280b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
281b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
282b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
283b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
284b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
285b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2864e220ebcSLois Curfman McInnes } MatInfo;
2874e220ebcSLois Curfman McInnes 
288d9274352SBarry Smith /*E
289d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
290d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
291d9274352SBarry Smith 
292d9274352SBarry Smith     Level: beginner
293d9274352SBarry Smith 
294d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
295d9274352SBarry Smith 
296d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
297d9274352SBarry Smith E*/
2987b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
299ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
300ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
301ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
302273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
303ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
304ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
305bf1d55d4SSatish Balay EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *);
306ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
30706ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
308ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
3097b80b807SBarry Smith 
31087828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *);
311ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
31287828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
31387828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
3147b80b807SBarry Smith 
315ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
316ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
317ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
3185ef9f2a5SBarry Smith 
319ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
320ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
321ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
3227b80b807SBarry Smith 
323d91e6319SBarry Smith /*E
324d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
325d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
326d91e6319SBarry Smith 
327d91e6319SBarry Smith     Level: beginner
328d91e6319SBarry Smith 
329d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
330d91e6319SBarry Smith 
331d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
332d91e6319SBarry Smith E*/
3337b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
334ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
335ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
336ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
3378efafbd8SBarry Smith 
338ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
3397b80b807SBarry Smith 
340607cd303SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat,MatStructure);
34187828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
342ca44d042SBarry Smith EXTERN int MatCompress(Mat);
3437b80b807SBarry Smith 
34487828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat);
34587828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat);
346052efed2SBarry Smith 
347ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
348ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
34987828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
35087828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35187828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35290f02eecSBarry Smith 
353ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
354649db694SBarry Smith 
355ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
356ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
357ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
3587c922b88SBarry Smith 
3597c922b88SBarry Smith /*
360c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
3617c922b88SBarry Smith */
362c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
3637c922b88SBarry Smith { \
364ef66eb69SBarry Smith   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
365ef66eb69SBarry Smith   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
366ef66eb69SBarry Smith   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
367ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
368ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
3697c922b88SBarry Smith 
370c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
371c4f061fbSSatish Balay {\
372c4f061fbSSatish Balay   int __l;\
373ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
374ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
375c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
376ef66eb69SBarry Smith     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
377c4f061fbSSatish Balay   }\
378c4f061fbSSatish Balay }
379c4f061fbSSatish Balay 
380c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3817c922b88SBarry Smith { int __i; \
3827c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3837c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3847c922b88SBarry Smith   }\
3857c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3867c922b88SBarry Smith }
3877c922b88SBarry Smith 
388ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
3897c922b88SBarry Smith 
3907b80b807SBarry Smith /* Routines unique to particular data structures */
391435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
392435da068SBarry Smith 
39387828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
394ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
395ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
39687828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
3977b80b807SBarry Smith 
398273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
399273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
400273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
40187828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
40287828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
40387828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
404273d9f13SBarry Smith 
405273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
406273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
407273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
40887828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
40987828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
410273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
41187828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
412273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
413435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
414435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
4153a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
416273d9f13SBarry Smith 
417ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
418ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
4192e8a6d31SBarry Smith 
4203a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*);
4213a7fca6bSBarry Smith 
4227b80b807SBarry Smith /*
4237b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
4247b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
4257b80b807SBarry Smith */
4267b80b807SBarry Smith 
427d9274352SBarry Smith /*E
428d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
429d9274352SBarry Smith        with an optional dynamic library name, for example
430d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
431d9274352SBarry Smith 
432d9274352SBarry Smith    Level: beginner
433d9274352SBarry Smith 
434d9274352SBarry Smith .seealso: MatGetOrdering()
435d9274352SBarry Smith E*/
436b12f92e5SBarry Smith typedef char* MatOrderingType;
437b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
438b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
439b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
440b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
441b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
442b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
44362152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
44462152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
44562152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
446c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained"
447c06d978dSMatthew Knepley #define MATORDERING_IDENTITY  "identity"
448c06d978dSMatthew Knepley #define MATORDERING_REVERSE   "reverse"
449b12f92e5SBarry Smith 
450ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
451ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
452aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
453f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
454b12f92e5SBarry Smith #else
455f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
456b12f92e5SBarry Smith #endif
457ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
458ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
4592bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
460b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
461d4fbbf0eSBarry Smith 
46287828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
463a2ce50c7SBarry Smith 
46487828ca2SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
46587828ca2SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
466ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
467a2ce50c7SBarry Smith 
468d91e6319SBarry Smith /*S
469d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
4705ef9f2a5SBarry Smith 
471d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
47214822f30SBarry Smith 
473d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
474d91e6319SBarry Smith           All entries are double precision.
475d91e6319SBarry Smith 
476d91e6319SBarry Smith    Level: developer
477d91e6319SBarry Smith 
478d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
479d91e6319SBarry Smith 
480d91e6319SBarry Smith S*/
4815ef9f2a5SBarry Smith typedef struct {
482f6275e2eSBarry Smith   PetscReal     levels;         /* ILU(levels) */
483f6275e2eSBarry Smith   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
484f6275e2eSBarry Smith   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
485f6275e2eSBarry Smith   PetscReal     dt;             /* drop tolerance */
486f6275e2eSBarry Smith   PetscReal     dtcol;          /* tolerance for pivoting */
487f6275e2eSBarry Smith   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
488f6275e2eSBarry Smith   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
489f6275e2eSBarry Smith   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
490f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
491bcd9e38bSBarry Smith   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
492bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
4935ef9f2a5SBarry Smith } MatILUInfo;
4945ef9f2a5SBarry Smith 
495d91e6319SBarry Smith /*S
496d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
497d91e6319SBarry Smith 
498d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
499d91e6319SBarry Smith 
500d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
501d91e6319SBarry Smith           All entries are double precision.
502d91e6319SBarry Smith 
503d91e6319SBarry Smith    Level: developer
504d91e6319SBarry Smith 
505d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
506d91e6319SBarry Smith 
507d91e6319SBarry Smith S*/
50814822f30SBarry Smith typedef struct {
509f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
510f6275e2eSBarry Smith   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
511f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
512f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
513f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
514bcd9e38bSBarry Smith   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
515bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
51614822f30SBarry Smith } MatLUInfo;
51714822f30SBarry Smith 
518d91e6319SBarry Smith /*S
519d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
520d91e6319SBarry Smith 
521d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
522d91e6319SBarry Smith 
523d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
524d91e6319SBarry Smith           All entries are double precision.
525d91e6319SBarry Smith 
526d91e6319SBarry Smith    Level: developer
527d91e6319SBarry Smith 
528d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
529d91e6319SBarry Smith 
530d91e6319SBarry Smith S*/
531ffa6d0a5SLois Curfman McInnes typedef struct {
532f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
533f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
534f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
535bcd9e38bSBarry Smith   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
536bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
537ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
538ffa6d0a5SLois Curfman McInnes 
53914822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
540ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
54114822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
542ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
54387828ca2SBarry Smith EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*);
54487828ca2SBarry Smith EXTERN int MatICCFactor(Mat,IS,PetscReal,int);
545ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
546ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
547a2ce50c7SBarry Smith 
548ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
549ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
550ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
551ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
552ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
553ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
5548ed539a5SBarry Smith 
555ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
556bb5a7306SBarry Smith 
557bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
558d91e6319SBarry Smith /*E
559d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
560bb1eb677SSatish Balay 
561d91e6319SBarry Smith     Level: beginner
562d91e6319SBarry Smith 
563d9274352SBarry Smith    May be bitwise ORd together
564d9274352SBarry Smith 
565d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
566d91e6319SBarry Smith 
567d91e6319SBarry Smith .seealso: MatRelax()
568d91e6319SBarry Smith E*/
569ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
570ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
571ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
57284cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
573c14dc6b6SHong Zhang EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec);
5748ed539a5SBarry Smith 
575d4fbbf0eSBarry Smith /*
576639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
577639f9d9dSBarry Smith */
578b12f92e5SBarry Smith 
579d9274352SBarry Smith /*E
580d9274352SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
581d9274352SBarry Smith        with an optional dynamic library name, for example
582d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
583d9274352SBarry Smith 
584d9274352SBarry Smith    Level: beginner
585d9274352SBarry Smith 
586d9274352SBarry Smith .seealso: MatGetColoring()
587d9274352SBarry Smith E*/
588b12f92e5SBarry Smith typedef char* MatColoringType;
589b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
590b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
591b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
592b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
593b12f92e5SBarry Smith 
594ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
595ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
596aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
597f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
598b12f92e5SBarry Smith #else
599f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
600b12f92e5SBarry Smith #endif
601ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
6022bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
603ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
604b9617806SBarry Smith EXTERN int        MatColoringPatch(Mat,int,int,int *,ISColoring*);
605639f9d9dSBarry Smith 
606d9274352SBarry Smith /*S
607d9274352SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences
608d9274352SBarry Smith         and coloring
609639f9d9dSBarry Smith 
610d9274352SBarry Smith    Level: beginner
611d9274352SBarry Smith 
612d9274352SBarry Smith   Concepts: coloring, sparse Jacobian, finite differences
613d9274352SBarry Smith 
614d9274352SBarry Smith .seealso:  MatFDColoringCreate()
615d9274352SBarry Smith S*/
616e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
617639f9d9dSBarry Smith 
618ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
619ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
620b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
621ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
62287828ca2SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
623ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
624ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
625ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
626ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
62787828ca2SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
62862152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring);
6293a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
630639f9d9dSBarry Smith 
631639f9d9dSBarry Smith /*
6320752156aSBarry Smith     These routines are for partitioning matrices: currently used only
6333eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
6340752156aSBarry Smith */
635ca161407SBarry Smith 
636d9274352SBarry Smith /*S
637d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
638d9274352SBarry Smith 
639d9274352SBarry Smith    Level: beginner
640d9274352SBarry Smith 
641d9274352SBarry Smith   Concepts: partitioning
642d9274352SBarry Smith 
643d9274352SBarry Smith .seealso:  MatParitioningCreate(), MatPartitioningType
644d9274352SBarry Smith S*/
64591e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
646d9274352SBarry Smith 
647d9274352SBarry Smith /*E
648d9274352SBarry Smith     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
649d9274352SBarry Smith        with an optional dynamic library name, for example
650d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
651d9274352SBarry Smith 
652d9274352SBarry Smith    Level: beginner
653d9274352SBarry Smith 
654d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning
655d9274352SBarry Smith E*/
6562aabb6bbSBarry Smith typedef char* MatPartitioningType;
6578ba1e511SMatthew Knepley #define MAT_PARTITIONING_CURRENT  "current"
6588ba1e511SMatthew Knepley #define MAT_PARTITIONING_PARMETIS "parmetis"
659ca161407SBarry Smith 
660ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
661ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
662ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
663ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
664ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
665ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
6662aabb6bbSBarry Smith 
667ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
668aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
669f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
6702aabb6bbSBarry Smith #else
671f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
6722aabb6bbSBarry Smith #endif
6732aabb6bbSBarry Smith 
674ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
6752bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
676ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
6772bad1931SBarry Smith 
678b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
679ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
680ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
681ca161407SBarry Smith 
682ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
6830752156aSBarry Smith 
6840752156aSBarry Smith /*
6850a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
686d4fbbf0eSBarry Smith */
6871c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
6881c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
6891c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
6901c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
6911c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
6927c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
6937c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
6941c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
6951c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
6967c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
6977c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
6981c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
6991c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
7001c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
7011c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
7021c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
7031c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
7041c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
7051c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
7061c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
7071c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
7081c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
7091c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
7101c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
7111c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
7121c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
7131c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
7141c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
7151c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
7161c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
717d643ce63SMatthew Knepley                MATOP_SETUP_PREALLOCATION=30,
718d643ce63SMatthew Knepley                MATOP_ILUFACTOR_SYMBOLIC=31,
719d643ce63SMatthew Knepley                MATOP_ICCFACTOR_SYMBOLIC=32,
720d643ce63SMatthew Knepley                MATOP_GET_ARRAY=33,
721d643ce63SMatthew Knepley                MATOP_RESTORE_ARRAY=34,
722d643ce63SMatthew Knepley                MATOP_DUPLCIATE=35,
723d643ce63SMatthew Knepley                MATOP_FORWARD_SOLVE=36,
724d643ce63SMatthew Knepley                MATOP_BACKWARD_SOLVE=37,
725d643ce63SMatthew Knepley                MATOP_ILUFACTOR=38,
726d643ce63SMatthew Knepley                MATOP_ICCFACTOR=39,
727d643ce63SMatthew Knepley                MATOP_AXPY=40,
728d643ce63SMatthew Knepley                MATOP_GET_SUBMATRICES=41,
729d643ce63SMatthew Knepley                MATOP_INCREASE_OVERLAP=42,
730d643ce63SMatthew Knepley                MATOP_GET_VALUES=43,
731d643ce63SMatthew Knepley                MATOP_COPY=44,
732d643ce63SMatthew Knepley                MATOP_PRINT_HELP=45,
733d643ce63SMatthew Knepley                MATOP_SCALE=46,
734d643ce63SMatthew Knepley                MATOP_SHIFT=47,
735d643ce63SMatthew Knepley                MATOP_DIAGONAL_SHIFT=48,
736d643ce63SMatthew Knepley                MATOP_ILUDT_FACTOR=49,
737d643ce63SMatthew Knepley                MATOP_GET_BLOCK_SIZE=50,
738d643ce63SMatthew Knepley                MATOP_GET_ROW_IJ=51,
739d643ce63SMatthew Knepley                MATOP_RESTORE_ROW_IJ=52,
740d643ce63SMatthew Knepley                MATOP_GET_COLUMN_IJ=53,
741d643ce63SMatthew Knepley                MATOP_RESTORE_COLUMN_IJ=54,
742d643ce63SMatthew Knepley                MATOP_FDCOLORING_CREATE=55,
743d643ce63SMatthew Knepley                MATOP_COLORING_PATCH=56,
744d643ce63SMatthew Knepley                MATOP_SET_UNFACTORED=57,
745d643ce63SMatthew Knepley                MATOP_PERMUTE=58,
746d643ce63SMatthew Knepley                MATOP_SET_VALUES_BLOCKED=59,
747d643ce63SMatthew Knepley                MATOP_GET_SUBMATRIX=60,
748d643ce63SMatthew Knepley                MATOP_DESTROY=61,
749d643ce63SMatthew Knepley                MATOP_VIEW=62,
750d643ce63SMatthew Knepley                MATOP_GET_MAPS=63,
751d643ce63SMatthew Knepley                MATOP_USE_SCALED_FORM=64,
752d643ce63SMatthew Knepley                MATOP_SCALE_SYSTEM=65,
753d643ce63SMatthew Knepley                MATOP_UNSCALE_SYSTEM=66,
754d643ce63SMatthew Knepley                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
755d643ce63SMatthew Knepley                MATOP_SET_VALUES_LOCAL=68,
756d643ce63SMatthew Knepley                MATOP_ZERO_ROWS_LOCAL=69,
757d643ce63SMatthew Knepley                MATOP_GET_ROW_MAX=70,
758d643ce63SMatthew Knepley                MATOP_CONVERT=71,
759d643ce63SMatthew Knepley                MATOP_SET_COLORING=72,
760d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIC=73,
761d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIFOR=74,
762d643ce63SMatthew Knepley                MATOP_FD_COLORING_APPLY=75,
763d643ce63SMatthew Knepley                MATOP_SET_FROM_OPTIONS=76,
764d643ce63SMatthew Knepley                MATOP_MULT_CONSTRAINED=77,
765d643ce63SMatthew Knepley                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
766d643ce63SMatthew Knepley                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
767d643ce63SMatthew Knepley                MATOP_PERMUTE_SPARSIFY=80,
768d643ce63SMatthew Knepley                MATOP_MULT_MULTIPLE=81,
769d643ce63SMatthew Knepley                MATOP_SOLVE_MULTIPLE=82
770fae171e0SBarry Smith              } MatOperation;
771ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
772ff8b7a98SSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void));
773ff8b7a98SSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void));
774273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
775112a2221SBarry Smith 
77690ace30eSBarry Smith /*
77790ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
77890ace30eSBarry Smith  stored in a universal format. By changing the format with
779fb9695e5SSatish Balay  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
78090ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
78190ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
78290ace30eSBarry Smith  read into matrices of the same time.
78390ace30eSBarry Smith */
78490ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
78590ace30eSBarry Smith 
7863f1d51d7SBarry Smith /*
7873f1d51d7SBarry Smith      New matrix classes not yet distributed
7883f1d51d7SBarry Smith */
7893f1d51d7SBarry Smith /*
7903f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
7913f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
7923f1d51d7SBarry Smith   the same MatAIJIndices.
7933f1d51d7SBarry Smith */
794e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
7953f1d51d7SBarry Smith 
796ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
797ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
798ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
799ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
800ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
801ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
802ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
803ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
804ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
8053f1d51d7SBarry Smith 
806ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
807ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
80887828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
8093f1d51d7SBarry Smith 
810ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
811ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
81287828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
8133f1d51d7SBarry Smith 
8146d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
815ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
81608918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
817860d1616SSatish Balay 
818d9274352SBarry Smith /*S
819d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
820d9274352SBarry Smith          orthogonalizes the vector to a subsapce
821d9274352SBarry Smith 
822d9274352SBarry Smith    Level: beginner
823d9274352SBarry Smith 
824d9274352SBarry Smith   Concepts: matrix; linear operator, null space
825d9274352SBarry Smith 
8266e1639daSBarry Smith   Users manual sections:
8276e1639daSBarry Smith .   sec_singular
8286e1639daSBarry Smith 
829d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
830d9274352SBarry Smith S*/
83174637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
832d9274352SBarry Smith 
83374637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
83474637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
83574637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
83674637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
83774637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
83874637425SBarry Smith 
839273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
840273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
841273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
842273d9f13SBarry Smith 
8433f1d51d7SBarry Smith 
844f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
845c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
846c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
847c4f061fbSSatish Balay 
848273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
849f069c275SSatish Balay 
850b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
851b0a32e0cSBarry Smith 
85224a595ddSBarry Smith EXTERN int MatESISetType(Mat,char*);
85324a595ddSBarry Smith EXTERN int MatESISetFromOptions(Mat);
85424a595ddSBarry Smith 
85504f1ad80SBarry Smith EXTERN int MatMPIBAIJDiagonalScaleLocalSetUp(Mat,Vec);
85604f1ad80SBarry Smith EXTERN int MatMPIBAIJDiagonalScaleLocal(Mat,Vec);
85704f1ad80SBarry Smith 
8582eac72dbSBarry Smith #endif
8592eac72dbSBarry Smith 
8602eac72dbSBarry Smith 
8619d00d63dSBarry Smith 
862