xref: /petsc/include/petscmat.h (revision d643ce63cf9b1fe2cd4ab306b8154e7105d3fb3c)
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"
506d88219bSBarry Smith #define MATESI      "esi"
516d88219bSBarry Smith #define MATPETSCESI "petscesi"
52273d9f13SBarry Smith typedef char* MatType;
53d91e6319SBarry Smith 
54c06d978dSMatthew Knepley #define MAT_SER_SEQAIJ_BINARY "seqaij_binary"
55c06d978dSMatthew Knepley #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary"
56c06d978dSMatthew Knepley typedef char *MatSerializeType;
57c06d978dSMatthew Knepley 
58c06d978dSMatthew Knepley #ifdef PETSC_USE_NEW_LOGGING
59c06d978dSMatthew Knepley /* Logging support */
60c06d978dSMatthew Knepley extern int MAT_COOKIE;
61c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE;
62c06d978dSMatthew Knepley extern int MATPARTITIONING_COOKIE;
63c06d978dSMatthew Knepley enum {MAT_Mult, MAT_MultMultiple, MAT_MultConstrained, MAT_MultTrans, MAT_MultAdd, MAT_MultTransAdd, MAT_MultMatrixFree,
64c06d978dSMatthew Knepley       MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTrans, MAT_SolveTransAdd, MAT_Relax, MAT_ForwardSolve,
65c06d978dSMatthew Knepley       MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic, MAT_LUFactorNumeric, MAT_CholeskyFactor,
66c06d978dSMatthew Knepley       MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor, MAT_ILUFactorSymbolic,
67c06d978dSMatthew Knepley       MAT_IncompleteCholeskyFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin, MAT_AssemblyEnd,
68c06d978dSMatthew Knepley       MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering, MAT_IncreaseOverlap,
69c06d978dSMatthew Knepley       MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_MAX_EVENTS};
70c06d978dSMatthew Knepley extern int MatEvents[MAT_MAX_EVENTS];
71c06d978dSMatthew Knepley #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(MatEvents[e],o1,o2,o3,o4)
72c06d978dSMatthew Knepley #define MatLogEventEnd(e,o1,o2,o3,o4)   PetscLogEventEnd(MatEvents[e],o1,o2,o3,o4)
73c06d978dSMatthew Knepley 
74c06d978dSMatthew Knepley #else
75c06d978dSMatthew Knepley 
76c06d978dSMatthew Knepley enum {MAT_MultConstrained};
77c06d978dSMatthew Knepley #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(e,o1,o2,o3,o4)
78c06d978dSMatthew Knepley #define MatLogEventEnd(e,o1,o2,o3,o4)   PetscLogEventEnd(e,o1,o2,o3,o4)
79c06d978dSMatthew Knepley #endif
80c06d978dSMatthew Knepley 
81273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
82273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType);
83273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat);
84273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat);
85273d9f13SBarry Smith EXTERN int MatRegisterAll(char*);
86273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
87c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth));
88273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
89273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
90c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0)
91273d9f13SBarry Smith #else
92273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
93c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d)
94273d9f13SBarry Smith #endif
95273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled;
96b0a32e0cSBarry Smith extern PetscFList MatList;
9728988994SBarry Smith 
98c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList;
99c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []);
100c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterDestroy();
101c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled;
102c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth);
103c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType);
104c06d978dSMatthew Knepley 
105ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*);
10687828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*);
10787828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*);
108ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
109ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
110c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*);
11187828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*);
11287828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*);
113ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
114ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
115ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*);
116ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
117ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
118ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
1193a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*);
120435da068SBarry Smith EXTERN int MatDestroy(Mat);
12121c89e3eSBarry Smith 
122ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat);
1238a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*);
124ec0117caSBarry Smith 
1258ed539a5SBarry Smith /* ------------------------------------------------------------*/
12687828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12787828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
12884cb2905SBarry Smith 
1292ef4de8bSBarry Smith /*S
1302ef4de8bSBarry Smith      MatStencil - Data structure (C struct) for storing information about a single row or
1312ef4de8bSBarry Smith         column of a matrix as index on an associated grid.
1322ef4de8bSBarry Smith 
1332ef4de8bSBarry Smith    Level: beginner
1342ef4de8bSBarry Smith 
1352ef4de8bSBarry Smith   Concepts: matrix; linear operator
1362ef4de8bSBarry Smith 
1372ef4de8bSBarry Smith .seealso:  MatSetValuesStencil(), MatSetStencil()
1382ef4de8bSBarry Smith S*/
139435da068SBarry Smith typedef struct {
140435da068SBarry Smith   int k,j,i,c;
141435da068SBarry Smith } MatStencil;
1422ef4de8bSBarry Smith 
14387828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
14487828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode);
145435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int);
146435da068SBarry Smith 
1473a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring);
1483a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*);
1493a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*);
1503a7fca6bSBarry Smith 
151d91e6319SBarry Smith /*E
152d91e6319SBarry Smith     MatAssemblyType - Indicates if the matrix is now to be used, or if you plan
153d91e6319SBarry Smith      to continue to add values to it
154d91e6319SBarry Smith 
155d91e6319SBarry Smith     Level: beginner
156d91e6319SBarry Smith 
157d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd()
158d91e6319SBarry Smith E*/
1596d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
160ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType);
161ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType);
162ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*);
1634f9c727eSBarry Smith 
164b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \
165ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
166b951964fSBarry Smith   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
167b951964fSBarry Smith }
168ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \
169d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \
170ea06a074SBarry Smith   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
171ea06a074SBarry Smith }
172d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \
173ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \
174d91e6319SBarry Smith   _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
175d91e6319SBarry Smith }
176d91e6319SBarry Smith /*E
177d91e6319SBarry Smith     MatOption - Options that may be set for a matrix and its behavior or storage
178d91e6319SBarry Smith 
179d91e6319SBarry Smith     Level: beginner
180d91e6319SBarry Smith 
1810a835dfdSSatish Balay    Any additions/changes here MUST also be made in include/finclude/petscmat.h
182d91e6319SBarry Smith 
183d91e6319SBarry Smith .seealso: MatSetOption()
184d91e6319SBarry Smith E*/
1856d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
1866d4a8577SBarry Smith               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
1876d4a8577SBarry Smith               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
1886ca9ecd3SBarry Smith               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
1896ca9ecd3SBarry Smith               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
1906ca9ecd3SBarry Smith               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
1916ca9ecd3SBarry Smith               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
1924787f768SSatish Balay               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
1937c922b88SBarry Smith               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78,
1942bad1931SBarry Smith               MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81,
1958b43beb6SKris Buschelman               MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption;
196ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption);
197273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*);
19884cb2905SBarry Smith 
19987828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*);
20087828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**);
20187828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**);
20287828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**);
20387828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**);
204ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int);
20587828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **);
20687828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **);
207ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *);
2087b80b807SBarry Smith 
209ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec);
210ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec);
211ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec);
212ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec);
213c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec);
2146d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec);
2152eac72dbSBarry Smith 
216d91e6319SBarry Smith /*E
217d91e6319SBarry Smith     MatDuplicateOption - Indicates if a duplicated sparse matrix should have
218d91e6319SBarry Smith   its numerical values copied over or just its nonzero structure.
219d91e6319SBarry Smith 
220d91e6319SBarry Smith     Level: beginner
221d91e6319SBarry Smith 
222d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
223d91e6319SBarry Smith 
224d91e6319SBarry Smith .seealso: MatDuplicate()
225d91e6319SBarry Smith E*/
2262e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption;
2272e8a6d31SBarry Smith 
228273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*));
229273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
230273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0)
231273d9f13SBarry Smith #else
232273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d)
233273d9f13SBarry Smith #endif
234273d9f13SBarry Smith EXTERN int        MatConvertRegisterAll(char*);
235273d9f13SBarry Smith EXTERN int        MatConvertRegisterDestroy(void);
236273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled;
237b0a32e0cSBarry Smith extern PetscFList MatConvertList;
238ca44d042SBarry Smith EXTERN int        MatConvert(Mat,MatType,Mat*);
239ca44d042SBarry Smith EXTERN int        MatDuplicate(Mat,MatDuplicateOption,Mat*);
24094a9d846SBarry Smith 
241d91e6319SBarry Smith /*E
242d91e6319SBarry Smith     MatStructure - Indicates if the matrix has the same nonzero structure
243d91e6319SBarry Smith 
244d91e6319SBarry Smith     Level: beginner
245d91e6319SBarry Smith 
246d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
247d91e6319SBarry Smith 
248d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators()
249d91e6319SBarry Smith E*/
250cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
251cb5b572fSBarry Smith 
252ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure);
253b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer);
254273d9f13SBarry Smith 
255b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*));
256273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
257273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0)
258273d9f13SBarry Smith #else
259273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d)
260273d9f13SBarry Smith #endif
261273d9f13SBarry Smith EXTERN int        MatLoadRegisterAll(char*);
262273d9f13SBarry Smith EXTERN int        MatLoadRegisterDestroy(void);
263273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled;
264b0a32e0cSBarry Smith extern PetscFList MatLoadList;
265b0a32e0cSBarry Smith EXTERN int        MatLoad(PetscViewer,MatType,Mat*);
2667b80b807SBarry Smith 
267ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
268ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
269ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
270ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
271d4fbbf0eSBarry Smith 
272d91e6319SBarry Smith /*S
273d91e6319SBarry Smith      MatInfo - Context of matrix information, used with MatGetInfo()
274d91e6319SBarry Smith 
275d91e6319SBarry Smith    In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE
276d91e6319SBarry Smith 
277d91e6319SBarry Smith    Level: intermediate
278d91e6319SBarry Smith 
279d91e6319SBarry Smith   Concepts: matrix^nonzero information
280d91e6319SBarry Smith 
281d9274352SBarry Smith .seealso:  MatGetInfo(), MatInfoType
282d91e6319SBarry Smith S*/
2834e220ebcSLois Curfman McInnes typedef struct {
284b0a32e0cSBarry Smith   PetscLogDouble rows_global,columns_global;         /* number of global rows and columns */
285b0a32e0cSBarry Smith   PetscLogDouble rows_local,columns_local;           /* number of local rows and columns */
286b0a32e0cSBarry Smith   PetscLogDouble block_size;                         /* block size */
287b0a32e0cSBarry Smith   PetscLogDouble nz_allocated,nz_used,nz_unneeded;   /* number of nonzeros */
288b0a32e0cSBarry Smith   PetscLogDouble memory;                             /* memory allocated */
289b0a32e0cSBarry Smith   PetscLogDouble assemblies;                         /* number of matrix assemblies called */
290b0a32e0cSBarry Smith   PetscLogDouble mallocs;                            /* number of mallocs during MatSetValues() */
291b0a32e0cSBarry Smith   PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */
292b0a32e0cSBarry Smith   PetscLogDouble factor_mallocs;                     /* number of mallocs during factorization */
2934e220ebcSLois Curfman McInnes } MatInfo;
2944e220ebcSLois Curfman McInnes 
295d9274352SBarry Smith /*E
296d9274352SBarry Smith     MatInfoType - Indicates if you want information about the local part of the matrix,
297d9274352SBarry Smith      the entire parallel matrix or the maximum over all the local parts.
298d9274352SBarry Smith 
299d9274352SBarry Smith     Level: beginner
300d9274352SBarry Smith 
301d9274352SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
302d9274352SBarry Smith 
303d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo
304d9274352SBarry Smith E*/
3057b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
306ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*);
307ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*);
308ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec);
309273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec);
310ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*);
311ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *);
312c06d978dSMatthew Knepley EXTERN int MatPermuteSparsify(Mat,int,double,double,IS,IS,Mat *);
313ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec);
31406ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode);
315ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*);
3167b80b807SBarry Smith 
31787828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *);
318ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat);
31987828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*);
32087828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*);
3217b80b807SBarry Smith 
322ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth);
323ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec);
324ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec);
3255ef9f2a5SBarry Smith 
326ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*);
327ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*);
328ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*);
3297b80b807SBarry Smith 
330d91e6319SBarry Smith /*E
331d91e6319SBarry Smith     MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices()
332d91e6319SBarry Smith      or MatGetSubMatrix() are to be reused to store the new matrix values.
333d91e6319SBarry Smith 
334d91e6319SBarry Smith     Level: beginner
335d91e6319SBarry Smith 
336d91e6319SBarry Smith    Any additions/changes here MUST also be made in include/finclude/petscmat.h
337d91e6319SBarry Smith 
338d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices()
339d91e6319SBarry Smith E*/
3407b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse;
341ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
342ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **);
343ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
3448efafbd8SBarry Smith 
345ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int);
3467b80b807SBarry Smith 
34787828ca2SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat);
34887828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat);
349ca44d042SBarry Smith EXTERN int MatCompress(Mat);
3507b80b807SBarry Smith 
35187828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat);
35287828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat);
353052efed2SBarry Smith 
354ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping);
355ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping);
35687828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*);
35787828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35887828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode);
35990f02eecSBarry Smith 
360ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int);
361649db694SBarry Smith 
362ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec);
363ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec);
364ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec);
3657c922b88SBarry Smith 
3667c922b88SBarry Smith /*
367c4f061fbSSatish Balay       These three (or four) macros MUST be used together. The third one closes the open { of the first one
3687c922b88SBarry Smith */
369c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \
3707c922b88SBarry Smith { \
371ef66eb69SBarry Smith   int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \
372ef66eb69SBarry Smith   _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\
373ef66eb69SBarry Smith   _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\
374ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\
375ef66eb69SBarry Smith   _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp;
3767c922b88SBarry Smith 
377c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\
378c4f061fbSSatish Balay {\
379c4f061fbSSatish Balay   int __l;\
380ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\
381ef66eb69SBarry Smith   _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\
382c4f061fbSSatish Balay   for (__l=0;__l<nrows;__l++) {\
383ef66eb69SBarry Smith     _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\
384c4f061fbSSatish Balay   }\
385c4f061fbSSatish Balay }
386c4f061fbSSatish Balay 
387c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\
3887c922b88SBarry Smith { int __i; \
3897c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
3907c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
3917c922b88SBarry Smith   }\
3927c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
3937c922b88SBarry Smith }
3947c922b88SBarry Smith 
395ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);}
3967c922b88SBarry Smith 
3977b80b807SBarry Smith /* Routines unique to particular data structures */
398435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **);
399435da068SBarry Smith 
40087828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***);
401ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
402ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
40387828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*);
4047b80b807SBarry Smith 
405273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*);
406273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*);
407273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*);
40887828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*);
40987828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
41087828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*);
411273d9f13SBarry Smith 
412273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*);
413273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*);
414273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*);
41587828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*);
41687828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**);
417273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*);
41887828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*);
419273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*);
420435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**);
421435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**);
4223a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void));
423273d9f13SBarry Smith 
424ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
425ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
4262e8a6d31SBarry Smith 
4273a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*);
4283a7fca6bSBarry Smith 
4297b80b807SBarry Smith /*
4307b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
4317b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
4327b80b807SBarry Smith */
4337b80b807SBarry Smith 
434d9274352SBarry Smith /*E
435d9274352SBarry Smith     MatOrderingType - String with the name of a PETSc matrix ordering or the creation function
436d9274352SBarry Smith        with an optional dynamic library name, for example
437d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:orderingcreate()
438d9274352SBarry Smith 
439d9274352SBarry Smith    Level: beginner
440d9274352SBarry Smith 
441d9274352SBarry Smith .seealso: MatGetOrdering()
442d9274352SBarry Smith E*/
443b12f92e5SBarry Smith typedef char* MatOrderingType;
444b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
445b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
446b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
447b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
448b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
449b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
45062152c8bSBarry Smith #define MATORDERING_DSC_ND    "dsc_nd"
45162152c8bSBarry Smith #define MATORDERING_DSC_MMD   "dsc_mmd"
45262152c8bSBarry Smith #define MATORDERING_DSC_MDF   "dsc_mdf"
453c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained"
454c06d978dSMatthew Knepley #define MATORDERING_IDENTITY  "identity"
455c06d978dSMatthew Knepley #define MATORDERING_REVERSE   "reverse"
456b12f92e5SBarry Smith 
457ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
458ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
459aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
460f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
461b12f92e5SBarry Smith #else
462f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
463b12f92e5SBarry Smith #endif
464ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
465ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
4662bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
467b0a32e0cSBarry Smith extern PetscFList      MatOrderingList;
468d4fbbf0eSBarry Smith 
46987828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS);
470a2ce50c7SBarry Smith 
47187828ca2SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,PetscReal);
47287828ca2SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*);
473ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
474a2ce50c7SBarry Smith 
475d91e6319SBarry Smith /*S
476d91e6319SBarry Smith    MatILUInfo - Data based into the matrix ILU factorization routines
4775ef9f2a5SBarry Smith 
478d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE
47914822f30SBarry Smith 
480d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of ILU
481d91e6319SBarry Smith           All entries are double precision.
482d91e6319SBarry Smith 
483d91e6319SBarry Smith    Level: developer
484d91e6319SBarry Smith 
485d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo
486d91e6319SBarry Smith 
487d91e6319SBarry Smith S*/
4885ef9f2a5SBarry Smith typedef struct {
489f6275e2eSBarry Smith   PetscReal     levels;         /* ILU(levels) */
490f6275e2eSBarry Smith   PetscReal     fill;           /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
491f6275e2eSBarry Smith   PetscReal     diagonal_fill;  /* force diagonal to fill in if initially not filled */
492f6275e2eSBarry Smith   PetscReal     dt;             /* drop tolerance */
493f6275e2eSBarry Smith   PetscReal     dtcol;          /* tolerance for pivoting */
494f6275e2eSBarry Smith   PetscReal     dtcount;        /* maximum nonzeros to be allowed per row */
495f6275e2eSBarry Smith   PetscReal     damping;        /* scaling of identity added to matrix to prevent zero pivots */
496f6275e2eSBarry Smith   PetscReal     damp;           /* if is 1.0 and factorization fails, damp until successful */
497f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
4985ef9f2a5SBarry Smith } MatILUInfo;
4995ef9f2a5SBarry Smith 
500d91e6319SBarry Smith /*S
501d91e6319SBarry Smith    MatLUInfo - Data based into the matrix LU factorization routines
502d91e6319SBarry Smith 
503d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE
504d91e6319SBarry Smith 
505d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of LU
506d91e6319SBarry Smith           All entries are double precision.
507d91e6319SBarry Smith 
508d91e6319SBarry Smith    Level: developer
509d91e6319SBarry Smith 
510d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo
511d91e6319SBarry Smith 
512d91e6319SBarry Smith S*/
51314822f30SBarry Smith typedef struct {
514f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
515f6275e2eSBarry Smith   PetscReal     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
516f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
517f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
518f6275e2eSBarry Smith   PetscReal     zeropivot; /* pivot is called zero if less than this */
51914822f30SBarry Smith } MatLUInfo;
52014822f30SBarry Smith 
521d91e6319SBarry Smith /*S
522d91e6319SBarry Smith    MatCholeskyInfo - Data based into the matrix Cholesky factorization routines
523d91e6319SBarry Smith 
524d91e6319SBarry Smith    In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE
525d91e6319SBarry Smith 
526d91e6319SBarry Smith    Notes: These are not usually directly used by users, instead use the PC type of Cholesky
527d91e6319SBarry Smith           All entries are double precision.
528d91e6319SBarry Smith 
529d91e6319SBarry Smith    Level: developer
530d91e6319SBarry Smith 
531d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo
532d91e6319SBarry Smith 
533d91e6319SBarry Smith S*/
534ffa6d0a5SLois Curfman McInnes typedef struct {
535f6275e2eSBarry Smith   PetscReal     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */
536f6275e2eSBarry Smith   PetscReal     damping; /* scaling of identity added to matrix to prevent zero pivots */
537f6275e2eSBarry Smith   PetscReal     damp;    /* if this is 1.0 and factorization fails, damp until successful */
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;
57487828ca2SBarry Smith EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,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 
6071a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
608d9274352SBarry Smith /*S
609d9274352SBarry Smith      MatFDColoring - Object for computing a sparse Jacobian via finite differences
610d9274352SBarry Smith         and coloring
611639f9d9dSBarry Smith 
612d9274352SBarry Smith    Level: beginner
613d9274352SBarry Smith 
614d9274352SBarry Smith   Concepts: coloring, sparse Jacobian, finite differences
615d9274352SBarry Smith 
616d9274352SBarry Smith .seealso:  MatFDColoringCreate()
617d9274352SBarry Smith S*/
618e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
619639f9d9dSBarry Smith 
620ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
621ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
622b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer);
623ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
62487828ca2SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal);
625ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
626ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
627ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
628ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
62987828ca2SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *);
63062152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring);
6313a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec);
632639f9d9dSBarry Smith 
633639f9d9dSBarry Smith /*
6340752156aSBarry Smith     These routines are for partitioning matrices: currently used only
6353eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
6360752156aSBarry Smith */
63791e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
638ca161407SBarry Smith 
639d9274352SBarry Smith /*S
640d9274352SBarry Smith      MatPartitioning - Object for managing the partitioning of a matrix or graph
641d9274352SBarry Smith 
642d9274352SBarry Smith    Level: beginner
643d9274352SBarry Smith 
644d9274352SBarry Smith   Concepts: partitioning
645d9274352SBarry Smith 
646d9274352SBarry Smith .seealso:  MatParitioningCreate(), MatPartitioningType
647d9274352SBarry Smith S*/
64891e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
649d9274352SBarry Smith 
650d9274352SBarry Smith /*E
651d9274352SBarry Smith     MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function
652d9274352SBarry Smith        with an optional dynamic library name, for example
653d9274352SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate()
654d9274352SBarry Smith 
655d9274352SBarry Smith    Level: beginner
656d9274352SBarry Smith 
657d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning
658d9274352SBarry Smith E*/
6592aabb6bbSBarry Smith typedef char* MatPartitioningType;
6602aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
6612aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
662ca161407SBarry Smith 
663ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
664ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
665ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
666ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
667ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
668ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
6692aabb6bbSBarry Smith 
670ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
671aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
672f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
6732aabb6bbSBarry Smith #else
674f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
6752aabb6bbSBarry Smith #endif
6762aabb6bbSBarry Smith 
677ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
6782bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
679ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
6802bad1931SBarry Smith 
681b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer);
682ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
683ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
684ca161407SBarry Smith 
685ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
6860752156aSBarry Smith 
6870752156aSBarry Smith /*
6880a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
689d4fbbf0eSBarry Smith */
6901c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
6911c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
6921c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
6931c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
6941c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
6957c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
6967c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
6971c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
6981c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
6997c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
7007c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
7011c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
7021c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
7031c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
7041c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
7051c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
7061c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
7071c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
7081c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
7091c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
7101c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
7111c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
7121c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
7131c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
7141c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
7151c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
7161c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
7171c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
7181c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
7191c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
720*d643ce63SMatthew Knepley                MATOP_SETUP_PREALLOCATION=30,
721*d643ce63SMatthew Knepley                MATOP_ILUFACTOR_SYMBOLIC=31,
722*d643ce63SMatthew Knepley                MATOP_ICCFACTOR_SYMBOLIC=32,
723*d643ce63SMatthew Knepley                MATOP_GET_ARRAY=33,
724*d643ce63SMatthew Knepley                MATOP_RESTORE_ARRAY=34,
725*d643ce63SMatthew Knepley                MATOP_DUPLCIATE=35,
726*d643ce63SMatthew Knepley                MATOP_FORWARD_SOLVE=36,
727*d643ce63SMatthew Knepley                MATOP_BACKWARD_SOLVE=37,
728*d643ce63SMatthew Knepley                MATOP_ILUFACTOR=38,
729*d643ce63SMatthew Knepley                MATOP_ICCFACTOR=39,
730*d643ce63SMatthew Knepley                MATOP_AXPY=40,
731*d643ce63SMatthew Knepley                MATOP_GET_SUBMATRICES=41,
732*d643ce63SMatthew Knepley                MATOP_INCREASE_OVERLAP=42,
733*d643ce63SMatthew Knepley                MATOP_GET_VALUES=43,
734*d643ce63SMatthew Knepley                MATOP_COPY=44,
735*d643ce63SMatthew Knepley                MATOP_PRINT_HELP=45,
736*d643ce63SMatthew Knepley                MATOP_SCALE=46,
737*d643ce63SMatthew Knepley                MATOP_SHIFT=47,
738*d643ce63SMatthew Knepley                MATOP_DIAGONAL_SHIFT=48,
739*d643ce63SMatthew Knepley                MATOP_ILUDT_FACTOR=49,
740*d643ce63SMatthew Knepley                MATOP_GET_BLOCK_SIZE=50,
741*d643ce63SMatthew Knepley                MATOP_GET_ROW_IJ=51,
742*d643ce63SMatthew Knepley                MATOP_RESTORE_ROW_IJ=52,
743*d643ce63SMatthew Knepley                MATOP_GET_COLUMN_IJ=53,
744*d643ce63SMatthew Knepley                MATOP_RESTORE_COLUMN_IJ=54,
745*d643ce63SMatthew Knepley                MATOP_FDCOLORING_CREATE=55,
746*d643ce63SMatthew Knepley                MATOP_COLORING_PATCH=56,
747*d643ce63SMatthew Knepley                MATOP_SET_UNFACTORED=57,
748*d643ce63SMatthew Knepley                MATOP_PERMUTE=58,
749*d643ce63SMatthew Knepley                MATOP_SET_VALUES_BLOCKED=59,
750*d643ce63SMatthew Knepley                MATOP_GET_SUBMATRIX=60,
751*d643ce63SMatthew Knepley                MATOP_DESTROY=61,
752*d643ce63SMatthew Knepley                MATOP_VIEW=62,
753*d643ce63SMatthew Knepley                MATOP_GET_MAPS=63,
754*d643ce63SMatthew Knepley                MATOP_USE_SCALED_FORM=64,
755*d643ce63SMatthew Knepley                MATOP_SCALE_SYSTEM=65,
756*d643ce63SMatthew Knepley                MATOP_UNSCALE_SYSTEM=66,
757*d643ce63SMatthew Knepley                MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67,
758*d643ce63SMatthew Knepley                MATOP_SET_VALUES_LOCAL=68,
759*d643ce63SMatthew Knepley                MATOP_ZERO_ROWS_LOCAL=69,
760*d643ce63SMatthew Knepley                MATOP_GET_ROW_MAX=70,
761*d643ce63SMatthew Knepley                MATOP_CONVERT=71,
762*d643ce63SMatthew Knepley                MATOP_SET_COLORING=72,
763*d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIC=73,
764*d643ce63SMatthew Knepley                MATOP_SET_VALUES_ADIFOR=74,
765*d643ce63SMatthew Knepley                MATOP_FD_COLORING_APPLY=75,
766*d643ce63SMatthew Knepley                MATOP_SET_FROM_OPTIONS=76,
767*d643ce63SMatthew Knepley                MATOP_MULT_CONSTRAINED=77,
768*d643ce63SMatthew Knepley                MATOP_MULT_TRANSPOSE_CONSTRAINED=78,
769*d643ce63SMatthew Knepley                MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79,
770*d643ce63SMatthew Knepley                MATOP_PERMUTE_SPARSIFY=80,
771*d643ce63SMatthew Knepley                MATOP_MULT_MULTIPLE=81,
772*d643ce63SMatthew Knepley                MATOP_SOLVE_MULTIPLE=82
773fae171e0SBarry Smith              } MatOperation;
774ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
77537bd1cefSSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)());
77637bd1cefSSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)());
777273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*);
778112a2221SBarry Smith 
77990ace30eSBarry Smith /*
78090ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
78190ace30eSBarry Smith  stored in a universal format. By changing the format with
782fb9695e5SSatish Balay  PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will
78390ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
78490ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
78590ace30eSBarry Smith  read into matrices of the same time.
78690ace30eSBarry Smith */
78790ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
78890ace30eSBarry Smith 
7893f1d51d7SBarry Smith /*
7903f1d51d7SBarry Smith      New matrix classes not yet distributed
7913f1d51d7SBarry Smith */
7923f1d51d7SBarry Smith /*
7933f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
7943f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
7953f1d51d7SBarry Smith   the same MatAIJIndices.
7963f1d51d7SBarry Smith */
797e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
7983f1d51d7SBarry Smith 
799ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
800ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
801ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
802ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
803ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
804ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
805ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
806ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
807ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
8083f1d51d7SBarry Smith 
809ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
810ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
81187828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*);
8123f1d51d7SBarry Smith 
813ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
814ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
81587828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *);
8163f1d51d7SBarry Smith 
8176d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal);
818ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
81908918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
820860d1616SSatish Balay 
821d9274352SBarry Smith /*S
822d9274352SBarry Smith      MatNullSpace - Object that removes a null space from a vector, i.e.
823d9274352SBarry Smith          orthogonalizes the vector to a subsapce
824d9274352SBarry Smith 
825d9274352SBarry Smith    Level: beginner
826d9274352SBarry Smith 
827d9274352SBarry Smith   Concepts: matrix; linear operator, null space
828d9274352SBarry Smith 
829d9274352SBarry Smith .seealso:  MatNullSpaceCreate()
830d9274352SBarry Smith S*/
83174637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace;
832d9274352SBarry Smith 
83374637425SBarry Smith #define MATNULLSPACE_COOKIE    PETSC_COOKIE+17
83474637425SBarry Smith 
83574637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*);
83674637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace);
83774637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*);
83874637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace);
83974637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat);
84074637425SBarry Smith 
841273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp);
842273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal);
843273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *);
844273d9f13SBarry Smith 
8453f1d51d7SBarry Smith 
846f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
847c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*);
848c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*);
849c4f061fbSSatish Balay 
850273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*);
851f069c275SSatish Balay 
852b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*);
853b0a32e0cSBarry Smith 
8542eac72dbSBarry Smith #endif
8552eac72dbSBarry Smith 
8562eac72dbSBarry Smith 
8579d00d63dSBarry Smith 
858