xref: /petsc/include/petscmat.h (revision a20e3d60e570229d9b81a256c4b761c53bd19d28)
1*a20e3d60SSatish Balay /* $Id: mat.h,v 1.104 1996/06/04 20:15:05 balay Exp balay $ */
22eac72dbSBarry Smith /*
32eac72dbSBarry Smith      Include file for the matrix component of PETSc
42eac72dbSBarry Smith */
51eb62cbbSBarry Smith #ifndef __MAT_PACKAGE
61eb62cbbSBarry Smith #define __MAT_PACKAGE
78ed539a5SBarry Smith #include "vec.h"
82eac72dbSBarry Smith 
99cd28387SBarry Smith #define MAT_COOKIE         PETSC_COOKIE+5
10f0479e8cSBarry Smith 
112eac72dbSBarry Smith typedef struct _Mat*           Mat;
122eac72dbSBarry Smith 
134ac9ca07SLois Curfman McInnes typedef enum { MATSAME=-1, MATSEQDENSE, MATSEQAIJ, MATMPIAIJ, MATSHELL,
14c456f294SBarry Smith                MATMPIROWBS, MATSEQBDIAG, MATMPIBDIAG,
15*a20e3d60SSatish Balay                MATMPIDENSE, MATSEQBAIJ, MATMPIBAIJ} MatType;
1628988994SBarry Smith 
170e998a85SBarry Smith extern int MatCreate(MPI_Comm,int,int,Mat*);
18df6e0191SLois Curfman McInnes extern int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
19d5bc1036SLois Curfman McInnes extern int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
20de7da479SBarry Smith extern int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
219717bf64SBarry Smith extern int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
22cfe223acSLois Curfman McInnes extern int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,Mat*);
23f26ada1bSBarry Smith extern int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
24f26ada1bSBarry Smith extern int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
25df8a92d1SBarry Smith extern int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
269717bf64SBarry Smith 
277b80b807SBarry Smith extern int MatDestroy(Mat);
287b80b807SBarry Smith 
297ddc982cSLois Curfman McInnes extern int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
3017116c71SBarry Smith extern int MatShellGetContext(Mat,void **);
3121c89e3eSBarry Smith 
322eac72dbSBarry Smith 
33ec0117caSBarry Smith extern int MatPrintHelp(Mat);
34ec0117caSBarry Smith 
358ed539a5SBarry Smith /* ------------------------------------------------------------*/
36ee50ffe9SBarry Smith extern int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
377b80b807SBarry Smith typedef enum {FLUSH_ASSEMBLY=1,FINAL_ASSEMBLY=0} MatAssemblyType;
38ee50ffe9SBarry Smith extern int MatAssemblyBegin(Mat,MatAssemblyType);
39ee50ffe9SBarry Smith extern int MatAssemblyEnd(Mat,MatAssemblyType);
40ee50ffe9SBarry Smith 
41ee50ffe9SBarry Smith typedef enum {ROW_ORIENTED=1,COLUMN_ORIENTED=2,ROWS_SORTED=4,
42ee50ffe9SBarry Smith               COLUMNS_SORTED=8,NO_NEW_NONZERO_LOCATIONS=16,
4302834360SBarry Smith               YES_NEW_NONZERO_LOCATIONS=32,SYMMETRIC_MATRIX=64,
44c0bbcb79SLois Curfman McInnes               STRUCTURALLY_SYMMETRIC_MATRIX,NO_NEW_DIAGONALS,
45429c0c78SLois Curfman McInnes               YES_NEW_DIAGONALS,INODE_LIMIT_1,INODE_LIMIT_2,
46429c0c78SLois Curfman McInnes               INODE_LIMIT_3,INODE_LIMIT_4,INODE_LIMIT_5} MatOption;
47ee50ffe9SBarry Smith extern int MatSetOption(Mat,MatOption);
484b0e389bSBarry Smith extern int MatGetType(Mat,MatType*,char**);
4977c4ece6SBarry Smith extern int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,int*);
50ee50ffe9SBarry Smith extern int MatGetValues(Mat,int,int*,int,int*,Scalar*);
518ed539a5SBarry Smith extern int MatGetRow(Mat,int,int *,int **,Scalar**);
528ed539a5SBarry Smith extern int MatRestoreRow(Mat,int,int *,int **,Scalar**);
5377c4ece6SBarry Smith extern int MatGetColumn(Mat,int,int *,int **,Scalar**);
5477c4ece6SBarry Smith extern int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
5564e87e97SBarry Smith extern int MatGetArray(Mat,Scalar **);
5609883261SBarry Smith extern int MatRestoreArray(Mat,Scalar **);
577b80b807SBarry Smith 
588ed539a5SBarry Smith extern int MatMult(Mat,Vec,Vec);
598ed539a5SBarry Smith extern int MatMultAdd(Mat,Vec,Vec,Vec);
608ed539a5SBarry Smith extern int MatMultTrans(Mat,Vec,Vec);
618ed539a5SBarry Smith extern int MatMultTransAdd(Mat,Vec,Vec,Vec);
622eac72dbSBarry Smith 
637b80b807SBarry Smith extern int MatConvert(Mat,MatType,Mat*);
647b80b807SBarry Smith extern int MatCopy(Mat,Mat);
657b80b807SBarry Smith extern int MatView(Mat,Viewer);
667b80b807SBarry Smith extern int MatLoad(Viewer,MatType,Mat*);
677b80b807SBarry Smith 
687b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
697b80b807SBarry Smith extern int MatGetInfo(Mat,MatInfoType,int*,int*,int*);
7077c4ece6SBarry Smith extern int MatValid(Mat,PetscTruth*);
717b80b807SBarry Smith extern int MatGetDiagonal(Mat,Vec);
72cd8486b4SBarry Smith extern int MatTranspose(Mat,Mat*);
73f4c33d5aSBarry Smith extern int MatDiagonalScale(Mat,Vec,Vec);
748b3e568eSBarry Smith extern int MatDiagonalShift(Mat,Vec);
7577c4ece6SBarry Smith extern int MatEqual(Mat,Mat, PetscTruth*);
767b80b807SBarry Smith 
777b80b807SBarry Smith extern int MatNorm(Mat,NormType,double *);
787b80b807SBarry Smith extern int MatZeroEntries(Mat);
797b80b807SBarry Smith extern int MatZeroRows(Mat,IS,Scalar*);
807b80b807SBarry Smith extern int MatZeroColumns(Mat,IS,Scalar*);
817b80b807SBarry Smith 
827b80b807SBarry Smith extern int MatGetSize(Mat,int*,int*);
837b80b807SBarry Smith extern int MatGetLocalSize(Mat,int*,int*);
847b80b807SBarry Smith extern int MatGetOwnershipRange(Mat,int*,int*);
857b80b807SBarry Smith 
867b80b807SBarry Smith typedef enum {MAT_INITIAL_MATRIX, MAT_REUSE_MATRIX} MatGetSubMatrixCall;
877b80b807SBarry Smith extern int MatGetSubMatrix(Mat,IS,IS,MatGetSubMatrixCall,Mat*);
887b80b807SBarry Smith extern int MatGetSubMatrixInPlace(Mat,IS,IS);
897b80b807SBarry Smith extern int MatGetSubMatrices(Mat,int,IS *,IS *,MatGetSubMatrixCall,Mat **);
907b80b807SBarry Smith extern int MatIncreaseOverlap(Mat,int,IS *,int);
917b80b807SBarry Smith 
927b80b807SBarry Smith extern int MatAXPY(Scalar *,Mat,Mat);
937b80b807SBarry Smith extern int MatCompress(Mat);
947b80b807SBarry Smith 
95052efed2SBarry Smith extern int MatScale(Scalar *,Mat);
96052efed2SBarry Smith extern int MatShift(Scalar *,Mat);
97052efed2SBarry Smith 
987b80b807SBarry Smith /* Routines unique to particular data structures */
997b80b807SBarry Smith extern int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
1007b80b807SBarry Smith 
1017b80b807SBarry Smith /*
1027b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
1037b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
1047b80b807SBarry Smith */
1057b80b807SBarry Smith 
10683f0b094SBarry Smith typedef enum {ORDER_NATURAL=0,ORDER_ND=1,ORDER_1WD=2,
10709883261SBarry Smith               ORDER_RCM=3,ORDER_QMD=4,ORDER_ROWLENGTH=5,ORDER_APPLICATION_1,
108464493b3SBarry Smith               ORDER_APPLICATION_2} MatOrdering;
109ee50ffe9SBarry Smith extern int MatGetReordering(Mat,MatOrdering,IS*,IS*);
110d7b056bfSBarry Smith extern int MatGetReorderingTypeFromOptions(char *,MatOrdering*);
111832a8ecbSBarry Smith extern int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
11271aaadd7SBarry Smith extern int MatReorderingRegister(MatOrdering *,char*,PetscTruth,int,
11309883261SBarry Smith                                  int (*)(int*,int*,int*,int*,int*));
114464493b3SBarry Smith extern int MatReorderingRegisterAll();
115464493b3SBarry Smith extern int MatReorderingRegisterDestroy();
11609883261SBarry Smith extern int MatReorderingGetName(MatOrdering,char **);
11709883261SBarry Smith extern PetscTruth MatReorderingRequiresSymmetric[];
11809883261SBarry Smith extern int MatReorderingIndexShift[];
1192eac72dbSBarry Smith 
12049d8b64dSBarry Smith extern int MatLUFactor(Mat,IS,IS,double);
121d7b056bfSBarry Smith extern int MatILUFactor(Mat,IS,IS,double,int);
12249d8b64dSBarry Smith extern int MatCholeskyFactor(Mat,IS,double);
12364051cb3SBarry Smith extern int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*);
12464051cb3SBarry Smith extern int MatILUFactorSymbolic(Mat,IS,IS,double,int,Mat*);
12564051cb3SBarry Smith extern int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
12664051cb3SBarry Smith extern int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
12720563c6bSBarry Smith extern int MatLUFactorNumeric(Mat,Mat*);
12820563c6bSBarry Smith extern int MatCholeskyFactorNumeric(Mat,Mat*);
1298ed539a5SBarry Smith 
1308ed539a5SBarry Smith extern int MatSolve(Mat,Vec,Vec);
13122169318SLois Curfman McInnes extern int MatForwardSolve(Mat,Vec,Vec);
13222169318SLois Curfman McInnes extern int MatBackwardSolve(Mat,Vec,Vec);
1338ed539a5SBarry Smith extern int MatSolveAdd(Mat,Vec,Vec,Vec);
13428988994SBarry Smith extern int MatSolveTrans(Mat,Vec,Vec);
13528988994SBarry Smith extern int MatSolveTransAdd(Mat,Vec,Vec,Vec);
1368ed539a5SBarry Smith 
137ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
138ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
139ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
140ca9b4cbeSLois Curfman McInnes               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128
141ca9b4cbeSLois Curfman McInnes               } MatSORType;
142ca9b4cbeSLois Curfman McInnes extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
1438ed539a5SBarry Smith 
144fae171e0SBarry Smith typedef enum { MAT_SET_VALUES=0,
145fae171e0SBarry Smith                MAT_GET_ROW=1,
146fae171e0SBarry Smith                MAT_RESTORE_ROW=2,
147fae171e0SBarry Smith                MAT_MULT=3,
148fae171e0SBarry Smith                MAT_MULT_ADD=4,
149fae171e0SBarry Smith                MAT_MULT_TRANS=5,
150fae171e0SBarry Smith                MAT_MULT_TRANS_ADD=6,
151fae171e0SBarry Smith                MAT_SOLVE=7,
152fae171e0SBarry Smith                MAT_SOLVE_ADD=8,
153fae171e0SBarry Smith                MAT_SOLVE_TRANS=9,
154fae171e0SBarry Smith                MAT_SOLVE_TRANS_ADD=10,
155fae171e0SBarry Smith                MAT_LUFACTOR=11,
156fae171e0SBarry Smith                MAT_CHOLESKYFACTOR=12,
157fae171e0SBarry Smith                MAT_RELAX=13,
158fae171e0SBarry Smith                MAT_TRANSPOSE=14,
159fae171e0SBarry Smith                MAT_GETINFO=15,
160fae171e0SBarry Smith                MAT_EQUAL=16,
161fae171e0SBarry Smith                MAT_GET_DIAGONAL=17,
162fae171e0SBarry Smith                MAT_DIAGONAL_SCALE=18,
163fae171e0SBarry Smith                MAT_NORM=19,
164fae171e0SBarry Smith                MAT_ASSEMBLY_BEGIN=20,
165fae171e0SBarry Smith                MAT_ASSEMBLY_END=21,
166fae171e0SBarry Smith                MAT_COMPRESS=22,
167fae171e0SBarry Smith                MAT_SET_OPTION=23,
168fae171e0SBarry Smith                MAT_ZERO_ENTRIES=24,
169fae171e0SBarry Smith                MAT_ZERO_ROWS=25,
170fae171e0SBarry Smith                MAT_GET_REORDERING=26,
171fae171e0SBarry Smith                MAT_LUFACTOR_SYMBOLIC=27,
172fae171e0SBarry Smith                MAT_LUFACTOR_NUMERIC=28,
173fae171e0SBarry Smith                MAT_CHOLESKY_FACTOR_SYMBOLIC=29,
174fae171e0SBarry Smith                MAT_CHOLESKY_FACTOR_NUMERIC=30,
175fae171e0SBarry Smith                MAT_GET_SIZE=31,
176fae171e0SBarry Smith                MAT_GET_LOCAL_SIZE=32,
177fae171e0SBarry Smith                MAT_GET_OWNERSHIP_RANGE=33,
178fae171e0SBarry Smith                MAT_ILUFACTOR_SYMBOLIC=34,
179fae171e0SBarry Smith                MAT_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=35,
180fae171e0SBarry Smith                MAT_GET_ARRAY=36,
181fae171e0SBarry Smith                MAT_RESTORE_ARRAY=37,
182fae171e0SBarry Smith                MAT_CONVERT=38,
183fae171e0SBarry Smith                MAT_GET_SUBMATRIX=39,
184fae171e0SBarry Smith                MAT_GET_SUBMATRIX_INPLACE=40,
185fae171e0SBarry Smith                MAT_CONVERT_SAME_TYPE=41,
186fae171e0SBarry Smith                MAT_FORWARD_SOLVE=42,
187fae171e0SBarry Smith                MAT_BACKWARD_SOLVE=43,
188fae171e0SBarry Smith                MAT_ILUFACTOR=44,
189fae171e0SBarry Smith                MAT_INCOMPLETECHOLEKSYFACTOR=45,
190fae171e0SBarry Smith                MAT_AXPY=46,
191fae171e0SBarry Smith                MAT_GET_SUBMATRICES=47,
192fae171e0SBarry Smith                MAT_INCREASE_OVERLAP=48,
193fae171e0SBarry Smith                MAT_GET_VALUES=49,
194fae171e0SBarry Smith                MAT_COPY=50,
195fae171e0SBarry Smith                MAT_PRINT_HELP=51,
196fae171e0SBarry Smith                MAT_SCALE=52,
197fae171e0SBarry Smith                MAT_SHIFT=53,
198fae171e0SBarry Smith                MAT_DIAGONAL_SHIFT=54,
199fae171e0SBarry Smith                MAT_DESTROY=250,
200fae171e0SBarry Smith                MAT_VIEW=251
201fae171e0SBarry Smith              } MatOperation;
202112a2221SBarry Smith extern int MatHasOperation(Mat,MatOperation,PetscTruth*);
203fae171e0SBarry Smith extern int MatShellSetOperation(Mat,MatOperation,void *);
204112a2221SBarry Smith 
205037ecd73SBarry Smith /*  Not currently supported!
206037ecd73SBarry Smith #define MAT_SCATTER_COOKIE PETSC_COOKIE+15
207037ecd73SBarry Smith typedef struct _MatScatter* MatScatter;
208037ecd73SBarry Smith 
209037ecd73SBarry Smith extern int MatScatterBegin(Mat,Mat,InsertMode,MatScatter);
210037ecd73SBarry Smith extern int MatScatterEnd(Mat,Mat,InsertMode,MatScatter);
211037ecd73SBarry Smith extern int MatScatterCreate(Mat,IS,IS,Mat,IS,IS,MatScatter*);
212037ecd73SBarry Smith extern int MatScatterDestroy(MatScatter);
213037ecd73SBarry Smith */
2142eac72dbSBarry Smith 
21590ace30eSBarry Smith /*
21690ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
21790ace30eSBarry Smith  stored in a universal format. By changing the format with
21890ace30eSBarry Smith  ViewerSetFormat(viewer,BINARY_FORMAT_NATIVE); the matrices will
21990ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
22090ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
22190ace30eSBarry Smith  read into matrices of the same time.
22290ace30eSBarry Smith */
22390ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
22490ace30eSBarry Smith 
2252eac72dbSBarry Smith #endif
2262eac72dbSBarry Smith 
2272eac72dbSBarry Smith 
2289d00d63dSBarry Smith 
229