1*d91e6319SBarry Smith /* $Id: petscmat.h,v 1.208 2000/10/24 20:28:06 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; 12*d91e6319SBarry Smith /*E 13*d91e6319SBarry Smith MatType - String with the name of a PETSc matrix or the creation function 14*d91e6319SBarry Smith with an optional dynamic library name 152eac72dbSBarry Smith 16*d91e6319SBarry Smith Level: beginner 17*d91e6319SBarry Smith 18*d91e6319SBarry Smith .seealso: MatSetType() 19*d91e6319SBarry Smith E*/ 20273d9f13SBarry Smith #define MATSAME "same" 21273d9f13SBarry Smith #define MATSEQMAIJ "seqmaij" 22273d9f13SBarry Smith #define MATMPIMAIJ "mpimaij" 23273d9f13SBarry Smith #define MATIS "is" 24273d9f13SBarry Smith #define MATMPIROWBS "mpirowbs" 25273d9f13SBarry Smith #define MATSEQDENSE "seqdense" 26273d9f13SBarry Smith #define MATSEQAIJ "seqaij" 27273d9f13SBarry Smith #define MATMPIAIJ "mpiaij" 28273d9f13SBarry Smith #define MATSHELL "shell" 29273d9f13SBarry Smith #define MATSEQBDIAG "seqbdiag" 30273d9f13SBarry Smith #define MATMPIBDIAG "mpibdiag" 31273d9f13SBarry Smith #define MATMPIDENSE "mpidense" 32273d9f13SBarry Smith #define MATSEQBAIJ "seqbaij" 33273d9f13SBarry Smith #define MATMPIBAIJ "mpibaij" 34273d9f13SBarry Smith #define MATMPIADJ "mpiadj" 35273d9f13SBarry Smith #define MATSEQSBAIJ "seqsbaij" 36273d9f13SBarry Smith #define MATMPISBAIJ "mpisbaij" 37273d9f13SBarry Smith typedef char* MatType; 38*d91e6319SBarry Smith 39273d9f13SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 40273d9f13SBarry Smith EXTERN int MatSetType(Mat,MatType); 41273d9f13SBarry Smith EXTERN int MatSetFromOptions(Mat); 42273d9f13SBarry Smith EXTERN int MatSetUpPreallocation(Mat); 43273d9f13SBarry Smith EXTERN int MatRegisterAll(char*); 44273d9f13SBarry Smith EXTERN int MatRegister(char*,char*,char*,int(*)(Mat)); 45273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 46273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0) 47273d9f13SBarry Smith #else 48273d9f13SBarry Smith #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d) 49273d9f13SBarry Smith #endif 50273d9f13SBarry Smith extern PetscTruth MatRegisterAllCalled; 51273d9f13SBarry Smith extern FList MatList; 5228988994SBarry Smith 53ca44d042SBarry Smith EXTERN int MatCreate(MPI_Comm,int,int,int,int,Mat*); 54ca44d042SBarry Smith EXTERN int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*); 55ca44d042SBarry Smith EXTERN int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*); 56ca44d042SBarry Smith EXTERN int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*); 57ca44d042SBarry Smith EXTERN int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*); 58c4f061fbSSatish Balay EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,Mat*); 59ca44d042SBarry Smith EXTERN int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*); 60ca44d042SBarry Smith EXTERN int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*); 61ca44d042SBarry Smith EXTERN int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 62ca44d042SBarry Smith EXTERN int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 63ca44d042SBarry Smith EXTERN int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,int *,Mat*); 64ca44d042SBarry Smith EXTERN int MatCreateSeqSBAIJ(MPI_Comm,int,int,int,int,int*,Mat*); 65ca44d042SBarry Smith EXTERN int MatCreateMPISBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*); 668a3eeb68SSatish Balay 67ca44d042SBarry Smith EXTERN int MatDestroy(Mat); 687b80b807SBarry Smith 69ca44d042SBarry Smith EXTERN int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*); 70ca44d042SBarry Smith EXTERN int MatShellGetContext(Mat,void **); 7121c89e3eSBarry Smith 72ca44d042SBarry Smith EXTERN int MatPrintHelp(Mat); 73ca44d042SBarry Smith EXTERN int MatGetMaps(Mat,Map*,Map*); 74ec0117caSBarry Smith 758ed539a5SBarry Smith /* ------------------------------------------------------------*/ 76ca44d042SBarry Smith EXTERN int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode); 77ca44d042SBarry Smith EXTERN int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode); 7884cb2905SBarry Smith 79*d91e6319SBarry Smith /*E 80*d91e6319SBarry Smith MatAssemblyType - Indicates if the matrix is now to be used, or if you plan 81*d91e6319SBarry Smith to continue to add values to it 82*d91e6319SBarry Smith 83*d91e6319SBarry Smith Level: beginner 84*d91e6319SBarry Smith 85*d91e6319SBarry Smith .seealso: MatAssemblyBegin(), MatAssemblyEnd() 86*d91e6319SBarry Smith E*/ 876d4a8577SBarry Smith typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType; 88ca44d042SBarry Smith EXTERN int MatAssemblyBegin(Mat,MatAssemblyType); 89ca44d042SBarry Smith EXTERN int MatAssemblyEnd(Mat,MatAssemblyType); 90ca44d042SBarry Smith EXTERN int MatAssembled(Mat,PetscTruth*); 914f9c727eSBarry Smith 92b951964fSBarry Smith #define MatSetValue(v,i,j,va,mode) \ 93*d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \ 94b951964fSBarry Smith _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 95b951964fSBarry Smith } 96ea06a074SBarry Smith #define MatGetValue(v,i,j,va) \ 97*d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; \ 98ea06a074SBarry Smith _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \ 99ea06a074SBarry Smith } 100*d91e6319SBarry Smith #define MatSetValueLocal(v,i,j,va,mode) \ 101*d91e6319SBarry Smith 0; {int _ierr,_row = i,_col = j; Scalar _va = va; \ 102*d91e6319SBarry Smith _ierr = MatSetValuesLocal(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \ 103*d91e6319SBarry Smith } 104*d91e6319SBarry Smith /*E 105*d91e6319SBarry Smith MatOption - Options that may be set for a matrix and its behavior or storage 106*d91e6319SBarry Smith 107*d91e6319SBarry Smith Level: beginner 108*d91e6319SBarry Smith 1090a835dfdSSatish Balay Any additions/changes here MUST also be made in include/finclude/petscmat.h 110*d91e6319SBarry Smith 111*d91e6319SBarry Smith .seealso: MatSetOption() 112*d91e6319SBarry Smith E*/ 1136d4a8577SBarry Smith typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4, 1146d4a8577SBarry Smith MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16, 1156d4a8577SBarry Smith MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64, 1166ca9ecd3SBarry Smith MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66, 1176ca9ecd3SBarry Smith MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69, 1186ca9ecd3SBarry Smith MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72, 1196ca9ecd3SBarry Smith MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74, 1204787f768SSatish Balay MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76, 1217c922b88SBarry Smith MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78, 1222bad1931SBarry Smith MAT_KEEP_ZEROED_ROWS=79,MAT_IGNORE_ZERO_ENTRIES=80,MAT_USE_INODES=81, 123f9d29acdSSatish Balay MAT_DO_NOT_USE_INODES=82} MatOption; 124ca44d042SBarry Smith EXTERN int MatSetOption(Mat,MatOption); 125273d9f13SBarry Smith EXTERN int MatGetType(Mat,MatType*); 12684cb2905SBarry Smith 127ca44d042SBarry Smith EXTERN int MatGetValues(Mat,int,int*,int,int*,Scalar*); 128ca44d042SBarry Smith EXTERN int MatGetRow(Mat,int,int *,int **,Scalar**); 129ca44d042SBarry Smith EXTERN int MatRestoreRow(Mat,int,int *,int **,Scalar**); 130ca44d042SBarry Smith EXTERN int MatGetColumn(Mat,int,int *,int **,Scalar**); 131ca44d042SBarry Smith EXTERN int MatRestoreColumn(Mat,int,int *,int **,Scalar**); 132ca44d042SBarry Smith EXTERN int MatGetColumnVector(Mat,Vec,int); 133ca44d042SBarry Smith EXTERN int MatGetArray(Mat,Scalar **); 134ca44d042SBarry Smith EXTERN int MatRestoreArray(Mat,Scalar **); 135ca44d042SBarry Smith EXTERN int MatGetBlockSize(Mat,int *); 1367b80b807SBarry Smith 137ca44d042SBarry Smith EXTERN int MatMult(Mat,Vec,Vec); 138ca44d042SBarry Smith EXTERN int MatMultAdd(Mat,Vec,Vec,Vec); 139ca44d042SBarry Smith EXTERN int MatMultTranspose(Mat,Vec,Vec); 140ca44d042SBarry Smith EXTERN int MatMultTransposeAdd(Mat,Vec,Vec,Vec); 1412eac72dbSBarry Smith 142*d91e6319SBarry Smith /*E 143*d91e6319SBarry Smith MatDuplicateOption - Indicates if a duplicated sparse matrix should have 144*d91e6319SBarry Smith its numerical values copied over or just its nonzero structure. 145*d91e6319SBarry Smith 146*d91e6319SBarry Smith Level: beginner 147*d91e6319SBarry Smith 148*d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 149*d91e6319SBarry Smith 150*d91e6319SBarry Smith .seealso: MatDuplicate() 151*d91e6319SBarry Smith E*/ 1522e8a6d31SBarry Smith typedef enum {MAT_DO_NOT_COPY_VALUES,MAT_COPY_VALUES} MatDuplicateOption; 1532e8a6d31SBarry Smith 154273d9f13SBarry Smith EXTERN int MatConvertRegister(char*,char*,char*,int (*)(Mat,MatType,Mat*)); 155273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 156273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,0) 157273d9f13SBarry Smith #else 158273d9f13SBarry Smith #define MatConvertRegisterDynamic(a,b,c,d) MatConvertRegister(a,b,c,d) 159273d9f13SBarry Smith #endif 160273d9f13SBarry Smith EXTERN int MatConvertRegisterAll(char*); 161273d9f13SBarry Smith EXTERN int MatConvertRegisterDestroy(void); 162273d9f13SBarry Smith extern PetscTruth MatConvertRegisterAllCalled; 163273d9f13SBarry Smith extern FList MatConvertList; 164ca44d042SBarry Smith EXTERN int MatConvert(Mat,MatType,Mat*); 165ca44d042SBarry Smith EXTERN int MatDuplicate(Mat,MatDuplicateOption,Mat*); 16694a9d846SBarry Smith 167*d91e6319SBarry Smith /*E 168*d91e6319SBarry Smith MatStructure - Indicates if the matrix has the same nonzero structure 169*d91e6319SBarry Smith 170*d91e6319SBarry Smith Level: beginner 171*d91e6319SBarry Smith 172*d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 173*d91e6319SBarry Smith 174*d91e6319SBarry Smith .seealso: MatCopy(), SLESSetOperators(), PCSetOperators() 175*d91e6319SBarry Smith E*/ 176cb5b572fSBarry Smith typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure; 177cb5b572fSBarry Smith 178ca44d042SBarry Smith EXTERN int MatCopy(Mat,Mat,MatStructure); 179ca44d042SBarry Smith EXTERN int MatView(Mat,Viewer); 180273d9f13SBarry Smith 181273d9f13SBarry Smith EXTERN int MatLoadRegister(char*,char*,char*,int (*)(Viewer,MatType,Mat*)); 182273d9f13SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 183273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,0) 184273d9f13SBarry Smith #else 185273d9f13SBarry Smith #define MatLoadRegisterDynamic(a,b,c,d) MatLoadRegister(a,b,c,d) 186273d9f13SBarry Smith #endif 187273d9f13SBarry Smith EXTERN int MatLoadRegisterAll(char*); 188273d9f13SBarry Smith EXTERN int MatLoadRegisterDestroy(void); 189273d9f13SBarry Smith extern PetscTruth MatLoadRegisterAllCalled; 190273d9f13SBarry Smith extern FList MatLoadList; 191ca44d042SBarry Smith EXTERN int MatLoad(Viewer,MatType,Mat*); 1927b80b807SBarry Smith 193ca44d042SBarry Smith EXTERN int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 194ca44d042SBarry Smith EXTERN int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 195ca44d042SBarry Smith EXTERN int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *); 196ca44d042SBarry Smith EXTERN int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *); 197d4fbbf0eSBarry Smith 198*d91e6319SBarry Smith /*S 199*d91e6319SBarry Smith MatInfo - Context of matrix information, used with MatGetInfo() 200*d91e6319SBarry Smith 201*d91e6319SBarry Smith In Fortran this is simply a double precision array of dimension MAT_INFO_SIZE 202*d91e6319SBarry Smith 203*d91e6319SBarry Smith Level: intermediate 204*d91e6319SBarry Smith 205*d91e6319SBarry Smith Concepts: matrix^nonzero information 206*d91e6319SBarry Smith 207*d91e6319SBarry Smith .seealso: MatGetInfo() 208*d91e6319SBarry Smith S*/ 2094e220ebcSLois Curfman McInnes typedef struct { 21037f753daSBarry Smith PLogDouble rows_global,columns_global; /* number of global rows and columns */ 21137f753daSBarry Smith PLogDouble rows_local,columns_local; /* number of local rows and columns */ 21237f753daSBarry Smith PLogDouble block_size; /* block size */ 21337f753daSBarry Smith PLogDouble nz_allocated,nz_used,nz_unneeded; /* number of nonzeros */ 21437f753daSBarry Smith PLogDouble memory; /* memory allocated */ 215*d91e6319SBarry Smith PLogDouble assemblies; /* number of matrix assemblies called */ 21637f753daSBarry Smith PLogDouble mallocs; /* number of mallocs during MatSetValues() */ 21737f753daSBarry Smith PLogDouble fill_ratio_given,fill_ratio_needed; /* fill ratio for LU/ILU */ 21837f753daSBarry Smith PLogDouble factor_mallocs; /* number of mallocs during factorization */ 2194e220ebcSLois Curfman McInnes } MatInfo; 2204e220ebcSLois Curfman McInnes 2217b80b807SBarry Smith typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType; 222ca44d042SBarry Smith EXTERN int MatGetInfo(Mat,MatInfoType,MatInfo*); 223ca44d042SBarry Smith EXTERN int MatValid(Mat,PetscTruth*); 224ca44d042SBarry Smith EXTERN int MatGetDiagonal(Mat,Vec); 225273d9f13SBarry Smith EXTERN int MatGetRowMax(Mat,Vec); 226ca44d042SBarry Smith EXTERN int MatTranspose(Mat,Mat*); 227ca44d042SBarry Smith EXTERN int MatPermute(Mat,IS,IS,Mat *); 228ca44d042SBarry Smith EXTERN int MatDiagonalScale(Mat,Vec,Vec); 22906ef90c2SBarry Smith EXTERN int MatDiagonalSet(Mat,Vec,InsertMode); 230ca44d042SBarry Smith EXTERN int MatEqual(Mat,Mat,PetscTruth*); 2317b80b807SBarry Smith 232ca44d042SBarry Smith EXTERN int MatNorm(Mat,NormType,double *); 233ca44d042SBarry Smith EXTERN int MatZeroEntries(Mat); 234ca44d042SBarry Smith EXTERN int MatZeroRows(Mat,IS,Scalar*); 235ca44d042SBarry Smith EXTERN int MatZeroColumns(Mat,IS,Scalar*); 2367b80b807SBarry Smith 237ca44d042SBarry Smith EXTERN int MatUseScaledForm(Mat,PetscTruth); 238ca44d042SBarry Smith EXTERN int MatScaleSystem(Mat,Vec,Vec); 239ca44d042SBarry Smith EXTERN int MatUnScaleSystem(Mat,Vec,Vec); 2405ef9f2a5SBarry Smith 241ca44d042SBarry Smith EXTERN int MatGetSize(Mat,int*,int*); 242ca44d042SBarry Smith EXTERN int MatGetLocalSize(Mat,int*,int*); 243ca44d042SBarry Smith EXTERN int MatGetOwnershipRange(Mat,int*,int*); 2447b80b807SBarry Smith 245*d91e6319SBarry Smith /*E 246*d91e6319SBarry Smith MatReuse - Indicates if matrices obtained from a previous call to MatGetSubMatrices() 247*d91e6319SBarry Smith or MatGetSubMatrix() are to be reused to store the new matrix values. 248*d91e6319SBarry Smith 249*d91e6319SBarry Smith Level: beginner 250*d91e6319SBarry Smith 251*d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 252*d91e6319SBarry Smith 253*d91e6319SBarry Smith .seealso: MatGetSubMatrices(), MatGetSubMatrix(), MatDestroyMatrices() 254*d91e6319SBarry Smith E*/ 2557b2a1423SBarry Smith typedef enum {MAT_INITIAL_MATRIX,MAT_REUSE_MATRIX} MatReuse; 256ca44d042SBarry Smith EXTERN int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **); 257ca44d042SBarry Smith EXTERN int MatDestroyMatrices(int,Mat **); 258ca44d042SBarry Smith EXTERN int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *); 2598efafbd8SBarry Smith 260ca44d042SBarry Smith EXTERN int MatIncreaseOverlap(Mat,int,IS *,int); 2617b80b807SBarry Smith 262ca44d042SBarry Smith EXTERN int MatAXPY(Scalar *,Mat,Mat); 263ca44d042SBarry Smith EXTERN int MatAYPX(Scalar *,Mat,Mat); 264ca44d042SBarry Smith EXTERN int MatCompress(Mat); 2657b80b807SBarry Smith 266ca44d042SBarry Smith EXTERN int MatScale(Scalar *,Mat); 267ca44d042SBarry Smith EXTERN int MatShift(Scalar *,Mat); 268052efed2SBarry Smith 269ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMapping(Mat,ISLocalToGlobalMapping); 270ca44d042SBarry Smith EXTERN int MatSetLocalToGlobalMappingBlock(Mat,ISLocalToGlobalMapping); 271ca44d042SBarry Smith EXTERN int MatZeroRowsLocal(Mat,IS,Scalar*); 272ca44d042SBarry Smith EXTERN int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 273ca44d042SBarry Smith EXTERN int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode); 27490f02eecSBarry Smith 275ca44d042SBarry Smith EXTERN int MatSetStashInitialSize(Mat,int,int); 276649db694SBarry Smith 277ca44d042SBarry Smith EXTERN int MatInterpolateAdd(Mat,Vec,Vec,Vec); 278ca44d042SBarry Smith EXTERN int MatInterpolate(Mat,Vec,Vec); 279ca44d042SBarry Smith EXTERN int MatRestrict(Mat,Vec,Vec); 2807c922b88SBarry Smith 2817c922b88SBarry Smith /* 282c4f061fbSSatish Balay These three (or four) macros MUST be used together. The third one closes the open { of the first one 2837c922b88SBarry Smith */ 284c4f061fbSSatish Balay #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) 0; \ 2857c922b88SBarry Smith { \ 2867c922b88SBarry Smith int __ierr,__tmp = (nrows),__ctmp = (ncols),__rstart,__start,__end; \ 2877c922b88SBarry Smith dnz = (int*)PetscMalloc(2*__tmp*sizeof(int));CHKPTRQ(dnz);onz = dnz + __tmp;\ 2887c922b88SBarry Smith __ierr = PetscMemzero(dnz,2*__tmp*sizeof(int));CHKERRQ(__ierr);\ 2897c922b88SBarry Smith __ierr = MPI_Scan(&__ctmp,&__end,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __start = __end - __ctmp;\ 2907c922b88SBarry Smith __ierr = MPI_Scan(&__tmp,&__rstart,1,MPI_INT,MPI_SUM,comm);CHKERRQ(__ierr); __rstart = __rstart - __tmp; 2917c922b88SBarry Smith 292c4f061fbSSatish Balay #define MatPreallocateSetLocal(map,nrows,rows,ncols,cols,dnz,onz) 0;\ 293c4f061fbSSatish Balay {\ 294c4f061fbSSatish Balay int __l;\ 295c4f061fbSSatish Balay __ierr = ISLocalToGlobalMappingApply(map,nrows,rows,rows);CHKERRQ(__ierr);\ 296c4f061fbSSatish Balay __ierr = ISLocalToGlobalMappingApply(map,ncols,cols,cols);CHKERRQ(__ierr);\ 297c4f061fbSSatish Balay for (__l=0;__l<nrows;__l++) {\ 298c4f061fbSSatish Balay __ierr = MatPreallocateSet(rows[__l],ncols,cols,dnz,onz);CHKERRQ(__ierr);\ 299c4f061fbSSatish Balay }\ 300c4f061fbSSatish Balay } 301c4f061fbSSatish Balay 302c4f061fbSSatish Balay #define MatPreallocateSet(row,nc,cols,dnz,onz) 0;\ 3037c922b88SBarry Smith { int __i; \ 3047c922b88SBarry Smith for (__i=0; __i<nc; __i++) {\ 3057c922b88SBarry Smith if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \ 3067c922b88SBarry Smith }\ 3077c922b88SBarry Smith dnz[row - __rstart] = nc - onz[row - __rstart];\ 3087c922b88SBarry Smith } 3097c922b88SBarry Smith 310c4f061fbSSatish Balay #define MatPreallocateFinalize(dnz,onz) 0;__ierr = PetscFree(dnz);CHKERRQ(__ierr);} 3117c922b88SBarry Smith 3127b80b807SBarry Smith /* Routines unique to particular data structures */ 313ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***); 314ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *); 315ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *); 316ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*); 3177b80b807SBarry Smith 318273d9f13SBarry Smith EXTERN int MatSeqBAIJSetPreallocation(Mat,int,int,int*); 319273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetPreallocation(Mat,int,int,int*); 320273d9f13SBarry Smith EXTERN int MatSeqAIJSetPreallocation(Mat,int,int*); 321273d9f13SBarry Smith EXTERN int MatSeqDensePreallocation(Mat,Scalar*); 322273d9f13SBarry Smith EXTERN int MatSeqBDiagSetPreallocation(Mat,int,int,int*,Scalar**); 323273d9f13SBarry Smith EXTERN int MatSeqDenseSetPreallocation(Mat,Scalar*); 324273d9f13SBarry Smith 325273d9f13SBarry Smith EXTERN int MatMPIBAIJSetPreallocation(Mat,int,int,int*,int,int*); 326273d9f13SBarry Smith EXTERN int MatMPISBAIJSetPreallocation(Mat,int,int,int*,int,int*); 327273d9f13SBarry Smith EXTERN int MatMPIAIJSetPreallocation(Mat,int,int*,int,int*); 328273d9f13SBarry Smith EXTERN int MatMPIDensePreallocation(Mat,Scalar*); 329273d9f13SBarry Smith EXTERN int MatMPIBDiagSetPreallocation(Mat,int,int,int*,Scalar**); 330273d9f13SBarry Smith EXTERN int MatMPIAdjSetPreallocation(Mat,int*,int*,int*); 331273d9f13SBarry Smith EXTERN int MatMPIDenseSetPreallocation(Mat,Scalar*); 332273d9f13SBarry Smith EXTERN int MatMPIRowbsSetPreallocation(Mat,int,int*); 333273d9f13SBarry Smith 334ca44d042SBarry Smith EXTERN int MatStoreValues(Mat); 335ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat); 3362e8a6d31SBarry Smith 3377b80b807SBarry Smith /* 3387b80b807SBarry Smith These routines are not usually accessed directly, rather solving is 3397b80b807SBarry Smith done through the SLES, KSP and PC interfaces. 3407b80b807SBarry Smith */ 3417b80b807SBarry Smith 342b12f92e5SBarry Smith typedef char* MatOrderingType; 343b12f92e5SBarry Smith #define MATORDERING_NATURAL "natural" 344b12f92e5SBarry Smith #define MATORDERING_ND "nd" 345b12f92e5SBarry Smith #define MATORDERING_1WD "1wd" 346b12f92e5SBarry Smith #define MATORDERING_RCM "rcm" 347b12f92e5SBarry Smith #define MATORDERING_QMD "qmd" 348b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength" 349b12f92e5SBarry Smith 350ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*); 351ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*)); 352aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 353f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0) 354b12f92e5SBarry Smith #else 355f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d) 356b12f92e5SBarry Smith #endif 357ca44d042SBarry Smith EXTERN int MatOrderingRegisterDestroy(void); 358ca44d042SBarry Smith EXTERN int MatOrderingRegisterAll(char*); 3592bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled; 3604bbc92c1SBarry Smith extern FList MatOrderingList; 361d4fbbf0eSBarry Smith 362ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS); 363a2ce50c7SBarry Smith 364ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double); 365ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*); 366ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*); 367a2ce50c7SBarry Smith 368*d91e6319SBarry Smith /*S 369*d91e6319SBarry Smith MatILUInfo - Data based into the matrix ILU factorization routines 3705ef9f2a5SBarry Smith 371*d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_ILUINFO_SIZE 37214822f30SBarry Smith 373*d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of ILU 374*d91e6319SBarry Smith All entries are double precision. 375*d91e6319SBarry Smith 376*d91e6319SBarry Smith Level: developer 377*d91e6319SBarry Smith 378*d91e6319SBarry Smith .seealso: MatILUFactorSymbolic(), MatILUFactor(), MatLUInfo, MatCholeskyInfo 379*d91e6319SBarry Smith 380*d91e6319SBarry Smith S*/ 3815ef9f2a5SBarry Smith typedef struct { 3825ef9f2a5SBarry Smith double levels; /* ILU(levels) */ 3835ef9f2a5SBarry Smith double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/ 3845ef9f2a5SBarry Smith double diagonal_fill; /* force diagonal to fill in if initially not filled */ 38536db0b34SBarry Smith double dt; /* drop tolerance */ 38636db0b34SBarry Smith double dtcol; /* tolerance for pivoting */ 38736db0b34SBarry Smith double dtcount; /* maximum nonzeros to be allowed per row */ 388*d91e6319SBarry Smith double damping; /* scaling of identity added to matrix to prevent zero pivots */ 389*d91e6319SBarry Smith double damp; /* if is 1.0 and factorization fails, damp until successful */ 3905ef9f2a5SBarry Smith } MatILUInfo; 3915ef9f2a5SBarry Smith 392*d91e6319SBarry Smith /*S 393*d91e6319SBarry Smith MatLUInfo - Data based into the matrix LU factorization routines 394*d91e6319SBarry Smith 395*d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_LUINFO_SIZE 396*d91e6319SBarry Smith 397*d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of LU 398*d91e6319SBarry Smith All entries are double precision. 399*d91e6319SBarry Smith 400*d91e6319SBarry Smith Level: developer 401*d91e6319SBarry Smith 402*d91e6319SBarry Smith .seealso: MatLUFactorSymbolic(), MatILUInfo, MatCholeskyInfo 403*d91e6319SBarry Smith 404*d91e6319SBarry Smith S*/ 40514822f30SBarry Smith typedef struct { 40614822f30SBarry Smith double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 40714822f30SBarry Smith double dtcol; /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */ 408*d91e6319SBarry Smith double damping; /* scaling of identity added to matrix to prevent zero pivots */ 409*d91e6319SBarry Smith double damp; /* if this is 1.0 and factorization fails, damp until successful */ 41014822f30SBarry Smith } MatLUInfo; 41114822f30SBarry Smith 412*d91e6319SBarry Smith /*S 413*d91e6319SBarry Smith MatCholeskyInfo - Data based into the matrix Cholesky factorization routines 414*d91e6319SBarry Smith 415*d91e6319SBarry Smith In Fortran these are simply double precision arrays of size MAT_CHOLESKYINFO_SIZE 416*d91e6319SBarry Smith 417*d91e6319SBarry Smith Notes: These are not usually directly used by users, instead use the PC type of Cholesky 418*d91e6319SBarry Smith All entries are double precision. 419*d91e6319SBarry Smith 420*d91e6319SBarry Smith Level: developer 421*d91e6319SBarry Smith 422*d91e6319SBarry Smith .seealso: MatCholeskyFactorSymbolic(), MatLUInfo, MatILUInfo 423*d91e6319SBarry Smith 424*d91e6319SBarry Smith S*/ 425ffa6d0a5SLois Curfman McInnes typedef struct { 426ffa6d0a5SLois Curfman McInnes double fill; /* expected fill; nonzeros in factored matrix/nonzeros in original matrix */ 427*d91e6319SBarry Smith double damping; /* scaling of identity added to matrix to prevent zero pivots */ 428*d91e6319SBarry Smith double damp; /* if this is 1.0 and factorization fails, damp until successful */ 429ffa6d0a5SLois Curfman McInnes } MatCholeskyInfo; 430ffa6d0a5SLois Curfman McInnes 43114822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*); 432ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*); 43314822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*); 434ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*); 435ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*); 43674637425SBarry Smith EXTERN int MatIncompleteCholeskyFactor(Mat,IS,double,int); 437ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*); 438ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *); 439a2ce50c7SBarry Smith 440ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec); 441ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec); 442ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec); 443ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec); 444ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec); 445ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec); 4468ed539a5SBarry Smith 447ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat); 448bb5a7306SBarry Smith 449bb1eb677SSatish Balay /* MatSORType may be bitwise ORd together, so do not change the numbers */ 450*d91e6319SBarry Smith /*E 451*d91e6319SBarry Smith MatSORType - What type of (S)SOR to perform 452bb1eb677SSatish Balay 453*d91e6319SBarry Smith Level: beginner 454*d91e6319SBarry Smith 455*d91e6319SBarry Smith Any additions/changes here MUST also be made in include/finclude/petscmat.h 456*d91e6319SBarry Smith 457*d91e6319SBarry Smith .seealso: MatRelax() 458*d91e6319SBarry Smith E*/ 459ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3, 460ee50ffe9SBarry Smith SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8, 461ee50ffe9SBarry Smith SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16, 46284cb2905SBarry Smith SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType; 463ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec); 4648ed539a5SBarry Smith 465d4fbbf0eSBarry Smith /* 466639f9d9dSBarry Smith These routines are for efficiently computing Jacobians via finite differences. 467639f9d9dSBarry Smith */ 468b12f92e5SBarry Smith 469b12f92e5SBarry Smith typedef char* MatColoringType; 470b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural" 471b12f92e5SBarry Smith #define MATCOLORING_SL "sl" 472b12f92e5SBarry Smith #define MATCOLORING_LF "lf" 473b12f92e5SBarry Smith #define MATCOLORING_ID "id" 474b12f92e5SBarry Smith 475ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*); 476ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *)); 477aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 478f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0) 479b12f92e5SBarry Smith #else 480f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d) 481b12f92e5SBarry Smith #endif 482ca44d042SBarry Smith EXTERN int MatColoringRegisterAll(char *); 4832bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled; 484ca44d042SBarry Smith EXTERN int MatColoringRegisterDestroy(void); 485ca44d042SBarry Smith EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*); 486639f9d9dSBarry Smith 48784cb2905SBarry Smith /* 48884cb2905SBarry Smith Data structures used to compute Jacobian vector products 48984cb2905SBarry Smith efficiently using finite differences. 49084cb2905SBarry Smith */ 4911a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23 492639f9d9dSBarry Smith 493e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring; 494639f9d9dSBarry Smith 495ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *); 496ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring); 497ca44d042SBarry Smith EXTERN int MatFDColoringView(MatFDColoring,Viewer); 498ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*); 499ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double); 500ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int); 501ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*); 502ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring); 503ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *); 504ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *); 505639f9d9dSBarry Smith 506639f9d9dSBarry Smith /* 5070752156aSBarry Smith These routines are for partitioning matrices: currently used only 5083eda8832SBarry Smith for adjacency matrix, MatCreateMPIAdj(). 5090752156aSBarry Smith */ 51091e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25 511ca161407SBarry Smith 51291e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning; 5132aabb6bbSBarry Smith typedef char* MatPartitioningType; 5142aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT "current" 5152aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis" 516ca161407SBarry Smith 517ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*); 518ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType); 519ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat); 520ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*); 521ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*); 522ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning); 5232aabb6bbSBarry Smith 524ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning)); 525aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 526f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0) 5272aabb6bbSBarry Smith #else 528f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d) 5292aabb6bbSBarry Smith #endif 5302aabb6bbSBarry Smith 531ca44d042SBarry Smith EXTERN int MatPartitioningRegisterAll(char *); 5322bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled; 533ca44d042SBarry Smith EXTERN int MatPartitioningRegisterDestroy(void); 5342bad1931SBarry Smith 535ca44d042SBarry Smith EXTERN int MatPartitioningView(MatPartitioning,Viewer); 536ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning); 537ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*); 538ca161407SBarry Smith 539ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning); 5400752156aSBarry Smith 5410752156aSBarry Smith /* 5420a835dfdSSatish Balay If you add entries here you must also add them to finclude/petscmat.h 543d4fbbf0eSBarry Smith */ 5441c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0, 5451c1c02c0SLois Curfman McInnes MATOP_GET_ROW=1, 5461c1c02c0SLois Curfman McInnes MATOP_RESTORE_ROW=2, 5471c1c02c0SLois Curfman McInnes MATOP_MULT=3, 5481c1c02c0SLois Curfman McInnes MATOP_MULT_ADD=4, 5497c922b88SBarry Smith MATOP_MULT_TRANSPOSE=5, 5507c922b88SBarry Smith MATOP_MULT_TRANSPOSE_ADD=6, 5511c1c02c0SLois Curfman McInnes MATOP_SOLVE=7, 5521c1c02c0SLois Curfman McInnes MATOP_SOLVE_ADD=8, 5537c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE=9, 5547c922b88SBarry Smith MATOP_SOLVE_TRANSPOSE_ADD=10, 5551c1c02c0SLois Curfman McInnes MATOP_LUFACTOR=11, 5561c1c02c0SLois Curfman McInnes MATOP_CHOLESKYFACTOR=12, 5571c1c02c0SLois Curfman McInnes MATOP_RELAX=13, 5581c1c02c0SLois Curfman McInnes MATOP_TRANSPOSE=14, 5591c1c02c0SLois Curfman McInnes MATOP_GETINFO=15, 5601c1c02c0SLois Curfman McInnes MATOP_EQUAL=16, 5611c1c02c0SLois Curfman McInnes MATOP_GET_DIAGONAL=17, 5621c1c02c0SLois Curfman McInnes MATOP_DIAGONAL_SCALE=18, 5631c1c02c0SLois Curfman McInnes MATOP_NORM=19, 5641c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_BEGIN=20, 5651c1c02c0SLois Curfman McInnes MATOP_ASSEMBLY_END=21, 5661c1c02c0SLois Curfman McInnes MATOP_COMPRESS=22, 5671c1c02c0SLois Curfman McInnes MATOP_SET_OPTION=23, 5681c1c02c0SLois Curfman McInnes MATOP_ZERO_ENTRIES=24, 5691c1c02c0SLois Curfman McInnes MATOP_ZERO_ROWS=25, 5701c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_SYMBOLIC=26, 5711c1c02c0SLois Curfman McInnes MATOP_LUFACTOR_NUMERIC=27, 5721c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_SYMBOLIC=28, 5731c1c02c0SLois Curfman McInnes MATOP_CHOLESKY_FACTOR_NUMERIC=29, 5741c1c02c0SLois Curfman McInnes MATOP_GET_SIZE=30, 5751c1c02c0SLois Curfman McInnes MATOP_GET_LOCAL_SIZE=31, 5761c1c02c0SLois Curfman McInnes MATOP_GET_OWNERSHIP_RANGE=32, 5771c1c02c0SLois Curfman McInnes MATOP_ILUFACTOR_SYMBOLIC=33, 5781c1c02c0SLois Curfman McInnes MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34, 5791c1c02c0SLois Curfman McInnes MATOP_GET_ARRAY=35, 5801c1c02c0SLois Curfman McInnes MATOP_RESTORE_ARRAY=36, 5817bf97ca4SSatish Balay 582005c665bSBarry Smith MATOP_CONVERT_SAME_TYPE=37, 583005c665bSBarry Smith MATOP_FORWARD_SOLVE=38, 584005c665bSBarry Smith MATOP_BACKWARD_SOLVE=39, 585005c665bSBarry Smith MATOP_ILUFACTOR=40, 586005c665bSBarry Smith MATOP_INCOMPLETECHOLESKYFACTOR=41, 587005c665bSBarry Smith MATOP_AXPY=42, 588005c665bSBarry Smith MATOP_GET_SUBMATRICES=43, 589005c665bSBarry Smith MATOP_INCREASE_OVERLAP=44, 590005c665bSBarry Smith MATOP_GET_VALUES=45, 591005c665bSBarry Smith MATOP_COPY=46, 592005c665bSBarry Smith MATOP_PRINT_HELP=47, 593005c665bSBarry Smith MATOP_SCALE=48, 594005c665bSBarry Smith MATOP_SHIFT=49, 595005c665bSBarry Smith MATOP_DIAGONAL_SHIFT=50, 596005c665bSBarry Smith MATOP_ILUDT_FACTOR=51, 597005c665bSBarry Smith MATOP_GET_BLOCK_SIZE=52, 598005c665bSBarry Smith MATOP_GET_ROW_IJ=53, 599005c665bSBarry Smith MATOP_RESTORE_ROW_IJ=54, 600005c665bSBarry Smith MATOP_GET_COLUMN_IJ=55, 601005c665bSBarry Smith MATOP_RESTORE_COLUMN_IJ=56, 602005c665bSBarry Smith MATOP_FDCOLORING_CREATE=57, 603005c665bSBarry Smith MATOP_COLORING_PATCH=58, 604005c665bSBarry Smith MATOP_SET_UNFACTORED=59, 605005c665bSBarry Smith MATOP_PERMUTE=60, 606005c665bSBarry Smith MATOP_SET_VALUES_BLOCKED=61, 6071c1c02c0SLois Curfman McInnes MATOP_DESTROY=250, 6081c1c02c0SLois Curfman McInnes MATOP_VIEW=251 609fae171e0SBarry Smith } MatOperation; 610ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*); 611ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *); 612ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **); 613273d9f13SBarry Smith EXTERN int MatShellSetContext(Mat,void*); 614112a2221SBarry Smith 61590ace30eSBarry Smith /* 61690ace30eSBarry Smith Codes for matrices stored on disk. By default they are 61790ace30eSBarry Smith stored in a universal format. By changing the format with 618639f9d9dSBarry Smith ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will 61990ace30eSBarry Smith be stored in a way natural for the matrix, for example dense matrices 62090ace30eSBarry Smith would be stored as dense. Matrices stored this way may only be 62190ace30eSBarry Smith read into matrices of the same time. 62290ace30eSBarry Smith */ 62390ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1 62490ace30eSBarry Smith 6253f1d51d7SBarry Smith /* 6263f1d51d7SBarry Smith New matrix classes not yet distributed 6273f1d51d7SBarry Smith */ 6283f1d51d7SBarry Smith /* 6293f1d51d7SBarry Smith MatAIJIndices is a data structure for storing the nonzero location information 6303f1d51d7SBarry Smith for sparse matrices. Several matrices with identical nonzero structure can share 6313f1d51d7SBarry Smith the same MatAIJIndices. 6323f1d51d7SBarry Smith */ 633e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices; 6343f1d51d7SBarry Smith 635ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*); 636ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*); 637ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*); 638ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices); 639ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*); 640ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices); 641ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices); 642ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices); 643ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*); 6443f1d51d7SBarry Smith 645ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*); 646ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*); 647ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*); 6483f1d51d7SBarry Smith 649ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *); 650ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *); 651ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *); 6523f1d51d7SBarry Smith 6536d053be9SSatish Balay EXTERN int MatMPIBAIJSetHashTableFactor(Mat,PetscReal); 654ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *); 65508918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *); 656860d1616SSatish Balay 65774637425SBarry Smith typedef struct _p_MatNullSpace* MatNullSpace; 65874637425SBarry Smith #define MATNULLSPACE_COOKIE PETSC_COOKIE+17 65974637425SBarry Smith 66074637425SBarry Smith EXTERN int MatNullSpaceCreate(MPI_Comm,int,int,Vec *,MatNullSpace*); 66174637425SBarry Smith EXTERN int MatNullSpaceDestroy(MatNullSpace); 66274637425SBarry Smith EXTERN int MatNullSpaceRemove(MatNullSpace,Vec,Vec*); 66374637425SBarry Smith EXTERN int MatNullSpaceAttach(Mat,MatNullSpace); 66474637425SBarry Smith EXTERN int MatNullSpaceTest(MatNullSpace,Mat); 66574637425SBarry Smith 666273d9f13SBarry Smith EXTERN int MatReorderingSeqSBAIJ(Mat A,IS isp); 667273d9f13SBarry Smith EXTERN int MatMPISBAIJSetHashTableFactor(Mat,PetscReal); 668273d9f13SBarry Smith EXTERN int MatSeqSBAIJSetColumnIndices(Mat,int *); 669273d9f13SBarry Smith 6703f1d51d7SBarry Smith 671f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*); 672c4f061fbSSatish Balay EXTERN int MatMAIJRedimension(Mat,int,Mat*); 673c4f061fbSSatish Balay EXTERN int MatMAIJGetAIJ(Mat,Mat*); 674c4f061fbSSatish Balay 675273d9f13SBarry Smith EXTERN int MatMPIAdjSetValues(Mat,int*,int*,int*); 676f069c275SSatish Balay 6772eac72dbSBarry Smith #endif 6782eac72dbSBarry Smith 6792eac72dbSBarry Smith 6809d00d63dSBarry Smith 681