1 /* $Id: petscmat.h,v 1.208 2000/10/24 20:28:06 bsmith Exp bsmith $ */ 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 #define MAT_COOKIE PETSC_COOKIE+5 10 11 typedef struct _p_Mat* Mat; 12 /*E 13 MatType - String with the name of a PETSc matrix or the creation function 14 with an optional dynamic library name 15 16 Level: beginner 17 18 .seealso: MatSetType() 19 E*/ 20 #define MATSAME "same" 21 #define MATSEQMAIJ "seqmaij" 22 #define MATMPIMAIJ "mpimaij" 23 #define MATIS "is" 24 #define MATMPIROWBS "mpirowbs" 25 #define MATSEQDENSE "seqdense" 26 #define MATSEQAIJ "seqaij" 27 #define MATMPIAIJ "mpiaij" 28 #define MATSHELL "shell" 29 #define MATSEQBDIAG "seqbdiag" 30 #define MATMPIBDIAG "mpibdiag" 31 #define MATMPIDENSE "mpidense" 32 #define MATSEQBAIJ "seqbaij" 33 #define MATMPIBAIJ "mpibaij" 34 #define MATMPIADJ "mpiadj" 35 #define MATSEQSBAIJ "seqsbaij" 36 #define MATMPISBAIJ "mpisbaij" 37 typedef char* MatType; 38 39 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 40 EXTERN int MatSetType(Mat,MatType); 41 EXTERN int MatSetFromOptions(Mat); 42 EXTERN int MatSetUpPreallocation(Mat); 43 EXTERN int MatRegisterAll(char*); 44 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 45 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 46 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 47 #else 48 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 49 #endif 50 extern PetscTruth MatRegisterAllCalled; 51 extern FList MatList; 52 53 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 54 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*); 55 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*); 56 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 57 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 58 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 59 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*); 60 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*); 61 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 62 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 63 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 64 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 65 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 66 67 EXTERN int MatDestroy(Mat); 68 69 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 70 EXTERN int MatShellGetContext(Mat,void **); 71 72 EXTERN int MatPrintHelp(Mat); 73 EXTERN int MatGetMaps(Mat,Map*,Map*); 74 75 /* ------------------------------------------------------------*/ 76 EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode); 77 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode); 78 79 /*E 80 MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 81 to continue to add values to it 82 83 Level: beginner 84 85 .seealso: MatAssemblyBegin(), MatAssemblyEnd() 86 E*/ 87 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 88 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 89 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 90 EXTERN int MatAssembled(Mat,PetscTruth*); 91 92 #define MatSetValue(v,i,j,va,mode) \ 93 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \ 94 _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 95 } 96 #define MatGetValue(v,i,j,va) \ 97 0; {int _ierr,_row = i,_col = j; \ 98 _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 99 } 100 #define MatSetValueLocal(v,i,j,va,mode) \ 101 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \ 102 _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 103 } 104 /*E 105 MatOption - Options that may be set for a matrix and its behavior or storage 106 107 Level: beginner 108 109 Any additions/changes here MUST also be made in include/finclude/petscmat.h 110 111 .seealso: MatSetOption() 112 E*/ 113 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 114 MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 115 MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 116 MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 117 MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 118 MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 119 MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 120 MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 121 MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 122 MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 123 MAT_DO_NOT_USE_INODES=82} MatOption; 124 EXTERN int MatSetOption(Mat,MatOption); 125 EXTERN int MatGetType(Mat,MatType*); 126 127 EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*); 128 EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**); 129 EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**); 130 EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**); 131 EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**); 132 EXTERN int MatGetColumnVector(Mat,Vec,int); 133 EXTERN int MatGetArray(Mat,Scalar **); 134 EXTERN int MatRestoreArray(Mat,Scalar **); 135 EXTERN int MatGetBlockSize(Mat,int *); 136 137 EXTERN int MatMult(Mat,Vec,Vec); 138 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 139 EXTERN int MatMultTranspose(Mat,Vec,Vec); 140 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 141 142 /*E 143 MatDuplicateOption - Indicates if a duplicated sparse matrix should have 144 its numerical values copied over or just its nonzero structure. 145 146 Level: beginner 147 148 Any additions/changes here MUST also be made in include/finclude/petscmat.h 149 150 .seealso: MatDuplicate() 151 E*/ 152 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 153 154 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 155 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 156 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 157 #else 158 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 159 #endif 160 EXTERN int MatConvertRegisterAll(char*); 161 EXTERN int MatConvertRegisterDestroy(void); 162 extern PetscTruth MatConvertRegisterAllCalled; 163 extern FList MatConvertList; 164 EXTERN int MatConvert(Mat,MatType,Mat*); 165 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 166 167 /*E 168 MatStructure - Indicates if the matrix has the same nonzero structure 169 170 Level: beginner 171 172 Any additions/changes here MUST also be made in include/finclude/petscmat.h 173 174 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 175 E*/ 176 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 177 178 EXTERN int MatCopy(Mat,Mat,MatStructure); 179 EXTERN int MatView(Mat,Viewer); 180 181 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(Viewer,MatType,Mat*)); 182 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 183 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 184 #else 185 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 186 #endif 187 EXTERN int MatLoadRegisterAll(char*); 188 EXTERN int MatLoadRegisterDestroy(void); 189 extern PetscTruth MatLoadRegisterAllCalled; 190 extern FList MatLoadList; 191 EXTERN int MatLoad(Viewer,MatType,Mat*); 192 193 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 194 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 195 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 196 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 197 198 /*S 199 MatInfo - Context of matrix information, used with MatGetInfo() 200 201 In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 202 203 Level: intermediate 204 205 Concepts: matrix^nonzero information 206 207 .seealso: MatGetInfo() 208 S*/ 209 typedef struct { 210 PLogDouble rows_global,columns_global; /* number of global rows and columns */ 211 PLogDouble rows_local,columns_local; /* number of local rows and columns */ 212 PLogDouble block_size; /* block size */ 213 PLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 214 PLogDouble memory; /* memory allocated */ 215 PLogDouble assemblies; /* number of matrix assemblies called */ 216 PLogDouble mallocs; /* number of mallocs during MatSetValues() */ 217 PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 218 PLogDouble factor_mallocs; /* number of mallocs during factorization */ 219 } MatInfo; 220 221 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 222 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 223 EXTERN int MatValid(Mat,PetscTruth*); 224 EXTERN int MatGetDiagonal(Mat,Vec); 225 EXTERN int MatGetRowMax(Mat,Vec); 226 EXTERN int MatTranspose(Mat,Mat*); 227 EXTERN int MatPermute(Mat,IS,IS,Mat *); 228 EXTERN int MatDiagonalScale(Mat,Vec,Vec); 229 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 230 EXTERN int MatEqual(Mat,Mat,PetscTruth*); 231 232 EXTERN int MatNorm(Mat,NormType,double *); 233 EXTERN int MatZeroEntries(Mat); 234 EXTERN int MatZeroRows(Mat,IS,Scalar*); 235 EXTERN int MatZeroColumns(Mat,IS,Scalar*); 236 237 EXTERN int MatUseScaledForm(Mat,PetscTruth); 238 EXTERN int MatScaleSystem(Mat,Vec,Vec); 239 EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 240 241 EXTERN int MatGetSize(Mat,int*,int*); 242 EXTERN int MatGetLocalSize(Mat,int*,int*); 243 EXTERN int MatGetOwnershipRange(Mat,int*,int*); 244 245 /*E 246 MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 247 or MatGetSubMatrix() are to be reused to store the new matrix values. 248 249 Level: beginner 250 251 Any additions/changes here MUST also be made in include/finclude/petscmat.h 252 253 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 254 E*/ 255 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 256 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 257 EXTERN int MatDestroyMatrices(int,Mat **); 258 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 259 260 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 261 262 EXTERN int MatAXPY(Scalar *,Mat,Mat); 263 EXTERN int MatAYPX(Scalar *,Mat,Mat); 264 EXTERN int MatCompress(Mat); 265 266 EXTERN int MatScale(Scalar *,Mat); 267 EXTERN int MatShift(Scalar *,Mat); 268 269 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 270 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 271 EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*); 272 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 273 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 274 275 EXTERN int MatSetStashInitialSize(Mat,int,int); 276 277 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 278 EXTERN int MatInterpolate(Mat,Vec,Vec); 279 EXTERN int MatRestrict(Mat,Vec,Vec); 280 281 /* 282 These three (or four) macros MUST be used together. The third one closes the open { of the first one 283 */ 284 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 285 { \ 286 int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 287 dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);onz = dnz + __tmp;\ 288 __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\ 289 __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\ 290 __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp; 291 292 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 293 {\ 294 int __l;\ 295 __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\ 296 __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\ 297 for (__l=0;__l<nrows;__l++) {\ 298 __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\ 299 }\ 300 } 301 302 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 303 { int __i; \ 304 for (__i=0; __i<nc; __i++) {\ 305 if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 306 }\ 307 dnz[row - __rstart] = nc - onz[row - __rstart];\ 308 } 309 310 #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);} 311 312 /* Routines unique to particular data structures */ 313 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 314 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 315 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 316 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*); 317 318 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 319 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 320 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 321 EXTERN int MatSeqDensePreallocation(Mat,Scalar*); 322 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**); 323 EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*); 324 325 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 326 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 327 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 328 EXTERN int MatMPIDensePreallocation(Mat,Scalar*); 329 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**); 330 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 331 EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*); 332 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 333 334 EXTERN int MatStoreValues(Mat); 335 EXTERN int MatRetrieveValues(Mat); 336 337 /* 338 These routines are not usually accessed directly, rather solving is 339 done through the SLES, KSP and PC interfaces. 340 */ 341 342 typedef char* MatOrderingType; 343 #define MATORDERING_NATURAL "natural" 344 #define MATORDERING_ND "nd" 345 #define MATORDERING_1WD "1wd" 346 #define MATORDERING_RCM "rcm" 347 #define MATORDERING_QMD "qmd" 348 #define MATORDERING_ROWLENGTH "rowlength" 349 350 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 351 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 352 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 353 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 354 #else 355 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 356 #endif 357 EXTERN int MatOrderingRegisterDestroy(void); 358 EXTERN int MatOrderingRegisterAll(char*); 359 extern PetscTruth MatOrderingRegisterAllCalled; 360 extern FList MatOrderingList; 361 362 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 363 364 EXTERN int MatCholeskyFactor(Mat,IS,double); 365 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 366 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 367 368 /*S 369 MatILUInfo - Data based into the matrix ILU factorization routines 370 371 In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 372 373 Notes: These are not usually directly used by users, instead use the PC type of ILU 374 All entries are double precision. 375 376 Level: developer 377 378 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 379 380 S*/ 381 typedef struct { 382 double levels; /* ILU(levels) */ 383 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 384 double diagonal_fill; /* force diagonal to fill in if initially not filled */ 385 double dt; /* drop tolerance */ 386 double dtcol; /* tolerance for pivoting */ 387 double dtcount; /* maximum nonzeros to be allowed per row */ 388 double damping; /* scaling of identity added to matrix to prevent zero pivots */ 389 double damp; /* if is 1.0 and factorization fails, damp until successful */ 390 } MatILUInfo; 391 392 /*S 393 MatLUInfo - Data based into the matrix LU factorization routines 394 395 In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 396 397 Notes: These are not usually directly used by users, instead use the PC type of LU 398 All entries are double precision. 399 400 Level: developer 401 402 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 403 404 S*/ 405 typedef struct { 406 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 407 double dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 408 double damping; /* scaling of identity added to matrix to prevent zero pivots */ 409 double damp; /* if this is 1.0 and factorization fails, damp until successful */ 410 } MatLUInfo; 411 412 /*S 413 MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 414 415 In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 416 417 Notes: These are not usually directly used by users, instead use the PC type of Cholesky 418 All entries are double precision. 419 420 Level: developer 421 422 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 423 424 S*/ 425 typedef struct { 426 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 427 double damping; /* scaling of identity added to matrix to prevent zero pivots */ 428 double damp; /* if this is 1.0 and factorization fails, damp until successful */ 429 } MatCholeskyInfo; 430 431 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 432 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 433 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 434 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 435 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 436 EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int); 437 EXTERN int MatLUFactorNumeric(Mat,Mat*); 438 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 439 440 EXTERN int MatSolve(Mat,Vec,Vec); 441 EXTERN int MatForwardSolve(Mat,Vec,Vec); 442 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 443 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 444 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 445 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 446 447 EXTERN int MatSetUnfactored(Mat); 448 449 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 450 /*E 451 MatSORType - What type of (S)SOR to perform 452 453 Level: beginner 454 455 Any additions/changes here MUST also be made in include/finclude/petscmat.h 456 457 .seealso: MatRelax() 458 E*/ 459 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 460 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 461 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 462 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 463 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 464 465 /* 466 These routines are for efficiently computing Jacobians via finite differences. 467 */ 468 469 typedef char* MatColoringType; 470 #define MATCOLORING_NATURAL "natural" 471 #define MATCOLORING_SL "sl" 472 #define MATCOLORING_LF "lf" 473 #define MATCOLORING_ID "id" 474 475 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 476 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 477 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 478 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 479 #else 480 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 481 #endif 482 EXTERN int MatColoringRegisterAll(char *); 483 extern PetscTruth MatColoringRegisterAllCalled; 484 EXTERN int MatColoringRegisterDestroy(void); 485 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 486 487 /* 488 Data structures used to compute Jacobian vector products 489 efficiently using finite differences. 490 */ 491 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 492 493 typedef struct _p_MatFDColoring *MatFDColoring; 494 495 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 496 EXTERN int MatFDColoringDestroy(MatFDColoring); 497 EXTERN int MatFDColoringView(MatFDColoring,Viewer); 498 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 499 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 500 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 501 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 502 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 503 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 504 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 505 506 /* 507 These routines are for partitioning matrices: currently used only 508 for adjacency matrix, MatCreateMPIAdj(). 509 */ 510 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 511 512 typedef struct _p_MatPartitioning *MatPartitioning; 513 typedef char* MatPartitioningType; 514 #define MATPARTITIONING_CURRENT "current" 515 #define MATPARTITIONING_PARMETIS "parmetis" 516 517 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 518 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 519 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 520 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 521 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 522 EXTERN int MatPartitioningDestroy(MatPartitioning); 523 524 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 525 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 526 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 527 #else 528 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 529 #endif 530 531 EXTERN int MatPartitioningRegisterAll(char *); 532 extern PetscTruth MatPartitioningRegisterAllCalled; 533 EXTERN int MatPartitioningRegisterDestroy(void); 534 535 EXTERN int MatPartitioningView(MatPartitioning,Viewer); 536 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 537 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 538 539 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 540 541 /* 542 If you add entries here you must also add them to finclude/petscmat.h 543 */ 544 typedef enum { MATOP_SET_VALUES=0, 545 MATOP_GET_ROW=1, 546 MATOP_RESTORE_ROW=2, 547 MATOP_MULT=3, 548 MATOP_MULT_ADD=4, 549 MATOP_MULT_TRANSPOSE=5, 550 MATOP_MULT_TRANSPOSE_ADD=6, 551 MATOP_SOLVE=7, 552 MATOP_SOLVE_ADD=8, 553 MATOP_SOLVE_TRANSPOSE=9, 554 MATOP_SOLVE_TRANSPOSE_ADD=10, 555 MATOP_LUFACTOR=11, 556 MATOP_CHOLESKYFACTOR=12, 557 MATOP_RELAX=13, 558 MATOP_TRANSPOSE=14, 559 MATOP_GETINFO=15, 560 MATOP_EQUAL=16, 561 MATOP_GET_DIAGONAL=17, 562 MATOP_DIAGONAL_SCALE=18, 563 MATOP_NORM=19, 564 MATOP_ASSEMBLY_BEGIN=20, 565 MATOP_ASSEMBLY_END=21, 566 MATOP_COMPRESS=22, 567 MATOP_SET_OPTION=23, 568 MATOP_ZERO_ENTRIES=24, 569 MATOP_ZERO_ROWS=25, 570 MATOP_LUFACTOR_SYMBOLIC=26, 571 MATOP_LUFACTOR_NUMERIC=27, 572 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 573 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 574 MATOP_GET_SIZE=30, 575 MATOP_GET_LOCAL_SIZE=31, 576 MATOP_GET_OWNERSHIP_RANGE=32, 577 MATOP_ILUFACTOR_SYMBOLIC=33, 578 MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 579 MATOP_GET_ARRAY=35, 580 MATOP_RESTORE_ARRAY=36, 581 582 MATOP_CONVERT_SAME_TYPE=37, 583 MATOP_FORWARD_SOLVE=38, 584 MATOP_BACKWARD_SOLVE=39, 585 MATOP_ILUFACTOR=40, 586 MATOP_INCOMPLETECHOLESKYFACTOR=41, 587 MATOP_AXPY=42, 588 MATOP_GET_SUBMATRICES=43, 589 MATOP_INCREASE_OVERLAP=44, 590 MATOP_GET_VALUES=45, 591 MATOP_COPY=46, 592 MATOP_PRINT_HELP=47, 593 MATOP_SCALE=48, 594 MATOP_SHIFT=49, 595 MATOP_DIAGONAL_SHIFT=50, 596 MATOP_ILUDT_FACTOR=51, 597 MATOP_GET_BLOCK_SIZE=52, 598 MATOP_GET_ROW_IJ=53, 599 MATOP_RESTORE_ROW_IJ=54, 600 MATOP_GET_COLUMN_IJ=55, 601 MATOP_RESTORE_COLUMN_IJ=56, 602 MATOP_FDCOLORING_CREATE=57, 603 MATOP_COLORING_PATCH=58, 604 MATOP_SET_UNFACTORED=59, 605 MATOP_PERMUTE=60, 606 MATOP_SET_VALUES_BLOCKED=61, 607 MATOP_DESTROY=250, 608 MATOP_VIEW=251 609 } MatOperation; 610 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 611 EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 612 EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 613 EXTERN int MatShellSetContext(Mat,void*); 614 615 /* 616 Codes for matrices stored on disk. By default they are 617 stored in a universal format. By changing the format with 618 ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 619 be stored in a way natural for the matrix, for example dense matrices 620 would be stored as dense. Matrices stored this way may only be 621 read into matrices of the same time. 622 */ 623 #define MATRIX_BINARY_FORMAT_DENSE -1 624 625 /* 626 New matrix classes not yet distributed 627 */ 628 /* 629 MatAIJIndices is a data structure for storing the nonzero location information 630 for sparse matrices. Several matrices with identical nonzero structure can share 631 the same MatAIJIndices. 632 */ 633 typedef struct _p_MatAIJIndices* MatAIJIndices; 634 635 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 636 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 637 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 638 EXTERN int MatDestroyAIJIndices(MatAIJIndices); 639 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 640 EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 641 EXTERN int MatShiftAIJIndices(MatAIJIndices); 642 EXTERN int MatShrinkAIJIndices(MatAIJIndices); 643 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 644 645 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 646 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 647 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 648 649 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 650 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 651 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 652 653 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 654 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 655 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 656 657 typedef struct _p_MatNullSpace* MatNullSpace; 658 #define MATNULLSPACE_COOKIE PETSC_COOKIE+17 659 660 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 661 EXTERN int MatNullSpaceDestroy(MatNullSpace); 662 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 663 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 664 EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 665 666 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 667 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 668 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 669 670 671 EXTERN int MatCreateMAIJ(Mat,int,Mat*); 672 EXTERN int MatMAIJRedimension(Mat,int,Mat*); 673 EXTERN int MatMAIJGetAIJ(Mat,Mat*); 674 675 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 676 677 #endif 678 679 680 681