1 /* 2 Include file for the matrix component of PETSc 3 */ 4 #ifndef __PETSCMAT_H 5 #define __PETSCMAT_H 6 #include "petscvec.h" 7 PETSC_EXTERN_CXX_BEGIN 8 9 /*S 10 Mat - Abstract PETSc matrix object 11 12 Level: beginner 13 14 Concepts: matrix; linear operator 15 16 .seealso: MatCreate(), MatType, MatSetType() 17 S*/ 18 typedef struct _p_Mat* Mat; 19 20 /*E 21 MatType - String with the name of a PETSc matrix or the creation function 22 with an optional dynamic library name, for example 23 http://www.mcs.anl.gov/petsc/lib.a:mymatcreate() 24 25 Level: beginner 26 27 .seealso: MatSetType(), Mat 28 E*/ 29 #define MATSAME "same" 30 #define MATSEQMAIJ "seqmaij" 31 #define MATMPIMAIJ "mpimaij" 32 #define MATMAIJ "maij" 33 #define MATIS "is" 34 #define MATMPIROWBS "mpirowbs" 35 #define MATSEQAIJ "seqaij" 36 #define MATMPIAIJ "mpiaij" 37 #define MATAIJ "aij" 38 #define MATSHELL "shell" 39 #define MATSEQBDIAG "seqbdiag" 40 #define MATMPIBDIAG "mpibdiag" 41 #define MATBDIAG "bdiag" 42 #define MATSEQDENSE "seqdense" 43 #define MATMPIDENSE "mpidense" 44 #define MATDENSE "dense" 45 #define MATSEQBAIJ "seqbaij" 46 #define MATMPIBAIJ "mpibaij" 47 #define MATBAIJ "baij" 48 #define MATMPIADJ "mpiadj" 49 #define MATSEQSBAIJ "seqsbaij" 50 #define MATMPISBAIJ "mpisbaij" 51 #define MATSBAIJ "sbaij" 52 #define MATDAAD "daad" 53 #define MATMFFD "mffd" 54 #define MATESI "esi" 55 #define MATPETSCESI "petscesi" 56 #define MATNORMAL "normal" 57 #define MATSEQAIJSPOOLES "seqaijspooles" 58 #define MATMPIAIJSPOOLES "mpiaijspooles" 59 #define MATSEQSBAIJSPOOLES "seqsbaijspooles" 60 #define MATMPISBAIJSPOOLES "mpisbaijspooles" 61 #define MATAIJSPOOLES "aijspooles" 62 #define MATSBAIJSPOOLES "sbaijspooles" 63 #define MATSUPERLU "superlu" 64 #define MATSUPERLU_DIST "superlu_dist" 65 #define MATUMFPACK "umfpack" 66 #define MATESSL "essl" 67 #define MATLUSOL "lusol" 68 #define MATAIJMUMPS "aijmumps" 69 #define MATSBAIJMUMPS "sbaijmumps" 70 #define MATDSCPACK "dscpack" 71 #define MATMATLAB "matlab" 72 #define MatType char* 73 74 /* Logging support */ 75 #define MAT_FILE_COOKIE 1211216 /* used to indicate matrices in binary files */ 76 extern int MAT_COOKIE; 77 extern int MATSNESMFCTX_COOKIE; 78 extern int MAT_FDCOLORING_COOKIE; 79 extern int MAT_PARTITIONING_COOKIE; 80 extern int MAT_NULLSPACE_COOKIE; 81 extern int MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose; 82 extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose; 83 extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic; 84 extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor; 85 extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin; 86 extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering; 87 extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate; 88 extern int MAT_FDColoringApply, MAT_Transpose, MAT_FDColoringFunction; 89 extern int MAT_MatMult; 90 91 EXTERN int MatInitializePackage(char *); 92 93 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 94 EXTERN int MatSetType(Mat,const MatType); 95 EXTERN int MatSetFromOptions(Mat); 96 EXTERN int MatSetUpPreallocation(Mat); 97 EXTERN int MatRegisterAll(const char[]); 98 EXTERN int MatRegister(const char[],const char[],const char[],int(*)(Mat)); 99 100 /*MC 101 MatRegisterDynamic - Adds a new matrix type 102 103 Synopsis: 104 int MatRegisterDynamic(char *name,char *path,char *name_create,int (*routine_create)(Mat)) 105 106 Not Collective 107 108 Input Parameters: 109 + name - name of a new user-defined matrix type 110 . path - path (either absolute or relative) the library containing this solver 111 . name_create - name of routine to create method context 112 - routine_create - routine to create method context 113 114 Notes: 115 MatRegisterDynamic() may be called multiple times to add several user-defined solvers. 116 117 If dynamic libraries are used, then the fourth input argument (routine_create) 118 is ignored. 119 120 Sample usage: 121 .vb 122 MatRegisterDynamic("my_mat",/home/username/my_lib/lib/libO/solaris/mylib.a, 123 "MyMatCreate",MyMatCreate); 124 .ve 125 126 Then, your solver can be chosen with the procedural interface via 127 $ MatSetType(Mat,"my_mat") 128 or at runtime via the option 129 $ -mat_type my_mat 130 131 Level: advanced 132 133 Notes: ${PETSC_ARCH} and ${BOPT} occuring in pathname will be replaced with appropriate values. 134 If your function is not being put into a shared library then use VecRegister() instead 135 136 .keywords: Mat, register 137 138 .seealso: MatRegisterAll(), MatRegisterDestroy() 139 140 M*/ 141 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 142 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 143 #else 144 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 145 #endif 146 147 extern PetscTruth MatRegisterAllCalled; 148 extern PetscFList MatList; 149 150 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar[],Mat*); 151 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar[],Mat*); 152 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,const int[],Mat*); 153 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,const int[],int,const int[],Mat*); 154 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,const int[],Mat*); 155 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,const int[],PetscScalar*[],Mat*); 156 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,const int[],PetscScalar*[],Mat*); 157 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,const int[],Mat*); 158 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,const int[],int,const int[],Mat*); 159 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int[],int[],int[],Mat*); 160 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,const int[],Mat*); 161 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,const int[],int,const int[],Mat*); 162 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 163 EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*); 164 EXTERN int MatCreateNormal(Mat,Mat*); 165 EXTERN int MatDestroy(Mat); 166 167 EXTERN int MatPrintHelp(Mat); 168 EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*); 169 170 /* ------------------------------------------------------------*/ 171 EXTERN int MatSetValues(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode); 172 EXTERN int MatSetValuesBlocked(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode); 173 174 /*S 175 MatStencil - Data structure (C struct) for storing information about a single row or 176 column of a matrix as index on an associated grid. 177 178 Level: beginner 179 180 Concepts: matrix; linear operator 181 182 .seealso: MatSetValuesStencil(), MatSetStencil(), MatSetValuesBlockStencil() 183 S*/ 184 typedef struct { 185 int k,j,i,c; 186 } MatStencil; 187 188 EXTERN int MatSetValuesStencil(Mat,int,const MatStencil[],int,const MatStencil[],const PetscScalar[],InsertMode); 189 EXTERN int MatSetValuesBlockedStencil(Mat,int,const MatStencil[],int,const MatStencil[],const PetscScalar[],InsertMode); 190 EXTERN int MatSetStencil(Mat,int,const int[],const int[],int); 191 192 EXTERN int MatSetColoring(Mat,ISColoring); 193 EXTERN int MatSetValuesAdic(Mat,void*); 194 EXTERN int MatSetValuesAdifor(Mat,int,void*); 195 196 /*E 197 MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 198 to continue to add values to it 199 200 Level: beginner 201 202 .seealso: MatAssemblyBegin(), MatAssemblyEnd() 203 E*/ 204 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 205 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 206 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 207 EXTERN int MatAssembled(Mat,PetscTruth*); 208 209 extern int MatSetValue_Row, MatSetValue_Column; 210 extern PetscScalar MatSetValue_Value; 211 212 /*MC 213 MatSetValue - Set a single entry into a matrix. 214 215 Synopsis: 216 int MatSetValue(Mat m,int row,int col,PetscScalar value,InsertMode mode); 217 218 Not collective 219 220 Input Parameters: 221 + m - the matrix 222 . row - the row location of the entry 223 . col - the column location of the entry 224 . value - the value to insert 225 - mode - either INSERT_VALUES or ADD_VALUES 226 227 Notes: 228 For efficiency one should use MatSetValues() and set several or many 229 values simultaneously if possible. 230 231 Level: beginner 232 233 .seealso: MatSetValues(), MatSetValueLocal() 234 M*/ 235 #define MatSetValue(v,i,j,va,mode) \ 236 (MatSetValue_Row = i,MatSetValue_Column = j,MatSetValue_Value = va, \ 237 MatSetValues(v,1,&MatSetValue_Row,1,&MatSetValue_Column,&MatSetValue_Value,mode)) 238 239 #define MatGetValue(v,i,j,va) \ 240 (MatSetValue_Row = i,MatSetValue_Column = j,\ 241 MatGetValues(v,1,&MatSetValue_Row,1,&MatSetValue_Column,&va)) 242 243 #define MatSetValueLocal(v,i,j,va,mode) \ 244 (MatSetValue_Row = i,MatSetValue_Column = j,MatSetValue_Value = va, \ 245 MatSetValuesLocal(v,1,&MatSetValue_Row,1,&MatSetValue_Column,&MatSetValue_Value,mode)) 246 247 /*E 248 MatOption - Options that may be set for a matrix and its behavior or storage 249 250 Level: beginner 251 252 Any additions/changes here MUST also be made in include/finclude/petscmat.h 253 254 .seealso: MatSetOption() 255 E*/ 256 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 257 MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 258 MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 259 MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 260 MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 261 MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 262 MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 263 MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 264 MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 265 MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 266 MAT_DO_NOT_USE_INODES=82,MAT_NOT_SYMMETRIC=83,MAT_HERMITIAN=84, 267 MAT_NOT_STRUCTURALLY_SYMMETRIC=85,MAT_NOT_HERMITIAN=86, 268 MAT_SYMMETRY_ETERNAL=87,MAT_NOT_SYMMETRY_ETERNAL=88} MatOption; 269 EXTERN int MatSetOption(Mat,MatOption); 270 EXTERN int MatGetType(Mat,MatType*); 271 272 EXTERN int MatGetValues(Mat,int,const int[],int,const int[],PetscScalar[]); 273 EXTERN int MatGetRow(Mat,int,int *,const int *[],const PetscScalar*[]); 274 EXTERN int MatRestoreRow(Mat,int,int *,const int *[],const PetscScalar*[]); 275 EXTERN int MatGetColumn(Mat,int,int *,int *[],PetscScalar*[]); 276 EXTERN int MatRestoreColumn(Mat,int,int *,int *[],PetscScalar*[]); 277 EXTERN int MatGetColumnVector(Mat,Vec,int); 278 EXTERN int MatGetArray(Mat,PetscScalar *[]); 279 EXTERN int MatRestoreArray(Mat,PetscScalar *[]); 280 EXTERN int MatGetBlockSize(Mat,int *); 281 282 EXTERN int MatMult(Mat,Vec,Vec); 283 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 284 EXTERN int MatMultTranspose(Mat,Vec,Vec); 285 EXTERN int MatIsTranspose(Mat,Mat,PetscReal,PetscTruth*); 286 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 287 EXTERN int MatMultConstrained(Mat,Vec,Vec); 288 EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec); 289 290 /*E 291 MatDuplicateOption - Indicates if a duplicated sparse matrix should have 292 its numerical values copied over or just its nonzero structure. 293 294 Level: beginner 295 296 Any additions/changes here MUST also be made in include/finclude/petscmat.h 297 298 .seealso: MatDuplicate() 299 E*/ 300 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 301 302 EXTERN int MatConvertRegister(const char[],const char[],const char[],int (*)(Mat,MatType,Mat*)); 303 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 304 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 305 #else 306 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 307 #endif 308 EXTERN int MatConvertRegisterAll(const char[]); 309 EXTERN int MatConvertRegisterDestroy(void); 310 extern PetscTruth MatConvertRegisterAllCalled; 311 extern PetscFList MatConvertList; 312 EXTERN int MatConvert(Mat,const MatType,Mat*); 313 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 314 315 /*E 316 MatStructure - Indicates if the matrix has the same nonzero structure 317 318 Level: beginner 319 320 Any additions/changes here MUST also be made in include/finclude/petscmat.h 321 322 .seealso: MatCopy(), KSPSetOperators(), PCSetOperators() 323 E*/ 324 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER,SUBSET_NONZERO_PATTERN} MatStructure; 325 326 EXTERN int MatCopy(Mat,Mat,MatStructure); 327 EXTERN int MatView(Mat,PetscViewer); 328 EXTERN int MatIsSymmetric(Mat,PetscReal,PetscTruth*); 329 EXTERN int MatIsSymmetricKnown(Mat,PetscTruth*,PetscTruth*); 330 EXTERN int MatLoad(PetscViewer,const MatType,Mat*); 331 EXTERN int MatMerge(MPI_Comm,Mat,Mat*); 332 333 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int *[],int *[],PetscTruth *); 334 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int *[],int *[],PetscTruth *); 335 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int *[],int *[],PetscTruth *); 336 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int *[],int *[],PetscTruth *); 337 338 /*S 339 MatInfo - Context of matrix information, used with MatGetInfo() 340 341 In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 342 343 Level: intermediate 344 345 Concepts: matrix^nonzero information 346 347 .seealso: MatGetInfo(), MatInfoType 348 S*/ 349 typedef struct { 350 PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 351 PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 352 PetscLogDouble block_size; /* block size */ 353 PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 354 PetscLogDouble memory; /* memory allocated */ 355 PetscLogDouble assemblies; /* number of matrix assemblies called */ 356 PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 357 PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 358 PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 359 } MatInfo; 360 361 /*E 362 MatInfoType - Indicates if you want information about the local part of the matrix, 363 the entire parallel matrix or the maximum over all the local parts. 364 365 Level: beginner 366 367 Any additions/changes here MUST also be made in include/finclude/petscmat.h 368 369 .seealso: MatGetInfo(), MatInfo 370 E*/ 371 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 372 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 373 EXTERN int MatValid(Mat,PetscTruth*); 374 EXTERN int MatGetDiagonal(Mat,Vec); 375 EXTERN int MatGetRowMax(Mat,Vec); 376 EXTERN int MatTranspose(Mat,Mat*); 377 EXTERN int MatPermute(Mat,IS,IS,Mat *); 378 EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *); 379 EXTERN int MatDiagonalScale(Mat,Vec,Vec); 380 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 381 EXTERN int MatEqual(Mat,Mat,PetscTruth*); 382 383 EXTERN int MatNorm(Mat,NormType,PetscReal *); 384 EXTERN int MatZeroEntries(Mat); 385 EXTERN int MatZeroRows(Mat,IS,const PetscScalar*); 386 EXTERN int MatZeroColumns(Mat,IS,const PetscScalar*); 387 388 EXTERN int MatUseScaledForm(Mat,PetscTruth); 389 EXTERN int MatScaleSystem(Mat,Vec,Vec); 390 EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 391 392 EXTERN int MatGetSize(Mat,int*,int*); 393 EXTERN int MatGetLocalSize(Mat,int*,int*); 394 EXTERN int MatGetOwnershipRange(Mat,int*,int*); 395 396 /*E 397 MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 398 or MatGetSubMatrix() are to be reused to store the new matrix values. 399 400 Level: beginner 401 402 Any additions/changes here MUST also be made in include/finclude/petscmat.h 403 404 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 405 E*/ 406 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 407 EXTERN int MatGetSubMatrices(Mat,int,const IS[],const IS[],MatReuse,Mat *[]); 408 EXTERN int MatDestroyMatrices(int,Mat *[]); 409 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 410 411 EXTERN int MatIncreaseOverlap(Mat,int,IS[],int); 412 413 EXTERN int MatAXPY(const PetscScalar *,Mat,Mat,MatStructure); 414 EXTERN int MatAYPX(const PetscScalar *,Mat,Mat); 415 EXTERN int MatCompress(Mat); 416 417 EXTERN int MatScale(const PetscScalar *,Mat); 418 EXTERN int MatShift(const PetscScalar *,Mat); 419 420 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 421 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 422 EXTERN int MatZeroRowsLocal(Mat,IS,const PetscScalar*); 423 EXTERN int MatSetValuesLocal(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode); 424 EXTERN int MatSetValuesBlockedLocal(Mat,int,const int[],int,const int[],const PetscScalar[],InsertMode); 425 426 EXTERN int MatStashSetInitialSize(Mat,int,int); 427 EXTERN int MatStashGetInfo(Mat,int*,int*,int*,int*); 428 429 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 430 EXTERN int MatInterpolate(Mat,Vec,Vec); 431 EXTERN int MatRestrict(Mat,Vec,Vec); 432 EXTERN int MatGetVecs(Mat,Vec*,Vec*); 433 434 /*MC 435 MatPreallocInitialize - Begins the block of code that will count the number of nonzeros per 436 row in a matrix providing the data that one can use to correctly preallocate the matrix. 437 438 Synopsis: 439 int MatPreallocateInitialize(MPI_Comm comm, int nrows, int ncols, int *dnz, int *onz) 440 441 Collective on MPI_Comm 442 443 Input Parameters: 444 + comm - the communicator that will share the eventually allocated matrix 445 . nrows - the number of rows in the matrix 446 - ncols - the number of columns in the matrix 447 448 Output Parameters: 449 + dnz - the array that will be passed to the matrix preallocation routines 450 - ozn - the other array passed to the matrix preallocation routines 451 452 453 Level: intermediate 454 455 Notes: 456 See the chapter in the users manual on performance for more details 457 458 Do not malloc or free dnz and onz, that is handled internally by these routines 459 460 Use MatPreallocateInitializeSymmetric() for symmetric matrices (MPISBAIJ matrices) 461 462 Concepts: preallocation^Matrix 463 464 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(), 465 MatPreallocateInitializeSymmetric(), MatPreallocateSymmetricSetLocal() 466 M*/ 467 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 468 { \ 469 int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 470 _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 471 _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 472 _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 473 _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 474 475 /*MC 476 MatPreallocSymmetricInitialize - Begins the block of code that will count the number of nonzeros per 477 row in a matrix providing the data that one can use to correctly preallocate the matrix. 478 479 Synopsis: 480 int MatPreallocateSymmetricInitialize(MPI_Comm comm, int nrows, int ncols, int *dnz, int *onz) 481 482 Collective on MPI_Comm 483 484 Input Parameters: 485 + comm - the communicator that will share the eventually allocated matrix 486 . nrows - the number of rows in the matrix 487 - ncols - the number of columns in the matrix 488 489 Output Parameters: 490 + dnz - the array that will be passed to the matrix preallocation routines 491 - ozn - the other array passed to the matrix preallocation routines 492 493 494 Level: intermediate 495 496 Notes: 497 See the chapter in the users manual on performance for more details 498 499 Do not malloc or free dnz and onz, that is handled internally by these routines 500 501 Concepts: preallocation^Matrix 502 503 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(), 504 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal() 505 M*/ 506 #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \ 507 { \ 508 int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__end; \ 509 _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 510 _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 511 _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\ 512 _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 513 514 /*MC 515 MatPreallocateSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be 516 inserted using a local number of the rows and columns 517 518 Synopsis: 519 int MatPreallocateSetLocal(ISLocalToGlobalMappping map,int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz) 520 521 Not Collective 522 523 Input Parameters: 524 + map - the mapping between local numbering and global numbering 525 . nrows - the number of rows indicated 526 . rows - the indices of the rows 527 . ncols - the number of columns in the matrix 528 . cols - the columns indicated 529 . dnz - the array that will be passed to the matrix preallocation routines 530 - ozn - the other array passed to the matrix preallocation routines 531 532 533 Level: intermediate 534 535 Notes: 536 See the chapter in the users manual on performance for more details 537 538 Do not malloc or free dnz and onz, that is handled internally by these routines 539 540 Concepts: preallocation^Matrix 541 542 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 543 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal() 544 M*/ 545 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 546 {\ 547 int __l;\ 548 _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 549 _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 550 for (__l=0;__l<nrows;__l++) {\ 551 _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 552 }\ 553 } 554 555 /*MC 556 MatPreallocateSymmetricSetLocal - Indicates the locations (rows and columns) in the matrix where nonzeros will be 557 inserted using a local number of the rows and columns 558 559 Synopsis: 560 int MatPreallocateSymmetricSetLocal(ISLocalToGlobalMappping map,int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz) 561 562 Not Collective 563 564 Input Parameters: 565 + map - the mapping between local numbering and global numbering 566 . nrows - the number of rows indicated 567 . rows - the indices of the rows 568 . ncols - the number of columns in the matrix 569 . cols - the columns indicated 570 . dnz - the array that will be passed to the matrix preallocation routines 571 - ozn - the other array passed to the matrix preallocation routines 572 573 574 Level: intermediate 575 576 Notes: 577 See the chapter in the users manual on performance for more details 578 579 Do not malloc or free dnz and onz that is handled internally by these routines 580 581 Concepts: preallocation^Matrix 582 583 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 584 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal() 585 M*/ 586 #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 587 {\ 588 int __l;\ 589 _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 590 _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 591 for (__l=0;__l<nrows;__l++) {\ 592 _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 593 }\ 594 } 595 596 /*MC 597 MatPreallocateSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be 598 inserted using a local number of the rows and columns 599 600 Synopsis: 601 int MatPreallocateSet(int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz) 602 603 Not Collective 604 605 Input Parameters: 606 + nrows - the number of rows indicated 607 . rows - the indices of the rows 608 . ncols - the number of columns in the matrix 609 . cols - the columns indicated 610 . dnz - the array that will be passed to the matrix preallocation routines 611 - ozn - the other array passed to the matrix preallocation routines 612 613 614 Level: intermediate 615 616 Notes: 617 See the chapter in the users manual on performance for more details 618 619 Do not malloc or free dnz and onz that is handled internally by these routines 620 621 Concepts: preallocation^Matrix 622 623 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 624 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal() 625 M*/ 626 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 627 { int __i; \ 628 for (__i=0; __i<nc; __i++) {\ 629 if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 630 }\ 631 dnz[row - __rstart] = nc - onz[row - __rstart];\ 632 } 633 634 /*MC 635 MatPreallocateSymmetricSet - Indicates the locations (rows and columns) in the matrix where nonzeros will be 636 inserted using a local number of the rows and columns 637 638 Synopsis: 639 int MatPreallocateSymmetricSet(int nrows, int *rows,int ncols, int *cols,int *dnz, int *onz) 640 641 Not Collective 642 643 Input Parameters: 644 + nrows - the number of rows indicated 645 . rows - the indices of the rows 646 . ncols - the number of columns in the matrix 647 . cols - the columns indicated 648 . dnz - the array that will be passed to the matrix preallocation routines 649 - ozn - the other array passed to the matrix preallocation routines 650 651 652 Level: intermediate 653 654 Notes: 655 See the chapter in the users manual on performance for more details 656 657 Do not malloc or free dnz and onz that is handled internally by these routines 658 659 Concepts: preallocation^Matrix 660 661 .seealso: MatPreallocateFinalize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateInitialize(), 662 MatPreallocateInitialize(), MatPreallocateSymmetricSetLocal(), MatPreallocateSetLocal() 663 M*/ 664 #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\ 665 { int __i; \ 666 for (__i=0; __i<nc; __i++) {\ 667 if (cols[__i] >= __end) onz[row - __rstart]++; \ 668 else if (cols[__i] >= row) dnz[row - __rstart]++;\ 669 }\ 670 } 671 672 /*MC 673 MatPreallocFinalize - Ends the block of code that will count the number of nonzeros per 674 row in a matrix providing the data that one can use to correctly preallocate the matrix. 675 676 Synopsis: 677 int MatPreallocateFinalize(int *dnz, int *onz) 678 679 Collective on MPI_Comm 680 681 Input Parameters: 682 + dnz - the array that will be passed to the matrix preallocation routines 683 - ozn - the other array passed to the matrix preallocation routines 684 685 686 Level: intermediate 687 688 Notes: 689 See the chapter in the users manual on performance for more details 690 691 Do not malloc or free dnz and onz that is handled internally by these routines 692 693 Concepts: preallocation^Matrix 694 695 .seealso: MatPreallocateInitialize(), MatPreallocateSet(), MatPreallocateSymmetricSet(), MatPreallocateSetLocal(), 696 MatPreallocateSymmetricInitialize(), MatPreallocateSymmetricSetLocal() 697 M*/ 698 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);} 699 700 701 702 /* Routines unique to particular data structures */ 703 EXTERN int MatShellGetContext(Mat,void **); 704 705 EXTERN int MatBDiagGetData(Mat,int*,int*,int*[],int*[],PetscScalar***); 706 EXTERN int MatSeqAIJSetColumnIndices(Mat,int[]); 707 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int[]); 708 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int[],int[],PetscScalar[],Mat*); 709 710 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,const int[]); 711 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,const int[]); 712 EXTERN int MatSeqAIJSetPreallocation(Mat,int,const int[]); 713 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar[]); 714 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,const int[],PetscScalar*[]); 715 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar[]); 716 717 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,const int[],int,const int[]); 718 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,const int[],int,const int[]); 719 EXTERN int MatMPIAIJSetPreallocation(Mat,int,const int[],int,const int[]); 720 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar[]); 721 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,const int[],PetscScalar*[]); 722 EXTERN int MatMPIAdjSetPreallocation(Mat,int[],int[],int[]); 723 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar[]); 724 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,const int[]); 725 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int*[]); 726 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int*[]); 727 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void)); 728 729 EXTERN int MatSeqDenseSetLDA(Mat,int); 730 731 EXTERN int MatStoreValues(Mat); 732 EXTERN int MatRetrieveValues(Mat); 733 734 EXTERN int MatDAADSetCtx(Mat,void*); 735 736 /* 737 These routines are not usually accessed directly, rather solving is 738 done through the KSP and PC interfaces. 739 */ 740 741 /*E 742 MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 743 with an optional dynamic library name, for example 744 http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 745 746 Level: beginner 747 748 .seealso: MatGetOrdering() 749 E*/ 750 #define MatOrderingType char* 751 #define MATORDERING_NATURAL "natural" 752 #define MATORDERING_ND "nd" 753 #define MATORDERING_1WD "1wd" 754 #define MATORDERING_RCM "rcm" 755 #define MATORDERING_QMD "qmd" 756 #define MATORDERING_ROWLENGTH "rowlength" 757 #define MATORDERING_DSC_ND "dsc_nd" 758 #define MATORDERING_DSC_MMD "dsc_mmd" 759 #define MATORDERING_DSC_MDF "dsc_mdf" 760 #define MATORDERING_CONSTRAINED "constrained" 761 #define MATORDERING_IDENTITY "identity" 762 #define MATORDERING_REVERSE "reverse" 763 764 EXTERN int MatGetOrdering(Mat,const MatOrderingType,IS*,IS*); 765 EXTERN int MatOrderingRegister(const char[],const char[],const char[],int(*)(Mat,const MatOrderingType,IS*,IS*)); 766 767 /*MC 768 MatOrderingRegisterDynamic - Adds a new sparse matrix ordering to the 769 matrix package. 770 771 Synopsis: 772 int MatOrderingRegisterDynamic(char *name_ordering,char *path,char *name_create,int (*routine_create)(MatOrdering)) 773 774 Not Collective 775 776 Input Parameters: 777 + sname - name of ordering (for example MATORDERING_ND) 778 . path - location of library where creation routine is 779 . name - name of function that creates the ordering type,a string 780 - function - function pointer that creates the ordering 781 782 Level: developer 783 784 If dynamic libraries are used, then the fourth input argument (function) 785 is ignored. 786 787 Sample usage: 788 .vb 789 MatOrderingRegisterDynamic("my_order",/home/username/my_lib/lib/libO/solaris/mylib.a, 790 "MyOrder",MyOrder); 791 .ve 792 793 Then, your partitioner can be chosen with the procedural interface via 794 $ MatOrderingSetType(part,"my_order) 795 or at runtime via the option 796 $ -pc_ilu_mat_ordering_type my_order 797 $ -pc_lu_mat_ordering_type my_order 798 799 ${PETSC_ARCH} and ${BOPT} occuring in pathname will be replaced with appropriate values. 800 801 .keywords: matrix, ordering, register 802 803 .seealso: MatOrderingRegisterDestroy(), MatOrderingRegisterAll() 804 M*/ 805 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 806 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 807 #else 808 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 809 #endif 810 811 EXTERN int MatOrderingRegisterDestroy(void); 812 EXTERN int MatOrderingRegisterAll(const char[]); 813 extern PetscTruth MatOrderingRegisterAllCalled; 814 extern PetscFList MatOrderingList; 815 816 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 817 818 /*S 819 MatFactorInfo - Data based into the matrix factorization routines 820 821 In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE 822 823 Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC. 824 825 Level: developer 826 827 .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor() 828 829 S*/ 830 typedef struct { 831 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 832 PetscReal shift; /* if true, shift until positive pivots */ 833 PetscReal shift_fraction; /* record shift fraction taken */ 834 PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 835 PetscReal dt; /* drop tolerance */ 836 PetscReal dtcol; /* tolerance for pivoting */ 837 PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 838 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 839 PetscReal levels; /* ICC/ILU(levels) */ 840 PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 841 factorization may be faster if do not pivot */ 842 PetscReal zeropivot; /* pivot is called zero if less than this */ 843 } MatFactorInfo; 844 845 EXTERN int MatCholeskyFactor(Mat,IS,MatFactorInfo*); 846 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*); 847 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 848 EXTERN int MatLUFactor(Mat,IS,IS,MatFactorInfo*); 849 EXTERN int MatILUFactor(Mat,IS,IS,MatFactorInfo*); 850 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*); 851 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*); 852 EXTERN int MatICCFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*); 853 EXTERN int MatICCFactor(Mat,IS,MatFactorInfo*); 854 EXTERN int MatLUFactorNumeric(Mat,Mat*); 855 EXTERN int MatILUDTFactor(Mat,MatFactorInfo*,IS,IS,Mat *); 856 EXTERN int MatGetInertia(Mat,int*,int*,int*); 857 EXTERN int MatSolve(Mat,Vec,Vec); 858 EXTERN int MatForwardSolve(Mat,Vec,Vec); 859 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 860 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 861 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 862 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 863 EXTERN int MatSolves(Mat,Vecs,Vecs); 864 865 EXTERN int MatSetUnfactored(Mat); 866 867 /*E 868 MatSORType - What type of (S)SOR to perform 869 870 Level: beginner 871 872 May be bitwise ORd together 873 874 Any additions/changes here MUST also be made in include/finclude/petscmat.h 875 876 MatSORType may be bitwise ORd together, so do not change the numbers 877 878 .seealso: MatRelax(), MatPBRelax() 879 E*/ 880 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 881 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 882 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 883 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 884 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec); 885 EXTERN int MatPBRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec); 886 887 /* 888 These routines are for efficiently computing Jacobians via finite differences. 889 */ 890 891 /*E 892 MatColoringType - String with the name of a PETSc matrix coloring or the creation function 893 with an optional dynamic library name, for example 894 http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 895 896 Level: beginner 897 898 .seealso: MatGetColoring() 899 E*/ 900 #define MatColoringType char* 901 #define MATCOLORING_NATURAL "natural" 902 #define MATCOLORING_SL "sl" 903 #define MATCOLORING_LF "lf" 904 #define MATCOLORING_ID "id" 905 906 EXTERN int MatGetColoring(Mat,const MatColoringType,ISColoring*); 907 EXTERN int MatColoringRegister(const char[],const char[],const char[],int(*)(Mat,const MatColoringType,ISColoring *)); 908 909 /*MC 910 MatColoringRegisterDynamic - Adds a new sparse matrix coloring to the 911 matrix package. 912 913 Synopsis: 914 int MatColoringRegisterDynamic(char *name_coloring,char *path,char *name_create,int (*routine_create)(MatColoring)) 915 916 Not Collective 917 918 Input Parameters: 919 + sname - name of Coloring (for example MATCOLORING_SL) 920 . path - location of library where creation routine is 921 . name - name of function that creates the Coloring type, a string 922 - function - function pointer that creates the coloring 923 924 Level: developer 925 926 If dynamic libraries are used, then the fourth input argument (function) 927 is ignored. 928 929 Sample usage: 930 .vb 931 MatColoringRegisterDynamic("my_color",/home/username/my_lib/lib/libO/solaris/mylib.a, 932 "MyColor",MyColor); 933 .ve 934 935 Then, your partitioner can be chosen with the procedural interface via 936 $ MatColoringSetType(part,"my_color") 937 or at runtime via the option 938 $ -mat_coloring_type my_color 939 940 $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values. 941 942 .keywords: matrix, Coloring, register 943 944 .seealso: MatColoringRegisterDestroy(), MatColoringRegisterAll() 945 M*/ 946 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 947 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 948 #else 949 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 950 #endif 951 952 EXTERN int MatColoringRegisterAll(const char[]); 953 extern PetscTruth MatColoringRegisterAllCalled; 954 EXTERN int MatColoringRegisterDestroy(void); 955 EXTERN int MatColoringPatch(Mat,int,int,const ISColoringValue[],ISColoring*); 956 957 /*S 958 MatFDColoring - Object for computing a sparse Jacobian via finite differences 959 and coloring 960 961 Level: beginner 962 963 Concepts: coloring, sparse Jacobian, finite differences 964 965 .seealso: MatFDColoringCreate() 966 S*/ 967 typedef struct _p_MatFDColoring *MatFDColoring; 968 969 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 970 EXTERN int MatFDColoringDestroy(MatFDColoring); 971 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 972 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 973 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 974 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 975 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 976 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 977 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 978 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *); 979 EXTERN int MatFDColoringSetRecompute(MatFDColoring); 980 EXTERN int MatFDColoringSetF(MatFDColoring,Vec); 981 EXTERN int MatFDColoringGetPerturbedColumns(MatFDColoring,int*,int*[]); 982 /* 983 These routines are for partitioning matrices: currently used only 984 for adjacency matrix, MatCreateMPIAdj(). 985 */ 986 987 /*S 988 MatPartitioning - Object for managing the partitioning of a matrix or graph 989 990 Level: beginner 991 992 Concepts: partitioning 993 994 .seealso: MatPartitioningCreate(), MatPartitioningType 995 S*/ 996 typedef struct _p_MatPartitioning *MatPartitioning; 997 998 /*E 999 MatPartitioningType - String with the name of a PETSc matrix partitioning or the creation function 1000 with an optional dynamic library name, for example 1001 http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 1002 1003 Level: beginner 1004 1005 .seealso: MatPartitioningCreate(), MatPartitioning 1006 E*/ 1007 #define MatPartitioningType char* 1008 #define MAT_PARTITIONING_CURRENT "current" 1009 #define MAT_PARTITIONING_PARMETIS "parmetis" 1010 #define MAT_PARTITIONING_CHACO "chaco" 1011 #define MAT_PARTITIONING_JOSTLE "jostle" 1012 #define MAT_PARTITIONING_PARTY "party" 1013 #define MAT_PARTITIONING_SCOTCH "scotch" 1014 1015 1016 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 1017 EXTERN int MatPartitioningSetType(MatPartitioning,const MatPartitioningType); 1018 EXTERN int MatPartitioningSetNParts(MatPartitioning,int); 1019 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 1020 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,const int[]); 1021 EXTERN int MatPartitioningSetPartitionWeights(MatPartitioning,const PetscReal []); 1022 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 1023 EXTERN int MatPartitioningDestroy(MatPartitioning); 1024 1025 EXTERN int MatPartitioningRegister(const char[],const char[],const char[],int(*)(MatPartitioning)); 1026 1027 /*MC 1028 MatPartitioningRegisterDynamic - Adds a new sparse matrix partitioning to the 1029 matrix package. 1030 1031 Synopsis: 1032 int MatPartitioningRegisterDynamic(char *name_partitioning,char *path,char *name_create,int (*routine_create)(MatPartitioning)) 1033 1034 Not Collective 1035 1036 Input Parameters: 1037 + sname - name of partitioning (for example MAT_PARTITIONING_CURRENT) or parmetis 1038 . path - location of library where creation routine is 1039 . name - name of function that creates the partitioning type, a string 1040 - function - function pointer that creates the partitioning type 1041 1042 Level: developer 1043 1044 If dynamic libraries are used, then the fourth input argument (function) 1045 is ignored. 1046 1047 Sample usage: 1048 .vb 1049 MatPartitioningRegisterDynamic("my_part",/home/username/my_lib/lib/libO/solaris/mylib.a, 1050 "MyPartCreate",MyPartCreate); 1051 .ve 1052 1053 Then, your partitioner can be chosen with the procedural interface via 1054 $ MatPartitioningSetType(part,"my_part") 1055 or at runtime via the option 1056 $ -mat_partitioning_type my_part 1057 1058 $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values. 1059 1060 .keywords: matrix, partitioning, register 1061 1062 .seealso: MatPartitioningRegisterDestroy(), MatPartitioningRegisterAll() 1063 M*/ 1064 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1065 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 1066 #else 1067 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 1068 #endif 1069 1070 EXTERN int MatPartitioningRegisterAll(const char[]); 1071 extern PetscTruth MatPartitioningRegisterAllCalled; 1072 EXTERN int MatPartitioningRegisterDestroy(void); 1073 1074 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 1075 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 1076 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 1077 1078 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 1079 1080 EXTERN int MatPartitioningJostleSetCoarseLevel(MatPartitioning,PetscReal); 1081 EXTERN int MatPartitioningJostleSetCoarseSequential(MatPartitioning); 1082 1083 typedef enum { MP_CHACO_MULTILEVEL_KL, MP_CHACO_SPECTRAL, MP_CHACO_LINEAR, 1084 MP_CHACO_RANDOM, MP_CHACO_SCATTERED } MPChacoGlobalType; 1085 EXTERN int MatPartitioningChacoSetGlobal(MatPartitioning, MPChacoGlobalType); 1086 typedef enum { MP_CHACO_KERNIGHAN_LIN, MP_CHACO_NONE } MPChacoLocalType; 1087 EXTERN int MatPartitioningChacoSetLocal(MatPartitioning, MPChacoLocalType); 1088 EXTERN int MatPartitioningChacoSetCoarseLevel(MatPartitioning,PetscReal); 1089 typedef enum { MP_CHACO_LANCZOS, MP_CHACO_RQI_SYMMLQ } MPChacoEigenType; 1090 EXTERN int MatPartitioningChacoSetEigenSolver(MatPartitioning,MPChacoEigenType); 1091 EXTERN int MatPartitioningChacoSetEigenTol(MatPartitioning, PetscReal); 1092 EXTERN int MatPartitioningChacoSetEigenNumber(MatPartitioning, int); 1093 1094 #define MP_PARTY_OPT "opt" 1095 #define MP_PARTY_LIN "lin" 1096 #define MP_PARTY_SCA "sca" 1097 #define MP_PARTY_RAN "ran" 1098 #define MP_PARTY_GBF "gbf" 1099 #define MP_PARTY_GCF "gcf" 1100 #define MP_PARTY_BUB "bub" 1101 #define MP_PARTY_DEF "def" 1102 EXTERN int MatPartitioningPartySetGlobal(MatPartitioning, const char*); 1103 #define MP_PARTY_HELPFUL_SETS "hs" 1104 #define MP_PARTY_KERNIGHAN_LIN "kl" 1105 #define MP_PARTY_NONE "no" 1106 EXTERN int MatPartitioningPartySetLocal(MatPartitioning, const char*); 1107 EXTERN int MatPartitioningPartySetCoarseLevel(MatPartitioning,PetscReal); 1108 EXTERN int MatPartitioningPartySetBipart(MatPartitioning,PetscTruth); 1109 EXTERN int MatPartitioningPartySetMatchOptimization(MatPartitioning,PetscTruth); 1110 1111 typedef enum { MP_SCOTCH_GREEDY, MP_SCOTCH_GPS, MP_SCOTCH_GR_GPS } MPScotchGlobalType; 1112 EXTERN int MatPartitioningScotchSetArch(MatPartitioning,const char*); 1113 EXTERN int MatPartitioningScotchSetMultilevel(MatPartitioning); 1114 EXTERN int MatPartitioningScotchSetGlobal(MatPartitioning,MPScotchGlobalType); 1115 EXTERN int MatPartitioningScotchSetCoarseLevel(MatPartitioning,PetscReal); 1116 EXTERN int MatPartitioningScotchSetHostList(MatPartitioning,const char*); 1117 typedef enum { MP_SCOTCH_KERNIGHAN_LIN, MP_SCOTCH_NONE } MPScotchLocalType; 1118 EXTERN int MatPartitioningScotchSetLocal(MatPartitioning,MPScotchLocalType); 1119 EXTERN int MatPartitioningScotchSetMapping(MatPartitioning); 1120 EXTERN int MatPartitioningScotchSetStrategy(MatPartitioning,char*); 1121 1122 /* 1123 If you add entries here you must also add them to finclude/petscmat.h 1124 */ 1125 typedef enum { MATOP_SET_VALUES=0, 1126 MATOP_GET_ROW=1, 1127 MATOP_RESTORE_ROW=2, 1128 MATOP_MULT=3, 1129 MATOP_MULT_ADD=4, 1130 MATOP_MULT_TRANSPOSE=5, 1131 MATOP_MULT_TRANSPOSE_ADD=6, 1132 MATOP_SOLVE=7, 1133 MATOP_SOLVE_ADD=8, 1134 MATOP_SOLVE_TRANSPOSE=9, 1135 MATOP_SOLVE_TRANSPOSE_ADD=10, 1136 MATOP_LUFACTOR=11, 1137 MATOP_CHOLESKYFACTOR=12, 1138 MATOP_RELAX=13, 1139 MATOP_TRANSPOSE=14, 1140 MATOP_GETINFO=15, 1141 MATOP_EQUAL=16, 1142 MATOP_GET_DIAGONAL=17, 1143 MATOP_DIAGONAL_SCALE=18, 1144 MATOP_NORM=19, 1145 MATOP_ASSEMBLY_BEGIN=20, 1146 MATOP_ASSEMBLY_END=21, 1147 MATOP_COMPRESS=22, 1148 MATOP_SET_OPTION=23, 1149 MATOP_ZERO_ENTRIES=24, 1150 MATOP_ZERO_ROWS=25, 1151 MATOP_LUFACTOR_SYMBOLIC=26, 1152 MATOP_LUFACTOR_NUMERIC=27, 1153 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 1154 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 1155 MATOP_SETUP_PREALLOCATION=30, 1156 MATOP_ILUFACTOR_SYMBOLIC=31, 1157 MATOP_ICCFACTOR_SYMBOLIC=32, 1158 MATOP_GET_ARRAY=33, 1159 MATOP_RESTORE_ARRAY=34, 1160 MATOP_DUPLCIATE=35, 1161 MATOP_FORWARD_SOLVE=36, 1162 MATOP_BACKWARD_SOLVE=37, 1163 MATOP_ILUFACTOR=38, 1164 MATOP_ICCFACTOR=39, 1165 MATOP_AXPY=40, 1166 MATOP_GET_SUBMATRICES=41, 1167 MATOP_INCREASE_OVERLAP=42, 1168 MATOP_GET_VALUES=43, 1169 MATOP_COPY=44, 1170 MATOP_PRINT_HELP=45, 1171 MATOP_SCALE=46, 1172 MATOP_SHIFT=47, 1173 MATOP_DIAGONAL_SHIFT=48, 1174 MATOP_ILUDT_FACTOR=49, 1175 MATOP_GET_BLOCK_SIZE=50, 1176 MATOP_GET_ROW_IJ=51, 1177 MATOP_RESTORE_ROW_IJ=52, 1178 MATOP_GET_COLUMN_IJ=53, 1179 MATOP_RESTORE_COLUMN_IJ=54, 1180 MATOP_FDCOLORING_CREATE=55, 1181 MATOP_COLORING_PATCH=56, 1182 MATOP_SET_UNFACTORED=57, 1183 MATOP_PERMUTE=58, 1184 MATOP_SET_VALUES_BLOCKED=59, 1185 MATOP_GET_SUBMATRIX=60, 1186 MATOP_DESTROY=61, 1187 MATOP_VIEW=62, 1188 MATOP_GET_MAPS=63, 1189 MATOP_USE_SCALED_FORM=64, 1190 MATOP_SCALE_SYSTEM=65, 1191 MATOP_UNSCALE_SYSTEM=66, 1192 MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67, 1193 MATOP_SET_VALUES_LOCAL=68, 1194 MATOP_ZERO_ROWS_LOCAL=69, 1195 MATOP_GET_ROW_MAX=70, 1196 MATOP_CONVERT=71, 1197 MATOP_SET_COLORING=72, 1198 MATOP_SET_VALUES_ADIC=73, 1199 MATOP_SET_VALUES_ADIFOR=74, 1200 MATOP_FD_COLORING_APPLY=75, 1201 MATOP_SET_FROM_OPTIONS=76, 1202 MATOP_MULT_CONSTRAINED=77, 1203 MATOP_MULT_TRANSPOSE_CONSTRAINED=78, 1204 MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79, 1205 MATOP_PERMUTE_SPARSIFY=80, 1206 MATOP_MULT_MULTIPLE=81, 1207 MATOP_SOLVE_MULTIPLE=82 1208 } MatOperation; 1209 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 1210 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void)); 1211 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void)); 1212 EXTERN int MatShellSetContext(Mat,void*); 1213 1214 /* 1215 Codes for matrices stored on disk. By default they are 1216 stored in a universal format. By changing the format with 1217 PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will 1218 be stored in a way natural for the matrix, for example dense matrices 1219 would be stored as dense. Matrices stored this way may only be 1220 read into matrices of the same time. 1221 */ 1222 #define MATRIX_BINARY_FORMAT_DENSE -1 1223 1224 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 1225 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 1226 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 1227 1228 EXTERN int MatISGetLocalMat(Mat,Mat*); 1229 1230 /*S 1231 MatNullSpace - Object that removes a null space from a vector, i.e. 1232 orthogonalizes the vector to a subsapce 1233 1234 Level: advanced 1235 1236 Concepts: matrix; linear operator, null space 1237 1238 Users manual sections: 1239 . sec_singular 1240 1241 .seealso: MatNullSpaceCreate() 1242 S*/ 1243 typedef struct _p_MatNullSpace* MatNullSpace; 1244 1245 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,const Vec[],MatNullSpace*); 1246 EXTERN int MatNullSpaceDestroy(MatNullSpace); 1247 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 1248 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 1249 EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 1250 1251 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 1252 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 1253 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 1254 1255 EXTERN int MatMatMult(Mat A,Mat B, Mat *C); 1256 EXTERN int MatMatMultSymbolic(Mat A,Mat B,Mat *C); 1257 EXTERN int MatMatMultNumeric(Mat A,Mat B,Mat C); 1258 1259 EXTERN int MatCreateMAIJ(Mat,int,Mat*); 1260 EXTERN int MatMAIJRedimension(Mat,int,Mat*); 1261 EXTERN int MatMAIJGetAIJ(Mat,Mat*); 1262 1263 EXTERN int MatComputeExplicitOperator(Mat,Mat*); 1264 1265 EXTERN int MatESISetType(Mat,const char*); 1266 EXTERN int MatESISetFromOptions(Mat); 1267 1268 EXTERN int MatDiagonalScaleLocal(Mat,Vec); 1269 1270 EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *); 1271 EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *); 1272 1273 EXTERN int MatSeqAIJPtAP(Mat,Mat,Mat*); 1274 EXTERN int MatSeqAIJPtAPSymbolic(Mat,Mat,Mat*); 1275 EXTERN int MatSeqAIJPtAPNumeric(Mat,Mat,Mat); 1276 1277 PETSC_EXTERN_CXX_END 1278 #endif 1279