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