xref: /petsc/include/petscmat.h (revision 6d0dc95fefccc654d4764c7149defa3f7be6299b)
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 
99cd28387SBarry Smith #define MAT_COOKIE         PETSC_COOKIE+5
10f0479e8cSBarry Smith 
11d9274352SBarry Smith /*S
12d9274352SBarry Smith      Mat - Abstract PETSc matrix object
132eac72dbSBarry Smith 
14d91e6319SBarry Smith    Level: beginner
15d91e6319SBarry Smith 
16d9274352SBarry Smith   Concepts: matrix; linear operator
17d9274352SBarry Smith 
18d9274352SBarry Smith .seealso:  MatCreate(), MatType, MatSetType()
19d9274352SBarry Smith S*/
20d9274352SBarry Smith typedef struct _p_Mat*           Mat;
21d9274352SBarry Smith 
22d9274352SBarry Smith /*E
23d9274352SBarry Smith     MatType - String with the name of a PETSc matrix or the creation function
24d9274352SBarry Smith        with an optional dynamic library name, for example
25d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:mymatcreate()
26d9274352SBarry Smith 
27d9274352SBarry Smith    Level: beginner
28d9274352SBarry Smith 
29d9274352SBarry Smith .seealso: MatSetType(), Mat
30d91e6319SBarry Smith E*/
31273d9f13SBarry Smith #define MATSAME     "same"
32273d9f13SBarry Smith #define MATSEQMAIJ  "seqmaij"
33273d9f13SBarry Smith #define MATMPIMAIJ  "mpimaij"
34273d9f13SBarry Smith #define MATIS       "is"
35273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs"
36273d9f13SBarry Smith #define MATSEQDENSE "seqdense"
37273d9f13SBarry Smith #define MATSEQAIJ   "seqaij"
38273d9f13SBarry Smith #define MATMPIAIJ   "mpiaij"
39273d9f13SBarry Smith #define MATSHELL    "shell"
40273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag"
41273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag"
42273d9f13SBarry Smith #define MATMPIDENSE "mpidense"
43273d9f13SBarry Smith #define MATSEQBAIJ  "seqbaij"
44273d9f13SBarry Smith #define MATMPIBAIJ  "mpibaij"
45273d9f13SBarry Smith #define MATMPIADJ   "mpiadj"
46273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij"
47273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij"
48cebc7f6cSBarry Smith #define MATDAAD     "daad"
49cebc7f6cSBarry Smith #define MATMFFD     "mffd"
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 #ifdef PETSC_USE_NEW_LOGGING
57c06d978dSMatthew Knepley /* Logging support */
58c06d978dSMatthew Knepley extern int MAT_COOKIE;
59c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE;
60c06d978dSMatthew Knepley extern int MATPARTITIONING_COOKIE;
61c06d978dSMatthew Knepley enum {MAT_Mult, MAT_MultMultiple, MAT_MultConstrained, MAT_MultTrans, MAT_MultAdd, MAT_MultTransAdd, MAT_MultMatrixFree,
62c06d978dSMatthew Knepley       MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTrans, MAT_SolveTransAdd, MAT_Relax, MAT_ForwardSolve,
63c06d978dSMatthew Knepley       MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic, MAT_LUFactorNumeric, MAT_CholeskyFactor,
64c06d978dSMatthew Knepley       MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor, MAT_ILUFactorSymbolic,
65c06d978dSMatthew Knepley       MAT_IncompleteCholeskyFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin, MAT_AssemblyEnd,
66c06d978dSMatthew Knepley       MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering, MAT_IncreaseOverlap,
67c06d978dSMatthew Knepley       MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_MAX_EVENTS};
68c06d978dSMatthew Knepley extern int MatEvents[MAT_MAX_EVENTS];
69c06d978dSMatthew Knepley #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(MatEvents[e],o1,o2,o3,o4)
70c06d978dSMatthew Knepley #define MatLogEventEnd(e,o1,o2,o3,o4)   PetscLogEventEnd(MatEvents[e],o1,o2,o3,o4)
71c06d978dSMatthew Knepley 
72c06d978dSMatthew Knepley #else
73c06d978dSMatthew Knepley 
74c06d978dSMatthew Knepley enum {MAT_MultConstrained};
75c06d978dSMatthew Knepley #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(e,o1,o2,o3,o4)
76c06d978dSMatthew Knepley #define MatLogEventEnd(e,o1,o2,o3,o4)   PetscLogEventEnd(e,o1,o2,o3,o4)
77c06d978dSMatthew Knepley #endif
78c06d978dSMatthew Knepley 
79273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
80273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
81273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
82273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
83273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
84273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
85c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
86273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
87273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
88c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
89273d9f13SBarry Smith #else
90273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
91c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
92273d9f13SBarry Smith #endif
93273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
94b0a32e0cSBarry Smith extern PetscFList MatList;
9528988994SBarry Smith 
96c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList;
97c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []);
98c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterDestroy();
99c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled;
100c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
101c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType);
102c06d978dSMatthew Knepley 
103ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
10487828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
10587828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
106ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
107ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
108c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
10987828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
11087828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
111ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
112ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
113ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
114ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
115ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
116ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
1173a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
118435da068SBarry Smith EXTERN int MatDestroy(Mat);
11921c89e3eSBarry Smith 
120ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
1218a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
122ec0117caSBarry Smith 
1238ed539a5SBarry Smith /* ------------------------------------------------------------*/
12487828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12587828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12684cb2905SBarry Smith 
1272ef4de8bSBarry Smith /*S
1282ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
1292ef4de8bSBarry Smith         column of a matrix as index on an associated grid.
1302ef4de8bSBarry Smith 
1312ef4de8bSBarry Smith    Level: beginner
1322ef4de8bSBarry Smith 
1332ef4de8bSBarry Smith   Concepts: matrix; linear operator
1342ef4de8bSBarry Smith 
1352ef4de8bSBarry Smith .seealso:  MatSetValuesStencil(), MatSetStencil()
1362ef4de8bSBarry Smith S*/
137435da068SBarry Smith typedef struct {
138435da068SBarry Smith   int k,j,i,c;
139435da068SBarry Smith } MatStencil;
1402ef4de8bSBarry Smith 
14187828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
14287828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
143435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int);
144435da068SBarry Smith 
1453a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring);
1463a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*);
1473a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*);
1483a7fca6bSBarry Smith 
149d91e6319SBarry Smith /*E
150d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
151d91e6319SBarry Smith      to continue to add values to it
152d91e6319SBarry Smith 
153d91e6319SBarry Smith     Level: beginner
154d91e6319SBarry Smith 
155d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
156d91e6319SBarry Smith E*/
1576d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
158ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
159ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
160ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
1614f9c727eSBarry Smith 
162b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
163ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
164b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
165b951964fSBarry Smith }
166ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
167d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
168ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
169ea06a074SBarry Smith }
170d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
171ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
172d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
173d91e6319SBarry Smith }
174d91e6319SBarry Smith /*E
175d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
176d91e6319SBarry Smith 
177d91e6319SBarry Smith     Level: beginner
178d91e6319SBarry Smith 
1790a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
180d91e6319SBarry Smith 
181d91e6319SBarry Smith .seealso: MatSetOption()
182d91e6319SBarry Smith E*/
1836d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1846d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1856d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1866ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1876ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1886ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1896ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1904787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1917c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1922bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
1938b43beb6SKris Buschelman               MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption;
194ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
195273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
19684cb2905SBarry Smith 
19787828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
19887828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
19987828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
20087828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
20187828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
202ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
20387828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **);
20487828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **);
205ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
2067b80b807SBarry Smith 
207ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
208ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
209ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
210ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
211c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec);
212*6d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
2132eac72dbSBarry Smith 
214d91e6319SBarry Smith /*E
215d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
216d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
217d91e6319SBarry Smith 
218d91e6319SBarry Smith     Level: beginner
219d91e6319SBarry Smith 
220d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
221d91e6319SBarry Smith 
222d91e6319SBarry Smith .seealso: MatDuplicate()
223d91e6319SBarry Smith E*/
2242e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
2252e8a6d31SBarry Smith 
226273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
227273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
228273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
229273d9f13SBarry Smith #else
230273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
231273d9f13SBarry Smith #endif
232273d9f13SBarry Smith EXTERN int        MatConvertRegisterAll(char*);
233273d9f13SBarry Smith EXTERN int        MatConvertRegisterDestroy(void);
234273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
235b0a32e0cSBarry Smith extern PetscFList MatConvertList;
236ca44d042SBarry Smith EXTERN int        MatConvert(Mat,MatType,Mat*);
237ca44d042SBarry Smith EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
23894a9d846SBarry Smith 
239d91e6319SBarry Smith /*E
240d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
241d91e6319SBarry Smith 
242d91e6319SBarry Smith     Level: beginner
243d91e6319SBarry Smith 
244d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
245d91e6319SBarry Smith 
246d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
247d91e6319SBarry Smith E*/
248cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
249cb5b572fSBarry Smith 
250ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
251b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
252273d9f13SBarry Smith 
253b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
254273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
255273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
256273d9f13SBarry Smith #else
257273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
258273d9f13SBarry Smith #endif
259273d9f13SBarry Smith EXTERN int        MatLoadRegisterAll(char*);
260273d9f13SBarry Smith EXTERN int        MatLoadRegisterDestroy(void);
261273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
262b0a32e0cSBarry Smith extern PetscFList MatLoadList;
263b0a32e0cSBarry Smith EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
2647b80b807SBarry Smith 
265ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
266ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
267ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
268ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
269d4fbbf0eSBarry Smith 
270d91e6319SBarry Smith /*S
271d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
272d91e6319SBarry Smith 
273d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
274d91e6319SBarry Smith 
275d91e6319SBarry Smith    Level: intermediate
276d91e6319SBarry Smith 
277d91e6319SBarry Smith   Concepts: matrix^nonzero information
278d91e6319SBarry Smith 
279d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
280d91e6319SBarry Smith S*/
2814e220ebcSLois Curfman McInnes typedef struct {
282b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
283b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
284b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
285b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
286b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
287b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
288b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
289b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
290b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2914e220ebcSLois Curfman McInnes } MatInfo;
2924e220ebcSLois Curfman McInnes 
293d9274352SBarry Smith /*E
294d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
295d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
296d9274352SBarry Smith 
297d9274352SBarry Smith     Level: beginner
298d9274352SBarry Smith 
299d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
300d9274352SBarry Smith 
301d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
302d9274352SBarry Smith E*/
3037b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
304ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
305ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
306ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
307273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
308ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
309ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
310c06d978dSMatthew Knepley EXTERN int MatPermuteSparsify(Mat,int,double,double,IS,IS,Mat *);
311ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
31206ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
313ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
3147b80b807SBarry Smith 
31587828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *);
316ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
31787828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
31887828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
3197b80b807SBarry Smith 
320ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
321ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
322ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
3235ef9f2a5SBarry Smith 
324ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
325ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
326ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
3277b80b807SBarry Smith 
328d91e6319SBarry Smith /*E
329d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
330d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
331d91e6319SBarry Smith 
332d91e6319SBarry Smith     Level: beginner
333d91e6319SBarry Smith 
334d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
335d91e6319SBarry Smith 
336d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
337d91e6319SBarry Smith E*/
3387b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
339ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
340ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
341ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
3428efafbd8SBarry Smith 
343ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
3447b80b807SBarry Smith 
34587828ca2SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat);
34687828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
347ca44d042SBarry Smith EXTERN int MatCompress(Mat);
3487b80b807SBarry Smith 
34987828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat);
35087828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat);
351052efed2SBarry Smith 
352ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
353ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
35487828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
35587828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35687828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35790f02eecSBarry Smith 
358ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
359649db694SBarry Smith 
360ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
361ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
362ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
3637c922b88SBarry Smith 
3647c922b88SBarry Smith /*
365c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
3667c922b88SBarry Smith */
367c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
3687c922b88SBarry Smith { \
369ef66eb69SBarry Smith   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
370ef66eb69SBarry Smith   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
371ef66eb69SBarry Smith   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
372ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
373ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
3747c922b88SBarry Smith 
375c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
376c4f061fbSSatish Balay {\
377c4f061fbSSatish Balay   int __l;\
378ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
379ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
380c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
381ef66eb69SBarry Smith     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
382c4f061fbSSatish Balay   }\
383c4f061fbSSatish Balay }
384c4f061fbSSatish Balay 
385c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3867c922b88SBarry Smith { int __i; \
3877c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3887c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3897c922b88SBarry Smith   }\
3907c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3917c922b88SBarry Smith }
3927c922b88SBarry Smith 
393ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
3947c922b88SBarry Smith 
3957b80b807SBarry Smith /* Routines unique to particular data structures */
396435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
397435da068SBarry Smith 
39887828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
399ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
400ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
40187828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
4027b80b807SBarry Smith 
403273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
404273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
405273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
40687828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
40787828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
40887828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
409273d9f13SBarry Smith 
410273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
411273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
412273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
41387828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
41487828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
415273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
41687828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
417273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
418435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
419435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
4203a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
421273d9f13SBarry Smith 
422ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
423ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
4242e8a6d31SBarry Smith 
4253a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*);
4263a7fca6bSBarry Smith 
4277b80b807SBarry Smith /*
4287b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
4297b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
4307b80b807SBarry Smith */
4317b80b807SBarry Smith 
432d9274352SBarry Smith /*E
433d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
434d9274352SBarry Smith        with an optional dynamic library name, for example
435d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
436d9274352SBarry Smith 
437d9274352SBarry Smith    Level: beginner
438d9274352SBarry Smith 
439d9274352SBarry Smith .seealso: MatGetOrdering()
440d9274352SBarry Smith E*/
441b12f92e5SBarry Smith typedef char* MatOrderingType;
442b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
443b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
444b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
445b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
446b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
447b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
44862152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
44962152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
45062152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
451c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained"
452c06d978dSMatthew Knepley #define MATORDERING_IDENTITY  "identity"
453c06d978dSMatthew Knepley #define MATORDERING_REVERSE   "reverse"
454b12f92e5SBarry Smith 
455ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
456ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
457aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
458f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
459b12f92e5SBarry Smith #else
460f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
461b12f92e5SBarry Smith #endif
462ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
463ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
4642bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
465b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
466d4fbbf0eSBarry Smith 
46787828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
468a2ce50c7SBarry Smith 
46987828ca2SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
47087828ca2SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
471ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
472a2ce50c7SBarry Smith 
473d91e6319SBarry Smith /*S
474d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
4755ef9f2a5SBarry Smith 
476d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
47714822f30SBarry Smith 
478d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
479d91e6319SBarry Smith           All entries are double precision.
480d91e6319SBarry Smith 
481d91e6319SBarry Smith    Level: developer
482d91e6319SBarry Smith 
483d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
484d91e6319SBarry Smith 
485d91e6319SBarry Smith S*/
4865ef9f2a5SBarry Smith typedef struct {
487f6275e2eSBarry Smith   PetscReal     levels;         /* ILU(levels) */
488f6275e2eSBarry Smith   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
489f6275e2eSBarry Smith   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
490f6275e2eSBarry Smith   PetscReal     dt;             /* drop tolerance */
491f6275e2eSBarry Smith   PetscReal     dtcol;          /* tolerance for pivoting */
492f6275e2eSBarry Smith   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
493f6275e2eSBarry Smith   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
494f6275e2eSBarry Smith   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
495f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
4965ef9f2a5SBarry Smith } MatILUInfo;
4975ef9f2a5SBarry Smith 
498d91e6319SBarry Smith /*S
499d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
500d91e6319SBarry Smith 
501d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
502d91e6319SBarry Smith 
503d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
504d91e6319SBarry Smith           All entries are double precision.
505d91e6319SBarry Smith 
506d91e6319SBarry Smith    Level: developer
507d91e6319SBarry Smith 
508d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
509d91e6319SBarry Smith 
510d91e6319SBarry Smith S*/
51114822f30SBarry Smith typedef struct {
512f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
513f6275e2eSBarry Smith   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
514f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
515f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
516f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
51714822f30SBarry Smith } MatLUInfo;
51814822f30SBarry Smith 
519d91e6319SBarry Smith /*S
520d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
521d91e6319SBarry Smith 
522d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
523d91e6319SBarry Smith 
524d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
525d91e6319SBarry Smith           All entries are double precision.
526d91e6319SBarry Smith 
527d91e6319SBarry Smith    Level: developer
528d91e6319SBarry Smith 
529d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
530d91e6319SBarry Smith 
531d91e6319SBarry Smith S*/
532ffa6d0a5SLois Curfman McInnes typedef struct {
533f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
534f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
535f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
536ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
537ffa6d0a5SLois Curfman McInnes 
53814822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
539ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
54014822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
541ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
54287828ca2SBarry Smith EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*);
54387828ca2SBarry Smith EXTERN int MatICCFactor(Mat,IS,PetscReal,int);
544ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
545ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
546a2ce50c7SBarry Smith 
547ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
548ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
549ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
550ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
551ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
552ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
5538ed539a5SBarry Smith 
554ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
555bb5a7306SBarry Smith 
556bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
557d91e6319SBarry Smith /*E
558d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
559bb1eb677SSatish Balay 
560d91e6319SBarry Smith     Level: beginner
561d91e6319SBarry Smith 
562d9274352SBarry Smith    May be bitwise ORd together
563d9274352SBarry Smith 
564d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
565d91e6319SBarry Smith 
566d91e6319SBarry Smith .seealso: MatRelax()
567d91e6319SBarry Smith E*/
568ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
569ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
570ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
57184cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
57287828ca2SBarry Smith EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,Vec);
5738ed539a5SBarry Smith 
574d4fbbf0eSBarry Smith /*
575639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
576639f9d9dSBarry Smith */
577b12f92e5SBarry Smith 
578d9274352SBarry Smith /*E
579d9274352SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
580d9274352SBarry Smith        with an optional dynamic library name, for example
581d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
582d9274352SBarry Smith 
583d9274352SBarry Smith    Level: beginner
584d9274352SBarry Smith 
585d9274352SBarry Smith .seealso: MatGetColoring()
586d9274352SBarry Smith E*/
587b12f92e5SBarry Smith typedef char* MatColoringType;
588b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
589b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
590b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
591b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
592b12f92e5SBarry Smith 
593ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
594ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
595aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
596f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
597b12f92e5SBarry Smith #else
598f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
599b12f92e5SBarry Smith #endif
600ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
6012bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
602ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
603b9617806SBarry Smith EXTERN int        MatColoringPatch(Mat,int,int,int *,ISColoring*);
604639f9d9dSBarry Smith 
6051a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
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 */
63591e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
636ca161407SBarry Smith 
637d9274352SBarry Smith /*S
638d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
639d9274352SBarry Smith 
640d9274352SBarry Smith    Level: beginner
641d9274352SBarry Smith 
642d9274352SBarry Smith   Concepts: partitioning
643d9274352SBarry Smith 
644d9274352SBarry Smith .seealso:  MatParitioningCreate(), MatPartitioningType
645d9274352SBarry Smith S*/
64691e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
647d9274352SBarry Smith 
648d9274352SBarry Smith /*E
649d9274352SBarry Smith     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
650d9274352SBarry Smith        with an optional dynamic library name, for example
651d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
652d9274352SBarry Smith 
653d9274352SBarry Smith    Level: beginner
654d9274352SBarry Smith 
655d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning
656d9274352SBarry Smith E*/
6572aabb6bbSBarry Smith typedef char* MatPartitioningType;
6582aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
6592aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
660ca161407SBarry Smith 
661ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
662ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
663ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
664ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
665ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
666ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
6672aabb6bbSBarry Smith 
668ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
669aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
670f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
6712aabb6bbSBarry Smith #else
672f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
6732aabb6bbSBarry Smith #endif
6742aabb6bbSBarry Smith 
675ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
6762bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
677ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
6782bad1931SBarry Smith 
679b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
680ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
681ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
682ca161407SBarry Smith 
683ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
6840752156aSBarry Smith 
6850752156aSBarry Smith /*
6860a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
687d4fbbf0eSBarry Smith */
6881c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
6891c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
6901c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
6911c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
6921c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
6937c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
6947c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
6951c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
6961c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
6977c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
6987c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
6991c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
7001c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
7011c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
7021c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
7031c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
7041c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
7051c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
7061c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
7071c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
7081c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
7091c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
7101c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
7111c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
7121c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
7131c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
7141c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
7151c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
7161c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
7171c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
7181c1c02c0SLois Curfman McInnes                MATOP_GET_SIZE=30,
7191c1c02c0SLois Curfman McInnes                MATOP_GET_LOCAL_SIZE=31,
7201c1c02c0SLois Curfman McInnes                MATOP_GET_OWNERSHIP_RANGE=32,
7211c1c02c0SLois Curfman McInnes                MATOP_ILUFACTOR_SYMBOLIC=33,
7224d101231SSatish Balay                MATOP_ICCFACTOR_SYMBOLIC=34,
7231c1c02c0SLois Curfman McInnes                MATOP_GET_ARRAY=35,
7241c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ARRAY=36,
7257bf97ca4SSatish Balay 
726005c665bSBarry Smith                MATOP_CONVERT_SAME_TYPE=37,
727005c665bSBarry Smith                MATOP_FORWARD_SOLVE=38,
728005c665bSBarry Smith                MATOP_BACKWARD_SOLVE=39,
729005c665bSBarry Smith                MATOP_ILUFACTOR=40,
7304d101231SSatish Balay                MATOP_ICCFACTOR=41,
731005c665bSBarry Smith                MATOP_AXPY=42,
732005c665bSBarry Smith                MATOP_GET_SUBMATRICES=43,
733005c665bSBarry Smith                MATOP_INCREASE_OVERLAP=44,
734005c665bSBarry Smith                MATOP_GET_VALUES=45,
735005c665bSBarry Smith                MATOP_COPY=46,
736005c665bSBarry Smith                MATOP_PRINT_HELP=47,
737005c665bSBarry Smith                MATOP_SCALE=48,
738005c665bSBarry Smith                MATOP_SHIFT=49,
739005c665bSBarry Smith                MATOP_DIAGONAL_SHIFT=50,
740005c665bSBarry Smith                MATOP_ILUDT_FACTOR=51,
741005c665bSBarry Smith                MATOP_GET_BLOCK_SIZE=52,
742005c665bSBarry Smith                MATOP_GET_ROW_IJ=53,
743005c665bSBarry Smith                MATOP_RESTORE_ROW_IJ=54,
744005c665bSBarry Smith                MATOP_GET_COLUMN_IJ=55,
745005c665bSBarry Smith                MATOP_RESTORE_COLUMN_IJ=56,
746005c665bSBarry Smith                MATOP_FDCOLORING_CREATE=57,
747005c665bSBarry Smith                MATOP_COLORING_PATCH=58,
748005c665bSBarry Smith                MATOP_SET_UNFACTORED=59,
749005c665bSBarry Smith                MATOP_PERMUTE=60,
750005c665bSBarry Smith                MATOP_SET_VALUES_BLOCKED=61,
751c06d978dSMatthew Knepley                MATOP_GET_SUBMATRIX=62,
752c06d978dSMatthew Knepley                MATOP_GET_MAPS=65,
753c06d978dSMatthew Knepley                MATOP_USE_SCALED_FORM=66,
754c06d978dSMatthew Knepley                MATOP_SCALE_SYSTEM=67,
755c06d978dSMatthew Knepley                MATOP_UNSCALE_SYSTEM=68,
756c06d978dSMatthew Knepley                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=69,
757c06d978dSMatthew Knepley                MATOP_SET_VALUES_LOCAL=70,
758c06d978dSMatthew Knepley                MATOP_ZERO_ROWS_LOCAL=71,
759c06d978dSMatthew Knepley                MATOP_GET_ROW_MAX=72,
760c06d978dSMatthew Knepley                MATOP_CONVERT=73,
761c06d978dSMatthew Knepley                MATOP_SET_COLORING=74,
762c06d978dSMatthew Knepley                MATOP_SET_VALUES_ADIC=75,
763c06d978dSMatthew Knepley                MATOP_SET_VALUES_ADIFOR=76,
764c06d978dSMatthew Knepley                MATOP_FD_COLORING_APPLY=77,
765c06d978dSMatthew Knepley                MATOP_SET_FROM_OPTIONS=78,
766c06d978dSMatthew Knepley                MATOP_MULT_CONSTRAINED=79,
767*6d0dc95fSMatthew Knepley                MATOP_MULT_TRANSPOSE_CONSTRAINED=80,
768c06d978dSMatthew Knepley                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=80,
769c06d978dSMatthew Knepley                MATOP_SERIALIZE=81,
770c06d978dSMatthew Knepley                MATOP_PERMUTE_SPARSIFY=82,
771c06d978dSMatthew Knepley                MATOP_MULT_MULTIPLE=83,
772c06d978dSMatthew Knepley                MATOP_SOLVE_MULTIPLE=84,
7731c1c02c0SLois Curfman McInnes                MATOP_DESTROY=250,
7741c1c02c0SLois Curfman McInnes                MATOP_VIEW=251
775fae171e0SBarry Smith              } MatOperation;
776ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
77737bd1cefSSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)());
77837bd1cefSSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)());
779273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
780112a2221SBarry Smith 
78190ace30eSBarry Smith /*
78290ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
78390ace30eSBarry Smith  stored in a universal format. By changing the format with
784fb9695e5SSatish Balay  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
78590ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
78690ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
78790ace30eSBarry Smith  read into matrices of the same time.
78890ace30eSBarry Smith */
78990ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
79090ace30eSBarry Smith 
7913f1d51d7SBarry Smith /*
7923f1d51d7SBarry Smith      New matrix classes not yet distributed
7933f1d51d7SBarry Smith */
7943f1d51d7SBarry Smith /*
7953f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
7963f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
7973f1d51d7SBarry Smith   the same MatAIJIndices.
7983f1d51d7SBarry Smith */
799e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
8003f1d51d7SBarry Smith 
801ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
802ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
803ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
804ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
805ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
806ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
807ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
808ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
809ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
8103f1d51d7SBarry Smith 
811ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
812ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
81387828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
8143f1d51d7SBarry Smith 
815ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
816ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
81787828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
8183f1d51d7SBarry Smith 
8196d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
820ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
82108918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
822860d1616SSatish Balay 
823d9274352SBarry Smith /*S
824d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
825d9274352SBarry Smith          orthogonalizes the vector to a subsapce
826d9274352SBarry Smith 
827d9274352SBarry Smith    Level: beginner
828d9274352SBarry Smith 
829d9274352SBarry Smith   Concepts: matrix; linear operator, null space
830d9274352SBarry Smith 
831d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
832d9274352SBarry Smith S*/
83374637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
834d9274352SBarry Smith 
83574637425SBarry Smith #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
83674637425SBarry Smith 
83774637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
83874637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
83974637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
84074637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
84174637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
84274637425SBarry Smith 
843273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
844273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
845273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
846273d9f13SBarry Smith 
8473f1d51d7SBarry Smith 
848f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
849c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
850c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
851c4f061fbSSatish Balay 
852273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
853f069c275SSatish Balay 
854b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
855b0a32e0cSBarry Smith 
8562eac72dbSBarry Smith #endif
8572eac72dbSBarry Smith 
8582eac72dbSBarry Smith 
8599d00d63dSBarry Smith 
860