1*435da068SBarry Smith /* $Id: petscmat.h,v 1.214 2001/01/20 23:57:52 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 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" 48273d9f13SBarry Smith typedef char* MatType; 49d91e6319SBarry Smith 50273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 51273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType); 52273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat); 53273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat); 54273d9f13SBarry Smith EXTERN int MatRegisterAll(char*); 55273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 56273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 57273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 58273d9f13SBarry Smith #else 59273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 60273d9f13SBarry Smith #endif 61273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled; 62b0a32e0cSBarry Smith extern PetscFList MatList; 6328988994SBarry Smith 64ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 65ca44d042SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*); 66ca44d042SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*); 67ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 68ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 69c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 70ca44d042SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*); 71ca44d042SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*); 72ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 73ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 74ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 75ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 76ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 77ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 78*435da068SBarry Smith EXTERN int MatDestroy(Mat); 7921c89e3eSBarry Smith 80ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat); 81ca44d042SBarry Smith EXTERN int MatGetMaps(Mat,Map*,Map*); 82ec0117caSBarry Smith 838ed539a5SBarry Smith /* ------------------------------------------------------------*/ 84ca44d042SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode); 85ca44d042SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode); 8684cb2905SBarry Smith 87*435da068SBarry Smith typedef struct { 88*435da068SBarry Smith int k,j,i,c; 89*435da068SBarry Smith } MatStencil; 90*435da068SBarry Smith EXTERN int MatSetValuesStencil(Mat,int,MatStencil*,int,MatStencil*,Scalar*,InsertMode); 91*435da068SBarry Smith EXTERN int MatSetValuesBlockedStencil(Mat,int,MatStencil*,int,MatStencil*,Scalar*,InsertMode); 92*435da068SBarry Smith EXTERN int MatSetStencil(Mat,int,int*,int*,int); 93*435da068SBarry Smith 94d91e6319SBarry Smith /*E 95d91e6319SBarry Smith MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 96d91e6319SBarry Smith to continue to add values to it 97d91e6319SBarry Smith 98d91e6319SBarry Smith Level: beginner 99d91e6319SBarry Smith 100d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd() 101d91e6319SBarry Smith E*/ 1026d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 103ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 104ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 105ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*); 1064f9c727eSBarry Smith 107b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \ 108d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \ 109b951964fSBarry Smith _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 110b951964fSBarry Smith } 111ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \ 112d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \ 113ea06a074SBarry Smith _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 114ea06a074SBarry Smith } 115d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \ 116d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \ 117d91e6319SBarry Smith _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 118d91e6319SBarry Smith } 119d91e6319SBarry Smith /*E 120d91e6319SBarry Smith MatOption - Options that may be set for a matrix and its behavior or storage 121d91e6319SBarry Smith 122d91e6319SBarry Smith Level: beginner 123d91e6319SBarry Smith 1240a835dfdSSatish Balay Any additions/changes here MUST also be made in include/finclude/petscmat.h 125d91e6319SBarry Smith 126d91e6319SBarry Smith .seealso: MatSetOption() 127d91e6319SBarry Smith E*/ 1286d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 1296d4a8577SBarry Smith MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 1306d4a8577SBarry Smith MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 1316ca9ecd3SBarry Smith MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 1326ca9ecd3SBarry Smith MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 1336ca9ecd3SBarry Smith MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 1346ca9ecd3SBarry Smith MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 1354787f768SSatish Balay MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 1367c922b88SBarry Smith MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 1372bad1931SBarry Smith MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 138f9d29acdSSatish Balay MAT_DO_NOT_USE_INODES=82} MatOption; 139ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption); 140273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*); 14184cb2905SBarry Smith 142ca44d042SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*); 143ca44d042SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**); 144ca44d042SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**); 145ca44d042SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**); 146ca44d042SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**); 147ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int); 148ca44d042SBarry Smith EXTERN int MatGetArray(Mat,Scalar **); 149ca44d042SBarry Smith EXTERN int MatRestoreArray(Mat,Scalar **); 150ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *); 1517b80b807SBarry Smith 152ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec); 153ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 154ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec); 155ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 1562eac72dbSBarry Smith 157d91e6319SBarry Smith /*E 158d91e6319SBarry Smith MatDuplicateOption - Indicates if a duplicated sparse matrix should have 159d91e6319SBarry Smith its numerical values copied over or just its nonzero structure. 160d91e6319SBarry Smith 161d91e6319SBarry Smith Level: beginner 162d91e6319SBarry Smith 163d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 164d91e6319SBarry Smith 165d91e6319SBarry Smith .seealso: MatDuplicate() 166d91e6319SBarry Smith E*/ 1672e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 1682e8a6d31SBarry Smith 169273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 170273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 171273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 172273d9f13SBarry Smith #else 173273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 174273d9f13SBarry Smith #endif 175273d9f13SBarry Smith EXTERN int MatConvertRegisterAll(char*); 176273d9f13SBarry Smith EXTERN int MatConvertRegisterDestroy(void); 177273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled; 178b0a32e0cSBarry Smith extern PetscFList MatConvertList; 179ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*); 180ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 18194a9d846SBarry Smith 182d91e6319SBarry Smith /*E 183d91e6319SBarry Smith MatStructure - Indicates if the matrix has the same nonzero structure 184d91e6319SBarry Smith 185d91e6319SBarry Smith Level: beginner 186d91e6319SBarry Smith 187d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 188d91e6319SBarry Smith 189d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 190d91e6319SBarry Smith E*/ 191cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 192cb5b572fSBarry Smith 193ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure); 194b0a32e0cSBarry Smith EXTERN int MatView(Mat,PetscViewer); 195273d9f13SBarry Smith 196b0a32e0cSBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(PetscViewer,MatType,Mat*)); 197273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 198273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 199273d9f13SBarry Smith #else 200273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 201273d9f13SBarry Smith #endif 202273d9f13SBarry Smith EXTERN int MatLoadRegisterAll(char*); 203273d9f13SBarry Smith EXTERN int MatLoadRegisterDestroy(void); 204273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled; 205b0a32e0cSBarry Smith extern PetscFList MatLoadList; 206b0a32e0cSBarry Smith EXTERN int MatLoad(PetscViewer,MatType,Mat*); 2077b80b807SBarry Smith 208ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 209ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 210ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 211ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 212d4fbbf0eSBarry Smith 213d91e6319SBarry Smith /*S 214d91e6319SBarry Smith MatInfo - Context of matrix information, used with MatGetInfo() 215d91e6319SBarry Smith 216d91e6319SBarry Smith In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 217d91e6319SBarry Smith 218d91e6319SBarry Smith Level: intermediate 219d91e6319SBarry Smith 220d91e6319SBarry Smith Concepts: matrix^nonzero information 221d91e6319SBarry Smith 222d9274352SBarry Smith .seealso: MatGetInfo(), MatInfoType 223d91e6319SBarry Smith S*/ 2244e220ebcSLois Curfman McInnes typedef struct { 225b0a32e0cSBarry Smith PetscLogDouble rows_global,columns_global; /* number of global rows and columns */ 226b0a32e0cSBarry Smith PetscLogDouble rows_local,columns_local; /* number of local rows and columns */ 227b0a32e0cSBarry Smith PetscLogDouble block_size; /* block size */ 228b0a32e0cSBarry Smith PetscLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 229b0a32e0cSBarry Smith PetscLogDouble memory; /* memory allocated */ 230b0a32e0cSBarry Smith PetscLogDouble assemblies; /* number of matrix assemblies called */ 231b0a32e0cSBarry Smith PetscLogDouble mallocs; /* number of mallocs during MatSetValues() */ 232b0a32e0cSBarry Smith PetscLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 233b0a32e0cSBarry Smith PetscLogDouble factor_mallocs; /* number of mallocs during factorization */ 2344e220ebcSLois Curfman McInnes } MatInfo; 2354e220ebcSLois Curfman McInnes 236d9274352SBarry Smith /*E 237d9274352SBarry Smith MatInfoType - Indicates if you want information about the local part of the matrix, 238d9274352SBarry Smith the entire parallel matrix or the maximum over all the local parts. 239d9274352SBarry Smith 240d9274352SBarry Smith Level: beginner 241d9274352SBarry Smith 242d9274352SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 243d9274352SBarry Smith 244d9274352SBarry Smith .seealso: MatGetInfo(), MatInfo 245d9274352SBarry Smith E*/ 2467b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 247ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 248ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*); 249ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec); 250273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec); 251ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*); 252ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *); 253ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec); 25406ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 255ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*); 2567b80b807SBarry Smith 257ca44d042SBarry Smith EXTERN int MatNorm(Mat,NormType,double *); 258ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat); 259ca44d042SBarry Smith EXTERN int MatZeroRows(Mat,IS,Scalar*); 260ca44d042SBarry Smith EXTERN int MatZeroColumns(Mat,IS,Scalar*); 2617b80b807SBarry Smith 262ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth); 263ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec); 264ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 2655ef9f2a5SBarry Smith 266ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*); 267ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*); 268ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*); 2697b80b807SBarry Smith 270d91e6319SBarry Smith /*E 271d91e6319SBarry Smith MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 272d91e6319SBarry Smith or MatGetSubMatrix() are to be reused to store the new matrix values. 273d91e6319SBarry Smith 274d91e6319SBarry Smith Level: beginner 275d91e6319SBarry Smith 276d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 277d91e6319SBarry Smith 278d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 279d91e6319SBarry Smith E*/ 2807b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 281ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 282ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **); 283ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 2848efafbd8SBarry Smith 285ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 2867b80b807SBarry Smith 287ca44d042SBarry Smith EXTERN int MatAXPY(Scalar *,Mat,Mat); 288ca44d042SBarry Smith EXTERN int MatAYPX(Scalar *,Mat,Mat); 289ca44d042SBarry Smith EXTERN int MatCompress(Mat); 2907b80b807SBarry Smith 291ca44d042SBarry Smith EXTERN int MatScale(Scalar *,Mat); 292ca44d042SBarry Smith EXTERN int MatShift(Scalar *,Mat); 293052efed2SBarry Smith 294ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 295ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 296ca44d042SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*); 297ca44d042SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 298ca44d042SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 29990f02eecSBarry Smith 300ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int); 301649db694SBarry Smith 302ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 303ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec); 304ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec); 3057c922b88SBarry Smith 3067c922b88SBarry Smith /* 307c4f061fbSSatish Balay These three (or four) macros MUST be used together. The third one closes the open { of the first one 3087c922b88SBarry Smith */ 309c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 3107c922b88SBarry Smith { \ 3117c922b88SBarry Smith int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 31282502324SSatish Balay __ierr = PetscMalloc(2*__tmp*sizeof(int),&dnz);CHKERRQ(__ierr);onz = dnz + __tmp;\ 3137c922b88SBarry Smith __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\ 3147c922b88SBarry Smith __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\ 3157c922b88SBarry Smith __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp; 3167c922b88SBarry Smith 317c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 318c4f061fbSSatish Balay {\ 319c4f061fbSSatish Balay int __l;\ 320c4f061fbSSatish Balay __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\ 321c4f061fbSSatish Balay __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\ 322c4f061fbSSatish Balay for (__l=0;__l<nrows;__l++) {\ 323*435da068SBarry Smith __ierr = MatPreallocateSet((rows)[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\ 324c4f061fbSSatish Balay }\ 325c4f061fbSSatish Balay } 326c4f061fbSSatish Balay 327c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 3287c922b88SBarry Smith { int __i; \ 3297c922b88SBarry Smith for (__i=0; __i<nc; __i++) {\ 3307c922b88SBarry Smith if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 3317c922b88SBarry Smith }\ 3327c922b88SBarry Smith dnz[row - __rstart] = nc - onz[row - __rstart];\ 3337c922b88SBarry Smith } 3347c922b88SBarry Smith 335c4f061fbSSatish Balay #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);} 3367c922b88SBarry Smith 3377b80b807SBarry Smith /* Routines unique to particular data structures */ 338*435da068SBarry Smith EXTERN int MatShellGetContext(Mat,void **); 339*435da068SBarry Smith 340ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 341ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 342ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 343ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*); 3447b80b807SBarry Smith 345273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 346273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 347273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 348273d9f13SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,Scalar*); 349273d9f13SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**); 350273d9f13SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*); 351273d9f13SBarry Smith 352273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 353273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 354273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 355273d9f13SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,Scalar*); 356273d9f13SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**); 357273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 358273d9f13SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*); 359273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 360*435da068SBarry Smith EXTERN int MatMPIAIJGetSeqAIJ(Mat,Mat*,Mat*,int**); 361*435da068SBarry Smith EXTERN int MatMPIBAIJGetSeqBAIJ(Mat,Mat*,Mat*,int**); 362273d9f13SBarry Smith 363ca44d042SBarry Smith EXTERN int MatStoreValues(Mat); 364ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat); 3652e8a6d31SBarry Smith 3667b80b807SBarry Smith /* 3677b80b807SBarry Smith These routines are not usually accessed directly, rather solving is 3687b80b807SBarry Smith done through the SLES, KSP and PC interfaces. 3697b80b807SBarry Smith */ 3707b80b807SBarry Smith 371d9274352SBarry Smith /*E 372d9274352SBarry Smith MatOrderingType - String with the name of a PETSc matrix ordering or the creation function 373d9274352SBarry Smith with an optional dynamic library name, for example 374d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:orderingcreate() 375d9274352SBarry Smith 376d9274352SBarry Smith Level: beginner 377d9274352SBarry Smith 378d9274352SBarry Smith .seealso: MatGetOrdering() 379d9274352SBarry Smith E*/ 380b12f92e5SBarry Smith typedef char* MatOrderingType; 381b12f92e5SBarry Smith #define MATORDERING_NATURAL "natural" 382b12f92e5SBarry Smith #define MATORDERING_ND "nd" 383b12f92e5SBarry Smith #define MATORDERING_1WD "1wd" 384b12f92e5SBarry Smith #define MATORDERING_RCM "rcm" 385b12f92e5SBarry Smith #define MATORDERING_QMD "qmd" 386b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength" 38762152c8bSBarry Smith #define MATORDERING_DSC_ND "dsc_nd" 38862152c8bSBarry Smith #define MATORDERING_DSC_MMD "dsc_mmd" 38962152c8bSBarry Smith #define MATORDERING_DSC_MDF "dsc_mdf" 390b12f92e5SBarry Smith 391ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 392ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 393aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 394f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 395b12f92e5SBarry Smith #else 396f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 397b12f92e5SBarry Smith #endif 398ca44d042SBarry Smith EXTERN int MatOrderingRegisterDestroy(void); 399ca44d042SBarry Smith EXTERN int MatOrderingRegisterAll(char*); 4002bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled; 401b0a32e0cSBarry Smith extern PetscFList MatOrderingList; 402d4fbbf0eSBarry Smith 403ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 404a2ce50c7SBarry Smith 405ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double); 406ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 407ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 408a2ce50c7SBarry Smith 409d91e6319SBarry Smith /*S 410d91e6319SBarry Smith MatILUInfo - Data based into the matrix ILU factorization routines 4115ef9f2a5SBarry Smith 412d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 41314822f30SBarry Smith 414d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of ILU 415d91e6319SBarry Smith All entries are double precision. 416d91e6319SBarry Smith 417d91e6319SBarry Smith Level: developer 418d91e6319SBarry Smith 419d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 420d91e6319SBarry Smith 421d91e6319SBarry Smith S*/ 4225ef9f2a5SBarry Smith typedef struct { 4235ef9f2a5SBarry Smith double levels; /* ILU(levels) */ 4245ef9f2a5SBarry Smith double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 4255ef9f2a5SBarry Smith double diagonal_fill; /* force diagonal to fill in if initially not filled */ 42636db0b34SBarry Smith double dt; /* drop tolerance */ 42736db0b34SBarry Smith double dtcol; /* tolerance for pivoting */ 42836db0b34SBarry Smith double dtcount; /* maximum nonzeros to be allowed per row */ 429d91e6319SBarry Smith double damping; /* scaling of identity added to matrix to prevent zero pivots */ 430d91e6319SBarry Smith double damp; /* if is 1.0 and factorization fails, damp until successful */ 4315ef9f2a5SBarry Smith } MatILUInfo; 4325ef9f2a5SBarry Smith 433d91e6319SBarry Smith /*S 434d91e6319SBarry Smith MatLUInfo - Data based into the matrix LU factorization routines 435d91e6319SBarry Smith 436d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 437d91e6319SBarry Smith 438d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of LU 439d91e6319SBarry Smith All entries are double precision. 440d91e6319SBarry Smith 441d91e6319SBarry Smith Level: developer 442d91e6319SBarry Smith 443d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 444d91e6319SBarry Smith 445d91e6319SBarry Smith S*/ 44614822f30SBarry Smith typedef struct { 44714822f30SBarry Smith double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 44814822f30SBarry Smith double dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 449d91e6319SBarry Smith double damping; /* scaling of identity added to matrix to prevent zero pivots */ 450d91e6319SBarry Smith double damp; /* if this is 1.0 and factorization fails, damp until successful */ 45114822f30SBarry Smith } MatLUInfo; 45214822f30SBarry Smith 453d91e6319SBarry Smith /*S 454d91e6319SBarry Smith MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 455d91e6319SBarry Smith 456d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 457d91e6319SBarry Smith 458d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of Cholesky 459d91e6319SBarry Smith All entries are double precision. 460d91e6319SBarry Smith 461d91e6319SBarry Smith Level: developer 462d91e6319SBarry Smith 463d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 464d91e6319SBarry Smith 465d91e6319SBarry Smith S*/ 466ffa6d0a5SLois Curfman McInnes typedef struct { 467ffa6d0a5SLois Curfman McInnes double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 468d91e6319SBarry Smith double damping; /* scaling of identity added to matrix to prevent zero pivots */ 469d91e6319SBarry Smith double damp; /* if this is 1.0 and factorization fails, damp until successful */ 470ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo; 471ffa6d0a5SLois Curfman McInnes 47214822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 473ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 47414822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 475ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 476ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 47774637425SBarry Smith EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int); 478ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*); 479ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 480a2ce50c7SBarry Smith 481ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec); 482ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec); 483ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec); 484ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 485ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec); 486ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 4878ed539a5SBarry Smith 488ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat); 489bb5a7306SBarry Smith 490bb1eb677SSatish Balay /* MatSORType may be bitwise ORd together, so do not change the numbers */ 491d91e6319SBarry Smith /*E 492d91e6319SBarry Smith MatSORType - What type of (S)SOR to perform 493bb1eb677SSatish Balay 494d91e6319SBarry Smith Level: beginner 495d91e6319SBarry Smith 496d9274352SBarry Smith May be bitwise ORd together 497d9274352SBarry Smith 498d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 499d91e6319SBarry Smith 500d91e6319SBarry Smith .seealso: MatRelax() 501d91e6319SBarry Smith E*/ 502ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 503ee50ffe9SBarry Smith SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 504ee50ffe9SBarry Smith SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 50584cb2905SBarry Smith SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 506ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 5078ed539a5SBarry Smith 508d4fbbf0eSBarry Smith /* 509639f9d9dSBarry Smith These routines are for efficiently computing Jacobians via finite differences. 510639f9d9dSBarry Smith */ 511b12f92e5SBarry Smith 512d9274352SBarry Smith /*E 513d9274352SBarry Smith MatColoringType - String with the name of a PETSc matrix coloring or the creation function 514d9274352SBarry Smith with an optional dynamic library name, for example 515d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:coloringcreate() 516d9274352SBarry Smith 517d9274352SBarry Smith Level: beginner 518d9274352SBarry Smith 519d9274352SBarry Smith .seealso: MatGetColoring() 520d9274352SBarry Smith E*/ 521b12f92e5SBarry Smith typedef char* MatColoringType; 522b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural" 523b12f92e5SBarry Smith #define MATCOLORING_SL "sl" 524b12f92e5SBarry Smith #define MATCOLORING_LF "lf" 525b12f92e5SBarry Smith #define MATCOLORING_ID "id" 526b12f92e5SBarry Smith 527ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 528ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 529aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 530f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 531b12f92e5SBarry Smith #else 532f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 533b12f92e5SBarry Smith #endif 534ca44d042SBarry Smith EXTERN int MatColoringRegisterAll(char *); 5352bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled; 536ca44d042SBarry Smith EXTERN int MatColoringRegisterDestroy(void); 537ca44d042SBarry Smith EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 538639f9d9dSBarry Smith 5391a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 540d9274352SBarry Smith /*S 541d9274352SBarry Smith MatFDColoring - Object for computing a sparse Jacobian via finite differences 542d9274352SBarry Smith and coloring 543639f9d9dSBarry Smith 544d9274352SBarry Smith Level: beginner 545d9274352SBarry Smith 546d9274352SBarry Smith Concepts: coloring, sparse Jacobian, finite differences 547d9274352SBarry Smith 548d9274352SBarry Smith .seealso: MatFDColoringCreate() 549d9274352SBarry Smith S*/ 550e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring; 551639f9d9dSBarry Smith 552ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 553ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring); 554b0a32e0cSBarry Smith EXTERN int MatFDColoringView(MatFDColoring,PetscViewer); 555ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 556ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 557ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 558ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 559ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 560ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 561ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 56262152c8bSBarry Smith EXTERN int MatFDColoringSetRecompute(MatFDColoring); 563639f9d9dSBarry Smith 564639f9d9dSBarry Smith /* 5650752156aSBarry Smith These routines are for partitioning matrices: currently used only 5663eda8832SBarry Smith for adjacency matrix, MatCreateMPIAdj(). 5670752156aSBarry Smith */ 56891e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 569ca161407SBarry Smith 570d9274352SBarry Smith /*S 571d9274352SBarry Smith MatPartitioning - Object for managing the partitioning of a matrix or graph 572d9274352SBarry Smith 573d9274352SBarry Smith Level: beginner 574d9274352SBarry Smith 575d9274352SBarry Smith Concepts: partitioning 576d9274352SBarry Smith 577d9274352SBarry Smith .seealso: MatParitioningCreate(), MatPartitioningType 578d9274352SBarry Smith S*/ 57991e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning; 580d9274352SBarry Smith 581d9274352SBarry Smith /*E 582d9274352SBarry Smith MatPartitioningType - String with the name of a PETSc matrix partitioing or the creation function 583d9274352SBarry Smith with an optional dynamic library name, for example 584d9274352SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:partitioningcreate() 585d9274352SBarry Smith 586d9274352SBarry Smith Level: beginner 587d9274352SBarry Smith 588d9274352SBarry Smith .seealso: MatPartitioingCreate(), MatPartitioning 589d9274352SBarry Smith E*/ 5902aabb6bbSBarry Smith typedef char* MatPartitioningType; 5912aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT "current" 5922aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis" 593ca161407SBarry Smith 594ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 595ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 596ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 597ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 598ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*); 599ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning); 6002aabb6bbSBarry Smith 601ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 602aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 603f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 6042aabb6bbSBarry Smith #else 605f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 6062aabb6bbSBarry Smith #endif 6072aabb6bbSBarry Smith 608ca44d042SBarry Smith EXTERN int MatPartitioningRegisterAll(char *); 6092bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled; 610ca44d042SBarry Smith EXTERN int MatPartitioningRegisterDestroy(void); 6112bad1931SBarry Smith 612b0a32e0cSBarry Smith EXTERN int MatPartitioningView(MatPartitioning,PetscViewer); 613ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 614ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 615ca161407SBarry Smith 616ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 6170752156aSBarry Smith 6180752156aSBarry Smith /* 6190a835dfdSSatish Balay If you add entries here you must also add them to finclude/petscmat.h 620d4fbbf0eSBarry Smith */ 6211c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0, 6221c1c02c0SLois Curfman McInnes MATOP_GET_ROW=1, 6231c1c02c0SLois Curfman McInnes MATOP_RESTORE_ROW=2, 6241c1c02c0SLois Curfman McInnes MATOP_MULT=3, 6251c1c02c0SLois Curfman McInnes MATOP_MULT_ADD=4, 6267c922b88SBarry Smith MATOP_MULT_TRANSPOSE=5, 6277c922b88SBarry Smith MATOP_MULT_TRANSPOSE_ADD=6, 6281c1c02c0SLois Curfman McInnes MATOP_SOLVE=7, 6291c1c02c0SLois Curfman McInnes MATOP_SOLVE_ADD=8, 6307c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE=9, 6317c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE_ADD=10, 6321c1c02c0SLois Curfman McInnes MATOP_LUFACTOR=11, 6331c1c02c0SLois Curfman McInnes MATOP_CHOLESKYFACTOR=12, 6341c1c02c0SLois Curfman McInnes MATOP_RELAX=13, 6351c1c02c0SLois Curfman McInnes MATOP_TRANSPOSE=14, 6361c1c02c0SLois Curfman McInnes MATOP_GETINFO=15, 6371c1c02c0SLois Curfman McInnes MATOP_EQUAL=16, 6381c1c02c0SLois Curfman McInnes MATOP_GET_DIAGONAL=17, 6391c1c02c0SLois Curfman McInnes MATOP_DIAGONAL_SCALE=18, 6401c1c02c0SLois Curfman McInnes MATOP_NORM=19, 6411c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_BEGIN=20, 6421c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_END=21, 6431c1c02c0SLois Curfman McInnes MATOP_COMPRESS=22, 6441c1c02c0SLois Curfman McInnes MATOP_SET_OPTION=23, 6451c1c02c0SLois Curfman McInnes MATOP_ZERO_ENTRIES=24, 6461c1c02c0SLois Curfman McInnes MATOP_ZERO_ROWS=25, 6471c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_SYMBOLIC=26, 6481c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_NUMERIC=27, 6491c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 6501c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_NUMERIC=29, 6511c1c02c0SLois Curfman McInnes MATOP_GET_SIZE=30, 6521c1c02c0SLois Curfman McInnes MATOP_GET_LOCAL_SIZE=31, 6531c1c02c0SLois Curfman McInnes MATOP_GET_OWNERSHIP_RANGE=32, 6541c1c02c0SLois Curfman McInnes MATOP_ILUFACTOR_SYMBOLIC=33, 6551c1c02c0SLois Curfman McInnes MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 6561c1c02c0SLois Curfman McInnes MATOP_GET_ARRAY=35, 6571c1c02c0SLois Curfman McInnes MATOP_RESTORE_ARRAY=36, 6587bf97ca4SSatish Balay 659005c665bSBarry Smith MATOP_CONVERT_SAME_TYPE=37, 660005c665bSBarry Smith MATOP_FORWARD_SOLVE=38, 661005c665bSBarry Smith MATOP_BACKWARD_SOLVE=39, 662005c665bSBarry Smith MATOP_ILUFACTOR=40, 663005c665bSBarry Smith MATOP_INCOMPLETECHOLESKYFACTOR=41, 664005c665bSBarry Smith MATOP_AXPY=42, 665005c665bSBarry Smith MATOP_GET_SUBMATRICES=43, 666005c665bSBarry Smith MATOP_INCREASE_OVERLAP=44, 667005c665bSBarry Smith MATOP_GET_VALUES=45, 668005c665bSBarry Smith MATOP_COPY=46, 669005c665bSBarry Smith MATOP_PRINT_HELP=47, 670005c665bSBarry Smith MATOP_SCALE=48, 671005c665bSBarry Smith MATOP_SHIFT=49, 672005c665bSBarry Smith MATOP_DIAGONAL_SHIFT=50, 673005c665bSBarry Smith MATOP_ILUDT_FACTOR=51, 674005c665bSBarry Smith MATOP_GET_BLOCK_SIZE=52, 675005c665bSBarry Smith MATOP_GET_ROW_IJ=53, 676005c665bSBarry Smith MATOP_RESTORE_ROW_IJ=54, 677005c665bSBarry Smith MATOP_GET_COLUMN_IJ=55, 678005c665bSBarry Smith MATOP_RESTORE_COLUMN_IJ=56, 679005c665bSBarry Smith MATOP_FDCOLORING_CREATE=57, 680005c665bSBarry Smith MATOP_COLORING_PATCH=58, 681005c665bSBarry Smith MATOP_SET_UNFACTORED=59, 682005c665bSBarry Smith MATOP_PERMUTE=60, 683005c665bSBarry Smith MATOP_SET_VALUES_BLOCKED=61, 6841c1c02c0SLois Curfman McInnes MATOP_DESTROY=250, 6851c1c02c0SLois Curfman McInnes MATOP_VIEW=251 686fae171e0SBarry Smith } MatOperation; 687ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 688ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 689ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 690273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*); 691112a2221SBarry Smith 69290ace30eSBarry Smith /* 69390ace30eSBarry Smith Codes for matrices stored on disk. By default they are 69490ace30eSBarry Smith stored in a universal format. By changing the format with 695fb9695e5SSatish Balay PetscViewerSetFormat(viewer,PETSC_VIEWER_BINARY_NATIVE); the matrices will 69690ace30eSBarry Smith be stored in a way natural for the matrix, for example dense matrices 69790ace30eSBarry Smith would be stored as dense. Matrices stored this way may only be 69890ace30eSBarry Smith read into matrices of the same time. 69990ace30eSBarry Smith */ 70090ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1 70190ace30eSBarry Smith 7023f1d51d7SBarry Smith /* 7033f1d51d7SBarry Smith New matrix classes not yet distributed 7043f1d51d7SBarry Smith */ 7053f1d51d7SBarry Smith /* 7063f1d51d7SBarry Smith MatAIJIndices is a data structure for storing the nonzero location information 7073f1d51d7SBarry Smith for sparse matrices. Several matrices with identical nonzero structure can share 7083f1d51d7SBarry Smith the same MatAIJIndices. 7093f1d51d7SBarry Smith */ 710e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices; 7113f1d51d7SBarry Smith 712ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 713ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 714ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 715ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices); 716ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 717ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 718ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices); 719ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices); 720ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 7213f1d51d7SBarry Smith 722ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 723ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 724ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 7253f1d51d7SBarry Smith 726ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 727ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 728ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 7293f1d51d7SBarry Smith 7306d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 731ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 73208918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 733860d1616SSatish Balay 734d9274352SBarry Smith /*S 735d9274352SBarry Smith MatNullSpace - Object that removes a null space from a vector, i.e. 736d9274352SBarry Smith orthogonalizes the vector to a subsapce 737d9274352SBarry Smith 738d9274352SBarry Smith Level: beginner 739d9274352SBarry Smith 740d9274352SBarry Smith Concepts: matrix; linear operator, null space 741d9274352SBarry Smith 742d9274352SBarry Smith .seealso: MatNullSpaceCreate() 743d9274352SBarry Smith S*/ 74474637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace; 745d9274352SBarry Smith 74674637425SBarry Smith #define MATNULLSPACE_COOKIE PETSC_COOKIE+17 74774637425SBarry Smith 74874637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 74974637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace); 75074637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 75174637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 75274637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 75374637425SBarry Smith 754273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 755273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 756273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 757273d9f13SBarry Smith 7583f1d51d7SBarry Smith 759f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*); 760c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*); 761c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*); 762c4f061fbSSatish Balay 763273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 764f069c275SSatish Balay 765b0a32e0cSBarry Smith EXTERN int MatComputeExplicitOperator(Mat,Mat*); 766b0a32e0cSBarry Smith 7672eac72dbSBarry Smith #endif 7682eac72dbSBarry Smith 7692eac72dbSBarry Smith 7709d00d63dSBarry Smith 771