1 /* $Id: petscmat.h,v 1.198 2000/06/01 22:26:28 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 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 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 (or four) macros MUST be used together. The third one closes the open { of the first one 189 */ 190 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 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 MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 199 {\ 200 int __l;\ 201 __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\ 202 __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\ 203 for (__l=0;__l<nrows;__l++) {\ 204 __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\ 205 }\ 206 } 207 208 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 209 { int __i; \ 210 for (__i=0; __i<nc; __i++) {\ 211 if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 212 }\ 213 dnz[row - __rstart] = nc - onz[row - __rstart];\ 214 } 215 216 #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);} 217 218 /* Routines unique to particular data structures */ 219 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 220 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 221 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 222 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*); 223 224 EXTERN int MatStoreValues(Mat); 225 EXTERN int MatRetrieveValues(Mat); 226 227 /* 228 These routines are not usually accessed directly, rather solving is 229 done through the SLES, KSP and PC interfaces. 230 */ 231 232 typedef char* MatOrderingType; 233 #define MATORDERING_NATURAL "natural" 234 #define MATORDERING_ND "nd" 235 #define MATORDERING_1WD "1wd" 236 #define MATORDERING_RCM "rcm" 237 #define MATORDERING_QMD "qmd" 238 #define MATORDERING_ROWLENGTH "rowlength" 239 240 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 241 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 242 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 243 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 244 #else 245 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 246 #endif 247 EXTERN int MatOrderingRegisterDestroy(void); 248 EXTERN int MatOrderingRegisterAll(char*); 249 extern PetscTruth MatOrderingRegisterAllCalled; 250 251 EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 252 253 EXTERN int MatCholeskyFactor(Mat,IS,double); 254 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 255 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 256 257 /* 258 Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic() 259 of MatLUFactor() and MatLUFactorSymbolic() 260 261 Note: If any entries are added to this context, be sure 262 to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h and/or 263 to adjust MAT_LUINFO_SIZE in finclude/petscmat.h 264 265 Note: The integer values below are passed in double to allow easy use from Fortran 266 */ 267 typedef struct { 268 double levels; /* ILU(levels) */ 269 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 270 double diagonal_fill; /* force diagonal to fill in if initially not filled */ 271 272 double dt; /* drop tolerance */ 273 double dtcol; /* tolerance for pivoting */ 274 double dtcount; /* maximum nonzeros to be allowed per row */ 275 PetscTruth damp; /* if factorization fails, damp until successful */ 276 double damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */ 277 } MatILUInfo; 278 279 typedef struct { 280 double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 281 double dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 282 PetscTruth damp; /* if factorization fails, damp until successful */ 283 double damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */ 284 } MatLUInfo; 285 286 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 287 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 288 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 289 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 290 EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 291 EXTERN int MatLUFactorNumeric(Mat,Mat*); 292 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 293 294 EXTERN int MatSolve(Mat,Vec,Vec); 295 EXTERN int MatForwardSolve(Mat,Vec,Vec); 296 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 297 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 298 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 299 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 300 301 EXTERN int MatSetUnfactored(Mat); 302 303 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 304 305 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 306 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 307 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 308 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 309 EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 310 311 /* 312 These routines are for efficiently computing Jacobians via finite differences. 313 */ 314 315 typedef char* MatColoringType; 316 #define MATCOLORING_NATURAL "natural" 317 #define MATCOLORING_SL "sl" 318 #define MATCOLORING_LF "lf" 319 #define MATCOLORING_ID "id" 320 321 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 322 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 323 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 324 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 325 #else 326 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 327 #endif 328 EXTERN int MatColoringRegisterAll(char *); 329 extern PetscTruth MatColoringRegisterAllCalled; 330 EXTERN int MatColoringRegisterDestroy(void); 331 EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 332 333 /* 334 Data structures used to compute Jacobian vector products 335 efficiently using finite differences. 336 */ 337 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 338 339 typedef struct _p_MatFDColoring *MatFDColoring; 340 341 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 342 EXTERN int MatFDColoringDestroy(MatFDColoring); 343 EXTERN int MatFDColoringView(MatFDColoring,Viewer); 344 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 345 EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 346 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 347 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 348 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 349 EXTERN int MatFDColoringPrintHelp(MatFDColoring); 350 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 351 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 352 353 /* 354 These routines are for partitioning matrices: currently used only 355 for adjacency matrix, MatCreateMPIAdj(). 356 */ 357 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 358 359 typedef struct _p_MatPartitioning *MatPartitioning; 360 typedef char* MatPartitioningType; 361 #define MATPARTITIONING_CURRENT "current" 362 #define MATPARTITIONING_PARMETIS "parmetis" 363 364 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 365 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 366 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 367 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 368 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 369 EXTERN int MatPartitioningDestroy(MatPartitioning); 370 371 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 372 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 373 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 374 #else 375 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 376 #endif 377 378 EXTERN int MatPartitioningRegisterAll(char *); 379 extern PetscTruth MatPartitioningRegisterAllCalled; 380 EXTERN int MatPartitioningRegisterDestroy(void); 381 382 EXTERN int MatPartitioningView(MatPartitioning,Viewer); 383 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 384 EXTERN int MatPartitioningPrintHelp(MatPartitioning); 385 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 386 387 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 388 389 /* 390 If you add entries here you must also add them to finclude/petscmat.h 391 */ 392 typedef enum { MATOP_SET_VALUES=0, 393 MATOP_GET_ROW=1, 394 MATOP_RESTORE_ROW=2, 395 MATOP_MULT=3, 396 MATOP_MULT_ADD=4, 397 MATOP_MULT_TRANSPOSE=5, 398 MATOP_MULT_TRANSPOSE_ADD=6, 399 MATOP_SOLVE=7, 400 MATOP_SOLVE_ADD=8, 401 MATOP_SOLVE_TRANSPOSE=9, 402 MATOP_SOLVE_TRANSPOSE_ADD=10, 403 MATOP_LUFACTOR=11, 404 MATOP_CHOLESKYFACTOR=12, 405 MATOP_RELAX=13, 406 MATOP_TRANSPOSE=14, 407 MATOP_GETINFO=15, 408 MATOP_EQUAL=16, 409 MATOP_GET_DIAGONAL=17, 410 MATOP_DIAGONAL_SCALE=18, 411 MATOP_NORM=19, 412 MATOP_ASSEMBLY_BEGIN=20, 413 MATOP_ASSEMBLY_END=21, 414 MATOP_COMPRESS=22, 415 MATOP_SET_OPTION=23, 416 MATOP_ZERO_ENTRIES=24, 417 MATOP_ZERO_ROWS=25, 418 MATOP_LUFACTOR_SYMBOLIC=26, 419 MATOP_LUFACTOR_NUMERIC=27, 420 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 421 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 422 MATOP_GET_SIZE=30, 423 MATOP_GET_LOCAL_SIZE=31, 424 MATOP_GET_OWNERSHIP_RANGE=32, 425 MATOP_ILUFACTOR_SYMBOLIC=33, 426 MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 427 MATOP_GET_ARRAY=35, 428 MATOP_RESTORE_ARRAY=36, 429 430 MATOP_CONVERT_SAME_TYPE=37, 431 MATOP_FORWARD_SOLVE=38, 432 MATOP_BACKWARD_SOLVE=39, 433 MATOP_ILUFACTOR=40, 434 MATOP_INCOMPLETECHOLESKYFACTOR=41, 435 MATOP_AXPY=42, 436 MATOP_GET_SUBMATRICES=43, 437 MATOP_INCREASE_OVERLAP=44, 438 MATOP_GET_VALUES=45, 439 MATOP_COPY=46, 440 MATOP_PRINT_HELP=47, 441 MATOP_SCALE=48, 442 MATOP_SHIFT=49, 443 MATOP_DIAGONAL_SHIFT=50, 444 MATOP_ILUDT_FACTOR=51, 445 MATOP_GET_BLOCK_SIZE=52, 446 MATOP_GET_ROW_IJ=53, 447 MATOP_RESTORE_ROW_IJ=54, 448 MATOP_GET_COLUMN_IJ=55, 449 MATOP_RESTORE_COLUMN_IJ=56, 450 MATOP_FDCOLORING_CREATE=57, 451 MATOP_COLORING_PATCH=58, 452 MATOP_SET_UNFACTORED=59, 453 MATOP_PERMUTE=60, 454 MATOP_SET_VALUES_BLOCKED=61, 455 MATOP_DESTROY=250, 456 MATOP_VIEW=251 457 } MatOperation; 458 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 459 EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 460 EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 461 462 /* 463 Codes for matrices stored on disk. By default they are 464 stored in a universal format. By changing the format with 465 ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 466 be stored in a way natural for the matrix, for example dense matrices 467 would be stored as dense. Matrices stored this way may only be 468 read into matrices of the same time. 469 */ 470 #define MATRIX_BINARY_FORMAT_DENSE -1 471 472 /* 473 New matrix classes not yet distributed 474 */ 475 /* 476 MatAIJIndices is a data structure for storing the nonzero location information 477 for sparse matrices. Several matrices with identical nonzero structure can share 478 the same MatAIJIndices. 479 */ 480 typedef struct _p_MatAIJIndices* MatAIJIndices; 481 482 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 483 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 484 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 485 EXTERN int MatDestroyAIJIndices(MatAIJIndices); 486 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 487 EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 488 EXTERN int MatShiftAIJIndices(MatAIJIndices); 489 EXTERN int MatShrinkAIJIndices(MatAIJIndices); 490 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 491 492 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 493 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 494 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 495 496 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 497 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 498 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 499 500 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double); 501 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 502 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 503 504 typedef char* MATType; 505 EXTERN int MATCreate(MPI_Comm,int,int,int,int,Mat*); 506 EXTERN int MatSetType(Mat,MATType); 507 EXTERN int MatRegisterAll(char*); 508 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 509 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 510 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 511 #else 512 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 513 #endif 514 515 EXTERN int MatCreateMAIJ(Mat,int,Mat*); 516 EXTERN int MatMAIJRedimension(Mat,int,Mat*); 517 EXTERN int MatMAIJGetAIJ(Mat,Mat*); 518 519 EXTERN int MatSetTypeFromOptions(Mat); 520 521 #define MATSEQMAIJ "seqmaij" 522 #define MATMPIMAIJ "mpimaij" 523 #define MATNN "nn" 524 #endif 525 526 527 528