1 /* 2 Include file for the matrix component of PETSc 3 */ 4 #ifndef __PETSCMAT_H 5 #define __PETSCMAT_H 6 #include <petscvec.h> 7 8 /*S 9 Mat - Abstract PETSc matrix object used to manage all linear operators in PETSc, even those without 10 an explicit sparse representation (such as matrix-free operators) 11 12 Level: beginner 13 14 Concepts: matrix; linear operator 15 16 .seealso: MatCreate(), MatType, MatSetType(), MatDestroy() 17 S*/ 18 typedef struct _p_Mat* Mat; 19 20 /*J 21 MatType - String with the name of a PETSc matrix type 22 23 Level: beginner 24 25 .seealso: MatSetType(), Mat, MatSolverPackage, MatRegister() 26 J*/ 27 typedef const char* MatType; 28 #define MATSAME "same" 29 #define MATMAIJ "maij" 30 #define MATSEQMAIJ "seqmaij" 31 #define MATMPIMAIJ "mpimaij" 32 #define MATIS "is" 33 #define MATAIJ "aij" 34 #define MATSEQAIJ "seqaij" 35 #define MATMPIAIJ "mpiaij" 36 #define MATAIJCRL "aijcrl" 37 #define MATSEQAIJCRL "seqaijcrl" 38 #define MATMPIAIJCRL "mpiaijcrl" 39 #define MATAIJCUSP "aijcusp" 40 #define MATSEQAIJCUSP "seqaijcusp" 41 #define MATMPIAIJCUSP "mpiaijcusp" 42 #define MATAIJCUSPARSE "aijcusparse" 43 #define MATSEQAIJCUSPARSE "seqaijcusparse" 44 #define MATMPIAIJCUSPARSE "mpiaijcusparse" 45 #define MATAIJVIENNACL "aijviennacl" 46 #define MATSEQAIJVIENNACL "seqaijviennacl" 47 #define MATMPIAIJVIENNACL "mpiaijviennacl" 48 #define MATAIJPERM "aijperm" 49 #define MATSEQAIJPERM "seqaijperm" 50 #define MATMPIAIJPERM "mpiaijperm" 51 #define MATSHELL "shell" 52 #define MATDENSE "dense" 53 #define MATSEQDENSE "seqdense" 54 #define MATMPIDENSE "mpidense" 55 #define MATELEMENTAL "elemental" 56 #define MATBAIJ "baij" 57 #define MATSEQBAIJ "seqbaij" 58 #define MATMPIBAIJ "mpibaij" 59 #define MATMPIADJ "mpiadj" 60 #define MATSBAIJ "sbaij" 61 #define MATSEQSBAIJ "seqsbaij" 62 #define MATMPISBAIJ "mpisbaij" 63 #define MATDAAD "daad" 64 #define MATMFFD "mffd" 65 #define MATNORMAL "normal" 66 #define MATNORMALHERMITIAN "normalh" 67 #define MATLRC "lrc" 68 #define MATSCATTER "scatter" 69 #define MATBLOCKMAT "blockmat" 70 #define MATCOMPOSITE "composite" 71 #define MATFFT "fft" 72 #define MATFFTW "fftw" 73 #define MATSEQCUFFT "seqcufft" 74 #define MATTRANSPOSEMAT "transpose" 75 #define MATSCHURCOMPLEMENT "schurcomplement" 76 #define MATPYTHON "python" 77 #define MATHYPRE "hypre" 78 #define MATHYPRESTRUCT "hyprestruct" 79 #define MATHYPRESSTRUCT "hypresstruct" 80 #define MATSUBMATRIX "submatrix" 81 #define MATLOCALREF "localref" 82 #define MATNEST "nest" 83 #define MATPREALLOCATOR "preallocator" 84 85 /*J 86 MatSolverPackage - String with the name of a PETSc matrix solver type. 87 88 For example: "petsc" indicates what PETSc provides, "superlu_dist" the parallel SuperLU_DIST package etc 89 90 Level: beginner 91 92 .seealso: MatGetFactor(), Mat, MatSetType(), MatType 93 J*/ 94 #define MatSolverPackage char* 95 #define MATSOLVERSUPERLU "superlu" 96 #define MATSOLVERSUPERLU_DIST "superlu_dist" 97 #define MATSOLVERSTRUMPACK "strumpack" 98 #define MATSOLVERUMFPACK "umfpack" 99 #define MATSOLVERCHOLMOD "cholmod" 100 #define MATSOLVERKLU "klu" 101 #define MATSOLVERCLIQUE "clique" 102 #define MATSOLVERELEMENTAL "elemental" 103 #define MATSOLVERESSL "essl" 104 #define MATSOLVERLUSOL "lusol" 105 #define MATSOLVERMUMPS "mumps" 106 #define MATSOLVERMKL_PARDISO "mkl_pardiso" 107 #define MATSOLVERMKL_CPARDISO "mkl_cpardiso" 108 #define MATSOLVERPASTIX "pastix" 109 #define MATSOLVERMATLAB "matlab" 110 #define MATSOLVERPETSC "petsc" 111 #define MATSOLVERBAS "bas" 112 #define MATSOLVERCUSPARSE "cusparse" 113 114 /*E 115 MatFactorType - indicates what type of factorization is requested 116 117 Level: beginner 118 119 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 120 121 .seealso: MatSolverPackage, MatGetFactor() 122 E*/ 123 typedef enum {MAT_FACTOR_NONE, MAT_FACTOR_LU, MAT_FACTOR_CHOLESKY, MAT_FACTOR_ILU, MAT_FACTOR_ICC,MAT_FACTOR_ILUDT} MatFactorType; 124 PETSC_EXTERN const char *const MatFactorTypes[]; 125 126 PETSC_EXTERN PetscErrorCode MatGetFactor(Mat,const MatSolverPackage,MatFactorType,Mat*); 127 PETSC_EXTERN PetscErrorCode MatGetFactorAvailable(Mat,const MatSolverPackage,MatFactorType,PetscBool *); 128 PETSC_EXTERN PetscErrorCode MatFactorGetSolverPackage(Mat,const MatSolverPackage*); 129 PETSC_EXTERN PetscErrorCode MatGetFactorType(Mat,MatFactorType*); 130 PETSC_EXTERN PetscErrorCode MatSolverPackageRegister(const MatSolverPackage,const MatType,MatFactorType,PetscErrorCode(*)(Mat,MatFactorType,Mat*)); 131 PETSC_EXTERN PetscErrorCode MatSolverPackageGet(const MatSolverPackage,const MatType,MatFactorType,PetscBool*,PetscBool*,PetscErrorCode (**)(Mat,MatFactorType,Mat*)); 132 133 /* Logging support */ 134 #define MAT_FILE_CLASSID 1211216 /* used to indicate matrices in binary files */ 135 PETSC_EXTERN PetscClassId MAT_CLASSID; 136 PETSC_EXTERN PetscClassId MAT_COLORING_CLASSID; 137 PETSC_EXTERN PetscClassId MAT_FDCOLORING_CLASSID; 138 PETSC_EXTERN PetscClassId MAT_TRANSPOSECOLORING_CLASSID; 139 PETSC_EXTERN PetscClassId MAT_PARTITIONING_CLASSID; 140 PETSC_EXTERN PetscClassId MAT_COARSEN_CLASSID; 141 PETSC_EXTERN PetscClassId MAT_NULLSPACE_CLASSID; 142 PETSC_EXTERN PetscClassId MATMFFD_CLASSID; 143 144 /*E 145 MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 146 or MatGetSubMatrix() are to be reused to store the new matrix values. For MatConvert() is used to indicate 147 that the input matrix is to be replaced with the converted matrix. 148 149 Level: beginner 150 151 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 152 153 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices(), MatConvert() 154 E*/ 155 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX,MAT_IGNORE_MATRIX,MAT_INPLACE_MATRIX} MatReuse; 156 157 /*E 158 MatGetSubMatrixOption - Indicates if matrices obtained from a call to MatGetSubMatrices() 159 include the matrix values. Currently it is only used by MatGetSeqNonzerostructure(). 160 161 Level: beginner 162 163 .seealso: MatGetSeqNonzerostructure() 164 E*/ 165 typedef enum {MAT_DO_NOT_GET_VALUES,MAT_GET_VALUES} MatGetSubMatrixOption; 166 167 PETSC_EXTERN PetscErrorCode MatInitializePackage(void); 168 169 PETSC_EXTERN PetscErrorCode MatCreate(MPI_Comm,Mat*); 170 PETSC_EXTERN PetscErrorCode MatSetSizes(Mat,PetscInt,PetscInt,PetscInt,PetscInt); 171 PETSC_EXTERN PetscErrorCode MatSetType(Mat,MatType); 172 PETSC_EXTERN PetscErrorCode MatSetFromOptions(Mat); 173 PETSC_STATIC_INLINE PetscErrorCode MatViewFromOptions(Mat A,PetscObject obj,const char name[]) {return PetscObjectViewFromOptions((PetscObject)A,obj,name);} 174 PETSC_EXTERN PetscErrorCode MatRegister(const char[],PetscErrorCode(*)(Mat)); 175 PETSC_EXTERN PetscErrorCode MatRegisterBaseName(const char[],const char[],const char[]); 176 PETSC_EXTERN PetscErrorCode MatSetOptionsPrefix(Mat,const char[]); 177 PETSC_EXTERN PetscErrorCode MatAppendOptionsPrefix(Mat,const char[]); 178 PETSC_EXTERN PetscErrorCode MatGetOptionsPrefix(Mat,const char*[]); 179 PETSC_EXTERN PetscErrorCode MatSetErrorIfFailure(Mat,PetscBool); 180 181 PETSC_EXTERN PetscFunctionList MatList; 182 PETSC_EXTERN PetscFunctionList MatColoringList; 183 PETSC_EXTERN PetscFunctionList MatPartitioningList; 184 185 /*E 186 MatStructure - Indicates if two matrices have the same nonzero structure 187 188 Level: beginner 189 190 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 191 192 .seealso: MatCopy(), MatAXPY() 193 E*/ 194 typedef enum {DIFFERENT_NONZERO_PATTERN,SUBSET_NONZERO_PATTERN,SAME_NONZERO_PATTERN} MatStructure; 195 196 PETSC_EXTERN PetscErrorCode MatCreateSeqDense(MPI_Comm,PetscInt,PetscInt,PetscScalar[],Mat*); 197 PETSC_EXTERN PetscErrorCode MatCreateDense(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar[],Mat*); 198 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 199 PETSC_EXTERN PetscErrorCode MatCreateAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 200 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *); 201 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithSplitArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],PetscInt[],PetscInt[],PetscScalar[],Mat*); 202 203 PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 204 PETSC_EXTERN PetscErrorCode MatCreateBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 205 PETSC_EXTERN PetscErrorCode MatCreateMPIBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat*); 206 207 PETSC_EXTERN PetscErrorCode MatCreateMPIAdj(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscInt[],Mat*); 208 PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 209 210 PETSC_EXTERN PetscErrorCode MatCreateSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 211 PETSC_EXTERN PetscErrorCode MatCreateMPISBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *); 212 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]); 213 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]); 214 PETSC_EXTERN PetscErrorCode MatXAIJSetPreallocation(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscInt[],const PetscInt[]); 215 216 PETSC_EXTERN PetscErrorCode MatCreateShell(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,void *,Mat*); 217 PETSC_EXTERN PetscErrorCode MatCreateNormal(Mat,Mat*); 218 PETSC_EXTERN PetscErrorCode MatCreateNormalHermitian(Mat,Mat*); 219 PETSC_EXTERN PetscErrorCode MatCreateLRC(Mat,Mat,Vec,Mat,Mat*); 220 PETSC_EXTERN PetscErrorCode MatLRCGetMats(Mat,Mat*,Mat*,Vec*,Mat*); 221 PETSC_EXTERN PetscErrorCode MatCreateIS(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,ISLocalToGlobalMapping,ISLocalToGlobalMapping,Mat*); 222 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 223 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 224 225 PETSC_EXTERN PetscErrorCode MatCreateScatter(MPI_Comm,VecScatter,Mat*); 226 PETSC_EXTERN PetscErrorCode MatScatterSetVecScatter(Mat,VecScatter); 227 PETSC_EXTERN PetscErrorCode MatScatterGetVecScatter(Mat,VecScatter*); 228 PETSC_EXTERN PetscErrorCode MatCreateBlockMat(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt*,Mat*); 229 PETSC_EXTERN PetscErrorCode MatCompositeAddMat(Mat,Mat); 230 PETSC_EXTERN PetscErrorCode MatCompositeMerge(Mat); 231 PETSC_EXTERN PetscErrorCode MatCreateComposite(MPI_Comm,PetscInt,const Mat*,Mat*); 232 typedef enum {MAT_COMPOSITE_ADDITIVE,MAT_COMPOSITE_MULTIPLICATIVE} MatCompositeType; 233 PETSC_EXTERN PetscErrorCode MatCompositeSetType(Mat,MatCompositeType); 234 235 PETSC_EXTERN PetscErrorCode MatCreateFFT(MPI_Comm,PetscInt,const PetscInt[],MatType,Mat*); 236 PETSC_EXTERN PetscErrorCode MatCreateSeqCUFFT(MPI_Comm,PetscInt,const PetscInt[],Mat*); 237 238 PETSC_EXTERN PetscErrorCode MatCreateTranspose(Mat,Mat*); 239 PETSC_EXTERN PetscErrorCode MatTransposeGetMat(Mat,Mat*); 240 PETSC_EXTERN PetscErrorCode MatCreateHermitianTranspose(Mat,Mat*); 241 PETSC_EXTERN PetscErrorCode MatCreateSubMatrix(Mat,IS,IS,Mat*); 242 PETSC_EXTERN PetscErrorCode MatSubMatrixUpdate(Mat,Mat,IS,IS); 243 PETSC_EXTERN PetscErrorCode MatCreateLocalRef(Mat,IS,IS,Mat*); 244 245 #if defined(PETSC_HAVE_HYPRE) 246 PETSC_EXTERN PetscErrorCode MatHYPRESetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 247 #endif 248 249 PETSC_EXTERN PetscErrorCode MatPythonSetType(Mat,const char[]); 250 251 PETSC_EXTERN PetscErrorCode MatSetUp(Mat); 252 PETSC_EXTERN PetscErrorCode MatDestroy(Mat*); 253 PETSC_EXTERN PetscErrorCode MatGetNonzeroState(Mat,PetscObjectState*); 254 255 PETSC_EXTERN PetscErrorCode MatConjugate(Mat); 256 PETSC_EXTERN PetscErrorCode MatRealPart(Mat); 257 PETSC_EXTERN PetscErrorCode MatImaginaryPart(Mat); 258 PETSC_EXTERN PetscErrorCode MatGetDiagonalBlock(Mat,Mat*); 259 PETSC_EXTERN PetscErrorCode MatGetTrace(Mat,PetscScalar*); 260 PETSC_EXTERN PetscErrorCode MatInvertBlockDiagonal(Mat,const PetscScalar **); 261 262 /* ------------------------------------------------------------*/ 263 PETSC_EXTERN PetscErrorCode MatSetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 264 PETSC_EXTERN PetscErrorCode MatSetValuesBlocked(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 265 PETSC_EXTERN PetscErrorCode MatSetValuesRow(Mat,PetscInt,const PetscScalar[]); 266 PETSC_EXTERN PetscErrorCode MatSetValuesRowLocal(Mat,PetscInt,const PetscScalar[]); 267 PETSC_EXTERN PetscErrorCode MatSetValuesBatch(Mat,PetscInt,PetscInt,PetscInt[],const PetscScalar[]); 268 PETSC_EXTERN PetscErrorCode MatSetRandom(Mat,PetscRandom); 269 270 /*S 271 MatStencil - Data structure (C struct) for storing information about a single row or 272 column of a matrix as indexed on an associated grid. These are arguments to MatSetStencil() and MatSetBlockStencil() 273 274 The i,j, and k represent the logical coordinates over the entire grid (for 2 and 1 dimensional problems the k and j entries are ignored). 275 The c represents the the degrees of freedom at each grid point (the dof argument to DMDASetDOF()). If dof is 1 then this entry is ignored. 276 277 For stencil access to vectors see DMDAVecGetArray(), DMDAVecGetArrayF90(). 278 279 Fortran usage is different, see MatSetValuesStencil() for details. 280 281 Level: beginner 282 283 Concepts: matrix; linear operator 284 285 .seealso: MatSetValuesStencil(), MatSetStencil(), MatSetValuesBlockedStencil(), DMDAVecGetArray(), DMDAVecGetArrayF90() 286 S*/ 287 typedef struct { 288 PetscInt k,j,i,c; 289 } MatStencil; 290 291 PETSC_EXTERN PetscErrorCode MatSetValuesStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode); 292 PETSC_EXTERN PetscErrorCode MatSetValuesBlockedStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode); 293 PETSC_EXTERN PetscErrorCode MatSetStencil(Mat,PetscInt,const PetscInt[],const PetscInt[],PetscInt); 294 295 /*E 296 MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 297 to continue to add or insert values to it 298 299 Level: beginner 300 301 .seealso: MatAssemblyBegin(), MatAssemblyEnd() 302 E*/ 303 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 304 PETSC_EXTERN PetscErrorCode MatAssemblyBegin(Mat,MatAssemblyType); 305 PETSC_EXTERN PetscErrorCode MatAssemblyEnd(Mat,MatAssemblyType); 306 PETSC_EXTERN PetscErrorCode MatAssembled(Mat,PetscBool *); 307 308 309 310 /*E 311 MatOption - Options that may be set for a matrix and its behavior or storage 312 313 Level: beginner 314 315 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 316 317 Developer Notes: Entries that are negative need not be called collectively by all processes. 318 319 .seealso: MatSetOption() 320 E*/ 321 typedef enum {MAT_OPTION_MIN = -3, 322 MAT_UNUSED_NONZERO_LOCATION_ERR = -2, 323 MAT_ROW_ORIENTED = -1, 324 MAT_SYMMETRIC = 1, 325 MAT_STRUCTURALLY_SYMMETRIC = 2, 326 MAT_NEW_DIAGONALS = 3, 327 MAT_IGNORE_OFF_PROC_ENTRIES = 4, 328 MAT_USE_HASH_TABLE = 5, 329 MAT_KEEP_NONZERO_PATTERN = 6, 330 MAT_IGNORE_ZERO_ENTRIES = 7, 331 MAT_USE_INODES = 8, 332 MAT_HERMITIAN = 9, 333 MAT_SYMMETRY_ETERNAL = 10, 334 MAT_NEW_NONZERO_LOCATION_ERR = 11, 335 MAT_IGNORE_LOWER_TRIANGULAR = 12, 336 MAT_ERROR_LOWER_TRIANGULAR = 13, 337 MAT_GETROW_UPPERTRIANGULAR = 14, 338 MAT_SPD = 15, 339 MAT_NO_OFF_PROC_ZERO_ROWS = 16, 340 MAT_NO_OFF_PROC_ENTRIES = 17, 341 MAT_NEW_NONZERO_LOCATIONS = 18, 342 MAT_NEW_NONZERO_ALLOCATION_ERR = 19, 343 MAT_SUBSET_OFF_PROC_ENTRIES = 20, 344 MAT_OPTION_MAX = 21} MatOption; 345 346 PETSC_EXTERN const char *MatOptions[]; 347 PETSC_EXTERN PetscErrorCode MatSetOption(Mat,MatOption,PetscBool); 348 PETSC_EXTERN PetscErrorCode MatGetOption(Mat,MatOption,PetscBool*); 349 PETSC_EXTERN PetscErrorCode MatGetType(Mat,MatType*); 350 351 PETSC_EXTERN PetscErrorCode MatGetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscScalar[]); 352 PETSC_EXTERN PetscErrorCode MatGetRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]); 353 PETSC_EXTERN PetscErrorCode MatRestoreRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]); 354 PETSC_EXTERN PetscErrorCode MatGetRowUpperTriangular(Mat); 355 PETSC_EXTERN PetscErrorCode MatRestoreRowUpperTriangular(Mat); 356 PETSC_EXTERN PetscErrorCode MatGetColumnVector(Mat,Vec,PetscInt); 357 PETSC_EXTERN PetscErrorCode MatSeqAIJGetArray(Mat,PetscScalar *[]); 358 PETSC_EXTERN PetscErrorCode MatSeqAIJRestoreArray(Mat,PetscScalar *[]); 359 PETSC_EXTERN PetscErrorCode MatSeqAIJGetMaxRowNonzeros(Mat,PetscInt*); 360 PETSC_EXTERN PetscErrorCode MatSeqAIJSetValuesLocalFast(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 361 PETSC_EXTERN PetscErrorCode MatDenseGetArray(Mat,PetscScalar *[]); 362 PETSC_EXTERN PetscErrorCode MatDenseRestoreArray(Mat,PetscScalar *[]); 363 PETSC_EXTERN PetscErrorCode MatGetBlockSize(Mat,PetscInt *); 364 PETSC_EXTERN PetscErrorCode MatSetBlockSize(Mat,PetscInt); 365 PETSC_EXTERN PetscErrorCode MatGetBlockSizes(Mat,PetscInt *,PetscInt *); 366 PETSC_EXTERN PetscErrorCode MatSetBlockSizes(Mat,PetscInt,PetscInt); 367 PETSC_EXTERN PetscErrorCode MatSetBlockSizesFromMats(Mat,Mat,Mat); 368 369 PETSC_EXTERN PetscErrorCode MatMult(Mat,Vec,Vec); 370 PETSC_EXTERN PetscErrorCode MatMultDiagonalBlock(Mat,Vec,Vec); 371 PETSC_EXTERN PetscErrorCode MatMultAdd(Mat,Vec,Vec,Vec); 372 PETSC_EXTERN PetscErrorCode MatMultTranspose(Mat,Vec,Vec); 373 PETSC_EXTERN PetscErrorCode MatMultHermitianTranspose(Mat,Vec,Vec); 374 PETSC_EXTERN PetscErrorCode MatIsTranspose(Mat,Mat,PetscReal,PetscBool *); 375 PETSC_EXTERN PetscErrorCode MatIsHermitianTranspose(Mat,Mat,PetscReal,PetscBool *); 376 PETSC_EXTERN PetscErrorCode MatMultTransposeAdd(Mat,Vec,Vec,Vec); 377 PETSC_EXTERN PetscErrorCode MatMultHermitianTransposeAdd(Mat,Vec,Vec,Vec); 378 PETSC_EXTERN PetscErrorCode MatMultConstrained(Mat,Vec,Vec); 379 PETSC_EXTERN PetscErrorCode MatMultTransposeConstrained(Mat,Vec,Vec); 380 PETSC_EXTERN PetscErrorCode MatMatSolve(Mat,Mat,Mat); 381 PETSC_EXTERN PetscErrorCode MatResidual(Mat,Vec,Vec,Vec); 382 383 /*E 384 MatDuplicateOption - Indicates if a duplicated sparse matrix should have 385 its numerical values copied over or just its nonzero structure. 386 387 Level: beginner 388 389 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 390 391 $ MAT_SHARE_NONZERO_PATTERN - the i and j arrays in the new matrix will be shared with the original matrix 392 $ this also triggers the MAT_DO_NOT_COPY_VALUES option. This is used when you 393 $ have several matrices with the same nonzero pattern. 394 395 .seealso: MatDuplicate() 396 E*/ 397 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES,MAT_SHARE_NONZERO_PATTERN} MatDuplicateOption; 398 399 PETSC_EXTERN PetscErrorCode MatConvert(Mat,MatType,MatReuse,Mat*); 400 PETSC_EXTERN PetscErrorCode MatDuplicate(Mat,MatDuplicateOption,Mat*); 401 402 403 PETSC_EXTERN PetscErrorCode MatCopy(Mat,Mat,MatStructure); 404 PETSC_EXTERN PetscErrorCode MatView(Mat,PetscViewer); 405 PETSC_EXTERN PetscErrorCode MatIsSymmetric(Mat,PetscReal,PetscBool *); 406 PETSC_EXTERN PetscErrorCode MatIsStructurallySymmetric(Mat,PetscBool *); 407 PETSC_EXTERN PetscErrorCode MatIsHermitian(Mat,PetscReal,PetscBool *); 408 PETSC_EXTERN PetscErrorCode MatIsSymmetricKnown(Mat,PetscBool *,PetscBool *); 409 PETSC_EXTERN PetscErrorCode MatIsHermitianKnown(Mat,PetscBool *,PetscBool *); 410 PETSC_EXTERN PetscErrorCode MatMissingDiagonal(Mat,PetscBool *,PetscInt *); 411 PETSC_EXTERN PetscErrorCode MatLoad(Mat, PetscViewer); 412 413 PETSC_EXTERN PetscErrorCode MatGetRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,const PetscInt *[],const PetscInt *[],PetscBool *); 414 PETSC_EXTERN PetscErrorCode MatRestoreRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,const PetscInt *[],const PetscInt *[],PetscBool *); 415 PETSC_EXTERN PetscErrorCode MatGetColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,const PetscInt *[],const PetscInt *[],PetscBool *); 416 PETSC_EXTERN PetscErrorCode MatRestoreColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,const PetscInt *[],const PetscInt *[],PetscBool *); 417 418 /*S 419 MatInfo - Context of matrix information, used with MatGetInfo() 420 421 In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 422 423 Level: intermediate 424 425 Concepts: matrix^nonzero information 426 427 .seealso: MatGetInfo(), MatInfoType 428 S*/ 429 typedef struct { 430 PetscLogDouble block_size; /* block size */ 431 PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 432 PetscLogDouble memory; /* memory allocated */ 433 PetscLogDouble assemblies; /* number of matrix assemblies called */ 434 PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 435 PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 436 PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 437 } MatInfo; 438 439 /*E 440 MatInfoType - Indicates if you want information about the local part of the matrix, 441 the entire parallel matrix or the maximum over all the local parts. 442 443 Level: beginner 444 445 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 446 447 .seealso: MatGetInfo(), MatInfo 448 E*/ 449 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 450 PETSC_EXTERN PetscErrorCode MatGetInfo(Mat,MatInfoType,MatInfo*); 451 PETSC_EXTERN PetscErrorCode MatGetDiagonal(Mat,Vec); 452 PETSC_EXTERN PetscErrorCode MatGetRowMax(Mat,Vec,PetscInt[]); 453 PETSC_EXTERN PetscErrorCode MatGetRowMin(Mat,Vec,PetscInt[]); 454 PETSC_EXTERN PetscErrorCode MatGetRowMaxAbs(Mat,Vec,PetscInt[]); 455 PETSC_EXTERN PetscErrorCode MatGetRowMinAbs(Mat,Vec,PetscInt[]); 456 PETSC_EXTERN PetscErrorCode MatGetRowSum(Mat,Vec); 457 PETSC_EXTERN PetscErrorCode MatTranspose(Mat,MatReuse,Mat*); 458 PETSC_EXTERN PetscErrorCode MatHermitianTranspose(Mat,MatReuse,Mat*); 459 PETSC_EXTERN PetscErrorCode MatPermute(Mat,IS,IS,Mat*); 460 PETSC_EXTERN PetscErrorCode MatDiagonalScale(Mat,Vec,Vec); 461 PETSC_EXTERN PetscErrorCode MatDiagonalSet(Mat,Vec,InsertMode); 462 463 PETSC_EXTERN PetscErrorCode MatEqual(Mat,Mat,PetscBool*); 464 PETSC_EXTERN PetscErrorCode MatMultEqual(Mat,Mat,PetscInt,PetscBool*); 465 PETSC_EXTERN PetscErrorCode MatMultAddEqual(Mat,Mat,PetscInt,PetscBool*); 466 PETSC_EXTERN PetscErrorCode MatMultTransposeEqual(Mat,Mat,PetscInt,PetscBool*); 467 PETSC_EXTERN PetscErrorCode MatMultTransposeAddEqual(Mat,Mat,PetscInt,PetscBool*); 468 PETSC_EXTERN PetscErrorCode MatMatMultEqual(Mat,Mat,Mat,PetscInt,PetscBool*); 469 PETSC_EXTERN PetscErrorCode MatTransposeMatMultEqual(Mat,Mat,Mat,PetscInt,PetscBool*); 470 471 PETSC_EXTERN PetscErrorCode MatNorm(Mat,NormType,PetscReal*); 472 PETSC_EXTERN PetscErrorCode MatGetColumnNorms(Mat,NormType,PetscReal*); 473 PETSC_EXTERN PetscErrorCode MatZeroEntries(Mat); 474 PETSC_EXTERN PetscErrorCode MatZeroRows(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 475 PETSC_EXTERN PetscErrorCode MatZeroRowsIS(Mat,IS,PetscScalar,Vec,Vec); 476 PETSC_EXTERN PetscErrorCode MatZeroRowsStencil(Mat,PetscInt,const MatStencil [],PetscScalar,Vec,Vec); 477 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsStencil(Mat,PetscInt,const MatStencil[],PetscScalar,Vec,Vec); 478 PETSC_EXTERN PetscErrorCode MatZeroRowsColumns(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 479 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsIS(Mat,IS,PetscScalar,Vec,Vec); 480 481 PETSC_EXTERN PetscErrorCode MatGetSize(Mat,PetscInt*,PetscInt*); 482 PETSC_EXTERN PetscErrorCode MatGetLocalSize(Mat,PetscInt*,PetscInt*); 483 PETSC_EXTERN PetscErrorCode MatGetOwnershipRange(Mat,PetscInt*,PetscInt*); 484 PETSC_EXTERN PetscErrorCode MatGetOwnershipRanges(Mat,const PetscInt**); 485 PETSC_EXTERN PetscErrorCode MatGetOwnershipRangeColumn(Mat,PetscInt*,PetscInt*); 486 PETSC_EXTERN PetscErrorCode MatGetOwnershipRangesColumn(Mat,const PetscInt**); 487 PETSC_EXTERN PetscErrorCode MatGetOwnershipIS(Mat,IS*,IS*); 488 489 PETSC_EXTERN PetscErrorCode MatGetSubMatrices(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]); 490 PETSC_EXTERN PetscErrorCode MatGetSubMatricesMPI(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]); 491 PETSC_EXTERN PetscErrorCode MatDestroyMatrices(PetscInt,Mat *[]); 492 PETSC_EXTERN PetscErrorCode MatGetSubMatrix(Mat,IS,IS,MatReuse,Mat *); 493 PETSC_EXTERN PetscErrorCode MatGetLocalSubMatrix(Mat,IS,IS,Mat*); 494 PETSC_EXTERN PetscErrorCode MatRestoreLocalSubMatrix(Mat,IS,IS,Mat*); 495 PETSC_EXTERN PetscErrorCode MatGetSeqNonzeroStructure(Mat,Mat*); 496 PETSC_EXTERN PetscErrorCode MatDestroySeqNonzeroStructure(Mat*); 497 498 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJ(MPI_Comm,Mat,PetscInt,PetscInt,MatReuse,Mat*); 499 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJSymbolic(MPI_Comm,Mat,PetscInt,PetscInt,Mat*); 500 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJNumeric(Mat,Mat); 501 PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMat(Mat,MatReuse,Mat*); 502 PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMatCondensed(Mat,MatReuse,IS*,IS*,Mat*); 503 PETSC_EXTERN PetscErrorCode MatGetBrowsOfAcols(Mat,Mat,MatReuse,IS*,IS*,Mat*); 504 PETSC_EXTERN PetscErrorCode MatGetGhosts(Mat, PetscInt *,const PetscInt *[]); 505 506 PETSC_EXTERN PetscErrorCode MatIncreaseOverlap(Mat,PetscInt,IS[],PetscInt); 507 PETSC_EXTERN PetscErrorCode MatIncreaseOverlapSplit(Mat mat,PetscInt n,IS is[],PetscInt ov); 508 PETSC_EXTERN PetscErrorCode MatMPIAIJSetUseScalableIncreaseOverlap(Mat,PetscBool); 509 510 PETSC_EXTERN PetscErrorCode MatMatMult(Mat,Mat,MatReuse,PetscReal,Mat*); 511 PETSC_EXTERN PetscErrorCode MatMatMultSymbolic(Mat,Mat,PetscReal,Mat*); 512 PETSC_EXTERN PetscErrorCode MatMatMultNumeric(Mat,Mat,Mat); 513 514 PETSC_EXTERN PetscErrorCode MatMatMatMult(Mat,Mat,Mat,MatReuse,PetscReal,Mat*); 515 516 PETSC_EXTERN PetscErrorCode MatPtAP(Mat,Mat,MatReuse,PetscReal,Mat*); 517 PETSC_EXTERN PetscErrorCode MatPtAPSymbolic(Mat,Mat,PetscReal,Mat*); 518 PETSC_EXTERN PetscErrorCode MatPtAPNumeric(Mat,Mat,Mat); 519 PETSC_EXTERN PetscErrorCode MatRARt(Mat,Mat,MatReuse,PetscReal,Mat*); 520 PETSC_EXTERN PetscErrorCode MatRARtSymbolic(Mat,Mat,PetscReal,Mat*); 521 PETSC_EXTERN PetscErrorCode MatRARtNumeric(Mat,Mat,Mat); 522 523 PETSC_EXTERN PetscErrorCode MatTransposeMatMult(Mat,Mat,MatReuse,PetscReal,Mat*); 524 PETSC_EXTERN PetscErrorCode MatTransposetMatMultSymbolic(Mat,Mat,PetscReal,Mat*); 525 PETSC_EXTERN PetscErrorCode MatTransposetMatMultNumeric(Mat,Mat,Mat); 526 PETSC_EXTERN PetscErrorCode MatMatTransposeMult(Mat,Mat,MatReuse,PetscReal,Mat*); 527 PETSC_EXTERN PetscErrorCode MatMatTransposeMultSymbolic(Mat,Mat,PetscReal,Mat*); 528 PETSC_EXTERN PetscErrorCode MatMatTransposeMultNumeric(Mat,Mat,Mat); 529 530 PETSC_EXTERN PetscErrorCode MatAXPY(Mat,PetscScalar,Mat,MatStructure); 531 PETSC_EXTERN PetscErrorCode MatAYPX(Mat,PetscScalar,Mat,MatStructure); 532 533 PETSC_EXTERN PetscErrorCode MatScale(Mat,PetscScalar); 534 PETSC_EXTERN PetscErrorCode MatShift(Mat,PetscScalar); 535 536 PETSC_EXTERN PetscErrorCode MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping,ISLocalToGlobalMapping); 537 PETSC_EXTERN PetscErrorCode MatGetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping*,ISLocalToGlobalMapping*); 538 PETSC_EXTERN PetscErrorCode MatGetLayouts(Mat,PetscLayout*,PetscLayout*); 539 PETSC_EXTERN PetscErrorCode MatZeroRowsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 540 PETSC_EXTERN PetscErrorCode MatZeroRowsLocalIS(Mat,IS,PetscScalar,Vec,Vec); 541 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 542 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocalIS(Mat,IS,PetscScalar,Vec,Vec); 543 PETSC_EXTERN PetscErrorCode MatSetValuesLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 544 PETSC_EXTERN PetscErrorCode MatSetValuesBlockedLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 545 546 PETSC_EXTERN PetscErrorCode MatStashSetInitialSize(Mat,PetscInt,PetscInt); 547 PETSC_EXTERN PetscErrorCode MatStashGetInfo(Mat,PetscInt*,PetscInt*,PetscInt*,PetscInt*); 548 549 PETSC_EXTERN PetscErrorCode MatInterpolate(Mat,Vec,Vec); 550 PETSC_EXTERN PetscErrorCode MatInterpolateAdd(Mat,Vec,Vec,Vec); 551 PETSC_EXTERN PetscErrorCode MatRestrict(Mat,Vec,Vec); 552 PETSC_EXTERN PetscErrorCode MatCreateVecs(Mat,Vec*,Vec*); 553 PETSC_DEPRECATED("Use MatCreateVecs()") PETSC_STATIC_INLINE PetscErrorCode MatGetVecs(Mat mat,Vec *x,Vec *y) {return MatCreateVecs(mat,x,y);} 554 PETSC_EXTERN PetscErrorCode MatCreateRedundantMatrix(Mat,PetscInt,MPI_Comm,MatReuse,Mat*); 555 PETSC_EXTERN PetscErrorCode MatGetMultiProcBlock(Mat,MPI_Comm,MatReuse,Mat*); 556 PETSC_EXTERN PetscErrorCode MatFindZeroDiagonals(Mat,IS*); 557 PETSC_EXTERN PetscErrorCode MatFindOffBlockDiagonalEntries(Mat,IS*); 558 PETSC_EXTERN PetscErrorCode MatCreateMPIMatConcatenateSeqMat(MPI_Comm,Mat,PetscInt,MatReuse,Mat*); 559 560 /*MC 561 MatSetValue - Set a single entry into a matrix. 562 563 Not collective 564 565 Synopsis: 566 #include <petscmat.h> 567 PetscErrorCode MatSetValue(Mat m,PetscInt row,PetscInt col,PetscScalar value,InsertMode mode) 568 569 Input Parameters: 570 + m - the matrix 571 . row - the row location of the entry 572 . col - the column location of the entry 573 . value - the value to insert 574 - mode - either INSERT_VALUES or ADD_VALUES 575 576 Notes: 577 For efficiency one should use MatSetValues() and set several or many 578 values simultaneously if possible. 579 580 Level: beginner 581 582 .seealso: MatSetValues(), MatSetValueLocal() 583 M*/ 584 PETSC_STATIC_INLINE PetscErrorCode MatSetValue(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValues(v,1,&i,1,&j,&va,mode);} 585 586 PETSC_STATIC_INLINE PetscErrorCode MatGetValue(Mat v,PetscInt i,PetscInt j,PetscScalar *va) {return MatGetValues(v,1,&i,1,&j,va);} 587 588 PETSC_STATIC_INLINE PetscErrorCode MatSetValueLocal(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValuesLocal(v,1,&i,1,&j,&va,mode);} 589 590 /*MC 591 MatPreallocateInitialize - Begins the block of code that will count the number of nonzeros per 592 row in a matrix providing the data that one can use to correctly preallocate the matrix. 593 594 Synopsis: 595 #include <petscmat.h> 596 PetscErrorCode MatPreallocateInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz) 597 598 Collective on MPI_Comm 599 600 Input Parameters: 601 + comm - the communicator that will share the eventually allocated matrix 602 . nrows - the number of LOCAL rows in the matrix 603 - ncols - the number of LOCAL columns in the matrix 604 605 Output Parameters: 606 + dnz - the array that will be passed to the matrix preallocation routines 607 - ozn - the other array passed to the matrix preallocation routines 608 609 Level: intermediate 610 611 Notes: 612 See Users-Manual: ch_performance for more details. 613 614 Do not malloc or free dnz and onz, that is handled internally by these routines 615 616 Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices) 617 618 This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize(). 619 620 Concepts: preallocation^Matrix 621 622 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateSetLocal(), 623 MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocalBlock() 624 M*/ 625 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 626 { \ 627 PetscErrorCode _4_ierr; PetscInt __nrows = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 628 _4_ierr = PetscCalloc2(__nrows,&dnz,__nrows,&onz);CHKERRQ(_4_ierr); \ 629 __start = 0; __end = __start; \ 630 _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 631 _4_ierr = MPI_Scan(&__nrows,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __nrows; 632 633 /*MC 634 MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be 635 inserted using a local number of the rows and columns 636 637 Synopsis: 638 #include <petscmat.h> 639 PetscErrorCode MatPreallocateSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 640 641 Not Collective 642 643 Input Parameters: 644 + map - the row mapping from local numbering to global numbering 645 . nrows - the number of rows indicated 646 . rows - the indices of the rows 647 . cmap - the column mapping from local to global numbering 648 . ncols - the number of columns in the matrix 649 . cols - the columns indicated 650 . dnz - the array that will be passed to the matrix preallocation routines 651 - ozn - the other array passed to the matrix preallocation routines 652 653 Level: intermediate 654 655 Notes: 656 See Users-Manual: ch_performance for more details. 657 658 Do not malloc or free dnz and onz, that is handled internally by these routines 659 660 Concepts: preallocation^Matrix 661 662 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateInitialize(), 663 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocalBlock() 664 M*/ 665 #define MatPreallocateSetLocal(rmap,nrows,rows,cmap,ncols,cols,dnz,onz) 0; \ 666 {\ 667 PetscInt __l;\ 668 _4_ierr = ISLocalToGlobalMappingApply(rmap,nrows,rows,rows);CHKERRQ(_4_ierr);\ 669 _4_ierr = ISLocalToGlobalMappingApply(cmap,ncols,cols,cols);CHKERRQ(_4_ierr);\ 670 for (__l=0;__l<nrows;__l++) {\ 671 _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 672 }\ 673 } 674 675 /*MC 676 MatPreallocateSetLocalBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be 677 inserted using a local number of the rows and columns 678 679 Synopsis: 680 #include <petscmat.h> 681 PetscErrorCode MatPreallocateSetLocalBlock(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 682 683 Not Collective 684 685 Input Parameters: 686 + map - the row mapping from local numbering to global numbering 687 . nrows - the number of rows indicated 688 . rows - the indices of the rows 689 . cmap - the column mapping from local to global numbering 690 . ncols - the number of columns in the matrix 691 . cols - the columns indicated 692 . dnz - the array that will be passed to the matrix preallocation routines 693 - ozn - the other array passed to the matrix preallocation routines 694 695 Level: intermediate 696 697 Notes: 698 See Users-Manual: ch_performance for more details. 699 700 Do not malloc or free dnz and onz, that is handled internally by these routines 701 702 Concepts: preallocation^Matrix 703 704 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateInitialize(), 705 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocalBlock() 706 M*/ 707 #define MatPreallocateSetLocalBlock(rmap,nrows,rows,cmap,ncols,cols,dnz,onz) 0; \ 708 {\ 709 PetscInt __l;\ 710 _4_ierr = ISLocalToGlobalMappingApplyBlock(rmap,nrows,rows,rows);CHKERRQ(_4_ierr);\ 711 _4_ierr = ISLocalToGlobalMappingApplyBlock(cmap,ncols,cols,cols);CHKERRQ(_4_ierr);\ 712 for (__l=0;__l<nrows;__l++) {\ 713 _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 714 }\ 715 } 716 717 /*MC 718 MatPreallocateSymmetricSetLocalBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be 719 inserted using a local number of the rows and columns 720 721 Synopsis: 722 #include <petscmat.h> 723 PetscErrorCode MatPreallocateSymmetricSetLocalBlock(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 724 725 Not Collective 726 727 Input Parameters: 728 + map - the mapping between local numbering and global numbering 729 . nrows - the number of rows indicated 730 . rows - the indices of the rows 731 . ncols - the number of columns in the matrix 732 . cols - the columns indicated 733 . dnz - the array that will be passed to the matrix preallocation routines 734 - ozn - the other array passed to the matrix preallocation routines 735 736 Level: intermediate 737 738 Notes: 739 See Users-Manual: ch_performance for more details. 740 741 Do not malloc or free dnz and onz that is handled internally by these routines 742 743 Concepts: preallocation^Matrix 744 745 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateInitialize(), 746 MatPreallocateInitialize(), MatPreallocateSetLocal() 747 M*/ 748 #define MatPreallocateSymmetricSetLocalBlock(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 749 {\ 750 PetscInt __l;\ 751 _4_ierr = ISLocalToGlobalMappingApplyBlock(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 752 _4_ierr = ISLocalToGlobalMappingApplyBlock(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 753 for (__l=0;__l<nrows;__l++) {\ 754 _4_ierr = MatPreallocateSymmetricSetBlock((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 755 }\ 756 } 757 /*MC 758 MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be 759 inserted using a local number of the rows and columns 760 761 Synopsis: 762 #include <petscmat.h> 763 PetscErrorCode MatPreallocateSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 764 765 Not Collective 766 767 Input Parameters: 768 + row - the row 769 . ncols - the number of columns in the matrix 770 - cols - the columns indicated 771 772 Output Parameters: 773 + dnz - the array that will be passed to the matrix preallocation routines 774 - ozn - the other array passed to the matrix preallocation routines 775 776 Level: intermediate 777 778 Notes: 779 See Users-Manual: ch_performance for more details. 780 781 Do not malloc or free dnz and onz that is handled internally by these routines 782 783 This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize(). 784 785 Concepts: preallocation^Matrix 786 787 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateInitialize(), 788 MatPreallocateInitialize(), MatPreallocateSetLocal() 789 M*/ 790 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 791 { PetscInt __i; \ 792 if (row < __rstart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D less than first local row %D",row,__rstart);\ 793 if (row >= __rstart+__nrows) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Trying to set preallocation for row %D greater than last local row %D",row,__rstart+__nrows-1);\ 794 for (__i=0; __i<nc; __i++) {\ 795 if ((cols)[__i] < __start || (cols)[__i] >= __end) onz[row - __rstart]++; \ 796 else dnz[row - __rstart]++;\ 797 }\ 798 } 799 800 /*MC 801 MatPreallocateSymmetricSetBlock - Indicates the locations (rows and columns) in the matrix where nonzeros will be 802 inserted using a local number of the rows and columns 803 804 Synopsis: 805 #include <petscmat.h> 806 PetscErrorCode MatPreallocateSymmetricSetBlock(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 807 808 Not Collective 809 810 Input Parameters: 811 + nrows - the number of rows indicated 812 . rows - the indices of the rows 813 . ncols - the number of columns in the matrix 814 . cols - the columns indicated 815 . dnz - the array that will be passed to the matrix preallocation routines 816 - ozn - the other array passed to the matrix preallocation routines 817 818 Level: intermediate 819 820 Notes: 821 See Users-Manual: ch_performance for more details. 822 823 Do not malloc or free dnz and onz that is handled internally by these routines 824 825 This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize(). 826 827 Concepts: preallocation^Matrix 828 829 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateInitialize(), 830 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocalBlock(), MatPreallocateSetLocal() 831 M*/ 832 #define MatPreallocateSymmetricSetBlock(row,nc,cols,dnz,onz) 0;\ 833 { PetscInt __i; \ 834 for (__i=0; __i<nc; __i++) {\ 835 if (cols[__i] >= __end) onz[row - __rstart]++; \ 836 else if (cols[__i] >= row) dnz[row - __rstart]++;\ 837 }\ 838 } 839 840 /*MC 841 MatPreallocateLocation - An alternative to MatPreallocationSet() that puts the nonzero locations into the matrix if it exists 842 843 Synopsis: 844 #include <petscmat.h> 845 PetscErrorCode MatPreallocateLocations(Mat A,PetscInt row,PetscInt ncols,PetscInt *cols,PetscInt *dnz,PetscInt *onz) 846 847 Not Collective 848 849 Input Parameters: 850 . A - matrix 851 . row - row where values exist (must be local to this process) 852 . ncols - number of columns 853 . cols - columns with nonzeros 854 . dnz - the array that will be passed to the matrix preallocation routines 855 - ozn - the other array passed to the matrix preallocation routines 856 857 Level: intermediate 858 859 Notes: 860 See Users-Manual: ch_performance for more details. 861 862 Do not malloc or free dnz and onz that is handled internally by these routines 863 864 This is a MACRO not a function because it uses a bunch of variables private to the MatPreallocation.... routines. 865 866 Concepts: preallocation^Matrix 867 868 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateSetLocal(), 869 MatPreallocateSymmetricSetLocalBlock() 870 M*/ 871 #define MatPreallocateLocation(A,row,ncols,cols,dnz,onz) 0;if (A) {ierr = MatSetValues(A,1,&row,ncols,cols,NULL,INSERT_VALUES);CHKERRQ(ierr);} else {ierr = MatPreallocateSet(row,ncols,cols,dnz,onz);CHKERRQ(ierr);} 872 873 874 /*MC 875 MatPreallocateFinalize - Ends the block of code that will count the number of nonzeros per 876 row in a matrix providing the data that one can use to correctly preallocate the matrix. 877 878 Synopsis: 879 #include <petscmat.h> 880 PetscErrorCode MatPreallocateFinalize(PetscInt *dnz, PetscInt *onz) 881 882 Collective on MPI_Comm 883 884 Input Parameters: 885 + dnz - the array that was be passed to the matrix preallocation routines 886 - ozn - the other array passed to the matrix preallocation routines 887 888 Level: intermediate 889 890 Notes: 891 See Users-Manual: ch_performance for more details. 892 893 Do not malloc or free dnz and onz that is handled internally by these routines 894 895 This is a MACRO not a function because it closes the { started in MatPreallocateInitialize(). 896 897 Concepts: preallocation^Matrix 898 899 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSetBlock(), MatPreallocateSetLocal(), 900 MatPreallocateSymmetricSetLocalBlock() 901 M*/ 902 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree2(dnz,onz);CHKERRQ(_4_ierr);} 903 904 /* Routines unique to particular data structures */ 905 PETSC_EXTERN PetscErrorCode MatShellGetContext(Mat,void *); 906 907 PETSC_EXTERN PetscErrorCode MatInodeAdjustForInodes(Mat,IS*,IS*); 908 PETSC_EXTERN PetscErrorCode MatInodeGetInodeSizes(Mat,PetscInt *,PetscInt *[],PetscInt *); 909 910 PETSC_EXTERN PetscErrorCode MatSeqAIJSetColumnIndices(Mat,PetscInt[]); 911 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetColumnIndices(Mat,PetscInt[]); 912 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*); 913 PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*); 914 PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*); 915 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJFromTriple(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*,PetscInt,PetscBool); 916 917 #define MAT_SKIP_ALLOCATION -4 918 919 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]); 920 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]); 921 PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocation(Mat,PetscInt,const PetscInt[]); 922 923 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 924 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 925 PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 926 PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocationCSR(Mat,const PetscInt [],const PetscInt [],const PetscScalar []); 927 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]); 928 PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocationCSR(Mat,const PetscInt[],const PetscInt[],const PetscScalar[]); 929 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]); 930 PETSC_EXTERN PetscErrorCode MatMPIAdjSetPreallocation(Mat,PetscInt[],PetscInt[],PetscInt[]); 931 PETSC_EXTERN PetscErrorCode MatMPIDenseSetPreallocation(Mat,PetscScalar[]); 932 PETSC_EXTERN PetscErrorCode MatSeqDenseSetPreallocation(Mat,PetscScalar[]); 933 PETSC_EXTERN PetscErrorCode MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,const PetscInt*[]); 934 PETSC_EXTERN PetscErrorCode MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,const PetscInt*[]); 935 PETSC_EXTERN PetscErrorCode MatMPIAdjCreateNonemptySubcommMat(Mat,Mat*); 936 937 PETSC_EXTERN PetscErrorCode MatISSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 938 PETSC_EXTERN PetscErrorCode MatSeqDenseSetLDA(Mat,PetscInt); 939 PETSC_EXTERN PetscErrorCode MatDenseGetLocalMatrix(Mat,Mat*); 940 941 PETSC_EXTERN PetscErrorCode MatStoreValues(Mat); 942 PETSC_EXTERN PetscErrorCode MatRetrieveValues(Mat); 943 944 PETSC_EXTERN PetscErrorCode MatDAADSetCtx(Mat,void*); 945 946 PETSC_EXTERN PetscErrorCode MatFindNonzeroRows(Mat,IS*); 947 /* 948 These routines are not usually accessed directly, rather solving is 949 done through the KSP and PC interfaces. 950 */ 951 952 /*J 953 MatOrderingType - String with the name of a PETSc matrix ordering 954 955 Level: beginner 956 957 .seealso: MatGetOrdering() 958 J*/ 959 typedef const char* MatOrderingType; 960 #define MATORDERINGNATURAL "natural" 961 #define MATORDERINGND "nd" 962 #define MATORDERING1WD "1wd" 963 #define MATORDERINGRCM "rcm" 964 #define MATORDERINGQMD "qmd" 965 #define MATORDERINGROWLENGTH "rowlength" 966 #define MATORDERINGWBM "wbm" 967 #define MATORDERINGSPECTRAL "spectral" 968 #define MATORDERINGAMD "amd" /* only works if UMFPACK is installed with PETSc */ 969 970 PETSC_EXTERN PetscErrorCode MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 971 PETSC_EXTERN PetscErrorCode MatGetOrderingList(PetscFunctionList*); 972 PETSC_EXTERN PetscErrorCode MatOrderingRegister(const char[],PetscErrorCode(*)(Mat,MatOrderingType,IS*,IS*)); 973 PETSC_EXTERN PetscFunctionList MatOrderingList; 974 975 PETSC_EXTERN PetscErrorCode MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 976 PETSC_EXTERN PetscErrorCode MatCreateLaplacian(Mat,PetscReal,PetscBool,Mat*); 977 978 /*S 979 MatFactorShiftType - Numeric Shift. 980 981 Level: beginner 982 983 S*/ 984 typedef enum {MAT_SHIFT_NONE,MAT_SHIFT_NONZERO,MAT_SHIFT_POSITIVE_DEFINITE,MAT_SHIFT_INBLOCKS} MatFactorShiftType; 985 PETSC_EXTERN const char *const MatFactorShiftTypes[]; 986 PETSC_EXTERN const char *const MatFactorShiftTypesDetail[]; 987 988 /*S 989 MatFactorError - indicates what type of error in matrix factor 990 991 Level: beginner 992 993 Developer Notes: Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 994 995 .seealso: MatGetFactor() 996 S*/ 997 typedef enum {MAT_FACTOR_NOERROR,MAT_FACTOR_STRUCT_ZEROPIVOT,MAT_FACTOR_NUMERIC_ZEROPIVOT,MAT_FACTOR_OUTMEMORY,MAT_FACTOR_OTHER} MatFactorError; 998 999 PETSC_EXTERN PetscErrorCode MatFactorGetError(Mat,MatFactorError*); 1000 PETSC_EXTERN PetscErrorCode MatFactorClearError(Mat); 1001 PETSC_EXTERN PetscErrorCode MatFactorGetErrorZeroPivot(Mat,PetscReal*,PetscInt*); 1002 1003 /*S 1004 MatFactorInfo - Data passed into the matrix factorization routines, and information about the resulting factorization 1005 1006 In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE, that is use 1007 $ MatFactorInfo info(MAT_FACTORINFO_SIZE) 1008 1009 Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC. 1010 1011 You can use MatFactorInfoInitialize() to set default values. 1012 1013 Level: developer 1014 1015 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor(), 1016 MatFactorInfoInitialize() 1017 1018 S*/ 1019 typedef struct { 1020 PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 1021 PetscReal usedt; 1022 PetscReal dt; /* drop tolerance */ 1023 PetscReal dtcol; /* tolerance for pivoting */ 1024 PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 1025 PetscReal fill; /* expected fill, nonzeros in factored matrix/nonzeros in original matrix */ 1026 PetscReal levels; /* ICC/ILU(levels) */ 1027 PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 1028 factorization may be faster if do not pivot */ 1029 PetscReal zeropivot; /* pivot is called zero if less than this */ 1030 PetscReal shifttype; /* type of shift added to matrix factor to prevent zero pivots */ 1031 PetscReal shiftamount; /* how large the shift is */ 1032 } MatFactorInfo; 1033 1034 PETSC_EXTERN PetscErrorCode MatFactorInfoInitialize(MatFactorInfo*); 1035 PETSC_EXTERN PetscErrorCode MatCholeskyFactor(Mat,IS,const MatFactorInfo*); 1036 PETSC_EXTERN PetscErrorCode MatCholeskyFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*); 1037 PETSC_EXTERN PetscErrorCode MatCholeskyFactorNumeric(Mat,Mat,const MatFactorInfo*); 1038 PETSC_EXTERN PetscErrorCode MatLUFactor(Mat,IS,IS,const MatFactorInfo*); 1039 PETSC_EXTERN PetscErrorCode MatILUFactor(Mat,IS,IS,const MatFactorInfo*); 1040 PETSC_EXTERN PetscErrorCode MatLUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*); 1041 PETSC_EXTERN PetscErrorCode MatILUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*); 1042 PETSC_EXTERN PetscErrorCode MatICCFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*); 1043 PETSC_EXTERN PetscErrorCode MatICCFactor(Mat,IS,const MatFactorInfo*); 1044 PETSC_EXTERN PetscErrorCode MatLUFactorNumeric(Mat,Mat,const MatFactorInfo*); 1045 PETSC_EXTERN PetscErrorCode MatGetInertia(Mat,PetscInt*,PetscInt*,PetscInt*); 1046 PETSC_EXTERN PetscErrorCode MatSolve(Mat,Vec,Vec); 1047 PETSC_EXTERN PetscErrorCode MatForwardSolve(Mat,Vec,Vec); 1048 PETSC_EXTERN PetscErrorCode MatBackwardSolve(Mat,Vec,Vec); 1049 PETSC_EXTERN PetscErrorCode MatSolveAdd(Mat,Vec,Vec,Vec); 1050 PETSC_EXTERN PetscErrorCode MatSolveTranspose(Mat,Vec,Vec); 1051 PETSC_EXTERN PetscErrorCode MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 1052 PETSC_EXTERN PetscErrorCode MatSolves(Mat,Vecs,Vecs); 1053 PETSC_EXTERN PetscErrorCode MatFactorSetSchurIS(Mat,IS); 1054 PETSC_EXTERN PetscErrorCode MatFactorGetSchurComplement(Mat,Mat*); 1055 PETSC_EXTERN PetscErrorCode MatFactorRestoreSchurComplement(Mat,Mat*); 1056 PETSC_EXTERN PetscErrorCode MatFactorInvertSchurComplement(Mat); 1057 PETSC_EXTERN PetscErrorCode MatFactorCreateSchurComplement(Mat,Mat*); 1058 PETSC_EXTERN PetscErrorCode MatFactorSolveSchurComplement(Mat,Vec,Vec); 1059 PETSC_EXTERN PetscErrorCode MatFactorSolveSchurComplementTranspose(Mat,Vec,Vec); 1060 PETSC_EXTERN PetscErrorCode MatSetUnfactored(Mat); 1061 1062 /*E 1063 MatSORType - What type of (S)SOR to perform 1064 1065 Level: beginner 1066 1067 May be bitwise ORd together 1068 1069 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 1070 1071 MatSORType may be bitwise ORd together, so do not change the numbers 1072 1073 .seealso: MatSOR() 1074 E*/ 1075 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 1076 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 1077 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 1078 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 1079 PETSC_EXTERN PetscErrorCode MatSOR(Mat,Vec,PetscReal,MatSORType,PetscReal,PetscInt,PetscInt,Vec); 1080 1081 /* 1082 These routines are for efficiently computing Jacobians via finite differences. 1083 */ 1084 1085 /*S 1086 MatColoring - Object for managing the coloring of matrices. 1087 1088 Level: beginner 1089 1090 Concepts: matrix, coloring 1091 1092 .seealso: MatFDColoringCreate() ISColoring MatFDColoring 1093 S*/ 1094 typedef struct _p_MatColoring* MatColoring; 1095 /*J 1096 MatColoringType - String with the name of a PETSc matrix coloring 1097 1098 Level: beginner 1099 1100 .seealso: MatColoringSetType(), MatColoring 1101 J*/ 1102 1103 typedef const char* MatColoringType; 1104 #define MATCOLORINGJP "jp" 1105 #define MATCOLORINGPOWER "power" 1106 #define MATCOLORINGNATURAL "natural" 1107 #define MATCOLORINGSL "sl" 1108 #define MATCOLORINGLF "lf" 1109 #define MATCOLORINGID "id" 1110 #define MATCOLORINGGREEDY "greedy" 1111 1112 /*E 1113 MatColoringWeightType - Type of weight scheme 1114 1115 Not Collective 1116 1117 + MAT_COLORING_RANDOM - Random weights 1118 . MAT_COLORING_LEXICAL - Lexical weighting based upon global numbering. 1119 - MAT_COLORING_LF - Last-first weighting. 1120 1121 Level: intermediate 1122 1123 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 1124 1125 .seealso: MatCUSPSetFormat(), MatCUSPFormatOperation 1126 E*/ 1127 typedef enum {MAT_COLORING_WEIGHT_RANDOM,MAT_COLORING_WEIGHT_LEXICAL,MAT_COLORING_WEIGHT_LF,MAT_COLORING_WEIGHT_SL} MatColoringWeightType; 1128 1129 PETSC_EXTERN PetscErrorCode MatColoringCreate(Mat,MatColoring*); 1130 PETSC_EXTERN PetscErrorCode MatColoringGetDegrees(Mat,PetscInt,PetscInt*); 1131 PETSC_EXTERN PetscErrorCode MatColoringDestroy(MatColoring*); 1132 PETSC_EXTERN PetscErrorCode MatColoringView(MatColoring,PetscViewer); 1133 PETSC_EXTERN PetscErrorCode MatColoringSetType(MatColoring,MatColoringType); 1134 PETSC_EXTERN PetscErrorCode MatColoringSetFromOptions(MatColoring); 1135 PETSC_EXTERN PetscErrorCode MatColoringSetDistance(MatColoring,PetscInt); 1136 PETSC_EXTERN PetscErrorCode MatColoringGetDistance(MatColoring,PetscInt*); 1137 PETSC_EXTERN PetscErrorCode MatColoringSetMaxColors(MatColoring,PetscInt); 1138 PETSC_EXTERN PetscErrorCode MatColoringGetMaxColors(MatColoring,PetscInt*); 1139 PETSC_EXTERN PetscErrorCode MatColoringApply(MatColoring,ISColoring*); 1140 PETSC_EXTERN PetscErrorCode MatColoringRegister(const char[],PetscErrorCode(*)(MatColoring)); 1141 PETSC_EXTERN PetscErrorCode MatColoringPatch(Mat,PetscInt,PetscInt,ISColoringValue[],ISColoring*); 1142 PETSC_EXTERN PetscErrorCode MatColoringSetWeightType(MatColoring,MatColoringWeightType); 1143 PETSC_EXTERN PetscErrorCode MatColoringSetWeights(MatColoring,PetscReal*,PetscInt*); 1144 PETSC_EXTERN PetscErrorCode MatColoringCreateWeights(MatColoring,PetscReal **,PetscInt **lperm); 1145 PETSC_EXTERN PetscErrorCode MatColoringTestValid(MatColoring,ISColoring); 1146 1147 /*S 1148 MatFDColoring - Object for computing a sparse Jacobian via finite differences 1149 and coloring 1150 1151 Level: beginner 1152 1153 Concepts: coloring, sparse Jacobian, finite differences 1154 1155 .seealso: MatFDColoringCreate() 1156 S*/ 1157 typedef struct _p_MatFDColoring* MatFDColoring; 1158 1159 PETSC_EXTERN PetscErrorCode MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 1160 PETSC_EXTERN PetscErrorCode MatFDColoringDestroy(MatFDColoring*); 1161 PETSC_EXTERN PetscErrorCode MatFDColoringView(MatFDColoring,PetscViewer); 1162 PETSC_EXTERN PetscErrorCode MatFDColoringSetFunction(MatFDColoring,PetscErrorCode (*)(void),void*); 1163 PETSC_EXTERN PetscErrorCode MatFDColoringGetFunction(MatFDColoring,PetscErrorCode (**)(void),void**); 1164 PETSC_EXTERN PetscErrorCode MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 1165 PETSC_EXTERN PetscErrorCode MatFDColoringSetFromOptions(MatFDColoring); 1166 PETSC_EXTERN PetscErrorCode MatFDColoringApply(Mat,MatFDColoring,Vec,void *); 1167 PETSC_EXTERN PetscErrorCode MatFDColoringSetF(MatFDColoring,Vec); 1168 PETSC_EXTERN PetscErrorCode MatFDColoringGetPerturbedColumns(MatFDColoring,PetscInt*,PetscInt*[]); 1169 PETSC_EXTERN PetscErrorCode MatFDColoringSetUp(Mat,ISColoring,MatFDColoring); 1170 PETSC_EXTERN PetscErrorCode MatFDColoringSetBlockSize(MatFDColoring,PetscInt,PetscInt); 1171 1172 1173 /*S 1174 MatTransposeColoring - Object for computing a sparse matrix product C=A*B^T via coloring 1175 1176 Level: beginner 1177 1178 Concepts: coloring, sparse matrix product 1179 1180 .seealso: MatTransposeColoringCreate() 1181 S*/ 1182 typedef struct _p_MatTransposeColoring* MatTransposeColoring; 1183 1184 PETSC_EXTERN PetscErrorCode MatTransposeColoringCreate(Mat,ISColoring,MatTransposeColoring *); 1185 PETSC_EXTERN PetscErrorCode MatTransColoringApplySpToDen(MatTransposeColoring,Mat,Mat); 1186 PETSC_EXTERN PetscErrorCode MatTransColoringApplyDenToSp(MatTransposeColoring,Mat,Mat); 1187 PETSC_EXTERN PetscErrorCode MatTransposeColoringDestroy(MatTransposeColoring*); 1188 1189 /* 1190 These routines are for partitioning matrices: currently used only 1191 for adjacency matrix, MatCreateMPIAdj(). 1192 */ 1193 1194 /*S 1195 MatPartitioning - Object for managing the partitioning of a matrix or graph 1196 1197 Level: beginner 1198 1199 Concepts: partitioning 1200 1201 .seealso: MatPartitioningCreate(), MatPartitioningType 1202 S*/ 1203 typedef struct _p_MatPartitioning* MatPartitioning; 1204 1205 /*J 1206 MatPartitioningType - String with the name of a PETSc matrix partitioning 1207 1208 Level: beginner 1209 dm 1210 .seealso: MatPartitioningCreate(), MatPartitioning 1211 J*/ 1212 typedef const char* MatPartitioningType; 1213 #define MATPARTITIONINGCURRENT "current" 1214 #define MATPARTITIONINGAVERAGE "average" 1215 #define MATPARTITIONINGSQUARE "square" 1216 #define MATPARTITIONINGPARMETIS "parmetis" 1217 #define MATPARTITIONINGCHACO "chaco" 1218 #define MATPARTITIONINGPARTY "party" 1219 #define MATPARTITIONINGPTSCOTCH "ptscotch" 1220 #define MATPARTITIONINGHIERARCH "hierarch" 1221 1222 1223 PETSC_EXTERN PetscErrorCode MatPartitioningCreate(MPI_Comm,MatPartitioning*); 1224 PETSC_EXTERN PetscErrorCode MatPartitioningSetType(MatPartitioning,MatPartitioningType); 1225 PETSC_EXTERN PetscErrorCode MatPartitioningSetNParts(MatPartitioning,PetscInt); 1226 PETSC_EXTERN PetscErrorCode MatPartitioningSetAdjacency(MatPartitioning,Mat); 1227 PETSC_EXTERN PetscErrorCode MatPartitioningSetVertexWeights(MatPartitioning,const PetscInt[]); 1228 PETSC_EXTERN PetscErrorCode MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []); 1229 PETSC_EXTERN PetscErrorCode MatPartitioningApply(MatPartitioning,IS*); 1230 PETSC_EXTERN PetscErrorCode MatPartitioningDestroy(MatPartitioning*); 1231 1232 PETSC_EXTERN PetscErrorCode MatPartitioningRegister(const char[],PetscErrorCode (*)(MatPartitioning)); 1233 1234 1235 1236 PETSC_EXTERN PetscErrorCode MatPartitioningView(MatPartitioning,PetscViewer); 1237 PETSC_EXTERN PetscErrorCode MatPartitioningSetFromOptions(MatPartitioning); 1238 PETSC_EXTERN PetscErrorCode MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 1239 1240 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisSetRepartition(MatPartitioning part); 1241 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 1242 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisGetEdgeCut(MatPartitioning, PetscInt *); 1243 1244 typedef enum { MP_CHACO_MULTILEVEL=1,MP_CHACO_SPECTRAL=2,MP_CHACO_LINEAR=4,MP_CHACO_RANDOM=5,MP_CHACO_SCATTERED=6 } MPChacoGlobalType; 1245 PETSC_EXTERN const char *const MPChacoGlobalTypes[]; 1246 typedef enum { MP_CHACO_KERNIGHAN=1,MP_CHACO_NONE=2 } MPChacoLocalType; 1247 PETSC_EXTERN const char *const MPChacoLocalTypes[]; 1248 typedef enum { MP_CHACO_LANCZOS=0,MP_CHACO_RQI=1 } MPChacoEigenType; 1249 PETSC_EXTERN const char *const MPChacoEigenTypes[]; 1250 1251 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetGlobal(MatPartitioning,MPChacoGlobalType); 1252 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetGlobal(MatPartitioning,MPChacoGlobalType*); 1253 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetLocal(MatPartitioning,MPChacoLocalType); 1254 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetLocal(MatPartitioning,MPChacoLocalType*); 1255 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetCoarseLevel(MatPartitioning,PetscReal); 1256 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenSolver(MatPartitioning,MPChacoEigenType); 1257 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenSolver(MatPartitioning,MPChacoEigenType*); 1258 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenTol(MatPartitioning,PetscReal); 1259 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenTol(MatPartitioning,PetscReal*); 1260 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenNumber(MatPartitioning,PetscInt); 1261 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenNumber(MatPartitioning,PetscInt*); 1262 1263 #define MP_PARTY_OPT "opt" 1264 #define MP_PARTY_LIN "lin" 1265 #define MP_PARTY_SCA "sca" 1266 #define MP_PARTY_RAN "ran" 1267 #define MP_PARTY_GBF "gbf" 1268 #define MP_PARTY_GCF "gcf" 1269 #define MP_PARTY_BUB "bub" 1270 #define MP_PARTY_DEF "def" 1271 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetGlobal(MatPartitioning,const char*); 1272 #define MP_PARTY_HELPFUL_SETS "hs" 1273 #define MP_PARTY_KERNIGHAN_LIN "kl" 1274 #define MP_PARTY_NONE "no" 1275 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetLocal(MatPartitioning,const char*); 1276 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetCoarseLevel(MatPartitioning,PetscReal); 1277 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetBipart(MatPartitioning,PetscBool); 1278 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetMatchOptimization(MatPartitioning,PetscBool); 1279 1280 typedef enum { MP_PTSCOTCH_QUALITY,MP_PTSCOTCH_SPEED,MP_PTSCOTCH_BALANCE,MP_PTSCOTCH_SAFETY,MP_PTSCOTCH_SCALABILITY } MPPTScotchStrategyType; 1281 PETSC_EXTERN const char *const MPPTScotchStrategyTypes[]; 1282 1283 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetImbalance(MatPartitioning,PetscReal); 1284 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetImbalance(MatPartitioning,PetscReal*); 1285 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetStrategy(MatPartitioning,MPPTScotchStrategyType); 1286 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetStrategy(MatPartitioning,MPPTScotchStrategyType*); 1287 1288 /* 1289 * hierarchical partitioning 1290 */ 1291 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalGetFineparts(MatPartitioning,IS*); 1292 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalGetCoarseparts(MatPartitioning,IS*); 1293 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalSetNcoarseparts(MatPartitioning,PetscInt); 1294 PETSC_EXTERN PetscErrorCode MatPartitioningHierarchicalSetNfineparts(MatPartitioning, PetscInt); 1295 1296 PETSC_EXTERN PetscErrorCode MatMeshToVertexGraph(Mat,PetscInt,Mat*); 1297 PETSC_EXTERN PetscErrorCode MatMeshToCellGraph(Mat,PetscInt,Mat*); 1298 1299 /* 1300 If you add entries here you must also add them to petsc/finclude/petscmat.h 1301 */ 1302 typedef enum { MATOP_SET_VALUES=0, 1303 MATOP_GET_ROW=1, 1304 MATOP_RESTORE_ROW=2, 1305 MATOP_MULT=3, 1306 MATOP_MULT_ADD=4, 1307 MATOP_MULT_TRANSPOSE=5, 1308 MATOP_MULT_TRANSPOSE_ADD=6, 1309 MATOP_SOLVE=7, 1310 MATOP_SOLVE_ADD=8, 1311 MATOP_SOLVE_TRANSPOSE=9, 1312 MATOP_SOLVE_TRANSPOSE_ADD=10, 1313 MATOP_LUFACTOR=11, 1314 MATOP_CHOLESKYFACTOR=12, 1315 MATOP_SOR=13, 1316 MATOP_TRANSPOSE=14, 1317 MATOP_GETINFO=15, 1318 MATOP_EQUAL=16, 1319 MATOP_GET_DIAGONAL=17, 1320 MATOP_DIAGONAL_SCALE=18, 1321 MATOP_NORM=19, 1322 MATOP_ASSEMBLY_BEGIN=20, 1323 MATOP_ASSEMBLY_END=21, 1324 MATOP_SET_OPTION=22, 1325 MATOP_ZERO_ENTRIES=23, 1326 MATOP_ZERO_ROWS=24, 1327 MATOP_LUFACTOR_SYMBOLIC=25, 1328 MATOP_LUFACTOR_NUMERIC=26, 1329 MATOP_CHOLESKY_FACTOR_SYMBOLIC=27, 1330 MATOP_CHOLESKY_FACTOR_NUMERIC=28, 1331 MATOP_SETUP_PREALLOCATION=29, 1332 MATOP_ILUFACTOR_SYMBOLIC=30, 1333 MATOP_ICCFACTOR_SYMBOLIC=31, 1334 MATOP_GET_DIAGONAL_BLOCK=32, 1335 /* MATOP_PLACEHOLDER_33=33, */ 1336 MATOP_DUPLICATE=34, 1337 MATOP_FORWARD_SOLVE=35, 1338 MATOP_BACKWARD_SOLVE=36, 1339 MATOP_ILUFACTOR=37, 1340 MATOP_ICCFACTOR=38, 1341 MATOP_AXPY=39, 1342 MATOP_GET_SUBMATRICES=40, 1343 MATOP_INCREASE_OVERLAP=41, 1344 MATOP_GET_VALUES=42, 1345 MATOP_COPY=43, 1346 MATOP_GET_ROW_MAX=44, 1347 MATOP_SCALE=45, 1348 MATOP_SHIFT=46, 1349 MATOP_DIAGONAL_SET=47, 1350 MATOP_ZERO_ROWS_COLUMNS=48, 1351 MATOP_SET_RANDOM=49, 1352 MATOP_GET_ROW_IJ=50, 1353 MATOP_RESTORE_ROW_IJ=51, 1354 MATOP_GET_COLUMN_IJ=52, 1355 MATOP_RESTORE_COLUMN_IJ=53, 1356 MATOP_FDCOLORING_CREATE=54, 1357 MATOP_COLORING_PATCH=55, 1358 MATOP_SET_UNFACTORED=56, 1359 MATOP_PERMUTE=57, 1360 MATOP_SET_VALUES_BLOCKED=58, 1361 MATOP_GET_SUBMATRIX=59, 1362 MATOP_DESTROY=60, 1363 MATOP_VIEW=61, 1364 MATOP_CONVERT_FROM=62, 1365 MATOP_MATMAT_MULT=63, 1366 MATOP_MATMAT_MULT_SYMBOLIC=64, 1367 MATOP_MATMAT_MULT_NUMERIC=65, 1368 MATOP_SET_LOCAL_TO_GLOBAL_MAP=66, 1369 MATOP_SET_VALUES_LOCAL=67, 1370 MATOP_ZERO_ROWS_LOCAL=68, 1371 MATOP_GET_ROW_MAX_ABS=69, 1372 MATOP_GET_ROW_MIN_ABS=70, 1373 MATOP_CONVERT=71, 1374 MATOP_SET_COLORING=72, 1375 /* MATOP_PLACEHOLDER_73=73, */ 1376 MATOP_SET_VALUES_ADIFOR=74, 1377 MATOP_FD_COLORING_APPLY=75, 1378 MATOP_SET_FROM_OPTIONS=76, 1379 MATOP_MULT_CONSTRAINED=77, 1380 MATOP_MULT_TRANSPOSE_CONSTRAIN=78, 1381 MATOP_FIND_ZERO_DIAGONALS=79, 1382 MATOP_MULT_MULTIPLE=80, 1383 MATOP_SOLVE_MULTIPLE=81, 1384 MATOP_GET_INERTIA=82, 1385 MATOP_LOAD=83, 1386 MATOP_IS_SYMMETRIC=84, 1387 MATOP_IS_HERMITIAN=85, 1388 MATOP_IS_STRUCTURALLY_SYMMETRIC=86, 1389 MATOP_SET_VALUES_BLOCKEDLOCAL=87, 1390 MATOP_GET_VECS=88, 1391 MATOP_MAT_MULT=89, 1392 MATOP_MAT_MULT_SYMBOLIC=90, 1393 MATOP_MAT_MULT_NUMERIC=91, 1394 MATOP_PTAP=92, 1395 MATOP_PTAP_SYMBOLIC=93, 1396 MATOP_PTAP_NUMERIC=94, 1397 MATOP_MAT_TRANSPOSE_MULT=95, 1398 MATOP_MAT_TRANSPOSE_MULT_SYMBO=96, 1399 MATOP_MAT_TRANSPOSE_MULT_NUMER=97, 1400 /* MATOP_PLACEHOLDER_98=98, */ 1401 /* MATOP_PLACEHOLDER_99=99, */ 1402 /* MATOP_PLACEHOLDER_100=100, */ 1403 /* MATOP_PLACEHOLDER_101=101, */ 1404 MATOP_CONJUGATE=102, 1405 /* MATOP_PLACEHOLDER_103=103, */ 1406 MATOP_SET_VALUES_ROW=104, 1407 MATOP_REAL_PART=105, 1408 MATOP_IMAGINARY_PART=106, 1409 MATOP_GET_ROW_UPPER_TRIANGULAR=107, 1410 MATOP_RESTORE_ROW_UPPER_TRIANG=108, 1411 MATOP_MAT_SOLVE=109, 1412 MATOP_GET_REDUNDANT_MATRIX=110, 1413 MATOP_GET_ROW_MIN=111, 1414 MATOP_GET_COLUMN_VECTOR=112, 1415 MATOP_MISSING_DIAGONAL=113, 1416 MATOP_GET_SEQ_NONZERO_STRUCTUR=114, 1417 MATOP_CREATE=115, 1418 MATOP_GET_GHOSTS=116, 1419 MATOP_GET_LOCAL_SUB_MATRIX=117, 1420 MATOP_RESTORE_LOCALSUB_MATRIX=118, 1421 MATOP_MULT_DIAGONAL_BLOCK=119, 1422 MATOP_HERMITIAN_TRANSPOSE=120, 1423 MATOP_MULT_HERMITIAN_TRANSPOSE=121, 1424 MATOP_MULT_HERMITIAN_TRANS_ADD=122, 1425 MATOP_GET_MULTI_PROC_BLOCK=123, 1426 MATOP_FIND_NONZERO_ROWS=124, 1427 MATOP_GET_COLUMN_NORMS=125, 1428 MATOP_INVERT_BLOCK_DIAGONAL=126, 1429 /* MATOP_PLACEHOLDER_127=127, */ 1430 MATOP_GET_SUB_MATRICES_PARALLE=128, 1431 MATOP_SET_VALUES_BATCH=129, 1432 MATOP_TRANSPOSE_MAT_MULT=130, 1433 MATOP_TRANSPOSE_MAT_MULT_SYMBO=131, 1434 MATOP_TRANSPOSE_MAT_MULT_NUMER=132, 1435 MATOP_TRANSPOSE_COLORING_CREAT=133, 1436 MATOP_TRANS_COLORING_APPLY_SPT=134, 1437 MATOP_TRANS_COLORING_APPLY_DEN=135, 1438 MATOP_RART=136, 1439 MATOP_RART_SYMBOLIC=137, 1440 MATOP_RART_NUMERIC=138, 1441 MATOP_SET_BLOCK_SIZES=139, 1442 MATOP_AYPX=140, 1443 MATOP_RESIDUAL=141, 1444 MATOP_FDCOLORING_SETUP=142, 1445 MATOP_MPICONCATENATESEQ=144 1446 } MatOperation; 1447 PETSC_EXTERN PetscErrorCode MatHasOperation(Mat,MatOperation,PetscBool *); 1448 PETSC_EXTERN PetscErrorCode MatShellSetOperation(Mat,MatOperation,void(*)(void)); 1449 PETSC_EXTERN PetscErrorCode MatShellGetOperation(Mat,MatOperation,void(**)(void)); 1450 PETSC_EXTERN PetscErrorCode MatShellSetContext(Mat,void*); 1451 1452 /* 1453 Codes for matrices stored on disk. By default they are 1454 stored in a universal format. By changing the format with 1455 PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE); the matrices will 1456 be stored in a way natural for the matrix, for example dense matrices 1457 would be stored as dense. Matrices stored this way may only be 1458 read into matrices of the same type. 1459 */ 1460 #define MATRIX_BINARY_FORMAT_DENSE -1 1461 1462 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 1463 PETSC_EXTERN PetscErrorCode MatISGetLocalMat(Mat,Mat*); 1464 PETSC_EXTERN PetscErrorCode MatISSetLocalMat(Mat,Mat); 1465 PETSC_EXTERN PetscErrorCode MatISGetMPIXAIJ(Mat,MatReuse,Mat*); 1466 1467 /*S 1468 MatNullSpace - Object that removes a null space from a vector, i.e. 1469 orthogonalizes the vector to a subsapce 1470 1471 Level: advanced 1472 1473 Concepts: matrix; linear operator, null space 1474 1475 Users manual sections: 1476 . sec_singular 1477 1478 .seealso: MatNullSpaceCreate() 1479 S*/ 1480 typedef struct _p_MatNullSpace* MatNullSpace; 1481 1482 PETSC_EXTERN PetscErrorCode MatNullSpaceCreate(MPI_Comm,PetscBool ,PetscInt,const Vec[],MatNullSpace*); 1483 PETSC_EXTERN PetscErrorCode MatNullSpaceSetFunction(MatNullSpace,PetscErrorCode (*)(MatNullSpace,Vec,void*),void*); 1484 PETSC_EXTERN PetscErrorCode MatNullSpaceDestroy(MatNullSpace*); 1485 PETSC_EXTERN PetscErrorCode MatNullSpaceRemove(MatNullSpace,Vec); 1486 PETSC_EXTERN PetscErrorCode MatGetNullSpace(Mat, MatNullSpace *); 1487 PETSC_EXTERN PetscErrorCode MatGetTransposeNullSpace(Mat, MatNullSpace *); 1488 PETSC_EXTERN PetscErrorCode MatSetTransposeNullSpace(Mat,MatNullSpace); 1489 PETSC_EXTERN PetscErrorCode MatSetNullSpace(Mat,MatNullSpace); 1490 PETSC_EXTERN PetscErrorCode MatSetNearNullSpace(Mat,MatNullSpace); 1491 PETSC_EXTERN PetscErrorCode MatGetNearNullSpace(Mat,MatNullSpace*); 1492 PETSC_EXTERN PetscErrorCode MatNullSpaceTest(MatNullSpace,Mat,PetscBool *); 1493 PETSC_EXTERN PetscErrorCode MatNullSpaceView(MatNullSpace,PetscViewer); 1494 PETSC_EXTERN PetscErrorCode MatNullSpaceGetVecs(MatNullSpace,PetscBool*,PetscInt*,const Vec**); 1495 PETSC_EXTERN PetscErrorCode MatNullSpaceCreateRigidBody(Vec,MatNullSpace*); 1496 1497 PETSC_EXTERN PetscErrorCode MatReorderingSeqSBAIJ(Mat,IS); 1498 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 1499 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetColumnIndices(Mat,PetscInt *); 1500 PETSC_EXTERN PetscErrorCode MatSeqBAIJInvertBlockDiagonal(Mat); 1501 1502 PETSC_EXTERN PetscErrorCode MatCreateMAIJ(Mat,PetscInt,Mat*); 1503 PETSC_EXTERN PetscErrorCode MatMAIJRedimension(Mat,PetscInt,Mat*); 1504 PETSC_EXTERN PetscErrorCode MatMAIJGetAIJ(Mat,Mat*); 1505 1506 PETSC_EXTERN PetscErrorCode MatComputeExplicitOperator(Mat,Mat*); 1507 1508 PETSC_EXTERN PetscErrorCode MatDiagonalScaleLocal(Mat,Vec); 1509 1510 PETSC_EXTERN PetscErrorCode MatCreateMFFD(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,Mat*); 1511 PETSC_EXTERN PetscErrorCode MatMFFDSetBase(Mat,Vec,Vec); 1512 PETSC_EXTERN PetscErrorCode MatMFFDSetFunction(Mat,PetscErrorCode(*)(void*,Vec,Vec),void*); 1513 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioni(Mat,PetscErrorCode (*)(void*,PetscInt,Vec,PetscScalar*)); 1514 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioniBase(Mat,PetscErrorCode (*)(void*,Vec)); 1515 PETSC_EXTERN PetscErrorCode MatMFFDSetHHistory(Mat,PetscScalar[],PetscInt); 1516 PETSC_EXTERN PetscErrorCode MatMFFDResetHHistory(Mat); 1517 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctionError(Mat,PetscReal); 1518 PETSC_EXTERN PetscErrorCode MatMFFDSetPeriod(Mat,PetscInt); 1519 PETSC_EXTERN PetscErrorCode MatMFFDGetH(Mat,PetscScalar *); 1520 PETSC_EXTERN PetscErrorCode MatMFFDSetOptionsPrefix(Mat,const char[]); 1521 PETSC_EXTERN PetscErrorCode MatMFFDCheckPositivity(void*,Vec,Vec,PetscScalar*); 1522 PETSC_EXTERN PetscErrorCode MatMFFDSetCheckh(Mat,PetscErrorCode (*)(void*,Vec,Vec,PetscScalar*),void*); 1523 1524 /*S 1525 MatMFFD - A data structured used to manage the computation of the h differencing parameter for matrix-free 1526 Jacobian vector products 1527 1528 Notes: MATMFFD is a specific MatType which uses the MatMFFD data structure 1529 1530 MatMFFD*() methods actually take the Mat as their first argument. Not a MatMFFD data structure 1531 1532 Level: developer 1533 1534 .seealso: MATMFFD, MatCreateMFFD(), MatMFFDSetFuction(), MatMFFDSetType(), MatMFFDRegister() 1535 S*/ 1536 typedef struct _p_MatMFFD* MatMFFD; 1537 1538 /*J 1539 MatMFFDType - algorithm used to compute the h used in computing matrix-vector products via differencing of the function 1540 1541 Level: beginner 1542 1543 .seealso: MatMFFDSetType(), MatMFFDRegister() 1544 J*/ 1545 typedef const char* MatMFFDType; 1546 #define MATMFFD_DS "ds" 1547 #define MATMFFD_WP "wp" 1548 1549 PETSC_EXTERN PetscErrorCode MatMFFDSetType(Mat,MatMFFDType); 1550 PETSC_EXTERN PetscErrorCode MatMFFDRegister(const char[],PetscErrorCode (*)(MatMFFD)); 1551 1552 PETSC_EXTERN PetscErrorCode MatMFFDDSSetUmin(Mat,PetscReal); 1553 PETSC_EXTERN PetscErrorCode MatMFFDWPSetComputeNormU(Mat,PetscBool ); 1554 1555 PETSC_EXTERN PetscErrorCode MatFDColoringSetType(MatFDColoring,MatMFFDType); 1556 1557 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutMatrix(PetscViewer, PetscInt, PetscInt, PetscReal *); 1558 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutCSRMatrix(PetscViewer, PetscInt, PetscInt, PetscInt *, PetscInt *, PetscReal *); 1559 1560 /* 1561 PETSc interface to MUMPS 1562 */ 1563 #ifdef PETSC_HAVE_MUMPS 1564 PETSC_EXTERN PetscErrorCode MatMumpsSetIcntl(Mat,PetscInt,PetscInt); 1565 PETSC_EXTERN PetscErrorCode MatMumpsGetIcntl(Mat,PetscInt,PetscInt*); 1566 PETSC_EXTERN PetscErrorCode MatMumpsSetCntl(Mat,PetscInt,PetscReal); 1567 PETSC_EXTERN PetscErrorCode MatMumpsGetCntl(Mat,PetscInt,PetscReal*); 1568 1569 PETSC_EXTERN PetscErrorCode MatMumpsGetInfo(Mat,PetscInt,PetscInt*); 1570 PETSC_EXTERN PetscErrorCode MatMumpsGetInfog(Mat,PetscInt,PetscInt*); 1571 PETSC_EXTERN PetscErrorCode MatMumpsGetRinfo(Mat,PetscInt,PetscReal*); 1572 PETSC_EXTERN PetscErrorCode MatMumpsGetRinfog(Mat,PetscInt,PetscReal*); 1573 #endif 1574 1575 /* 1576 PETSc interface to Mkl_Pardiso 1577 */ 1578 #ifdef PETSC_HAVE_MKL_PARDISO 1579 PETSC_EXTERN PetscErrorCode MatMkl_PardisoSetCntl(Mat,PetscInt,PetscInt); 1580 #endif 1581 1582 /* 1583 PETSc interface to Mkl_CPardiso 1584 */ 1585 #ifdef PETSC_HAVE_MKL_CPARDISO 1586 PETSC_EXTERN PetscErrorCode MatMkl_CPardisoSetCntl(Mat,PetscInt,PetscInt); 1587 #endif 1588 1589 /* 1590 PETSc interface to SUPERLU 1591 */ 1592 #ifdef PETSC_HAVE_SUPERLU 1593 PETSC_EXTERN PetscErrorCode MatSuperluSetILUDropTol(Mat,PetscReal); 1594 #endif 1595 1596 /* 1597 PETSc interface to SUPERLU_DIST 1598 */ 1599 #ifdef PETSC_HAVE_SUPERLU_DIST 1600 PETSC_EXTERN PetscErrorCode MatSuperluDistGetDiagU(Mat,PetscScalar*); 1601 #endif 1602 1603 /* 1604 PETSc interface to STRUMPACK 1605 */ 1606 #ifdef PETSC_HAVE_STRUMPACK 1607 PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSRelCompTol(Mat,PetscReal); 1608 PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetHSSMinSize(Mat,PetscInt); 1609 PETSC_EXTERN PetscErrorCode MatSTRUMPACKSetColPerm(Mat,PetscBool); 1610 #endif 1611 1612 1613 #ifdef PETSC_HAVE_CUDA 1614 /*E 1615 MatCUSPARSEStorageFormat - indicates the storage format for CUSPARSE (GPU) 1616 matrices. 1617 1618 Not Collective 1619 1620 + MAT_CUSPARSE_CSR - Compressed Sparse Row 1621 . MAT_CUSPARSE_ELL - Ellpack (requires CUDA 4.2 or later). 1622 - MAT_CUSPARSE_HYB - Hybrid, a combination of Ellpack and Coordinate format (requires CUDA 4.2 or later). 1623 1624 Level: intermediate 1625 1626 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 1627 1628 .seealso: MatCUSPARSESetFormat(), MatCUSPARSEFormatOperation 1629 E*/ 1630 1631 typedef enum {MAT_CUSPARSE_CSR, MAT_CUSPARSE_ELL, MAT_CUSPARSE_HYB} MatCUSPARSEStorageFormat; 1632 1633 /* these will be strings associated with enumerated type defined above */ 1634 PETSC_EXTERN const char *const MatCUSPARSEStorageFormats[]; 1635 1636 /*E 1637 MatCUSPARSEFormatOperation - indicates the operation of CUSPARSE (GPU) 1638 matrices whose operation should use a particular storage format. 1639 1640 Not Collective 1641 1642 + MAT_CUSPARSE_MULT_DIAG - sets the storage format for the diagonal matrix in the parallel MatMult 1643 . MAT_CUSPARSE_MULT_OFFDIAG - sets the storage format for the offdiagonal matrix in the parallel MatMult 1644 . MAT_CUSPARSE_MULT - sets the storage format for the entire matrix in the serial (single GPU) MatMult 1645 - MAT_CUSPARSE_ALL - sets the storage format for all CUSPARSE (GPU) matrices 1646 1647 Level: intermediate 1648 1649 .seealso: MatCUSPARSESetFormat(), MatCUSPARSEStorageFormat 1650 E*/ 1651 typedef enum {MAT_CUSPARSE_MULT_DIAG, MAT_CUSPARSE_MULT_OFFDIAG, MAT_CUSPARSE_MULT, MAT_CUSPARSE_ALL} MatCUSPARSEFormatOperation; 1652 1653 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCUSPARSE(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 1654 PETSC_EXTERN PetscErrorCode MatCreateAIJCUSPARSE(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 1655 PETSC_EXTERN PetscErrorCode MatCUSPARSESetFormat(Mat,MatCUSPARSEFormatOperation,MatCUSPARSEStorageFormat); 1656 #endif 1657 1658 #if defined(PETSC_HAVE_CUSP) 1659 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCUSP(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 1660 PETSC_EXTERN PetscErrorCode MatCreateAIJCUSP(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 1661 1662 /*E 1663 MatCUSPStorageFormat - indicates the storage format for CUSP (GPU) 1664 matrices. 1665 1666 Not Collective 1667 1668 + MAT_CUSP_CSR - Compressed Sparse Row 1669 . MAT_CUSP_DIA - Diagonal 1670 - MAT_CUSP_ELL - Ellpack 1671 1672 Level: intermediate 1673 1674 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 1675 1676 .seealso: MatCUSPSetFormat(), MatCUSPFormatOperation 1677 E*/ 1678 typedef enum {MAT_CUSP_CSR, MAT_CUSP_DIA, MAT_CUSP_ELL} MatCUSPStorageFormat; 1679 1680 /* these will be strings associated with enumerated type defined above */ 1681 PETSC_EXTERN const char *const MatCUSPStorageFormats[]; 1682 1683 /*E 1684 MatCUSPFormatOperation - indicates the operation of CUSP (GPU) 1685 matrices whose operation should use a particular storage format. 1686 1687 Not Collective 1688 1689 + MAT_CUSP_MULT_DIAG - sets the storage format for the diagonal matrix in the parallel MatMult 1690 . MAT_CUSP_MULT_OFFDIAG - sets the storage format for the offdiagonal matrix in the parallel MatMult 1691 . MAT_CUSP_MULT - sets the storage format for the entire matrix in the serial (single GPU) MatMult 1692 - MAT_CUSP_ALL - sets the storage format for all CUSP (GPU) matrices 1693 1694 Level: intermediate 1695 1696 Any additions/changes here MUST also be made in include/petsc/finclude/petscmat.h 1697 1698 .seealso: MatCUSPSetFormat(), MatCUSPStorageFormat 1699 E*/ 1700 typedef enum {MAT_CUSP_MULT_DIAG, MAT_CUSP_MULT_OFFDIAG, MAT_CUSP_MULT, MAT_CUSP_ALL} MatCUSPFormatOperation; 1701 1702 PETSC_EXTERN PetscErrorCode MatCUSPSetFormat(Mat,MatCUSPFormatOperation,MatCUSPStorageFormat); 1703 #endif 1704 1705 #if defined(PETSC_HAVE_VIENNACL) 1706 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJViennaCL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 1707 PETSC_EXTERN PetscErrorCode MatCreateAIJViennaCL(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 1708 #endif 1709 1710 /* 1711 PETSc interface to FFTW 1712 */ 1713 #if defined(PETSC_HAVE_FFTW) 1714 PETSC_EXTERN PetscErrorCode VecScatterPetscToFFTW(Mat,Vec,Vec); 1715 PETSC_EXTERN PetscErrorCode VecScatterFFTWToPetsc(Mat,Vec,Vec); 1716 PETSC_EXTERN PetscErrorCode MatCreateVecsFFTW(Mat,Vec*,Vec*,Vec*); 1717 #endif 1718 1719 PETSC_EXTERN PetscErrorCode MatCreateNest(MPI_Comm,PetscInt,const IS[],PetscInt,const IS[],const Mat[],Mat*); 1720 PETSC_EXTERN PetscErrorCode MatNestGetSize(Mat,PetscInt*,PetscInt*); 1721 PETSC_EXTERN PetscErrorCode MatNestGetISs(Mat,IS[],IS[]); 1722 PETSC_EXTERN PetscErrorCode MatNestGetLocalISs(Mat,IS[],IS[]); 1723 PETSC_EXTERN PetscErrorCode MatNestGetSubMats(Mat,PetscInt*,PetscInt*,Mat***); 1724 PETSC_EXTERN PetscErrorCode MatNestGetSubMat(Mat,PetscInt,PetscInt,Mat*); 1725 PETSC_EXTERN PetscErrorCode MatNestSetVecType(Mat,VecType); 1726 PETSC_EXTERN PetscErrorCode MatNestSetSubMats(Mat,PetscInt,const IS[],PetscInt,const IS[],const Mat[]); 1727 PETSC_EXTERN PetscErrorCode MatNestSetSubMat(Mat,PetscInt,PetscInt,Mat); 1728 1729 PETSC_EXTERN PetscErrorCode MatChop(Mat,PetscReal); 1730 PETSC_EXTERN PetscErrorCode MatComputeBandwidth(Mat,PetscReal,PetscInt*); 1731 1732 PETSC_EXTERN PetscErrorCode MatSubdomainsCreateCoalesce(Mat,PetscInt,PetscInt*,IS**); 1733 1734 PETSC_EXTERN PetscErrorCode MatPreallocatorPreallocate(Mat,PetscBool,Mat); 1735 1736 PETSC_INTERN PetscErrorCode MatHeaderMerge(Mat,Mat*); 1737 PETSC_EXTERN PetscErrorCode MatHeaderReplace(Mat,Mat*); 1738 1739 #endif 1740