xref: /petsc/include/petscmat.h (revision c8a8475e04bcaa43590892a5c3e60c6f87bc31f7)
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"
50*c8a8475eSBarry Smith #define MATNORMAL   "normal"
51273d9f13SBarry Smith typedef char* MatType;
52d91e6319SBarry Smith 
53c06d978dSMatthew Knepley #define MAT_SER_SEQAIJ_BINARY "seqaij_binary"
54c06d978dSMatthew Knepley #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary"
55c06d978dSMatthew Knepley typedef char *MatSerializeType;
56c06d978dSMatthew Knepley 
57c06d978dSMatthew Knepley /* Logging support */
58552e946dSBarry Smith #define    MAT_FILE_COOKIE 1211216    /* used to indicate matrices in binary files */
59c06d978dSMatthew Knepley extern int MAT_COOKIE;
6071d41ebeSBarry Smith extern int MATSNESMFCTX_COOKIE;
61c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE;
628ba1e511SMatthew Knepley extern int MAT_PARTITIONING_COOKIE;
638ba1e511SMatthew Knepley extern int MAT_NULLSPACE_COOKIE;
64d5ba7fb7SMatthew Knepley extern int MAT_Mult, MAT_MultMatrixFree, MAT_MultMultiple, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
65d5ba7fb7SMatthew Knepley extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTranspose;
66d5ba7fb7SMatthew Knepley extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
67d5ba7fb7SMatthew Knepley extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
68d5ba7fb7SMatthew Knepley extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
69d5ba7fb7SMatthew Knepley extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
70d5ba7fb7SMatthew Knepley extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
7194e3eecaSKris Buschelman extern int MAT_FDColoringApply, MAT_Transpose;
72c06d978dSMatthew Knepley 
738ba1e511SMatthew Knepley EXTERN int MatInitializePackage(char *);
74c06d978dSMatthew Knepley 
75273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
76273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
77273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
78273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
79273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
80273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
81c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
82273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
83273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
84c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
85273d9f13SBarry Smith #else
86273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
87c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
88273d9f13SBarry Smith #endif
89273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
90b0a32e0cSBarry Smith extern PetscFList MatList;
9128988994SBarry Smith 
92c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList;
93c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []);
9465804fbbSSatish Balay EXTERN int MatSerializeRegisterDestroy(void);
95c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled;
96c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
97c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType);
98c06d978dSMatthew Knepley 
9987828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
10087828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
101ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
102ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
103c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
10487828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
10587828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
106ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
107ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
108ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
109ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
110ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
111ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
1123a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
113*c8a8475eSBarry Smith EXTERN int MatCreateNormal(Mat,Mat*);
114435da068SBarry Smith EXTERN int MatDestroy(Mat);
11521c89e3eSBarry Smith 
116ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
1178a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
118ec0117caSBarry Smith 
1198ed539a5SBarry Smith /* ------------------------------------------------------------*/
12087828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12187828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12284cb2905SBarry Smith 
1232ef4de8bSBarry Smith /*S
1242ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
1252ef4de8bSBarry Smith         column of a matrix as index on an associated grid.
1262ef4de8bSBarry Smith 
1272ef4de8bSBarry Smith    Level: beginner
1282ef4de8bSBarry Smith 
1292ef4de8bSBarry Smith   Concepts: matrix; linear operator
1302ef4de8bSBarry Smith 
1312ef4de8bSBarry Smith .seealso:  MatSetValuesStencil(), MatSetStencil()
1322ef4de8bSBarry Smith S*/
133435da068SBarry Smith typedef struct {
134435da068SBarry Smith   int k,j,i,c;
135435da068SBarry Smith } MatStencil;
1362ef4de8bSBarry Smith 
13787828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
13887828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
139435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int);
140435da068SBarry Smith 
1413a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring);
1423a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*);
1433a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*);
1443a7fca6bSBarry Smith 
145d91e6319SBarry Smith /*E
146d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
147d91e6319SBarry Smith      to continue to add values to it
148d91e6319SBarry Smith 
149d91e6319SBarry Smith     Level: beginner
150d91e6319SBarry Smith 
151d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
152d91e6319SBarry Smith E*/
1536d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
154ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
155ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
156ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
1574f9c727eSBarry Smith 
158b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
159ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
160b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
161b951964fSBarry Smith }
162ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
163d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
164ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
165ea06a074SBarry Smith }
166d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
167ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
168d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
169d91e6319SBarry Smith }
170d91e6319SBarry Smith /*E
171d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
172d91e6319SBarry Smith 
173d91e6319SBarry Smith     Level: beginner
174d91e6319SBarry Smith 
1750a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
176d91e6319SBarry Smith 
177d91e6319SBarry Smith .seealso: MatSetOption()
178d91e6319SBarry Smith E*/
1796d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1806d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1816d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1826ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1836ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1846ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1856ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1864787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1877c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1882bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
1898b43beb6SKris Buschelman               MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption;
190ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
191273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
19284cb2905SBarry Smith 
19387828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
19487828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
19587828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
19687828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
19787828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
198ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
19987828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **);
20087828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **);
201ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
2027b80b807SBarry Smith 
203ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
204ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
205ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
206ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
207c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec);
2086d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
2092eac72dbSBarry Smith 
210d91e6319SBarry Smith /*E
211d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
212d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
213d91e6319SBarry Smith 
214d91e6319SBarry Smith     Level: beginner
215d91e6319SBarry Smith 
216d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
217d91e6319SBarry Smith 
218d91e6319SBarry Smith .seealso: MatDuplicate()
219d91e6319SBarry Smith E*/
2202e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
2212e8a6d31SBarry Smith 
222273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
223273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
224273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
225273d9f13SBarry Smith #else
226273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
227273d9f13SBarry Smith #endif
228273d9f13SBarry Smith EXTERN int        MatConvertRegisterAll(char*);
229273d9f13SBarry Smith EXTERN int        MatConvertRegisterDestroy(void);
230273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
231b0a32e0cSBarry Smith extern PetscFList MatConvertList;
232ca44d042SBarry Smith EXTERN int        MatConvert(Mat,MatType,Mat*);
233ca44d042SBarry Smith EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
23494a9d846SBarry Smith 
235d91e6319SBarry Smith /*E
236d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
237d91e6319SBarry Smith 
238d91e6319SBarry Smith     Level: beginner
239d91e6319SBarry Smith 
240d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
241d91e6319SBarry Smith 
242d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
243d91e6319SBarry Smith E*/
244cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
245cb5b572fSBarry Smith 
246ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
247b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
248273d9f13SBarry Smith 
249b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
250273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
251273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
252273d9f13SBarry Smith #else
253273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
254273d9f13SBarry Smith #endif
255273d9f13SBarry Smith EXTERN int        MatLoadRegisterAll(char*);
256273d9f13SBarry Smith EXTERN int        MatLoadRegisterDestroy(void);
257273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
258b0a32e0cSBarry Smith extern PetscFList MatLoadList;
259b0a32e0cSBarry Smith EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
2607b80b807SBarry Smith 
261ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
262ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
263ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
264ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
265d4fbbf0eSBarry Smith 
266d91e6319SBarry Smith /*S
267d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
268d91e6319SBarry Smith 
269d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
270d91e6319SBarry Smith 
271d91e6319SBarry Smith    Level: intermediate
272d91e6319SBarry Smith 
273d91e6319SBarry Smith   Concepts: matrix^nonzero information
274d91e6319SBarry Smith 
275d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
276d91e6319SBarry Smith S*/
2774e220ebcSLois Curfman McInnes typedef struct {
278b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
279b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
280b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
281b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
282b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
283b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
284b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
285b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
286b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2874e220ebcSLois Curfman McInnes } MatInfo;
2884e220ebcSLois Curfman McInnes 
289d9274352SBarry Smith /*E
290d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
291d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
292d9274352SBarry Smith 
293d9274352SBarry Smith     Level: beginner
294d9274352SBarry Smith 
295d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
296d9274352SBarry Smith 
297d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
298d9274352SBarry Smith E*/
2997b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
300ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
301ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
302ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
303273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
304ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
305ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
306bf1d55d4SSatish Balay EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *);
307ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
30806ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
309ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
3107b80b807SBarry Smith 
31187828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *);
312ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
31387828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
31487828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
3157b80b807SBarry Smith 
316ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
317ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
318ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
3195ef9f2a5SBarry Smith 
320ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
321ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
322ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
3237b80b807SBarry Smith 
324d91e6319SBarry Smith /*E
325d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
326d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
327d91e6319SBarry Smith 
328d91e6319SBarry Smith     Level: beginner
329d91e6319SBarry Smith 
330d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
331d91e6319SBarry Smith 
332d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
333d91e6319SBarry Smith E*/
3347b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
335ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
336ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
337ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
3388efafbd8SBarry Smith 
339ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
3407b80b807SBarry Smith 
341607cd303SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat,MatStructure);
34287828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
343ca44d042SBarry Smith EXTERN int MatCompress(Mat);
3447b80b807SBarry Smith 
34587828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat);
34687828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat);
347052efed2SBarry Smith 
348ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
349ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
35087828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
35187828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35287828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35390f02eecSBarry Smith 
354ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
355649db694SBarry Smith 
356ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
357ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
358ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
3597c922b88SBarry Smith 
3607c922b88SBarry Smith /*
361c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
3627c922b88SBarry Smith */
363c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
3647c922b88SBarry Smith { \
365ef66eb69SBarry Smith   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
366ef66eb69SBarry Smith   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
367ef66eb69SBarry Smith   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
368ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
369ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
3707c922b88SBarry Smith 
371c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
372c4f061fbSSatish Balay {\
373c4f061fbSSatish Balay   int __l;\
374ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
375ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
376c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
377ef66eb69SBarry Smith     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
378c4f061fbSSatish Balay   }\
379c4f061fbSSatish Balay }
380c4f061fbSSatish Balay 
381c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3827c922b88SBarry Smith { int __i; \
3837c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3847c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3857c922b88SBarry Smith   }\
3867c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3877c922b88SBarry Smith }
3887c922b88SBarry Smith 
389ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
3907c922b88SBarry Smith 
3917b80b807SBarry Smith /* Routines unique to particular data structures */
392435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
393435da068SBarry Smith 
39487828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
395ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
396ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
39787828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
3987b80b807SBarry Smith 
399273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
400273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
401273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
40287828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
40387828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
40487828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
405273d9f13SBarry Smith 
406273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
407273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
408273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
40987828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
41087828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
411273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
41287828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
413273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
414435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
415435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
4163a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
417273d9f13SBarry Smith 
418ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
419ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
4202e8a6d31SBarry Smith 
4213a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*);
4223a7fca6bSBarry Smith 
4237b80b807SBarry Smith /*
4247b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
4257b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
4267b80b807SBarry Smith */
4277b80b807SBarry Smith 
428d9274352SBarry Smith /*E
429d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
430d9274352SBarry Smith        with an optional dynamic library name, for example
431d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
432d9274352SBarry Smith 
433d9274352SBarry Smith    Level: beginner
434d9274352SBarry Smith 
435d9274352SBarry Smith .seealso: MatGetOrdering()
436d9274352SBarry Smith E*/
437b12f92e5SBarry Smith typedef char* MatOrderingType;
438b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
439b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
440b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
441b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
442b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
443b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
44462152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
44562152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
44662152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
447c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained"
448c06d978dSMatthew Knepley #define MATORDERING_IDENTITY  "identity"
449c06d978dSMatthew Knepley #define MATORDERING_REVERSE   "reverse"
450b12f92e5SBarry Smith 
451ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
452ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
453aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
454f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
455b12f92e5SBarry Smith #else
456f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
457b12f92e5SBarry Smith #endif
458ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
459ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
4602bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
461b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
462d4fbbf0eSBarry Smith 
46387828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
464a2ce50c7SBarry Smith 
46587828ca2SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
46687828ca2SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
467ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
468a2ce50c7SBarry Smith 
469d91e6319SBarry Smith /*S
470d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
4715ef9f2a5SBarry Smith 
472d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
47314822f30SBarry Smith 
474d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
475d91e6319SBarry Smith           All entries are double precision.
476d91e6319SBarry Smith 
477d91e6319SBarry Smith    Level: developer
478d91e6319SBarry Smith 
479d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
480d91e6319SBarry Smith 
481d91e6319SBarry Smith S*/
4825ef9f2a5SBarry Smith typedef struct {
483f6275e2eSBarry Smith   PetscReal     levels;         /* ILU(levels) */
484f6275e2eSBarry Smith   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
485f6275e2eSBarry Smith   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
486f6275e2eSBarry Smith   PetscReal     dt;             /* drop tolerance */
487f6275e2eSBarry Smith   PetscReal     dtcol;          /* tolerance for pivoting */
488f6275e2eSBarry Smith   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
489f6275e2eSBarry Smith   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
490f6275e2eSBarry Smith   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
491f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
492bcd9e38bSBarry Smith   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
493bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
4945ef9f2a5SBarry Smith } MatILUInfo;
4955ef9f2a5SBarry Smith 
496d91e6319SBarry Smith /*S
497d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
498d91e6319SBarry Smith 
499d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
500d91e6319SBarry Smith 
501d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
502d91e6319SBarry Smith           All entries are double precision.
503d91e6319SBarry Smith 
504d91e6319SBarry Smith    Level: developer
505d91e6319SBarry Smith 
506d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
507d91e6319SBarry Smith 
508d91e6319SBarry Smith S*/
50914822f30SBarry Smith typedef struct {
510f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
511f6275e2eSBarry Smith   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
512f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
513f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
514f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
515bcd9e38bSBarry Smith   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
516bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
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 */
536bcd9e38bSBarry Smith   PetscReal     pivotinblocks;  /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0
537bcd9e38bSBarry Smith                                    factorization may be faster if do not pivot */
538ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo;
539ffa6d0a5SLois Curfman McInnes 
54014822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
541ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
54214822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
543ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
54487828ca2SBarry Smith EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*);
54587828ca2SBarry Smith EXTERN int MatICCFactor(Mat,IS,PetscReal,int);
546ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
547ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
548a2ce50c7SBarry Smith 
549ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
550ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
551ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
552ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
553ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
554ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
5558ed539a5SBarry Smith 
556ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
557bb5a7306SBarry Smith 
558bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
559d91e6319SBarry Smith /*E
560d91e6319SBarry Smith     MatSORType - What type of (S)SOR to perform
561bb1eb677SSatish Balay 
562d91e6319SBarry Smith     Level: beginner
563d91e6319SBarry Smith 
564d9274352SBarry Smith    May be bitwise ORd together
565d9274352SBarry Smith 
566d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
567d91e6319SBarry Smith 
568d91e6319SBarry Smith .seealso: MatRelax()
569d91e6319SBarry Smith E*/
570ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
571ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
572ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
57384cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
574c14dc6b6SHong Zhang EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec);
5758ed539a5SBarry Smith 
576d4fbbf0eSBarry Smith /*
577639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
578639f9d9dSBarry Smith */
579b12f92e5SBarry Smith 
580d9274352SBarry Smith /*E
581d9274352SBarry Smith     MatColoringType - String with the name of a PETSc matrix coloring or the creation function
582d9274352SBarry Smith        with an optional dynamic library name, for example
583d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:coloringcreate()
584d9274352SBarry Smith 
585d9274352SBarry Smith    Level: beginner
586d9274352SBarry Smith 
587d9274352SBarry Smith .seealso: MatGetColoring()
588d9274352SBarry Smith E*/
589b12f92e5SBarry Smith typedef char* MatColoringType;
590b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
591b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
592b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
593b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
594b12f92e5SBarry Smith 
595ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
596ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
597aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
598f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
599b12f92e5SBarry Smith #else
600f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
601b12f92e5SBarry Smith #endif
602ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
6032bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
604ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
605b9617806SBarry Smith EXTERN int        MatColoringPatch(Mat,int,int,int *,ISColoring*);
606639f9d9dSBarry Smith 
607d9274352SBarry Smith /*S
608d9274352SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences
609d9274352SBarry Smith         and coloring
610639f9d9dSBarry Smith 
611d9274352SBarry Smith    Level: beginner
612d9274352SBarry Smith 
613d9274352SBarry Smith   Concepts: coloring, sparse Jacobian, finite differences
614d9274352SBarry Smith 
615d9274352SBarry Smith .seealso:  MatFDColoringCreate()
616d9274352SBarry Smith S*/
617e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
618639f9d9dSBarry Smith 
619ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
620ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
621b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
622ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
62387828ca2SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
624ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
625ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
626ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
627ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
62887828ca2SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
62962152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring);
6303a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
631639f9d9dSBarry Smith 
632639f9d9dSBarry Smith /*
6330752156aSBarry Smith     These routines are for partitioning matrices: currently used only
6343eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
6350752156aSBarry Smith */
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;
6588ba1e511SMatthew Knepley #define MAT_PARTITIONING_CURRENT  "current"
6598ba1e511SMatthew Knepley #define MAT_PARTITIONING_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,
718d643ce63SMatthew Knepley                MATOP_SETUP_PREALLOCATION=30,
719d643ce63SMatthew Knepley                MATOP_ILUFACTOR_SYMBOLIC=31,
720d643ce63SMatthew Knepley                MATOP_ICCFACTOR_SYMBOLIC=32,
721d643ce63SMatthew Knepley                MATOP_GET_ARRAY=33,
722d643ce63SMatthew Knepley                MATOP_RESTORE_ARRAY=34,
723d643ce63SMatthew Knepley                MATOP_DUPLCIATE=35,
724d643ce63SMatthew Knepley                MATOP_FORWARD_SOLVE=36,
725d643ce63SMatthew Knepley                MATOP_BACKWARD_SOLVE=37,
726d643ce63SMatthew Knepley                MATOP_ILUFACTOR=38,
727d643ce63SMatthew Knepley                MATOP_ICCFACTOR=39,
728d643ce63SMatthew Knepley                MATOP_AXPY=40,
729d643ce63SMatthew Knepley                MATOP_GET_SUBMATRICES=41,
730d643ce63SMatthew Knepley                MATOP_INCREASE_OVERLAP=42,
731d643ce63SMatthew Knepley                MATOP_GET_VALUES=43,
732d643ce63SMatthew Knepley                MATOP_COPY=44,
733d643ce63SMatthew Knepley                MATOP_PRINT_HELP=45,
734d643ce63SMatthew Knepley                MATOP_SCALE=46,
735d643ce63SMatthew Knepley                MATOP_SHIFT=47,
736d643ce63SMatthew Knepley                MATOP_DIAGONAL_SHIFT=48,
737d643ce63SMatthew Knepley                MATOP_ILUDT_FACTOR=49,
738d643ce63SMatthew Knepley                MATOP_GET_BLOCK_SIZE=50,
739d643ce63SMatthew Knepley                MATOP_GET_ROW_IJ=51,
740d643ce63SMatthew Knepley                MATOP_RESTORE_ROW_IJ=52,
741d643ce63SMatthew Knepley                MATOP_GET_COLUMN_IJ=53,
742d643ce63SMatthew Knepley                MATOP_RESTORE_COLUMN_IJ=54,
743d643ce63SMatthew Knepley                MATOP_FDCOLORING_CREATE=55,
744d643ce63SMatthew Knepley                MATOP_COLORING_PATCH=56,
745d643ce63SMatthew Knepley                MATOP_SET_UNFACTORED=57,
746d643ce63SMatthew Knepley                MATOP_PERMUTE=58,
747d643ce63SMatthew Knepley                MATOP_SET_VALUES_BLOCKED=59,
748d643ce63SMatthew Knepley                MATOP_GET_SUBMATRIX=60,
749d643ce63SMatthew Knepley                MATOP_DESTROY=61,
750d643ce63SMatthew Knepley                MATOP_VIEW=62,
751d643ce63SMatthew Knepley                MATOP_GET_MAPS=63,
752d643ce63SMatthew Knepley                MATOP_USE_SCALED_FORM=64,
753d643ce63SMatthew Knepley                MATOP_SCALE_SYSTEM=65,
754d643ce63SMatthew Knepley                MATOP_UNSCALE_SYSTEM=66,
755d643ce63SMatthew Knepley                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
756d643ce63SMatthew Knepley                MATOP_SET_VALUES_LOCAL=68,
757d643ce63SMatthew Knepley                MATOP_ZERO_ROWS_LOCAL=69,
758d643ce63SMatthew Knepley                MATOP_GET_ROW_MAX=70,
759d643ce63SMatthew Knepley                MATOP_CONVERT=71,
760d643ce63SMatthew Knepley                MATOP_SET_COLORING=72,
761d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIC=73,
762d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIFOR=74,
763d643ce63SMatthew Knepley                MATOP_FD_COLORING_APPLY=75,
764d643ce63SMatthew Knepley                MATOP_SET_FROM_OPTIONS=76,
765d643ce63SMatthew Knepley                MATOP_MULT_CONSTRAINED=77,
766d643ce63SMatthew Knepley                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
767d643ce63SMatthew Knepley                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
768d643ce63SMatthew Knepley                MATOP_PERMUTE_SPARSIFY=80,
769d643ce63SMatthew Knepley                MATOP_MULT_MULTIPLE=81,
770d643ce63SMatthew Knepley                MATOP_SOLVE_MULTIPLE=82
771fae171e0SBarry Smith              } MatOperation;
772ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
773ff8b7a98SSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void));
774ff8b7a98SSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void));
775273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
776112a2221SBarry Smith 
77790ace30eSBarry Smith /*
77890ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
77990ace30eSBarry Smith  stored in a universal format. By changing the format with
780fb9695e5SSatish Balay  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
78190ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
78290ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
78390ace30eSBarry Smith  read into matrices of the same time.
78490ace30eSBarry Smith */
78590ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
78690ace30eSBarry Smith 
7873f1d51d7SBarry Smith /*
7883f1d51d7SBarry Smith      New matrix classes not yet distributed
7893f1d51d7SBarry Smith */
7903f1d51d7SBarry Smith /*
7913f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
7923f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
7933f1d51d7SBarry Smith   the same MatAIJIndices.
7943f1d51d7SBarry Smith */
795e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
7963f1d51d7SBarry Smith 
797ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
798ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
799ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
800ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
801ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
802ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
803ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
804ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
805ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
8063f1d51d7SBarry Smith 
807ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
808ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
80987828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
8103f1d51d7SBarry Smith 
811ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
812ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
81387828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
8143f1d51d7SBarry Smith 
8156d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
816ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
81708918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
818860d1616SSatish Balay 
819d9274352SBarry Smith /*S
820d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
821d9274352SBarry Smith          orthogonalizes the vector to a subsapce
822d9274352SBarry Smith 
823d9274352SBarry Smith    Level: beginner
824d9274352SBarry Smith 
825d9274352SBarry Smith   Concepts: matrix; linear operator, null space
826d9274352SBarry Smith 
8276e1639daSBarry Smith   Users manual sections:
8286e1639daSBarry Smith .   sec_singular
8296e1639daSBarry Smith 
830d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
831d9274352SBarry Smith S*/
83274637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
833d9274352SBarry Smith 
83474637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
83574637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
83674637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
83774637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
83874637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
83974637425SBarry Smith 
840273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
841273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
842273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
843273d9f13SBarry Smith 
8443f1d51d7SBarry Smith 
845f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
846c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
847c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
848c4f061fbSSatish Balay 
849273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
850f069c275SSatish Balay 
851b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
852b0a32e0cSBarry Smith 
85324a595ddSBarry Smith EXTERN int MatESISetType(Mat,char*);
85424a595ddSBarry Smith EXTERN int MatESISetFromOptions(Mat);
85524a595ddSBarry Smith 
8562cd6534aSBarry Smith EXTERN int MatDiagonalScaleLocal(Mat,Vec);
85704f1ad80SBarry Smith 
8587dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *);
8597dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *);
8607dbadf16SMatthew Knepley 
8612eac72dbSBarry Smith #endif
8622eac72dbSBarry Smith 
8632eac72dbSBarry Smith 
8649d00d63dSBarry Smith 
865