xref: /petsc/include/petscmat.h (revision d5ba7fb7d3f82433fc93946f26018f4b1c7683c8)
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 */
57c06d978dSMatthew Knepley extern int MAT_COOKIE;
58c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE;
598ba1e511SMatthew Knepley extern int MAT_PARTITIONING_COOKIE;
608ba1e511SMatthew Knepley extern int MAT_NULLSPACE_COOKIE;
61*d5ba7fb7SMatthew Knepley extern int MAT_Mult, MAT_MultMatrixFree, MAT_MultMultiple, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
62*d5ba7fb7SMatthew Knepley extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTranspose;
63*d5ba7fb7SMatthew Knepley extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
64*d5ba7fb7SMatthew Knepley extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
65*d5ba7fb7SMatthew Knepley extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
66*d5ba7fb7SMatthew Knepley extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
67*d5ba7fb7SMatthew Knepley extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
68*d5ba7fb7SMatthew Knepley extern int MAT_FDColoringApply;
69c06d978dSMatthew Knepley 
708ba1e511SMatthew Knepley EXTERN int MatInitializePackage(char *);
71c06d978dSMatthew Knepley 
72273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
73273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
74273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
75273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
76273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
77273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
78c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
79273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
80273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
81c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
82273d9f13SBarry Smith #else
83273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
84c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
85273d9f13SBarry Smith #endif
86273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
87b0a32e0cSBarry Smith extern PetscFList MatList;
8828988994SBarry Smith 
89c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList;
90c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []);
91c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterDestroy();
92c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled;
93c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
94c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType);
95c06d978dSMatthew Knepley 
96ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
9787828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
9887828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
99ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
100ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
101c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
10287828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
10387828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
104ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
105ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
106ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
107ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
108ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
109ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
1103a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
111435da068SBarry Smith EXTERN int MatDestroy(Mat);
11221c89e3eSBarry Smith 
113ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
1148a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
115ec0117caSBarry Smith 
1168ed539a5SBarry Smith /* ------------------------------------------------------------*/
11787828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
11887828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
11984cb2905SBarry Smith 
1202ef4de8bSBarry Smith /*S
1212ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
1222ef4de8bSBarry Smith         column of a matrix as index on an associated grid.
1232ef4de8bSBarry Smith 
1242ef4de8bSBarry Smith    Level: beginner
1252ef4de8bSBarry Smith 
1262ef4de8bSBarry Smith   Concepts: matrix; linear operator
1272ef4de8bSBarry Smith 
1282ef4de8bSBarry Smith .seealso:  MatSetValuesStencil(), MatSetStencil()
1292ef4de8bSBarry Smith S*/
130435da068SBarry Smith typedef struct {
131435da068SBarry Smith   int k,j,i,c;
132435da068SBarry Smith } MatStencil;
1332ef4de8bSBarry Smith 
13487828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
13587828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
136435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int);
137435da068SBarry Smith 
1383a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring);
1393a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*);
1403a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*);
1413a7fca6bSBarry Smith 
142d91e6319SBarry Smith /*E
143d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
144d91e6319SBarry Smith      to continue to add values to it
145d91e6319SBarry Smith 
146d91e6319SBarry Smith     Level: beginner
147d91e6319SBarry Smith 
148d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
149d91e6319SBarry Smith E*/
1506d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
151ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
152ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
153ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
1544f9c727eSBarry Smith 
155b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
156ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
157b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
158b951964fSBarry Smith }
159ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
160d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
161ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
162ea06a074SBarry Smith }
163d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
164ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
165d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
166d91e6319SBarry Smith }
167d91e6319SBarry Smith /*E
168d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
169d91e6319SBarry Smith 
170d91e6319SBarry Smith     Level: beginner
171d91e6319SBarry Smith 
1720a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
173d91e6319SBarry Smith 
174d91e6319SBarry Smith .seealso: MatSetOption()
175d91e6319SBarry Smith E*/
1766d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1776d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1786d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1796ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1806ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1816ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1826ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1834787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1847c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1852bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
1868b43beb6SKris Buschelman               MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption;
187ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
188273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
18984cb2905SBarry Smith 
19087828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
19187828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
19287828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
19387828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
19487828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
195ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
19687828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **);
19787828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **);
198ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
1997b80b807SBarry Smith 
200ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
201ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
202ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
203ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
204c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec);
2056d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
2062eac72dbSBarry Smith 
207d91e6319SBarry Smith /*E
208d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
209d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
210d91e6319SBarry Smith 
211d91e6319SBarry Smith     Level: beginner
212d91e6319SBarry Smith 
213d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
214d91e6319SBarry Smith 
215d91e6319SBarry Smith .seealso: MatDuplicate()
216d91e6319SBarry Smith E*/
2172e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
2182e8a6d31SBarry Smith 
219273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
220273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
221273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
222273d9f13SBarry Smith #else
223273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
224273d9f13SBarry Smith #endif
225273d9f13SBarry Smith EXTERN int        MatConvertRegisterAll(char*);
226273d9f13SBarry Smith EXTERN int        MatConvertRegisterDestroy(void);
227273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
228b0a32e0cSBarry Smith extern PetscFList MatConvertList;
229ca44d042SBarry Smith EXTERN int        MatConvert(Mat,MatType,Mat*);
230ca44d042SBarry Smith EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
23194a9d846SBarry Smith 
232d91e6319SBarry Smith /*E
233d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
234d91e6319SBarry Smith 
235d91e6319SBarry Smith     Level: beginner
236d91e6319SBarry Smith 
237d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
238d91e6319SBarry Smith 
239d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
240d91e6319SBarry Smith E*/
241cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
242cb5b572fSBarry Smith 
243ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
244b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
245273d9f13SBarry Smith 
246b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
247273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
248273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
249273d9f13SBarry Smith #else
250273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
251273d9f13SBarry Smith #endif
252273d9f13SBarry Smith EXTERN int        MatLoadRegisterAll(char*);
253273d9f13SBarry Smith EXTERN int        MatLoadRegisterDestroy(void);
254273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
255b0a32e0cSBarry Smith extern PetscFList MatLoadList;
256b0a32e0cSBarry Smith EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
2577b80b807SBarry Smith 
258ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
259ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
260ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
261ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
262d4fbbf0eSBarry Smith 
263d91e6319SBarry Smith /*S
264d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
265d91e6319SBarry Smith 
266d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
267d91e6319SBarry Smith 
268d91e6319SBarry Smith    Level: intermediate
269d91e6319SBarry Smith 
270d91e6319SBarry Smith   Concepts: matrix^nonzero information
271d91e6319SBarry Smith 
272d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
273d91e6319SBarry Smith S*/
2744e220ebcSLois Curfman McInnes typedef struct {
275b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
276b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
277b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
278b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
279b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
280b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
281b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
282b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
283b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2844e220ebcSLois Curfman McInnes } MatInfo;
2854e220ebcSLois Curfman McInnes 
286d9274352SBarry Smith /*E
287d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
288d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
289d9274352SBarry Smith 
290d9274352SBarry Smith     Level: beginner
291d9274352SBarry Smith 
292d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
293d9274352SBarry Smith 
294d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
295d9274352SBarry Smith E*/
2967b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
297ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
298ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
299ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
300273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
301ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
302ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
303c06d978dSMatthew Knepley EXTERN int MatPermuteSparsify(Mat,int,double,double,IS,IS,Mat *);
304ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
30506ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
306ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
3077b80b807SBarry Smith 
30887828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *);
309ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
31087828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
31187828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
3127b80b807SBarry Smith 
313ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
314ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
315ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
3165ef9f2a5SBarry Smith 
317ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
318ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
319ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
3207b80b807SBarry Smith 
321d91e6319SBarry Smith /*E
322d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
323d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
324d91e6319SBarry Smith 
325d91e6319SBarry Smith     Level: beginner
326d91e6319SBarry Smith 
327d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
328d91e6319SBarry Smith 
329d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
330d91e6319SBarry Smith E*/
3317b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
332ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
333ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
334ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
3358efafbd8SBarry Smith 
336ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
3377b80b807SBarry Smith 
33887828ca2SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat);
33987828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
340ca44d042SBarry Smith EXTERN int MatCompress(Mat);
3417b80b807SBarry Smith 
34287828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat);
34387828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat);
344052efed2SBarry Smith 
345ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
346ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
34787828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
34887828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
34987828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35090f02eecSBarry Smith 
351ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
352649db694SBarry Smith 
353ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
354ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
355ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
3567c922b88SBarry Smith 
3577c922b88SBarry Smith /*
358c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
3597c922b88SBarry Smith */
360c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
3617c922b88SBarry Smith { \
362ef66eb69SBarry Smith   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
363ef66eb69SBarry Smith   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
364ef66eb69SBarry Smith   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
365ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
366ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
3677c922b88SBarry Smith 
368c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
369c4f061fbSSatish Balay {\
370c4f061fbSSatish Balay   int __l;\
371ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
372ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
373c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
374ef66eb69SBarry Smith     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
375c4f061fbSSatish Balay   }\
376c4f061fbSSatish Balay }
377c4f061fbSSatish Balay 
378c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3797c922b88SBarry Smith { int __i; \
3807c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3817c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3827c922b88SBarry Smith   }\
3837c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3847c922b88SBarry Smith }
3857c922b88SBarry Smith 
386ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
3877c922b88SBarry Smith 
3887b80b807SBarry Smith /* Routines unique to particular data structures */
389435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
390435da068SBarry Smith 
39187828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
392ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
393ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
39487828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
3957b80b807SBarry Smith 
396273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
397273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
398273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
39987828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
40087828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
40187828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
402273d9f13SBarry Smith 
403273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
404273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
405273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
40687828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
40787828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
408273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
40987828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
410273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
411435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
412435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
4133a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
414273d9f13SBarry Smith 
415ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
416ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
4172e8a6d31SBarry Smith 
4183a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*);
4193a7fca6bSBarry Smith 
4207b80b807SBarry Smith /*
4217b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
4227b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
4237b80b807SBarry Smith */
4247b80b807SBarry Smith 
425d9274352SBarry Smith /*E
426d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
427d9274352SBarry Smith        with an optional dynamic library name, for example
428d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
429d9274352SBarry Smith 
430d9274352SBarry Smith    Level: beginner
431d9274352SBarry Smith 
432d9274352SBarry Smith .seealso: MatGetOrdering()
433d9274352SBarry Smith E*/
434b12f92e5SBarry Smith typedef char* MatOrderingType;
435b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
436b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
437b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
438b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
439b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
440b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
44162152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
44262152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
44362152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
444c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained"
445c06d978dSMatthew Knepley #define MATORDERING_IDENTITY  "identity"
446c06d978dSMatthew Knepley #define MATORDERING_REVERSE   "reverse"
447b12f92e5SBarry Smith 
448ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
449ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
450aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
451f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
452b12f92e5SBarry Smith #else
453f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
454b12f92e5SBarry Smith #endif
455ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
456ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
4572bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
458b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
459d4fbbf0eSBarry Smith 
46087828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
461a2ce50c7SBarry Smith 
46287828ca2SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
46387828ca2SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
464ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
465a2ce50c7SBarry Smith 
466d91e6319SBarry Smith /*S
467d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
4685ef9f2a5SBarry Smith 
469d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
47014822f30SBarry Smith 
471d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
472d91e6319SBarry Smith           All entries are double precision.
473d91e6319SBarry Smith 
474d91e6319SBarry Smith    Level: developer
475d91e6319SBarry Smith 
476d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
477d91e6319SBarry Smith 
478d91e6319SBarry Smith S*/
4795ef9f2a5SBarry Smith typedef struct {
480f6275e2eSBarry Smith   PetscReal     levels;         /* ILU(levels) */
481f6275e2eSBarry Smith   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
482f6275e2eSBarry Smith   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
483f6275e2eSBarry Smith   PetscReal     dt;             /* drop tolerance */
484f6275e2eSBarry Smith   PetscReal     dtcol;          /* tolerance for pivoting */
485f6275e2eSBarry Smith   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
486f6275e2eSBarry Smith   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
487f6275e2eSBarry Smith   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
488f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
4895ef9f2a5SBarry Smith } MatILUInfo;
4905ef9f2a5SBarry Smith 
491d91e6319SBarry Smith /*S
492d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
493d91e6319SBarry Smith 
494d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
495d91e6319SBarry Smith 
496d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
497d91e6319SBarry Smith           All entries are double precision.
498d91e6319SBarry Smith 
499d91e6319SBarry Smith    Level: developer
500d91e6319SBarry Smith 
501d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
502d91e6319SBarry Smith 
503d91e6319SBarry Smith S*/
50414822f30SBarry Smith typedef struct {
505f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
506f6275e2eSBarry Smith   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
507f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
508f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
509f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
51014822f30SBarry Smith } MatLUInfo;
51114822f30SBarry Smith 
512d91e6319SBarry Smith /*S
513d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
514d91e6319SBarry Smith 
515d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
516d91e6319SBarry Smith 
517d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
518d91e6319SBarry Smith           All entries are double precision.
519d91e6319SBarry Smith 
520d91e6319SBarry Smith    Level: developer
521d91e6319SBarry Smith 
522d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
523d91e6319SBarry Smith 
524d91e6319SBarry Smith S*/
525ffa6d0a5SLois Curfman McInnes typedef struct {
526f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
527f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
528f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
529ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
530ffa6d0a5SLois Curfman McInnes 
53114822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
532ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
53314822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
534ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
53587828ca2SBarry Smith EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*);
53687828ca2SBarry Smith EXTERN int MatICCFactor(Mat,IS,PetscReal,int);
537ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
538ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
539a2ce50c7SBarry Smith 
540ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
541ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
542ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
543ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
544ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
545ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
5468ed539a5SBarry Smith 
547ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
548bb5a7306SBarry Smith 
549bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
550d91e6319SBarry Smith /*E
551d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
552bb1eb677SSatish Balay 
553d91e6319SBarry Smith     Level: beginner
554d91e6319SBarry Smith 
555d9274352SBarry Smith    May be bitwise ORd together
556d9274352SBarry Smith 
557d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
558d91e6319SBarry Smith 
559d91e6319SBarry Smith .seealso: MatRelax()
560d91e6319SBarry Smith E*/
561ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
562ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
563ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
56484cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
56587828ca2SBarry Smith EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,Vec);
5668ed539a5SBarry Smith 
567d4fbbf0eSBarry Smith /*
568639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
569639f9d9dSBarry Smith */
570b12f92e5SBarry Smith 
571d9274352SBarry Smith /*E
572d9274352SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
573d9274352SBarry Smith        with an optional dynamic library name, for example
574d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
575d9274352SBarry Smith 
576d9274352SBarry Smith    Level: beginner
577d9274352SBarry Smith 
578d9274352SBarry Smith .seealso: MatGetColoring()
579d9274352SBarry Smith E*/
580b12f92e5SBarry Smith typedef char* MatColoringType;
581b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
582b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
583b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
584b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
585b12f92e5SBarry Smith 
586ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
587ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
588aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
589f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
590b12f92e5SBarry Smith #else
591f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
592b12f92e5SBarry Smith #endif
593ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
5942bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
595ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
596b9617806SBarry Smith EXTERN int        MatColoringPatch(Mat,int,int,int *,ISColoring*);
597639f9d9dSBarry Smith 
598d9274352SBarry Smith /*S
599d9274352SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences
600d9274352SBarry Smith         and coloring
601639f9d9dSBarry Smith 
602d9274352SBarry Smith    Level: beginner
603d9274352SBarry Smith 
604d9274352SBarry Smith   Concepts: coloring, sparse Jacobian, finite differences
605d9274352SBarry Smith 
606d9274352SBarry Smith .seealso:  MatFDColoringCreate()
607d9274352SBarry Smith S*/
608e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
609639f9d9dSBarry Smith 
610ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
611ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
612b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
613ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
61487828ca2SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
615ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
616ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
617ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
618ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
61987828ca2SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
62062152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring);
6213a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
622639f9d9dSBarry Smith 
623639f9d9dSBarry Smith /*
6240752156aSBarry Smith     These routines are for partitioning matrices: currently used only
6253eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
6260752156aSBarry Smith */
627ca161407SBarry Smith 
628d9274352SBarry Smith /*S
629d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
630d9274352SBarry Smith 
631d9274352SBarry Smith    Level: beginner
632d9274352SBarry Smith 
633d9274352SBarry Smith   Concepts: partitioning
634d9274352SBarry Smith 
635d9274352SBarry Smith .seealso:  MatParitioningCreate(), MatPartitioningType
636d9274352SBarry Smith S*/
63791e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
638d9274352SBarry Smith 
639d9274352SBarry Smith /*E
640d9274352SBarry Smith     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
641d9274352SBarry Smith        with an optional dynamic library name, for example
642d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
643d9274352SBarry Smith 
644d9274352SBarry Smith    Level: beginner
645d9274352SBarry Smith 
646d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning
647d9274352SBarry Smith E*/
6482aabb6bbSBarry Smith typedef char* MatPartitioningType;
6498ba1e511SMatthew Knepley #define MAT_PARTITIONING_CURRENT  "current"
6508ba1e511SMatthew Knepley #define MAT_PARTITIONING_PARMETIS "parmetis"
651ca161407SBarry Smith 
652ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
653ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
654ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
655ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
656ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
657ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
6582aabb6bbSBarry Smith 
659ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
660aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
661f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
6622aabb6bbSBarry Smith #else
663f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
6642aabb6bbSBarry Smith #endif
6652aabb6bbSBarry Smith 
666ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
6672bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
668ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
6692bad1931SBarry Smith 
670b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
671ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
672ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
673ca161407SBarry Smith 
674ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
6750752156aSBarry Smith 
6760752156aSBarry Smith /*
6770a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
678d4fbbf0eSBarry Smith */
6791c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
6801c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
6811c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
6821c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
6831c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
6847c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
6857c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
6861c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
6871c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
6887c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
6897c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
6901c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
6911c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
6921c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
6931c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
6941c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
6951c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
6961c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
6971c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
6981c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
6991c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
7001c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
7011c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
7021c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
7031c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
7041c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
7051c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
7061c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
7071c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
7081c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
709d643ce63SMatthew Knepley                MATOP_SETUP_PREALLOCATION=30,
710d643ce63SMatthew Knepley                MATOP_ILUFACTOR_SYMBOLIC=31,
711d643ce63SMatthew Knepley                MATOP_ICCFACTOR_SYMBOLIC=32,
712d643ce63SMatthew Knepley                MATOP_GET_ARRAY=33,
713d643ce63SMatthew Knepley                MATOP_RESTORE_ARRAY=34,
714d643ce63SMatthew Knepley                MATOP_DUPLCIATE=35,
715d643ce63SMatthew Knepley                MATOP_FORWARD_SOLVE=36,
716d643ce63SMatthew Knepley                MATOP_BACKWARD_SOLVE=37,
717d643ce63SMatthew Knepley                MATOP_ILUFACTOR=38,
718d643ce63SMatthew Knepley                MATOP_ICCFACTOR=39,
719d643ce63SMatthew Knepley                MATOP_AXPY=40,
720d643ce63SMatthew Knepley                MATOP_GET_SUBMATRICES=41,
721d643ce63SMatthew Knepley                MATOP_INCREASE_OVERLAP=42,
722d643ce63SMatthew Knepley                MATOP_GET_VALUES=43,
723d643ce63SMatthew Knepley                MATOP_COPY=44,
724d643ce63SMatthew Knepley                MATOP_PRINT_HELP=45,
725d643ce63SMatthew Knepley                MATOP_SCALE=46,
726d643ce63SMatthew Knepley                MATOP_SHIFT=47,
727d643ce63SMatthew Knepley                MATOP_DIAGONAL_SHIFT=48,
728d643ce63SMatthew Knepley                MATOP_ILUDT_FACTOR=49,
729d643ce63SMatthew Knepley                MATOP_GET_BLOCK_SIZE=50,
730d643ce63SMatthew Knepley                MATOP_GET_ROW_IJ=51,
731d643ce63SMatthew Knepley                MATOP_RESTORE_ROW_IJ=52,
732d643ce63SMatthew Knepley                MATOP_GET_COLUMN_IJ=53,
733d643ce63SMatthew Knepley                MATOP_RESTORE_COLUMN_IJ=54,
734d643ce63SMatthew Knepley                MATOP_FDCOLORING_CREATE=55,
735d643ce63SMatthew Knepley                MATOP_COLORING_PATCH=56,
736d643ce63SMatthew Knepley                MATOP_SET_UNFACTORED=57,
737d643ce63SMatthew Knepley                MATOP_PERMUTE=58,
738d643ce63SMatthew Knepley                MATOP_SET_VALUES_BLOCKED=59,
739d643ce63SMatthew Knepley                MATOP_GET_SUBMATRIX=60,
740d643ce63SMatthew Knepley                MATOP_DESTROY=61,
741d643ce63SMatthew Knepley                MATOP_VIEW=62,
742d643ce63SMatthew Knepley                MATOP_GET_MAPS=63,
743d643ce63SMatthew Knepley                MATOP_USE_SCALED_FORM=64,
744d643ce63SMatthew Knepley                MATOP_SCALE_SYSTEM=65,
745d643ce63SMatthew Knepley                MATOP_UNSCALE_SYSTEM=66,
746d643ce63SMatthew Knepley                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
747d643ce63SMatthew Knepley                MATOP_SET_VALUES_LOCAL=68,
748d643ce63SMatthew Knepley                MATOP_ZERO_ROWS_LOCAL=69,
749d643ce63SMatthew Knepley                MATOP_GET_ROW_MAX=70,
750d643ce63SMatthew Knepley                MATOP_CONVERT=71,
751d643ce63SMatthew Knepley                MATOP_SET_COLORING=72,
752d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIC=73,
753d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIFOR=74,
754d643ce63SMatthew Knepley                MATOP_FD_COLORING_APPLY=75,
755d643ce63SMatthew Knepley                MATOP_SET_FROM_OPTIONS=76,
756d643ce63SMatthew Knepley                MATOP_MULT_CONSTRAINED=77,
757d643ce63SMatthew Knepley                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
758d643ce63SMatthew Knepley                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
759d643ce63SMatthew Knepley                MATOP_PERMUTE_SPARSIFY=80,
760d643ce63SMatthew Knepley                MATOP_MULT_MULTIPLE=81,
761d643ce63SMatthew Knepley                MATOP_SOLVE_MULTIPLE=82
762fae171e0SBarry Smith              } MatOperation;
763ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
764ff8b7a98SSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void));
765ff8b7a98SSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void));
766273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
767112a2221SBarry Smith 
76890ace30eSBarry Smith /*
76990ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
77090ace30eSBarry Smith  stored in a universal format. By changing the format with
771fb9695e5SSatish Balay  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
77290ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
77390ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
77490ace30eSBarry Smith  read into matrices of the same time.
77590ace30eSBarry Smith */
77690ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
77790ace30eSBarry Smith 
7783f1d51d7SBarry Smith /*
7793f1d51d7SBarry Smith      New matrix classes not yet distributed
7803f1d51d7SBarry Smith */
7813f1d51d7SBarry Smith /*
7823f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
7833f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
7843f1d51d7SBarry Smith   the same MatAIJIndices.
7853f1d51d7SBarry Smith */
786e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
7873f1d51d7SBarry Smith 
788ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
789ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
790ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
791ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
792ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
793ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
794ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
795ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
796ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
7973f1d51d7SBarry Smith 
798ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
799ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
80087828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
8013f1d51d7SBarry Smith 
802ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
803ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
80487828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
8053f1d51d7SBarry Smith 
8066d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
807ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
80808918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
809860d1616SSatish Balay 
810d9274352SBarry Smith /*S
811d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
812d9274352SBarry Smith          orthogonalizes the vector to a subsapce
813d9274352SBarry Smith 
814d9274352SBarry Smith    Level: beginner
815d9274352SBarry Smith 
816d9274352SBarry Smith   Concepts: matrix; linear operator, null space
817d9274352SBarry Smith 
818d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
819d9274352SBarry Smith S*/
82074637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
821d9274352SBarry Smith 
82274637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
82374637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
82474637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
82574637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
82674637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
82774637425SBarry Smith 
828273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
829273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
830273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
831273d9f13SBarry Smith 
8323f1d51d7SBarry Smith 
833f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
834c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
835c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
836c4f061fbSSatish Balay 
837273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
838f069c275SSatish Balay 
839b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
840b0a32e0cSBarry Smith 
8412eac72dbSBarry Smith #endif
8422eac72dbSBarry Smith 
8432eac72dbSBarry Smith 
8449d00d63dSBarry Smith 
845