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 EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec); 215 216 /*E 217 MatDuplicateOption - Indicates if a duplicated sparse matrix should have 218 its numerical values copied over or just its nonzero structure. 219 220 Level: beginner 221 222 Any additions/changes here MUST also be made in include/finclude/petscmat.h 223 224 .seealso: MatDuplicate() 225 E*/ 226 typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 227 228 EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 229 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 230 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 231 #else 232 #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 233 #endif 234 EXTERN int MatConvertRegisterAll(char*); 235 EXTERN int MatConvertRegisterDestroy(void); 236 extern PetscTruth MatConvertRegisterAllCalled; 237 extern PetscFList MatConvertList; 238 EXTERN int MatConvert(Mat,MatType,Mat*); 239 EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 240 241 /*E 242 MatStructure - Indicates if the matrix has the same nonzero structure 243 244 Level: beginner 245 246 Any additions/changes here MUST also be made in include/finclude/petscmat.h 247 248 .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 249 E*/ 250 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 251 252 EXTERN int MatCopy(Mat,Mat,MatStructure); 253 EXTERN int MatView(Mat,PetscViewer); 254 255 EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*)); 256 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 257 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 258 #else 259 #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 260 #endif 261 EXTERN int MatLoadRegisterAll(char*); 262 EXTERN int MatLoadRegisterDestroy(void); 263 extern PetscTruth MatLoadRegisterAllCalled; 264 extern PetscFList MatLoadList; 265 EXTERN int MatLoad(PetscViewer,MatType,Mat*); 266 267 EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 268 EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 269 EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 270 EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 271 272 /*S 273 MatInfo - Context of matrix information, used with MatGetInfo() 274 275 In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 276 277 Level: intermediate 278 279 Concepts: matrix^nonzero information 280 281 .seealso: MatGetInfo(), MatInfoType 282 S*/ 283 typedef struct { 284 PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 285 PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 286 PetscLogDouble block_size; /* block size */ 287 PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 288 PetscLogDouble memory; /* memory allocated */ 289 PetscLogDouble assemblies; /* number of matrix assemblies called */ 290 PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 291 PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 292 PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 293 } MatInfo; 294 295 /*E 296 MatInfoType - Indicates if you want information about the local part of the matrix, 297 the entire parallel matrix or the maximum over all the local parts. 298 299 Level: beginner 300 301 Any additions/changes here MUST also be made in include/finclude/petscmat.h 302 303 .seealso: MatGetInfo(), MatInfo 304 E*/ 305 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 306 EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 307 EXTERN int MatValid(Mat,PetscTruth*); 308 EXTERN int MatGetDiagonal(Mat,Vec); 309 EXTERN int MatGetRowMax(Mat,Vec); 310 EXTERN int MatTranspose(Mat,Mat*); 311 EXTERN int MatPermute(Mat,IS,IS,Mat *); 312 EXTERN int MatPermuteSparsify(Mat,int,double,double,IS,IS,Mat *); 313 EXTERN int MatDiagonalScale(Mat,Vec,Vec); 314 EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 315 EXTERN int MatEqual(Mat,Mat,PetscTruth*); 316 317 EXTERN int MatNorm(Mat,NormType,PetscReal *); 318 EXTERN int MatZeroEntries(Mat); 319 EXTERN int MatZeroRows(Mat,IS,PetscScalar*); 320 EXTERN int MatZeroColumns(Mat,IS,PetscScalar*); 321 322 EXTERN int MatUseScaledForm(Mat,PetscTruth); 323 EXTERN int MatScaleSystem(Mat,Vec,Vec); 324 EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 325 326 EXTERN int MatGetSize(Mat,int*,int*); 327 EXTERN int MatGetLocalSize(Mat,int*,int*); 328 EXTERN int MatGetOwnershipRange(Mat,int*,int*); 329 330 /*E 331 MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 332 or MatGetSubMatrix() are to be reused to store the new matrix values. 333 334 Level: beginner 335 336 Any additions/changes here MUST also be made in include/finclude/petscmat.h 337 338 .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 339 E*/ 340 typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 341 EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 342 EXTERN int MatDestroyMatrices(int,Mat **); 343 EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 344 345 EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 346 347 EXTERN int MatAXPY(PetscScalar *,Mat,Mat); 348 EXTERN int MatAYPX(PetscScalar *,Mat,Mat); 349 EXTERN int MatCompress(Mat); 350 351 EXTERN int MatScale(PetscScalar *,Mat); 352 EXTERN int MatShift(PetscScalar *,Mat); 353 354 EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 355 EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 356 EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*); 357 EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 358 EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 359 360 EXTERN int MatSetStashInitialSize(Mat,int,int); 361 362 EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 363 EXTERN int MatInterpolate(Mat,Vec,Vec); 364 EXTERN int MatRestrict(Mat,Vec,Vec); 365 366 /* 367 These three (or four) macros MUST be used together. The third one closes the open { of the first one 368 */ 369 #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 370 { \ 371 int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 372 _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 373 _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 374 _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 375 _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 376 377 #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 378 {\ 379 int __l;\ 380 _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 381 _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 382 for (__l=0;__l<nrows;__l++) {\ 383 _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 384 }\ 385 } 386 387 #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 388 { int __i; \ 389 for (__i=0; __i<nc; __i++) {\ 390 if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 391 }\ 392 dnz[row - __rstart] = nc - onz[row - __rstart];\ 393 } 394 395 #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);} 396 397 /* Routines unique to particular data structures */ 398 EXTERN int MatShellGetContext(Mat,void **); 399 400 EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***); 401 EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 402 EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 403 EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*); 404 405 EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 406 EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 407 EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 408 EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*); 409 EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 410 EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*); 411 412 EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 413 EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 414 EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 415 EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*); 416 EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 417 EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 418 EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*); 419 EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 420 EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**); 421 EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**); 422 EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void)); 423 424 EXTERN int MatStoreValues(Mat); 425 EXTERN int MatRetrieveValues(Mat); 426 427 EXTERN int MatDAADSetCtx(Mat,void*); 428 429 /* 430 These routines are not usually accessed directly, rather solving is 431 done through the SLES, KSP and PC interfaces. 432 */ 433 434 /*E 435 MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 436 with an optional dynamic library name, for example 437 http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 438 439 Level: beginner 440 441 .seealso: MatGetOrdering() 442 E*/ 443 typedef char* MatOrderingType; 444 #define MATORDERING_NATURAL "natural" 445 #define MATORDERING_ND "nd" 446 #define MATORDERING_1WD "1wd" 447 #define MATORDERING_RCM "rcm" 448 #define MATORDERING_QMD "qmd" 449 #define MATORDERING_ROWLENGTH "rowlength" 450 #define MATORDERING_DSC_ND "dsc_nd" 451 #define MATORDERING_DSC_MMD "dsc_mmd" 452 #define MATORDERING_DSC_MDF "dsc_mdf" 453 #define MATORDERING_CONSTRAINED "constrained" 454 #define MATORDERING_IDENTITY "identity" 455 #define MATORDERING_REVERSE "reverse" 456 457 EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 458 EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 459 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 460 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 461 #else 462 #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 463 #endif 464 EXTERN int MatOrderingRegisterDestroy(void); 465 EXTERN int MatOrderingRegisterAll(char*); 466 extern PetscTruth MatOrderingRegisterAllCalled; 467 extern PetscFList MatOrderingList; 468 469 EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 470 471 EXTERN int MatCholeskyFactor(Mat,IS,PetscReal); 472 EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*); 473 EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 474 475 /*S 476 MatILUInfo - Data based into the matrix ILU factorization routines 477 478 In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 479 480 Notes: These are not usually directly used by users, instead use the PC type of ILU 481 All entries are double precision. 482 483 Level: developer 484 485 .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 486 487 S*/ 488 typedef struct { 489 PetscReal levels; /* ILU(levels) */ 490 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 491 PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 492 PetscReal dt; /* drop tolerance */ 493 PetscReal dtcol; /* tolerance for pivoting */ 494 PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 495 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 496 PetscReal damp; /* if is 1.0 and factorization fails, damp until successful */ 497 PetscReal zeropivot; /* pivot is called zero if less than this */ 498 } MatILUInfo; 499 500 /*S 501 MatLUInfo - Data based into the matrix LU factorization routines 502 503 In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 504 505 Notes: These are not usually directly used by users, instead use the PC type of LU 506 All entries are double precision. 507 508 Level: developer 509 510 .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 511 512 S*/ 513 typedef struct { 514 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 515 PetscReal dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 516 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 517 PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 518 PetscReal zeropivot; /* pivot is called zero if less than this */ 519 } MatLUInfo; 520 521 /*S 522 MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 523 524 In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 525 526 Notes: These are not usually directly used by users, instead use the PC type of Cholesky 527 All entries are double precision. 528 529 Level: developer 530 531 .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 532 533 S*/ 534 typedef struct { 535 PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 536 PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 537 PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 538 } MatCholeskyInfo; 539 540 EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 541 EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 542 EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 543 EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 544 EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*); 545 EXTERN int MatICCFactor(Mat,IS,PetscReal,int); 546 EXTERN int MatLUFactorNumeric(Mat,Mat*); 547 EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 548 549 EXTERN int MatSolve(Mat,Vec,Vec); 550 EXTERN int MatForwardSolve(Mat,Vec,Vec); 551 EXTERN int MatBackwardSolve(Mat,Vec,Vec); 552 EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 553 EXTERN int MatSolveTranspose(Mat,Vec,Vec); 554 EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 555 556 EXTERN int MatSetUnfactored(Mat); 557 558 /* MatSORType may be bitwise ORd together, so do not change the numbers */ 559 /*E 560 MatSORType - What type of (S)SOR to perform 561 562 Level: beginner 563 564 May be bitwise ORd together 565 566 Any additions/changes here MUST also be made in include/finclude/petscmat.h 567 568 .seealso: MatRelax() 569 E*/ 570 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 571 SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 572 SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 573 SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 574 EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,Vec); 575 576 /* 577 These routines are for efficiently computing Jacobians via finite differences. 578 */ 579 580 /*E 581 MatColoringType - String with the name of a PETSc matrix coloring or the creation function 582 with an optional dynamic library name, for example 583 http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 584 585 Level: beginner 586 587 .seealso: MatGetColoring() 588 E*/ 589 typedef char* MatColoringType; 590 #define MATCOLORING_NATURAL "natural" 591 #define MATCOLORING_SL "sl" 592 #define MATCOLORING_LF "lf" 593 #define MATCOLORING_ID "id" 594 595 EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 596 EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 597 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 598 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 599 #else 600 #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 601 #endif 602 EXTERN int MatColoringRegisterAll(char *); 603 extern PetscTruth MatColoringRegisterAllCalled; 604 EXTERN int MatColoringRegisterDestroy(void); 605 EXTERN int MatColoringPatch(Mat,int,int,int *,ISColoring*); 606 607 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 608 /*S 609 MatFDColoring - Object for computing a sparse Jacobian via finite differences 610 and coloring 611 612 Level: beginner 613 614 Concepts: coloring, sparse Jacobian, finite differences 615 616 .seealso: MatFDColoringCreate() 617 S*/ 618 typedef struct _p_MatFDColoring *MatFDColoring; 619 620 EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 621 EXTERN int MatFDColoringDestroy(MatFDColoring); 622 EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 623 EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 624 EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 625 EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 626 EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 627 EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 628 EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 629 EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *); 630 EXTERN int MatFDColoringSetRecompute(MatFDColoring); 631 EXTERN int MatFDColoringSetF(MatFDColoring,Vec); 632 633 /* 634 These routines are for partitioning matrices: currently used only 635 for adjacency matrix, MatCreateMPIAdj(). 636 */ 637 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 638 639 /*S 640 MatPartitioning - Object for managing the partitioning of a matrix or graph 641 642 Level: beginner 643 644 Concepts: partitioning 645 646 .seealso: MatParitioningCreate(), MatPartitioningType 647 S*/ 648 typedef struct _p_MatPartitioning *MatPartitioning; 649 650 /*E 651 MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function 652 with an optional dynamic library name, for example 653 http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 654 655 Level: beginner 656 657 .seealso: MatPartitioingCreate(), MatPartitioning 658 E*/ 659 typedef char* MatPartitioningType; 660 #define MATPARTITIONING_CURRENT "current" 661 #define MATPARTITIONING_PARMETIS "parmetis" 662 663 EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 664 EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 665 EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 666 EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 667 EXTERN int MatPartitioningApply(MatPartitioning,IS*); 668 EXTERN int MatPartitioningDestroy(MatPartitioning); 669 670 EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 671 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 672 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 673 #else 674 #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 675 #endif 676 677 EXTERN int MatPartitioningRegisterAll(char *); 678 extern PetscTruth MatPartitioningRegisterAllCalled; 679 EXTERN int MatPartitioningRegisterDestroy(void); 680 681 EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 682 EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 683 EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 684 685 EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 686 687 /* 688 If you add entries here you must also add them to finclude/petscmat.h 689 */ 690 typedef enum { MATOP_SET_VALUES=0, 691 MATOP_GET_ROW=1, 692 MATOP_RESTORE_ROW=2, 693 MATOP_MULT=3, 694 MATOP_MULT_ADD=4, 695 MATOP_MULT_TRANSPOSE=5, 696 MATOP_MULT_TRANSPOSE_ADD=6, 697 MATOP_SOLVE=7, 698 MATOP_SOLVE_ADD=8, 699 MATOP_SOLVE_TRANSPOSE=9, 700 MATOP_SOLVE_TRANSPOSE_ADD=10, 701 MATOP_LUFACTOR=11, 702 MATOP_CHOLESKYFACTOR=12, 703 MATOP_RELAX=13, 704 MATOP_TRANSPOSE=14, 705 MATOP_GETINFO=15, 706 MATOP_EQUAL=16, 707 MATOP_GET_DIAGONAL=17, 708 MATOP_DIAGONAL_SCALE=18, 709 MATOP_NORM=19, 710 MATOP_ASSEMBLY_BEGIN=20, 711 MATOP_ASSEMBLY_END=21, 712 MATOP_COMPRESS=22, 713 MATOP_SET_OPTION=23, 714 MATOP_ZERO_ENTRIES=24, 715 MATOP_ZERO_ROWS=25, 716 MATOP_LUFACTOR_SYMBOLIC=26, 717 MATOP_LUFACTOR_NUMERIC=27, 718 MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 719 MATOP_CHOLESKY_FACTOR_NUMERIC=29, 720 MATOP_SETUP_PREALLOCATION=30, 721 MATOP_ILUFACTOR_SYMBOLIC=31, 722 MATOP_ICCFACTOR_SYMBOLIC=32, 723 MATOP_GET_ARRAY=33, 724 MATOP_RESTORE_ARRAY=34, 725 MATOP_DUPLCIATE=35, 726 MATOP_FORWARD_SOLVE=36, 727 MATOP_BACKWARD_SOLVE=37, 728 MATOP_ILUFACTOR=38, 729 MATOP_ICCFACTOR=39, 730 MATOP_AXPY=40, 731 MATOP_GET_SUBMATRICES=41, 732 MATOP_INCREASE_OVERLAP=42, 733 MATOP_GET_VALUES=43, 734 MATOP_COPY=44, 735 MATOP_PRINT_HELP=45, 736 MATOP_SCALE=46, 737 MATOP_SHIFT=47, 738 MATOP_DIAGONAL_SHIFT=48, 739 MATOP_ILUDT_FACTOR=49, 740 MATOP_GET_BLOCK_SIZE=50, 741 MATOP_GET_ROW_IJ=51, 742 MATOP_RESTORE_ROW_IJ=52, 743 MATOP_GET_COLUMN_IJ=53, 744 MATOP_RESTORE_COLUMN_IJ=54, 745 MATOP_FDCOLORING_CREATE=55, 746 MATOP_COLORING_PATCH=56, 747 MATOP_SET_UNFACTORED=57, 748 MATOP_PERMUTE=58, 749 MATOP_SET_VALUES_BLOCKED=59, 750 MATOP_GET_SUBMATRIX=60, 751 MATOP_DESTROY=61, 752 MATOP_VIEW=62, 753 MATOP_GET_MAPS=63, 754 MATOP_USE_SCALED_FORM=64, 755 MATOP_SCALE_SYSTEM=65, 756 MATOP_UNSCALE_SYSTEM=66, 757 MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67, 758 MATOP_SET_VALUES_LOCAL=68, 759 MATOP_ZERO_ROWS_LOCAL=69, 760 MATOP_GET_ROW_MAX=70, 761 MATOP_CONVERT=71, 762 MATOP_SET_COLORING=72, 763 MATOP_SET_VALUES_ADIC=73, 764 MATOP_SET_VALUES_ADIFOR=74, 765 MATOP_FD_COLORING_APPLY=75, 766 MATOP_SET_FROM_OPTIONS=76, 767 MATOP_MULT_CONSTRAINED=77, 768 MATOP_MULT_TRANSPOSE_CONSTRAINED=78, 769 MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79, 770 MATOP_PERMUTE_SPARSIFY=80, 771 MATOP_MULT_MULTIPLE=81, 772 MATOP_SOLVE_MULTIPLE=82 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