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