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