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