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