1 /* $Id: petscmat.h,v 1.190 2000/05/08 15:09:50 balay 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 13 #define MAX_MATRIX_TYPES 14 14 /* 15 The default matrix data storage formats and routines to create them. 16 17 MATLASTTYPE is "end-of-list" marker that can be used to check that 18 MAX_MATRIX_TYPES is large enough. The rule is 19 MAX_MATRIX_TYPES >= MATLASTTYPE . 20 21 To do: add a test program that checks the consistency of these values. 22 */ 23 typedef enum { MATSAME=-1, MATSEQDENSE, MATSEQAIJ, MATMPIAIJ, MATSHELL, 24 MATMPIROWBS, MATSEQBDIAG, MATMPIBDIAG, MATMPIDENSE, MATSEQBAIJ, 25 MATMPIBAIJ, MATMPICSN, MATSEQCSN, MATMPIADJ, MATSEQSBAIJ, 26 MATMPISBAIJ, MATLASTTYPE } MatType; 27 28 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 29 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*); 30 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*); 31 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 32 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 33 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,Mat*); 34 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*); 35 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*); 36 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 37 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 38 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 39 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 40 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 41 42 43 EXTERN int MatDestroy(Mat); 44 45 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 46 EXTERN int MatShellGetContext(Mat,void **); 47 48 EXTERN int MatPrintHelp(Mat); 49 EXTERN int MatGetMaps(Mat,Map*,Map*); 50 51 /* ------------------------------------------------------------*/ 52 EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode); 53 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode); 54 55 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 56 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 57 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 58 EXTERN int MatAssembled(Mat,PetscTruth*); 59 60 #define MatSetValue(v,i,j,va,mode) \ 61 {int _ierr,_row = i,_col = j; Scalar _va = va; \ 62 _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 63 } 64 #define MatGetValue(v,i,j,va) \ 65 {int _ierr,_row = i,_col = j; \ 66 _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 67 } 68 /* 69 Any additions/changes here MUST also be made in include/finclude/petscmat.h 70 */ 71 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 72 MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 73 MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 74 MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 75 MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 76 MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 77 MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 78 MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 79 MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 80 MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 81 MAT_DO_NOT_USE_INODES} MatOption; 82 EXTERN int MatSetOption(Mat,MatOption); 83 EXTERN int MatGetType(Mat,MatType*,char**); 84 EXTERN int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,PetscTruth*); 85 86 EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*); 87 EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**); 88 EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**); 89 EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**); 90 EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**); 91 EXTERN int MatGetColumnVector(Mat,Vec,int); 92 EXTERN int MatGetArray(Mat,Scalar **); 93 EXTERN int MatRestoreArray(Mat,Scalar **); 94 EXTERN int MatGetBlockSize(Mat,int *); 95 96 EXTERN int MatMult(Mat,Vec,Vec); 97 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 98 EXTERN int MatMultTranspose(Mat,Vec,Vec); 99 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 100 101 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 102 103 EXTERN int MatConvert(Mat,MatType,Mat*); 104 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 105 EXTERN int MatConvertRegister(MatType,MatType,int (*)(Mat,MatType,Mat*)); 106 EXTERN int MatConvertRegisterAll(void); 107 108 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 109 110 EXTERN int MatCopy(Mat,Mat,MatStructure); 111 EXTERN int MatView(Mat,Viewer); 112 EXTERN int MatLoad(Viewer,MatType,Mat*); 113 EXTERN int MatLoadRegister(MatType,int (*)(Viewer,MatType,Mat*)); 114 EXTERN int MatLoadRegisterAll(void); 115 116 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 117 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 118 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 119 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 120 121 /* 122 Context of matrix information, used with MatGetInfo() 123 Note: If any entries are added to this context, be sure 124 to adjust MAT_INFO_SIZE in finclude/petscmat.h 125 */ 126 typedef struct { 127 PLogDouble rows_global,columns_global; /* number of global rows and columns */ 128 PLogDouble rows_local,columns_local; /* number of local rows and columns */ 129 PLogDouble block_size; /* block size */ 130 PLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 131 PLogDouble memory; /* memory allocated */ 132 PLogDouble assemblies; /* number of matrix assemblies */ 133 PLogDouble mallocs; /* number of mallocs during MatSetValues() */ 134 PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 135 PLogDouble factor_mallocs; /* number of mallocs during factorization */ 136 } MatInfo; 137 138 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 139 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 140 EXTERN int MatValid(Mat,PetscTruth*); 141 EXTERN int MatGetDiagonal(Mat,Vec); 142 EXTERN int MatTranspose(Mat,Mat*); 143 EXTERN int MatPermute(Mat,IS,IS,Mat *); 144 EXTERN int MatDiagonalScale(Mat,Vec,Vec); 145 EXTERN int MatDiagonalShift(Mat,Vec); 146 EXTERN int MatEqual(Mat,Mat,PetscTruth*); 147 148 EXTERN int MatNorm(Mat,NormType,double *); 149 EXTERN int MatZeroEntries(Mat); 150 EXTERN int MatZeroRows(Mat,IS,Scalar*); 151 EXTERN int MatZeroColumns(Mat,IS,Scalar*); 152 153 EXTERN int MatUseScaledForm(Mat,PetscTruth); 154 EXTERN int MatScaleSystem(Mat,Vec,Vec); 155 EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 156 157 EXTERN int MatGetSize(Mat,int*,int*); 158 EXTERN int MatGetLocalSize(Mat,int*,int*); 159 EXTERN int MatGetOwnershipRange(Mat,int*,int*); 160 161 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 162 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 163 EXTERN int MatDestroyMatrices(int,Mat **); 164 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 165 166 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 167 168 EXTERN int MatAXPY(Scalar *,Mat,Mat); 169 EXTERN int MatAYPX(Scalar *,Mat,Mat); 170 EXTERN int MatCompress(Mat); 171 172 EXTERN int MatScale(Scalar *,Mat); 173 EXTERN int MatShift(Scalar *,Mat); 174 175 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 176 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 177 EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*); 178 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 179 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 180 181 EXTERN int MatSetStashInitialSize(Mat,int,int); 182 183 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 184 EXTERN int MatInterpolate(Mat,Vec,Vec); 185 EXTERN int MatRestrict(Mat,Vec,Vec); 186 187 /* 188 These three macros MUST be used together. The third one closes the open { of the first one 189 */ 190 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) \ 191 { \ 192 int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 193 dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);onz = dnz + __tmp;\ 194 __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\ 195 __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\ 196 __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp; 197 198 #define MatPreallocateSet(row,nc,cols,dnz,onz)\ 199 { int __i; \ 200 for (__i=0; __i<nc; __i++) {\ 201 if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 202 }\ 203 dnz[row - __rstart] = nc - onz[row - __rstart];\ 204 } 205 206 #define MatPreallocateFinalize(dnz,onz) __ierr = PetscFree(dnz);CHKERRQ(__ierr);} 207 208 /* Routines unique to particular data structures */ 209 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 210 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 211 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 212 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*); 213 214 EXTERN int MatStoreValues(Mat); 215 EXTERN int MatRetrieveValues(Mat); 216 217 /* 218 These routines are not usually accessed directly, rather solving is 219 done through the SLES, KSP and PC interfaces. 220 */ 221 222 typedef char* MatOrderingType; 223 #define MATORDERING_NATURAL "natural" 224 #define MATORDERING_ND "nd" 225 #define MATORDERING_1WD "1wd" 226 #define MATORDERING_RCM "rcm" 227 #define MATORDERING_QMD "qmd" 228 #define MATORDERING_ROWLENGTH "rowlength" 229 230 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 231 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 232 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 233 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 234 #else 235 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 236 #endif 237 EXTERN int MatOrderingRegisterDestroy(void); 238 EXTERN int MatOrderingRegisterAll(char*); 239 extern PetscTruth MatOrderingRegisterAllCalled; 240 241 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 242 243 EXTERN int MatCholeskyFactor(Mat,IS,double); 244 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 245 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 246 247 /* 248 Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic() 249 Note: If any entries are added to this context, be sure 250 to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h 251 252 Note: The integer values below are passed in double to allow easy use from 253 Fortran 254 */ 255 typedef struct { 256 double levels; /* ILU(levels) */ 257 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 258 double diagonal_fill; /* force diagonal to fill in if initially not filled */ 259 260 double dt; /* drop tolerance */ 261 double dtcol; /* tolerance for pivoting */ 262 double dtcount; /* maximum nonzeros to be allowed per row */ 263 } MatILUInfo; 264 265 EXTERN int MatLUFactor(Mat,IS,IS,double); 266 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 267 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*); 268 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 269 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 270 EXTERN int MatLUFactorNumeric(Mat,Mat*); 271 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 272 273 EXTERN int MatSolve(Mat,Vec,Vec); 274 EXTERN int MatForwardSolve(Mat,Vec,Vec); 275 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 276 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 277 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 278 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 279 280 EXTERN int MatSetUnfactored(Mat); 281 282 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 283 284 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 285 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 286 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 287 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 288 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 289 290 /* 291 These routines are for efficiently computing Jacobians via finite differences. 292 */ 293 294 typedef char* MatColoringType; 295 #define MATCOLORING_NATURAL "natural" 296 #define MATCOLORING_SL "sl" 297 #define MATCOLORING_LF "lf" 298 #define MATCOLORING_ID "id" 299 300 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 301 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 302 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 303 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 304 #else 305 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 306 #endif 307 EXTERN int MatColoringRegisterAll(char *); 308 extern PetscTruth MatColoringRegisterAllCalled; 309 EXTERN int MatColoringRegisterDestroy(void); 310 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 311 312 /* 313 Data structures used to compute Jacobian vector products 314 efficiently using finite differences. 315 */ 316 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 317 318 typedef struct _p_MatFDColoring *MatFDColoring; 319 320 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 321 EXTERN int MatFDColoringDestroy(MatFDColoring); 322 EXTERN int MatFDColoringView(MatFDColoring,Viewer); 323 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 324 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 325 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 326 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 327 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 328 EXTERN int MatFDColoringPrintHelp(MatFDColoring); 329 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 330 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 331 332 /* 333 These routines are for partitioning matrices: currently used only 334 for adjacency matrix, MatCreateMPIAdj(). 335 */ 336 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 337 338 typedef struct _p_MatPartitioning *MatPartitioning; 339 typedef char* MatPartitioningType; 340 #define MATPARTITIONING_CURRENT "current" 341 #define MATPARTITIONING_PARMETIS "parmetis" 342 343 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 344 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 345 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 346 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 347 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 348 EXTERN int MatPartitioningDestroy(MatPartitioning); 349 350 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 351 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 352 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 353 #else 354 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 355 #endif 356 357 EXTERN int MatPartitioningRegisterAll(char *); 358 extern PetscTruth MatPartitioningRegisterAllCalled; 359 EXTERN int MatPartitioningRegisterDestroy(void); 360 361 EXTERN int MatPartitioningView(MatPartitioning,Viewer); 362 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 363 EXTERN int MatPartitioningPrintHelp(MatPartitioning); 364 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 365 366 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 367 368 /* 369 If you add entries here you must also add them to finclude/petscmat.h 370 */ 371 typedef enum { MATOP_SET_VALUES=0, 372 MATOP_GET_ROW=1, 373 MATOP_RESTORE_ROW=2, 374 MATOP_MULT=3, 375 MATOP_MULT_ADD=4, 376 MATOP_MULT_TRANSPOSE=5, 377 MATOP_MULT_TRANSPOSE_ADD=6, 378 MATOP_SOLVE=7, 379 MATOP_SOLVE_ADD=8, 380 MATOP_SOLVE_TRANSPOSE=9, 381 MATOP_SOLVE_TRANSPOSE_ADD=10, 382 MATOP_LUFACTOR=11, 383 MATOP_CHOLESKYFACTOR=12, 384 MATOP_RELAX=13, 385 MATOP_TRANSPOSE=14, 386 MATOP_GETINFO=15, 387 MATOP_EQUAL=16, 388 MATOP_GET_DIAGONAL=17, 389 MATOP_DIAGONAL_SCALE=18, 390 MATOP_NORM=19, 391 MATOP_ASSEMBLY_BEGIN=20, 392 MATOP_ASSEMBLY_END=21, 393 MATOP_COMPRESS=22, 394 MATOP_SET_OPTION=23, 395 MATOP_ZERO_ENTRIES=24, 396 MATOP_ZERO_ROWS=25, 397 MATOP_LUFACTOR_SYMBOLIC=26, 398 MATOP_LUFACTOR_NUMERIC=27, 399 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 400 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 401 MATOP_GET_SIZE=30, 402 MATOP_GET_LOCAL_SIZE=31, 403 MATOP_GET_OWNERSHIP_RANGE=32, 404 MATOP_ILUFACTOR_SYMBOLIC=33, 405 MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 406 MATOP_GET_ARRAY=35, 407 MATOP_RESTORE_ARRAY=36, 408 409 MATOP_CONVERT_SAME_TYPE=37, 410 MATOP_FORWARD_SOLVE=38, 411 MATOP_BACKWARD_SOLVE=39, 412 MATOP_ILUFACTOR=40, 413 MATOP_INCOMPLETECHOLESKYFACTOR=41, 414 MATOP_AXPY=42, 415 MATOP_GET_SUBMATRICES=43, 416 MATOP_INCREASE_OVERLAP=44, 417 MATOP_GET_VALUES=45, 418 MATOP_COPY=46, 419 MATOP_PRINT_HELP=47, 420 MATOP_SCALE=48, 421 MATOP_SHIFT=49, 422 MATOP_DIAGONAL_SHIFT=50, 423 MATOP_ILUDT_FACTOR=51, 424 MATOP_GET_BLOCK_SIZE=52, 425 MATOP_GET_ROW_IJ=53, 426 MATOP_RESTORE_ROW_IJ=54, 427 MATOP_GET_COLUMN_IJ=55, 428 MATOP_RESTORE_COLUMN_IJ=56, 429 MATOP_FDCOLORING_CREATE=57, 430 MATOP_COLORING_PATCH=58, 431 MATOP_SET_UNFACTORED=59, 432 MATOP_PERMUTE=60, 433 MATOP_SET_VALUES_BLOCKED=61, 434 MATOP_DESTROY=250, 435 MATOP_VIEW=251 436 } MatOperation; 437 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 438 EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 439 EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 440 441 /* 442 Codes for matrices stored on disk. By default they are 443 stored in a universal format. By changing the format with 444 ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 445 be stored in a way natural for the matrix, for example dense matrices 446 would be stored as dense. Matrices stored this way may only be 447 read into matrices of the same time. 448 */ 449 #define MATRIX_BINARY_FORMAT_DENSE -1 450 451 /* 452 New matrix classes not yet distributed 453 */ 454 /* 455 MatAIJIndices is a data structure for storing the nonzero location information 456 for sparse matrices. Several matrices with identical nonzero structure can share 457 the same MatAIJIndices. 458 */ 459 typedef struct _p_MatAIJIndices* MatAIJIndices; 460 461 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 462 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 463 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 464 EXTERN int MatDestroyAIJIndices(MatAIJIndices); 465 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 466 EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 467 EXTERN int MatShiftAIJIndices(MatAIJIndices); 468 EXTERN int MatShrinkAIJIndices(MatAIJIndices); 469 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 470 471 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 472 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 473 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 474 475 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 476 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 477 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 478 479 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double); 480 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 481 482 483 #endif 484 485 486 487