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