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