1 /* $Id: petscmat.h,v 1.197 2000/05/26 18:05:09 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=82} 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 MatDiagonalSet(Mat,Vec,InsertMode); 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 of MatLUFactor() and MatLUFactorSymbolic() 250 251 Note: If any entries are added to this context, be sure 252 to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h and/or 253 to adjust MAT_LUINFO_SIZE in finclude/petscmat.h 254 255 Note: The integer values below are passed in double to allow easy use from Fortran 256 */ 257 typedef struct { 258 double levels; /* ILU(levels) */ 259 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 260 double diagonal_fill; /* force diagonal to fill in if initially not filled */ 261 262 double dt; /* drop tolerance */ 263 double dtcol; /* tolerance for pivoting */ 264 double dtcount; /* maximum nonzeros to be allowed per row */ 265 } MatILUInfo; 266 267 typedef struct { 268 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 269 double dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 270 } MatLUInfo; 271 272 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 273 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 274 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 275 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 276 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 277 EXTERN int MatLUFactorNumeric(Mat,Mat*); 278 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 279 280 EXTERN int MatSolve(Mat,Vec,Vec); 281 EXTERN int MatForwardSolve(Mat,Vec,Vec); 282 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 283 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 284 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 285 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 286 287 EXTERN int MatSetUnfactored(Mat); 288 289 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 290 291 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 292 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 293 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 294 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 295 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 296 297 /* 298 These routines are for efficiently computing Jacobians via finite differences. 299 */ 300 301 typedef char* MatColoringType; 302 #define MATCOLORING_NATURAL "natural" 303 #define MATCOLORING_SL "sl" 304 #define MATCOLORING_LF "lf" 305 #define MATCOLORING_ID "id" 306 307 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 308 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 309 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 310 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 311 #else 312 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 313 #endif 314 EXTERN int MatColoringRegisterAll(char *); 315 extern PetscTruth MatColoringRegisterAllCalled; 316 EXTERN int MatColoringRegisterDestroy(void); 317 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 318 319 /* 320 Data structures used to compute Jacobian vector products 321 efficiently using finite differences. 322 */ 323 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 324 325 typedef struct _p_MatFDColoring *MatFDColoring; 326 327 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 328 EXTERN int MatFDColoringDestroy(MatFDColoring); 329 EXTERN int MatFDColoringView(MatFDColoring,Viewer); 330 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 331 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 332 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 333 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 334 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 335 EXTERN int MatFDColoringPrintHelp(MatFDColoring); 336 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 337 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 338 339 /* 340 These routines are for partitioning matrices: currently used only 341 for adjacency matrix, MatCreateMPIAdj(). 342 */ 343 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 344 345 typedef struct _p_MatPartitioning *MatPartitioning; 346 typedef char* MatPartitioningType; 347 #define MATPARTITIONING_CURRENT "current" 348 #define MATPARTITIONING_PARMETIS "parmetis" 349 350 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 351 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 352 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 353 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 354 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 355 EXTERN int MatPartitioningDestroy(MatPartitioning); 356 357 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 358 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 359 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 360 #else 361 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 362 #endif 363 364 EXTERN int MatPartitioningRegisterAll(char *); 365 extern PetscTruth MatPartitioningRegisterAllCalled; 366 EXTERN int MatPartitioningRegisterDestroy(void); 367 368 EXTERN int MatPartitioningView(MatPartitioning,Viewer); 369 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 370 EXTERN int MatPartitioningPrintHelp(MatPartitioning); 371 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 372 373 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 374 375 /* 376 If you add entries here you must also add them to finclude/petscmat.h 377 */ 378 typedef enum { MATOP_SET_VALUES=0, 379 MATOP_GET_ROW=1, 380 MATOP_RESTORE_ROW=2, 381 MATOP_MULT=3, 382 MATOP_MULT_ADD=4, 383 MATOP_MULT_TRANSPOSE=5, 384 MATOP_MULT_TRANSPOSE_ADD=6, 385 MATOP_SOLVE=7, 386 MATOP_SOLVE_ADD=8, 387 MATOP_SOLVE_TRANSPOSE=9, 388 MATOP_SOLVE_TRANSPOSE_ADD=10, 389 MATOP_LUFACTOR=11, 390 MATOP_CHOLESKYFACTOR=12, 391 MATOP_RELAX=13, 392 MATOP_TRANSPOSE=14, 393 MATOP_GETINFO=15, 394 MATOP_EQUAL=16, 395 MATOP_GET_DIAGONAL=17, 396 MATOP_DIAGONAL_SCALE=18, 397 MATOP_NORM=19, 398 MATOP_ASSEMBLY_BEGIN=20, 399 MATOP_ASSEMBLY_END=21, 400 MATOP_COMPRESS=22, 401 MATOP_SET_OPTION=23, 402 MATOP_ZERO_ENTRIES=24, 403 MATOP_ZERO_ROWS=25, 404 MATOP_LUFACTOR_SYMBOLIC=26, 405 MATOP_LUFACTOR_NUMERIC=27, 406 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 407 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 408 MATOP_GET_SIZE=30, 409 MATOP_GET_LOCAL_SIZE=31, 410 MATOP_GET_OWNERSHIP_RANGE=32, 411 MATOP_ILUFACTOR_SYMBOLIC=33, 412 MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 413 MATOP_GET_ARRAY=35, 414 MATOP_RESTORE_ARRAY=36, 415 416 MATOP_CONVERT_SAME_TYPE=37, 417 MATOP_FORWARD_SOLVE=38, 418 MATOP_BACKWARD_SOLVE=39, 419 MATOP_ILUFACTOR=40, 420 MATOP_INCOMPLETECHOLESKYFACTOR=41, 421 MATOP_AXPY=42, 422 MATOP_GET_SUBMATRICES=43, 423 MATOP_INCREASE_OVERLAP=44, 424 MATOP_GET_VALUES=45, 425 MATOP_COPY=46, 426 MATOP_PRINT_HELP=47, 427 MATOP_SCALE=48, 428 MATOP_SHIFT=49, 429 MATOP_DIAGONAL_SHIFT=50, 430 MATOP_ILUDT_FACTOR=51, 431 MATOP_GET_BLOCK_SIZE=52, 432 MATOP_GET_ROW_IJ=53, 433 MATOP_RESTORE_ROW_IJ=54, 434 MATOP_GET_COLUMN_IJ=55, 435 MATOP_RESTORE_COLUMN_IJ=56, 436 MATOP_FDCOLORING_CREATE=57, 437 MATOP_COLORING_PATCH=58, 438 MATOP_SET_UNFACTORED=59, 439 MATOP_PERMUTE=60, 440 MATOP_SET_VALUES_BLOCKED=61, 441 MATOP_DESTROY=250, 442 MATOP_VIEW=251 443 } MatOperation; 444 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 445 EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 446 EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 447 448 /* 449 Codes for matrices stored on disk. By default they are 450 stored in a universal format. By changing the format with 451 ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 452 be stored in a way natural for the matrix, for example dense matrices 453 would be stored as dense. Matrices stored this way may only be 454 read into matrices of the same time. 455 */ 456 #define MATRIX_BINARY_FORMAT_DENSE -1 457 458 /* 459 New matrix classes not yet distributed 460 */ 461 /* 462 MatAIJIndices is a data structure for storing the nonzero location information 463 for sparse matrices. Several matrices with identical nonzero structure can share 464 the same MatAIJIndices. 465 */ 466 typedef struct _p_MatAIJIndices* MatAIJIndices; 467 468 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 469 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 470 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 471 EXTERN int MatDestroyAIJIndices(MatAIJIndices); 472 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 473 EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 474 EXTERN int MatShiftAIJIndices(MatAIJIndices); 475 EXTERN int MatShrinkAIJIndices(MatAIJIndices); 476 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 477 478 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 479 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 480 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 481 482 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 483 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 484 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 485 486 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double); 487 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 488 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 489 490 typedef char* MATType; 491 EXTERN int MATCreate(MPI_Comm,int,int,int,int,Mat*); 492 EXTERN int MatSetType(Mat,MATType); 493 EXTERN int MatRegisterAll(char*); 494 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 495 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 496 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 497 #else 498 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 499 #endif 500 501 EXTERN int MatCreateMAIJ(Mat,int,Mat*); 502 EXTERN int MatSetTypeFromOptions(Mat); 503 504 #define MATMAIJ "maij" 505 #endif 506 507 508 509