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