1*c4f061fbSSatish Balay /* $Id: petscmat.h,v 1.198 2000/06/01 22:26:28 bsmith Exp bsmith $ */ 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 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, 253eda8832SBarry Smith MATMPIBAIJ, MATMPICSN, MATSEQCSN, MATMPIADJ, MATSEQSBAIJ, 268a3eeb68SSatish Balay MATMPISBAIJ, MATLASTTYPE } MatType; 2728988994SBarry Smith 28ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 29ca44d042SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*); 30ca44d042SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*); 31ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 32ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 33*c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 34ca44d042SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*); 35ca44d042SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*); 36ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 37ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 38ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 39ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 40ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 418a3eeb68SSatish Balay 429717bf64SBarry Smith 43ca44d042SBarry Smith EXTERN int MatDestroy(Mat); 447b80b807SBarry Smith 45ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 46ca44d042SBarry Smith EXTERN int MatShellGetContext(Mat,void **); 4721c89e3eSBarry Smith 48ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat); 49ca44d042SBarry Smith EXTERN int MatGetMaps(Mat,Map*,Map*); 50ec0117caSBarry Smith 518ed539a5SBarry Smith /* ------------------------------------------------------------*/ 52ca44d042SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode); 53ca44d042SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode); 5484cb2905SBarry Smith 556d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 56ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 57ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 58ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*); 594f9c727eSBarry Smith 60b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \ 61b951964fSBarry Smith {int _ierr,_row = i,_col = j; Scalar _va = va; \ 62b951964fSBarry Smith _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 63b951964fSBarry Smith } 64ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \ 65ea06a074SBarry Smith {int _ierr,_row = i,_col = j; \ 66ea06a074SBarry Smith _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 67ea06a074SBarry Smith } 686ca9ecd3SBarry Smith /* 690a835dfdSSatish Balay Any additions/changes here MUST also be made in include/finclude/petscmat.h 706ca9ecd3SBarry Smith */ 716d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 726d4a8577SBarry Smith MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 736d4a8577SBarry Smith MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 746ca9ecd3SBarry Smith MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 756ca9ecd3SBarry Smith MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 766ca9ecd3SBarry Smith MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 776ca9ecd3SBarry Smith MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 784787f768SSatish Balay MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 797c922b88SBarry Smith MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 802bad1931SBarry Smith MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 81f9d29acdSSatish Balay MAT_DO_NOT_USE_INODES=82} MatOption; 82ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption); 83ca44d042SBarry Smith EXTERN int MatGetType(Mat,MatType*,char**); 84ca44d042SBarry Smith EXTERN int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,PetscTruth*); 8584cb2905SBarry Smith 86ca44d042SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*); 87ca44d042SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**); 88ca44d042SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**); 89ca44d042SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**); 90ca44d042SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**); 91ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int); 92ca44d042SBarry Smith EXTERN int MatGetArray(Mat,Scalar **); 93ca44d042SBarry Smith EXTERN int MatRestoreArray(Mat,Scalar **); 94ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *); 957b80b807SBarry Smith 96ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec); 97ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 98ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec); 99ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 1002eac72dbSBarry Smith 1012e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 1022e8a6d31SBarry Smith 103ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*); 104ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 105ca44d042SBarry Smith EXTERN int MatConvertRegister(MatType,MatType,int (*)(Mat,MatType,Mat*)); 106ca44d042SBarry Smith EXTERN int MatConvertRegisterAll(void); 10794a9d846SBarry Smith 108cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 109cb5b572fSBarry Smith 110ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure); 111ca44d042SBarry Smith EXTERN int MatView(Mat,Viewer); 112ca44d042SBarry Smith EXTERN int MatLoad(Viewer,MatType,Mat*); 113ca44d042SBarry Smith EXTERN int MatLoadRegister(MatType,int (*)(Viewer,MatType,Mat*)); 114ca44d042SBarry Smith EXTERN int MatLoadRegisterAll(void); 1157b80b807SBarry Smith 116ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 117ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 118ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 119ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 120d4fbbf0eSBarry Smith 1211d607229SLois Curfman McInnes /* 1221d607229SLois Curfman McInnes Context of matrix information, used with MatGetInfo() 1231d607229SLois Curfman McInnes Note: If any entries are added to this context, be sure 1240a835dfdSSatish Balay to adjust MAT_INFO_SIZE in finclude/petscmat.h 1251d607229SLois Curfman McInnes */ 1264e220ebcSLois Curfman McInnes typedef struct { 12737f753daSBarry Smith PLogDouble rows_global,columns_global; /* number of global rows and columns */ 12837f753daSBarry Smith PLogDouble rows_local,columns_local; /* number of local rows and columns */ 12937f753daSBarry Smith PLogDouble block_size; /* block size */ 13037f753daSBarry Smith PLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 13137f753daSBarry Smith PLogDouble memory; /* memory allocated */ 13237f753daSBarry Smith PLogDouble assemblies; /* number of matrix assemblies */ 13337f753daSBarry Smith PLogDouble mallocs; /* number of mallocs during MatSetValues() */ 13437f753daSBarry Smith PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 13537f753daSBarry Smith PLogDouble factor_mallocs; /* number of mallocs during factorization */ 1364e220ebcSLois Curfman McInnes } MatInfo; 1374e220ebcSLois Curfman McInnes 1387b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 139ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 140ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*); 141ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec); 142ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*); 143ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *); 144ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec); 14506ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 146ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*); 1477b80b807SBarry Smith 148ca44d042SBarry Smith EXTERN int MatNorm(Mat,NormType,double *); 149ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat); 150ca44d042SBarry Smith EXTERN int MatZeroRows(Mat,IS,Scalar*); 151ca44d042SBarry Smith EXTERN int MatZeroColumns(Mat,IS,Scalar*); 1527b80b807SBarry Smith 153ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth); 154ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec); 155ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 1565ef9f2a5SBarry Smith 157ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*); 158ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*); 159ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*); 1607b80b807SBarry Smith 1617b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 162ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 163ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **); 164ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 1658efafbd8SBarry Smith 166ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 1677b80b807SBarry Smith 168ca44d042SBarry Smith EXTERN int MatAXPY(Scalar *,Mat,Mat); 169ca44d042SBarry Smith EXTERN int MatAYPX(Scalar *,Mat,Mat); 170ca44d042SBarry Smith EXTERN int MatCompress(Mat); 1717b80b807SBarry Smith 172ca44d042SBarry Smith EXTERN int MatScale(Scalar *,Mat); 173ca44d042SBarry Smith EXTERN int MatShift(Scalar *,Mat); 174052efed2SBarry Smith 175ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 176ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 177ca44d042SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*); 178ca44d042SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 179ca44d042SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 18090f02eecSBarry Smith 181ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int); 182649db694SBarry Smith 183ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 184ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec); 185ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec); 1867c922b88SBarry Smith 1877c922b88SBarry Smith /* 188*c4f061fbSSatish Balay These three (or four) macros MUST be used together. The third one closes the open { of the first one 1897c922b88SBarry Smith */ 190*c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 1917c922b88SBarry Smith { \ 1927c922b88SBarry Smith int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 1937c922b88SBarry Smith dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);onz = dnz + __tmp;\ 1947c922b88SBarry Smith __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\ 1957c922b88SBarry Smith __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\ 1967c922b88SBarry Smith __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp; 1977c922b88SBarry Smith 198*c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 199*c4f061fbSSatish Balay {\ 200*c4f061fbSSatish Balay int __l;\ 201*c4f061fbSSatish Balay __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\ 202*c4f061fbSSatish Balay __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\ 203*c4f061fbSSatish Balay for (__l=0;__l<nrows;__l++) {\ 204*c4f061fbSSatish Balay __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\ 205*c4f061fbSSatish Balay }\ 206*c4f061fbSSatish Balay } 207*c4f061fbSSatish Balay 208*c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 2097c922b88SBarry Smith { int __i; \ 2107c922b88SBarry Smith for (__i=0; __i<nc; __i++) {\ 2117c922b88SBarry Smith if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 2127c922b88SBarry Smith }\ 2137c922b88SBarry Smith dnz[row - __rstart] = nc - onz[row - __rstart];\ 2147c922b88SBarry Smith } 2157c922b88SBarry Smith 216*c4f061fbSSatish Balay #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);} 2177c922b88SBarry Smith 2187b80b807SBarry Smith /* Routines unique to particular data structures */ 219ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 220ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 221ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 222ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*); 2237b80b807SBarry Smith 224ca44d042SBarry Smith EXTERN int MatStoreValues(Mat); 225ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat); 2262e8a6d31SBarry Smith 2277b80b807SBarry Smith /* 2287b80b807SBarry Smith These routines are not usually accessed directly, rather solving is 2297b80b807SBarry Smith done through the SLES, KSP and PC interfaces. 2307b80b807SBarry Smith */ 2317b80b807SBarry Smith 232b12f92e5SBarry Smith typedef char* MatOrderingType; 233b12f92e5SBarry Smith #define MATORDERING_NATURAL "natural" 234b12f92e5SBarry Smith #define MATORDERING_ND "nd" 235b12f92e5SBarry Smith #define MATORDERING_1WD "1wd" 236b12f92e5SBarry Smith #define MATORDERING_RCM "rcm" 237b12f92e5SBarry Smith #define MATORDERING_QMD "qmd" 238b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength" 239b12f92e5SBarry Smith 240ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 241ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 242aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 243f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 244b12f92e5SBarry Smith #else 245f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 246b12f92e5SBarry Smith #endif 247ca44d042SBarry Smith EXTERN int MatOrderingRegisterDestroy(void); 248ca44d042SBarry Smith EXTERN int MatOrderingRegisterAll(char*); 2492bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled; 250d4fbbf0eSBarry Smith 251ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 252a2ce50c7SBarry Smith 253ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double); 254ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 255ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 256a2ce50c7SBarry Smith 2575ef9f2a5SBarry Smith /* 2585ef9f2a5SBarry Smith Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic() 25914822f30SBarry Smith of MatLUFactor() and MatLUFactorSymbolic() 2605ef9f2a5SBarry Smith 26114822f30SBarry Smith Note: If any entries are added to this context, be sure 26214822f30SBarry Smith to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h and/or 26314822f30SBarry Smith to adjust MAT_LUINFO_SIZE in finclude/petscmat.h 26414822f30SBarry Smith 26514822f30SBarry Smith Note: The integer values below are passed in double to allow easy use from Fortran 2665ef9f2a5SBarry Smith */ 2675ef9f2a5SBarry Smith typedef struct { 2685ef9f2a5SBarry Smith double levels; /* ILU(levels) */ 2695ef9f2a5SBarry Smith double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 2705ef9f2a5SBarry Smith double diagonal_fill; /* force diagonal to fill in if initially not filled */ 27136db0b34SBarry Smith 27236db0b34SBarry Smith double dt; /* drop tolerance */ 27336db0b34SBarry Smith double dtcol; /* tolerance for pivoting */ 27436db0b34SBarry Smith double dtcount; /* maximum nonzeros to be allowed per row */ 275*c4f061fbSSatish Balay PetscTruth damp; /* if factorization fails, damp until successful */ 276*c4f061fbSSatish Balay double damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */ 2775ef9f2a5SBarry Smith } MatILUInfo; 2785ef9f2a5SBarry Smith 27914822f30SBarry Smith typedef struct { 28014822f30SBarry Smith double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 28114822f30SBarry Smith double dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 282*c4f061fbSSatish Balay PetscTruth damp; /* if factorization fails, damp until successful */ 283*c4f061fbSSatish Balay double damping; /* damping factor - i.e. scaling of identity added to matrix to prevent zero pivots */ 28414822f30SBarry Smith } MatLUInfo; 28514822f30SBarry Smith 28614822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 287ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 28814822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 289ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 290ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 291ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*); 292ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 293a2ce50c7SBarry Smith 294ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec); 295ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec); 296ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec); 297ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 298ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec); 299ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 3008ed539a5SBarry Smith 301ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat); 302bb5a7306SBarry Smith 303bb1eb677SSatish Balay /* MatSORType may be bitwise ORd together, so do not change the numbers */ 304bb1eb677SSatish Balay 305ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 306ee50ffe9SBarry Smith SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 307ee50ffe9SBarry Smith SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 30884cb2905SBarry Smith SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 309ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 3108ed539a5SBarry Smith 311d4fbbf0eSBarry Smith /* 312639f9d9dSBarry Smith These routines are for efficiently computing Jacobians via finite differences. 313639f9d9dSBarry Smith */ 314b12f92e5SBarry Smith 315b12f92e5SBarry Smith typedef char* MatColoringType; 316b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural" 317b12f92e5SBarry Smith #define MATCOLORING_SL "sl" 318b12f92e5SBarry Smith #define MATCOLORING_LF "lf" 319b12f92e5SBarry Smith #define MATCOLORING_ID "id" 320b12f92e5SBarry Smith 321ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 322ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 323aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 324f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 325b12f92e5SBarry Smith #else 326f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 327b12f92e5SBarry Smith #endif 328ca44d042SBarry Smith EXTERN int MatColoringRegisterAll(char *); 3292bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled; 330ca44d042SBarry Smith EXTERN int MatColoringRegisterDestroy(void); 331ca44d042SBarry Smith EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 332639f9d9dSBarry Smith 33384cb2905SBarry Smith /* 33484cb2905SBarry Smith Data structures used to compute Jacobian vector products 33584cb2905SBarry Smith efficiently using finite differences. 33684cb2905SBarry Smith */ 3371a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 338639f9d9dSBarry Smith 339e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring; 340639f9d9dSBarry Smith 341ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 342ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring); 343ca44d042SBarry Smith EXTERN int MatFDColoringView(MatFDColoring,Viewer); 344ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 345ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 346ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 347ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 348ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 349ca44d042SBarry Smith EXTERN int MatFDColoringPrintHelp(MatFDColoring); 350ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 351ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 352639f9d9dSBarry Smith 353639f9d9dSBarry Smith /* 3540752156aSBarry Smith These routines are for partitioning matrices: currently used only 3553eda8832SBarry Smith for adjacency matrix, MatCreateMPIAdj(). 3560752156aSBarry Smith */ 35791e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 358ca161407SBarry Smith 35991e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning; 3602aabb6bbSBarry Smith typedef char* MatPartitioningType; 3612aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT "current" 3622aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis" 363ca161407SBarry Smith 364ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 365ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 366ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 367ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 368ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*); 369ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning); 3702aabb6bbSBarry Smith 371ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 372aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 373f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 3742aabb6bbSBarry Smith #else 375f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 3762aabb6bbSBarry Smith #endif 3772aabb6bbSBarry Smith 378ca44d042SBarry Smith EXTERN int MatPartitioningRegisterAll(char *); 3792bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled; 380ca44d042SBarry Smith EXTERN int MatPartitioningRegisterDestroy(void); 3812bad1931SBarry Smith 382ca44d042SBarry Smith EXTERN int MatPartitioningView(MatPartitioning,Viewer); 383ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 384ca44d042SBarry Smith EXTERN int MatPartitioningPrintHelp(MatPartitioning); 385ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 386ca161407SBarry Smith 387ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 3880752156aSBarry Smith 3890752156aSBarry Smith /* 3900a835dfdSSatish Balay If you add entries here you must also add them to finclude/petscmat.h 391d4fbbf0eSBarry Smith */ 3921c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0, 3931c1c02c0SLois Curfman McInnes MATOP_GET_ROW=1, 3941c1c02c0SLois Curfman McInnes MATOP_RESTORE_ROW=2, 3951c1c02c0SLois Curfman McInnes MATOP_MULT=3, 3961c1c02c0SLois Curfman McInnes MATOP_MULT_ADD=4, 3977c922b88SBarry Smith MATOP_MULT_TRANSPOSE=5, 3987c922b88SBarry Smith MATOP_MULT_TRANSPOSE_ADD=6, 3991c1c02c0SLois Curfman McInnes MATOP_SOLVE=7, 4001c1c02c0SLois Curfman McInnes MATOP_SOLVE_ADD=8, 4017c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE=9, 4027c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE_ADD=10, 4031c1c02c0SLois Curfman McInnes MATOP_LUFACTOR=11, 4041c1c02c0SLois Curfman McInnes MATOP_CHOLESKYFACTOR=12, 4051c1c02c0SLois Curfman McInnes MATOP_RELAX=13, 4061c1c02c0SLois Curfman McInnes MATOP_TRANSPOSE=14, 4071c1c02c0SLois Curfman McInnes MATOP_GETINFO=15, 4081c1c02c0SLois Curfman McInnes MATOP_EQUAL=16, 4091c1c02c0SLois Curfman McInnes MATOP_GET_DIAGONAL=17, 4101c1c02c0SLois Curfman McInnes MATOP_DIAGONAL_SCALE=18, 4111c1c02c0SLois Curfman McInnes MATOP_NORM=19, 4121c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_BEGIN=20, 4131c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_END=21, 4141c1c02c0SLois Curfman McInnes MATOP_COMPRESS=22, 4151c1c02c0SLois Curfman McInnes MATOP_SET_OPTION=23, 4161c1c02c0SLois Curfman McInnes MATOP_ZERO_ENTRIES=24, 4171c1c02c0SLois Curfman McInnes MATOP_ZERO_ROWS=25, 4181c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_SYMBOLIC=26, 4191c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_NUMERIC=27, 4201c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 4211c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_NUMERIC=29, 4221c1c02c0SLois Curfman McInnes MATOP_GET_SIZE=30, 4231c1c02c0SLois Curfman McInnes MATOP_GET_LOCAL_SIZE=31, 4241c1c02c0SLois Curfman McInnes MATOP_GET_OWNERSHIP_RANGE=32, 4251c1c02c0SLois Curfman McInnes MATOP_ILUFACTOR_SYMBOLIC=33, 4261c1c02c0SLois Curfman McInnes MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 4271c1c02c0SLois Curfman McInnes MATOP_GET_ARRAY=35, 4281c1c02c0SLois Curfman McInnes MATOP_RESTORE_ARRAY=36, 4297bf97ca4SSatish Balay 430005c665bSBarry Smith MATOP_CONVERT_SAME_TYPE=37, 431005c665bSBarry Smith MATOP_FORWARD_SOLVE=38, 432005c665bSBarry Smith MATOP_BACKWARD_SOLVE=39, 433005c665bSBarry Smith MATOP_ILUFACTOR=40, 434005c665bSBarry Smith MATOP_INCOMPLETECHOLESKYFACTOR=41, 435005c665bSBarry Smith MATOP_AXPY=42, 436005c665bSBarry Smith MATOP_GET_SUBMATRICES=43, 437005c665bSBarry Smith MATOP_INCREASE_OVERLAP=44, 438005c665bSBarry Smith MATOP_GET_VALUES=45, 439005c665bSBarry Smith MATOP_COPY=46, 440005c665bSBarry Smith MATOP_PRINT_HELP=47, 441005c665bSBarry Smith MATOP_SCALE=48, 442005c665bSBarry Smith MATOP_SHIFT=49, 443005c665bSBarry Smith MATOP_DIAGONAL_SHIFT=50, 444005c665bSBarry Smith MATOP_ILUDT_FACTOR=51, 445005c665bSBarry Smith MATOP_GET_BLOCK_SIZE=52, 446005c665bSBarry Smith MATOP_GET_ROW_IJ=53, 447005c665bSBarry Smith MATOP_RESTORE_ROW_IJ=54, 448005c665bSBarry Smith MATOP_GET_COLUMN_IJ=55, 449005c665bSBarry Smith MATOP_RESTORE_COLUMN_IJ=56, 450005c665bSBarry Smith MATOP_FDCOLORING_CREATE=57, 451005c665bSBarry Smith MATOP_COLORING_PATCH=58, 452005c665bSBarry Smith MATOP_SET_UNFACTORED=59, 453005c665bSBarry Smith MATOP_PERMUTE=60, 454005c665bSBarry Smith MATOP_SET_VALUES_BLOCKED=61, 4551c1c02c0SLois Curfman McInnes MATOP_DESTROY=250, 4561c1c02c0SLois Curfman McInnes MATOP_VIEW=251 457fae171e0SBarry Smith } MatOperation; 458ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 459ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 460ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 461112a2221SBarry Smith 46290ace30eSBarry Smith /* 46390ace30eSBarry Smith Codes for matrices stored on disk. By default they are 46490ace30eSBarry Smith stored in a universal format. By changing the format with 465639f9d9dSBarry Smith ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 46690ace30eSBarry Smith be stored in a way natural for the matrix, for example dense matrices 46790ace30eSBarry Smith would be stored as dense. Matrices stored this way may only be 46890ace30eSBarry Smith read into matrices of the same time. 46990ace30eSBarry Smith */ 47090ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1 47190ace30eSBarry Smith 4723f1d51d7SBarry Smith /* 4733f1d51d7SBarry Smith New matrix classes not yet distributed 4743f1d51d7SBarry Smith */ 4753f1d51d7SBarry Smith /* 4763f1d51d7SBarry Smith MatAIJIndices is a data structure for storing the nonzero location information 4773f1d51d7SBarry Smith for sparse matrices. Several matrices with identical nonzero structure can share 4783f1d51d7SBarry Smith the same MatAIJIndices. 4793f1d51d7SBarry Smith */ 480e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices; 4813f1d51d7SBarry Smith 482ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 483ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 484ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 485ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices); 486ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 487ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 488ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices); 489ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices); 490ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 4913f1d51d7SBarry Smith 492ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 493ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 494ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 4953f1d51d7SBarry Smith 496ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 497ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 498ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 4993f1d51d7SBarry Smith 500ca44d042SBarry Smith EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double); 501ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 50208918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 503860d1616SSatish Balay 504f069c275SSatish Balay typedef char* MATType; 505f069c275SSatish Balay EXTERN int MATCreate(MPI_Comm,int,int,int,int,Mat*); 506f069c275SSatish Balay EXTERN int MatSetType(Mat,MATType); 507f069c275SSatish Balay EXTERN int MatRegisterAll(char*); 508f069c275SSatish Balay EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 509f069c275SSatish Balay #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 510f069c275SSatish Balay #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 511f069c275SSatish Balay #else 512f069c275SSatish Balay #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 513f069c275SSatish Balay #endif 5143f1d51d7SBarry Smith 515f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*); 516*c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*); 517*c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*); 518*c4f061fbSSatish Balay 51992759ec0SBarry Smith EXTERN int MatSetTypeFromOptions(Mat); 520f069c275SSatish Balay 521*c4f061fbSSatish Balay #define MATSEQMAIJ "seqmaij" 522*c4f061fbSSatish Balay #define MATMPIMAIJ "mpimaij" 523*c4f061fbSSatish Balay #define MATNN "nn" 5242eac72dbSBarry Smith #endif 5252eac72dbSBarry Smith 5262eac72dbSBarry Smith 5279d00d63dSBarry Smith 528