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