1*4f9c727eSBarry Smith /* $Id: mat.h,v 1.177 1999/04/16 16:12:20 bsmith Exp bsmith $ */ 22eac72dbSBarry Smith /* 32eac72dbSBarry Smith Include file for the matrix component of PETSc 42eac72dbSBarry Smith */ 5a009ddc3SBarry Smith #ifndef __MAT_H 6a009ddc3SBarry Smith #define __MAT_H 78ed539a5SBarry Smith #include "vec.h" 82eac72dbSBarry Smith 99cd28387SBarry Smith #define MAT_COOKIE PETSC_COOKIE+5 10f0479e8cSBarry Smith 11e2a1c21fSSatish Balay typedef struct _p_Mat* Mat; 122eac72dbSBarry Smith 13f1d1b154SWilliam Gropp #define MAX_MATRIX_TYPES 14 14639f9d9dSBarry Smith /* 15639f9d9dSBarry Smith The default matrix data storage formats and routines to create them. 16f1d1b154SWilliam Gropp 17f1d1b154SWilliam Gropp MATLASTTYPE is "end-of-list" marker that can be used to check that 18f1d1b154SWilliam Gropp MAX_MATRIX_TYPES is large enough. The rule is 19f1d1b154SWilliam Gropp MAX_MATRIX_TYPES >= MATLASTTYPE . 20f1d1b154SWilliam Gropp 21f1d1b154SWilliam Gropp To do: add a test program that checks the consistency of these values. 22639f9d9dSBarry Smith */ 234ac9ca07SLois Curfman McInnes typedef enum { MATSAME=-1, MATSEQDENSE, MATSEQAIJ, MATMPIAIJ, MATSHELL, 2484cb2905SBarry Smith MATMPIROWBS, MATSEQBDIAG, MATMPIBDIAG, MATMPIDENSE, MATSEQBAIJ, 25f1d1b154SWilliam Gropp MATMPIBAIJ, MATMPICSN, MATSEQCSN, MATSEQADJ, MATMPIADJ, 26f1d1b154SWilliam Gropp MATLASTTYPE } MatType; 2728988994SBarry Smith 28b12f92e5SBarry Smith extern int MatCreate(MPI_Comm,int,int,int,int,Mat*); 29df6e0191SLois Curfman McInnes extern int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*); 30d5bc1036SLois Curfman McInnes extern int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*); 31de7da479SBarry Smith extern int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 329717bf64SBarry Smith extern int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 33cfe223acSLois Curfman McInnes extern int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,Mat*); 34f26ada1bSBarry Smith extern int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*); 35f26ada1bSBarry Smith extern int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*); 36df8a92d1SBarry Smith extern int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 37eba03b66SLois Curfman McInnes extern int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 3882c9921cSBarry Smith extern int MatCreateSeqAdj(MPI_Comm,int,int,int*,int*,Mat *); 390752156aSBarry Smith extern int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,Mat*); 409717bf64SBarry Smith 417b80b807SBarry Smith extern int MatDestroy(Mat); 427b80b807SBarry Smith 437ddc982cSLois Curfman McInnes extern int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 4417116c71SBarry Smith extern int MatShellGetContext(Mat,void **); 4521c89e3eSBarry Smith 46ec0117caSBarry Smith extern int MatPrintHelp(Mat); 47cda55fadSBarry Smith extern int MatGetMaps(Mat,Map*,Map*); 48ec0117caSBarry Smith 498ed539a5SBarry Smith /* ------------------------------------------------------------*/ 50ee50ffe9SBarry Smith extern int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode); 5195e63191SSatish Balay extern int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode); 5284cb2905SBarry Smith 536d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 54ee50ffe9SBarry Smith extern int MatAssemblyBegin(Mat,MatAssemblyType); 55ee50ffe9SBarry Smith extern int MatAssemblyEnd(Mat,MatAssemblyType); 56*4f9c727eSBarry Smith extern int MatAssembled(Mat,PetscTruth*); 57*4f9c727eSBarry Smith 58b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \ 59b951964fSBarry Smith {int _ierr,_row = i,_col = j; Scalar _va = va; \ 60b951964fSBarry Smith _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 61b951964fSBarry Smith } 62ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \ 63ea06a074SBarry Smith {int _ierr,_row = i,_col = j; \ 64ea06a074SBarry Smith _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 65ea06a074SBarry Smith } 666ca9ecd3SBarry Smith /* 676ca9ecd3SBarry Smith Any additions/changes here MUST also be made in include/finclude/mat.h 686ca9ecd3SBarry Smith */ 696d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 706d4a8577SBarry Smith MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 716d4a8577SBarry Smith MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 726ca9ecd3SBarry Smith MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 736ca9ecd3SBarry Smith MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 746ca9ecd3SBarry Smith MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 756ca9ecd3SBarry Smith MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 764787f768SSatish Balay MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 774787f768SSatish Balay MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78} MatOption; 78ee50ffe9SBarry Smith extern int MatSetOption(Mat,MatOption); 794b0e389bSBarry Smith extern int MatGetType(Mat,MatType*,char**); 8056cd22aeSBarry Smith extern int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,PetscTruth*); 8184cb2905SBarry Smith 82ee50ffe9SBarry Smith extern int MatGetValues(Mat,int,int*,int,int*,Scalar*); 838ed539a5SBarry Smith extern int MatGetRow(Mat,int,int *,int **,Scalar**); 848ed539a5SBarry Smith extern int MatRestoreRow(Mat,int,int *,int **,Scalar**); 8577c4ece6SBarry Smith extern int MatGetColumn(Mat,int,int *,int **,Scalar**); 8677c4ece6SBarry Smith extern int MatRestoreColumn(Mat,int,int *,int **,Scalar**); 875cd4b4e6SBarry Smith extern int MatGetColumnVector(Mat,Vec,int); 8864e87e97SBarry Smith extern int MatGetArray(Mat,Scalar **); 8909883261SBarry Smith extern int MatRestoreArray(Mat,Scalar **); 90870582ebSSatish Balay extern int MatGetBlockSize(Mat,int *); 917b80b807SBarry Smith 928ed539a5SBarry Smith extern int MatMult(Mat,Vec,Vec); 938ed539a5SBarry Smith extern int MatMultAdd(Mat,Vec,Vec,Vec); 948ed539a5SBarry Smith extern int MatMultTrans(Mat,Vec,Vec); 958ed539a5SBarry Smith extern int MatMultTransAdd(Mat,Vec,Vec,Vec); 962eac72dbSBarry Smith 972e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES, MAT_COPY_VALUES} MatDuplicateOption; 982e8a6d31SBarry Smith 997b80b807SBarry Smith extern int MatConvert(Mat,MatType,Mat*); 1002e8a6d31SBarry Smith extern int MatDuplicate(Mat,MatDuplicateOption,Mat*); 10194a9d846SBarry Smith extern int MatConvertRegister(MatType,MatType,int (*)(Mat,MatType,Mat*)); 102cf256101SBarry Smith extern int MatConvertRegisterAll(void); 10394a9d846SBarry Smith 104cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 105cb5b572fSBarry Smith 106cb5b572fSBarry Smith extern int MatCopy(Mat,Mat,MatStructure); 1077b80b807SBarry Smith extern int MatView(Mat,Viewer); 1087b80b807SBarry Smith extern int MatLoad(Viewer,MatType,Mat*); 10994a9d846SBarry Smith extern int MatLoadRegister(MatType,int (*)(Viewer,MatType,Mat*)); 110cf256101SBarry Smith extern int MatLoadRegisterAll(void); 1117b80b807SBarry Smith 112d4fbbf0eSBarry Smith extern int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 113d4fbbf0eSBarry Smith extern int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 114d4fbbf0eSBarry Smith extern int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 115d4fbbf0eSBarry Smith extern int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 116d4fbbf0eSBarry Smith 1171d607229SLois Curfman McInnes /* 1181d607229SLois Curfman McInnes Context of matrix information, used with MatGetInfo() 1191d607229SLois Curfman McInnes Note: If any entries are added to this context, be sure 12026cd32c0SSatish Balay to adjust MAT_INFO_SIZE in finclude/mat.h 1211d607229SLois Curfman McInnes */ 1224e220ebcSLois Curfman McInnes typedef struct { 12337f753daSBarry Smith PLogDouble rows_global, columns_global; /* number of global rows and columns */ 12437f753daSBarry Smith PLogDouble rows_local, columns_local; /* number of local rows and columns */ 12537f753daSBarry Smith PLogDouble block_size; /* block size */ 12637f753daSBarry Smith PLogDouble nz_allocated, nz_used, nz_unneeded; /* number of nonzeros */ 12737f753daSBarry Smith PLogDouble memory; /* memory allocated */ 12837f753daSBarry Smith PLogDouble assemblies; /* number of matrix assemblies */ 12937f753daSBarry Smith PLogDouble mallocs; /* number of mallocs during MatSetValues() */ 13037f753daSBarry Smith PLogDouble fill_ratio_given, fill_ratio_needed; /* fill ratio for LU/ILU */ 13137f753daSBarry Smith PLogDouble factor_mallocs; /* number of mallocs during factorization */ 1324e220ebcSLois Curfman McInnes } MatInfo; 1334e220ebcSLois Curfman McInnes 1347b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 1354e220ebcSLois Curfman McInnes extern int MatGetInfo(Mat,MatInfoType,MatInfo*); 13677c4ece6SBarry Smith extern int MatValid(Mat,PetscTruth*); 1377b80b807SBarry Smith extern int MatGetDiagonal(Mat,Vec); 138cd8486b4SBarry Smith extern int MatTranspose(Mat,Mat*); 1390513a670SBarry Smith extern int MatPermute(Mat,IS,IS,Mat *); 140f4c33d5aSBarry Smith extern int MatDiagonalScale(Mat,Vec,Vec); 1418b3e568eSBarry Smith extern int MatDiagonalShift(Mat,Vec); 14277c4ece6SBarry Smith extern int MatEqual(Mat,Mat, PetscTruth*); 1437b80b807SBarry Smith 1447b80b807SBarry Smith extern int MatNorm(Mat,NormType,double *); 1457b80b807SBarry Smith extern int MatZeroEntries(Mat); 1467b80b807SBarry Smith extern int MatZeroRows(Mat,IS,Scalar*); 1477b80b807SBarry Smith extern int MatZeroColumns(Mat,IS,Scalar*); 1487b80b807SBarry Smith 1495ef9f2a5SBarry Smith extern int MatUseScaledForm(Mat,PetscTruth); 1505ef9f2a5SBarry Smith extern int MatScaleSystem(Mat,Vec,Vec); 1515ef9f2a5SBarry Smith extern int MatUnScaleSystem(Mat,Vec,Vec); 1525ef9f2a5SBarry Smith 1537b80b807SBarry Smith extern int MatGetSize(Mat,int*,int*); 1547b80b807SBarry Smith extern int MatGetLocalSize(Mat,int*,int*); 1557b80b807SBarry Smith extern int MatGetOwnershipRange(Mat,int*,int*); 1567b80b807SBarry Smith 1577b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX, MAT_REUSE_MATRIX} MatReuse; 1587b2a1423SBarry Smith extern int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 159905e6a2fSBarry Smith extern int MatDestroyMatrices(int, Mat **); 1607b2a1423SBarry Smith extern int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 1618efafbd8SBarry Smith 1627b80b807SBarry Smith extern int MatIncreaseOverlap(Mat,int,IS *,int); 1637b80b807SBarry Smith 1647b80b807SBarry Smith extern int MatAXPY(Scalar *,Mat,Mat); 16586787d2cSSatish Balay extern int MatAYPX(Scalar *,Mat,Mat); 1667b80b807SBarry Smith extern int MatCompress(Mat); 1677b80b807SBarry Smith 168052efed2SBarry Smith extern int MatScale(Scalar *,Mat); 169052efed2SBarry Smith extern int MatShift(Scalar *,Mat); 170052efed2SBarry Smith 171d4bb536fSBarry Smith extern int MatSetLocalToGlobalMapping(Mat, ISLocalToGlobalMapping); 172d4bb536fSBarry Smith extern int MatSetLocalToGlobalMappingBlocked(Mat, ISLocalToGlobalMapping); 17390f02eecSBarry Smith extern int MatZeroRowsLocal(Mat,IS,Scalar*); 17490f02eecSBarry Smith extern int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 1754a387fc0SSatish Balay extern int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 17690f02eecSBarry Smith 177649db694SBarry Smith extern int MatSetStashInitialSize(Mat,int, int); 178649db694SBarry Smith 1797b80b807SBarry Smith /* Routines unique to particular data structures */ 1807b80b807SBarry Smith extern int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 1816f0482c6SBarry Smith extern int MatSeqAIJSetColumnIndices(Mat,int *); 1826f0482c6SBarry Smith extern int MatSeqBAIJSetColumnIndices(Mat,int *); 1837b80b807SBarry Smith 1842e8a6d31SBarry Smith extern int MatStoreValues(Mat); 1852e8a6d31SBarry Smith extern int MatRetrieveValues(Mat); 1862e8a6d31SBarry Smith 1877b80b807SBarry Smith /* 1887b80b807SBarry Smith These routines are not usually accessed directly, rather solving is 1897b80b807SBarry Smith done through the SLES, KSP and PC interfaces. 1907b80b807SBarry Smith */ 1917b80b807SBarry Smith 192b12f92e5SBarry Smith typedef char* MatOrderingType; 193b12f92e5SBarry Smith #define MATORDERING_NATURAL "natural" 194b12f92e5SBarry Smith #define MATORDERING_ND "nd" 195b12f92e5SBarry Smith #define MATORDERING_1WD "1wd" 196b12f92e5SBarry Smith #define MATORDERING_RCM "rcm" 197b12f92e5SBarry Smith #define MATORDERING_QMD "qmd" 198b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength" 199b12f92e5SBarry Smith 20091e9ee9fSBarry Smith extern int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 201b12f92e5SBarry Smith extern int MatOrderingRegister_Private(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 202b12f92e5SBarry Smith #if defined(USE_DYNAMIC_LIBRARIES) 203b12f92e5SBarry Smith #define MatOrderingRegister(a,b,c,d) MatOrderingRegister_Private(a,b,c,0) 204b12f92e5SBarry Smith #else 205b12f92e5SBarry Smith #define MatOrderingRegister(a,b,c,d) MatOrderingRegister_Private(a,b,c,d) 206b12f92e5SBarry Smith #endif 20791e9ee9fSBarry Smith extern int MatOrderingRegisterDestroy(void); 208b12f92e5SBarry Smith extern int MatOrderingRegisterAll(char*); 20991e9ee9fSBarry Smith extern int MatOrderingRegisterAllCalled; 210d4fbbf0eSBarry Smith 211a2ce50c7SBarry Smith extern int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 212a2ce50c7SBarry Smith 213a2ce50c7SBarry Smith extern int MatCholeskyFactor(Mat,IS,double); 214a2ce50c7SBarry Smith extern int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 215a2ce50c7SBarry Smith extern int MatCholeskyFactorNumeric(Mat,Mat*); 216a2ce50c7SBarry Smith 2175ef9f2a5SBarry Smith /* 2185ef9f2a5SBarry Smith Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic() 2195ef9f2a5SBarry Smith Note: If any entries are added to this context, be sure 2205ef9f2a5SBarry Smith to adjust MAT_ILUINFO_SIZE in finclude/mat.h 2215ef9f2a5SBarry Smith 2225ef9f2a5SBarry Smith Note: The integer values below are passed in double to allow easy use from 2235ef9f2a5SBarry Smith Fortran 2245ef9f2a5SBarry Smith */ 2255ef9f2a5SBarry Smith typedef struct { 2265ef9f2a5SBarry Smith double levels; /* ILU(levels) */ 2275ef9f2a5SBarry Smith double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 2285ef9f2a5SBarry Smith double diagonal_fill; /* force diagonal to fill in if initially not filled */ 2295ef9f2a5SBarry Smith } MatILUInfo; 2305ef9f2a5SBarry Smith 23149d8b64dSBarry Smith extern int MatLUFactor(Mat,IS,IS,double); 2325ef9f2a5SBarry Smith extern int MatILUFactor(Mat,IS,IS,MatILUInfo*); 23364051cb3SBarry Smith extern int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*); 2345ef9f2a5SBarry Smith extern int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 23564051cb3SBarry Smith extern int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 23620563c6bSBarry Smith extern int MatLUFactorNumeric(Mat,Mat*); 237a2ce50c7SBarry Smith extern int MatILUDTFactor(Mat,double,int,IS,IS,Mat *); 238a2ce50c7SBarry Smith 2398ed539a5SBarry Smith extern int MatSolve(Mat,Vec,Vec); 24022169318SLois Curfman McInnes extern int MatForwardSolve(Mat,Vec,Vec); 24122169318SLois Curfman McInnes extern int MatBackwardSolve(Mat,Vec,Vec); 2428ed539a5SBarry Smith extern int MatSolveAdd(Mat,Vec,Vec,Vec); 24328988994SBarry Smith extern int MatSolveTrans(Mat,Vec,Vec); 24428988994SBarry Smith extern int MatSolveTransAdd(Mat,Vec,Vec,Vec); 2458ed539a5SBarry Smith 246bb5a7306SBarry Smith extern int MatSetUnfactored(Mat); 247bb5a7306SBarry Smith 248bb1eb677SSatish Balay /* MatSORType may be bitwise ORd together, so do not change the numbers */ 249bb1eb677SSatish Balay 250ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 251ee50ffe9SBarry Smith SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 252ee50ffe9SBarry Smith SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 25384cb2905SBarry Smith SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 254ca9b4cbeSLois Curfman McInnes extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 2558ed539a5SBarry Smith 256d4fbbf0eSBarry Smith /* 257639f9d9dSBarry Smith These routines are for efficiently computing Jacobians via finite differences. 258639f9d9dSBarry Smith */ 259b12f92e5SBarry Smith 260b12f92e5SBarry Smith typedef char* MatColoringType; 261b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural" 262b12f92e5SBarry Smith #define MATCOLORING_SL "sl" 263b12f92e5SBarry Smith #define MATCOLORING_LF "lf" 264b12f92e5SBarry Smith #define MATCOLORING_ID "id" 265b12f92e5SBarry Smith 266df8cb225SBarry Smith extern int MatGetColoring(Mat,MatColoringType,ISColoring*); 267b12f92e5SBarry Smith extern int MatColoringRegister_Private(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 268b12f92e5SBarry Smith #if defined(USE_DYNAMIC_LIBRARIES) 269b12f92e5SBarry Smith #define MatColoringRegister(a,b,c,d) MatColoringRegister_Private(a,b,c,0) 270b12f92e5SBarry Smith #else 271b12f92e5SBarry Smith #define MatColoringRegister(a,b,c,d) MatColoringRegister_Private(a,b,c,d) 272b12f92e5SBarry Smith #endif 273b12f92e5SBarry Smith extern int MatColoringRegisterAll(char *); 27484cb2905SBarry Smith extern int MatColoringRegisterAllCalled; 275cf256101SBarry Smith extern int MatColoringRegisterDestroy(void); 276639f9d9dSBarry Smith extern int MatColoringPatch(Mat,int,int *,ISColoring*); 277639f9d9dSBarry Smith 27884cb2905SBarry Smith /* 27984cb2905SBarry Smith Data structures used to compute Jacobian vector products 28084cb2905SBarry Smith efficiently using finite differences. 28184cb2905SBarry Smith */ 282639f9d9dSBarry Smith #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 22 283639f9d9dSBarry Smith 284e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring; 285639f9d9dSBarry Smith 286639f9d9dSBarry Smith extern int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 287639f9d9dSBarry Smith extern int MatFDColoringDestroy(MatFDColoring); 288639f9d9dSBarry Smith extern int MatFDColoringView(MatFDColoring,Viewer); 2896eb013d7SBarry Smith extern int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 290639f9d9dSBarry Smith extern int MatFDColoringSetParameters(MatFDColoring,double,double); 291005c665bSBarry Smith extern int MatFDColoringSetFrequency(MatFDColoring,int); 2928bba8e72SBarry Smith extern int MatFDColoringGetFrequency(MatFDColoring,int*); 293639f9d9dSBarry Smith extern int MatFDColoringSetFromOptions(MatFDColoring); 294639f9d9dSBarry Smith extern int MatFDColoringPrintHelp(MatFDColoring); 295005c665bSBarry Smith extern int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 2966eb013d7SBarry Smith extern int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 297639f9d9dSBarry Smith 298639f9d9dSBarry Smith /* 2990752156aSBarry Smith These routines are for partitioning matrices: currently used only 3000752156aSBarry Smith for adjacency matrix, MatCreateSeqAdj() or MatCreateMPIAdj(). 3010752156aSBarry Smith */ 30291e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 303ca161407SBarry Smith 30491e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning; 3052aabb6bbSBarry Smith typedef char* MatPartitioningType; 3062aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT "current" 3072aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis" 308ca161407SBarry Smith 30991e9ee9fSBarry Smith extern int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 31091e9ee9fSBarry Smith extern int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 31191e9ee9fSBarry Smith extern int MatPartitioningSetAdjacency(MatPartitioning,Mat); 31291e9ee9fSBarry Smith extern int MatPartitioningSetVertexWeights(MatPartitioning,double*); 31391e9ee9fSBarry Smith extern int MatPartitioningApply(MatPartitioning,IS*); 31491e9ee9fSBarry Smith extern int MatPartitioningDestroy(MatPartitioning); 3152aabb6bbSBarry Smith 3162aabb6bbSBarry Smith extern int MatPartitioningRegister_Private(char*,char*,char*,int(*)(MatPartitioning)); 3172aabb6bbSBarry Smith #if defined(USE_DYNAMIC_LIBRARIES) 3182aabb6bbSBarry Smith #define MatPartitioningRegister(a,b,c,d) MatPartitioningRegister_Private(a,b,c,0) 3192aabb6bbSBarry Smith #else 3202aabb6bbSBarry Smith #define MatPartitioningRegister(a,b,c,d) MatPartitioningRegister_Private(a,b,c,d) 3212aabb6bbSBarry Smith #endif 3222aabb6bbSBarry Smith 3232aabb6bbSBarry Smith extern int MatPartitioningRegisterAll(char *); 324ebb8b11fSBarry Smith extern int MatPartitioningRegisterAllCalled; 32591e9ee9fSBarry Smith extern int MatPartitioningRegisterDestroy(void); 32691e9ee9fSBarry Smith extern int MatPartitioningView(MatPartitioning,Viewer); 32791e9ee9fSBarry Smith extern int MatPartitioningSetFromOptions(MatPartitioning); 32891e9ee9fSBarry Smith extern int MatPartitioningPrintHelp(MatPartitioning); 329e905bf0dSBarry Smith extern int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 330ca161407SBarry Smith 33191e9ee9fSBarry Smith extern int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 3320752156aSBarry Smith 3330752156aSBarry Smith /* 33426cd32c0SSatish Balay If you add entries here you must also add them to finclude/mat.h 335d4fbbf0eSBarry Smith */ 3361c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0, 3371c1c02c0SLois Curfman McInnes MATOP_GET_ROW=1, 3381c1c02c0SLois Curfman McInnes MATOP_RESTORE_ROW=2, 3391c1c02c0SLois Curfman McInnes MATOP_MULT=3, 3401c1c02c0SLois Curfman McInnes MATOP_MULT_ADD=4, 3411c1c02c0SLois Curfman McInnes MATOP_MULT_TRANS=5, 3421c1c02c0SLois Curfman McInnes MATOP_MULT_TRANS_ADD=6, 3431c1c02c0SLois Curfman McInnes MATOP_SOLVE=7, 3441c1c02c0SLois Curfman McInnes MATOP_SOLVE_ADD=8, 3451c1c02c0SLois Curfman McInnes MATOP_SOLVE_TRANS=9, 3461c1c02c0SLois Curfman McInnes MATOP_SOLVE_TRANS_ADD=10, 3471c1c02c0SLois Curfman McInnes MATOP_LUFACTOR=11, 3481c1c02c0SLois Curfman McInnes MATOP_CHOLESKYFACTOR=12, 3491c1c02c0SLois Curfman McInnes MATOP_RELAX=13, 3501c1c02c0SLois Curfman McInnes MATOP_TRANSPOSE=14, 3511c1c02c0SLois Curfman McInnes MATOP_GETINFO=15, 3521c1c02c0SLois Curfman McInnes MATOP_EQUAL=16, 3531c1c02c0SLois Curfman McInnes MATOP_GET_DIAGONAL=17, 3541c1c02c0SLois Curfman McInnes MATOP_DIAGONAL_SCALE=18, 3551c1c02c0SLois Curfman McInnes MATOP_NORM=19, 3561c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_BEGIN=20, 3571c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_END=21, 3581c1c02c0SLois Curfman McInnes MATOP_COMPRESS=22, 3591c1c02c0SLois Curfman McInnes MATOP_SET_OPTION=23, 3601c1c02c0SLois Curfman McInnes MATOP_ZERO_ENTRIES=24, 3611c1c02c0SLois Curfman McInnes MATOP_ZERO_ROWS=25, 3621c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_SYMBOLIC=26, 3631c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_NUMERIC=27, 3641c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 3651c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_NUMERIC=29, 3661c1c02c0SLois Curfman McInnes MATOP_GET_SIZE=30, 3671c1c02c0SLois Curfman McInnes MATOP_GET_LOCAL_SIZE=31, 3681c1c02c0SLois Curfman McInnes MATOP_GET_OWNERSHIP_RANGE=32, 3691c1c02c0SLois Curfman McInnes MATOP_ILUFACTOR_SYMBOLIC=33, 3701c1c02c0SLois Curfman McInnes MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 3711c1c02c0SLois Curfman McInnes MATOP_GET_ARRAY=35, 3721c1c02c0SLois Curfman McInnes MATOP_RESTORE_ARRAY=36, 3737bf97ca4SSatish Balay 374005c665bSBarry Smith MATOP_CONVERT_SAME_TYPE=37, 375005c665bSBarry Smith MATOP_FORWARD_SOLVE=38, 376005c665bSBarry Smith MATOP_BACKWARD_SOLVE=39, 377005c665bSBarry Smith MATOP_ILUFACTOR=40, 378005c665bSBarry Smith MATOP_INCOMPLETECHOLESKYFACTOR=41, 379005c665bSBarry Smith MATOP_AXPY=42, 380005c665bSBarry Smith MATOP_GET_SUBMATRICES=43, 381005c665bSBarry Smith MATOP_INCREASE_OVERLAP=44, 382005c665bSBarry Smith MATOP_GET_VALUES=45, 383005c665bSBarry Smith MATOP_COPY=46, 384005c665bSBarry Smith MATOP_PRINT_HELP=47, 385005c665bSBarry Smith MATOP_SCALE=48, 386005c665bSBarry Smith MATOP_SHIFT=49, 387005c665bSBarry Smith MATOP_DIAGONAL_SHIFT=50, 388005c665bSBarry Smith MATOP_ILUDT_FACTOR=51, 389005c665bSBarry Smith MATOP_GET_BLOCK_SIZE=52, 390005c665bSBarry Smith MATOP_GET_ROW_IJ=53, 391005c665bSBarry Smith MATOP_RESTORE_ROW_IJ=54, 392005c665bSBarry Smith MATOP_GET_COLUMN_IJ=55, 393005c665bSBarry Smith MATOP_RESTORE_COLUMN_IJ=56, 394005c665bSBarry Smith MATOP_FDCOLORING_CREATE=57, 395005c665bSBarry Smith MATOP_COLORING_PATCH=58, 396005c665bSBarry Smith MATOP_SET_UNFACTORED=59, 397005c665bSBarry Smith MATOP_PERMUTE=60, 398005c665bSBarry Smith MATOP_SET_VALUES_BLOCKED=61, 3991c1c02c0SLois Curfman McInnes MATOP_DESTROY=250, 4001c1c02c0SLois Curfman McInnes MATOP_VIEW=251 401fae171e0SBarry Smith } MatOperation; 402112a2221SBarry Smith extern int MatHasOperation(Mat,MatOperation,PetscTruth*); 403fae171e0SBarry Smith extern int MatShellSetOperation(Mat,MatOperation,void *); 404d4bb536fSBarry Smith extern int MatShellGetOperation(Mat,MatOperation,void **); 405112a2221SBarry Smith 40690ace30eSBarry Smith /* 40790ace30eSBarry Smith Codes for matrices stored on disk. By default they are 40890ace30eSBarry Smith stored in a universal format. By changing the format with 409639f9d9dSBarry Smith ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 41090ace30eSBarry Smith be stored in a way natural for the matrix, for example dense matrices 41190ace30eSBarry Smith would be stored as dense. Matrices stored this way may only be 41290ace30eSBarry Smith read into matrices of the same time. 41390ace30eSBarry Smith */ 41490ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1 41590ace30eSBarry Smith 4163f1d51d7SBarry Smith /* 4173f1d51d7SBarry Smith New matrix classes not yet distributed 4183f1d51d7SBarry Smith */ 4193f1d51d7SBarry Smith /* 4203f1d51d7SBarry Smith MatAIJIndices is a data structure for storing the nonzero location information 4213f1d51d7SBarry Smith for sparse matrices. Several matrices with identical nonzero structure can share 4223f1d51d7SBarry Smith the same MatAIJIndices. 4233f1d51d7SBarry Smith */ 424e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices; 4253f1d51d7SBarry Smith 4263f1d51d7SBarry Smith extern int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 4273f1d51d7SBarry Smith extern int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 4283f1d51d7SBarry Smith extern int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 4293f1d51d7SBarry Smith extern int MatDestroyAIJIndices(MatAIJIndices); 4303f1d51d7SBarry Smith extern int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 4313f1d51d7SBarry Smith extern int MatValidateAIJIndices(int,MatAIJIndices); 4323f1d51d7SBarry Smith extern int MatShiftAIJIndices(MatAIJIndices); 4333f1d51d7SBarry Smith extern int MatShrinkAIJIndices(MatAIJIndices); 4343f1d51d7SBarry Smith extern int MatTransposeAIJIndices(MatAIJIndices, MatAIJIndices*); 4353f1d51d7SBarry Smith 4363f1d51d7SBarry Smith extern int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 4373f1d51d7SBarry Smith extern int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 4383f1d51d7SBarry Smith extern int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 4393f1d51d7SBarry Smith 4403f1d51d7SBarry Smith extern int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 4413f1d51d7SBarry Smith extern int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 4423f1d51d7SBarry Smith extern int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 4433f1d51d7SBarry Smith 444aa6d738dSSatish Balay extern int MatMPIBAIJSetHashTableFactor(Mat,double); 4452e8a6d31SBarry Smith extern int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 446860d1616SSatish Balay 4473f1d51d7SBarry Smith 4482eac72dbSBarry Smith #endif 4492eac72dbSBarry Smith 4502eac72dbSBarry Smith 4519d00d63dSBarry Smith 452