xref: /petsc/include/petscmat.h (revision 7a00f4a9c32e0cfbbf28c557905ad8a9142e24e7)
1 /* $Id: mat.h,v 1.121 1997/01/03 18:43:01 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 MatDiagonalScale(Mat,Vec,Vec);
107 extern int MatDiagonalShift(Mat,Vec);
108 extern int MatEqual(Mat,Mat, PetscTruth*);
109 
110 extern int MatNorm(Mat,NormType,double *);
111 extern int MatZeroEntries(Mat);
112 extern int MatZeroRows(Mat,IS,Scalar*);
113 extern int MatZeroColumns(Mat,IS,Scalar*);
114 
115 extern int MatGetSize(Mat,int*,int*);
116 extern int MatGetLocalSize(Mat,int*,int*);
117 extern int MatGetOwnershipRange(Mat,int*,int*);
118 
119 typedef enum {MAT_INITIAL_MATRIX, MAT_REUSE_MATRIX} MatGetSubMatrixCall;
120 extern int MatGetSubMatrices(Mat,int,IS *,IS *,MatGetSubMatrixCall,Mat **);
121 extern int MatDestroyMatrices(int, Mat **);
122 extern int MatIncreaseOverlap(Mat,int,IS *,int);
123 
124 extern int MatAXPY(Scalar *,Mat,Mat);
125 extern int MatCompress(Mat);
126 
127 extern int MatScale(Scalar *,Mat);
128 extern int MatShift(Scalar *,Mat);
129 
130 extern int MatSetLocalToGlobalMapping(Mat, int,int *);
131 extern int MatZeroRowsLocal(Mat,IS,Scalar*);
132 extern int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
133 
134 extern int MatComputeExplicitOperator(Mat,Mat*);
135 
136 /* Routines unique to particular data structures */
137 extern int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
138 
139 /*
140   These routines are not usually accessed directly, rather solving is
141   done through the SLES, KSP and PC interfaces.
142 */
143 
144 typedef enum {ORDER_NATURAL=0,ORDER_ND=1,ORDER_1WD=2,
145               ORDER_RCM=3,ORDER_QMD=4,ORDER_ROWLENGTH=5,ORDER_FLOW,
146               ORDER_APPLICATION_1,ORDER_APPLICATION_2} MatReordering;
147 extern int MatGetReordering(Mat,MatReordering,IS*,IS*);
148 extern int MatGetReorderingTypeFromOptions(char *,MatReordering*);
149 extern int MatReorderingRegister(MatReordering *,char*,int (*)(Mat,MatReordering,IS*,IS*));
150 extern int MatReorderingRegisterAll();
151 extern int MatReorderingRegisterDestroy();
152 extern int MatReorderingGetName(MatReordering,char **);
153 
154 extern int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
155 
156 extern int MatCholeskyFactor(Mat,IS,double);
157 extern int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
158 extern int MatCholeskyFactorNumeric(Mat,Mat*);
159 
160 extern int MatLUFactor(Mat,IS,IS,double);
161 extern int MatILUFactor(Mat,IS,IS,double,int);
162 extern int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*);
163 extern int MatILUFactorSymbolic(Mat,IS,IS,double,int,Mat*);
164 extern int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
165 extern int MatLUFactorNumeric(Mat,Mat*);
166 extern int MatILUDTFactor(Mat,double,int,IS,IS,Mat *);
167 
168 
169 extern int MatSolve(Mat,Vec,Vec);
170 extern int MatForwardSolve(Mat,Vec,Vec);
171 extern int MatBackwardSolve(Mat,Vec,Vec);
172 extern int MatSolveAdd(Mat,Vec,Vec,Vec);
173 extern int MatSolveTrans(Mat,Vec,Vec);
174 extern int MatSolveTransAdd(Mat,Vec,Vec,Vec);
175 
176 extern int MatSetUnfactored(Mat);
177 
178 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
179               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
180               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
181               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128
182               } MatSORType;
183 extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
184 
185 /*
186     These routines are for efficiently computing Jacobians via finite differences.
187 */
188 typedef enum {COLORING_NATURAL, COLORING_SL, COLORING_LF, COLORING_ID,
189               COLORING_APPLICATION_1,COLORING_APPLICATION_2} MatColoring;
190 extern int MatGetColoring(Mat,MatColoring,ISColoring*);
191 extern int MatGetColoringTypeFromOptions(char *,MatColoring*);
192 extern int MatColoringRegister(MatColoring *,char*,int (*)(Mat,MatColoring,ISColoring *));
193 extern int MatColoringRegisterAll();
194 extern int MatColoringRegisterDestroy();
195 extern int MatColoringPatch(Mat,int,int *,ISColoring*);
196 
197 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 22
198 
199 typedef struct _MatFDColoring *MatFDColoring;
200 
201 extern int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
202 extern int MatFDColoringDestroy(MatFDColoring);
203 extern int MatFDColoringView(MatFDColoring,Viewer);
204 extern int MatFDColoringSetParameters(MatFDColoring,double,double);
205 extern int MatFDColoringSetFromOptions(MatFDColoring);
206 extern int MatFDColoringPrintHelp(MatFDColoring);
207 extern int MatFDColoringApply(Mat,MatFDColoring,Vec,Vec,Vec,Vec,int (*)(void *,Vec,Vec,void*),
208                               void *,void *);
209 
210 /*
211     If you add entries here you must also add them to FINCLUDE/mat.h
212 */
213 typedef enum { MATOP_SET_VALUES=0,
214                MATOP_GET_ROW=1,
215                MATOP_RESTORE_ROW=2,
216                MATOP_MULT=3,
217                MATOP_MULT_ADD=4,
218                MATOP_MULT_TRANS=5,
219                MATOP_MULT_TRANS_ADD=6,
220                MATOP_SOLVE=7,
221                MATOP_SOLVE_ADD=8,
222                MATOP_SOLVE_TRANS=9,
223                MATOP_SOLVE_TRANS_ADD=10,
224                MATOP_LUFACTOR=11,
225                MATOP_CHOLESKYFACTOR=12,
226                MATOP_RELAX=13,
227                MATOP_TRANSPOSE=14,
228                MATOP_GETINFO=15,
229                MATOP_EQUAL=16,
230                MATOP_GET_DIAGONAL=17,
231                MATOP_DIAGONAL_SCALE=18,
232                MATOP_NORM=19,
233                MATOP_ASSEMBLY_BEGIN=20,
234                MATOP_ASSEMBLY_END=21,
235                MATOP_COMPRESS=22,
236                MATOP_SET_OPTION=23,
237                MATOP_ZERO_ENTRIES=24,
238                MATOP_ZERO_ROWS=25,
239                MATOP_LUFACTOR_SYMBOLIC=26,
240                MATOP_LUFACTOR_NUMERIC=27,
241                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
242                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
243                MATOP_GET_SIZE=30,
244                MATOP_GET_LOCAL_SIZE=31,
245                MATOP_GET_OWNERSHIP_RANGE=32,
246                MATOP_ILUFACTOR_SYMBOLIC=33,
247                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
248                MATOP_GET_ARRAY=35,
249                MATOP_RESTORE_ARRAY=36,
250                MATOP_CONVERT=37,
251 
252                MATOP_CONVERT_SAME_TYPE=40,
253                MATOP_FORWARD_SOLVE=41,
254                MATOP_BACKWARD_SOLVE=42,
255                MATOP_ILUFACTOR=43,
256                MATOP_INCOMPLETECHOLESKYFACTOR=44,
257                MATOP_AXPY=45,
258                MATOP_GET_SUBMATRICES=46,
259                MATOP_INCREASE_OVERLAP=47,
260                MATOP_GET_VALUES=48,
261                MATOP_COPY=49,
262                MATOP_PRINT_HELP=50,
263                MATOP_SCALE=51,
264                MATOP_SHIFT=52,
265                MATOP_DIAGONAL_SHIFT=53,
266                MATOP_ILUDT_FACTOR=54,
267                MATOP_GET_BLOCK_SIZE=55,
268                MATOP_GET_ROW_IJ=56,
269                MATOP_RESTORE_ROW_IJ=57,
270                MATOP_GET_COLUMN_IJ=58,
271                MATOP_RESTORE_COLUMN_IJ=59,
272                MATOP_FDCOLORING_CREATE=60,
273                MATOP_DESTROY=250,
274                MATOP_VIEW=251
275              } MatOperation;
276 extern int MatHasOperation(Mat,MatOperation,PetscTruth*);
277 extern int MatShellSetOperation(Mat,MatOperation,void *);
278 
279 /*
280    Codes for matrices stored on disk. By default they are
281  stored in a universal format. By changing the format with
282  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
283  be stored in a way natural for the matrix, for example dense matrices
284  would be stored as dense. Matrices stored this way may only be
285  read into matrices of the same time.
286 */
287 #define MATRIX_BINARY_FORMAT_DENSE -1
288 
289 #endif
290 
291 
292 
293