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 10 11 Level: beginner 12 13 Concepts: matrix; linear operator 14 15 .seealso: MatCreate(), MatType, MatSetType() 16 S*/ 17 typedef struct _p_Mat* Mat; 18 19 /*J 20 MatType - String with the name of a PETSc matrix or the creation function 21 with an optional dynamic library name, for example 22 http://www.mcs.anl.gov/petsc/lib.a:mymatcreate() 23 24 Level: beginner 25 26 .seealso: MatSetType(), Mat, MatSolverPackage 27 J*/ 28 #define MatType char* 29 #define MATSAME "same" 30 #define MATMAIJ "maij" 31 #define MATSEQMAIJ "seqmaij" 32 #define MATMPIMAIJ "mpimaij" 33 #define MATIS "is" 34 #define MATAIJ "aij" 35 #define MATSEQAIJ "seqaij" 36 #define MATSEQAIJPTHREAD "seqaijpthread" 37 #define MATAIJPTHREAD "aijpthread" 38 #define MATMPIAIJ "mpiaij" 39 #define MATAIJCRL "aijcrl" 40 #define MATSEQAIJCRL "seqaijcrl" 41 #define MATMPIAIJCRL "mpiaijcrl" 42 #define MATAIJCUSP "aijcusp" 43 #define MATSEQAIJCUSP "seqaijcusp" 44 #define MATMPIAIJCUSP "mpiaijcusp" 45 #define MATAIJCUSPARSE "aijcusparse" 46 #define MATSEQAIJCUSPARSE "seqaijcusparse" 47 #define MATMPIAIJCUSPARSE "mpiaijcusparse" 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 MATSEQBSTRM "seqbstrm" 64 #define MATMPIBSTRM "mpibstrm" 65 #define MATBSTRM "bstrm" 66 #define MATSEQSBSTRM "seqsbstrm" 67 #define MATMPISBSTRM "mpisbstrm" 68 #define MATSBSTRM "sbstrm" 69 #define MATDAAD "daad" 70 #define MATMFFD "mffd" 71 #define MATNORMAL "normal" 72 #define MATLRC "lrc" 73 #define MATSCATTER "scatter" 74 #define MATBLOCKMAT "blockmat" 75 #define MATCOMPOSITE "composite" 76 #define MATFFT "fft" 77 #define MATFFTW "fftw" 78 #define MATSEQCUFFT "seqcufft" 79 #define MATTRANSPOSEMAT "transpose" 80 #define MATSCHURCOMPLEMENT "schurcomplement" 81 #define MATPYTHON "python" 82 #define MATHYPRESTRUCT "hyprestruct" 83 #define MATHYPRESSTRUCT "hypresstruct" 84 #define MATSUBMATRIX "submatrix" 85 #define MATLOCALREF "localref" 86 #define MATNEST "nest" 87 #define MATIJ "ij" 88 89 /*J 90 MatSolverPackage - String with the name of a PETSc matrix solver type. 91 92 For example: "petsc" indicates what PETSc provides, "superlu" indicates either 93 SuperLU or SuperLU_Dist etc. 94 95 96 Level: beginner 97 98 .seealso: MatGetFactor(), Mat, MatSetType(), MatType 99 J*/ 100 #define MatSolverPackage char* 101 #define MATSOLVERSPOOLES "spooles" 102 #define MATSOLVERSUPERLU "superlu" 103 #define MATSOLVERSUPERLU_DIST "superlu_dist" 104 #define MATSOLVERUMFPACK "umfpack" 105 #define MATSOLVERCHOLMOD "cholmod" 106 #define MATSOLVERESSL "essl" 107 #define MATSOLVERLUSOL "lusol" 108 #define MATSOLVERMUMPS "mumps" 109 #define MATSOLVERPASTIX "pastix" 110 #define MATSOLVERMATLAB "matlab" 111 #define MATSOLVERPETSC "petsc" 112 #define MATSOLVERBAS "bas" 113 #define MATSOLVERCUSPARSE "cusparse" 114 #define MATSOLVERBSTRM "bstrm" 115 #define MATSOLVERSBSTRM "sbstrm" 116 #define MATSOLVERELEMENTAL "elemental" 117 #define MATSOLVERCLIQUE "clique" 118 119 /*E 120 MatFactorType - indicates what type of factorization is requested 121 122 Level: beginner 123 124 Any additions/changes here MUST also be made in include/finclude/petscmat.h 125 126 .seealso: MatSolverPackage, MatGetFactor() 127 E*/ 128 typedef enum {MAT_FACTOR_NONE, MAT_FACTOR_LU, MAT_FACTOR_CHOLESKY, MAT_FACTOR_ILU, MAT_FACTOR_ICC,MAT_FACTOR_ILUDT} MatFactorType; 129 PETSC_EXTERN const char *const MatFactorTypes[]; 130 131 PETSC_EXTERN PetscErrorCode MatGetFactor(Mat,const MatSolverPackage,MatFactorType,Mat*); 132 PETSC_EXTERN PetscErrorCode MatGetFactorAvailable(Mat,const MatSolverPackage,MatFactorType,PetscBool *); 133 PETSC_EXTERN PetscErrorCode MatFactorGetSolverPackage(Mat,const MatSolverPackage*); 134 PETSC_EXTERN PetscErrorCode MatGetFactorType(Mat,MatFactorType*); 135 136 /* Logging support */ 137 #define MAT_FILE_CLASSID 1211216 /* used to indicate matrices in binary files */ 138 PETSC_EXTERN PetscClassId MAT_CLASSID; 139 PETSC_EXTERN PetscClassId MAT_FDCOLORING_CLASSID; 140 PETSC_EXTERN PetscClassId MAT_TRANSPOSECOLORING_CLASSID; 141 PETSC_EXTERN PetscClassId MAT_PARTITIONING_CLASSID; 142 PETSC_EXTERN PetscClassId MAT_COARSEN_CLASSID; 143 PETSC_EXTERN PetscClassId MAT_NULLSPACE_CLASSID; 144 PETSC_EXTERN PetscClassId MATMFFD_CLASSID; 145 146 /*E 147 MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 148 or MatGetSubMatrix() are to be reused to store the new matrix values. For MatConvert() is used to indicate 149 that the input matrix is to be replaced with the converted matrix. 150 151 Level: beginner 152 153 Any additions/changes here MUST also be made in include/finclude/petscmat.h 154 155 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices(), MatConvert() 156 E*/ 157 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX,MAT_IGNORE_MATRIX} MatReuse; 158 159 /*E 160 MatGetSubMatrixOption - Indicates if matrices obtained from a call to MatGetSubMatrices() 161 include the matrix values. Currently it is only used by MatGetSeqNonzerostructure(). 162 163 Level: beginner 164 165 .seealso: MatGetSeqNonzerostructure() 166 E*/ 167 typedef enum {MAT_DO_NOT_GET_VALUES,MAT_GET_VALUES} MatGetSubMatrixOption; 168 169 PETSC_EXTERN PetscErrorCode MatInitializePackage(const char[]); 170 171 PETSC_EXTERN PetscErrorCode MatCreate(MPI_Comm,Mat*); 172 PETSC_EXTERN PetscErrorCode MatSetSizes(Mat,PetscInt,PetscInt,PetscInt,PetscInt); 173 PETSC_EXTERN PetscErrorCode MatSetType(Mat,const MatType); 174 PETSC_EXTERN PetscErrorCode MatSetFromOptions(Mat); 175 PETSC_EXTERN PetscErrorCode MatRegisterAll(const char[]); 176 PETSC_EXTERN PetscErrorCode MatRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat)); 177 PETSC_EXTERN PetscErrorCode MatRegisterBaseName(const char[],const char[],const char[]); 178 PETSC_EXTERN PetscErrorCode MatSetOptionsPrefix(Mat,const char[]); 179 PETSC_EXTERN PetscErrorCode MatAppendOptionsPrefix(Mat,const char[]); 180 PETSC_EXTERN PetscErrorCode MatGetOptionsPrefix(Mat,const char*[]); 181 182 /*MC 183 MatRegisterDynamic - Adds a new matrix type 184 185 Synopsis: 186 PetscErrorCode MatRegisterDynamic(const char *name,const char *path,const char *name_create,PetscErrorCode (*routine_create)(Mat)) 187 188 Not Collective 189 190 Input Parameters: 191 + name - name of a new user-defined matrix type 192 . path - path (either absolute or relative) the library containing this solver 193 . name_create - name of routine to create method context 194 - routine_create - routine to create method context 195 196 Notes: 197 MatRegisterDynamic() may be called multiple times to add several user-defined solvers. 198 199 If dynamic libraries are used, then the fourth input argument (routine_create) 200 is ignored. 201 202 Sample usage: 203 .vb 204 MatRegisterDynamic("my_mat",/home/username/my_lib/lib/libO/solaris/mylib.a, 205 "MyMatCreate",MyMatCreate); 206 .ve 207 208 Then, your solver can be chosen with the procedural interface via 209 $ MatSetType(Mat,"my_mat") 210 or at runtime via the option 211 $ -mat_type my_mat 212 213 Level: advanced 214 215 Notes: ${PETSC_ARCH} occuring in pathname will be replaced with appropriate values. 216 If your function is not being put into a shared library then use VecRegister() instead 217 218 .keywords: Mat, register 219 220 .seealso: MatRegisterAll(), MatRegisterDestroy() 221 222 M*/ 223 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 224 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 225 #else 226 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 227 #endif 228 229 PETSC_EXTERN PetscBool MatRegisterAllCalled; 230 PETSC_EXTERN PetscFList MatList; 231 PETSC_EXTERN PetscFList MatColoringList; 232 PETSC_EXTERN PetscFList MatPartitioningList; 233 PETSC_EXTERN PetscFList MatCoarsenList; 234 235 /*E 236 MatStructure - Indicates if the matrix has the same nonzero structure 237 238 Level: beginner 239 240 Any additions/changes here MUST also be made in include/finclude/petscmat.h 241 242 .seealso: MatCopy(), KSPSetOperators(), PCSetOperators() 243 E*/ 244 typedef enum {DIFFERENT_NONZERO_PATTERN,SUBSET_NONZERO_PATTERN,SAME_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 245 246 PETSC_EXTERN PetscErrorCode MatCreateSeqDense(MPI_Comm,PetscInt,PetscInt,PetscScalar[],Mat*); 247 PETSC_EXTERN PetscErrorCode MatCreateDense(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar[],Mat*); 248 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 249 PETSC_EXTERN PetscErrorCode MatCreateAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 250 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *); 251 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJWithSplitArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],PetscInt[],PetscInt[],PetscScalar[],Mat*); 252 253 PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 254 PETSC_EXTERN PetscErrorCode MatCreateBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 255 PETSC_EXTERN PetscErrorCode MatCreateMPIBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat*); 256 257 PETSC_EXTERN PetscErrorCode MatCreateMPIAdj(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscInt[],Mat*); 258 PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 259 260 PETSC_EXTERN PetscErrorCode MatCreateSBAIJ(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 261 PETSC_EXTERN PetscErrorCode MatCreateMPISBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],Mat *); 262 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]); 263 PETSC_EXTERN PetscErrorCode MatXAIJSetPreallocation(Mat,PetscInt,const PetscInt*,const PetscInt*,const PetscInt*,const PetscInt*); 264 265 PETSC_EXTERN PetscErrorCode MatCreateShell(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,void *,Mat*); 266 PETSC_EXTERN PetscErrorCode MatCreateAdic(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,void (*)(void),Mat*); 267 PETSC_EXTERN PetscErrorCode MatCreateNormal(Mat,Mat*); 268 PETSC_EXTERN PetscErrorCode MatCreateLRC(Mat,Mat,Mat,Mat*); 269 PETSC_EXTERN PetscErrorCode MatCreateIS(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,ISLocalToGlobalMapping,Mat*); 270 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 271 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJCRL(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 272 273 PETSC_EXTERN PetscErrorCode MatCreateSeqBSTRM(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 274 PETSC_EXTERN PetscErrorCode MatCreateMPIBSTRM(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 275 PETSC_EXTERN PetscErrorCode MatCreateSeqSBSTRM(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 276 PETSC_EXTERN PetscErrorCode MatCreateMPISBSTRM(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 277 278 PETSC_EXTERN PetscErrorCode MatCreateScatter(MPI_Comm,VecScatter,Mat*); 279 PETSC_EXTERN PetscErrorCode MatScatterSetVecScatter(Mat,VecScatter); 280 PETSC_EXTERN PetscErrorCode MatScatterGetVecScatter(Mat,VecScatter*); 281 PETSC_EXTERN PetscErrorCode MatCreateBlockMat(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt*,Mat*); 282 PETSC_EXTERN PetscErrorCode MatCompositeAddMat(Mat,Mat); 283 PETSC_EXTERN PetscErrorCode MatCompositeMerge(Mat); 284 PETSC_EXTERN PetscErrorCode MatCreateComposite(MPI_Comm,PetscInt,const Mat*,Mat*); 285 typedef enum {MAT_COMPOSITE_ADDITIVE,MAT_COMPOSITE_MULTIPLICATIVE} MatCompositeType; 286 PETSC_EXTERN PetscErrorCode MatCompositeSetType(Mat,MatCompositeType); 287 288 PETSC_EXTERN PetscErrorCode MatCreateFFT(MPI_Comm,PetscInt,const PetscInt[],const MatType,Mat*); 289 PETSC_EXTERN PetscErrorCode MatCreateSeqCUFFT(MPI_Comm,PetscInt,const PetscInt[],Mat*); 290 291 PETSC_EXTERN PetscErrorCode MatCreateTranspose(Mat,Mat*); 292 PETSC_EXTERN PetscErrorCode MatCreateSubMatrix(Mat,IS,IS,Mat*); 293 PETSC_EXTERN PetscErrorCode MatSubMatrixUpdate(Mat,Mat,IS,IS); 294 PETSC_EXTERN PetscErrorCode MatCreateLocalRef(Mat,IS,IS,Mat*); 295 296 PETSC_EXTERN PetscErrorCode MatPythonSetType(Mat,const char[]); 297 298 PETSC_EXTERN PetscErrorCode MatSetUp(Mat); 299 PETSC_EXTERN PetscErrorCode MatDestroy(Mat*); 300 301 PETSC_EXTERN PetscErrorCode MatConjugate(Mat); 302 PETSC_EXTERN PetscErrorCode MatRealPart(Mat); 303 PETSC_EXTERN PetscErrorCode MatImaginaryPart(Mat); 304 PETSC_EXTERN PetscErrorCode MatGetDiagonalBlock(Mat,Mat*); 305 PETSC_EXTERN PetscErrorCode MatGetTrace(Mat,PetscScalar*); 306 PETSC_EXTERN PetscErrorCode MatInvertBlockDiagonal(Mat,const PetscScalar **); 307 308 /* ------------------------------------------------------------*/ 309 PETSC_EXTERN PetscErrorCode MatSetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 310 PETSC_EXTERN PetscErrorCode MatSetValuesBlocked(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 311 PETSC_EXTERN PetscErrorCode MatSetValuesRow(Mat,PetscInt,const PetscScalar[]); 312 PETSC_EXTERN PetscErrorCode MatSetValuesRowLocal(Mat,PetscInt,const PetscScalar[]); 313 PETSC_EXTERN PetscErrorCode MatSetValuesBatch(Mat,PetscInt,PetscInt,PetscInt[],const PetscScalar[]); 314 PETSC_EXTERN PetscErrorCode MatSetRandom(Mat,PetscRandom); 315 316 /*S 317 MatStencil - Data structure (C struct) for storing information about a single row or 318 column of a matrix as indexed on an associated grid. 319 320 Fortran usage is different, see MatSetValuesStencil() for details. 321 322 Level: beginner 323 324 Concepts: matrix; linear operator 325 326 .seealso: MatSetValuesStencil(), MatSetStencil(), MatSetValuesBlockedStencil() 327 S*/ 328 typedef struct { 329 PetscInt k,j,i,c; 330 } MatStencil; 331 332 PETSC_EXTERN PetscErrorCode MatSetValuesStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode); 333 PETSC_EXTERN PetscErrorCode MatSetValuesBlockedStencil(Mat,PetscInt,const MatStencil[],PetscInt,const MatStencil[],const PetscScalar[],InsertMode); 334 PETSC_EXTERN PetscErrorCode MatSetStencil(Mat,PetscInt,const PetscInt[],const PetscInt[],PetscInt); 335 336 PETSC_EXTERN PetscErrorCode MatSetColoring(Mat,ISColoring); 337 PETSC_EXTERN PetscErrorCode MatSetValuesAdic(Mat,void*); 338 PETSC_EXTERN PetscErrorCode MatSetValuesAdifor(Mat,PetscInt,void*); 339 340 /*E 341 MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 342 to continue to add values to it 343 344 Level: beginner 345 346 .seealso: MatAssemblyBegin(), MatAssemblyEnd() 347 E*/ 348 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 349 PETSC_EXTERN PetscErrorCode MatAssemblyBegin(Mat,MatAssemblyType); 350 PETSC_EXTERN PetscErrorCode MatAssemblyEnd(Mat,MatAssemblyType); 351 PETSC_EXTERN PetscErrorCode MatAssembled(Mat,PetscBool *); 352 353 354 355 /*E 356 MatOption - Options that may be set for a matrix and its behavior or storage 357 358 Level: beginner 359 360 Any additions/changes here MUST also be made in include/finclude/petscmat.h 361 362 .seealso: MatSetOption() 363 E*/ 364 typedef enum {MAT_ROW_ORIENTED,MAT_NEW_NONZERO_LOCATIONS, 365 MAT_SYMMETRIC, 366 MAT_STRUCTURALLY_SYMMETRIC, 367 MAT_NEW_DIAGONALS,MAT_IGNORE_OFF_PROC_ENTRIES, 368 MAT_NEW_NONZERO_LOCATION_ERR, 369 MAT_NEW_NONZERO_ALLOCATION_ERR,MAT_USE_HASH_TABLE, 370 MAT_KEEP_NONZERO_PATTERN,MAT_IGNORE_ZERO_ENTRIES, 371 MAT_USE_INODES, 372 MAT_HERMITIAN, 373 MAT_SYMMETRY_ETERNAL, 374 MAT_CHECK_COMPRESSED_ROW, 375 MAT_IGNORE_LOWER_TRIANGULAR,MAT_ERROR_LOWER_TRIANGULAR, 376 MAT_GETROW_UPPERTRIANGULAR,MAT_UNUSED_NONZERO_LOCATION_ERR, 377 MAT_SPD,MAT_NO_OFF_PROC_ENTRIES,MAT_NO_OFF_PROC_ZERO_ROWS, 378 NUM_MAT_OPTIONS} MatOption; 379 380 PETSC_EXTERN const char *MatOptions[]; 381 PETSC_EXTERN PetscErrorCode MatSetOption(Mat,MatOption,PetscBool ); 382 PETSC_EXTERN PetscErrorCode MatGetType(Mat,const MatType*); 383 384 PETSC_EXTERN PetscErrorCode MatGetValues(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscScalar[]); 385 PETSC_EXTERN PetscErrorCode MatGetRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]); 386 PETSC_EXTERN PetscErrorCode MatRestoreRow(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]); 387 PETSC_EXTERN PetscErrorCode MatGetRowUpperTriangular(Mat); 388 PETSC_EXTERN PetscErrorCode MatRestoreRowUpperTriangular(Mat); 389 PETSC_EXTERN PetscErrorCode MatGetColumn(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]); 390 PETSC_EXTERN PetscErrorCode MatRestoreColumn(Mat,PetscInt,PetscInt *,const PetscInt *[],const PetscScalar*[]); 391 PETSC_EXTERN PetscErrorCode MatGetColumnVector(Mat,Vec,PetscInt); 392 PETSC_EXTERN PetscErrorCode MatSeqAIJGetArray(Mat,PetscScalar *[]); 393 PETSC_EXTERN PetscErrorCode MatSeqAIJRestoreArray(Mat,PetscScalar *[]); 394 PETSC_EXTERN PetscErrorCode MatDenseGetArray(Mat,PetscScalar *[]); 395 PETSC_EXTERN PetscErrorCode MatDenseRestoreArray(Mat,PetscScalar *[]); 396 PETSC_EXTERN PetscErrorCode MatGetBlockSize(Mat,PetscInt *); 397 PETSC_EXTERN PetscErrorCode MatSetBlockSize(Mat,PetscInt); 398 PETSC_EXTERN PetscErrorCode MatGetBlockSizes(Mat,PetscInt *,PetscInt *); 399 PETSC_EXTERN PetscErrorCode MatSetBlockSizes(Mat,PetscInt,PetscInt); 400 PETSC_EXTERN PetscErrorCode MatSetNThreads(Mat,PetscInt); 401 PETSC_EXTERN PetscErrorCode MatGetNThreads(Mat,PetscInt*); 402 403 PETSC_EXTERN PetscErrorCode MatMult(Mat,Vec,Vec); 404 PETSC_EXTERN PetscErrorCode MatMultDiagonalBlock(Mat,Vec,Vec); 405 PETSC_EXTERN PetscErrorCode MatMultAdd(Mat,Vec,Vec,Vec); 406 PETSC_EXTERN PetscErrorCode MatMultTranspose(Mat,Vec,Vec); 407 PETSC_EXTERN PetscErrorCode MatMultHermitianTranspose(Mat,Vec,Vec); 408 PETSC_EXTERN PetscErrorCode MatIsTranspose(Mat,Mat,PetscReal,PetscBool *); 409 PETSC_EXTERN PetscErrorCode MatIsHermitianTranspose(Mat,Mat,PetscReal,PetscBool *); 410 PETSC_EXTERN PetscErrorCode MatMultTransposeAdd(Mat,Vec,Vec,Vec); 411 PETSC_EXTERN PetscErrorCode MatMultHermitianTransposeAdd(Mat,Vec,Vec,Vec); 412 PETSC_EXTERN PetscErrorCode MatMultConstrained(Mat,Vec,Vec); 413 PETSC_EXTERN PetscErrorCode MatMultTransposeConstrained(Mat,Vec,Vec); 414 PETSC_EXTERN PetscErrorCode MatMatSolve(Mat,Mat,Mat); 415 416 /*E 417 MatDuplicateOption - Indicates if a duplicated sparse matrix should have 418 its numerical values copied over or just its nonzero structure. 419 420 Level: beginner 421 422 Any additions/changes here MUST also be made in include/finclude/petscmat.h 423 424 $ MAT_SHARE_NONZERO_PATTERN - the i and j arrays in the new matrix will be shared with the original matrix 425 $ this also triggers the MAT_DO_NOT_COPY_VALUES option. This is used when you 426 $ have several matrices with the same nonzero pattern. 427 428 .seealso: MatDuplicate() 429 E*/ 430 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES,MAT_SHARE_NONZERO_PATTERN} MatDuplicateOption; 431 432 PETSC_EXTERN PetscErrorCode MatConvert(Mat,const MatType,MatReuse,Mat*); 433 PETSC_EXTERN PetscErrorCode MatDuplicate(Mat,MatDuplicateOption,Mat*); 434 435 436 PETSC_EXTERN PetscErrorCode MatCopy(Mat,Mat,MatStructure); 437 PETSC_EXTERN PetscErrorCode MatView(Mat,PetscViewer); 438 PETSC_EXTERN PetscErrorCode MatIsSymmetric(Mat,PetscReal,PetscBool *); 439 PETSC_EXTERN PetscErrorCode MatIsStructurallySymmetric(Mat,PetscBool *); 440 PETSC_EXTERN PetscErrorCode MatIsHermitian(Mat,PetscReal,PetscBool *); 441 PETSC_EXTERN PetscErrorCode MatIsSymmetricKnown(Mat,PetscBool *,PetscBool *); 442 PETSC_EXTERN PetscErrorCode MatIsHermitianKnown(Mat,PetscBool *,PetscBool *); 443 PETSC_EXTERN PetscErrorCode MatMissingDiagonal(Mat,PetscBool *,PetscInt *); 444 PETSC_EXTERN PetscErrorCode MatLoad(Mat, PetscViewer); 445 446 PETSC_EXTERN PetscErrorCode MatGetRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,PetscInt *[],PetscInt *[],PetscBool *); 447 PETSC_EXTERN PetscErrorCode MatRestoreRowIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,PetscInt *[],PetscInt *[],PetscBool *); 448 PETSC_EXTERN PetscErrorCode MatGetColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt*,PetscInt *[],PetscInt *[],PetscBool *); 449 PETSC_EXTERN PetscErrorCode MatRestoreColumnIJ(Mat,PetscInt,PetscBool ,PetscBool ,PetscInt *,PetscInt *[],PetscInt *[],PetscBool *); 450 451 /*S 452 MatInfo - Context of matrix information, used with MatGetInfo() 453 454 In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 455 456 Level: intermediate 457 458 Concepts: matrix^nonzero information 459 460 .seealso: MatGetInfo(), MatInfoType 461 S*/ 462 typedef struct { 463 PetscLogDouble block_size; /* block size */ 464 PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 465 PetscLogDouble memory; /* memory allocated */ 466 PetscLogDouble assemblies; /* number of matrix assemblies called */ 467 PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 468 PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 469 PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 470 } MatInfo; 471 472 /*E 473 MatInfoType - Indicates if you want information about the local part of the matrix, 474 the entire parallel matrix or the maximum over all the local parts. 475 476 Level: beginner 477 478 Any additions/changes here MUST also be made in include/finclude/petscmat.h 479 480 .seealso: MatGetInfo(), MatInfo 481 E*/ 482 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 483 PETSC_EXTERN PetscErrorCode MatGetInfo(Mat,MatInfoType,MatInfo*); 484 PETSC_EXTERN PetscErrorCode MatGetDiagonal(Mat,Vec); 485 PETSC_EXTERN PetscErrorCode MatGetRowMax(Mat,Vec,PetscInt[]); 486 PETSC_EXTERN PetscErrorCode MatGetRowMin(Mat,Vec,PetscInt[]); 487 PETSC_EXTERN PetscErrorCode MatGetRowMaxAbs(Mat,Vec,PetscInt[]); 488 PETSC_EXTERN PetscErrorCode MatGetRowMinAbs(Mat,Vec,PetscInt[]); 489 PETSC_EXTERN PetscErrorCode MatGetRowSum(Mat,Vec); 490 PETSC_EXTERN PetscErrorCode MatTranspose(Mat,MatReuse,Mat*); 491 PETSC_EXTERN PetscErrorCode MatHermitianTranspose(Mat,MatReuse,Mat*); 492 PETSC_EXTERN PetscErrorCode MatPermute(Mat,IS,IS,Mat *); 493 PETSC_EXTERN PetscErrorCode MatDiagonalScale(Mat,Vec,Vec); 494 PETSC_EXTERN PetscErrorCode MatDiagonalSet(Mat,Vec,InsertMode); 495 PETSC_EXTERN PetscErrorCode MatEqual(Mat,Mat,PetscBool *); 496 PETSC_EXTERN PetscErrorCode MatMultEqual(Mat,Mat,PetscInt,PetscBool *); 497 PETSC_EXTERN PetscErrorCode MatMultAddEqual(Mat,Mat,PetscInt,PetscBool *); 498 PETSC_EXTERN PetscErrorCode MatMultTransposeEqual(Mat,Mat,PetscInt,PetscBool *); 499 PETSC_EXTERN PetscErrorCode MatMultTransposeAddEqual(Mat,Mat,PetscInt,PetscBool *); 500 501 PETSC_EXTERN PetscErrorCode MatNorm(Mat,NormType,PetscReal *); 502 PETSC_EXTERN PetscErrorCode MatGetColumnNorms(Mat,NormType,PetscReal *); 503 PETSC_EXTERN PetscErrorCode MatZeroEntries(Mat); 504 PETSC_EXTERN PetscErrorCode MatZeroRows(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 505 PETSC_EXTERN PetscErrorCode MatZeroRowsIS(Mat,IS,PetscScalar,Vec,Vec); 506 PETSC_EXTERN PetscErrorCode MatZeroRowsStencil(Mat,PetscInt,const MatStencil [],PetscScalar,Vec,Vec); 507 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsStencil(Mat,PetscInt,const MatStencil[],PetscScalar,Vec,Vec); 508 PETSC_EXTERN PetscErrorCode MatZeroRowsColumns(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 509 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsIS(Mat,IS,PetscScalar,Vec,Vec); 510 511 PETSC_EXTERN PetscErrorCode MatGetSize(Mat,PetscInt*,PetscInt*); 512 PETSC_EXTERN PetscErrorCode MatGetLocalSize(Mat,PetscInt*,PetscInt*); 513 PETSC_EXTERN PetscErrorCode MatGetOwnershipRange(Mat,PetscInt*,PetscInt*); 514 PETSC_EXTERN PetscErrorCode MatGetOwnershipRanges(Mat,const PetscInt**); 515 PETSC_EXTERN PetscErrorCode MatGetOwnershipRangeColumn(Mat,PetscInt*,PetscInt*); 516 PETSC_EXTERN PetscErrorCode MatGetOwnershipRangesColumn(Mat,const PetscInt**); 517 PETSC_EXTERN PetscErrorCode MatGetOwnershipIS(Mat,IS*,IS*); 518 519 PETSC_EXTERN PetscErrorCode MatGetSubMatrices(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]); 520 PETSC_EXTERN PetscErrorCode MatGetSubMatricesParallel(Mat,PetscInt,const IS[],const IS[],MatReuse,Mat *[]); 521 PETSC_EXTERN PetscErrorCode MatDestroyMatrices(PetscInt,Mat *[]); 522 PETSC_EXTERN PetscErrorCode MatGetSubMatrix(Mat,IS,IS,MatReuse,Mat *); 523 PETSC_EXTERN PetscErrorCode MatGetLocalSubMatrix(Mat,IS,IS,Mat*); 524 PETSC_EXTERN PetscErrorCode MatRestoreLocalSubMatrix(Mat,IS,IS,Mat*); 525 PETSC_EXTERN PetscErrorCode MatGetSeqNonzeroStructure(Mat,Mat*); 526 PETSC_EXTERN PetscErrorCode MatDestroySeqNonzeroStructure(Mat*); 527 528 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJConcatenateSeqAIJ(MPI_Comm,Mat,PetscInt,MatReuse,Mat*); 529 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJConcatenateSeqAIJSymbolic(MPI_Comm,Mat,PetscInt,Mat*); 530 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJConcatenateSeqAIJNumeric(MPI_Comm,Mat,PetscInt,Mat); 531 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJ(MPI_Comm,Mat,PetscInt,PetscInt,MatReuse,Mat*); 532 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJSymbolic(MPI_Comm,Mat,PetscInt,PetscInt,Mat*); 533 PETSC_EXTERN PetscErrorCode MatCreateMPIAIJSumSeqAIJNumeric(Mat,Mat); 534 PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMat(Mat,MatReuse,Mat*); 535 PETSC_EXTERN PetscErrorCode MatMPIAIJGetLocalMatCondensed(Mat,MatReuse,IS*,IS*,Mat*); 536 PETSC_EXTERN PetscErrorCode MatGetBrowsOfAcols(Mat,Mat,MatReuse,IS*,IS*,Mat*); 537 #if defined (PETSC_USE_CTABLE) 538 PETSC_EXTERN PetscErrorCode MatGetCommunicationStructs(Mat, Vec *, PetscTable *, VecScatter *); 539 #else 540 PETSC_EXTERN PetscErrorCode MatGetCommunicationStructs(Mat, Vec *, PetscInt *[], VecScatter *); 541 #endif 542 PETSC_EXTERN PetscErrorCode MatGetGhosts(Mat, PetscInt *,const PetscInt *[]); 543 544 PETSC_EXTERN PetscErrorCode MatIncreaseOverlap(Mat,PetscInt,IS[],PetscInt); 545 546 PETSC_EXTERN PetscErrorCode MatMatMult(Mat,Mat,MatReuse,PetscReal,Mat*); 547 PETSC_EXTERN PetscErrorCode MatMatMultSymbolic(Mat,Mat,PetscReal,Mat*); 548 PETSC_EXTERN PetscErrorCode MatMatMultNumeric(Mat,Mat,Mat); 549 550 PETSC_EXTERN PetscErrorCode MatPtAP(Mat,Mat,MatReuse,PetscReal,Mat*); 551 PETSC_EXTERN PetscErrorCode MatPtAPSymbolic(Mat,Mat,PetscReal,Mat*); 552 PETSC_EXTERN PetscErrorCode MatPtAPNumeric(Mat,Mat,Mat); 553 PETSC_EXTERN PetscErrorCode MatRARt(Mat,Mat,MatReuse,PetscReal,Mat*); 554 PETSC_EXTERN PetscErrorCode MatRARtSymbolic(Mat,Mat,PetscReal,Mat*); 555 PETSC_EXTERN PetscErrorCode MatRARtNumeric(Mat,Mat,Mat); 556 557 PETSC_EXTERN PetscErrorCode MatTransposeMatMult(Mat,Mat,MatReuse,PetscReal,Mat*); 558 PETSC_EXTERN PetscErrorCode MatTransposetMatMultSymbolic(Mat,Mat,PetscReal,Mat*); 559 PETSC_EXTERN PetscErrorCode MatTransposetMatMultNumeric(Mat,Mat,Mat); 560 PETSC_EXTERN PetscErrorCode MatMatTransposeMult(Mat,Mat,MatReuse,PetscReal,Mat*); 561 PETSC_EXTERN PetscErrorCode MatMatTransposeMultSymbolic(Mat,Mat,PetscReal,Mat*); 562 PETSC_EXTERN PetscErrorCode MatMatTransposeMultNumeric(Mat,Mat,Mat); 563 564 PETSC_EXTERN PetscErrorCode MatAXPY(Mat,PetscScalar,Mat,MatStructure); 565 PETSC_EXTERN PetscErrorCode MatAYPX(Mat,PetscScalar,Mat,MatStructure); 566 567 PETSC_EXTERN PetscErrorCode MatScale(Mat,PetscScalar); 568 PETSC_EXTERN PetscErrorCode MatShift(Mat,PetscScalar); 569 570 PETSC_EXTERN PetscErrorCode MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping,ISLocalToGlobalMapping); 571 PETSC_EXTERN PetscErrorCode MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping,ISLocalToGlobalMapping); 572 PETSC_EXTERN PetscErrorCode MatGetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping*,ISLocalToGlobalMapping*); 573 PETSC_EXTERN PetscErrorCode MatGetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping*,ISLocalToGlobalMapping*); 574 PETSC_EXTERN PetscErrorCode MatZeroRowsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 575 PETSC_EXTERN PetscErrorCode MatZeroRowsLocalIS(Mat,IS,PetscScalar,Vec,Vec); 576 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocal(Mat,PetscInt,const PetscInt [],PetscScalar,Vec,Vec); 577 PETSC_EXTERN PetscErrorCode MatZeroRowsColumnsLocalIS(Mat,IS,PetscScalar,Vec,Vec); 578 PETSC_EXTERN PetscErrorCode MatSetValuesLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 579 PETSC_EXTERN PetscErrorCode MatSetValuesBlockedLocal(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 580 581 PETSC_EXTERN PetscErrorCode MatStashSetInitialSize(Mat,PetscInt,PetscInt); 582 PETSC_EXTERN PetscErrorCode MatStashGetInfo(Mat,PetscInt*,PetscInt*,PetscInt*,PetscInt*); 583 584 PETSC_EXTERN PetscErrorCode MatInterpolate(Mat,Vec,Vec); 585 PETSC_EXTERN PetscErrorCode MatInterpolateAdd(Mat,Vec,Vec,Vec); 586 PETSC_EXTERN PetscErrorCode MatRestrict(Mat,Vec,Vec); 587 PETSC_EXTERN PetscErrorCode MatGetVecs(Mat,Vec*,Vec*); 588 PETSC_EXTERN PetscErrorCode MatGetRedundantMatrix(Mat,PetscInt,MPI_Comm,PetscInt,MatReuse,Mat*); 589 PETSC_EXTERN PetscErrorCode MatGetMultiProcBlock(Mat,MPI_Comm,MatReuse,Mat*); 590 PETSC_EXTERN PetscErrorCode MatFindZeroDiagonals(Mat,IS*); 591 592 /*MC 593 MatSetValue - Set a single entry into a matrix. 594 595 Not collective 596 597 Input Parameters: 598 + m - the matrix 599 . row - the row location of the entry 600 . col - the column location of the entry 601 . value - the value to insert 602 - mode - either INSERT_VALUES or ADD_VALUES 603 604 Notes: 605 For efficiency one should use MatSetValues() and set several or many 606 values simultaneously if possible. 607 608 Level: beginner 609 610 .seealso: MatSetValues(), MatSetValueLocal() 611 M*/ 612 PETSC_STATIC_INLINE PetscErrorCode MatSetValue(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValues(v,1,&i,1,&j,&va,mode);} 613 614 PETSC_STATIC_INLINE PetscErrorCode MatGetValue(Mat v,PetscInt i,PetscInt j,PetscScalar *va) {return MatGetValues(v,1,&i,1,&j,va);} 615 616 PETSC_STATIC_INLINE PetscErrorCode MatSetValueLocal(Mat v,PetscInt i,PetscInt j,PetscScalar va,InsertMode mode) {return MatSetValuesLocal(v,1,&i,1,&j,&va,mode);} 617 618 /*MC 619 MatPreallocateInitialize - Begins the block of code that will count the number of nonzeros per 620 row in a matrix providing the data that one can use to correctly preallocate the matrix. 621 622 Synopsis: 623 PetscErrorCode MatPreallocateInitialize(MPI_Comm comm, PetscInt nrows, PetscInt ncols, PetscInt *dnz, PetscInt *onz) 624 625 Collective on MPI_Comm 626 627 Input Parameters: 628 + comm - the communicator that will share the eventually allocated matrix 629 . nrows - the number of LOCAL rows in the matrix 630 - ncols - the number of LOCAL columns in the matrix 631 632 Output Parameters: 633 + dnz - the array that will be passed to the matrix preallocation routines 634 - ozn - the other array passed to the matrix preallocation routines 635 636 637 Level: intermediate 638 639 Notes: 640 See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details. 641 642 Do not malloc or free dnz and onz, that is handled internally by these routines 643 644 Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices) 645 646 This is a MACRO not a function because it has a leading { that is closed by PetscPreallocateFinalize(). 647 648 Concepts: preallocation^Matrix 649 650 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(), 651 MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocal() 652 M*/ 653 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 654 { \ 655 PetscErrorCode _4_ierr; PetscInt __nrows = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 656 _4_ierr = PetscMalloc2(__nrows,PetscInt,&dnz,__nrows,PetscInt,&onz);CHKERRQ(_4_ierr); \ 657 _4_ierr = PetscMemzero(dnz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr);\ 658 _4_ierr = PetscMemzero(onz,__nrows*sizeof(PetscInt));CHKERRQ(_4_ierr); __start = 0; __end = __start; \ 659 _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 660 _4_ierr = MPI_Scan(&__nrows,&__rstart,1,MPIU_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __nrows; 661 662 /*MC 663 MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be 664 inserted using a local number of the rows and columns 665 666 Synopsis: 667 PetscErrorCode MatPreallocateSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 668 669 Not Collective 670 671 Input Parameters: 672 + map - the row mapping from local numbering to global numbering 673 . nrows - the number of rows indicated 674 . rows - the indices of the rows 675 . cmap - the column mapping from local to global numbering 676 . ncols - the number of columns in the matrix 677 . cols - the columns indicated 678 . dnz - the array that will be passed to the matrix preallocation routines 679 - ozn - the other array passed to the matrix preallocation routines 680 681 682 Level: intermediate 683 684 Notes: 685 See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details. 686 687 Do not malloc or free dnz and onz, that is handled internally by these routines 688 689 Concepts: preallocation^Matrix 690 691 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 692 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal() 693 M*/ 694 #define MatPreallocateSetLocal(rmap,nrows,rows,cmap,ncols,cols,dnz,onz) 0; \ 695 {\ 696 PetscInt __l;\ 697 _4_ierr = ISLocalToGlobalMappingApply(rmap,nrows,rows,rows);CHKERRQ(_4_ierr);\ 698 _4_ierr = ISLocalToGlobalMappingApply(cmap,ncols,cols,cols);CHKERRQ(_4_ierr);\ 699 for (__l=0;__l<nrows;__l++) {\ 700 _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 701 }\ 702 } 703 704 /*MC 705 MatPreallocateSymmetricSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be 706 inserted using a local number of the rows and columns 707 708 Synopsis: 709 PetscErrorCode MatPreallocateSymmetricSetLocal(ISLocalToGlobalMappping map,PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 710 711 Not Collective 712 713 Input Parameters: 714 + map - the mapping between local numbering and global numbering 715 . nrows - the number of rows indicated 716 . rows - the indices of the rows 717 . ncols - the number of columns in the matrix 718 . cols - the columns indicated 719 . dnz - the array that will be passed to the matrix preallocation routines 720 - ozn - the other array passed to the matrix preallocation routines 721 722 723 Level: intermediate 724 725 Notes: 726 See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details. 727 728 Do not malloc or free dnz and onz that is handled internally by these routines 729 730 Concepts: preallocation^Matrix 731 732 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 733 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal() 734 M*/ 735 #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 736 {\ 737 PetscInt __l;\ 738 _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 739 _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 740 for (__l=0;__l<nrows;__l++) {\ 741 _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 742 }\ 743 } 744 745 /*MC 746 MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be 747 inserted using a local number of the rows and columns 748 749 Synopsis: 750 PetscErrorCode MatPreallocateSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 751 752 Not Collective 753 754 Input Parameters: 755 + row - the row 756 . ncols - the number of columns in the matrix 757 - cols - the columns indicated 758 759 Output Parameters: 760 + dnz - the array that will be passed to the matrix preallocation routines 761 - ozn - the other array passed to the matrix preallocation routines 762 763 764 Level: intermediate 765 766 Notes: 767 See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details. 768 769 Do not malloc or free dnz and onz that is handled internally by these routines 770 771 This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize(). 772 773 Concepts: preallocation^Matrix 774 775 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 776 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal() 777 M*/ 778 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 779 { PetscInt __i; \ 780 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);\ 781 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);\ 782 for (__i=0; __i<nc; __i++) {\ 783 if ((cols)[__i] < __start || (cols)[__i] >= __end) onz[row - __rstart]++; \ 784 else dnz[row - __rstart]++;\ 785 }\ 786 } 787 788 /*MC 789 MatPreallocateSymmetricSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be 790 inserted using a local number of the rows and columns 791 792 Synopsis: 793 PetscErrorCode MatPreallocateSymmetricSet(PetscInt nrows, PetscInt *rows,PetscInt ncols, PetscInt *cols,PetscInt *dnz, PetscInt *onz) 794 795 Not Collective 796 797 Input Parameters: 798 + nrows - the number of rows indicated 799 . rows - the indices of the rows 800 . ncols - the number of columns in the matrix 801 . cols - the columns indicated 802 . dnz - the array that will be passed to the matrix preallocation routines 803 - ozn - the other array passed to the matrix preallocation routines 804 805 806 Level: intermediate 807 808 Notes: 809 See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details. 810 811 Do not malloc or free dnz and onz that is handled internally by these routines 812 813 This is a MACRO not a function because it uses variables declared in MatPreallocateInitialize(). 814 815 Concepts: preallocation^Matrix 816 817 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 818 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal() 819 M*/ 820 #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\ 821 { PetscInt __i; \ 822 for (__i=0; __i<nc; __i++) {\ 823 if (cols[__i] >= __end) onz[row - __rstart]++; \ 824 else if (cols[__i] >= row) dnz[row - __rstart]++;\ 825 }\ 826 } 827 828 /*MC 829 MatPreallocateLocation - An alternative to MatPreallocationSet() that puts the nonzero locations into the matrix if it exists 830 831 Synopsis: 832 PetscErrorCode MatPreallocateLocations(Mat A,PetscInt row,PetscInt ncols,PetscInt *cols,PetscInt *dnz,PetscInt *onz) 833 834 Not Collective 835 836 Input Parameters: 837 . A - matrix 838 . row - row where values exist (must be local to this process) 839 . ncols - number of columns 840 . cols - columns with nonzeros 841 . dnz - the array that will be passed to the matrix preallocation routines 842 - ozn - the other array passed to the matrix preallocation routines 843 844 845 Level: intermediate 846 847 Notes: 848 See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details. 849 850 Do not malloc or free dnz and onz that is handled internally by these routines 851 852 This is a MACRO not a function because it uses a bunch of variables private to the MatPreallocation.... routines. 853 854 Concepts: preallocation^Matrix 855 856 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(), 857 MatPreallocateSymmetricSetLocal() 858 M*/ 859 #define MatPreallocateLocation(A,row,ncols,cols,dnz,onz) 0;if (A) {ierr = MatSetValues(A,1,&row,ncols,cols,PETSC_NULL,INSERT_VALUES);CHKERRQ(ierr);} else {ierr = MatPreallocateSet(row,ncols,cols,dnz,onz);CHKERRQ(ierr);} 860 861 862 /*MC 863 MatPreallocateFinalize - Ends the block of code that will count the number of nonzeros per 864 row in a matrix providing the data that one can use to correctly preallocate the matrix. 865 866 Synopsis: 867 PetscErrorCode MatPreallocateFinalize(PetscInt *dnz, PetscInt *onz) 868 869 Collective on MPI_Comm 870 871 Input Parameters: 872 + dnz - the array that was be passed to the matrix preallocation routines 873 - ozn - the other array passed to the matrix preallocation routines 874 875 876 Level: intermediate 877 878 Notes: 879 See the <A href="../../docs/manual.pdf#nameddest=ch_performance">Hints for Performance Improvment</A> chapter in the users manual for more details. 880 881 Do not malloc or free dnz and onz that is handled internally by these routines 882 883 This is a MACRO not a function because it closes the { started in MatPreallocateInitialize(). 884 885 Concepts: preallocation^Matrix 886 887 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(), 888 MatPreallocateSymmetricSetLocal() 889 M*/ 890 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree2(dnz,onz);CHKERRQ(_4_ierr);} 891 892 893 894 /* Routines unique to particular data structures */ 895 PETSC_EXTERN PetscErrorCode MatShellGetContext(Mat,void *); 896 897 PETSC_EXTERN PetscErrorCode MatInodeAdjustForInodes(Mat,IS*,IS*); 898 PETSC_EXTERN PetscErrorCode MatInodeGetInodeSizes(Mat,PetscInt *,PetscInt *[],PetscInt *); 899 900 PETSC_EXTERN PetscErrorCode MatSeqAIJSetColumnIndices(Mat,PetscInt[]); 901 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetColumnIndices(Mat,PetscInt[]); 902 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*); 903 PETSC_EXTERN PetscErrorCode MatCreateSeqBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*); 904 PETSC_EXTERN PetscErrorCode MatCreateSeqSBAIJWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*); 905 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJFromTriple(MPI_Comm,PetscInt,PetscInt,PetscInt[],PetscInt[],PetscScalar[],Mat*,PetscInt,PetscBool); 906 907 #define MAT_SKIP_ALLOCATION -4 908 909 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]); 910 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[]); 911 PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocation(Mat,PetscInt,const PetscInt[]); 912 913 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 914 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetPreallocation(Mat,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 915 PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocation(Mat,PetscInt,const PetscInt[],PetscInt,const PetscInt[]); 916 PETSC_EXTERN PetscErrorCode MatSeqAIJSetPreallocationCSR(Mat,const PetscInt [],const PetscInt [],const PetscScalar []); 917 PETSC_EXTERN PetscErrorCode MatSeqBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]); 918 PETSC_EXTERN PetscErrorCode MatMPIAIJSetPreallocationCSR(Mat,const PetscInt[],const PetscInt[],const PetscScalar[]); 919 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetPreallocationCSR(Mat,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[]); 920 PETSC_EXTERN PetscErrorCode MatMPIAdjSetPreallocation(Mat,PetscInt[],PetscInt[],PetscInt[]); 921 PETSC_EXTERN PetscErrorCode MatMPIDenseSetPreallocation(Mat,PetscScalar[]); 922 PETSC_EXTERN PetscErrorCode MatSeqDenseSetPreallocation(Mat,PetscScalar[]); 923 PETSC_EXTERN PetscErrorCode MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,PetscInt*[]); 924 PETSC_EXTERN PetscErrorCode MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,PetscInt*[]); 925 PETSC_EXTERN PetscErrorCode MatAdicSetLocalFunction(Mat,void (*)(void)); 926 PETSC_EXTERN PetscErrorCode MatMPIAdjCreateNonemptySubcommMat(Mat,Mat*); 927 928 PETSC_EXTERN PetscErrorCode MatSeqDenseSetLDA(Mat,PetscInt); 929 PETSC_EXTERN PetscErrorCode MatDenseGetLocalMatrix(Mat,Mat*); 930 931 PETSC_EXTERN PetscErrorCode MatStoreValues(Mat); 932 PETSC_EXTERN PetscErrorCode MatRetrieveValues(Mat); 933 934 PETSC_EXTERN PetscErrorCode MatDAADSetCtx(Mat,void*); 935 936 PETSC_EXTERN PetscErrorCode MatFindNonzeroRows(Mat,IS*); 937 /* 938 These routines are not usually accessed directly, rather solving is 939 done through the KSP and PC interfaces. 940 */ 941 942 /*J 943 MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 944 with an optional dynamic library name, for example 945 http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 946 947 Level: beginner 948 949 Cannot use const because the PC objects manipulate the string 950 951 .seealso: MatGetOrdering() 952 J*/ 953 #define MatOrderingType char* 954 #define MATORDERINGNATURAL "natural" 955 #define MATORDERINGND "nd" 956 #define MATORDERING1WD "1wd" 957 #define MATORDERINGRCM "rcm" 958 #define MATORDERINGQMD "qmd" 959 #define MATORDERINGROWLENGTH "rowlength" 960 #define MATORDERINGAMD "amd" /* only works if UMFPACK is installed with PETSc */ 961 962 PETSC_EXTERN PetscErrorCode MatGetOrdering(Mat,const MatOrderingType,IS*,IS*); 963 PETSC_EXTERN PetscErrorCode MatGetOrderingList(PetscFList *list); 964 PETSC_EXTERN PetscErrorCode MatOrderingRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,const MatOrderingType,IS*,IS*)); 965 966 /*MC 967 MatOrderingRegisterDynamic - Adds a new sparse matrix ordering to the matrix package. 968 969 Synopsis: 970 PetscErrorCode MatOrderingRegisterDynamic(const char *name_ordering,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatOrdering)) 971 972 Not Collective 973 974 Input Parameters: 975 + sname - name of ordering (for example MATORDERINGND) 976 . path - location of library where creation routine is 977 . name - name of function that creates the ordering type,a string 978 - function - function pointer that creates the ordering 979 980 Level: developer 981 982 If dynamic libraries are used, then the fourth input argument (function) 983 is ignored. 984 985 Sample usage: 986 .vb 987 MatOrderingRegisterDynamic("my_order",/home/username/my_lib/lib/libO/solaris/mylib.a, 988 "MyOrder",MyOrder); 989 .ve 990 991 Then, your partitioner can be chosen with the procedural interface via 992 $ MatOrderingSetType(part,"my_order) 993 or at runtime via the option 994 $ -pc_factor_mat_ordering_type my_order 995 996 ${PETSC_ARCH} occuring in pathname will be replaced with appropriate values. 997 998 .keywords: matrix, ordering, register 999 1000 .seealso: MatOrderingRegisterDestroy(), MatOrderingRegisterAll() 1001 M*/ 1002 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1003 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 1004 #else 1005 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 1006 #endif 1007 1008 PETSC_EXTERN PetscErrorCode MatOrderingRegisterDestroy(void); 1009 PETSC_EXTERN PetscErrorCode MatOrderingRegisterAll(const char[]); 1010 PETSC_EXTERN PetscBool MatOrderingRegisterAllCalled; 1011 PETSC_EXTERN PetscFList MatOrderingList; 1012 1013 PETSC_EXTERN PetscErrorCode MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 1014 1015 /*S 1016 MatFactorShiftType - Numeric Shift. 1017 1018 Level: beginner 1019 1020 S*/ 1021 typedef enum {MAT_SHIFT_NONE,MAT_SHIFT_NONZERO,MAT_SHIFT_POSITIVE_DEFINITE,MAT_SHIFT_INBLOCKS} MatFactorShiftType; 1022 PETSC_EXTERN const char *const MatFactorShiftTypes[]; 1023 1024 /*S 1025 MatFactorInfo - Data passed into the matrix factorization routines 1026 1027 In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE, that is use 1028 $ MatFactorInfo info(MAT_FACTORINFO_SIZE) 1029 1030 Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC. 1031 1032 You can use MatFactorInfoInitialize() to set default values. 1033 1034 Level: developer 1035 1036 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor(), 1037 MatFactorInfoInitialize() 1038 1039 S*/ 1040 typedef struct { 1041 PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 1042 PetscReal usedt; 1043 PetscReal dt; /* drop tolerance */ 1044 PetscReal dtcol; /* tolerance for pivoting */ 1045 PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 1046 PetscReal fill; /* expected fill, nonzeros in factored matrix/nonzeros in original matrix */ 1047 PetscReal levels; /* ICC/ILU(levels) */ 1048 PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 1049 factorization may be faster if do not pivot */ 1050 PetscReal zeropivot; /* pivot is called zero if less than this */ 1051 PetscReal shifttype; /* type of shift added to matrix factor to prevent zero pivots */ 1052 PetscReal shiftamount; /* how large the shift is */ 1053 } MatFactorInfo; 1054 1055 PETSC_EXTERN PetscErrorCode MatFactorInfoInitialize(MatFactorInfo*); 1056 PETSC_EXTERN PetscErrorCode MatCholeskyFactor(Mat,IS,const MatFactorInfo*); 1057 PETSC_EXTERN PetscErrorCode MatCholeskyFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*); 1058 PETSC_EXTERN PetscErrorCode MatCholeskyFactorNumeric(Mat,Mat,const MatFactorInfo*); 1059 PETSC_EXTERN PetscErrorCode MatLUFactor(Mat,IS,IS,const MatFactorInfo*); 1060 PETSC_EXTERN PetscErrorCode MatILUFactor(Mat,IS,IS,const MatFactorInfo*); 1061 PETSC_EXTERN PetscErrorCode MatLUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*); 1062 PETSC_EXTERN PetscErrorCode MatILUFactorSymbolic(Mat,Mat,IS,IS,const MatFactorInfo*); 1063 PETSC_EXTERN PetscErrorCode MatICCFactorSymbolic(Mat,Mat,IS,const MatFactorInfo*); 1064 PETSC_EXTERN PetscErrorCode MatICCFactor(Mat,IS,const MatFactorInfo*); 1065 PETSC_EXTERN PetscErrorCode MatLUFactorNumeric(Mat,Mat,const MatFactorInfo*); 1066 PETSC_EXTERN PetscErrorCode MatGetInertia(Mat,PetscInt*,PetscInt*,PetscInt*); 1067 PETSC_EXTERN PetscErrorCode MatSolve(Mat,Vec,Vec); 1068 PETSC_EXTERN PetscErrorCode MatForwardSolve(Mat,Vec,Vec); 1069 PETSC_EXTERN PetscErrorCode MatBackwardSolve(Mat,Vec,Vec); 1070 PETSC_EXTERN PetscErrorCode MatSolveAdd(Mat,Vec,Vec,Vec); 1071 PETSC_EXTERN PetscErrorCode MatSolveTranspose(Mat,Vec,Vec); 1072 PETSC_EXTERN PetscErrorCode MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 1073 PETSC_EXTERN PetscErrorCode MatSolves(Mat,Vecs,Vecs); 1074 1075 PETSC_EXTERN PetscErrorCode MatSetUnfactored(Mat); 1076 1077 /*E 1078 MatSORType - What type of (S)SOR to perform 1079 1080 Level: beginner 1081 1082 May be bitwise ORd together 1083 1084 Any additions/changes here MUST also be made in include/finclude/petscmat.h 1085 1086 MatSORType may be bitwise ORd together, so do not change the numbers 1087 1088 .seealso: MatSOR() 1089 E*/ 1090 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 1091 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 1092 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 1093 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 1094 PETSC_EXTERN PetscErrorCode MatSOR(Mat,Vec,PetscReal,MatSORType,PetscReal,PetscInt,PetscInt,Vec); 1095 1096 /* 1097 These routines are for efficiently computing Jacobians via finite differences. 1098 */ 1099 1100 /*J 1101 MatColoringType - String with the name of a PETSc matrix coloring or the creation function 1102 with an optional dynamic library name, for example 1103 http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 1104 1105 Level: beginner 1106 1107 .seealso: MatGetColoring() 1108 J*/ 1109 #define MatColoringType char* 1110 #define MATCOLORINGNATURAL "natural" 1111 #define MATCOLORINGSL "sl" 1112 #define MATCOLORINGLF "lf" 1113 #define MATCOLORINGID "id" 1114 1115 PETSC_EXTERN PetscErrorCode MatGetColoring(Mat,const MatColoringType,ISColoring*); 1116 PETSC_EXTERN PetscErrorCode MatColoringRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,MatColoringType,ISColoring *)); 1117 1118 /*MC 1119 MatColoringRegisterDynamic - Adds a new sparse matrix coloring to the 1120 matrix package. 1121 1122 Synopsis: 1123 PetscErrorCode MatColoringRegisterDynamic(const char *name_coloring,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatColoring)) 1124 1125 Not Collective 1126 1127 Input Parameters: 1128 + sname - name of Coloring (for example MATCOLORINGSL) 1129 . path - location of library where creation routine is 1130 . name - name of function that creates the Coloring type, a string 1131 - function - function pointer that creates the coloring 1132 1133 Level: developer 1134 1135 If dynamic libraries are used, then the fourth input argument (function) 1136 is ignored. 1137 1138 Sample usage: 1139 .vb 1140 MatColoringRegisterDynamic("my_color",/home/username/my_lib/lib/libO/solaris/mylib.a, 1141 "MyColor",MyColor); 1142 .ve 1143 1144 Then, your partitioner can be chosen with the procedural interface via 1145 $ MatColoringSetType(part,"my_color") 1146 or at runtime via the option 1147 $ -mat_coloring_type my_color 1148 1149 $PETSC_ARCH occuring in pathname will be replaced with appropriate values. 1150 1151 .keywords: matrix, Coloring, register 1152 1153 .seealso: MatColoringRegisterDestroy(), MatColoringRegisterAll() 1154 M*/ 1155 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1156 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 1157 #else 1158 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 1159 #endif 1160 1161 PETSC_EXTERN PetscBool MatColoringRegisterAllCalled; 1162 1163 PETSC_EXTERN PetscErrorCode MatColoringRegisterAll(const char[]); 1164 PETSC_EXTERN PetscErrorCode MatColoringRegisterDestroy(void); 1165 PETSC_EXTERN PetscErrorCode MatColoringPatch(Mat,PetscInt,PetscInt,ISColoringValue[],ISColoring*); 1166 1167 /*S 1168 MatFDColoring - Object for computing a sparse Jacobian via finite differences 1169 and coloring 1170 1171 Level: beginner 1172 1173 Concepts: coloring, sparse Jacobian, finite differences 1174 1175 .seealso: MatFDColoringCreate() 1176 S*/ 1177 typedef struct _p_MatFDColoring* MatFDColoring; 1178 1179 PETSC_EXTERN PetscErrorCode MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 1180 PETSC_EXTERN PetscErrorCode MatFDColoringDestroy(MatFDColoring*); 1181 PETSC_EXTERN PetscErrorCode MatFDColoringView(MatFDColoring,PetscViewer); 1182 PETSC_EXTERN PetscErrorCode MatFDColoringSetFunction(MatFDColoring,PetscErrorCode (*)(void),void*); 1183 PETSC_EXTERN PetscErrorCode MatFDColoringGetFunction(MatFDColoring,PetscErrorCode (**)(void),void**); 1184 PETSC_EXTERN PetscErrorCode MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 1185 PETSC_EXTERN PetscErrorCode MatFDColoringSetFromOptions(MatFDColoring); 1186 PETSC_EXTERN PetscErrorCode MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 1187 PETSC_EXTERN PetscErrorCode MatFDColoringSetF(MatFDColoring,Vec); 1188 PETSC_EXTERN PetscErrorCode MatFDColoringGetPerturbedColumns(MatFDColoring,PetscInt*,PetscInt*[]); 1189 1190 /*S 1191 MatTransposeColoring - Object for computing a sparse matrix product C=A*B^T via coloring 1192 1193 Level: beginner 1194 1195 Concepts: coloring, sparse matrix product 1196 1197 .seealso: MatTransposeColoringCreate() 1198 S*/ 1199 typedef struct _p_MatTransposeColoring* MatTransposeColoring; 1200 1201 PETSC_EXTERN PetscErrorCode MatTransposeColoringCreate(Mat,ISColoring,MatTransposeColoring *); 1202 PETSC_EXTERN PetscErrorCode MatTransColoringApplySpToDen(MatTransposeColoring,Mat,Mat); 1203 PETSC_EXTERN PetscErrorCode MatTransColoringApplyDenToSp(MatTransposeColoring,Mat,Mat); 1204 PETSC_EXTERN PetscErrorCode MatTransposeColoringDestroy(MatTransposeColoring*); 1205 1206 /* 1207 These routines are for partitioning matrices: currently used only 1208 for adjacency matrix, MatCreateMPIAdj(). 1209 */ 1210 1211 /*S 1212 MatPartitioning - Object for managing the partitioning of a matrix or graph 1213 1214 Level: beginner 1215 1216 Concepts: partitioning 1217 1218 .seealso: MatPartitioningCreate(), MatPartitioningType 1219 S*/ 1220 typedef struct _p_MatPartitioning* MatPartitioning; 1221 1222 /*J 1223 MatPartitioningType - String with the name of a PETSc matrix partitioning or the creation function 1224 with an optional dynamic library name, for example 1225 http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 1226 1227 Level: beginner 1228 dm 1229 .seealso: MatPartitioningCreate(), MatPartitioning 1230 J*/ 1231 #define MatPartitioningType char* 1232 #define MATPARTITIONINGCURRENT "current" 1233 #define MATPARTITIONINGSQUARE "square" 1234 #define MATPARTITIONINGPARMETIS "parmetis" 1235 #define MATPARTITIONINGCHACO "chaco" 1236 #define MATPARTITIONINGPARTY "party" 1237 #define MATPARTITIONINGPTSCOTCH "ptscotch" 1238 1239 1240 PETSC_EXTERN PetscErrorCode MatPartitioningCreate(MPI_Comm,MatPartitioning*); 1241 PETSC_EXTERN PetscErrorCode MatPartitioningSetType(MatPartitioning,const MatPartitioningType); 1242 PETSC_EXTERN PetscErrorCode MatPartitioningSetNParts(MatPartitioning,PetscInt); 1243 PETSC_EXTERN PetscErrorCode MatPartitioningSetAdjacency(MatPartitioning,Mat); 1244 PETSC_EXTERN PetscErrorCode MatPartitioningSetVertexWeights(MatPartitioning,const PetscInt[]); 1245 PETSC_EXTERN PetscErrorCode MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []); 1246 PETSC_EXTERN PetscErrorCode MatPartitioningApply(MatPartitioning,IS*); 1247 PETSC_EXTERN PetscErrorCode MatPartitioningDestroy(MatPartitioning*); 1248 1249 PETSC_EXTERN PetscErrorCode MatPartitioningRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatPartitioning)); 1250 1251 /*MC 1252 MatPartitioningRegisterDynamic - Adds a new sparse matrix partitioning to the 1253 matrix package. 1254 1255 Synopsis: 1256 PetscErrorCode MatPartitioningRegisterDynamic(const char *name_partitioning,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatPartitioning)) 1257 1258 Not Collective 1259 1260 Input Parameters: 1261 + sname - name of partitioning (for example MATPARTITIONINGCURRENT) or parmetis 1262 . path - location of library where creation routine is 1263 . name - name of function that creates the partitioning type, a string 1264 - function - function pointer that creates the partitioning type 1265 1266 Level: developer 1267 1268 If dynamic libraries are used, then the fourth input argument (function) 1269 is ignored. 1270 1271 Sample usage: 1272 .vb 1273 MatPartitioningRegisterDynamic("my_part",/home/username/my_lib/lib/libO/solaris/mylib.a, 1274 "MyPartCreate",MyPartCreate); 1275 .ve 1276 1277 Then, your partitioner can be chosen with the procedural interface via 1278 $ MatPartitioningSetType(part,"my_part") 1279 or at runtime via the option 1280 $ -mat_partitioning_type my_part 1281 1282 $PETSC_ARCH occuring in pathname will be replaced with appropriate values. 1283 1284 .keywords: matrix, partitioning, register 1285 1286 .seealso: MatPartitioningRegisterDestroy(), MatPartitioningRegisterAll() 1287 M*/ 1288 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1289 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 1290 #else 1291 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 1292 #endif 1293 1294 PETSC_EXTERN PetscBool MatPartitioningRegisterAllCalled; 1295 1296 PETSC_EXTERN PetscErrorCode MatPartitioningRegisterAll(const char[]); 1297 PETSC_EXTERN PetscErrorCode MatPartitioningRegisterDestroy(void); 1298 1299 PETSC_EXTERN PetscErrorCode MatPartitioningView(MatPartitioning,PetscViewer); 1300 PETSC_EXTERN PetscErrorCode MatPartitioningSetFromOptions(MatPartitioning); 1301 PETSC_EXTERN PetscErrorCode MatPartitioningGetType(MatPartitioning,const MatPartitioningType*); 1302 1303 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 1304 PETSC_EXTERN PetscErrorCode MatPartitioningParmetisGetEdgeCut(MatPartitioning, PetscInt *); 1305 1306 typedef enum { MP_CHACO_MULTILEVEL=1,MP_CHACO_SPECTRAL=2,MP_CHACO_LINEAR=4,MP_CHACO_RANDOM=5,MP_CHACO_SCATTERED=6 } MPChacoGlobalType; 1307 PETSC_EXTERN const char *const MPChacoGlobalTypes[]; 1308 typedef enum { MP_CHACO_KERNIGHAN=1,MP_CHACO_NONE=2 } MPChacoLocalType; 1309 PETSC_EXTERN const char *const MPChacoLocalTypes[]; 1310 typedef enum { MP_CHACO_LANCZOS=0,MP_CHACO_RQI=1 } MPChacoEigenType; 1311 PETSC_EXTERN const char *const MPChacoEigenTypes[]; 1312 1313 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetGlobal(MatPartitioning,MPChacoGlobalType); 1314 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetGlobal(MatPartitioning,MPChacoGlobalType*); 1315 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetLocal(MatPartitioning,MPChacoLocalType); 1316 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetLocal(MatPartitioning,MPChacoLocalType*); 1317 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetCoarseLevel(MatPartitioning,PetscReal); 1318 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenSolver(MatPartitioning,MPChacoEigenType); 1319 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenSolver(MatPartitioning,MPChacoEigenType*); 1320 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenTol(MatPartitioning,PetscReal); 1321 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenTol(MatPartitioning,PetscReal*); 1322 PETSC_EXTERN PetscErrorCode MatPartitioningChacoSetEigenNumber(MatPartitioning,PetscInt); 1323 PETSC_EXTERN PetscErrorCode MatPartitioningChacoGetEigenNumber(MatPartitioning,PetscInt*); 1324 1325 #define MP_PARTY_OPT "opt" 1326 #define MP_PARTY_LIN "lin" 1327 #define MP_PARTY_SCA "sca" 1328 #define MP_PARTY_RAN "ran" 1329 #define MP_PARTY_GBF "gbf" 1330 #define MP_PARTY_GCF "gcf" 1331 #define MP_PARTY_BUB "bub" 1332 #define MP_PARTY_DEF "def" 1333 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetGlobal(MatPartitioning,const char*); 1334 #define MP_PARTY_HELPFUL_SETS "hs" 1335 #define MP_PARTY_KERNIGHAN_LIN "kl" 1336 #define MP_PARTY_NONE "no" 1337 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetLocal(MatPartitioning,const char*); 1338 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetCoarseLevel(MatPartitioning,PetscReal); 1339 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetBipart(MatPartitioning,PetscBool); 1340 PETSC_EXTERN PetscErrorCode MatPartitioningPartySetMatchOptimization(MatPartitioning,PetscBool); 1341 1342 typedef enum { MP_PTSCOTCH_QUALITY,MP_PTSCOTCH_SPEED,MP_PTSCOTCH_BALANCE,MP_PTSCOTCH_SAFETY,MP_PTSCOTCH_SCALABILITY } MPPTScotchStrategyType; 1343 PETSC_EXTERN const char *const MPPTScotchStrategyTypes[]; 1344 1345 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetImbalance(MatPartitioning,PetscReal); 1346 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetImbalance(MatPartitioning,PetscReal*); 1347 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchSetStrategy(MatPartitioning,MPPTScotchStrategyType); 1348 PETSC_EXTERN PetscErrorCode MatPartitioningPTScotchGetStrategy(MatPartitioning,MPPTScotchStrategyType*); 1349 1350 /* 1351 These routines are for coarsening matrices: 1352 */ 1353 1354 /*S 1355 MatCoarsen - Object for managing the coarsening of a graph (symmetric matrix) 1356 1357 Level: beginner 1358 1359 Concepts: coarsen 1360 1361 .seealso: MatCoarsenCreate), MatCoarsenType 1362 S*/ 1363 typedef struct _p_MatCoarsen* MatCoarsen; 1364 1365 /*J 1366 MatCoarsenType - String with the name of a PETSc matrix coarsen or the creation function 1367 with an optional dynamic library name, for example 1368 http://www.mcs.anl.gov/petsc/lib.a:coarsencreate() 1369 1370 Level: beginner 1371 dm 1372 .seealso: MatCoarsenCreate(), MatCoarsen 1373 J*/ 1374 #define MatCoarsenType char* 1375 #define MATCOARSENMIS "mis" 1376 #define MATCOARSENHEM "hem" 1377 1378 /* linked list for aggregates */ 1379 typedef struct _PetscCDIntNd{ 1380 struct _PetscCDIntNd *next; 1381 PetscInt gid; 1382 }PetscCDIntNd; 1383 1384 /* only used by node pool */ 1385 typedef struct _PetscCDArrNd{ 1386 struct _PetscCDArrNd *next; 1387 struct _PetscCDIntNd *array; 1388 }PetscCDArrNd; 1389 1390 typedef struct _PetscCoarsenData{ 1391 /* node pool */ 1392 PetscCDArrNd pool_list; 1393 PetscCDIntNd *new_node; 1394 PetscInt new_left; 1395 PetscInt chk_sz; 1396 PetscCDIntNd *extra_nodes; 1397 /* Array of lists */ 1398 PetscCDIntNd **array; 1399 PetscInt size; 1400 /* cache a Mat for communication data */ 1401 Mat mat; 1402 /* cache IS of removed equations */ 1403 IS removedIS; 1404 }PetscCoarsenData; 1405 1406 PETSC_EXTERN PetscErrorCode MatCoarsenCreate(MPI_Comm,MatCoarsen*); 1407 PETSC_EXTERN PetscErrorCode MatCoarsenSetType(MatCoarsen,const MatCoarsenType); 1408 PETSC_EXTERN PetscErrorCode MatCoarsenSetAdjacency(MatCoarsen,Mat); 1409 PETSC_EXTERN PetscErrorCode MatCoarsenSetGreedyOrdering(MatCoarsen,const IS); 1410 PETSC_EXTERN PetscErrorCode MatCoarsenSetStrictAggs(MatCoarsen,PetscBool); 1411 PETSC_EXTERN PetscErrorCode MatCoarsenSetVerbose(MatCoarsen,PetscInt); 1412 PETSC_EXTERN PetscErrorCode MatCoarsenGetData( MatCoarsen, PetscCoarsenData ** ); 1413 PETSC_EXTERN PetscErrorCode MatCoarsenApply(MatCoarsen); 1414 PETSC_EXTERN PetscErrorCode MatCoarsenDestroy(MatCoarsen*); 1415 1416 PETSC_EXTERN PetscErrorCode MatCoarsenRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatCoarsen)); 1417 1418 /*MC 1419 MatCoarsenRegisterDynamic - Adds a new sparse matrix coarsen to the 1420 matrix package. 1421 1422 Synopsis: 1423 PetscErrorCode MatCoarsenRegisterDynamic(const char *name_coarsen,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatCoarsen)) 1424 1425 Not Collective 1426 1427 Input Parameters: 1428 + sname - name of coarsen (for example MATCOARSENMIS) 1429 . path - location of library where creation routine is 1430 . name - name of function that creates the coarsen type, a string 1431 - function - function pointer that creates the coarsen type 1432 1433 Level: developer 1434 1435 If dynamic libraries are used, then the fourth input argument (function) 1436 is ignored. 1437 1438 Sample usage: 1439 .vb 1440 MatCoarsenRegisterDynamic("my_agg",/home/username/my_lib/lib/libO/solaris/mylib.a, 1441 "MyAggCreate",MyAggCreate); 1442 .ve 1443 1444 Then, your aggregator can be chosen with the procedural interface via 1445 $ MatCoarsenSetType(agg,"my_agg") 1446 or at runtime via the option 1447 $ -mat_coarsen_type my_agg 1448 1449 $PETSC_ARCH occuring in pathname will be replaced with appropriate values. 1450 1451 .keywords: matrix, coarsen, register 1452 1453 .seealso: MatCoarsenRegisterDestroy(), MatCoarsenRegisterAll() 1454 M*/ 1455 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1456 #define MatCoarsenRegisterDynamic(a,b,c,d) MatCoarsenRegister(a,b,c,0) 1457 #else 1458 #define MatCoarsenRegisterDynamic(a,b,c,d) MatCoarsenRegister(a,b,c,d) 1459 #endif 1460 1461 PETSC_EXTERN PetscBool MatCoarsenRegisterAllCalled; 1462 1463 PETSC_EXTERN PetscErrorCode MatCoarsenRegisterAll(const char[]); 1464 PETSC_EXTERN PetscErrorCode MatCoarsenRegisterDestroy(void); 1465 1466 PETSC_EXTERN PetscErrorCode MatCoarsenView(MatCoarsen,PetscViewer); 1467 PETSC_EXTERN PetscErrorCode MatCoarsenSetFromOptions(MatCoarsen); 1468 PETSC_EXTERN PetscErrorCode MatCoarsenGetType(MatCoarsen,const MatCoarsenType*); 1469 1470 1471 PETSC_EXTERN PetscErrorCode MatMeshToVertexGraph(Mat,PetscInt,Mat*); 1472 PETSC_EXTERN PetscErrorCode MatMeshToCellGraph(Mat,PetscInt,Mat*); 1473 1474 /* 1475 If you add entries here you must also add them to finclude/petscmat.h 1476 */ 1477 typedef enum { MATOP_SET_VALUES=0, 1478 MATOP_GET_ROW=1, 1479 MATOP_RESTORE_ROW=2, 1480 MATOP_MULT=3, 1481 MATOP_MULT_ADD=4, 1482 MATOP_MULT_TRANSPOSE=5, 1483 MATOP_MULT_TRANSPOSE_ADD=6, 1484 MATOP_SOLVE=7, 1485 MATOP_SOLVE_ADD=8, 1486 MATOP_SOLVE_TRANSPOSE=9, 1487 MATOP_SOLVE_TRANSPOSE_ADD=10, 1488 MATOP_LUFACTOR=11, 1489 MATOP_CHOLESKYFACTOR=12, 1490 MATOP_SOR=13, 1491 MATOP_TRANSPOSE=14, 1492 MATOP_GETINFO=15, 1493 MATOP_EQUAL=16, 1494 MATOP_GET_DIAGONAL=17, 1495 MATOP_DIAGONAL_SCALE=18, 1496 MATOP_NORM=19, 1497 MATOP_ASSEMBLY_BEGIN=20, 1498 MATOP_ASSEMBLY_END=21, 1499 MATOP_SET_OPTION=22, 1500 MATOP_ZERO_ENTRIES=23, 1501 MATOP_ZERO_ROWS=24, 1502 MATOP_LUFACTOR_SYMBOLIC=25, 1503 MATOP_LUFACTOR_NUMERIC=26, 1504 MATOP_CHOLESKY_FACTOR_SYMBOLIC=27, 1505 MATOP_CHOLESKY_FACTOR_NUMERIC=28, 1506 MATOP_SETUP_PREALLOCATION=29, 1507 MATOP_ILUFACTOR_SYMBOLIC=30, 1508 MATOP_ICCFACTOR_SYMBOLIC=31, 1509 MATOP_GET_ARRAY=32, 1510 MATOP_RESTORE_ARRAY=33, 1511 MATOP_DUPLICATE=34, 1512 MATOP_FORWARD_SOLVE=35, 1513 MATOP_BACKWARD_SOLVE=36, 1514 MATOP_ILUFACTOR=37, 1515 MATOP_ICCFACTOR=38, 1516 MATOP_AXPY=39, 1517 MATOP_GET_SUBMATRICES=40, 1518 MATOP_INCREASE_OVERLAP=41, 1519 MATOP_GET_VALUES=42, 1520 MATOP_COPY=43, 1521 MATOP_GET_ROW_MAX=44, 1522 MATOP_SCALE=45, 1523 MATOP_SHIFT=46, 1524 MATOP_DIAGONAL_SET=47, 1525 MATOP_ILUDT_FACTOR=48, 1526 MATOP_SET_BLOCK_SIZE=49, 1527 MATOP_GET_ROW_IJ=50, 1528 MATOP_RESTORE_ROW_IJ=51, 1529 MATOP_GET_COLUMN_IJ=52, 1530 MATOP_RESTORE_COLUMN_IJ=53, 1531 MATOP_FDCOLORING_CREATE=54, 1532 MATOP_COLORING_PATCH=55, 1533 MATOP_SET_UNFACTORED=56, 1534 MATOP_PERMUTE=57, 1535 MATOP_SET_VALUES_BLOCKED=58, 1536 MATOP_GET_SUBMATRIX=59, 1537 MATOP_DESTROY=60, 1538 MATOP_VIEW=61, 1539 MATOP_CONVERT_FROM=62, 1540 MATOP_SET_LOCAL_TO_GLOBAL_MAP=66, 1541 MATOP_SET_VALUES_LOCAL=67, 1542 MATOP_ZERO_ROWS_LOCAL=68, 1543 MATOP_GET_ROW_MAX_ABS=69, 1544 MATOP_GET_ROW_MIN_ABS=70, 1545 MATOP_CONVERT=71, 1546 MATOP_SET_COLORING=72, 1547 MATOP_SET_VALUES_ADIC=73, 1548 MATOP_SET_VALUES_ADIFOR=74, 1549 MATOP_FD_COLORING_APPLY=75, 1550 MATOP_SET_FROM_OPTIONS=76, 1551 MATOP_MULT_CONSTRAINED=77, 1552 MATOP_MULT_TRANSPOSE_CONSTRAIN=78, 1553 MATOP_PERMUTE_SPARSIFY=79, 1554 MATOP_MULT_MULTIPLE=80, 1555 MATOP_SOLVE_MULTIPLE=81, 1556 MATOP_GET_INERTIA=82, 1557 MATOP_LOAD=83, 1558 MATOP_IS_SYMMETRIC=84, 1559 MATOP_IS_HERMITIAN=85, 1560 MATOP_IS_STRUCTURALLY_SYMMETRIC=86, 1561 MATOP_DUMMY=87, 1562 MATOP_GET_VECS=88, 1563 MATOP_MAT_MULT=89, 1564 MATOP_MAT_MULT_SYMBOLIC=90, 1565 MATOP_MAT_MULT_NUMERIC=91, 1566 MATOP_PTAP=92, 1567 MATOP_PTAP_SYMBOLIC=93, 1568 MATOP_PTAP_NUMERIC=94, 1569 MATOP_MAT_TRANSPOSE_MULT=95, 1570 MATOP_MAT_TRANSPOSE_MULT_SYMBO=96, 1571 MATOP_MAT_TRANSPOSE_MULT_NUMER=97, 1572 MATOP_PTAP_SYMBOLIC_SEQAIJ=98, 1573 MATOP_PTAP_NUMERIC_SEQAIJ=99, 1574 MATOP_PTAP_SYMBOLIC_MPIAIJ=100, 1575 MATOP_PTAP_NUMERIC_MPIAIJ=101, 1576 MATOP_CONJUGATE=102, 1577 MATOP_SET_SIZES=103, 1578 MATOP_SET_VALUES_ROW=104, 1579 MATOP_REAL_PART=105, 1580 MATOP_IMAGINARY_PART=106, 1581 MATOP_GET_ROW_UPPER_TRIANGULAR=107, 1582 MATOP_RESTORE_ROW_UPPER_TRIANG=108, 1583 MATOP_MAT_SOLVE=109, 1584 MATOP_GET_REDUNDANT_MATRIX=110, 1585 MATOP_GET_ROW_MIN=111, 1586 MATOP_GET_COLUMN_VECTOR=112, 1587 MATOP_MISSING_DIAGONAL=113, 1588 MATOP_GET_SEQ_NONZERO_STRUCTUR=114, 1589 MATOP_CREATE=115, 1590 MATOP_GET_GHOSTS=116, 1591 MATOP_GET_LOCAL_SUB_MATRIX=117, 1592 MATOP_RESTORE_LOCALSUB_MATRIX=118, 1593 MATOP_MULT_DIAGONAL_BLOCK=119, 1594 MATOP_HERMITIAN_TRANSPOSE=120, 1595 MATOP_MULT_HERMITIAN_TRANSPOSE=121, 1596 MATOP_MULT_HERMITIAN_TRANS_ADD=122, 1597 MATOP_GET_MULTI_PROC_BLOCK=123, 1598 MATOP_GET_COLUMN_NORMS=125, 1599 MATOP_GET_SUB_MATRICES_PARALLE=128, 1600 MATOP_SET_VALUES_BATCH=129, 1601 MATOP_TRANSPOSE_MAT_MULT=130, 1602 MATOP_TRANSPOSE_MAT_MULT_SYMBO=131, 1603 MATOP_TRANSPOSE_MAT_MULT_NUMER=132, 1604 MATOP_TRANSPOSE_COLORING_CREAT=133, 1605 MATOP_TRANS_COLORING_APPLY_SPT=134, 1606 MATOP_TRANS_COLORING_APPLY_DEN=135, 1607 MATOP_RART=136, 1608 MATOP_RART_SYMBOLIC=137, 1609 MATOP_RART_NUMERIC=138, 1610 MATOP_SET_BLOCK_SIZES=139, 1611 MATOP_AYPX=140 1612 } MatOperation; 1613 PETSC_EXTERN PetscErrorCode MatHasOperation(Mat,MatOperation,PetscBool *); 1614 PETSC_EXTERN PetscErrorCode MatShellSetOperation(Mat,MatOperation,void(*)(void)); 1615 PETSC_EXTERN PetscErrorCode MatShellGetOperation(Mat,MatOperation,void(**)(void)); 1616 PETSC_EXTERN PetscErrorCode MatShellSetContext(Mat,void*); 1617 1618 /* 1619 Codes for matrices stored on disk. By default they are 1620 stored in a universal format. By changing the format with 1621 PetscViewerSetFormat(viewer,PETSC_VIEWER_NATIVE); the matrices will 1622 be stored in a way natural for the matrix, for example dense matrices 1623 would be stored as dense. Matrices stored this way may only be 1624 read into matrices of the same type. 1625 */ 1626 #define MATRIX_BINARY_FORMAT_DENSE -1 1627 1628 PETSC_EXTERN PetscErrorCode MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 1629 PETSC_EXTERN PetscErrorCode MatISGetLocalMat(Mat,Mat*); 1630 PETSC_EXTERN PetscErrorCode MatISSetLocalMat(Mat,Mat); 1631 1632 /*S 1633 MatNullSpace - Object that removes a null space from a vector, i.e. 1634 orthogonalizes the vector to a subsapce 1635 1636 Level: advanced 1637 1638 Concepts: matrix; linear operator, null space 1639 1640 Users manual sections: 1641 . sec_singular 1642 1643 .seealso: MatNullSpaceCreate() 1644 S*/ 1645 typedef struct _p_MatNullSpace* MatNullSpace; 1646 1647 PETSC_EXTERN PetscErrorCode MatNullSpaceCreate(MPI_Comm,PetscBool ,PetscInt,const Vec[],MatNullSpace*); 1648 PETSC_EXTERN PetscErrorCode MatNullSpaceSetFunction(MatNullSpace,PetscErrorCode (*)(MatNullSpace,Vec,void*),void*); 1649 PETSC_EXTERN PetscErrorCode MatNullSpaceDestroy(MatNullSpace*); 1650 PETSC_EXTERN PetscErrorCode MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 1651 PETSC_EXTERN PetscErrorCode MatGetNullSpace(Mat, MatNullSpace *); 1652 PETSC_EXTERN PetscErrorCode MatSetNullSpace(Mat,MatNullSpace); 1653 PETSC_EXTERN PetscErrorCode MatSetNearNullSpace(Mat,MatNullSpace); 1654 PETSC_EXTERN PetscErrorCode MatGetNearNullSpace(Mat,MatNullSpace*); 1655 PETSC_EXTERN PetscErrorCode MatNullSpaceTest(MatNullSpace,Mat,PetscBool *); 1656 PETSC_EXTERN PetscErrorCode MatNullSpaceView(MatNullSpace,PetscViewer); 1657 PETSC_EXTERN PetscErrorCode MatNullSpaceGetVecs(MatNullSpace,PetscBool*,PetscInt*,const Vec**); 1658 PETSC_EXTERN PetscErrorCode MatNullSpaceCreateRigidBody(Vec,MatNullSpace*); 1659 1660 PETSC_EXTERN PetscErrorCode MatReorderingSeqSBAIJ(Mat,IS); 1661 PETSC_EXTERN PetscErrorCode MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 1662 PETSC_EXTERN PetscErrorCode MatSeqSBAIJSetColumnIndices(Mat,PetscInt *); 1663 PETSC_EXTERN PetscErrorCode MatSeqBAIJInvertBlockDiagonal(Mat); 1664 1665 PETSC_EXTERN PetscErrorCode MatCreateMAIJ(Mat,PetscInt,Mat*); 1666 PETSC_EXTERN PetscErrorCode MatMAIJRedimension(Mat,PetscInt,Mat*); 1667 PETSC_EXTERN PetscErrorCode MatMAIJGetAIJ(Mat,Mat*); 1668 1669 PETSC_EXTERN PetscErrorCode MatComputeExplicitOperator(Mat,Mat*); 1670 1671 PETSC_EXTERN PetscErrorCode MatDiagonalScaleLocal(Mat,Vec); 1672 1673 PETSC_EXTERN PetscErrorCode MatCreateMFFD(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,Mat*); 1674 PETSC_EXTERN PetscErrorCode MatMFFDSetBase(Mat,Vec,Vec); 1675 PETSC_EXTERN PetscErrorCode MatMFFDSetFunction(Mat,PetscErrorCode(*)(void*,Vec,Vec),void*); 1676 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioni(Mat,PetscErrorCode (*)(void*,PetscInt,Vec,PetscScalar*)); 1677 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctioniBase(Mat,PetscErrorCode (*)(void*,Vec)); 1678 PETSC_EXTERN PetscErrorCode MatMFFDAddNullSpace(Mat,MatNullSpace); 1679 PETSC_EXTERN PetscErrorCode MatMFFDSetHHistory(Mat,PetscScalar[],PetscInt); 1680 PETSC_EXTERN PetscErrorCode MatMFFDResetHHistory(Mat); 1681 PETSC_EXTERN PetscErrorCode MatMFFDSetFunctionError(Mat,PetscReal); 1682 PETSC_EXTERN PetscErrorCode MatMFFDSetPeriod(Mat,PetscInt); 1683 PETSC_EXTERN PetscErrorCode MatMFFDGetH(Mat,PetscScalar *); 1684 PETSC_EXTERN PetscErrorCode MatMFFDSetOptionsPrefix(Mat,const char[]); 1685 PETSC_EXTERN PetscErrorCode MatMFFDCheckPositivity(void*,Vec,Vec,PetscScalar*); 1686 PETSC_EXTERN PetscErrorCode MatMFFDSetCheckh(Mat,PetscErrorCode (*)(void*,Vec,Vec,PetscScalar*),void*); 1687 1688 /*S 1689 MatMFFD - A data structured used to manage the computation of the h differencing parameter for matrix-free 1690 Jacobian vector products 1691 1692 Notes: MATMFFD is a specific MatType which uses the MatMFFD data structure 1693 1694 MatMFFD*() methods actually take the Mat as their first argument. Not a MatMFFD data structure 1695 1696 Level: developer 1697 1698 .seealso: MATMFFD, MatCreateMFFD(), MatMFFDSetFuction(), MatMFFDSetType(), MatMFFDRegister() 1699 S*/ 1700 typedef struct _p_MatMFFD* MatMFFD; 1701 1702 /*J 1703 MatMFFDType - algorithm used to compute the h used in computing matrix-vector products via differencing of the function 1704 1705 Level: beginner 1706 1707 .seealso: MatMFFDSetType(), MatMFFDRegister() 1708 J*/ 1709 #define MatMFFDType char* 1710 #define MATMFFD_DS "ds" 1711 #define MATMFFD_WP "wp" 1712 1713 PETSC_EXTERN PetscErrorCode MatMFFDSetType(Mat,const MatMFFDType); 1714 PETSC_EXTERN PetscErrorCode MatMFFDRegister(const char[],const char[],const char[],PetscErrorCode (*)(MatMFFD)); 1715 1716 /*MC 1717 MatMFFDRegisterDynamic - Adds a method to the MatMFFD registry. 1718 1719 Synopsis: 1720 PetscErrorCode MatMFFDRegisterDynamic(const char *name_solver,const char *path,const char *name_create,PetscErrorCode (*routine_create)(MatMFFD)) 1721 1722 Not Collective 1723 1724 Input Parameters: 1725 + name_solver - name of a new user-defined compute-h module 1726 . path - path (either absolute or relative) the library containing this solver 1727 . name_create - name of routine to create method context 1728 - routine_create - routine to create method context 1729 1730 Level: developer 1731 1732 Notes: 1733 MatMFFDRegisterDynamic() may be called multiple times to add several user-defined solvers. 1734 1735 If dynamic libraries are used, then the fourth input argument (routine_create) 1736 is ignored. 1737 1738 Sample usage: 1739 .vb 1740 MatMFFDRegisterDynamic("my_h",/home/username/my_lib/lib/libO/solaris/mylib.a, 1741 "MyHCreate",MyHCreate); 1742 .ve 1743 1744 Then, your solver can be chosen with the procedural interface via 1745 $ MatMFFDSetType(mfctx,"my_h") 1746 or at runtime via the option 1747 $ -snes_mf_type my_h 1748 1749 .keywords: MatMFFD, register 1750 1751 .seealso: MatMFFDRegisterAll(), MatMFFDRegisterDestroy() 1752 M*/ 1753 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1754 #define MatMFFDRegisterDynamic(a,b,c,d) MatMFFDRegister(a,b,c,0) 1755 #else 1756 #define MatMFFDRegisterDynamic(a,b,c,d) MatMFFDRegister(a,b,c,d) 1757 #endif 1758 1759 PETSC_EXTERN PetscErrorCode MatMFFDRegisterAll(const char[]); 1760 PETSC_EXTERN PetscErrorCode MatMFFDRegisterDestroy(void); 1761 PETSC_EXTERN PetscErrorCode MatMFFDDSSetUmin(Mat,PetscReal); 1762 PETSC_EXTERN PetscErrorCode MatMFFDWPSetComputeNormU(Mat,PetscBool ); 1763 1764 1765 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutMatrix(PetscViewer, PetscInt, PetscInt, PetscReal *); 1766 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutCSRMatrix(PetscViewer, PetscInt, PetscInt, PetscInt *, PetscInt *, PetscReal *); 1767 1768 /* 1769 PETSc interface to MUMPS 1770 */ 1771 #ifdef PETSC_HAVE_MUMPS 1772 PETSC_EXTERN PetscErrorCode MatMumpsSetIcntl(Mat,PetscInt,PetscInt); 1773 #endif 1774 1775 /* 1776 PETSc interface to SUPERLU 1777 */ 1778 #ifdef PETSC_HAVE_SUPERLU 1779 PETSC_EXTERN PetscErrorCode MatSuperluSetILUDropTol(Mat,PetscReal); 1780 #endif 1781 1782 #if defined PETSC_HAVE_TXPETSCGPU 1783 1784 /*E 1785 MatCUSPARSEStorageFormat - indicates the storage format for CUSPARSE (GPU) 1786 matrices. 1787 1788 Not Collective 1789 1790 + MAT_CUSPARSE_CSR : Compressed Sparse Row 1791 . MAT_CUSPARSE_ELL : Ellpack 1792 - MAT_CUSPARSE_HYB : Hybrid, a combination of Ellpack and Coordinate format. 1793 1794 Level: intermediate 1795 1796 Any additions/changes here MUST also be made in include/finclude/petscmat.h 1797 1798 .seealso: MatCUSPARSESetFormat(), MatCUSPARSEFormatOperation 1799 E*/ 1800 1801 typedef enum {MAT_CUSPARSE_CSR, MAT_CUSPARSE_ELL, MAT_CUSPARSE_HYB} MatCUSPARSEStorageFormat; 1802 1803 /* these will be strings associated with enumerated type defined above */ 1804 PETSC_EXTERN const char *const MatCUSPARSEStorageFormats[]; 1805 1806 /*E 1807 MatCUSPARSEFormatOperation - indicates the operation of CUSPARSE (GPU) 1808 matrices whose operation should use a particular storage format. 1809 1810 Not Collective 1811 1812 + MAT_CUSPARSE_MULT_DIAG : sets the storage format for the diagonal matrix in the parallel MatMult 1813 . MAT_CUSPARSE_MULT_OFFDIAG : sets the storage format for the offdiagonal matrix in the parallel MatMult 1814 . MAT_CUSPARSE_MULT : sets the storage format for the entire matrix in the serial (single GPU) MatMult 1815 . MAT_CUSPARSE_SOLVE : sets the storage format for the triangular factors in the serial (single GPU) MatSolve 1816 - MAT_CUSPARSE_ALL : sets the storage format for all CUSPARSE (GPU) matrices 1817 1818 Level: intermediate 1819 1820 .seealso: MatCUSPARSESetFormat(), MatCUSPARSEStorageFormat 1821 E*/ 1822 typedef enum {MAT_CUSPARSE_MULT_DIAG, MAT_CUSPARSE_MULT_OFFDIAG, MAT_CUSPARSE_MULT, MAT_CUSPARSE_SOLVE, MAT_CUSPARSE_ALL} MatCUSPARSEFormatOperation; 1823 1824 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCUSPARSE(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 1825 PETSC_EXTERN PetscErrorCode MatCreateAIJCUSPARSE(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 1826 PETSC_EXTERN PetscErrorCode MatCUSPARSESetFormat(Mat,MatCUSPARSEFormatOperation,MatCUSPARSEStorageFormat); 1827 1828 #endif 1829 1830 #if defined(PETSC_HAVE_CUSP) 1831 PETSC_EXTERN PetscErrorCode MatCreateSeqAIJCUSP(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Mat*); 1832 PETSC_EXTERN PetscErrorCode MatCreateAIJCUSP(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Mat*); 1833 1834 /*E 1835 MatCUSPStorageFormat - indicates the storage format for CUSP (GPU) 1836 matrices. 1837 1838 Not Collective 1839 1840 + MAT_CUSP_CSR : Compressed Sparse Row 1841 . MAT_CUSP_DIA : Diagonal 1842 - MAT_CUSP_ELL : Ellpack 1843 1844 Level: intermediate 1845 1846 Any additions/changes here MUST also be made in include/finclude/petscmat.h 1847 1848 .seealso: MatCUSPSetFormat(), MatCUSPFormatOperation 1849 E*/ 1850 typedef enum {MAT_CUSP_CSR, MAT_CUSP_DIA, MAT_CUSP_ELL} MatCUSPStorageFormat; 1851 1852 /* these will be strings associated with enumerated type defined above */ 1853 PETSC_EXTERN const char *const MatCUSPStorageFormats[]; 1854 1855 /*E 1856 MatCUSPFormatOperation - indicates the operation of CUSP (GPU) 1857 matrices whose operation should use a particular storage format. 1858 1859 Not Collective 1860 1861 + MAT_CUSP_MULT_DIAG : sets the storage format for the diagonal matrix in the parallel MatMult 1862 . MAT_CUSP_MULT_OFFDIAG : sets the storage format for the offdiagonal matrix in the parallel MatMult 1863 . MAT_CUSP_MULT : sets the storage format for the entire matrix in the serial (single GPU) MatMult 1864 . MAT_CUSP_SOLVE : sets the storage format for the triangular factors in the serial (single GPU) MatSolve 1865 - MAT_CUSP_ALL : sets the storage format for all CUSP (GPU) matrices 1866 1867 Level: intermediate 1868 1869 Any additions/changes here MUST also be made in include/finclude/petscmat.h 1870 1871 .seealso: MatCUSPSetFormat(), MatCUSPStorageFormat 1872 E*/ 1873 typedef enum {MAT_CUSP_MULT_DIAG, MAT_CUSP_MULT_OFFDIAG, MAT_CUSP_MULT, MAT_CUSP_SOLVE, MAT_CUSP_ALL} MatCUSPFormatOperation; 1874 1875 PETSC_EXTERN PetscErrorCode MatCUSPSetFormat(Mat,MatCUSPFormatOperation,MatCUSPStorageFormat); 1876 #endif 1877 1878 /* 1879 PETSc interface to FFTW 1880 */ 1881 #if defined(PETSC_HAVE_FFTW) 1882 PETSC_EXTERN PetscErrorCode VecScatterPetscToFFTW(Mat,Vec,Vec); 1883 PETSC_EXTERN PetscErrorCode VecScatterFFTWToPetsc(Mat,Vec,Vec); 1884 PETSC_EXTERN PetscErrorCode MatGetVecsFFTW(Mat,Vec*,Vec*,Vec*); 1885 #endif 1886 1887 #if defined(PETSC_HAVE_ELEMENTAL) 1888 PETSC_EXTERN PetscErrorCode PetscElementalInitializePackage(const char*); 1889 PETSC_EXTERN PetscErrorCode PetscElementalFinalizePackage(void); 1890 #endif 1891 1892 PETSC_EXTERN PetscErrorCode MatCreateNest(MPI_Comm,PetscInt,const IS[],PetscInt,const IS[],const Mat[],Mat*); 1893 PETSC_EXTERN PetscErrorCode MatNestGetSize(Mat,PetscInt*,PetscInt*); 1894 PETSC_EXTERN PetscErrorCode MatNestGetISs(Mat,IS[],IS[]); 1895 PETSC_EXTERN PetscErrorCode MatNestGetLocalISs(Mat,IS[],IS[]); 1896 PETSC_EXTERN PetscErrorCode MatNestGetSubMats(Mat,PetscInt*,PetscInt*,Mat***); 1897 PETSC_EXTERN PetscErrorCode MatNestGetSubMat(Mat,PetscInt,PetscInt,Mat*); 1898 PETSC_EXTERN PetscErrorCode MatNestSetVecType(Mat,const VecType); 1899 PETSC_EXTERN PetscErrorCode MatNestSetSubMats(Mat,PetscInt,const IS[],PetscInt,const IS[],const Mat[]); 1900 PETSC_EXTERN PetscErrorCode MatNestSetSubMat(Mat,PetscInt,PetscInt,Mat); 1901 1902 /* 1903 MatIJ: 1904 An unweighted directed pseudograph 1905 An interpretation of this matrix as a (pseudo)graph allows us to define additional operations on it: 1906 A MatIJ can act on sparse arrays: arrays of indices, or index arrays of integers, scalars, or integer-scalar pairs 1907 by mapping the indices to the indices connected to them by the (pseudo)graph ed 1908 */ 1909 typedef enum {MATIJ_LOCAL, MATIJ_GLOBAL} MatIJIndexType; 1910 PETSC_EXTERN PetscErrorCode MatIJSetMultivalued(Mat, PetscBool); 1911 PETSC_EXTERN PetscErrorCode MatIJGetMultivalued(Mat, PetscBool*); 1912 PETSC_EXTERN PetscErrorCode MatIJSetEdges(Mat, PetscInt, const PetscInt*, const PetscInt*); 1913 PETSC_EXTERN PetscErrorCode MatIJGetEdges(Mat, PetscInt *, PetscInt **, PetscInt **); 1914 PETSC_EXTERN PetscErrorCode MatIJSetEdgesIS(Mat, IS, IS); 1915 PETSC_EXTERN PetscErrorCode MatIJGetEdgesIS(Mat, IS*, IS*); 1916 PETSC_EXTERN PetscErrorCode MatIJGetRowSizes(Mat, MatIJIndexType, PetscInt, const PetscInt *, PetscInt **); 1917 PETSC_EXTERN PetscErrorCode MatIJGetMinRowSize(Mat, PetscInt *); 1918 PETSC_EXTERN PetscErrorCode MatIJGetMaxRowSize(Mat, PetscInt *); 1919 PETSC_EXTERN PetscErrorCode MatIJGetSupport(Mat, PetscInt *, PetscInt **); 1920 PETSC_EXTERN PetscErrorCode MatIJGetSupportIS(Mat, IS *); 1921 PETSC_EXTERN PetscErrorCode MatIJGetImage(Mat, PetscInt*, PetscInt**); 1922 PETSC_EXTERN PetscErrorCode MatIJGetImageIS(Mat, IS *); 1923 PETSC_EXTERN PetscErrorCode MatIJGetSupportSize(Mat, PetscInt *); 1924 PETSC_EXTERN PetscErrorCode MatIJGetImageSize(Mat, PetscInt *); 1925 1926 PETSC_EXTERN PetscErrorCode MatIJBinRenumber(Mat, Mat*); 1927 1928 PETSC_EXTERN PetscErrorCode MatIJMap(Mat, MatIJIndexType, PetscInt,const PetscInt*,const PetscInt*,const PetscScalar*, MatIJIndexType,PetscInt*,PetscInt**,PetscInt**,PetscScalar**,PetscInt**); 1929 PETSC_EXTERN PetscErrorCode MatIJBin(Mat, MatIJIndexType, PetscInt,const PetscInt*,const PetscInt*,const PetscScalar*,PetscInt*,PetscInt**,PetscInt**,PetscScalar**,PetscInt**); 1930 PETSC_EXTERN PetscErrorCode MatIJBinMap(Mat,Mat, MatIJIndexType,PetscInt,const PetscInt*,const PetscInt*,const PetscScalar*,MatIJIndexType,PetscInt*,PetscInt**,PetscInt**,PetscScalar**,PetscInt**); 1931 1932 #endif 1933