1 /* $Id: mat.h,v 1.105 1996/06/04 20:25:39 balay 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 typedef enum { MATSAME=-1, MATSEQDENSE, MATSEQAIJ, MATMPIAIJ, MATSHELL, 14 MATMPIROWBS, MATSEQBDIAG, MATMPIBDIAG, 15 MATMPIDENSE, MATSEQBAIJ, MATMPIBAIJ} MatType; 16 17 extern int MatCreate(MPI_Comm,int,int,Mat*); 18 extern int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*); 19 extern int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*); 20 extern int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 21 extern int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 22 extern int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,Mat*); 23 extern int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*); 24 extern int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*); 25 extern int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 26 extern int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 27 28 extern int MatDestroy(Mat); 29 30 extern int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 31 extern int MatShellGetContext(Mat,void **); 32 33 34 extern int MatPrintHelp(Mat); 35 36 /* ------------------------------------------------------------*/ 37 extern int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode); 38 typedef enum {FLUSH_ASSEMBLY=1,FINAL_ASSEMBLY=0} MatAssemblyType; 39 extern int MatAssemblyBegin(Mat,MatAssemblyType); 40 extern int MatAssemblyEnd(Mat,MatAssemblyType); 41 42 typedef enum {ROW_ORIENTED=1,COLUMN_ORIENTED=2,ROWS_SORTED=4, 43 COLUMNS_SORTED=8,NO_NEW_NONZERO_LOCATIONS=16, 44 YES_NEW_NONZERO_LOCATIONS=32,SYMMETRIC_MATRIX=64, 45 STRUCTURALLY_SYMMETRIC_MATRIX,NO_NEW_DIAGONALS, 46 YES_NEW_DIAGONALS,INODE_LIMIT_1,INODE_LIMIT_2, 47 INODE_LIMIT_3,INODE_LIMIT_4,INODE_LIMIT_5} MatOption; 48 extern int MatSetOption(Mat,MatOption); 49 extern int MatGetType(Mat,MatType*,char**); 50 extern int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,int*); 51 extern int MatGetValues(Mat,int,int*,int,int*,Scalar*); 52 extern int MatGetRow(Mat,int,int *,int **,Scalar**); 53 extern int MatRestoreRow(Mat,int,int *,int **,Scalar**); 54 extern int MatGetColumn(Mat,int,int *,int **,Scalar**); 55 extern int MatRestoreColumn(Mat,int,int *,int **,Scalar**); 56 extern int MatGetArray(Mat,Scalar **); 57 extern int MatRestoreArray(Mat,Scalar **); 58 59 extern int MatMult(Mat,Vec,Vec); 60 extern int MatMultAdd(Mat,Vec,Vec,Vec); 61 extern int MatMultTrans(Mat,Vec,Vec); 62 extern int MatMultTransAdd(Mat,Vec,Vec,Vec); 63 64 extern int MatConvert(Mat,MatType,Mat*); 65 extern int MatCopy(Mat,Mat); 66 extern int MatView(Mat,Viewer); 67 extern int MatLoad(Viewer,MatType,Mat*); 68 69 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 70 extern int MatGetInfo(Mat,MatInfoType,int*,int*,int*); 71 extern int MatValid(Mat,PetscTruth*); 72 extern int MatGetDiagonal(Mat,Vec); 73 extern int MatTranspose(Mat,Mat*); 74 extern int MatDiagonalScale(Mat,Vec,Vec); 75 extern int MatDiagonalShift(Mat,Vec); 76 extern int MatEqual(Mat,Mat, PetscTruth*); 77 78 extern int MatNorm(Mat,NormType,double *); 79 extern int MatZeroEntries(Mat); 80 extern int MatZeroRows(Mat,IS,Scalar*); 81 extern int MatZeroColumns(Mat,IS,Scalar*); 82 83 extern int MatGetSize(Mat,int*,int*); 84 extern int MatGetLocalSize(Mat,int*,int*); 85 extern int MatGetOwnershipRange(Mat,int*,int*); 86 87 typedef enum {MAT_INITIAL_MATRIX, MAT_REUSE_MATRIX} MatGetSubMatrixCall; 88 extern int MatGetSubMatrix(Mat,IS,IS,MatGetSubMatrixCall,Mat*); 89 extern int MatGetSubMatrixInPlace(Mat,IS,IS); 90 extern int MatGetSubMatrices(Mat,int,IS *,IS *,MatGetSubMatrixCall,Mat **); 91 extern int MatIncreaseOverlap(Mat,int,IS *,int); 92 93 extern int MatAXPY(Scalar *,Mat,Mat); 94 extern int MatCompress(Mat); 95 96 extern int MatScale(Scalar *,Mat); 97 extern int MatShift(Scalar *,Mat); 98 99 /* Routines unique to particular data structures */ 100 extern int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 101 102 /* 103 These routines are not usually accessed directly, rather solving is 104 done through the SLES, KSP and PC interfaces. 105 */ 106 107 typedef enum {ORDER_NATURAL=0,ORDER_ND=1,ORDER_1WD=2, 108 ORDER_RCM=3,ORDER_QMD=4,ORDER_ROWLENGTH=5,ORDER_APPLICATION_1, 109 ORDER_APPLICATION_2} MatOrdering; 110 extern int MatGetReordering(Mat,MatOrdering,IS*,IS*); 111 extern int MatGetReorderingTypeFromOptions(char *,MatOrdering*); 112 extern int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 113 extern int MatReorderingRegister(MatOrdering *,char*,PetscTruth,int, 114 int (*)(int*,int*,int*,int*,int*)); 115 extern int MatReorderingRegisterAll(); 116 extern int MatReorderingRegisterDestroy(); 117 extern int MatReorderingGetName(MatOrdering,char **); 118 extern PetscTruth MatReorderingRequiresSymmetric[]; 119 extern int MatReorderingIndexShift[]; 120 121 extern int MatLUFactor(Mat,IS,IS,double); 122 extern int MatILUFactor(Mat,IS,IS,double,int); 123 extern int MatCholeskyFactor(Mat,IS,double); 124 extern int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*); 125 extern int MatILUFactorSymbolic(Mat,IS,IS,double,int,Mat*); 126 extern int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 127 extern int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 128 extern int MatLUFactorNumeric(Mat,Mat*); 129 extern int MatCholeskyFactorNumeric(Mat,Mat*); 130 131 extern int MatSolve(Mat,Vec,Vec); 132 extern int MatForwardSolve(Mat,Vec,Vec); 133 extern int MatBackwardSolve(Mat,Vec,Vec); 134 extern int MatSolveAdd(Mat,Vec,Vec,Vec); 135 extern int MatSolveTrans(Mat,Vec,Vec); 136 extern int MatSolveTransAdd(Mat,Vec,Vec,Vec); 137 138 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 139 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 140 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 141 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128 142 } MatSORType; 143 extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 144 145 typedef enum { MAT_SET_VALUES=0, 146 MAT_GET_ROW=1, 147 MAT_RESTORE_ROW=2, 148 MAT_MULT=3, 149 MAT_MULT_ADD=4, 150 MAT_MULT_TRANS=5, 151 MAT_MULT_TRANS_ADD=6, 152 MAT_SOLVE=7, 153 MAT_SOLVE_ADD=8, 154 MAT_SOLVE_TRANS=9, 155 MAT_SOLVE_TRANS_ADD=10, 156 MAT_LUFACTOR=11, 157 MAT_CHOLESKYFACTOR=12, 158 MAT_RELAX=13, 159 MAT_TRANSPOSE=14, 160 MAT_GETINFO=15, 161 MAT_EQUAL=16, 162 MAT_GET_DIAGONAL=17, 163 MAT_DIAGONAL_SCALE=18, 164 MAT_NORM=19, 165 MAT_ASSEMBLY_BEGIN=20, 166 MAT_ASSEMBLY_END=21, 167 MAT_COMPRESS=22, 168 MAT_SET_OPTION=23, 169 MAT_ZERO_ENTRIES=24, 170 MAT_ZERO_ROWS=25, 171 MAT_GET_REORDERING=26, 172 MAT_LUFACTOR_SYMBOLIC=27, 173 MAT_LUFACTOR_NUMERIC=28, 174 MAT_CHOLESKY_FACTOR_SYMBOLIC=29, 175 MAT_CHOLESKY_FACTOR_NUMERIC=30, 176 MAT_GET_SIZE=31, 177 MAT_GET_LOCAL_SIZE=32, 178 MAT_GET_OWNERSHIP_RANGE=33, 179 MAT_ILUFACTOR_SYMBOLIC=34, 180 MAT_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=35, 181 MAT_GET_ARRAY=36, 182 MAT_RESTORE_ARRAY=37, 183 MAT_CONVERT=38, 184 MAT_GET_SUBMATRIX=39, 185 MAT_GET_SUBMATRIX_INPLACE=40, 186 MAT_CONVERT_SAME_TYPE=41, 187 MAT_FORWARD_SOLVE=42, 188 MAT_BACKWARD_SOLVE=43, 189 MAT_ILUFACTOR=44, 190 MAT_INCOMPLETECHOLEKSYFACTOR=45, 191 MAT_AXPY=46, 192 MAT_GET_SUBMATRICES=47, 193 MAT_INCREASE_OVERLAP=48, 194 MAT_GET_VALUES=49, 195 MAT_COPY=50, 196 MAT_PRINT_HELP=51, 197 MAT_SCALE=52, 198 MAT_SHIFT=53, 199 MAT_DIAGONAL_SHIFT=54, 200 MAT_DESTROY=250, 201 MAT_VIEW=251 202 } MatOperation; 203 extern int MatHasOperation(Mat,MatOperation,PetscTruth*); 204 extern int MatShellSetOperation(Mat,MatOperation,void *); 205 206 /* Not currently supported! 207 #define MAT_SCATTER_COOKIE PETSC_COOKIE+15 208 typedef struct _MatScatter* MatScatter; 209 210 extern int MatScatterBegin(Mat,Mat,InsertMode,MatScatter); 211 extern int MatScatterEnd(Mat,Mat,InsertMode,MatScatter); 212 extern int MatScatterCreate(Mat,IS,IS,Mat,IS,IS,MatScatter*); 213 extern int MatScatterDestroy(MatScatter); 214 */ 215 216 /* 217 Codes for matrices stored on disk. By default they are 218 stored in a universal format. By changing the format with 219 ViewerSetFormat(viewer,BINARY_FORMAT_NATIVE); the matrices will 220 be stored in a way natural for the matrix, for example dense matrices 221 would be stored as dense. Matrices stored this way may only be 222 read into matrices of the same time. 223 */ 224 #define MATRIX_BINARY_FORMAT_DENSE -1 225 226 #endif 227 228 229 230