xref: /petsc/include/petscmat.h (revision 082acdae65a2be6366aba0e8cc025c52f06633cb)
1 /* $Id: mat.h,v 1.119 1996/11/27 22:58:13 bsmith Exp curfman $ */
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 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
171               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
172               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
173               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128
174               } MatSORType;
175 extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
176 
177 /*
178     These routines are for efficiently computing Jacobians via finite differences.
179 */
180 typedef enum {COLORING_NATURAL, COLORING_SL, COLORING_LF, COLORING_ID,
181               COLORING_APPLICATION_1,COLORING_APPLICATION_2} MatColoring;
182 extern int MatGetColoring(Mat,MatColoring,ISColoring*);
183 extern int MatGetColoringTypeFromOptions(char *,MatColoring*);
184 extern int MatColoringRegister(MatColoring *,char*,int (*)(Mat,MatColoring,ISColoring *));
185 extern int MatColoringRegisterAll();
186 extern int MatColoringRegisterDestroy();
187 extern int MatColoringPatch(Mat,int,int *,ISColoring*);
188 
189 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 22
190 
191 typedef struct _MatFDColoring *MatFDColoring;
192 
193 extern int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
194 extern int MatFDColoringDestroy(MatFDColoring);
195 extern int MatFDColoringView(MatFDColoring,Viewer);
196 extern int MatFDColoringSetParameters(MatFDColoring,double,double);
197 extern int MatFDColoringSetFromOptions(MatFDColoring);
198 extern int MatFDColoringPrintHelp(MatFDColoring);
199 extern int MatFDColoringApply(Mat,MatFDColoring,Vec,Vec,Vec,Vec,int (*)(void *,Vec,Vec,void*),
200                               void *,void *);
201 
202 /*
203     If you add entries here you must also add them to FINCLUDE/mat.h
204 */
205 typedef enum { MATOP_SET_VALUES=0,
206                MATOP_GET_ROW=1,
207                MATOP_RESTORE_ROW=2,
208                MATOP_MULT=3,
209                MATOP_MULT_ADD=4,
210                MATOP_MULT_TRANS=5,
211                MATOP_MULT_TRANS_ADD=6,
212                MATOP_SOLVE=7,
213                MATOP_SOLVE_ADD=8,
214                MATOP_SOLVE_TRANS=9,
215                MATOP_SOLVE_TRANS_ADD=10,
216                MATOP_LUFACTOR=11,
217                MATOP_CHOLESKYFACTOR=12,
218                MATOP_RELAX=13,
219                MATOP_TRANSPOSE=14,
220                MATOP_GETINFO=15,
221                MATOP_EQUAL=16,
222                MATOP_GET_DIAGONAL=17,
223                MATOP_DIAGONAL_SCALE=18,
224                MATOP_NORM=19,
225                MATOP_ASSEMBLY_BEGIN=20,
226                MATOP_ASSEMBLY_END=21,
227                MATOP_COMPRESS=22,
228                MATOP_SET_OPTION=23,
229                MATOP_ZERO_ENTRIES=24,
230                MATOP_ZERO_ROWS=25,
231                MATOP_LUFACTOR_SYMBOLIC=26,
232                MATOP_LUFACTOR_NUMERIC=27,
233                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
234                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
235                MATOP_GET_SIZE=30,
236                MATOP_GET_LOCAL_SIZE=31,
237                MATOP_GET_OWNERSHIP_RANGE=32,
238                MATOP_ILUFACTOR_SYMBOLIC=33,
239                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
240                MATOP_GET_ARRAY=35,
241                MATOP_RESTORE_ARRAY=36,
242                MATOP_CONVERT=37,
243 
244                MATOP_CONVERT_SAME_TYPE=40,
245                MATOP_FORWARD_SOLVE=41,
246                MATOP_BACKWARD_SOLVE=42,
247                MATOP_ILUFACTOR=43,
248                MATOP_INCOMPLETECHOLESKYFACTOR=44,
249                MATOP_AXPY=45,
250                MATOP_GET_SUBMATRICES=46,
251                MATOP_INCREASE_OVERLAP=47,
252                MATOP_GET_VALUES=48,
253                MATOP_COPY=49,
254                MATOP_PRINT_HELP=50,
255                MATOP_SCALE=51,
256                MATOP_SHIFT=52,
257                MATOP_DIAGONAL_SHIFT=53,
258                MATOP_ILUDT_FACTOR=54,
259                MATOP_GET_BLOCK_SIZE=55,
260                MATOP_GET_ROW_IJ=56,
261                MATOP_RESTORE_ROW_IJ=57,
262                MATOP_GET_COLUMN_IJ=58,
263                MATOP_RESTORE_COLUMN_IJ=59,
264                MATOP_FDCOLORING_CREATE=60,
265                MATOP_DESTROY=250,
266                MATOP_VIEW=251
267              } MatOperation;
268 extern int MatHasOperation(Mat,MatOperation,PetscTruth*);
269 extern int MatShellSetOperation(Mat,MatOperation,void *);
270 
271 /*
272    Codes for matrices stored on disk. By default they are
273  stored in a universal format. By changing the format with
274  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
275  be stored in a way natural for the matrix, for example dense matrices
276  would be stored as dense. Matrices stored this way may only be
277  read into matrices of the same time.
278 */
279 #define MATRIX_BINARY_FORMAT_DENSE -1
280 
281 #endif
282 
283 
284 
285