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