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 EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec); 213 214 /*E 215 MatDuplicateOption - Indicates if a duplicated sparse matrix should have 216 its numerical values copied over or just its nonzero structure. 217 218 Level: beginner 219 220 Any additions/changes here MUST also be made in include/finclude/petscmat.h 221 222 .seealso: MatDuplicate() 223 E*/ 224 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 225 226 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 227 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 228 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 229 #else 230 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 231 #endif 232 EXTERN int MatConvertRegisterAll(char*); 233 EXTERN int MatConvertRegisterDestroy(void); 234 extern PetscTruth MatConvertRegisterAllCalled; 235 extern PetscFList MatConvertList; 236 EXTERN int MatConvert(Mat,MatType,Mat*); 237 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 238 239 /*E 240 MatStructure - Indicates if the matrix has the same nonzero structure 241 242 Level: beginner 243 244 Any additions/changes here MUST also be made in include/finclude/petscmat.h 245 246 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 247 E*/ 248 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 249 250 EXTERN int MatCopy(Mat,Mat,MatStructure); 251 EXTERN int MatView(Mat,PetscViewer); 252 253 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*)); 254 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 255 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 256 #else 257 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 258 #endif 259 EXTERN int MatLoadRegisterAll(char*); 260 EXTERN int MatLoadRegisterDestroy(void); 261 extern PetscTruth MatLoadRegisterAllCalled; 262 extern PetscFList MatLoadList; 263 EXTERN int MatLoad(PetscViewer,MatType,Mat*); 264 265 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 266 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 267 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 268 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 269 270 /*S 271 MatInfo - Context of matrix information, used with MatGetInfo() 272 273 In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 274 275 Level: intermediate 276 277 Concepts: matrix^nonzero information 278 279 .seealso: MatGetInfo(), MatInfoType 280 S*/ 281 typedef struct { 282 PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 283 PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 284 PetscLogDouble block_size; /* block size */ 285 PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 286 PetscLogDouble memory; /* memory allocated */ 287 PetscLogDouble assemblies; /* number of matrix assemblies called */ 288 PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 289 PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 290 PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 291 } MatInfo; 292 293 /*E 294 MatInfoType - Indicates if you want information about the local part of the matrix, 295 the entire parallel matrix or the maximum over all the local parts. 296 297 Level: beginner 298 299 Any additions/changes here MUST also be made in include/finclude/petscmat.h 300 301 .seealso: MatGetInfo(), MatInfo 302 E*/ 303 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 304 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 305 EXTERN int MatValid(Mat,PetscTruth*); 306 EXTERN int MatGetDiagonal(Mat,Vec); 307 EXTERN int MatGetRowMax(Mat,Vec); 308 EXTERN int MatTranspose(Mat,Mat*); 309 EXTERN int MatPermute(Mat,IS,IS,Mat *); 310 EXTERN int MatPermuteSparsify(Mat,int,double,double,IS,IS,Mat *); 311 EXTERN int MatDiagonalScale(Mat,Vec,Vec); 312 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 313 EXTERN int MatEqual(Mat,Mat,PetscTruth*); 314 315 EXTERN int MatNorm(Mat,NormType,PetscReal *); 316 EXTERN int MatZeroEntries(Mat); 317 EXTERN int MatZeroRows(Mat,IS,PetscScalar*); 318 EXTERN int MatZeroColumns(Mat,IS,PetscScalar*); 319 320 EXTERN int MatUseScaledForm(Mat,PetscTruth); 321 EXTERN int MatScaleSystem(Mat,Vec,Vec); 322 EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 323 324 EXTERN int MatGetSize(Mat,int*,int*); 325 EXTERN int MatGetLocalSize(Mat,int*,int*); 326 EXTERN int MatGetOwnershipRange(Mat,int*,int*); 327 328 /*E 329 MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 330 or MatGetSubMatrix() are to be reused to store the new matrix values. 331 332 Level: beginner 333 334 Any additions/changes here MUST also be made in include/finclude/petscmat.h 335 336 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 337 E*/ 338 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 339 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 340 EXTERN int MatDestroyMatrices(int,Mat **); 341 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 342 343 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 344 345 EXTERN int MatAXPY(PetscScalar *,Mat,Mat); 346 EXTERN int MatAYPX(PetscScalar *,Mat,Mat); 347 EXTERN int MatCompress(Mat); 348 349 EXTERN int MatScale(PetscScalar *,Mat); 350 EXTERN int MatShift(PetscScalar *,Mat); 351 352 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 353 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 354 EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*); 355 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 356 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 357 358 EXTERN int MatSetStashInitialSize(Mat,int,int); 359 360 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 361 EXTERN int MatInterpolate(Mat,Vec,Vec); 362 EXTERN int MatRestrict(Mat,Vec,Vec); 363 364 /* 365 These three (or four) macros MUST be used together. The third one closes the open { of the first one 366 */ 367 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 368 { \ 369 int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 370 _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 371 _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 372 _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 373 _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 374 375 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 376 {\ 377 int __l;\ 378 _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 379 _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 380 for (__l=0;__l<nrows;__l++) {\ 381 _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 382 }\ 383 } 384 385 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 386 { int __i; \ 387 for (__i=0; __i<nc; __i++) {\ 388 if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 389 }\ 390 dnz[row - __rstart] = nc - onz[row - __rstart];\ 391 } 392 393 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);} 394 395 /* Routines unique to particular data structures */ 396 EXTERN int MatShellGetContext(Mat,void **); 397 398 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***); 399 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 400 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 401 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*); 402 403 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 404 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 405 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 406 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*); 407 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 408 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*); 409 410 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 411 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 412 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 413 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*); 414 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 415 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 416 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*); 417 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 418 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**); 419 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**); 420 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void)); 421 422 EXTERN int MatStoreValues(Mat); 423 EXTERN int MatRetrieveValues(Mat); 424 425 EXTERN int MatDAADSetCtx(Mat,void*); 426 427 /* 428 These routines are not usually accessed directly, rather solving is 429 done through the SLES, KSP and PC interfaces. 430 */ 431 432 /*E 433 MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 434 with an optional dynamic library name, for example 435 http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 436 437 Level: beginner 438 439 .seealso: MatGetOrdering() 440 E*/ 441 typedef char* MatOrderingType; 442 #define MATORDERING_NATURAL "natural" 443 #define MATORDERING_ND "nd" 444 #define MATORDERING_1WD "1wd" 445 #define MATORDERING_RCM "rcm" 446 #define MATORDERING_QMD "qmd" 447 #define MATORDERING_ROWLENGTH "rowlength" 448 #define MATORDERING_DSC_ND "dsc_nd" 449 #define MATORDERING_DSC_MMD "dsc_mmd" 450 #define MATORDERING_DSC_MDF "dsc_mdf" 451 #define MATORDERING_CONSTRAINED "constrained" 452 #define MATORDERING_IDENTITY "identity" 453 #define MATORDERING_REVERSE "reverse" 454 455 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 456 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 457 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 458 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 459 #else 460 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 461 #endif 462 EXTERN int MatOrderingRegisterDestroy(void); 463 EXTERN int MatOrderingRegisterAll(char*); 464 extern PetscTruth MatOrderingRegisterAllCalled; 465 extern PetscFList MatOrderingList; 466 467 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 468 469 EXTERN int MatCholeskyFactor(Mat,IS,PetscReal); 470 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*); 471 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 472 473 /*S 474 MatILUInfo - Data based into the matrix ILU factorization routines 475 476 In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 477 478 Notes: These are not usually directly used by users, instead use the PC type of ILU 479 All entries are double precision. 480 481 Level: developer 482 483 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 484 485 S*/ 486 typedef struct { 487 PetscReal levels; /* ILU(levels) */ 488 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 489 PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 490 PetscReal dt; /* drop tolerance */ 491 PetscReal dtcol; /* tolerance for pivoting */ 492 PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 493 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 494 PetscReal damp; /* if is 1.0 and factorization fails, damp until successful */ 495 PetscReal zeropivot; /* pivot is called zero if less than this */ 496 } MatILUInfo; 497 498 /*S 499 MatLUInfo - Data based into the matrix LU factorization routines 500 501 In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 502 503 Notes: These are not usually directly used by users, instead use the PC type of LU 504 All entries are double precision. 505 506 Level: developer 507 508 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 509 510 S*/ 511 typedef struct { 512 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 513 PetscReal dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 514 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 515 PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 516 PetscReal zeropivot; /* pivot is called zero if less than this */ 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 } MatCholeskyInfo; 537 538 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 539 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 540 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 541 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 542 EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*); 543 EXTERN int MatICCFactor(Mat,IS,PetscReal,int); 544 EXTERN int MatLUFactorNumeric(Mat,Mat*); 545 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 546 547 EXTERN int MatSolve(Mat,Vec,Vec); 548 EXTERN int MatForwardSolve(Mat,Vec,Vec); 549 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 550 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 551 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 552 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 553 554 EXTERN int MatSetUnfactored(Mat); 555 556 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 557 /*E 558 MatSORType - What type of (S)SOR to perform 559 560 Level: beginner 561 562 May be bitwise ORd together 563 564 Any additions/changes here MUST also be made in include/finclude/petscmat.h 565 566 .seealso: MatRelax() 567 E*/ 568 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 569 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 570 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 571 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 572 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,Vec); 573 574 /* 575 These routines are for efficiently computing Jacobians via finite differences. 576 */ 577 578 /*E 579 MatColoringType - String with the name of a PETSc matrix coloring or the creation function 580 with an optional dynamic library name, for example 581 http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 582 583 Level: beginner 584 585 .seealso: MatGetColoring() 586 E*/ 587 typedef char* MatColoringType; 588 #define MATCOLORING_NATURAL "natural" 589 #define MATCOLORING_SL "sl" 590 #define MATCOLORING_LF "lf" 591 #define MATCOLORING_ID "id" 592 593 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 594 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 595 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 596 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 597 #else 598 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 599 #endif 600 EXTERN int MatColoringRegisterAll(char *); 601 extern PetscTruth MatColoringRegisterAllCalled; 602 EXTERN int MatColoringRegisterDestroy(void); 603 EXTERN int MatColoringPatch(Mat,int,int,int *,ISColoring*); 604 605 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 606 /*S 607 MatFDColoring - Object for computing a sparse Jacobian via finite differences 608 and coloring 609 610 Level: beginner 611 612 Concepts: coloring, sparse Jacobian, finite differences 613 614 .seealso: MatFDColoringCreate() 615 S*/ 616 typedef struct _p_MatFDColoring *MatFDColoring; 617 618 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 619 EXTERN int MatFDColoringDestroy(MatFDColoring); 620 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 621 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 622 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 623 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 624 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 625 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 626 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 627 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *); 628 EXTERN int MatFDColoringSetRecompute(MatFDColoring); 629 EXTERN int MatFDColoringSetF(MatFDColoring,Vec); 630 631 /* 632 These routines are for partitioning matrices: currently used only 633 for adjacency matrix, MatCreateMPIAdj(). 634 */ 635 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 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 MATPARTITIONING_CURRENT "current" 659 #define MATPARTITIONING_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_GET_SIZE=30, 719 MATOP_GET_LOCAL_SIZE=31, 720 MATOP_GET_OWNERSHIP_RANGE=32, 721 MATOP_ILUFACTOR_SYMBOLIC=33, 722 MATOP_ICCFACTOR_SYMBOLIC=34, 723 MATOP_GET_ARRAY=35, 724 MATOP_RESTORE_ARRAY=36, 725 726 MATOP_CONVERT_SAME_TYPE=37, 727 MATOP_FORWARD_SOLVE=38, 728 MATOP_BACKWARD_SOLVE=39, 729 MATOP_ILUFACTOR=40, 730 MATOP_ICCFACTOR=41, 731 MATOP_AXPY=42, 732 MATOP_GET_SUBMATRICES=43, 733 MATOP_INCREASE_OVERLAP=44, 734 MATOP_GET_VALUES=45, 735 MATOP_COPY=46, 736 MATOP_PRINT_HELP=47, 737 MATOP_SCALE=48, 738 MATOP_SHIFT=49, 739 MATOP_DIAGONAL_SHIFT=50, 740 MATOP_ILUDT_FACTOR=51, 741 MATOP_GET_BLOCK_SIZE=52, 742 MATOP_GET_ROW_IJ=53, 743 MATOP_RESTORE_ROW_IJ=54, 744 MATOP_GET_COLUMN_IJ=55, 745 MATOP_RESTORE_COLUMN_IJ=56, 746 MATOP_FDCOLORING_CREATE=57, 747 MATOP_COLORING_PATCH=58, 748 MATOP_SET_UNFACTORED=59, 749 MATOP_PERMUTE=60, 750 MATOP_SET_VALUES_BLOCKED=61, 751 MATOP_GET_SUBMATRIX=62, 752 MATOP_GET_MAPS=65, 753 MATOP_USE_SCALED_FORM=66, 754 MATOP_SCALE_SYSTEM=67, 755 MATOP_UNSCALE_SYSTEM=68, 756 MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=69, 757 MATOP_SET_VALUES_LOCAL=70, 758 MATOP_ZERO_ROWS_LOCAL=71, 759 MATOP_GET_ROW_MAX=72, 760 MATOP_CONVERT=73, 761 MATOP_SET_COLORING=74, 762 MATOP_SET_VALUES_ADIC=75, 763 MATOP_SET_VALUES_ADIFOR=76, 764 MATOP_FD_COLORING_APPLY=77, 765 MATOP_SET_FROM_OPTIONS=78, 766 MATOP_MULT_CONSTRAINED=79, 767 MATOP_MULT_TRANSPOSE_CONSTRAINED=80, 768 MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=80, 769 MATOP_SERIALIZE=81, 770 MATOP_PERMUTE_SPARSIFY=82, 771 MATOP_MULT_MULTIPLE=83, 772 MATOP_SOLVE_MULTIPLE=84, 773 MATOP_DESTROY=250, 774 MATOP_VIEW=251 775 } MatOperation; 776 EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 777 EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)()); 778 EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)()); 779 EXTERN int MatShellSetContext(Mat,void*); 780 781 /* 782 Codes for matrices stored on disk. By default they are 783 stored in a universal format. By changing the format with 784 PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will 785 be stored in a way natural for the matrix, for example dense matrices 786 would be stored as dense. Matrices stored this way may only be 787 read into matrices of the same time. 788 */ 789 #define MATRIX_BINARY_FORMAT_DENSE -1 790 791 /* 792 New matrix classes not yet distributed 793 */ 794 /* 795 MatAIJIndices is a data structure for storing the nonzero location information 796 for sparse matrices. Several matrices with identical nonzero structure can share 797 the same MatAIJIndices. 798 */ 799 typedef struct _p_MatAIJIndices* MatAIJIndices; 800 801 EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 802 EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 803 EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 804 EXTERN int MatDestroyAIJIndices(MatAIJIndices); 805 EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 806 EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 807 EXTERN int MatShiftAIJIndices(MatAIJIndices); 808 EXTERN int MatShrinkAIJIndices(MatAIJIndices); 809 EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 810 811 EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 812 EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 813 EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*); 814 815 EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 816 EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 817 EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *); 818 819 EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 820 EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 821 EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 822 823 /*S 824 MatNullSpace - Object that removes a null space from a vector, i.e. 825 orthogonalizes the vector to a subsapce 826 827 Level: beginner 828 829 Concepts: matrix; linear operator, null space 830 831 .seealso: MatNullSpaceCreate() 832 S*/ 833 typedef struct _p_MatNullSpace* MatNullSpace; 834 835 #define MATNULLSPACE_COOKIE PETSC_COOKIE+17 836 837 EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 838 EXTERN int MatNullSpaceDestroy(MatNullSpace); 839 EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 840 EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 841 EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 842 843 EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 844 EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 845 EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 846 847 848 EXTERN int MatCreateMAIJ(Mat,int,Mat*); 849 EXTERN int MatMAIJRedimension(Mat,int,Mat*); 850 EXTERN int MatMAIJGetAIJ(Mat,Mat*); 851 852 EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 853 854 EXTERN int MatComputeExplicitOperator(Mat,Mat*); 855 856 #endif 857 858 859 860