1 /* $Id: petscmat.h,v 1.228 2001/09/07 20:09:08 bsmith Exp $ */ 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 /*S 10 Mat - Abstract PETSc matrix object 11 12 Level: beginner 13 14 Concepts: matrix; linear operator 15 16 .seealso: MatCreate(), MatType, MatSetType() 17 S*/ 18 typedef struct _p_Mat* Mat; 19 20 /*E 21 MatType - String with the name of a PETSc matrix or the creation function 22 with an optional dynamic library name, for example 23 http://www.mcs.anl.gov/petsc/lib.a:mymatcreate() 24 25 Level: beginner 26 27 .seealso: MatSetType(), Mat 28 E*/ 29 #define MATSAME "same" 30 #define MATSEQMAIJ "seqmaij" 31 #define MATMPIMAIJ "mpimaij" 32 #define MATIS "is" 33 #define MATMPIROWBS "mpirowbs" 34 #define MATSEQDENSE "seqdense" 35 #define MATSEQAIJ "seqaij" 36 #define MATMPIAIJ "mpiaij" 37 #define MATSHELL "shell" 38 #define MATSEQBDIAG "seqbdiag" 39 #define MATMPIBDIAG "mpibdiag" 40 #define MATMPIDENSE "mpidense" 41 #define MATSEQBAIJ "seqbaij" 42 #define MATMPIBAIJ "mpibaij" 43 #define MATMPIADJ "mpiadj" 44 #define MATSEQSBAIJ "seqsbaij" 45 #define MATMPISBAIJ "mpisbaij" 46 #define MATDAAD "daad" 47 #define MATMFFD "mffd" 48 #define MATESI "esi" 49 #define MATPETSCESI "petscesi" 50 typedef char* MatType; 51 52 #define MAT_SER_SEQAIJ_BINARY "seqaij_binary" 53 #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary" 54 typedef char *MatSerializeType; 55 56 /* Logging support */ 57 #define MAT_FILE_COOKIE 1211216 /* used to indicate matrices in binary files */ 58 extern int MAT_COOKIE; 59 extern int MAT_FDCOLORING_COOKIE; 60 extern int MAT_PARTITIONING_COOKIE; 61 extern int MAT_NULLSPACE_COOKIE; 62 extern int MAT_Mult, MAT_MultMatrixFree, MAT_MultMultiple, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose; 63 extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTranspose; 64 extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic; 65 extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor; 66 extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin; 67 extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering; 68 extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate; 69 extern int MAT_FDColoringApply; 70 71 EXTERN int MatInitializePackage(char *); 72 73 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 74 EXTERN int MatSetType(Mat,MatType); 75 EXTERN int MatSetFromOptions(Mat); 76 EXTERN int MatSetUpPreallocation(Mat); 77 EXTERN int MatRegisterAll(char*); 78 EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 79 EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth)); 80 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 81 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 82 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0) 83 #else 84 #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 85 #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d) 86 #endif 87 extern PetscTruth MatRegisterAllCalled; 88 extern PetscFList MatList; 89 90 EXTERN PetscFList MatSerializeList; 91 EXTERN int MatSerializeRegisterAll(const char []); 92 EXTERN int MatSerializeRegisterDestroy(void); 93 EXTERN int MatSerializeRegisterAllCalled; 94 EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth); 95 EXTERN int MatSetSerializeType(Mat, MatSerializeType); 96 97 EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 98 EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*); 99 EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*); 100 EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 101 EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 102 EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 103 EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*); 104 EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*); 105 EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 106 EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 107 EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 108 EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 109 EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 110 EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 111 EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*); 112 EXTERN int MatDestroy(Mat); 113 114 EXTERN int MatPrintHelp(Mat); 115 EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*); 116 117 /* ------------------------------------------------------------*/ 118 EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 119 EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 120 121 /*S 122 MatStencil - Data structure (C struct) for storing information about a single row or 123 column of a matrix as index on an associated grid. 124 125 Level: beginner 126 127 Concepts: matrix; linear operator 128 129 .seealso: MatSetValuesStencil(), MatSetStencil() 130 S*/ 131 typedef struct { 132 int k,j,i,c; 133 } MatStencil; 134 135 EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 136 EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 137 EXTERN int MatSetStencil(Mat,int,int*,int*,int); 138 139 EXTERN int MatSetColoring(Mat,ISColoring); 140 EXTERN int MatSetValuesAdic(Mat,void*); 141 EXTERN int MatSetValuesAdifor(Mat,int,void*); 142 143 /*E 144 MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 145 to continue to add values to it 146 147 Level: beginner 148 149 .seealso: MatAssemblyBegin(), MatAssemblyEnd() 150 E*/ 151 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 152 EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 153 EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 154 EXTERN int MatAssembled(Mat,PetscTruth*); 155 156 #define MatSetValue(v,i,j,va,mode) \ 157 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 158 _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 159 } 160 #define MatGetValue(v,i,j,va) \ 161 0; {int _ierr,_row = i,_col = j; \ 162 _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 163 } 164 #define MatSetValueLocal(v,i,j,va,mode) \ 165 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 166 _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 167 } 168 /*E 169 MatOption - Options that may be set for a matrix and its behavior or storage 170 171 Level: beginner 172 173 Any additions/changes here MUST also be made in include/finclude/petscmat.h 174 175 .seealso: MatSetOption() 176 E*/ 177 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 178 MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 179 MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 180 MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 181 MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 182 MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 183 MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 184 MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 185 MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 186 MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 187 MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption; 188 EXTERN int MatSetOption(Mat,MatOption); 189 EXTERN int MatGetType(Mat,MatType*); 190 191 EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*); 192 EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**); 193 EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**); 194 EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**); 195 EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**); 196 EXTERN int MatGetColumnVector(Mat,Vec,int); 197 EXTERN int MatGetArray(Mat,PetscScalar **); 198 EXTERN int MatRestoreArray(Mat,PetscScalar **); 199 EXTERN int MatGetBlockSize(Mat,int *); 200 201 EXTERN int MatMult(Mat,Vec,Vec); 202 EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 203 EXTERN int MatMultTranspose(Mat,Vec,Vec); 204 EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 205 EXTERN int MatMultConstrained(Mat,Vec,Vec); 206 EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec); 207 208 /*E 209 MatDuplicateOption - Indicates if a duplicated sparse matrix should have 210 its numerical values copied over or just its nonzero structure. 211 212 Level: beginner 213 214 Any additions/changes here MUST also be made in include/finclude/petscmat.h 215 216 .seealso: MatDuplicate() 217 E*/ 218 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 219 220 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 221 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 222 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 223 #else 224 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 225 #endif 226 EXTERN int MatConvertRegisterAll(char*); 227 EXTERN int MatConvertRegisterDestroy(void); 228 extern PetscTruth MatConvertRegisterAllCalled; 229 extern PetscFList MatConvertList; 230 EXTERN int MatConvert(Mat,MatType,Mat*); 231 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 232 233 /*E 234 MatStructure - Indicates if the matrix has the same nonzero structure 235 236 Level: beginner 237 238 Any additions/changes here MUST also be made in include/finclude/petscmat.h 239 240 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 241 E*/ 242 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 243 244 EXTERN int MatCopy(Mat,Mat,MatStructure); 245 EXTERN int MatView(Mat,PetscViewer); 246 247 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*)); 248 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 249 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 250 #else 251 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 252 #endif 253 EXTERN int MatLoadRegisterAll(char*); 254 EXTERN int MatLoadRegisterDestroy(void); 255 extern PetscTruth MatLoadRegisterAllCalled; 256 extern PetscFList MatLoadList; 257 EXTERN int MatLoad(PetscViewer,MatType,Mat*); 258 259 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 260 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 261 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 262 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 263 264 /*S 265 MatInfo - Context of matrix information, used with MatGetInfo() 266 267 In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 268 269 Level: intermediate 270 271 Concepts: matrix^nonzero information 272 273 .seealso: MatGetInfo(), MatInfoType 274 S*/ 275 typedef struct { 276 PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 277 PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 278 PetscLogDouble block_size; /* block size */ 279 PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 280 PetscLogDouble memory; /* memory allocated */ 281 PetscLogDouble assemblies; /* number of matrix assemblies called */ 282 PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 283 PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 284 PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 285 } MatInfo; 286 287 /*E 288 MatInfoType - Indicates if you want information about the local part of the matrix, 289 the entire parallel matrix or the maximum over all the local parts. 290 291 Level: beginner 292 293 Any additions/changes here MUST also be made in include/finclude/petscmat.h 294 295 .seealso: MatGetInfo(), MatInfo 296 E*/ 297 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 298 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 299 EXTERN int MatValid(Mat,PetscTruth*); 300 EXTERN int MatGetDiagonal(Mat,Vec); 301 EXTERN int MatGetRowMax(Mat,Vec); 302 EXTERN int MatTranspose(Mat,Mat*); 303 EXTERN int MatPermute(Mat,IS,IS,Mat *); 304 EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *); 305 EXTERN int MatDiagonalScale(Mat,Vec,Vec); 306 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 307 EXTERN int MatEqual(Mat,Mat,PetscTruth*); 308 309 EXTERN int MatNorm(Mat,NormType,PetscReal *); 310 EXTERN int MatZeroEntries(Mat); 311 EXTERN int MatZeroRows(Mat,IS,PetscScalar*); 312 EXTERN int MatZeroColumns(Mat,IS,PetscScalar*); 313 314 EXTERN int MatUseScaledForm(Mat,PetscTruth); 315 EXTERN int MatScaleSystem(Mat,Vec,Vec); 316 EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 317 318 EXTERN int MatGetSize(Mat,int*,int*); 319 EXTERN int MatGetLocalSize(Mat,int*,int*); 320 EXTERN int MatGetOwnershipRange(Mat,int*,int*); 321 322 /*E 323 MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 324 or MatGetSubMatrix() are to be reused to store the new matrix values. 325 326 Level: beginner 327 328 Any additions/changes here MUST also be made in include/finclude/petscmat.h 329 330 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 331 E*/ 332 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 333 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 334 EXTERN int MatDestroyMatrices(int,Mat **); 335 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 336 337 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 338 339 EXTERN int MatAXPY(PetscScalar *,Mat,Mat,MatStructure); 340 EXTERN int MatAYPX(PetscScalar *,Mat,Mat); 341 EXTERN int MatCompress(Mat); 342 343 EXTERN int MatScale(PetscScalar *,Mat); 344 EXTERN int MatShift(PetscScalar *,Mat); 345 346 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 347 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 348 EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*); 349 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 350 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 351 352 EXTERN int MatSetStashInitialSize(Mat,int,int); 353 354 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 355 EXTERN int MatInterpolate(Mat,Vec,Vec); 356 EXTERN int MatRestrict(Mat,Vec,Vec); 357 358 /* 359 These three (or four) macros MUST be used together. The third one closes the open { of the first one 360 */ 361 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 362 { \ 363 int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 364 _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 365 _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 366 _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 367 _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 368 369 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 370 {\ 371 int __l;\ 372 _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 373 _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 374 for (__l=0;__l<nrows;__l++) {\ 375 _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 376 }\ 377 } 378 379 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 380 { int __i; \ 381 for (__i=0; __i<nc; __i++) {\ 382 if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 383 }\ 384 dnz[row - __rstart] = nc - onz[row - __rstart];\ 385 } 386 387 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);} 388 389 /* Routines unique to particular data structures */ 390 EXTERN int MatShellGetContext(Mat,void **); 391 392 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***); 393 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 394 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 395 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*); 396 397 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 398 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 399 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 400 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*); 401 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 402 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*); 403 404 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 405 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 406 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 407 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*); 408 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 409 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 410 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*); 411 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 412 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**); 413 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**); 414 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void)); 415 416 EXTERN int MatStoreValues(Mat); 417 EXTERN int MatRetrieveValues(Mat); 418 419 EXTERN int MatDAADSetCtx(Mat,void*); 420 421 /* 422 These routines are not usually accessed directly, rather solving is 423 done through the SLES, KSP and PC interfaces. 424 */ 425 426 /*E 427 MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 428 with an optional dynamic library name, for example 429 http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 430 431 Level: beginner 432 433 .seealso: MatGetOrdering() 434 E*/ 435 typedef char* MatOrderingType; 436 #define MATORDERING_NATURAL "natural" 437 #define MATORDERING_ND "nd" 438 #define MATORDERING_1WD "1wd" 439 #define MATORDERING_RCM "rcm" 440 #define MATORDERING_QMD "qmd" 441 #define MATORDERING_ROWLENGTH "rowlength" 442 #define MATORDERING_DSC_ND "dsc_nd" 443 #define MATORDERING_DSC_MMD "dsc_mmd" 444 #define MATORDERING_DSC_MDF "dsc_mdf" 445 #define MATORDERING_CONSTRAINED "constrained" 446 #define MATORDERING_IDENTITY "identity" 447 #define MATORDERING_REVERSE "reverse" 448 449 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 450 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 451 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 452 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 453 #else 454 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 455 #endif 456 EXTERN int MatOrderingRegisterDestroy(void); 457 EXTERN int MatOrderingRegisterAll(char*); 458 extern PetscTruth MatOrderingRegisterAllCalled; 459 extern PetscFList MatOrderingList; 460 461 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 462 463 EXTERN int MatCholeskyFactor(Mat,IS,PetscReal); 464 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*); 465 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 466 467 /*S 468 MatILUInfo - Data based into the matrix ILU factorization routines 469 470 In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 471 472 Notes: These are not usually directly used by users, instead use the PC type of ILU 473 All entries are double precision. 474 475 Level: developer 476 477 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 478 479 S*/ 480 typedef struct { 481 PetscReal levels; /* ILU(levels) */ 482 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 483 PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 484 PetscReal dt; /* drop tolerance */ 485 PetscReal dtcol; /* tolerance for pivoting */ 486 PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 487 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 488 PetscReal damp; /* if is 1.0 and factorization fails, damp until successful */ 489 PetscReal zeropivot; /* pivot is called zero if less than this */ 490 PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 491 factorization may be faster if do not pivot */ 492 } MatILUInfo; 493 494 /*S 495 MatLUInfo - Data based into the matrix LU factorization routines 496 497 In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 498 499 Notes: These are not usually directly used by users, instead use the PC type of LU 500 All entries are double precision. 501 502 Level: developer 503 504 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 505 506 S*/ 507 typedef struct { 508 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 509 PetscReal dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 510 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 511 PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 512 PetscReal zeropivot; /* pivot is called zero if less than this */ 513 PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 514 factorization may be faster if do not pivot */ 515 } MatLUInfo; 516 517 /*S 518 MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 519 520 In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 521 522 Notes: These are not usually directly used by users, instead use the PC type of Cholesky 523 All entries are double precision. 524 525 Level: developer 526 527 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 528 529 S*/ 530 typedef struct { 531 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 532 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 533 PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 534 PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 535 factorization may be faster if do not pivot */ 536 } MatCholeskyInfo; 537 538 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 539 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 540 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 541 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 542 EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*); 543 EXTERN int MatICCFactor(Mat,IS,PetscReal,int); 544 EXTERN int MatLUFactorNumeric(Mat,Mat*); 545 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 546 547 EXTERN int MatSolve(Mat,Vec,Vec); 548 EXTERN int MatForwardSolve(Mat,Vec,Vec); 549 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 550 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 551 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 552 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 553 554 EXTERN int MatSetUnfactored(Mat); 555 556 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 557 /*E 558 MatSORType - What type of (S)SOR to perform 559 560 Level: beginner 561 562 May be bitwise ORd together 563 564 Any additions/changes here MUST also be made in include/finclude/petscmat.h 565 566 .seealso: MatRelax() 567 E*/ 568 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 569 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 570 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 571 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 572 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec); 573 574 /* 575 These routines are for efficiently computing Jacobians via finite differences. 576 */ 577 578 /*E 579 MatColoringType - String with the name of a PETSc matrix coloring or the creation function 580 with an optional dynamic library name, for example 581 http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 582 583 Level: beginner 584 585 .seealso: MatGetColoring() 586 E*/ 587 typedef char* MatColoringType; 588 #define MATCOLORING_NATURAL "natural" 589 #define MATCOLORING_SL "sl" 590 #define MATCOLORING_LF "lf" 591 #define MATCOLORING_ID "id" 592 593 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 594 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 595 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 596 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 597 #else 598 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 599 #endif 600 EXTERN int MatColoringRegisterAll(char *); 601 extern PetscTruth MatColoringRegisterAllCalled; 602 EXTERN int MatColoringRegisterDestroy(void); 603 EXTERN int MatColoringPatch(Mat,int,int,int *,ISColoring*); 604 605 /*S 606 MatFDColoring - Object for computing a sparse Jacobian via finite differences 607 and coloring 608 609 Level: beginner 610 611 Concepts: coloring, sparse Jacobian, finite differences 612 613 .seealso: MatFDColoringCreate() 614 S*/ 615 typedef struct _p_MatFDColoring *MatFDColoring; 616 617 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 618 EXTERN int MatFDColoringDestroy(MatFDColoring); 619 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 620 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 621 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 622 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 623 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 624 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 625 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 626 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *); 627 EXTERN int MatFDColoringSetRecompute(MatFDColoring); 628 EXTERN int MatFDColoringSetF(MatFDColoring,Vec); 629 630 /* 631 These routines are for partitioning matrices: currently used only 632 for adjacency matrix, MatCreateMPIAdj(). 633 */ 634 635 /*S 636 MatPartitioning - Object for managing the partitioning of a matrix or graph 637 638 Level: beginner 639 640 Concepts: partitioning 641 642 .seealso: MatParitioningCreate(), MatPartitioningType 643 S*/ 644 typedef struct _p_MatPartitioning *MatPartitioning; 645 646 /*E 647 MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function 648 with an optional dynamic library name, for example 649 http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 650 651 Level: beginner 652 653 .seealso: MatPartitioingCreate(), MatPartitioning 654 E*/ 655 typedef char* MatPartitioningType; 656 #define MAT_PARTITIONING_CURRENT "current" 657 #define MAT_PARTITIONING_PARMETIS "parmetis" 658 659 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 660 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 661 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 662 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 663 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 664 EXTERN int MatPartitioningDestroy(MatPartitioning); 665 666 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 667 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 668 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 669 #else 670 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 671 #endif 672 673 EXTERN int MatPartitioningRegisterAll(char *); 674 extern PetscTruth MatPartitioningRegisterAllCalled; 675 EXTERN int MatPartitioningRegisterDestroy(void); 676 677 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 678 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 679 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 680 681 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 682 683 /* 684 If you add entries here you must also add them to finclude/petscmat.h 685 */ 686 typedef enum { MATOP_SET_VALUES=0, 687 MATOP_GET_ROW=1, 688 MATOP_RESTORE_ROW=2, 689 MATOP_MULT=3, 690 MATOP_MULT_ADD=4, 691 MATOP_MULT_TRANSPOSE=5, 692 MATOP_MULT_TRANSPOSE_ADD=6, 693 MATOP_SOLVE=7, 694 MATOP_SOLVE_ADD=8, 695 MATOP_SOLVE_TRANSPOSE=9, 696 MATOP_SOLVE_TRANSPOSE_ADD=10, 697 MATOP_LUFACTOR=11, 698 MATOP_CHOLESKYFACTOR=12, 699 MATOP_RELAX=13, 700 MATOP_TRANSPOSE=14, 701 MATOP_GETINFO=15, 702 MATOP_EQUAL=16, 703 MATOP_GET_DIAGONAL=17, 704 MATOP_DIAGONAL_SCALE=18, 705 MATOP_NORM=19, 706 MATOP_ASSEMBLY_BEGIN=20, 707 MATOP_ASSEMBLY_END=21, 708 MATOP_COMPRESS=22, 709 MATOP_SET_OPTION=23, 710 MATOP_ZERO_ENTRIES=24, 711 MATOP_ZERO_ROWS=25, 712 MATOP_LUFACTOR_SYMBOLIC=26, 713 MATOP_LUFACTOR_NUMERIC=27, 714 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 715 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 716 MATOP_SETUP_PREALLOCATION=30, 717 MATOP_ILUFACTOR_SYMBOLIC=31, 718 MATOP_ICCFACTOR_SYMBOLIC=32, 719 MATOP_GET_ARRAY=33, 720 MATOP_RESTORE_ARRAY=34, 721 MATOP_DUPLCIATE=35, 722 MATOP_FORWARD_SOLVE=36, 723 MATOP_BACKWARD_SOLVE=37, 724 MATOP_ILUFACTOR=38, 725 MATOP_ICCFACTOR=39, 726 MATOP_AXPY=40, 727 MATOP_GET_SUBMATRICES=41, 728 MATOP_INCREASE_OVERLAP=42, 729 MATOP_GET_VALUES=43, 730 MATOP_COPY=44, 731 MATOP_PRINT_HELP=45, 732 MATOP_SCALE=46, 733 MATOP_SHIFT=47, 734 MATOP_DIAGONAL_SHIFT=48, 735 MATOP_ILUDT_FACTOR=49, 736 MATOP_GET_BLOCK_SIZE=50, 737 MATOP_GET_ROW_IJ=51, 738 MATOP_RESTORE_ROW_IJ=52, 739 MATOP_GET_COLUMN_IJ=53, 740 MATOP_RESTORE_COLUMN_IJ=54, 741 MATOP_FDCOLORING_CREATE=55, 742 MATOP_COLORING_PATCH=56, 743 MATOP_SET_UNFACTORED=57, 744 MATOP_PERMUTE=58, 745 MATOP_SET_VALUES_BLOCKED=59, 746 MATOP_GET_SUBMATRIX=60, 747 MATOP_DESTROY=61, 748 MATOP_VIEW=62, 749 MATOP_GET_MAPS=63, 750 MATOP_USE_SCALED_FORM=64, 751 MATOP_SCALE_SYSTEM=65, 752 MATOP_UNSCALE_SYSTEM=66, 753 MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67, 754 MATOP_SET_VALUES_LOCAL=68, 755 MATOP_ZERO_ROWS_LOCAL=69, 756 MATOP_GET_ROW_MAX=70, 757 MATOP_CONVERT=71, 758 MATOP_SET_COLORING=72, 759 MATOP_SET_VALUES_ADIC=73, 760 MATOP_SET_VALUES_ADIFOR=74, 761 MATOP_FD_COLORING_APPLY=75, 762 MATOP_SET_FROM_OPTIONS=76, 763 MATOP_MULT_CONSTRAINED=77, 764 MATOP_MULT_TRANSPOSE_CONSTRAINED=78, 765 MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79, 766 MATOP_PERMUTE_SPARSIFY=80, 767 MATOP_MULT_MULTIPLE=81, 768 MATOP_SOLVE_MULTIPLE=82 769 } MatOperation; 770 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 771 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void)); 772 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void)); 773 EXTERN int MatShellSetContext(Mat,void*); 774 775 /* 776 Codes for matrices stored on disk. By default they are 777 stored in a universal format. By changing the format with 778 PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will 779 be stored in a way natural for the matrix, for example dense matrices 780 would be stored as dense. Matrices stored this way may only be 781 read into matrices of the same time. 782 */ 783 #define MATRIX_BINARY_FORMAT_DENSE -1 784 785 /* 786 New matrix classes not yet distributed 787 */ 788 /* 789 MatAIJIndices is a data structure for storing the nonzero location information 790 for sparse matrices. Several matrices with identical nonzero structure can share 791 the same MatAIJIndices. 792 */ 793 typedef struct _p_MatAIJIndices* MatAIJIndices; 794 795 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 796 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 797 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 798 EXTERN int MatDestroyAIJIndices(MatAIJIndices); 799 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 800 EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 801 EXTERN int MatShiftAIJIndices(MatAIJIndices); 802 EXTERN int MatShrinkAIJIndices(MatAIJIndices); 803 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 804 805 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 806 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 807 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*); 808 809 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 810 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 811 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *); 812 813 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 814 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 815 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 816 817 /*S 818 MatNullSpace - Object that removes a null space from a vector, i.e. 819 orthogonalizes the vector to a subsapce 820 821 Level: beginner 822 823 Concepts: matrix; linear operator, null space 824 825 .seealso: MatNullSpaceCreate() 826 S*/ 827 typedef struct _p_MatNullSpace* MatNullSpace; 828 829 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 830 EXTERN int MatNullSpaceDestroy(MatNullSpace); 831 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 832 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 833 EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 834 835 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 836 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 837 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 838 839 840 EXTERN int MatCreateMAIJ(Mat,int,Mat*); 841 EXTERN int MatMAIJRedimension(Mat,int,Mat*); 842 EXTERN int MatMAIJGetAIJ(Mat,Mat*); 843 844 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 845 846 EXTERN int MatComputeExplicitOperator(Mat,Mat*); 847 848 EXTERN int MatESISetType(Mat,char*); 849 EXTERN int MatESISetFromOptions(Mat); 850 851 EXTERN int MatMPIBAIJDiagonalScaleLocalSetUp(Mat,Vec); 852 EXTERN int MatMPIBAIJDiagonalScaleLocal(Mat,Vec); 853 854 #endif 855 856 857 858