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