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