173f4d377SMatthew Knepley /* $Id: petscmat.h,v 1.228 2001/09/07 20:09:08 bsmith Exp $ */ 22eac72dbSBarry Smith /* 32eac72dbSBarry Smith Include file for the matrix component of PETSc 42eac72dbSBarry Smith */ 50a835dfdSSatish Balay #ifndef __PETSCMAT_H 60a835dfdSSatish Balay #define __PETSCMAT_H 70a835dfdSSatish Balay #include "petscvec.h" 82eac72dbSBarry Smith 9d9274352SBarry Smith /*S 10d9274352SBarry Smith Mat - Abstract PETSc matrix object 112eac72dbSBarry Smith 12d91e6319SBarry Smith Level: beginner 13d91e6319SBarry Smith 14d9274352SBarry Smith Concepts: matrix; linear operator 15d9274352SBarry Smith 16d9274352SBarry Smith .seealso: MatCreate(), MatType, MatSetType() 17d9274352SBarry Smith S*/ 18d9274352SBarry Smith typedef struct _p_Mat* Mat; 19d9274352SBarry Smith 20d9274352SBarry Smith /*E 21d9274352SBarry Smith MatType - String with the name of a PETSc matrix or the creation function 22d9274352SBarry Smith with an optional dynamic library name, for example 23d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:mymatcreate() 24d9274352SBarry Smith 25d9274352SBarry Smith Level: beginner 26d9274352SBarry Smith 27d9274352SBarry Smith .seealso: MatSetType(), Mat 28d91e6319SBarry Smith E*/ 29273d9f13SBarry Smith #define MATSAME "same" 30273d9f13SBarry Smith #define MATSEQMAIJ "seqmaij" 31273d9f13SBarry Smith #define MATMPIMAIJ "mpimaij" 32273d9f13SBarry Smith #define MATIS "is" 33273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs" 34273d9f13SBarry Smith #define MATSEQDENSE "seqdense" 35273d9f13SBarry Smith #define MATSEQAIJ "seqaij" 36273d9f13SBarry Smith #define MATMPIAIJ "mpiaij" 37273d9f13SBarry Smith #define MATSHELL "shell" 38273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag" 39273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag" 40273d9f13SBarry Smith #define MATMPIDENSE "mpidense" 41273d9f13SBarry Smith #define MATSEQBAIJ "seqbaij" 42273d9f13SBarry Smith #define MATMPIBAIJ "mpibaij" 43273d9f13SBarry Smith #define MATMPIADJ "mpiadj" 44273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij" 45273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij" 46cebc7f6cSBarry Smith #define MATDAAD "daad" 47cebc7f6cSBarry Smith #define MATMFFD "mffd" 486d88219bSBarry Smith #define MATESI "esi" 496d88219bSBarry Smith #define MATPETSCESI "petscesi" 50c8a8475eSBarry Smith #define MATNORMAL "normal" 51273d9f13SBarry Smith typedef char* MatType; 52d91e6319SBarry Smith 53c06d978dSMatthew Knepley #define MAT_SER_SEQAIJ_BINARY "seqaij_binary" 54c06d978dSMatthew Knepley #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary" 55c06d978dSMatthew Knepley typedef char *MatSerializeType; 56c06d978dSMatthew Knepley 57c06d978dSMatthew Knepley /* Logging support */ 58552e946dSBarry Smith #define MAT_FILE_COOKIE 1211216 /* used to indicate matrices in binary files */ 59c06d978dSMatthew Knepley extern int MAT_COOKIE; 6071d41ebeSBarry Smith extern int MATSNESMFCTX_COOKIE; 61c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE; 628ba1e511SMatthew Knepley extern int MAT_PARTITIONING_COOKIE; 638ba1e511SMatthew Knepley extern int MAT_NULLSPACE_COOKIE; 64d59c15a7SBarry Smith extern int MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose; 65d59c15a7SBarry Smith extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose; 66d5ba7fb7SMatthew Knepley extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic; 67d5ba7fb7SMatthew Knepley extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor; 68d5ba7fb7SMatthew Knepley extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin; 69d5ba7fb7SMatthew Knepley extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering; 70d5ba7fb7SMatthew Knepley extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate; 7166f9b7ceSBarry Smith extern int MAT_FDColoringApply, MAT_Transpose, MAT_FDColoringFunction; 72c06d978dSMatthew Knepley 738ba1e511SMatthew Knepley EXTERN int MatInitializePackage(char *); 74c06d978dSMatthew Knepley 75273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 76273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType); 77273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat); 78273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat); 79273d9f13SBarry Smith EXTERN int MatRegisterAll(char*); 80273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 81c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth)); 82273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 83273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 84c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0) 85273d9f13SBarry Smith #else 86273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 87c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d) 88273d9f13SBarry Smith #endif 89273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled; 90b0a32e0cSBarry Smith extern PetscFList MatList; 9128988994SBarry Smith 92c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList; 93c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []); 9465804fbbSSatish Balay EXTERN int MatSerializeRegisterDestroy(void); 95c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled; 96c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth); 97c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType); 98c06d978dSMatthew Knepley 9987828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*); 10087828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*); 101ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 102ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 103c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 10487828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*); 10587828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*); 106ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 107ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 108ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 109ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 110ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 111ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 1123a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*); 113c8a8475eSBarry Smith EXTERN int MatCreateNormal(Mat,Mat*); 114435da068SBarry Smith EXTERN int MatDestroy(Mat); 11521c89e3eSBarry Smith 116ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat); 1178a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*); 118ec0117caSBarry Smith 1198ed539a5SBarry Smith /* ------------------------------------------------------------*/ 12087828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 12187828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 12284cb2905SBarry Smith 1232ef4de8bSBarry Smith /*S 1242ef4de8bSBarry Smith MatStencil - Data structure (C struct) for storing information about a single row or 1252ef4de8bSBarry Smith column of a matrix as index on an associated grid. 1262ef4de8bSBarry Smith 1272ef4de8bSBarry Smith Level: beginner 1282ef4de8bSBarry Smith 1292ef4de8bSBarry Smith Concepts: matrix; linear operator 1302ef4de8bSBarry Smith 1312ef4de8bSBarry Smith .seealso: MatSetValuesStencil(), MatSetStencil() 1322ef4de8bSBarry Smith S*/ 133435da068SBarry Smith typedef struct { 134435da068SBarry Smith int k,j,i,c; 135435da068SBarry Smith } MatStencil; 1362ef4de8bSBarry Smith 13787828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 13887828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 139435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int); 140435da068SBarry Smith 1413a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring); 1423a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*); 1433a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*); 1443a7fca6bSBarry Smith 145d91e6319SBarry Smith /*E 146d91e6319SBarry Smith MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 147d91e6319SBarry Smith to continue to add values to it 148d91e6319SBarry Smith 149d91e6319SBarry Smith Level: beginner 150d91e6319SBarry Smith 151d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd() 152d91e6319SBarry Smith E*/ 1536d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 154ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 155ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 156ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*); 1574f9c727eSBarry Smith 158b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \ 159ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 160b951964fSBarry Smith _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 161b951964fSBarry Smith } 162ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \ 163d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \ 164ea06a074SBarry Smith _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 165ea06a074SBarry Smith } 166d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \ 167ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 168d91e6319SBarry Smith _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 169d91e6319SBarry Smith } 170d91e6319SBarry Smith /*E 171d91e6319SBarry Smith MatOption - Options that may be set for a matrix and its behavior or storage 172d91e6319SBarry Smith 173d91e6319SBarry Smith Level: beginner 174d91e6319SBarry Smith 1750a835dfdSSatish Balay Any additions/changes here MUST also be made in include/finclude/petscmat.h 176d91e6319SBarry Smith 177d91e6319SBarry Smith .seealso: MatSetOption() 178d91e6319SBarry Smith E*/ 1796d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 1806d4a8577SBarry Smith MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 1816d4a8577SBarry Smith MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 1826ca9ecd3SBarry Smith MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 1836ca9ecd3SBarry Smith MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 1846ca9ecd3SBarry Smith MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 1856ca9ecd3SBarry Smith MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 1864787f768SSatish Balay MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 1877c922b88SBarry Smith MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 1882bad1931SBarry Smith MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 189123145dfSKris Buschelman MAT_DO_NOT_USE_INODES=82} MatOption; 190ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption); 191273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*); 19284cb2905SBarry Smith 19387828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*); 19487828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**); 19587828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**); 19687828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**); 19787828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**); 198ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int); 19987828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **); 20087828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **); 201ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *); 2027b80b807SBarry Smith 203ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec); 204ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 205ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec); 206cd0d46ebSvictorle EXTERN int MatIsSymmetric(Mat,Mat,PetscTruth*); 207ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 208c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec); 2096d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec); 2102eac72dbSBarry Smith 211d91e6319SBarry Smith /*E 212d91e6319SBarry Smith MatDuplicateOption - Indicates if a duplicated sparse matrix should have 213d91e6319SBarry Smith its numerical values copied over or just its nonzero structure. 214d91e6319SBarry Smith 215d91e6319SBarry Smith Level: beginner 216d91e6319SBarry Smith 217d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 218d91e6319SBarry Smith 219d91e6319SBarry Smith .seealso: MatDuplicate() 220d91e6319SBarry Smith E*/ 2212e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 2222e8a6d31SBarry Smith 223273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 224273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 225273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 226273d9f13SBarry Smith #else 227273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 228273d9f13SBarry Smith #endif 229273d9f13SBarry Smith EXTERN int MatConvertRegisterAll(char*); 230273d9f13SBarry Smith EXTERN int MatConvertRegisterDestroy(void); 231273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled; 232b0a32e0cSBarry Smith extern PetscFList MatConvertList; 233ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*); 234ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 23594a9d846SBarry Smith 236d91e6319SBarry Smith /*E 237d91e6319SBarry Smith MatStructure - Indicates if the matrix has the same nonzero structure 238d91e6319SBarry Smith 239d91e6319SBarry Smith Level: beginner 240d91e6319SBarry Smith 241d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 242d91e6319SBarry Smith 243d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 244d91e6319SBarry Smith E*/ 245c537a176SHong Zhang typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER,SUBSET_NONZERO_PATTERN} MatStructure; 246cb5b572fSBarry Smith 247ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure); 248b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer); 249273d9f13SBarry Smith 250b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*)); 251273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 252273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 253273d9f13SBarry Smith #else 254273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 255273d9f13SBarry Smith #endif 256273d9f13SBarry Smith EXTERN int MatLoadRegisterAll(char*); 257273d9f13SBarry Smith EXTERN int MatLoadRegisterDestroy(void); 258273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled; 259b0a32e0cSBarry Smith extern PetscFList MatLoadList; 260b0a32e0cSBarry Smith EXTERN int MatLoad(PetscViewer,MatType,Mat*); 26151dd7536SBarry Smith EXTERN int MatMerge(MPI_Comm,Mat,Mat*); 2627b80b807SBarry Smith 263ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 264ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 265ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 266ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 267d4fbbf0eSBarry Smith 268d91e6319SBarry Smith /*S 269d91e6319SBarry Smith MatInfo - Context of matrix information, used with MatGetInfo() 270d91e6319SBarry Smith 271d91e6319SBarry Smith In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 272d91e6319SBarry Smith 273d91e6319SBarry Smith Level: intermediate 274d91e6319SBarry Smith 275d91e6319SBarry Smith Concepts: matrix^nonzero information 276d91e6319SBarry Smith 277d9274352SBarry Smith .seealso: MatGetInfo(), MatInfoType 278d91e6319SBarry Smith S*/ 2794e220ebcSLois Curfman McInnes typedef struct { 280b0a32e0cSBarry Smith PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 281b0a32e0cSBarry Smith PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 282b0a32e0cSBarry Smith PetscLogDouble block_size; /* block size */ 283b0a32e0cSBarry Smith PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 284b0a32e0cSBarry Smith PetscLogDouble memory; /* memory allocated */ 285b0a32e0cSBarry Smith PetscLogDouble assemblies; /* number of matrix assemblies called */ 286b0a32e0cSBarry Smith PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 287b0a32e0cSBarry Smith PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 288b0a32e0cSBarry Smith PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 2894e220ebcSLois Curfman McInnes } MatInfo; 2904e220ebcSLois Curfman McInnes 291d9274352SBarry Smith /*E 292d9274352SBarry Smith MatInfoType - Indicates if you want information about the local part of the matrix, 293d9274352SBarry Smith the entire parallel matrix or the maximum over all the local parts. 294d9274352SBarry Smith 295d9274352SBarry Smith Level: beginner 296d9274352SBarry Smith 297d9274352SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 298d9274352SBarry Smith 299d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo 300d9274352SBarry Smith E*/ 3017b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 302ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 303ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*); 304ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec); 305273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec); 306ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*); 307ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *); 308bf1d55d4SSatish Balay EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *); 309ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec); 31006ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 311ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*); 3127b80b807SBarry Smith 31387828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *); 314ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat); 31587828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*); 31687828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*); 3177b80b807SBarry Smith 318ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth); 319ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec); 320ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 3215ef9f2a5SBarry Smith 322ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*); 323ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*); 324ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*); 3257b80b807SBarry Smith 326d91e6319SBarry Smith /*E 327d91e6319SBarry Smith MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 328d91e6319SBarry Smith or MatGetSubMatrix() are to be reused to store the new matrix values. 329d91e6319SBarry Smith 330d91e6319SBarry Smith Level: beginner 331d91e6319SBarry Smith 332d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 333d91e6319SBarry Smith 334d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 335d91e6319SBarry Smith E*/ 3367b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 337ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 338ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **); 339ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 3408efafbd8SBarry Smith 341ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 3427b80b807SBarry Smith 343607cd303SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat,MatStructure); 34487828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat); 345ca44d042SBarry Smith EXTERN int MatCompress(Mat); 3467b80b807SBarry Smith 34787828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat); 34887828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat); 349052efed2SBarry Smith 350ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 351ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 35287828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*); 35387828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 35487828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 35590f02eecSBarry Smith 356ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int); 357649db694SBarry Smith 358ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 359ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec); 360ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec); 3617c922b88SBarry Smith 3627c922b88SBarry Smith /* 363c4f061fbSSatish Balay These three (or four) macros MUST be used together. The third one closes the open { of the first one 3647c922b88SBarry Smith */ 365c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 3667c922b88SBarry Smith { \ 367ef66eb69SBarry Smith int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 368ef66eb69SBarry Smith _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 369ef66eb69SBarry Smith _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 370ef66eb69SBarry Smith _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 371ef66eb69SBarry Smith _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 3727c922b88SBarry Smith 373222b16d4SBarry Smith #define MatPreallocateSymmetricInitialize(comm,nrows,ncols,dnz,onz) 0; \ 374222b16d4SBarry Smith { \ 375222b16d4SBarry Smith int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__end; \ 376222b16d4SBarry Smith _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 377222b16d4SBarry Smith _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 378222b16d4SBarry Smith _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr);\ 379222b16d4SBarry Smith _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 380222b16d4SBarry Smith 381c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 382c4f061fbSSatish Balay {\ 383c4f061fbSSatish Balay int __l;\ 384ef66eb69SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 385ef66eb69SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 386c4f061fbSSatish Balay for (__l=0;__l<nrows;__l++) {\ 387ef66eb69SBarry Smith _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 388c4f061fbSSatish Balay }\ 389c4f061fbSSatish Balay } 390c4f061fbSSatish Balay 391d3d32019SBarry Smith #define MatPreallocateSymmetricSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 392d3d32019SBarry Smith {\ 393d3d32019SBarry Smith int __l;\ 394d3d32019SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 395d3d32019SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 396d3d32019SBarry Smith for (__l=0;__l<nrows;__l++) {\ 397d3d32019SBarry Smith _4_ierr = MatPreallocateSymmetricSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 398d3d32019SBarry Smith }\ 399d3d32019SBarry Smith } 400d3d32019SBarry Smith 401c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 4027c922b88SBarry Smith { int __i; \ 4037c922b88SBarry Smith for (__i=0; __i<nc; __i++) {\ 4047c922b88SBarry Smith if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 4057c922b88SBarry Smith }\ 4067c922b88SBarry Smith dnz[row - __rstart] = nc - onz[row - __rstart];\ 4077c922b88SBarry Smith } 4087c922b88SBarry Smith 409d3d32019SBarry Smith #define MatPreallocateSymmetricSet(row,nc,cols,dnz,onz) 0;\ 410d3d32019SBarry Smith { int __i; \ 411d3d32019SBarry Smith for (__i=0; __i<nc; __i++) {\ 412d3d32019SBarry Smith if (cols[__i] >= __end) onz[row - __rstart]++; \ 413d3d32019SBarry Smith else if (cols[__i] >= row) dnz[row - __rstart]++;\ 414d3d32019SBarry Smith }\ 415d3d32019SBarry Smith } 416d3d32019SBarry Smith 417ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);} 4187c922b88SBarry Smith 4197b80b807SBarry Smith /* Routines unique to particular data structures */ 420435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **); 421435da068SBarry Smith 42287828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***); 423ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 424ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 42587828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*); 4267b80b807SBarry Smith 427273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 428273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 429273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 43087828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*); 43187828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 43287828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*); 433273d9f13SBarry Smith 434273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 435273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 436273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 43787828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*); 43887828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 439273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 44087828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*); 441273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 442435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**); 443435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**); 4443a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void)); 445273d9f13SBarry Smith 4461b807ce4Svictorle EXTERN int MatSeqDenseSetLDA(Mat,int); 4471b807ce4Svictorle 448ca44d042SBarry Smith EXTERN int MatStoreValues(Mat); 449ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat); 4502e8a6d31SBarry Smith 4513a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*); 4523a7fca6bSBarry Smith 4537b80b807SBarry Smith /* 4547b80b807SBarry Smith These routines are not usually accessed directly, rather solving is 4557b80b807SBarry Smith done through the SLES, KSP and PC interfaces. 4567b80b807SBarry Smith */ 4577b80b807SBarry Smith 458d9274352SBarry Smith /*E 459d9274352SBarry Smith MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 460d9274352SBarry Smith with an optional dynamic library name, for example 461d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 462d9274352SBarry Smith 463d9274352SBarry Smith Level: beginner 464d9274352SBarry Smith 465d9274352SBarry Smith .seealso: MatGetOrdering() 466d9274352SBarry Smith E*/ 467b12f92e5SBarry Smith typedef char* MatOrderingType; 468b12f92e5SBarry Smith #define MATORDERING_NATURAL "natural" 469b12f92e5SBarry Smith #define MATORDERING_ND "nd" 470b12f92e5SBarry Smith #define MATORDERING_1WD "1wd" 471b12f92e5SBarry Smith #define MATORDERING_RCM "rcm" 472b12f92e5SBarry Smith #define MATORDERING_QMD "qmd" 473b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength" 47462152c8bSBarry Smith #define MATORDERING_DSC_ND "dsc_nd" 47562152c8bSBarry Smith #define MATORDERING_DSC_MMD "dsc_mmd" 47662152c8bSBarry Smith #define MATORDERING_DSC_MDF "dsc_mdf" 477c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained" 478c06d978dSMatthew Knepley #define MATORDERING_IDENTITY "identity" 479c06d978dSMatthew Knepley #define MATORDERING_REVERSE "reverse" 480b12f92e5SBarry Smith 481ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 482ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 483aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 484f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 485b12f92e5SBarry Smith #else 486f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 487b12f92e5SBarry Smith #endif 488ca44d042SBarry Smith EXTERN int MatOrderingRegisterDestroy(void); 489ca44d042SBarry Smith EXTERN int MatOrderingRegisterAll(char*); 4902bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled; 491b0a32e0cSBarry Smith extern PetscFList MatOrderingList; 492d4fbbf0eSBarry Smith 49387828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 494a2ce50c7SBarry Smith 495d91e6319SBarry Smith /*S 49615e8a5b3SHong Zhang MatFactorInfo - Data based into the matrix factorization routines 497b00f7748SHong Zhang 49815e8a5b3SHong Zhang In Fortran these are simply double precision arrays of size MAT_FACTORINFO_SIZE 499b00f7748SHong Zhang 50015e8a5b3SHong Zhang Notes: These are not usually directly used by users, instead use PC type of LU, ILU, CHOLESKY or ICC. 501b00f7748SHong Zhang 502b00f7748SHong Zhang Level: developer 503b00f7748SHong Zhang 504b380c88cSHong Zhang .seealso: MatLUFactorSymbolic(), MatILUFactorSymbolic(), MatCholeskyFactorSymbolic(), MatICCFactorSymbolic(), MatICCFactor() 505b00f7748SHong Zhang 506b00f7748SHong Zhang S*/ 507b00f7748SHong Zhang typedef struct { 50815e8a5b3SHong Zhang PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 509f4cce38bSHong Zhang PetscReal lu_shift; /* if true, shift until positive pivots */ 5106cc28720Svictorle PetscReal lu_shift_fraction; /* record shift fraction taken */ 51115e8a5b3SHong Zhang PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 51215e8a5b3SHong Zhang PetscReal dt; /* drop tolerance */ 513b00f7748SHong Zhang PetscReal dtcol; /* tolerance for pivoting */ 51415e8a5b3SHong Zhang PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 515f6275e2eSBarry Smith PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 516*348344bbSBarry Smith PetscReal levels; /* ICC/ILU(levels) */ 517bcd9e38bSBarry Smith PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 518bcd9e38bSBarry Smith factorization may be faster if do not pivot */ 51915e8a5b3SHong Zhang PetscReal zeropivot; /* pivot is called zero if less than this */ 52015e8a5b3SHong Zhang } MatFactorInfo; 521ffa6d0a5SLois Curfman McInnes 52215e8a5b3SHong Zhang EXTERN int MatCholeskyFactor(Mat,IS,MatFactorInfo*); 52315e8a5b3SHong Zhang EXTERN int MatCholeskyFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*); 52415e8a5b3SHong Zhang EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 525b380c88cSHong Zhang EXTERN int MatLUFactor(Mat,IS,IS,MatFactorInfo*); 526b380c88cSHong Zhang EXTERN int MatILUFactor(Mat,IS,IS,MatFactorInfo*); 527b380c88cSHong Zhang EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*); 528b380c88cSHong Zhang EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatFactorInfo*,Mat*); 52915e8a5b3SHong Zhang EXTERN int MatICCFactorSymbolic(Mat,IS,MatFactorInfo*,Mat*); 53015e8a5b3SHong Zhang EXTERN int MatICCFactor(Mat,IS,MatFactorInfo*); 531ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*); 532b380c88cSHong Zhang EXTERN int MatILUDTFactor(Mat,MatFactorInfo*,IS,IS,Mat *); 5333e0d88b5SBarry Smith EXTERN int MatGetInertia(Mat,int*,int*,int*); 534ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec); 535ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec); 536ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec); 537ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 538ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec); 539ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 540d59c15a7SBarry Smith EXTERN int MatSolves(Mat,Vecs,Vecs); 5418ed539a5SBarry Smith 542ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat); 543bb5a7306SBarry Smith 544bb1eb677SSatish Balay /* MatSORType may be bitwise ORd together, so do not change the numbers */ 545d91e6319SBarry Smith /*E 546d91e6319SBarry Smith MatSORType - What type of (S)SOR to perform 547bb1eb677SSatish Balay 548d91e6319SBarry Smith Level: beginner 549d91e6319SBarry Smith 550d9274352SBarry Smith May be bitwise ORd together 551d9274352SBarry Smith 552d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 553d91e6319SBarry Smith 554d91e6319SBarry Smith .seealso: MatRelax() 555d91e6319SBarry Smith E*/ 556ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 557ee50ffe9SBarry Smith SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 558ee50ffe9SBarry Smith SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 55984cb2905SBarry Smith SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 560c14dc6b6SHong Zhang EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec); 5618ed539a5SBarry Smith 562d4fbbf0eSBarry Smith /* 563639f9d9dSBarry Smith These routines are for efficiently computing Jacobians via finite differences. 564639f9d9dSBarry Smith */ 565b12f92e5SBarry Smith 566d9274352SBarry Smith /*E 567d9274352SBarry Smith MatColoringType - String with the name of a PETSc matrix coloring or the creation function 568d9274352SBarry Smith with an optional dynamic library name, for example 569d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 570d9274352SBarry Smith 571d9274352SBarry Smith Level: beginner 572d9274352SBarry Smith 573d9274352SBarry Smith .seealso: MatGetColoring() 574d9274352SBarry Smith E*/ 575b12f92e5SBarry Smith typedef char* MatColoringType; 576b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural" 577b12f92e5SBarry Smith #define MATCOLORING_SL "sl" 578b12f92e5SBarry Smith #define MATCOLORING_LF "lf" 579b12f92e5SBarry Smith #define MATCOLORING_ID "id" 580b12f92e5SBarry Smith 581ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 582ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 583aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 584f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 585b12f92e5SBarry Smith #else 586f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 587b12f92e5SBarry Smith #endif 588ca44d042SBarry Smith EXTERN int MatColoringRegisterAll(char *); 5892bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled; 590ca44d042SBarry Smith EXTERN int MatColoringRegisterDestroy(void); 59108b6dcc0SBarry Smith EXTERN int MatColoringPatch(Mat,int,int,ISColoringValue *,ISColoring*); 592639f9d9dSBarry Smith 593d9274352SBarry Smith /*S 594d9274352SBarry Smith MatFDColoring - Object for computing a sparse Jacobian via finite differences 595d9274352SBarry Smith and coloring 596639f9d9dSBarry Smith 597d9274352SBarry Smith Level: beginner 598d9274352SBarry Smith 599d9274352SBarry Smith Concepts: coloring, sparse Jacobian, finite differences 600d9274352SBarry Smith 601d9274352SBarry Smith .seealso: MatFDColoringCreate() 602d9274352SBarry Smith S*/ 603e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring; 604639f9d9dSBarry Smith 605ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 606ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring); 607b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 608ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 60987828ca2SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 610ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 611ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 612ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 613ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 61487828ca2SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *); 61562152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring); 6163a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec); 61749b058dcSBarry Smith EXTERN int MatFDColoringGetPerturbedColumns(MatFDColoring,int*,int**); 618639f9d9dSBarry Smith /* 6190752156aSBarry Smith These routines are for partitioning matrices: currently used only 6203eda8832SBarry Smith for adjacency matrix, MatCreateMPIAdj(). 6210752156aSBarry Smith */ 622ca161407SBarry Smith 623d9274352SBarry Smith /*S 624d9274352SBarry Smith MatPartitioning - Object for managing the partitioning of a matrix or graph 625d9274352SBarry Smith 626d9274352SBarry Smith Level: beginner 627d9274352SBarry Smith 628d9274352SBarry Smith Concepts: partitioning 629d9274352SBarry Smith 630d9274352SBarry Smith .seealso: MatParitioningCreate(), MatPartitioningType 631d9274352SBarry Smith S*/ 63291e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning; 633d9274352SBarry Smith 634d9274352SBarry Smith /*E 635d9274352SBarry Smith MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function 636d9274352SBarry Smith with an optional dynamic library name, for example 637d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 638d9274352SBarry Smith 639d9274352SBarry Smith Level: beginner 640d9274352SBarry Smith 641d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning 642d9274352SBarry Smith E*/ 6432aabb6bbSBarry Smith typedef char* MatPartitioningType; 6448ba1e511SMatthew Knepley #define MAT_PARTITIONING_CURRENT "current" 6458ba1e511SMatthew Knepley #define MAT_PARTITIONING_PARMETIS "parmetis" 646ca161407SBarry Smith 647ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 648ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 649ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 650ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 651ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*); 652ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning); 6532aabb6bbSBarry Smith 654ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 655aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 656f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 6572aabb6bbSBarry Smith #else 658f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 6592aabb6bbSBarry Smith #endif 6602aabb6bbSBarry Smith 661ca44d042SBarry Smith EXTERN int MatPartitioningRegisterAll(char *); 6622bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled; 663ca44d042SBarry Smith EXTERN int MatPartitioningRegisterDestroy(void); 6642bad1931SBarry Smith 665b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 666ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 667ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 668ca161407SBarry Smith 669ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 6700752156aSBarry Smith 6710752156aSBarry Smith /* 6720a835dfdSSatish Balay If you add entries here you must also add them to finclude/petscmat.h 673d4fbbf0eSBarry Smith */ 6741c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0, 6751c1c02c0SLois Curfman McInnes MATOP_GET_ROW=1, 6761c1c02c0SLois Curfman McInnes MATOP_RESTORE_ROW=2, 6771c1c02c0SLois Curfman McInnes MATOP_MULT=3, 6781c1c02c0SLois Curfman McInnes MATOP_MULT_ADD=4, 6797c922b88SBarry Smith MATOP_MULT_TRANSPOSE=5, 6807c922b88SBarry Smith MATOP_MULT_TRANSPOSE_ADD=6, 6811c1c02c0SLois Curfman McInnes MATOP_SOLVE=7, 6821c1c02c0SLois Curfman McInnes MATOP_SOLVE_ADD=8, 6837c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE=9, 6847c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE_ADD=10, 6851c1c02c0SLois Curfman McInnes MATOP_LUFACTOR=11, 6861c1c02c0SLois Curfman McInnes MATOP_CHOLESKYFACTOR=12, 6871c1c02c0SLois Curfman McInnes MATOP_RELAX=13, 6881c1c02c0SLois Curfman McInnes MATOP_TRANSPOSE=14, 6891c1c02c0SLois Curfman McInnes MATOP_GETINFO=15, 6901c1c02c0SLois Curfman McInnes MATOP_EQUAL=16, 6911c1c02c0SLois Curfman McInnes MATOP_GET_DIAGONAL=17, 6921c1c02c0SLois Curfman McInnes MATOP_DIAGONAL_SCALE=18, 6931c1c02c0SLois Curfman McInnes MATOP_NORM=19, 6941c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_BEGIN=20, 6951c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_END=21, 6961c1c02c0SLois Curfman McInnes MATOP_COMPRESS=22, 6971c1c02c0SLois Curfman McInnes MATOP_SET_OPTION=23, 6981c1c02c0SLois Curfman McInnes MATOP_ZERO_ENTRIES=24, 6991c1c02c0SLois Curfman McInnes MATOP_ZERO_ROWS=25, 7001c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_SYMBOLIC=26, 7011c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_NUMERIC=27, 7021c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 7031c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_NUMERIC=29, 704d643ce63SMatthew Knepley MATOP_SETUP_PREALLOCATION=30, 705d643ce63SMatthew Knepley MATOP_ILUFACTOR_SYMBOLIC=31, 706d643ce63SMatthew Knepley MATOP_ICCFACTOR_SYMBOLIC=32, 707d643ce63SMatthew Knepley MATOP_GET_ARRAY=33, 708d643ce63SMatthew Knepley MATOP_RESTORE_ARRAY=34, 709d643ce63SMatthew Knepley MATOP_DUPLCIATE=35, 710d643ce63SMatthew Knepley MATOP_FORWARD_SOLVE=36, 711d643ce63SMatthew Knepley MATOP_BACKWARD_SOLVE=37, 712d643ce63SMatthew Knepley MATOP_ILUFACTOR=38, 713d643ce63SMatthew Knepley MATOP_ICCFACTOR=39, 714d643ce63SMatthew Knepley MATOP_AXPY=40, 715d643ce63SMatthew Knepley MATOP_GET_SUBMATRICES=41, 716d643ce63SMatthew Knepley MATOP_INCREASE_OVERLAP=42, 717d643ce63SMatthew Knepley MATOP_GET_VALUES=43, 718d643ce63SMatthew Knepley MATOP_COPY=44, 719d643ce63SMatthew Knepley MATOP_PRINT_HELP=45, 720d643ce63SMatthew Knepley MATOP_SCALE=46, 721d643ce63SMatthew Knepley MATOP_SHIFT=47, 722d643ce63SMatthew Knepley MATOP_DIAGONAL_SHIFT=48, 723d643ce63SMatthew Knepley MATOP_ILUDT_FACTOR=49, 724d643ce63SMatthew Knepley MATOP_GET_BLOCK_SIZE=50, 725d643ce63SMatthew Knepley MATOP_GET_ROW_IJ=51, 726d643ce63SMatthew Knepley MATOP_RESTORE_ROW_IJ=52, 727d643ce63SMatthew Knepley MATOP_GET_COLUMN_IJ=53, 728d643ce63SMatthew Knepley MATOP_RESTORE_COLUMN_IJ=54, 729d643ce63SMatthew Knepley MATOP_FDCOLORING_CREATE=55, 730d643ce63SMatthew Knepley MATOP_COLORING_PATCH=56, 731d643ce63SMatthew Knepley MATOP_SET_UNFACTORED=57, 732d643ce63SMatthew Knepley MATOP_PERMUTE=58, 733d643ce63SMatthew Knepley MATOP_SET_VALUES_BLOCKED=59, 734d643ce63SMatthew Knepley MATOP_GET_SUBMATRIX=60, 735d643ce63SMatthew Knepley MATOP_DESTROY=61, 736d643ce63SMatthew Knepley MATOP_VIEW=62, 737d643ce63SMatthew Knepley MATOP_GET_MAPS=63, 738d643ce63SMatthew Knepley MATOP_USE_SCALED_FORM=64, 739d643ce63SMatthew Knepley MATOP_SCALE_SYSTEM=65, 740d643ce63SMatthew Knepley MATOP_UNSCALE_SYSTEM=66, 741d643ce63SMatthew Knepley MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67, 742d643ce63SMatthew Knepley MATOP_SET_VALUES_LOCAL=68, 743d643ce63SMatthew Knepley MATOP_ZERO_ROWS_LOCAL=69, 744d643ce63SMatthew Knepley MATOP_GET_ROW_MAX=70, 745d643ce63SMatthew Knepley MATOP_CONVERT=71, 746d643ce63SMatthew Knepley MATOP_SET_COLORING=72, 747d643ce63SMatthew Knepley MATOP_SET_VALUES_ADIC=73, 748d643ce63SMatthew Knepley MATOP_SET_VALUES_ADIFOR=74, 749d643ce63SMatthew Knepley MATOP_FD_COLORING_APPLY=75, 750d643ce63SMatthew Knepley MATOP_SET_FROM_OPTIONS=76, 751d643ce63SMatthew Knepley MATOP_MULT_CONSTRAINED=77, 752d643ce63SMatthew Knepley MATOP_MULT_TRANSPOSE_CONSTRAINED=78, 753d643ce63SMatthew Knepley MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79, 754d643ce63SMatthew Knepley MATOP_PERMUTE_SPARSIFY=80, 755d643ce63SMatthew Knepley MATOP_MULT_MULTIPLE=81, 756d643ce63SMatthew Knepley MATOP_SOLVE_MULTIPLE=82 757fae171e0SBarry Smith } MatOperation; 758ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 759ff8b7a98SSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void)); 760ff8b7a98SSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void)); 761273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*); 762112a2221SBarry Smith 76390ace30eSBarry Smith /* 76490ace30eSBarry Smith Codes for matrices stored on disk. By default they are 76590ace30eSBarry Smith stored in a universal format. By changing the format with 766fb9695e5SSatish Balay PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will 76790ace30eSBarry Smith be stored in a way natural for the matrix, for example dense matrices 76890ace30eSBarry Smith would be stored as dense. Matrices stored this way may only be 76990ace30eSBarry Smith read into matrices of the same time. 77090ace30eSBarry Smith */ 77190ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1 77290ace30eSBarry Smith 7733f1d51d7SBarry Smith /* 7743f1d51d7SBarry Smith New matrix classes not yet distributed 7753f1d51d7SBarry Smith */ 7763f1d51d7SBarry Smith /* 7773f1d51d7SBarry Smith MatAIJIndices is a data structure for storing the nonzero location information 7783f1d51d7SBarry Smith for sparse matrices. Several matrices with identical nonzero structure can share 7793f1d51d7SBarry Smith the same MatAIJIndices. 7803f1d51d7SBarry Smith */ 781e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices; 7823f1d51d7SBarry Smith 783ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 784ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 785ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 786ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices); 787ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 788ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 789ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices); 790ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices); 791ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 7923f1d51d7SBarry Smith 793ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 794ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 79587828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*); 7963f1d51d7SBarry Smith 797ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 798ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 79987828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *); 8003f1d51d7SBarry Smith 8016d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 802ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 80308918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 804860d1616SSatish Balay 805d9274352SBarry Smith /*S 806d9274352SBarry Smith MatNullSpace - Object that removes a null space from a vector, i.e. 807d9274352SBarry Smith orthogonalizes the vector to a subsapce 808d9274352SBarry Smith 809f7a9e4ceSBarry Smith Level: advanced 810d9274352SBarry Smith 811d9274352SBarry Smith Concepts: matrix; linear operator, null space 812d9274352SBarry Smith 8136e1639daSBarry Smith Users manual sections: 8146e1639daSBarry Smith . sec_singular 8156e1639daSBarry Smith 816d9274352SBarry Smith .seealso: MatNullSpaceCreate() 817d9274352SBarry Smith S*/ 81874637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace; 819d9274352SBarry Smith 82074637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 82174637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace); 82274637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 82374637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 82474637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 82574637425SBarry Smith 826273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 827273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 828273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 829273d9f13SBarry Smith 8303f1d51d7SBarry Smith 831f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*); 832c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*); 833c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*); 834c4f061fbSSatish Balay 835273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 836f069c275SSatish Balay 837b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*); 838b0a32e0cSBarry Smith 83924a595ddSBarry Smith EXTERN int MatESISetType(Mat,char*); 84024a595ddSBarry Smith EXTERN int MatESISetFromOptions(Mat); 84124a595ddSBarry Smith 8422cd6534aSBarry Smith EXTERN int MatDiagonalScaleLocal(Mat,Vec); 84304f1ad80SBarry Smith 8447dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *); 8457dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *); 8467dbadf16SMatthew Knepley 847e82a3eeeSBarry Smith EXTERN int MatUseSpooles_SeqAIJ(Mat); 848e82a3eeeSBarry Smith EXTERN int MatUseUMFPACK_SeqAIJ(Mat); 849e82a3eeeSBarry Smith EXTERN int MatUseSuperLU_SeqAIJ(Mat); 850e82a3eeeSBarry Smith EXTERN int MatUseEssl_SeqAIJ(Mat); 851e82a3eeeSBarry Smith EXTERN int MatUseLUSOL_SeqAIJ(Mat); 852e82a3eeeSBarry Smith EXTERN int MatUseMatlab_SeqAIJ(Mat); 853e82a3eeeSBarry Smith EXTERN int MatUseDXML_SeqAIJ(Mat); 854e82a3eeeSBarry Smith EXTERN int MatUseSuperLU_DIST_MPIAIJ(Mat); 855e82a3eeeSBarry Smith EXTERN int MatUseSpooles_MPIAIJ(Mat); 856e82a3eeeSBarry Smith EXTERN int MatUseSpooles_SeqSBAIJ(Mat); 857eee76cafSHong Zhang EXTERN int MatUseSpooles_MPISBAIJ(Mat); 858eee76cafSHong Zhang EXTERN int MatUseMUMPS_MPIAIJ(Mat); 859e82a3eeeSBarry Smith 8602eac72dbSBarry Smith #endif 8612eac72dbSBarry Smith 8622eac72dbSBarry Smith 8639d00d63dSBarry Smith 864