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