1 /* $Id: petscmat.h,v 1.211 2001/01/15 21:45:26 bsmith Exp balay $ */ 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 PetscFList 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 PetscFList 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,PetscViewer); 180 181 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,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 PetscFList MatLoadList; 191 EXTERN int MatLoad(PetscViewer,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 PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 211 PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 212 PetscLogDouble block_size; /* block size */ 213 PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 214 PetscLogDouble memory; /* memory allocated */ 215 PetscLogDouble assemblies; /* number of matrix assemblies called */ 216 PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 217 PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 218 PetscLogDouble 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 __ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(__ierr);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 #define MATORDERING_DSC_ND "dsc_nd" 350 #define MATORDERING_DSC_MMD "dsc_mmd" 351 #define MATORDERING_DSC_MDF "dsc_mdf" 352 353 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 354 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 355 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 356 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 357 #else 358 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 359 #endif 360 EXTERN int MatOrderingRegisterDestroy(void); 361 EXTERN int MatOrderingRegisterAll(char*); 362 extern PetscTruth MatOrderingRegisterAllCalled; 363 extern PetscFList MatOrderingList; 364 365 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 366 367 EXTERN int MatCholeskyFactor(Mat,IS,double); 368 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 369 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 370 371 /*S 372 MatILUInfo - Data based into the matrix ILU factorization routines 373 374 In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 375 376 Notes: These are not usually directly used by users, instead use the PC type of ILU 377 All entries are double precision. 378 379 Level: developer 380 381 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 382 383 S*/ 384 typedef struct { 385 double levels; /* ILU(levels) */ 386 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 387 double diagonal_fill; /* force diagonal to fill in if initially not filled */ 388 double dt; /* drop tolerance */ 389 double dtcol; /* tolerance for pivoting */ 390 double dtcount; /* maximum nonzeros to be allowed per row */ 391 double damping; /* scaling of identity added to matrix to prevent zero pivots */ 392 double damp; /* if is 1.0 and factorization fails, damp until successful */ 393 } MatILUInfo; 394 395 /*S 396 MatLUInfo - Data based into the matrix LU factorization routines 397 398 In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 399 400 Notes: These are not usually directly used by users, instead use the PC type of LU 401 All entries are double precision. 402 403 Level: developer 404 405 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 406 407 S*/ 408 typedef struct { 409 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 410 double dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 411 double damping; /* scaling of identity added to matrix to prevent zero pivots */ 412 double damp; /* if this is 1.0 and factorization fails, damp until successful */ 413 } MatLUInfo; 414 415 /*S 416 MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 417 418 In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 419 420 Notes: These are not usually directly used by users, instead use the PC type of Cholesky 421 All entries are double precision. 422 423 Level: developer 424 425 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 426 427 S*/ 428 typedef struct { 429 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 430 double damping; /* scaling of identity added to matrix to prevent zero pivots */ 431 double damp; /* if this is 1.0 and factorization fails, damp until successful */ 432 } MatCholeskyInfo; 433 434 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 435 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 436 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 437 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 438 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 439 EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int); 440 EXTERN int MatLUFactorNumeric(Mat,Mat*); 441 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 442 443 EXTERN int MatSolve(Mat,Vec,Vec); 444 EXTERN int MatForwardSolve(Mat,Vec,Vec); 445 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 446 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 447 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 448 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 449 450 EXTERN int MatSetUnfactored(Mat); 451 452 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 453 /*E 454 MatSORType - What type of (S)SOR to perform 455 456 Level: beginner 457 458 Any additions/changes here MUST also be made in include/finclude/petscmat.h 459 460 .seealso: MatRelax() 461 E*/ 462 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 463 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 464 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 465 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 466 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 467 468 /* 469 These routines are for efficiently computing Jacobians via finite differences. 470 */ 471 472 typedef char* MatColoringType; 473 #define MATCOLORING_NATURAL "natural" 474 #define MATCOLORING_SL "sl" 475 #define MATCOLORING_LF "lf" 476 #define MATCOLORING_ID "id" 477 478 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 479 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 480 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 481 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 482 #else 483 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 484 #endif 485 EXTERN int MatColoringRegisterAll(char *); 486 extern PetscTruth MatColoringRegisterAllCalled; 487 EXTERN int MatColoringRegisterDestroy(void); 488 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 489 490 /* 491 Data structures used to compute Jacobian vector products 492 efficiently using finite differences. 493 */ 494 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 495 496 typedef struct _p_MatFDColoring *MatFDColoring; 497 498 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 499 EXTERN int MatFDColoringDestroy(MatFDColoring); 500 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 501 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 502 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 503 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 504 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 505 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 506 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 507 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 508 EXTERN int MatFDColoringSetRecompute(MatFDColoring); 509 510 /* 511 These routines are for partitioning matrices: currently used only 512 for adjacency matrix, MatCreateMPIAdj(). 513 */ 514 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 515 516 typedef struct _p_MatPartitioning *MatPartitioning; 517 typedef char* MatPartitioningType; 518 #define MATPARTITIONING_CURRENT "current" 519 #define MATPARTITIONING_PARMETIS "parmetis" 520 521 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 522 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 523 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 524 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 525 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 526 EXTERN int MatPartitioningDestroy(MatPartitioning); 527 528 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 529 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 530 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 531 #else 532 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 533 #endif 534 535 EXTERN int MatPartitioningRegisterAll(char *); 536 extern PetscTruth MatPartitioningRegisterAllCalled; 537 EXTERN int MatPartitioningRegisterDestroy(void); 538 539 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 540 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 541 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 542 543 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 544 545 /* 546 If you add entries here you must also add them to finclude/petscmat.h 547 */ 548 typedef enum { MATOP_SET_VALUES=0, 549 MATOP_GET_ROW=1, 550 MATOP_RESTORE_ROW=2, 551 MATOP_MULT=3, 552 MATOP_MULT_ADD=4, 553 MATOP_MULT_TRANSPOSE=5, 554 MATOP_MULT_TRANSPOSE_ADD=6, 555 MATOP_SOLVE=7, 556 MATOP_SOLVE_ADD=8, 557 MATOP_SOLVE_TRANSPOSE=9, 558 MATOP_SOLVE_TRANSPOSE_ADD=10, 559 MATOP_LUFACTOR=11, 560 MATOP_CHOLESKYFACTOR=12, 561 MATOP_RELAX=13, 562 MATOP_TRANSPOSE=14, 563 MATOP_GETINFO=15, 564 MATOP_EQUAL=16, 565 MATOP_GET_DIAGONAL=17, 566 MATOP_DIAGONAL_SCALE=18, 567 MATOP_NORM=19, 568 MATOP_ASSEMBLY_BEGIN=20, 569 MATOP_ASSEMBLY_END=21, 570 MATOP_COMPRESS=22, 571 MATOP_SET_OPTION=23, 572 MATOP_ZERO_ENTRIES=24, 573 MATOP_ZERO_ROWS=25, 574 MATOP_LUFACTOR_SYMBOLIC=26, 575 MATOP_LUFACTOR_NUMERIC=27, 576 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 577 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 578 MATOP_GET_SIZE=30, 579 MATOP_GET_LOCAL_SIZE=31, 580 MATOP_GET_OWNERSHIP_RANGE=32, 581 MATOP_ILUFACTOR_SYMBOLIC=33, 582 MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 583 MATOP_GET_ARRAY=35, 584 MATOP_RESTORE_ARRAY=36, 585 586 MATOP_CONVERT_SAME_TYPE=37, 587 MATOP_FORWARD_SOLVE=38, 588 MATOP_BACKWARD_SOLVE=39, 589 MATOP_ILUFACTOR=40, 590 MATOP_INCOMPLETECHOLESKYFACTOR=41, 591 MATOP_AXPY=42, 592 MATOP_GET_SUBMATRICES=43, 593 MATOP_INCREASE_OVERLAP=44, 594 MATOP_GET_VALUES=45, 595 MATOP_COPY=46, 596 MATOP_PRINT_HELP=47, 597 MATOP_SCALE=48, 598 MATOP_SHIFT=49, 599 MATOP_DIAGONAL_SHIFT=50, 600 MATOP_ILUDT_FACTOR=51, 601 MATOP_GET_BLOCK_SIZE=52, 602 MATOP_GET_ROW_IJ=53, 603 MATOP_RESTORE_ROW_IJ=54, 604 MATOP_GET_COLUMN_IJ=55, 605 MATOP_RESTORE_COLUMN_IJ=56, 606 MATOP_FDCOLORING_CREATE=57, 607 MATOP_COLORING_PATCH=58, 608 MATOP_SET_UNFACTORED=59, 609 MATOP_PERMUTE=60, 610 MATOP_SET_VALUES_BLOCKED=61, 611 MATOP_DESTROY=250, 612 MATOP_VIEW=251 613 } MatOperation; 614 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 615 EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 616 EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 617 EXTERN int MatShellSetContext(Mat,void*); 618 619 /* 620 Codes for matrices stored on disk. By default they are 621 stored in a universal format. By changing the format with 622 PetscViewerSetFormat(viewer,PETSC_VIEWER_FORMAT_BINARY_NATIVE); the matrices will 623 be stored in a way natural for the matrix, for example dense matrices 624 would be stored as dense. Matrices stored this way may only be 625 read into matrices of the same time. 626 */ 627 #define MATRIX_BINARY_FORMAT_DENSE -1 628 629 /* 630 New matrix classes not yet distributed 631 */ 632 /* 633 MatAIJIndices is a data structure for storing the nonzero location information 634 for sparse matrices. Several matrices with identical nonzero structure can share 635 the same MatAIJIndices. 636 */ 637 typedef struct _p_MatAIJIndices* MatAIJIndices; 638 639 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 640 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 641 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 642 EXTERN int MatDestroyAIJIndices(MatAIJIndices); 643 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 644 EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 645 EXTERN int MatShiftAIJIndices(MatAIJIndices); 646 EXTERN int MatShrinkAIJIndices(MatAIJIndices); 647 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 648 649 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 650 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 651 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 652 653 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 654 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 655 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 656 657 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 658 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 659 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 660 661 typedef struct _p_MatNullSpace* MatNullSpace; 662 #define MATNULLSPACE_COOKIE PETSC_COOKIE+17 663 664 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 665 EXTERN int MatNullSpaceDestroy(MatNullSpace); 666 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 667 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 668 EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 669 670 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 671 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 672 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 673 674 675 EXTERN int MatCreateMAIJ(Mat,int,Mat*); 676 EXTERN int MatMAIJRedimension(Mat,int,Mat*); 677 EXTERN int MatMAIJGetAIJ(Mat,Mat*); 678 679 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 680 681 EXTERN int MatComputeExplicitOperator(Mat,Mat*); 682 683 #endif 684 685 686 687