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" 50273d9f13SBarry Smith typedef char* MatType; 51d91e6319SBarry Smith 52c06d978dSMatthew Knepley #define MAT_SER_SEQAIJ_BINARY "seqaij_binary" 53c06d978dSMatthew Knepley #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary" 54c06d978dSMatthew Knepley typedef char *MatSerializeType; 55c06d978dSMatthew Knepley 56c06d978dSMatthew Knepley /* Logging support */ 57552e946dSBarry Smith #define MAT_FILE_COOKIE 1211216 /* used to indicate matrices in binary files */ 58c06d978dSMatthew Knepley extern int MAT_COOKIE; 5971d41ebeSBarry Smith extern int MATSNESMFCTX_COOKIE; 60c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE; 618ba1e511SMatthew Knepley extern int MAT_PARTITIONING_COOKIE; 628ba1e511SMatthew Knepley extern int MAT_NULLSPACE_COOKIE; 63d5ba7fb7SMatthew Knepley extern int MAT_Mult, MAT_MultMatrixFree, MAT_MultMultiple, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose; 64d5ba7fb7SMatthew Knepley extern int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTranspose; 65d5ba7fb7SMatthew Knepley extern int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic; 66d5ba7fb7SMatthew Knepley extern int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor; 67d5ba7fb7SMatthew Knepley extern int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin; 68d5ba7fb7SMatthew Knepley extern int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering; 69d5ba7fb7SMatthew Knepley extern int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate; 7094e3eecaSKris Buschelman extern int MAT_FDColoringApply, MAT_Transpose; 71c06d978dSMatthew Knepley 728ba1e511SMatthew Knepley EXTERN int MatInitializePackage(char *); 73c06d978dSMatthew Knepley 74273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 75273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType); 76273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat); 77273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat); 78273d9f13SBarry Smith EXTERN int MatRegisterAll(char*); 79273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 80c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth)); 81273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 82273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 83c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0) 84273d9f13SBarry Smith #else 85273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 86c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d) 87273d9f13SBarry Smith #endif 88273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled; 89b0a32e0cSBarry Smith extern PetscFList MatList; 9028988994SBarry Smith 91c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList; 92c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []); 9365804fbbSSatish Balay EXTERN int MatSerializeRegisterDestroy(void); 94c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled; 95c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth); 96c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType); 97c06d978dSMatthew Knepley 9887828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*); 9987828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*); 100ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 101ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 102c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 10387828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*); 10487828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*); 105ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 106ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 107ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 108ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 109ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 110ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 1113a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*); 112435da068SBarry Smith EXTERN int MatDestroy(Mat); 11321c89e3eSBarry Smith 114ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat); 1158a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*); 116ec0117caSBarry Smith 1178ed539a5SBarry Smith /* ------------------------------------------------------------*/ 11887828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 11987828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 12084cb2905SBarry Smith 1212ef4de8bSBarry Smith /*S 1222ef4de8bSBarry Smith MatStencil - Data structure (C struct) for storing information about a single row or 1232ef4de8bSBarry Smith column of a matrix as index on an associated grid. 1242ef4de8bSBarry Smith 1252ef4de8bSBarry Smith Level: beginner 1262ef4de8bSBarry Smith 1272ef4de8bSBarry Smith Concepts: matrix; linear operator 1282ef4de8bSBarry Smith 1292ef4de8bSBarry Smith .seealso: MatSetValuesStencil(), MatSetStencil() 1302ef4de8bSBarry Smith S*/ 131435da068SBarry Smith typedef struct { 132435da068SBarry Smith int k,j,i,c; 133435da068SBarry Smith } MatStencil; 1342ef4de8bSBarry Smith 13587828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 13687828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 137435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int); 138435da068SBarry Smith 1393a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring); 1403a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*); 1413a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*); 1423a7fca6bSBarry Smith 143d91e6319SBarry Smith /*E 144d91e6319SBarry Smith MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 145d91e6319SBarry Smith to continue to add values to it 146d91e6319SBarry Smith 147d91e6319SBarry Smith Level: beginner 148d91e6319SBarry Smith 149d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd() 150d91e6319SBarry Smith E*/ 1516d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 152ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 153ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 154ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*); 1554f9c727eSBarry Smith 156b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \ 157ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 158b951964fSBarry Smith _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 159b951964fSBarry Smith } 160ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \ 161d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \ 162ea06a074SBarry Smith _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 163ea06a074SBarry Smith } 164d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \ 165ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 166d91e6319SBarry Smith _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 167d91e6319SBarry Smith } 168d91e6319SBarry Smith /*E 169d91e6319SBarry Smith MatOption - Options that may be set for a matrix and its behavior or storage 170d91e6319SBarry Smith 171d91e6319SBarry Smith Level: beginner 172d91e6319SBarry Smith 1730a835dfdSSatish Balay Any additions/changes here MUST also be made in include/finclude/petscmat.h 174d91e6319SBarry Smith 175d91e6319SBarry Smith .seealso: MatSetOption() 176d91e6319SBarry Smith E*/ 1776d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 1786d4a8577SBarry Smith MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 1796d4a8577SBarry Smith MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 1806ca9ecd3SBarry Smith MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 1816ca9ecd3SBarry Smith MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 1826ca9ecd3SBarry Smith MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 1836ca9ecd3SBarry Smith MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 1844787f768SSatish Balay MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 1857c922b88SBarry Smith MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 1862bad1931SBarry Smith MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 1878b43beb6SKris Buschelman MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption; 188ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption); 189273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*); 19084cb2905SBarry Smith 19187828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*); 19287828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**); 19387828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**); 19487828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**); 19587828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**); 196ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int); 19787828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **); 19887828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **); 199ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *); 2007b80b807SBarry Smith 201ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec); 202ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 203ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec); 204ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 205c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec); 2066d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec); 2072eac72dbSBarry Smith 208d91e6319SBarry Smith /*E 209d91e6319SBarry Smith MatDuplicateOption - Indicates if a duplicated sparse matrix should have 210d91e6319SBarry Smith its numerical values copied over or just its nonzero structure. 211d91e6319SBarry Smith 212d91e6319SBarry Smith Level: beginner 213d91e6319SBarry Smith 214d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 215d91e6319SBarry Smith 216d91e6319SBarry Smith .seealso: MatDuplicate() 217d91e6319SBarry Smith E*/ 2182e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 2192e8a6d31SBarry Smith 220273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 221273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 222273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 223273d9f13SBarry Smith #else 224273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 225273d9f13SBarry Smith #endif 226273d9f13SBarry Smith EXTERN int MatConvertRegisterAll(char*); 227273d9f13SBarry Smith EXTERN int MatConvertRegisterDestroy(void); 228273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled; 229b0a32e0cSBarry Smith extern PetscFList MatConvertList; 230ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*); 231ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 23294a9d846SBarry Smith 233d91e6319SBarry Smith /*E 234d91e6319SBarry Smith MatStructure - Indicates if the matrix has the same nonzero structure 235d91e6319SBarry Smith 236d91e6319SBarry Smith Level: beginner 237d91e6319SBarry Smith 238d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 239d91e6319SBarry Smith 240d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 241d91e6319SBarry Smith E*/ 242cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 243cb5b572fSBarry Smith 244ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure); 245b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer); 246273d9f13SBarry Smith 247b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*)); 248273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 249273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 250273d9f13SBarry Smith #else 251273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 252273d9f13SBarry Smith #endif 253273d9f13SBarry Smith EXTERN int MatLoadRegisterAll(char*); 254273d9f13SBarry Smith EXTERN int MatLoadRegisterDestroy(void); 255273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled; 256b0a32e0cSBarry Smith extern PetscFList MatLoadList; 257b0a32e0cSBarry Smith EXTERN int MatLoad(PetscViewer,MatType,Mat*); 2587b80b807SBarry Smith 259ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 260ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 261ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 262ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 263d4fbbf0eSBarry Smith 264d91e6319SBarry Smith /*S 265d91e6319SBarry Smith MatInfo - Context of matrix information, used with MatGetInfo() 266d91e6319SBarry Smith 267d91e6319SBarry Smith In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 268d91e6319SBarry Smith 269d91e6319SBarry Smith Level: intermediate 270d91e6319SBarry Smith 271d91e6319SBarry Smith Concepts: matrix^nonzero information 272d91e6319SBarry Smith 273d9274352SBarry Smith .seealso: MatGetInfo(), MatInfoType 274d91e6319SBarry Smith S*/ 2754e220ebcSLois Curfman McInnes typedef struct { 276b0a32e0cSBarry Smith PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 277b0a32e0cSBarry Smith PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 278b0a32e0cSBarry Smith PetscLogDouble block_size; /* block size */ 279b0a32e0cSBarry Smith PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 280b0a32e0cSBarry Smith PetscLogDouble memory; /* memory allocated */ 281b0a32e0cSBarry Smith PetscLogDouble assemblies; /* number of matrix assemblies called */ 282b0a32e0cSBarry Smith PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 283b0a32e0cSBarry Smith PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 284b0a32e0cSBarry Smith PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 2854e220ebcSLois Curfman McInnes } MatInfo; 2864e220ebcSLois Curfman McInnes 287d9274352SBarry Smith /*E 288d9274352SBarry Smith MatInfoType - Indicates if you want information about the local part of the matrix, 289d9274352SBarry Smith the entire parallel matrix or the maximum over all the local parts. 290d9274352SBarry Smith 291d9274352SBarry Smith Level: beginner 292d9274352SBarry Smith 293d9274352SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 294d9274352SBarry Smith 295d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo 296d9274352SBarry Smith E*/ 2977b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 298ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 299ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*); 300ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec); 301273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec); 302ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*); 303ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *); 304bf1d55d4SSatish Balay EXTERN int MatPermuteSparsify(Mat,int,PetscReal,PetscReal,IS,IS,Mat *); 305ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec); 30606ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 307ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*); 3087b80b807SBarry Smith 30987828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *); 310ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat); 31187828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*); 31287828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*); 3137b80b807SBarry Smith 314ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth); 315ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec); 316ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 3175ef9f2a5SBarry Smith 318ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*); 319ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*); 320ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*); 3217b80b807SBarry Smith 322d91e6319SBarry Smith /*E 323d91e6319SBarry Smith MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 324d91e6319SBarry Smith or MatGetSubMatrix() are to be reused to store the new matrix values. 325d91e6319SBarry Smith 326d91e6319SBarry Smith Level: beginner 327d91e6319SBarry Smith 328d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 329d91e6319SBarry Smith 330d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 331d91e6319SBarry Smith E*/ 3327b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 333ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 334ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **); 335ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 3368efafbd8SBarry Smith 337ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 3387b80b807SBarry Smith 339607cd303SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat,MatStructure); 34087828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat); 341ca44d042SBarry Smith EXTERN int MatCompress(Mat); 3427b80b807SBarry Smith 34387828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat); 34487828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat); 345052efed2SBarry Smith 346ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 347ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 34887828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*); 34987828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 35087828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 35190f02eecSBarry Smith 352ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int); 353649db694SBarry Smith 354ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 355ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec); 356ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec); 3577c922b88SBarry Smith 3587c922b88SBarry Smith /* 359c4f061fbSSatish Balay These three (or four) macros MUST be used together. The third one closes the open { of the first one 3607c922b88SBarry Smith */ 361c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 3627c922b88SBarry Smith { \ 363ef66eb69SBarry Smith int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 364ef66eb69SBarry Smith _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 365ef66eb69SBarry Smith _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 366ef66eb69SBarry Smith _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 367ef66eb69SBarry Smith _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 3687c922b88SBarry Smith 369c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 370c4f061fbSSatish Balay {\ 371c4f061fbSSatish Balay int __l;\ 372ef66eb69SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 373ef66eb69SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 374c4f061fbSSatish Balay for (__l=0;__l<nrows;__l++) {\ 375ef66eb69SBarry Smith _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 376c4f061fbSSatish Balay }\ 377c4f061fbSSatish Balay } 378c4f061fbSSatish Balay 379c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 3807c922b88SBarry Smith { int __i; \ 3817c922b88SBarry Smith for (__i=0; __i<nc; __i++) {\ 3827c922b88SBarry Smith if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 3837c922b88SBarry Smith }\ 3847c922b88SBarry Smith dnz[row - __rstart] = nc - onz[row - __rstart];\ 3857c922b88SBarry Smith } 3867c922b88SBarry Smith 387ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);} 3887c922b88SBarry Smith 3897b80b807SBarry Smith /* Routines unique to particular data structures */ 390435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **); 391435da068SBarry Smith 39287828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***); 393ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 394ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 39587828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*); 3967b80b807SBarry Smith 397273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 398273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 399273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 40087828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*); 40187828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 40287828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*); 403273d9f13SBarry Smith 404273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 405273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 406273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 40787828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*); 40887828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 409273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 41087828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*); 411273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 412435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**); 413435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**); 4143a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void)); 415273d9f13SBarry Smith 416ca44d042SBarry Smith EXTERN int MatStoreValues(Mat); 417ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat); 4182e8a6d31SBarry Smith 4193a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*); 4203a7fca6bSBarry Smith 4217b80b807SBarry Smith /* 4227b80b807SBarry Smith These routines are not usually accessed directly, rather solving is 4237b80b807SBarry Smith done through the SLES, KSP and PC interfaces. 4247b80b807SBarry Smith */ 4257b80b807SBarry Smith 426d9274352SBarry Smith /*E 427d9274352SBarry Smith MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 428d9274352SBarry Smith with an optional dynamic library name, for example 429d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 430d9274352SBarry Smith 431d9274352SBarry Smith Level: beginner 432d9274352SBarry Smith 433d9274352SBarry Smith .seealso: MatGetOrdering() 434d9274352SBarry Smith E*/ 435b12f92e5SBarry Smith typedef char* MatOrderingType; 436b12f92e5SBarry Smith #define MATORDERING_NATURAL "natural" 437b12f92e5SBarry Smith #define MATORDERING_ND "nd" 438b12f92e5SBarry Smith #define MATORDERING_1WD "1wd" 439b12f92e5SBarry Smith #define MATORDERING_RCM "rcm" 440b12f92e5SBarry Smith #define MATORDERING_QMD "qmd" 441b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength" 44262152c8bSBarry Smith #define MATORDERING_DSC_ND "dsc_nd" 44362152c8bSBarry Smith #define MATORDERING_DSC_MMD "dsc_mmd" 44462152c8bSBarry Smith #define MATORDERING_DSC_MDF "dsc_mdf" 445c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained" 446c06d978dSMatthew Knepley #define MATORDERING_IDENTITY "identity" 447c06d978dSMatthew Knepley #define MATORDERING_REVERSE "reverse" 448b12f92e5SBarry Smith 449ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 450ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 451aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 452f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 453b12f92e5SBarry Smith #else 454f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 455b12f92e5SBarry Smith #endif 456ca44d042SBarry Smith EXTERN int MatOrderingRegisterDestroy(void); 457ca44d042SBarry Smith EXTERN int MatOrderingRegisterAll(char*); 4582bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled; 459b0a32e0cSBarry Smith extern PetscFList MatOrderingList; 460d4fbbf0eSBarry Smith 46187828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 462a2ce50c7SBarry Smith 46387828ca2SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,PetscReal); 46487828ca2SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*); 465ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 466a2ce50c7SBarry Smith 467d91e6319SBarry Smith /*S 468d91e6319SBarry Smith MatILUInfo - Data based into the matrix ILU factorization routines 4695ef9f2a5SBarry Smith 470d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 47114822f30SBarry Smith 472d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of ILU 473d91e6319SBarry Smith All entries are double precision. 474d91e6319SBarry Smith 475d91e6319SBarry Smith Level: developer 476d91e6319SBarry Smith 477d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 478d91e6319SBarry Smith 479d91e6319SBarry Smith S*/ 4805ef9f2a5SBarry Smith typedef struct { 481f6275e2eSBarry Smith PetscReal levels; /* ILU(levels) */ 482f6275e2eSBarry Smith PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 483f6275e2eSBarry Smith PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 484f6275e2eSBarry Smith PetscReal dt; /* drop tolerance */ 485f6275e2eSBarry Smith PetscReal dtcol; /* tolerance for pivoting */ 486f6275e2eSBarry Smith PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 487f6275e2eSBarry Smith PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 488f6275e2eSBarry Smith PetscReal damp; /* if is 1.0 and factorization fails, damp until successful */ 489f6275e2eSBarry Smith PetscReal zeropivot; /* pivot is called zero if less than this */ 490bcd9e38bSBarry Smith PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 491bcd9e38bSBarry Smith factorization may be faster if do not pivot */ 4925ef9f2a5SBarry Smith } MatILUInfo; 4935ef9f2a5SBarry Smith 494d91e6319SBarry Smith /*S 495d91e6319SBarry Smith MatLUInfo - Data based into the matrix LU factorization routines 496d91e6319SBarry Smith 497d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 498d91e6319SBarry Smith 499d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of LU 500d91e6319SBarry Smith All entries are double precision. 501d91e6319SBarry Smith 502d91e6319SBarry Smith Level: developer 503d91e6319SBarry Smith 504d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 505d91e6319SBarry Smith 506d91e6319SBarry Smith S*/ 50714822f30SBarry Smith typedef struct { 508f6275e2eSBarry Smith PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 509f6275e2eSBarry Smith PetscReal dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 510f6275e2eSBarry Smith PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 511f6275e2eSBarry Smith PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 512f6275e2eSBarry Smith PetscReal zeropivot; /* pivot is called zero if less than this */ 513bcd9e38bSBarry Smith PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 514bcd9e38bSBarry Smith factorization may be faster if do not pivot */ 51514822f30SBarry Smith } MatLUInfo; 51614822f30SBarry Smith 517d91e6319SBarry Smith /*S 518d91e6319SBarry Smith MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 519d91e6319SBarry Smith 520d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 521d91e6319SBarry Smith 522d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of Cholesky 523d91e6319SBarry Smith All entries are double precision. 524d91e6319SBarry Smith 525d91e6319SBarry Smith Level: developer 526d91e6319SBarry Smith 527d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 528d91e6319SBarry Smith 529d91e6319SBarry Smith S*/ 530ffa6d0a5SLois Curfman McInnes typedef struct { 531f6275e2eSBarry Smith PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 532f6275e2eSBarry Smith PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 533f6275e2eSBarry Smith PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 534bcd9e38bSBarry Smith PetscReal pivotinblocks; /* for BAIJ and SBAIJ matrices pivot in factorization on blocks, default 1.0 535bcd9e38bSBarry Smith factorization may be faster if do not pivot */ 536ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo; 537ffa6d0a5SLois Curfman McInnes 53814822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 539ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 54014822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 541ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 54287828ca2SBarry Smith EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*); 54387828ca2SBarry Smith EXTERN int MatICCFactor(Mat,IS,PetscReal,int); 544ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*); 545ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 546a2ce50c7SBarry Smith 547ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec); 548ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec); 549ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec); 550ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 551ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec); 552ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 5538ed539a5SBarry Smith 554ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat); 555bb5a7306SBarry Smith 556bb1eb677SSatish Balay /* MatSORType may be bitwise ORd together, so do not change the numbers */ 557d91e6319SBarry Smith /*E 558d91e6319SBarry Smith MatSORType - What type of (S)SOR to perform 559bb1eb677SSatish Balay 560d91e6319SBarry Smith Level: beginner 561d91e6319SBarry Smith 562d9274352SBarry Smith May be bitwise ORd together 563d9274352SBarry Smith 564d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 565d91e6319SBarry Smith 566d91e6319SBarry Smith .seealso: MatRelax() 567d91e6319SBarry Smith E*/ 568ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 569ee50ffe9SBarry Smith SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 570ee50ffe9SBarry Smith SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 57184cb2905SBarry Smith SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 572c14dc6b6SHong Zhang EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,int,Vec); 5738ed539a5SBarry Smith 574d4fbbf0eSBarry Smith /* 575639f9d9dSBarry Smith These routines are for efficiently computing Jacobians via finite differences. 576639f9d9dSBarry Smith */ 577b12f92e5SBarry Smith 578d9274352SBarry Smith /*E 579d9274352SBarry Smith MatColoringType - String with the name of a PETSc matrix coloring or the creation function 580d9274352SBarry Smith with an optional dynamic library name, for example 581d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 582d9274352SBarry Smith 583d9274352SBarry Smith Level: beginner 584d9274352SBarry Smith 585d9274352SBarry Smith .seealso: MatGetColoring() 586d9274352SBarry Smith E*/ 587b12f92e5SBarry Smith typedef char* MatColoringType; 588b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural" 589b12f92e5SBarry Smith #define MATCOLORING_SL "sl" 590b12f92e5SBarry Smith #define MATCOLORING_LF "lf" 591b12f92e5SBarry Smith #define MATCOLORING_ID "id" 592b12f92e5SBarry Smith 593ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 594ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 595aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 596f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 597b12f92e5SBarry Smith #else 598f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 599b12f92e5SBarry Smith #endif 600ca44d042SBarry Smith EXTERN int MatColoringRegisterAll(char *); 6012bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled; 602ca44d042SBarry Smith EXTERN int MatColoringRegisterDestroy(void); 603b9617806SBarry Smith EXTERN int MatColoringPatch(Mat,int,int,int *,ISColoring*); 604639f9d9dSBarry Smith 605d9274352SBarry Smith /*S 606d9274352SBarry Smith MatFDColoring - Object for computing a sparse Jacobian via finite differences 607d9274352SBarry Smith and coloring 608639f9d9dSBarry Smith 609d9274352SBarry Smith Level: beginner 610d9274352SBarry Smith 611d9274352SBarry Smith Concepts: coloring, sparse Jacobian, finite differences 612d9274352SBarry Smith 613d9274352SBarry Smith .seealso: MatFDColoringCreate() 614d9274352SBarry Smith S*/ 615e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring; 616639f9d9dSBarry Smith 617ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 618ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring); 619b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 620ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 62187828ca2SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 622ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 623ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 624ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 625ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 62687828ca2SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *); 62762152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring); 6283a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec); 629639f9d9dSBarry Smith 630639f9d9dSBarry Smith /* 6310752156aSBarry Smith These routines are for partitioning matrices: currently used only 6323eda8832SBarry Smith for adjacency matrix, MatCreateMPIAdj(). 6330752156aSBarry Smith */ 634ca161407SBarry Smith 635d9274352SBarry Smith /*S 636d9274352SBarry Smith MatPartitioning - Object for managing the partitioning of a matrix or graph 637d9274352SBarry Smith 638d9274352SBarry Smith Level: beginner 639d9274352SBarry Smith 640d9274352SBarry Smith Concepts: partitioning 641d9274352SBarry Smith 642d9274352SBarry Smith .seealso: MatParitioningCreate(), MatPartitioningType 643d9274352SBarry Smith S*/ 64491e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning; 645d9274352SBarry Smith 646d9274352SBarry Smith /*E 647d9274352SBarry Smith MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function 648d9274352SBarry Smith with an optional dynamic library name, for example 649d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 650d9274352SBarry Smith 651d9274352SBarry Smith Level: beginner 652d9274352SBarry Smith 653d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning 654d9274352SBarry Smith E*/ 6552aabb6bbSBarry Smith typedef char* MatPartitioningType; 6568ba1e511SMatthew Knepley #define MAT_PARTITIONING_CURRENT "current" 6578ba1e511SMatthew Knepley #define MAT_PARTITIONING_PARMETIS "parmetis" 658ca161407SBarry Smith 659ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 660ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 661ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 662ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 663ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*); 664ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning); 6652aabb6bbSBarry Smith 666ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 667aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 668f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 6692aabb6bbSBarry Smith #else 670f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 6712aabb6bbSBarry Smith #endif 6722aabb6bbSBarry Smith 673ca44d042SBarry Smith EXTERN int MatPartitioningRegisterAll(char *); 6742bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled; 675ca44d042SBarry Smith EXTERN int MatPartitioningRegisterDestroy(void); 6762bad1931SBarry Smith 677b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 678ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 679ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 680ca161407SBarry Smith 681ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 6820752156aSBarry Smith 6830752156aSBarry Smith /* 6840a835dfdSSatish Balay If you add entries here you must also add them to finclude/petscmat.h 685d4fbbf0eSBarry Smith */ 6861c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0, 6871c1c02c0SLois Curfman McInnes MATOP_GET_ROW=1, 6881c1c02c0SLois Curfman McInnes MATOP_RESTORE_ROW=2, 6891c1c02c0SLois Curfman McInnes MATOP_MULT=3, 6901c1c02c0SLois Curfman McInnes MATOP_MULT_ADD=4, 6917c922b88SBarry Smith MATOP_MULT_TRANSPOSE=5, 6927c922b88SBarry Smith MATOP_MULT_TRANSPOSE_ADD=6, 6931c1c02c0SLois Curfman McInnes MATOP_SOLVE=7, 6941c1c02c0SLois Curfman McInnes MATOP_SOLVE_ADD=8, 6957c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE=9, 6967c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE_ADD=10, 6971c1c02c0SLois Curfman McInnes MATOP_LUFACTOR=11, 6981c1c02c0SLois Curfman McInnes MATOP_CHOLESKYFACTOR=12, 6991c1c02c0SLois Curfman McInnes MATOP_RELAX=13, 7001c1c02c0SLois Curfman McInnes MATOP_TRANSPOSE=14, 7011c1c02c0SLois Curfman McInnes MATOP_GETINFO=15, 7021c1c02c0SLois Curfman McInnes MATOP_EQUAL=16, 7031c1c02c0SLois Curfman McInnes MATOP_GET_DIAGONAL=17, 7041c1c02c0SLois Curfman McInnes MATOP_DIAGONAL_SCALE=18, 7051c1c02c0SLois Curfman McInnes MATOP_NORM=19, 7061c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_BEGIN=20, 7071c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_END=21, 7081c1c02c0SLois Curfman McInnes MATOP_COMPRESS=22, 7091c1c02c0SLois Curfman McInnes MATOP_SET_OPTION=23, 7101c1c02c0SLois Curfman McInnes MATOP_ZERO_ENTRIES=24, 7111c1c02c0SLois Curfman McInnes MATOP_ZERO_ROWS=25, 7121c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_SYMBOLIC=26, 7131c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_NUMERIC=27, 7141c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 7151c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_NUMERIC=29, 716d643ce63SMatthew Knepley MATOP_SETUP_PREALLOCATION=30, 717d643ce63SMatthew Knepley MATOP_ILUFACTOR_SYMBOLIC=31, 718d643ce63SMatthew Knepley MATOP_ICCFACTOR_SYMBOLIC=32, 719d643ce63SMatthew Knepley MATOP_GET_ARRAY=33, 720d643ce63SMatthew Knepley MATOP_RESTORE_ARRAY=34, 721d643ce63SMatthew Knepley MATOP_DUPLCIATE=35, 722d643ce63SMatthew Knepley MATOP_FORWARD_SOLVE=36, 723d643ce63SMatthew Knepley MATOP_BACKWARD_SOLVE=37, 724d643ce63SMatthew Knepley MATOP_ILUFACTOR=38, 725d643ce63SMatthew Knepley MATOP_ICCFACTOR=39, 726d643ce63SMatthew Knepley MATOP_AXPY=40, 727d643ce63SMatthew Knepley MATOP_GET_SUBMATRICES=41, 728d643ce63SMatthew Knepley MATOP_INCREASE_OVERLAP=42, 729d643ce63SMatthew Knepley MATOP_GET_VALUES=43, 730d643ce63SMatthew Knepley MATOP_COPY=44, 731d643ce63SMatthew Knepley MATOP_PRINT_HELP=45, 732d643ce63SMatthew Knepley MATOP_SCALE=46, 733d643ce63SMatthew Knepley MATOP_SHIFT=47, 734d643ce63SMatthew Knepley MATOP_DIAGONAL_SHIFT=48, 735d643ce63SMatthew Knepley MATOP_ILUDT_FACTOR=49, 736d643ce63SMatthew Knepley MATOP_GET_BLOCK_SIZE=50, 737d643ce63SMatthew Knepley MATOP_GET_ROW_IJ=51, 738d643ce63SMatthew Knepley MATOP_RESTORE_ROW_IJ=52, 739d643ce63SMatthew Knepley MATOP_GET_COLUMN_IJ=53, 740d643ce63SMatthew Knepley MATOP_RESTORE_COLUMN_IJ=54, 741d643ce63SMatthew Knepley MATOP_FDCOLORING_CREATE=55, 742d643ce63SMatthew Knepley MATOP_COLORING_PATCH=56, 743d643ce63SMatthew Knepley MATOP_SET_UNFACTORED=57, 744d643ce63SMatthew Knepley MATOP_PERMUTE=58, 745d643ce63SMatthew Knepley MATOP_SET_VALUES_BLOCKED=59, 746d643ce63SMatthew Knepley MATOP_GET_SUBMATRIX=60, 747d643ce63SMatthew Knepley MATOP_DESTROY=61, 748d643ce63SMatthew Knepley MATOP_VIEW=62, 749d643ce63SMatthew Knepley MATOP_GET_MAPS=63, 750d643ce63SMatthew Knepley MATOP_USE_SCALED_FORM=64, 751d643ce63SMatthew Knepley MATOP_SCALE_SYSTEM=65, 752d643ce63SMatthew Knepley MATOP_UNSCALE_SYSTEM=66, 753d643ce63SMatthew Knepley MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67, 754d643ce63SMatthew Knepley MATOP_SET_VALUES_LOCAL=68, 755d643ce63SMatthew Knepley MATOP_ZERO_ROWS_LOCAL=69, 756d643ce63SMatthew Knepley MATOP_GET_ROW_MAX=70, 757d643ce63SMatthew Knepley MATOP_CONVERT=71, 758d643ce63SMatthew Knepley MATOP_SET_COLORING=72, 759d643ce63SMatthew Knepley MATOP_SET_VALUES_ADIC=73, 760d643ce63SMatthew Knepley MATOP_SET_VALUES_ADIFOR=74, 761d643ce63SMatthew Knepley MATOP_FD_COLORING_APPLY=75, 762d643ce63SMatthew Knepley MATOP_SET_FROM_OPTIONS=76, 763d643ce63SMatthew Knepley MATOP_MULT_CONSTRAINED=77, 764d643ce63SMatthew Knepley MATOP_MULT_TRANSPOSE_CONSTRAINED=78, 765d643ce63SMatthew Knepley MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79, 766d643ce63SMatthew Knepley MATOP_PERMUTE_SPARSIFY=80, 767d643ce63SMatthew Knepley MATOP_MULT_MULTIPLE=81, 768d643ce63SMatthew Knepley MATOP_SOLVE_MULTIPLE=82 769fae171e0SBarry Smith } MatOperation; 770ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 771ff8b7a98SSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)(void)); 772ff8b7a98SSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)(void)); 773273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*); 774112a2221SBarry Smith 77590ace30eSBarry Smith /* 77690ace30eSBarry Smith Codes for matrices stored on disk. By default they are 77790ace30eSBarry Smith stored in a universal format. By changing the format with 778fb9695e5SSatish Balay PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will 77990ace30eSBarry Smith be stored in a way natural for the matrix, for example dense matrices 78090ace30eSBarry Smith would be stored as dense. Matrices stored this way may only be 78190ace30eSBarry Smith read into matrices of the same time. 78290ace30eSBarry Smith */ 78390ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1 78490ace30eSBarry Smith 7853f1d51d7SBarry Smith /* 7863f1d51d7SBarry Smith New matrix classes not yet distributed 7873f1d51d7SBarry Smith */ 7883f1d51d7SBarry Smith /* 7893f1d51d7SBarry Smith MatAIJIndices is a data structure for storing the nonzero location information 7903f1d51d7SBarry Smith for sparse matrices. Several matrices with identical nonzero structure can share 7913f1d51d7SBarry Smith the same MatAIJIndices. 7923f1d51d7SBarry Smith */ 793e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices; 7943f1d51d7SBarry Smith 795ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 796ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 797ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 798ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices); 799ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 800ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 801ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices); 802ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices); 803ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 8043f1d51d7SBarry Smith 805ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 806ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 80787828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*); 8083f1d51d7SBarry Smith 809ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 810ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 81187828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *); 8123f1d51d7SBarry Smith 8136d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 814ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 81508918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 816860d1616SSatish Balay 817d9274352SBarry Smith /*S 818d9274352SBarry Smith MatNullSpace - Object that removes a null space from a vector, i.e. 819d9274352SBarry Smith orthogonalizes the vector to a subsapce 820d9274352SBarry Smith 821d9274352SBarry Smith Level: beginner 822d9274352SBarry Smith 823d9274352SBarry Smith Concepts: matrix; linear operator, null space 824d9274352SBarry Smith 8256e1639daSBarry Smith Users manual sections: 8266e1639daSBarry Smith . sec_singular 8276e1639daSBarry Smith 828d9274352SBarry Smith .seealso: MatNullSpaceCreate() 829d9274352SBarry Smith S*/ 83074637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace; 831d9274352SBarry Smith 83274637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 83374637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace); 83474637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 83574637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 83674637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 83774637425SBarry Smith 838273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 839273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 840273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 841273d9f13SBarry Smith 8423f1d51d7SBarry Smith 843f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*); 844c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*); 845c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*); 846c4f061fbSSatish Balay 847273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 848f069c275SSatish Balay 849b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*); 850b0a32e0cSBarry Smith 85124a595ddSBarry Smith EXTERN int MatESISetType(Mat,char*); 85224a595ddSBarry Smith EXTERN int MatESISetFromOptions(Mat); 85324a595ddSBarry Smith 854*2cd6534aSBarry Smith EXTERN int MatDiagonalScaleLocal(Mat,Vec); 85504f1ad80SBarry Smith 8567dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutMatrix(PetscViewer, int, int, PetscReal *); 8577dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutCSRMatrix(PetscViewer, int, int, int *, int *, PetscReal *); 8587dbadf16SMatthew Knepley 8592eac72dbSBarry Smith #endif 8602eac72dbSBarry Smith 8612eac72dbSBarry Smith 8629d00d63dSBarry Smith 863