1 /* $Id: mat.h,v 1.120 1996/11/29 21:45:38 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, 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 extern int MatSetUnfactored(Mat); 171 172 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 173 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 174 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 175 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128 176 } MatSORType; 177 extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 178 179 /* 180 These routines are for efficiently computing Jacobians via finite differences. 181 */ 182 typedef enum {COLORING_NATURAL, COLORING_SL, COLORING_LF, COLORING_ID, 183 COLORING_APPLICATION_1,COLORING_APPLICATION_2} MatColoring; 184 extern int MatGetColoring(Mat,MatColoring,ISColoring*); 185 extern int MatGetColoringTypeFromOptions(char *,MatColoring*); 186 extern int MatColoringRegister(MatColoring *,char*,int (*)(Mat,MatColoring,ISColoring *)); 187 extern int MatColoringRegisterAll(); 188 extern int MatColoringRegisterDestroy(); 189 extern int MatColoringPatch(Mat,int,int *,ISColoring*); 190 191 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 22 192 193 typedef struct _MatFDColoring *MatFDColoring; 194 195 extern int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 196 extern int MatFDColoringDestroy(MatFDColoring); 197 extern int MatFDColoringView(MatFDColoring,Viewer); 198 extern int MatFDColoringSetParameters(MatFDColoring,double,double); 199 extern int MatFDColoringSetFromOptions(MatFDColoring); 200 extern int MatFDColoringPrintHelp(MatFDColoring); 201 extern int MatFDColoringApply(Mat,MatFDColoring,Vec,Vec,Vec,Vec,int (*)(void *,Vec,Vec,void*), 202 void *,void *); 203 204 /* 205 If you add entries here you must also add them to FINCLUDE/mat.h 206 */ 207 typedef enum { MATOP_SET_VALUES=0, 208 MATOP_GET_ROW=1, 209 MATOP_RESTORE_ROW=2, 210 MATOP_MULT=3, 211 MATOP_MULT_ADD=4, 212 MATOP_MULT_TRANS=5, 213 MATOP_MULT_TRANS_ADD=6, 214 MATOP_SOLVE=7, 215 MATOP_SOLVE_ADD=8, 216 MATOP_SOLVE_TRANS=9, 217 MATOP_SOLVE_TRANS_ADD=10, 218 MATOP_LUFACTOR=11, 219 MATOP_CHOLESKYFACTOR=12, 220 MATOP_RELAX=13, 221 MATOP_TRANSPOSE=14, 222 MATOP_GETINFO=15, 223 MATOP_EQUAL=16, 224 MATOP_GET_DIAGONAL=17, 225 MATOP_DIAGONAL_SCALE=18, 226 MATOP_NORM=19, 227 MATOP_ASSEMBLY_BEGIN=20, 228 MATOP_ASSEMBLY_END=21, 229 MATOP_COMPRESS=22, 230 MATOP_SET_OPTION=23, 231 MATOP_ZERO_ENTRIES=24, 232 MATOP_ZERO_ROWS=25, 233 MATOP_LUFACTOR_SYMBOLIC=26, 234 MATOP_LUFACTOR_NUMERIC=27, 235 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 236 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 237 MATOP_GET_SIZE=30, 238 MATOP_GET_LOCAL_SIZE=31, 239 MATOP_GET_OWNERSHIP_RANGE=32, 240 MATOP_ILUFACTOR_SYMBOLIC=33, 241 MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 242 MATOP_GET_ARRAY=35, 243 MATOP_RESTORE_ARRAY=36, 244 MATOP_CONVERT=37, 245 246 MATOP_CONVERT_SAME_TYPE=40, 247 MATOP_FORWARD_SOLVE=41, 248 MATOP_BACKWARD_SOLVE=42, 249 MATOP_ILUFACTOR=43, 250 MATOP_INCOMPLETECHOLESKYFACTOR=44, 251 MATOP_AXPY=45, 252 MATOP_GET_SUBMATRICES=46, 253 MATOP_INCREASE_OVERLAP=47, 254 MATOP_GET_VALUES=48, 255 MATOP_COPY=49, 256 MATOP_PRINT_HELP=50, 257 MATOP_SCALE=51, 258 MATOP_SHIFT=52, 259 MATOP_DIAGONAL_SHIFT=53, 260 MATOP_ILUDT_FACTOR=54, 261 MATOP_GET_BLOCK_SIZE=55, 262 MATOP_GET_ROW_IJ=56, 263 MATOP_RESTORE_ROW_IJ=57, 264 MATOP_GET_COLUMN_IJ=58, 265 MATOP_RESTORE_COLUMN_IJ=59, 266 MATOP_FDCOLORING_CREATE=60, 267 MATOP_DESTROY=250, 268 MATOP_VIEW=251 269 } MatOperation; 270 extern int MatHasOperation(Mat,MatOperation,PetscTruth*); 271 extern int MatShellSetOperation(Mat,MatOperation,void *); 272 273 /* 274 Codes for matrices stored on disk. By default they are 275 stored in a universal format. By changing the format with 276 ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 277 be stored in a way natural for the matrix, for example dense matrices 278 would be stored as dense. Matrices stored this way may only be 279 read into matrices of the same time. 280 */ 281 #define MATRIX_BINARY_FORMAT_DENSE -1 282 283 #endif 284 285 286 287