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