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 99cd28387SBarry Smith #define MAT_COOKIE PETSC_COOKIE+5 10f0479e8cSBarry Smith 11d9274352SBarry Smith /*S 12d9274352SBarry Smith Mat - Abstract PETSc matrix object 132eac72dbSBarry Smith 14d91e6319SBarry Smith Level: beginner 15d91e6319SBarry Smith 16d9274352SBarry Smith Concepts: matrix; linear operator 17d9274352SBarry Smith 18d9274352SBarry Smith .seealso: MatCreate(), MatType, MatSetType() 19d9274352SBarry Smith S*/ 20d9274352SBarry Smith typedef struct _p_Mat* Mat; 21d9274352SBarry Smith 22d9274352SBarry Smith /*E 23d9274352SBarry Smith MatType - String with the name of a PETSc matrix or the creation function 24d9274352SBarry Smith with an optional dynamic library name, for example 25d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:mymatcreate() 26d9274352SBarry Smith 27d9274352SBarry Smith Level: beginner 28d9274352SBarry Smith 29d9274352SBarry Smith .seealso: MatSetType(), Mat 30d91e6319SBarry Smith E*/ 31273d9f13SBarry Smith #define MATSAME "same" 32273d9f13SBarry Smith #define MATSEQMAIJ "seqmaij" 33273d9f13SBarry Smith #define MATMPIMAIJ "mpimaij" 34273d9f13SBarry Smith #define MATIS "is" 35273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs" 36273d9f13SBarry Smith #define MATSEQDENSE "seqdense" 37273d9f13SBarry Smith #define MATSEQAIJ "seqaij" 38273d9f13SBarry Smith #define MATMPIAIJ "mpiaij" 39273d9f13SBarry Smith #define MATSHELL "shell" 40273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag" 41273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag" 42273d9f13SBarry Smith #define MATMPIDENSE "mpidense" 43273d9f13SBarry Smith #define MATSEQBAIJ "seqbaij" 44273d9f13SBarry Smith #define MATMPIBAIJ "mpibaij" 45273d9f13SBarry Smith #define MATMPIADJ "mpiadj" 46273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij" 47273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij" 48cebc7f6cSBarry Smith #define MATDAAD "daad" 49cebc7f6cSBarry Smith #define MATMFFD "mffd" 506d88219bSBarry Smith #define MATESI "esi" 516d88219bSBarry Smith #define MATPETSCESI "petscesi" 52273d9f13SBarry Smith typedef char* MatType; 53d91e6319SBarry Smith 54c06d978dSMatthew Knepley #define MAT_SER_SEQAIJ_BINARY "seqaij_binary" 55c06d978dSMatthew Knepley #define MAT_SER_MPIAIJ_BINARY "mpiaij_binary" 56c06d978dSMatthew Knepley typedef char *MatSerializeType; 57c06d978dSMatthew Knepley 58c06d978dSMatthew Knepley #ifdef PETSC_USE_NEW_LOGGING 59c06d978dSMatthew Knepley /* Logging support */ 60c06d978dSMatthew Knepley extern int MAT_COOKIE; 61c06d978dSMatthew Knepley extern int MAT_FDCOLORING_COOKIE; 62c06d978dSMatthew Knepley extern int MATPARTITIONING_COOKIE; 63c06d978dSMatthew Knepley enum {MAT_Mult, MAT_MultMultiple, MAT_MultConstrained, MAT_MultTrans, MAT_MultAdd, MAT_MultTransAdd, MAT_MultMatrixFree, 64c06d978dSMatthew Knepley MAT_Solve, MAT_SolveMultiple, MAT_SolveAdd, MAT_SolveTrans, MAT_SolveTransAdd, MAT_Relax, MAT_ForwardSolve, 65c06d978dSMatthew Knepley MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic, MAT_LUFactorNumeric, MAT_CholeskyFactor, 66c06d978dSMatthew Knepley MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor, MAT_ILUFactorSymbolic, 67c06d978dSMatthew Knepley MAT_IncompleteCholeskyFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin, MAT_AssemblyEnd, 68c06d978dSMatthew Knepley MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering, MAT_IncreaseOverlap, 69c06d978dSMatthew Knepley MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_MAX_EVENTS}; 70c06d978dSMatthew Knepley extern int MatEvents[MAT_MAX_EVENTS]; 71c06d978dSMatthew Knepley #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(MatEvents[e],o1,o2,o3,o4) 72c06d978dSMatthew Knepley #define MatLogEventEnd(e,o1,o2,o3,o4) PetscLogEventEnd(MatEvents[e],o1,o2,o3,o4) 73c06d978dSMatthew Knepley 74c06d978dSMatthew Knepley #else 75c06d978dSMatthew Knepley 76c06d978dSMatthew Knepley enum {MAT_MultConstrained}; 77c06d978dSMatthew Knepley #define MatLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(e,o1,o2,o3,o4) 78c06d978dSMatthew Knepley #define MatLogEventEnd(e,o1,o2,o3,o4) PetscLogEventEnd(e,o1,o2,o3,o4) 79c06d978dSMatthew Knepley #endif 80c06d978dSMatthew Knepley 81273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 82273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType); 83273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat); 84273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat); 85273d9f13SBarry Smith EXTERN int MatRegisterAll(char*); 86273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 87c06d978dSMatthew Knepley EXTERN int MatSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Mat *, PetscViewer, PetscTruth)); 88273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 89273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 90c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,0) 91273d9f13SBarry Smith #else 92273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 93c06d978dSMatthew Knepley #define MatSerializeRegisterDynamic(a,b,c,d) MatSerializeRegister(a,b,c,d) 94273d9f13SBarry Smith #endif 95273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled; 96b0a32e0cSBarry Smith extern PetscFList MatList; 9728988994SBarry Smith 98c06d978dSMatthew Knepley EXTERN PetscFList MatSerializeList; 99c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAll(const char []); 100c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterDestroy(); 101c06d978dSMatthew Knepley EXTERN int MatSerializeRegisterAllCalled; 102c06d978dSMatthew Knepley EXTERN int MatSerialize(MPI_Comm, Mat *, PetscViewer, PetscTruth); 103c06d978dSMatthew Knepley EXTERN int MatSetSerializeType(Mat, MatSerializeType); 104c06d978dSMatthew Knepley 105ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 10687828ca2SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,PetscScalar*,Mat*); 10787828ca2SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,PetscScalar*,Mat*); 108ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 109ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 110c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 11187828ca2SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,PetscScalar**,Mat*); 11287828ca2SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,PetscScalar**,Mat*); 113ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 114ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 115ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 116ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 117ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 118ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 1193a7fca6bSBarry Smith EXTERN int MatCreateAdic(MPI_Comm,int,int,int,int,int,void (*)(void),Mat*); 120435da068SBarry Smith EXTERN int MatDestroy(Mat); 12121c89e3eSBarry Smith 122ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat); 1238a124369SBarry Smith EXTERN int MatGetPetscMaps(Mat,PetscMap*,PetscMap*); 124ec0117caSBarry Smith 1258ed539a5SBarry Smith /* ------------------------------------------------------------*/ 12687828ca2SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 12787828ca2SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 12884cb2905SBarry Smith 1292ef4de8bSBarry Smith /*S 1302ef4de8bSBarry Smith MatStencil - Data structure (C struct) for storing information about a single row or 1312ef4de8bSBarry Smith column of a matrix as index on an associated grid. 1322ef4de8bSBarry Smith 1332ef4de8bSBarry Smith Level: beginner 1342ef4de8bSBarry Smith 1352ef4de8bSBarry Smith Concepts: matrix; linear operator 1362ef4de8bSBarry Smith 1372ef4de8bSBarry Smith .seealso: MatSetValuesStencil(), MatSetStencil() 1382ef4de8bSBarry Smith S*/ 139435da068SBarry Smith typedef struct { 140435da068SBarry Smith int k,j,i,c; 141435da068SBarry Smith } MatStencil; 1422ef4de8bSBarry Smith 14387828ca2SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 14487828ca2SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,PetscScalar*,InsertMode); 145435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int); 146435da068SBarry Smith 1473a7fca6bSBarry Smith EXTERN int MatSetColoring(Mat,ISColoring); 1483a7fca6bSBarry Smith EXTERN int MatSetValuesAdic(Mat,void*); 1493a7fca6bSBarry Smith EXTERN int MatSetValuesAdifor(Mat,int,void*); 1503a7fca6bSBarry Smith 151d91e6319SBarry Smith /*E 152d91e6319SBarry Smith MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 153d91e6319SBarry Smith to continue to add values to it 154d91e6319SBarry Smith 155d91e6319SBarry Smith Level: beginner 156d91e6319SBarry Smith 157d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd() 158d91e6319SBarry Smith E*/ 1596d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 160ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 161ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 162ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*); 1634f9c727eSBarry Smith 164b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \ 165ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 166b951964fSBarry Smith _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 167b951964fSBarry Smith } 168ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \ 169d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \ 170ea06a074SBarry Smith _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 171ea06a074SBarry Smith } 172d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \ 173ea709b57SSatish Balay 0; {int _ierr,_row = i,_col = j; PetscScalar _va = va; \ 174d91e6319SBarry Smith _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 175d91e6319SBarry Smith } 176d91e6319SBarry Smith /*E 177d91e6319SBarry Smith MatOption - Options that may be set for a matrix and its behavior or storage 178d91e6319SBarry Smith 179d91e6319SBarry Smith Level: beginner 180d91e6319SBarry Smith 1810a835dfdSSatish Balay Any additions/changes here MUST also be made in include/finclude/petscmat.h 182d91e6319SBarry Smith 183d91e6319SBarry Smith .seealso: MatSetOption() 184d91e6319SBarry Smith E*/ 1856d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 1866d4a8577SBarry Smith MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 1876d4a8577SBarry Smith MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 1886ca9ecd3SBarry Smith MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 1896ca9ecd3SBarry Smith MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 1906ca9ecd3SBarry Smith MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 1916ca9ecd3SBarry Smith MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 1924787f768SSatish Balay MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 1937c922b88SBarry Smith MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 1942bad1931SBarry Smith MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 1958b43beb6SKris Buschelman MAT_DO_NOT_USE_INODES=82,MAT_USE_SINGLE_PRECISION_SOLVES=83} MatOption; 196ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption); 197273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*); 19884cb2905SBarry Smith 19987828ca2SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,PetscScalar*); 20087828ca2SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,PetscScalar**); 20187828ca2SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,PetscScalar**); 20287828ca2SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,PetscScalar**); 20387828ca2SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,PetscScalar**); 204ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int); 20587828ca2SBarry Smith EXTERN int MatGetArray(Mat,PetscScalar **); 20687828ca2SBarry Smith EXTERN int MatRestoreArray(Mat,PetscScalar **); 207ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *); 2087b80b807SBarry Smith 209ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec); 210ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 211ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec); 212ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 213c06d978dSMatthew Knepley EXTERN int MatMultConstrained(Mat,Vec,Vec); 2146d0dc95fSMatthew Knepley EXTERN int MatMultTransposeConstrained(Mat,Vec,Vec); 2152eac72dbSBarry Smith 216d91e6319SBarry Smith /*E 217d91e6319SBarry Smith MatDuplicateOption - Indicates if a duplicated sparse matrix should have 218d91e6319SBarry Smith its numerical values copied over or just its nonzero structure. 219d91e6319SBarry Smith 220d91e6319SBarry Smith Level: beginner 221d91e6319SBarry Smith 222d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 223d91e6319SBarry Smith 224d91e6319SBarry Smith .seealso: MatDuplicate() 225d91e6319SBarry Smith E*/ 2262e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 2272e8a6d31SBarry Smith 228273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 229273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 230273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 231273d9f13SBarry Smith #else 232273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 233273d9f13SBarry Smith #endif 234273d9f13SBarry Smith EXTERN int MatConvertRegisterAll(char*); 235273d9f13SBarry Smith EXTERN int MatConvertRegisterDestroy(void); 236273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled; 237b0a32e0cSBarry Smith extern PetscFList MatConvertList; 238ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*); 239ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 24094a9d846SBarry Smith 241d91e6319SBarry Smith /*E 242d91e6319SBarry Smith MatStructure - Indicates if the matrix has the same nonzero structure 243d91e6319SBarry Smith 244d91e6319SBarry Smith Level: beginner 245d91e6319SBarry Smith 246d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 247d91e6319SBarry Smith 248d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 249d91e6319SBarry Smith E*/ 250cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 251cb5b572fSBarry Smith 252ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure); 253b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer); 254273d9f13SBarry Smith 255b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*)); 256273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 257273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 258273d9f13SBarry Smith #else 259273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 260273d9f13SBarry Smith #endif 261273d9f13SBarry Smith EXTERN int MatLoadRegisterAll(char*); 262273d9f13SBarry Smith EXTERN int MatLoadRegisterDestroy(void); 263273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled; 264b0a32e0cSBarry Smith extern PetscFList MatLoadList; 265b0a32e0cSBarry Smith EXTERN int MatLoad(PetscViewer,MatType,Mat*); 2667b80b807SBarry Smith 267ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 268ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 269ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 270ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 271d4fbbf0eSBarry Smith 272d91e6319SBarry Smith /*S 273d91e6319SBarry Smith MatInfo - Context of matrix information, used with MatGetInfo() 274d91e6319SBarry Smith 275d91e6319SBarry Smith In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 276d91e6319SBarry Smith 277d91e6319SBarry Smith Level: intermediate 278d91e6319SBarry Smith 279d91e6319SBarry Smith Concepts: matrix^nonzero information 280d91e6319SBarry Smith 281d9274352SBarry Smith .seealso: MatGetInfo(), MatInfoType 282d91e6319SBarry Smith S*/ 2834e220ebcSLois Curfman McInnes typedef struct { 284b0a32e0cSBarry Smith PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 285b0a32e0cSBarry Smith PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 286b0a32e0cSBarry Smith PetscLogDouble block_size; /* block size */ 287b0a32e0cSBarry Smith PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 288b0a32e0cSBarry Smith PetscLogDouble memory; /* memory allocated */ 289b0a32e0cSBarry Smith PetscLogDouble assemblies; /* number of matrix assemblies called */ 290b0a32e0cSBarry Smith PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 291b0a32e0cSBarry Smith PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 292b0a32e0cSBarry Smith PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 2934e220ebcSLois Curfman McInnes } MatInfo; 2944e220ebcSLois Curfman McInnes 295d9274352SBarry Smith /*E 296d9274352SBarry Smith MatInfoType - Indicates if you want information about the local part of the matrix, 297d9274352SBarry Smith the entire parallel matrix or the maximum over all the local parts. 298d9274352SBarry Smith 299d9274352SBarry Smith Level: beginner 300d9274352SBarry Smith 301d9274352SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 302d9274352SBarry Smith 303d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo 304d9274352SBarry Smith E*/ 3057b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 306ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 307ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*); 308ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec); 309273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec); 310ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*); 311ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *); 312c06d978dSMatthew Knepley EXTERN int MatPermuteSparsify(Mat,int,double,double,IS,IS,Mat *); 313ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec); 31406ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 315ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*); 3167b80b807SBarry Smith 31787828ca2SBarry Smith EXTERN int MatNorm(Mat,NormType,PetscReal *); 318ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat); 31987828ca2SBarry Smith EXTERN int MatZeroRows(Mat,IS,PetscScalar*); 32087828ca2SBarry Smith EXTERN int MatZeroColumns(Mat,IS,PetscScalar*); 3217b80b807SBarry Smith 322ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth); 323ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec); 324ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 3255ef9f2a5SBarry Smith 326ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*); 327ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*); 328ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*); 3297b80b807SBarry Smith 330d91e6319SBarry Smith /*E 331d91e6319SBarry Smith MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 332d91e6319SBarry Smith or MatGetSubMatrix() are to be reused to store the new matrix values. 333d91e6319SBarry Smith 334d91e6319SBarry Smith Level: beginner 335d91e6319SBarry Smith 336d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 337d91e6319SBarry Smith 338d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 339d91e6319SBarry Smith E*/ 3407b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 341ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 342ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **); 343ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 3448efafbd8SBarry Smith 345ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 3467b80b807SBarry Smith 34787828ca2SBarry Smith EXTERN int MatAXPY(PetscScalar *,Mat,Mat); 34887828ca2SBarry Smith EXTERN int MatAYPX(PetscScalar *,Mat,Mat); 349ca44d042SBarry Smith EXTERN int MatCompress(Mat); 3507b80b807SBarry Smith 35187828ca2SBarry Smith EXTERN int MatScale(PetscScalar *,Mat); 35287828ca2SBarry Smith EXTERN int MatShift(PetscScalar *,Mat); 353052efed2SBarry Smith 354ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 355ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 35687828ca2SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,PetscScalar*); 35787828ca2SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 35887828ca2SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,PetscScalar*,InsertMode); 35990f02eecSBarry Smith 360ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int); 361649db694SBarry Smith 362ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 363ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec); 364ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec); 3657c922b88SBarry Smith 3667c922b88SBarry Smith /* 367c4f061fbSSatish Balay These three (or four) macros MUST be used together. The third one closes the open { of the first one 3687c922b88SBarry Smith */ 369c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 3707c922b88SBarry Smith { \ 371ef66eb69SBarry Smith int _4_ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 372ef66eb69SBarry Smith _4_ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(_4_ierr);onz = dnz + __tmp;\ 373ef66eb69SBarry Smith _4_ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(_4_ierr);\ 374ef66eb69SBarry Smith _4_ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __start = __end - __ctmp;\ 375ef66eb69SBarry Smith _4_ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(_4_ierr); __rstart = __rstart - __tmp; 3767c922b88SBarry Smith 377c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 378c4f061fbSSatish Balay {\ 379c4f061fbSSatish Balay int __l;\ 380ef66eb69SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(_4_ierr);\ 381ef66eb69SBarry Smith _4_ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(_4_ierr);\ 382c4f061fbSSatish Balay for (__l=0;__l<nrows;__l++) {\ 383ef66eb69SBarry Smith _4_ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(_4_ierr);\ 384c4f061fbSSatish Balay }\ 385c4f061fbSSatish Balay } 386c4f061fbSSatish Balay 387c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 3887c922b88SBarry Smith { int __i; \ 3897c922b88SBarry Smith for (__i=0; __i<nc; __i++) {\ 3907c922b88SBarry Smith if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 3917c922b88SBarry Smith }\ 3927c922b88SBarry Smith dnz[row - __rstart] = nc - onz[row - __rstart];\ 3937c922b88SBarry Smith } 3947c922b88SBarry Smith 395ef66eb69SBarry Smith #define MatPreallocateFinalize(dnz,onz) 0;_4_ierr = PetscFree(dnz);CHKERRQ(_4_ierr);} 3967c922b88SBarry Smith 3977b80b807SBarry Smith /* Routines unique to particular data structures */ 398435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **); 399435da068SBarry Smith 40087828ca2SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,PetscScalar***); 401ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 402ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 40387828ca2SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,PetscScalar *,Mat*); 4047b80b807SBarry Smith 405273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 406273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 407273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 40887828ca2SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,PetscScalar*); 40987828ca2SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 41087828ca2SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,PetscScalar*); 411273d9f13SBarry Smith 412273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 413273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 414273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 41587828ca2SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,PetscScalar*); 41687828ca2SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,PetscScalar**); 417273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 41887828ca2SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,PetscScalar*); 419273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 420435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**); 421435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**); 4223a7fca6bSBarry Smith EXTERN int MatAdicSetLocalFunction(Mat,void (*)(void)); 423273d9f13SBarry Smith 424ca44d042SBarry Smith EXTERN int MatStoreValues(Mat); 425ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat); 4262e8a6d31SBarry Smith 4273a7fca6bSBarry Smith EXTERN int MatDAADSetCtx(Mat,void*); 4283a7fca6bSBarry Smith 4297b80b807SBarry Smith /* 4307b80b807SBarry Smith These routines are not usually accessed directly, rather solving is 4317b80b807SBarry Smith done through the SLES, KSP and PC interfaces. 4327b80b807SBarry Smith */ 4337b80b807SBarry Smith 434d9274352SBarry Smith /*E 435d9274352SBarry Smith MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 436d9274352SBarry Smith with an optional dynamic library name, for example 437d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 438d9274352SBarry Smith 439d9274352SBarry Smith Level: beginner 440d9274352SBarry Smith 441d9274352SBarry Smith .seealso: MatGetOrdering() 442d9274352SBarry Smith E*/ 443b12f92e5SBarry Smith typedef char* MatOrderingType; 444b12f92e5SBarry Smith #define MATORDERING_NATURAL "natural" 445b12f92e5SBarry Smith #define MATORDERING_ND "nd" 446b12f92e5SBarry Smith #define MATORDERING_1WD "1wd" 447b12f92e5SBarry Smith #define MATORDERING_RCM "rcm" 448b12f92e5SBarry Smith #define MATORDERING_QMD "qmd" 449b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength" 45062152c8bSBarry Smith #define MATORDERING_DSC_ND "dsc_nd" 45162152c8bSBarry Smith #define MATORDERING_DSC_MMD "dsc_mmd" 45262152c8bSBarry Smith #define MATORDERING_DSC_MDF "dsc_mdf" 453c06d978dSMatthew Knepley #define MATORDERING_CONSTRAINED "constrained" 454c06d978dSMatthew Knepley #define MATORDERING_IDENTITY "identity" 455c06d978dSMatthew Knepley #define MATORDERING_REVERSE "reverse" 456b12f92e5SBarry Smith 457ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 458ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 459aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 460f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 461b12f92e5SBarry Smith #else 462f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 463b12f92e5SBarry Smith #endif 464ca44d042SBarry Smith EXTERN int MatOrderingRegisterDestroy(void); 465ca44d042SBarry Smith EXTERN int MatOrderingRegisterAll(char*); 4662bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled; 467b0a32e0cSBarry Smith extern PetscFList MatOrderingList; 468d4fbbf0eSBarry Smith 46987828ca2SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,PetscReal,IS,IS); 470a2ce50c7SBarry Smith 47187828ca2SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,PetscReal); 47287828ca2SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,PetscReal,Mat*); 473ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 474a2ce50c7SBarry Smith 475d91e6319SBarry Smith /*S 476d91e6319SBarry Smith MatILUInfo - Data based into the matrix ILU factorization routines 4775ef9f2a5SBarry Smith 478d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 47914822f30SBarry Smith 480d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of ILU 481d91e6319SBarry Smith All entries are double precision. 482d91e6319SBarry Smith 483d91e6319SBarry Smith Level: developer 484d91e6319SBarry Smith 485d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 486d91e6319SBarry Smith 487d91e6319SBarry Smith S*/ 4885ef9f2a5SBarry Smith typedef struct { 489f6275e2eSBarry Smith PetscReal levels; /* ILU(levels) */ 490f6275e2eSBarry Smith PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 491f6275e2eSBarry Smith PetscReal diagonal_fill; /* force diagonal to fill in if initially not filled */ 492f6275e2eSBarry Smith PetscReal dt; /* drop tolerance */ 493f6275e2eSBarry Smith PetscReal dtcol; /* tolerance for pivoting */ 494f6275e2eSBarry Smith PetscReal dtcount; /* maximum nonzeros to be allowed per row */ 495f6275e2eSBarry Smith PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 496f6275e2eSBarry Smith PetscReal damp; /* if is 1.0 and factorization fails, damp until successful */ 497f6275e2eSBarry Smith PetscReal zeropivot; /* pivot is called zero if less than this */ 4985ef9f2a5SBarry Smith } MatILUInfo; 4995ef9f2a5SBarry Smith 500d91e6319SBarry Smith /*S 501d91e6319SBarry Smith MatLUInfo - Data based into the matrix LU factorization routines 502d91e6319SBarry Smith 503d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 504d91e6319SBarry Smith 505d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of LU 506d91e6319SBarry Smith All entries are double precision. 507d91e6319SBarry Smith 508d91e6319SBarry Smith Level: developer 509d91e6319SBarry Smith 510d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 511d91e6319SBarry Smith 512d91e6319SBarry Smith S*/ 51314822f30SBarry Smith typedef struct { 514f6275e2eSBarry Smith PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 515f6275e2eSBarry Smith PetscReal dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 516f6275e2eSBarry Smith PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 517f6275e2eSBarry Smith PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 518f6275e2eSBarry Smith PetscReal zeropivot; /* pivot is called zero if less than this */ 51914822f30SBarry Smith } MatLUInfo; 52014822f30SBarry Smith 521d91e6319SBarry Smith /*S 522d91e6319SBarry Smith MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 523d91e6319SBarry Smith 524d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 525d91e6319SBarry Smith 526d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of Cholesky 527d91e6319SBarry Smith All entries are double precision. 528d91e6319SBarry Smith 529d91e6319SBarry Smith Level: developer 530d91e6319SBarry Smith 531d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 532d91e6319SBarry Smith 533d91e6319SBarry Smith S*/ 534ffa6d0a5SLois Curfman McInnes typedef struct { 535f6275e2eSBarry Smith PetscReal fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 536f6275e2eSBarry Smith PetscReal damping; /* scaling of identity added to matrix to prevent zero pivots */ 537f6275e2eSBarry Smith PetscReal damp; /* if this is 1.0 and factorization fails, damp until successful */ 538ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo; 539ffa6d0a5SLois Curfman McInnes 54014822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 541ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 54214822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 543ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 54487828ca2SBarry Smith EXTERN int MatICCFactorSymbolic(Mat,IS,PetscReal,int,Mat*); 54587828ca2SBarry Smith EXTERN int MatICCFactor(Mat,IS,PetscReal,int); 546ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*); 547ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 548a2ce50c7SBarry Smith 549ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec); 550ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec); 551ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec); 552ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 553ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec); 554ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 5558ed539a5SBarry Smith 556ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat); 557bb5a7306SBarry Smith 558bb1eb677SSatish Balay /* MatSORType may be bitwise ORd together, so do not change the numbers */ 559d91e6319SBarry Smith /*E 560d91e6319SBarry Smith MatSORType - What type of (S)SOR to perform 561bb1eb677SSatish Balay 562d91e6319SBarry Smith Level: beginner 563d91e6319SBarry Smith 564d9274352SBarry Smith May be bitwise ORd together 565d9274352SBarry Smith 566d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 567d91e6319SBarry Smith 568d91e6319SBarry Smith .seealso: MatRelax() 569d91e6319SBarry Smith E*/ 570ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 571ee50ffe9SBarry Smith SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 572ee50ffe9SBarry Smith SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 57384cb2905SBarry Smith SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 57487828ca2SBarry Smith EXTERN int MatRelax(Mat,Vec,PetscReal,MatSORType,PetscReal,int,Vec); 5758ed539a5SBarry Smith 576d4fbbf0eSBarry Smith /* 577639f9d9dSBarry Smith These routines are for efficiently computing Jacobians via finite differences. 578639f9d9dSBarry Smith */ 579b12f92e5SBarry Smith 580d9274352SBarry Smith /*E 581d9274352SBarry Smith MatColoringType - String with the name of a PETSc matrix coloring or the creation function 582d9274352SBarry Smith with an optional dynamic library name, for example 583d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 584d9274352SBarry Smith 585d9274352SBarry Smith Level: beginner 586d9274352SBarry Smith 587d9274352SBarry Smith .seealso: MatGetColoring() 588d9274352SBarry Smith E*/ 589b12f92e5SBarry Smith typedef char* MatColoringType; 590b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural" 591b12f92e5SBarry Smith #define MATCOLORING_SL "sl" 592b12f92e5SBarry Smith #define MATCOLORING_LF "lf" 593b12f92e5SBarry Smith #define MATCOLORING_ID "id" 594b12f92e5SBarry Smith 595ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 596ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 597aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 598f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 599b12f92e5SBarry Smith #else 600f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 601b12f92e5SBarry Smith #endif 602ca44d042SBarry Smith EXTERN int MatColoringRegisterAll(char *); 6032bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled; 604ca44d042SBarry Smith EXTERN int MatColoringRegisterDestroy(void); 605b9617806SBarry Smith EXTERN int MatColoringPatch(Mat,int,int,int *,ISColoring*); 606639f9d9dSBarry Smith 6071a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 608d9274352SBarry Smith /*S 609d9274352SBarry Smith MatFDColoring - Object for computing a sparse Jacobian via finite differences 610d9274352SBarry Smith and coloring 611639f9d9dSBarry Smith 612d9274352SBarry Smith Level: beginner 613d9274352SBarry Smith 614d9274352SBarry Smith Concepts: coloring, sparse Jacobian, finite differences 615d9274352SBarry Smith 616d9274352SBarry Smith .seealso: MatFDColoringCreate() 617d9274352SBarry Smith S*/ 618e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring; 619639f9d9dSBarry Smith 620ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 621ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring); 622b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 623ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 62487828ca2SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,PetscReal,PetscReal); 625ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 626ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 627ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 628ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 62987828ca2SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,PetscReal,Vec,MatStructure*,void *); 63062152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring); 6313a7fca6bSBarry Smith EXTERN int MatFDColoringSetF(MatFDColoring,Vec); 632639f9d9dSBarry Smith 633639f9d9dSBarry Smith /* 6340752156aSBarry Smith These routines are for partitioning matrices: currently used only 6353eda8832SBarry Smith for adjacency matrix, MatCreateMPIAdj(). 6360752156aSBarry Smith */ 63791e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 638ca161407SBarry Smith 639d9274352SBarry Smith /*S 640d9274352SBarry Smith MatPartitioning - Object for managing the partitioning of a matrix or graph 641d9274352SBarry Smith 642d9274352SBarry Smith Level: beginner 643d9274352SBarry Smith 644d9274352SBarry Smith Concepts: partitioning 645d9274352SBarry Smith 646d9274352SBarry Smith .seealso: MatParitioningCreate(), MatPartitioningType 647d9274352SBarry Smith S*/ 64891e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning; 649d9274352SBarry Smith 650d9274352SBarry Smith /*E 651d9274352SBarry Smith MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function 652d9274352SBarry Smith with an optional dynamic library name, for example 653d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 654d9274352SBarry Smith 655d9274352SBarry Smith Level: beginner 656d9274352SBarry Smith 657d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning 658d9274352SBarry Smith E*/ 6592aabb6bbSBarry Smith typedef char* MatPartitioningType; 6602aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT "current" 6612aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis" 662ca161407SBarry Smith 663ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 664ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 665ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 666ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 667ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*); 668ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning); 6692aabb6bbSBarry Smith 670ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 671aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 672f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 6732aabb6bbSBarry Smith #else 674f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 6752aabb6bbSBarry Smith #endif 6762aabb6bbSBarry Smith 677ca44d042SBarry Smith EXTERN int MatPartitioningRegisterAll(char *); 6782bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled; 679ca44d042SBarry Smith EXTERN int MatPartitioningRegisterDestroy(void); 6802bad1931SBarry Smith 681b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 682ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 683ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 684ca161407SBarry Smith 685ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 6860752156aSBarry Smith 6870752156aSBarry Smith /* 6880a835dfdSSatish Balay If you add entries here you must also add them to finclude/petscmat.h 689d4fbbf0eSBarry Smith */ 6901c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0, 6911c1c02c0SLois Curfman McInnes MATOP_GET_ROW=1, 6921c1c02c0SLois Curfman McInnes MATOP_RESTORE_ROW=2, 6931c1c02c0SLois Curfman McInnes MATOP_MULT=3, 6941c1c02c0SLois Curfman McInnes MATOP_MULT_ADD=4, 6957c922b88SBarry Smith MATOP_MULT_TRANSPOSE=5, 6967c922b88SBarry Smith MATOP_MULT_TRANSPOSE_ADD=6, 6971c1c02c0SLois Curfman McInnes MATOP_SOLVE=7, 6981c1c02c0SLois Curfman McInnes MATOP_SOLVE_ADD=8, 6997c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE=9, 7007c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE_ADD=10, 7011c1c02c0SLois Curfman McInnes MATOP_LUFACTOR=11, 7021c1c02c0SLois Curfman McInnes MATOP_CHOLESKYFACTOR=12, 7031c1c02c0SLois Curfman McInnes MATOP_RELAX=13, 7041c1c02c0SLois Curfman McInnes MATOP_TRANSPOSE=14, 7051c1c02c0SLois Curfman McInnes MATOP_GETINFO=15, 7061c1c02c0SLois Curfman McInnes MATOP_EQUAL=16, 7071c1c02c0SLois Curfman McInnes MATOP_GET_DIAGONAL=17, 7081c1c02c0SLois Curfman McInnes MATOP_DIAGONAL_SCALE=18, 7091c1c02c0SLois Curfman McInnes MATOP_NORM=19, 7101c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_BEGIN=20, 7111c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_END=21, 7121c1c02c0SLois Curfman McInnes MATOP_COMPRESS=22, 7131c1c02c0SLois Curfman McInnes MATOP_SET_OPTION=23, 7141c1c02c0SLois Curfman McInnes MATOP_ZERO_ENTRIES=24, 7151c1c02c0SLois Curfman McInnes MATOP_ZERO_ROWS=25, 7161c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_SYMBOLIC=26, 7171c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_NUMERIC=27, 7181c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 7191c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_NUMERIC=29, 720*d643ce63SMatthew Knepley MATOP_SETUP_PREALLOCATION=30, 721*d643ce63SMatthew Knepley MATOP_ILUFACTOR_SYMBOLIC=31, 722*d643ce63SMatthew Knepley MATOP_ICCFACTOR_SYMBOLIC=32, 723*d643ce63SMatthew Knepley MATOP_GET_ARRAY=33, 724*d643ce63SMatthew Knepley MATOP_RESTORE_ARRAY=34, 725*d643ce63SMatthew Knepley MATOP_DUPLCIATE=35, 726*d643ce63SMatthew Knepley MATOP_FORWARD_SOLVE=36, 727*d643ce63SMatthew Knepley MATOP_BACKWARD_SOLVE=37, 728*d643ce63SMatthew Knepley MATOP_ILUFACTOR=38, 729*d643ce63SMatthew Knepley MATOP_ICCFACTOR=39, 730*d643ce63SMatthew Knepley MATOP_AXPY=40, 731*d643ce63SMatthew Knepley MATOP_GET_SUBMATRICES=41, 732*d643ce63SMatthew Knepley MATOP_INCREASE_OVERLAP=42, 733*d643ce63SMatthew Knepley MATOP_GET_VALUES=43, 734*d643ce63SMatthew Knepley MATOP_COPY=44, 735*d643ce63SMatthew Knepley MATOP_PRINT_HELP=45, 736*d643ce63SMatthew Knepley MATOP_SCALE=46, 737*d643ce63SMatthew Knepley MATOP_SHIFT=47, 738*d643ce63SMatthew Knepley MATOP_DIAGONAL_SHIFT=48, 739*d643ce63SMatthew Knepley MATOP_ILUDT_FACTOR=49, 740*d643ce63SMatthew Knepley MATOP_GET_BLOCK_SIZE=50, 741*d643ce63SMatthew Knepley MATOP_GET_ROW_IJ=51, 742*d643ce63SMatthew Knepley MATOP_RESTORE_ROW_IJ=52, 743*d643ce63SMatthew Knepley MATOP_GET_COLUMN_IJ=53, 744*d643ce63SMatthew Knepley MATOP_RESTORE_COLUMN_IJ=54, 745*d643ce63SMatthew Knepley MATOP_FDCOLORING_CREATE=55, 746*d643ce63SMatthew Knepley MATOP_COLORING_PATCH=56, 747*d643ce63SMatthew Knepley MATOP_SET_UNFACTORED=57, 748*d643ce63SMatthew Knepley MATOP_PERMUTE=58, 749*d643ce63SMatthew Knepley MATOP_SET_VALUES_BLOCKED=59, 750*d643ce63SMatthew Knepley MATOP_GET_SUBMATRIX=60, 751*d643ce63SMatthew Knepley MATOP_DESTROY=61, 752*d643ce63SMatthew Knepley MATOP_VIEW=62, 753*d643ce63SMatthew Knepley MATOP_GET_MAPS=63, 754*d643ce63SMatthew Knepley MATOP_USE_SCALED_FORM=64, 755*d643ce63SMatthew Knepley MATOP_SCALE_SYSTEM=65, 756*d643ce63SMatthew Knepley MATOP_UNSCALE_SYSTEM=66, 757*d643ce63SMatthew Knepley MATOP_SET_LOCAL_TO_GLOBAL_MAPPING=67, 758*d643ce63SMatthew Knepley MATOP_SET_VALUES_LOCAL=68, 759*d643ce63SMatthew Knepley MATOP_ZERO_ROWS_LOCAL=69, 760*d643ce63SMatthew Knepley MATOP_GET_ROW_MAX=70, 761*d643ce63SMatthew Knepley MATOP_CONVERT=71, 762*d643ce63SMatthew Knepley MATOP_SET_COLORING=72, 763*d643ce63SMatthew Knepley MATOP_SET_VALUES_ADIC=73, 764*d643ce63SMatthew Knepley MATOP_SET_VALUES_ADIFOR=74, 765*d643ce63SMatthew Knepley MATOP_FD_COLORING_APPLY=75, 766*d643ce63SMatthew Knepley MATOP_SET_FROM_OPTIONS=76, 767*d643ce63SMatthew Knepley MATOP_MULT_CONSTRAINED=77, 768*d643ce63SMatthew Knepley MATOP_MULT_TRANSPOSE_CONSTRAINED=78, 769*d643ce63SMatthew Knepley MATOP_ILU_FACTOR_SYMBOLIC_CONSTRAINED=79, 770*d643ce63SMatthew Knepley MATOP_PERMUTE_SPARSIFY=80, 771*d643ce63SMatthew Knepley MATOP_MULT_MULTIPLE=81, 772*d643ce63SMatthew Knepley MATOP_SOLVE_MULTIPLE=82 773fae171e0SBarry Smith } MatOperation; 774ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 77537bd1cefSSatish Balay EXTERN int MatShellSetOperation(Mat,MatOperation,void(*)()); 77637bd1cefSSatish Balay EXTERN int MatShellGetOperation(Mat,MatOperation,void(**)()); 777273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*); 778112a2221SBarry Smith 77990ace30eSBarry Smith /* 78090ace30eSBarry Smith Codes for matrices stored on disk. By default they are 78190ace30eSBarry Smith stored in a universal format. By changing the format with 782fb9695e5SSatish Balay PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will 78390ace30eSBarry Smith be stored in a way natural for the matrix, for example dense matrices 78490ace30eSBarry Smith would be stored as dense. Matrices stored this way may only be 78590ace30eSBarry Smith read into matrices of the same time. 78690ace30eSBarry Smith */ 78790ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1 78890ace30eSBarry Smith 7893f1d51d7SBarry Smith /* 7903f1d51d7SBarry Smith New matrix classes not yet distributed 7913f1d51d7SBarry Smith */ 7923f1d51d7SBarry Smith /* 7933f1d51d7SBarry Smith MatAIJIndices is a data structure for storing the nonzero location information 7943f1d51d7SBarry Smith for sparse matrices. Several matrices with identical nonzero structure can share 7953f1d51d7SBarry Smith the same MatAIJIndices. 7963f1d51d7SBarry Smith */ 797e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices; 7983f1d51d7SBarry Smith 799ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 800ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 801ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 802ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices); 803ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 804ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 805ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices); 806ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices); 807ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 8083f1d51d7SBarry Smith 809ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 810ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 81187828ca2SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,PetscScalarPrecision,Mat*); 8123f1d51d7SBarry Smith 813ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 814ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 81587828ca2SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,PetscScalarPrecision,Mat *); 8163f1d51d7SBarry Smith 8176d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 818ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 81908918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 820860d1616SSatish Balay 821d9274352SBarry Smith /*S 822d9274352SBarry Smith MatNullSpace - Object that removes a null space from a vector, i.e. 823d9274352SBarry Smith orthogonalizes the vector to a subsapce 824d9274352SBarry Smith 825d9274352SBarry Smith Level: beginner 826d9274352SBarry Smith 827d9274352SBarry Smith Concepts: matrix; linear operator, null space 828d9274352SBarry Smith 829d9274352SBarry Smith .seealso: MatNullSpaceCreate() 830d9274352SBarry Smith S*/ 83174637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace; 832d9274352SBarry Smith 83374637425SBarry Smith #define MATNULLSPACE_COOKIE PETSC_COOKIE+17 83474637425SBarry Smith 83574637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 83674637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace); 83774637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 83874637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 83974637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 84074637425SBarry Smith 841273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 842273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 843273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 844273d9f13SBarry Smith 8453f1d51d7SBarry Smith 846f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*); 847c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*); 848c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*); 849c4f061fbSSatish Balay 850273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 851f069c275SSatish Balay 852b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*); 853b0a32e0cSBarry Smith 8542eac72dbSBarry Smith #endif 8552eac72dbSBarry Smith 8562eac72dbSBarry Smith 8579d00d63dSBarry Smith 858