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