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