1 /* $Id: mat.h,v 1.110 1996/07/15 23:38:53 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 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 {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 39 extern int MatAssemblyBegin(Mat,MatAssemblyType); 40 extern int MatAssemblyEnd(Mat,MatAssemblyType); 41 42 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 43 MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 44 MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 45 MAT_STRUCTURALLY_SYMMETRIC,MAT_NO_NEW_DIAGONALS, 46 MAT_YES_NEW_DIAGONALS,MAT_INODE_LIMIT_1,MAT_INODE_LIMIT_2, 47 MAT_INODE_LIMIT_3,MAT_INODE_LIMIT_4,MAT_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 extern int MatGetBlockSize(Mat,int *); 59 60 extern int MatMult(Mat,Vec,Vec); 61 extern int MatMultAdd(Mat,Vec,Vec,Vec); 62 extern int MatMultTrans(Mat,Vec,Vec); 63 extern int MatMultTransAdd(Mat,Vec,Vec,Vec); 64 65 extern int MatConvert(Mat,MatType,Mat*); 66 extern int MatCopy(Mat,Mat); 67 extern int MatView(Mat,Viewer); 68 extern int MatLoad(Viewer,MatType,Mat*); 69 70 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 71 extern int MatGetInfo(Mat,MatInfoType,int*,int*,int*); 72 extern int MatValid(Mat,PetscTruth*); 73 extern int MatGetDiagonal(Mat,Vec); 74 extern int MatTranspose(Mat,Mat*); 75 extern int MatDiagonalScale(Mat,Vec,Vec); 76 extern int MatDiagonalShift(Mat,Vec); 77 extern int MatEqual(Mat,Mat, PetscTruth*); 78 79 extern int MatNorm(Mat,NormType,double *); 80 extern int MatZeroEntries(Mat); 81 extern int MatZeroRows(Mat,IS,Scalar*); 82 extern int MatZeroColumns(Mat,IS,Scalar*); 83 84 extern int MatGetSize(Mat,int*,int*); 85 extern int MatGetLocalSize(Mat,int*,int*); 86 extern int MatGetOwnershipRange(Mat,int*,int*); 87 88 typedef enum {MAT_INITIAL_MATRIX, MAT_REUSE_MATRIX} MatGetSubMatrixCall; 89 extern int MatGetSubMatrices(Mat,int,IS *,IS *,MatGetSubMatrixCall,Mat **); 90 extern int MatDestroyMatrices(int, 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_FLOW, 109 ORDER_APPLICATION_1,ORDER_APPLICATION_2} MatReordering; 110 extern int MatGetReordering(Mat,MatReordering,IS*,IS*); 111 extern int MatGetReorderingTypeFromOptions(char *,MatReordering*); 112 extern int MatReorderingRegister(MatReordering *,char*,PetscTruth,int, 113 int (*)(int*,int*,int*,int*,int*)); 114 extern int MatReorderingRegisterAll(); 115 extern int MatReorderingRegisterDestroy(); 116 extern int MatReorderingGetName(MatReordering,char **); 117 extern PetscTruth MatReorderingRequiresSymmetric[]; 118 extern int MatReorderingIndexShift[]; 119 120 extern int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 121 122 extern int MatCholeskyFactor(Mat,IS,double); 123 extern int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 124 extern int MatCholeskyFactorNumeric(Mat,Mat*); 125 126 extern int MatLUFactor(Mat,IS,IS,double); 127 extern int MatILUFactor(Mat,IS,IS,double,int); 128 extern int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*); 129 extern int MatILUFactorSymbolic(Mat,IS,IS,double,int,Mat*); 130 extern int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 131 extern int MatLUFactorNumeric(Mat,Mat*); 132 extern int MatILUDTFactor(Mat,double,int,IS,IS,Mat *); 133 134 135 extern int MatSolve(Mat,Vec,Vec); 136 extern int MatForwardSolve(Mat,Vec,Vec); 137 extern int MatBackwardSolve(Mat,Vec,Vec); 138 extern int MatSolveAdd(Mat,Vec,Vec,Vec); 139 extern int MatSolveTrans(Mat,Vec,Vec); 140 extern int MatSolveTransAdd(Mat,Vec,Vec,Vec); 141 142 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 143 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 144 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 145 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128 146 } MatSORType; 147 extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 148 149 typedef enum { MAT_SET_VALUES=0, 150 MAT_GET_ROW=1, 151 MAT_RESTORE_ROW=2, 152 MAT_MULT=3, 153 MAT_MULT_ADD=4, 154 MAT_MULT_TRANS=5, 155 MAT_MULT_TRANS_ADD=6, 156 MAT_SOLVE=7, 157 MAT_SOLVE_ADD=8, 158 MAT_SOLVE_TRANS=9, 159 MAT_SOLVE_TRANS_ADD=10, 160 MAT_LUFACTOR=11, 161 MAT_CHOLESKYFACTOR=12, 162 MAT_RELAX=13, 163 MAT_TRANSPOSE=14, 164 MAT_GETINFO=15, 165 MAT_EQUAL=16, 166 MAT_GET_DIAGONAL=17, 167 MAT_DIAGONAL_SCALE=18, 168 MAT_NORM=19, 169 MAT_ASSEMBLY_BEGIN=20, 170 MAT_ASSEMBLY_END=21, 171 MAT_COMPRESS=22, 172 MAT_SET_OPTION=23, 173 MAT_ZERO_ENTRIES=24, 174 MAT_ZERO_ROWS=25, 175 MAT_GET_REORDERING=26, 176 MAT_LUFACTOR_SYMBOLIC=27, 177 MAT_LUFACTOR_NUMERIC=28, 178 MAT_CHOLESKY_FACTOR_SYMBOLIC=29, 179 MAT_CHOLESKY_FACTOR_NUMERIC=30, 180 MAT_GET_SIZE=31, 181 MAT_GET_LOCAL_SIZE=32, 182 MAT_GET_OWNERSHIP_RANGE=33, 183 MAT_ILUFACTOR_SYMBOLIC=34, 184 MAT_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=35, 185 MAT_GET_ARRAY=36, 186 MAT_RESTORE_ARRAY=37, 187 MAT_CONVERT=38, 188 MAT_GET_SUBMATRIX=39, 189 MAT_GET_SUBMATRIX_INPLACE=40, 190 MAT_CONVERT_SAME_TYPE=41, 191 MAT_FORWARD_SOLVE=42, 192 MAT_BACKWARD_SOLVE=43, 193 MAT_ILUFACTOR=44, 194 MAT_INCOMPLETECHOLESKYFACTOR=45, 195 MAT_AXPY=46, 196 MAT_GET_SUBMATRICES=47, 197 MAT_INCREASE_OVERLAP=48, 198 MAT_GET_VALUES=49, 199 MAT_COPY=50, 200 MAT_PRINT_HELP=51, 201 MAT_SCALE=52, 202 MAT_SHIFT=53, 203 MAT_DIAGONAL_SHIFT=54, 204 MAT_DESTROY=250, 205 MAT_VIEW=251 206 } MatOperation; 207 extern int MatHasOperation(Mat,MatOperation,PetscTruth*); 208 extern int MatShellSetOperation(Mat,MatOperation,void *); 209 210 /* 211 Codes for matrices stored on disk. By default they are 212 stored in a universal format. By changing the format with 213 ViewerSetFormat(viewer,BINARY_FORMAT_NATIVE); the matrices will 214 be stored in a way natural for the matrix, for example dense matrices 215 would be stored as dense. Matrices stored this way may only be 216 read into matrices of the same time. 217 */ 218 #define MATRIX_BINARY_FORMAT_DENSE -1 219 220 #endif 221 222 223 224