xref: /petsc/include/petscmat.h (revision 639f9d9dbbc54d6ac4e42e98283c540b41bb2cee)
1 /* $Id: mat.h,v 1.116 1996/09/28 23:11:27 curfman Exp bsmith $ */
2 /*
3      Include file for the matrix component of PETSc
4 */
5 #ifndef __MAT_PACKAGE
6 #define __MAT_PACKAGE
7 #include "vec.h"
8 
9 #define MAT_COOKIE         PETSC_COOKIE+5
10 
11 typedef struct _Mat*           Mat;
12 
13 /*
14    The default matrix data storage formats and routines to create them.
15 */
16 typedef enum { MATSAME=-1, MATSEQDENSE, MATSEQAIJ, MATMPIAIJ, MATSHELL,
17                MATMPIROWBS, MATSEQBDIAG, MATMPIBDIAG,
18                MATMPIDENSE, MATSEQBAIJ, MATMPIBAIJ} MatType;
19 
20 extern int MatCreate(MPI_Comm,int,int,Mat*);
21 extern int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
22 extern int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
23 extern int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
24 extern int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
25 extern int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,Mat*);
26 extern int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
27 extern int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
28 extern int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
29 extern int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
30 
31 extern int MatDestroy(Mat);
32 
33 extern int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
34 extern int MatShellGetContext(Mat,void **);
35 
36 
37 extern int MatPrintHelp(Mat);
38 
39 /* ------------------------------------------------------------*/
40 extern int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
41 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
42 extern int MatAssemblyBegin(Mat,MatAssemblyType);
43 extern int MatAssemblyEnd(Mat,MatAssemblyType);
44 
45 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
46               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
47               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
48               MAT_STRUCTURALLY_SYMMETRIC,MAT_NO_NEW_DIAGONALS,
49               MAT_YES_NEW_DIAGONALS,MAT_INODE_LIMIT_1,MAT_INODE_LIMIT_2,
50               MAT_INODE_LIMIT_3,MAT_INODE_LIMIT_4,MAT_INODE_LIMIT_5} MatOption;
51 extern int MatSetOption(Mat,MatOption);
52 extern int MatGetType(Mat,MatType*,char**);
53 extern int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,int*);
54 extern int MatGetValues(Mat,int,int*,int,int*,Scalar*);
55 extern int MatGetRow(Mat,int,int *,int **,Scalar**);
56 extern int MatRestoreRow(Mat,int,int *,int **,Scalar**);
57 extern int MatGetColumn(Mat,int,int *,int **,Scalar**);
58 extern int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
59 extern int MatGetArray(Mat,Scalar **);
60 extern int MatRestoreArray(Mat,Scalar **);
61 extern int MatGetBlockSize(Mat,int *);
62 
63 extern int MatMult(Mat,Vec,Vec);
64 extern int MatMultAdd(Mat,Vec,Vec,Vec);
65 extern int MatMultTrans(Mat,Vec,Vec);
66 extern int MatMultTransAdd(Mat,Vec,Vec,Vec);
67 
68 extern int MatConvert(Mat,MatType,Mat*);
69 extern int MatCopy(Mat,Mat);
70 extern int MatView(Mat,Viewer);
71 extern int MatLoad(Viewer,MatType,Mat*);
72 
73 extern int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
74 extern int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
75 extern int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
76 extern int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
77 
78 /*
79    Context of matrix information, used with MatGetInfo()
80    Note: If any entries are added to this context, be sure
81          to adjust MAT_INFO_SIZE in FINCLUDE/mat.h
82  */
83 typedef struct {
84   double rows_global, columns_global;         /* number of global rows and columns */
85   double rows_local, columns_local;           /* number of local rows and columns */
86   double block_size;                          /* block size */
87   double nz_allocated, nz_used, nz_unneeded;  /* number of nonzeros */
88   double memory;                              /* memory allocated */
89   double assemblies;                          /* number of matrix assemblies */
90   double mallocs;                             /* number of mallocs during MatSetValues() */
91   double fill_ratio_given, fill_ratio_needed; /* fill ration for LU/ILU */
92   double factor_mallocs;                      /* number of mallocs during factorization */
93 } MatInfo;
94 
95 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
96 extern int MatGetInfo(Mat,MatInfoType,MatInfo*);
97 extern int MatValid(Mat,PetscTruth*);
98 extern int MatGetDiagonal(Mat,Vec);
99 extern int MatTranspose(Mat,Mat*);
100 extern int MatDiagonalScale(Mat,Vec,Vec);
101 extern int MatDiagonalShift(Mat,Vec);
102 extern int MatEqual(Mat,Mat, PetscTruth*);
103 
104 extern int MatNorm(Mat,NormType,double *);
105 extern int MatZeroEntries(Mat);
106 extern int MatZeroRows(Mat,IS,Scalar*);
107 extern int MatZeroColumns(Mat,IS,Scalar*);
108 
109 extern int MatGetSize(Mat,int*,int*);
110 extern int MatGetLocalSize(Mat,int*,int*);
111 extern int MatGetOwnershipRange(Mat,int*,int*);
112 
113 typedef enum {MAT_INITIAL_MATRIX, MAT_REUSE_MATRIX} MatGetSubMatrixCall;
114 extern int MatGetSubMatrices(Mat,int,IS *,IS *,MatGetSubMatrixCall,Mat **);
115 extern int MatDestroyMatrices(int, Mat **);
116 extern int MatIncreaseOverlap(Mat,int,IS *,int);
117 
118 extern int MatAXPY(Scalar *,Mat,Mat);
119 extern int MatCompress(Mat);
120 
121 extern int MatScale(Scalar *,Mat);
122 extern int MatShift(Scalar *,Mat);
123 
124 /* Routines unique to particular data structures */
125 extern int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
126 
127 /*
128   These routines are not usually accessed directly, rather solving is
129   done through the SLES, KSP and PC interfaces.
130 */
131 
132 typedef enum {ORDER_NATURAL=0,ORDER_ND=1,ORDER_1WD=2,
133               ORDER_RCM=3,ORDER_QMD=4,ORDER_ROWLENGTH=5,ORDER_FLOW,
134               ORDER_APPLICATION_1,ORDER_APPLICATION_2} MatReordering;
135 extern int MatGetReordering(Mat,MatReordering,IS*,IS*);
136 extern int MatGetReorderingTypeFromOptions(char *,MatReordering*);
137 extern int MatReorderingRegister(MatReordering *,char*,int (*)(Mat,MatReordering,IS*,IS*));
138 extern int MatReorderingRegisterAll();
139 extern int MatReorderingRegisterDestroy();
140 extern int MatReorderingGetName(MatReordering,char **);
141 
142 extern int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
143 
144 extern int MatCholeskyFactor(Mat,IS,double);
145 extern int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
146 extern int MatCholeskyFactorNumeric(Mat,Mat*);
147 
148 extern int MatLUFactor(Mat,IS,IS,double);
149 extern int MatILUFactor(Mat,IS,IS,double,int);
150 extern int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*);
151 extern int MatILUFactorSymbolic(Mat,IS,IS,double,int,Mat*);
152 extern int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
153 extern int MatLUFactorNumeric(Mat,Mat*);
154 extern int MatILUDTFactor(Mat,double,int,IS,IS,Mat *);
155 
156 
157 extern int MatSolve(Mat,Vec,Vec);
158 extern int MatForwardSolve(Mat,Vec,Vec);
159 extern int MatBackwardSolve(Mat,Vec,Vec);
160 extern int MatSolveAdd(Mat,Vec,Vec,Vec);
161 extern int MatSolveTrans(Mat,Vec,Vec);
162 extern int MatSolveTransAdd(Mat,Vec,Vec,Vec);
163 
164 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
165               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
166               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
167               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128
168               } MatSORType;
169 extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
170 
171 /*
172     These routines are for efficiently computing Jacobians via finite differences.
173 */
174 typedef enum {COLORING_NATURAL, COLORING_SL, COLORING_LF, COLORING_ID,
175               COLORING_APPLICATION_1,COLORING_APPLICATION_2} MatColoring;
176 extern int MatGetColoring(Mat,MatColoring,ISColoring*);
177 extern int MatGetColoringTypeFromOptions(char *,MatColoring*);
178 extern int MatColoringRegister(MatColoring *,char*,int (*)(Mat,MatColoring,ISColoring *));
179 extern int MatColoringRegisterAll();
180 extern int MatColoringRegisterDestroy();
181 extern int MatColoringPatch(Mat,int,int *,ISColoring*);
182 
183 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 22
184 
185 typedef struct _MatFDColoring *MatFDColoring;
186 
187 extern int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
188 extern int MatFDColoringDestroy(MatFDColoring);
189 extern int MatFDColoringView(MatFDColoring,Viewer);
190 extern int MatFDColoringSetParameters(MatFDColoring,double,double);
191 extern int MatFDColoringSetFromOptions(MatFDColoring);
192 extern int MatFDColoringPrintHelp(MatFDColoring);
193 
194 /*
195     If you add entries here you must also add them to FINCLUDE/mat.h
196 */
197 typedef enum { MATOP_SET_VALUES=0,
198                MATOP_GET_ROW=1,
199                MATOP_RESTORE_ROW=2,
200                MATOP_MULT=3,
201                MATOP_MULT_ADD=4,
202                MATOP_MULT_TRANS=5,
203                MATOP_MULT_TRANS_ADD=6,
204                MATOP_SOLVE=7,
205                MATOP_SOLVE_ADD=8,
206                MATOP_SOLVE_TRANS=9,
207                MATOP_SOLVE_TRANS_ADD=10,
208                MATOP_LUFACTOR=11,
209                MATOP_CHOLESKYFACTOR=12,
210                MATOP_RELAX=13,
211                MATOP_TRANSPOSE=14,
212                MATOP_GETINFO=15,
213                MATOP_EQUAL=16,
214                MATOP_GET_DIAGONAL=17,
215                MATOP_DIAGONAL_SCALE=18,
216                MATOP_NORM=19,
217                MATOP_ASSEMBLY_BEGIN=20,
218                MATOP_ASSEMBLY_END=21,
219                MATOP_COMPRESS=22,
220                MATOP_SET_OPTION=23,
221                MATOP_ZERO_ENTRIES=24,
222                MATOP_ZERO_ROWS=25,
223                MATOP_LUFACTOR_SYMBOLIC=26,
224                MATOP_LUFACTOR_NUMERIC=27,
225                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
226                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
227                MATOP_GET_SIZE=30,
228                MATOP_GET_LOCAL_SIZE=31,
229                MATOP_GET_OWNERSHIP_RANGE=32,
230                MATOP_ILUFACTOR_SYMBOLIC=33,
231                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
232                MATOP_GET_ARRAY=35,
233                MATOP_RESTORE_ARRAY=36,
234                MATOP_CONVERT=37,
235 
236                MATOP_CONVERT_SAME_TYPE=40,
237                MATOP_FORWARD_SOLVE=41,
238                MATOP_BACKWARD_SOLVE=42,
239                MATOP_ILUFACTOR=43,
240                MATOP_INCOMPLETECHOLESKYFACTOR=44,
241                MATOP_AXPY=45,
242                MATOP_GET_SUBMATRICES=46,
243                MATOP_INCREASE_OVERLAP=47,
244                MATOP_GET_VALUES=48,
245                MATOP_COPY=49,
246                MATOP_PRINT_HELP=50,
247                MATOP_SCALE=51,
248                MATOP_SHIFT=52,
249                MATOP_DIAGONAL_SHIFT=53,
250                MATOP_ILUDT_FACTOR=54,
251                MATOP_GET_BLOCK_SIZE=55,
252                MATOP_GET_ROW_IJ=56,
253                MATOP_RESTORE_ROW_IJ=57,
254                MATOP_GET_COLUMN_IJ=58,
255                MATOP_RESTORE_COLUMN_IJ=59,
256                MATOP_FDCOLORING_CREATE=60,
257                MATOP_DESTROY=250,
258                MATOP_VIEW=251
259              } MatOperation;
260 extern int MatHasOperation(Mat,MatOperation,PetscTruth*);
261 extern int MatShellSetOperation(Mat,MatOperation,void *);
262 
263 /*
264    Codes for matrices stored on disk. By default they are
265  stored in a universal format. By changing the format with
266  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
267  be stored in a way natural for the matrix, for example dense matrices
268  would be stored as dense. Matrices stored this way may only be
269  read into matrices of the same time.
270 */
271 #define MATRIX_BINARY_FORMAT_DENSE -1
272 
273 #endif
274 
275 
276 
277