xref: /petsc/include/petscmat.h (revision 06ef90c28aeb33f546abbf963b55caef078f23bf)
1*06ef90c2SBarry Smith /* $Id: petscmat.h,v 1.197 2000/05/26 18:05:09 balay 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*);
33ca44d042SBarry Smith EXTERN int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,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);
145*06ef90c2SBarry 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 /*
1887c922b88SBarry Smith       These three macros MUST be used together. The third one closes the open { of the first one
1897c922b88SBarry Smith */
1907c922b88SBarry Smith #define MatPreallocateInitialize(comm,nrows,ncols,dnz,onz) \
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 
1987c922b88SBarry Smith #define MatPreallocateSet(row,nc,cols,dnz,onz)\
1997c922b88SBarry Smith { int __i; \
2007c922b88SBarry Smith   for (__i=0; __i<nc; __i++) {\
2017c922b88SBarry Smith     if (cols[__i] < __start || cols[__i] >= __end) onz[row - __rstart]++; \
2027c922b88SBarry Smith   }\
2037c922b88SBarry Smith   dnz[row - __rstart] = nc - onz[row - __rstart];\
2047c922b88SBarry Smith }
2057c922b88SBarry Smith 
2067c922b88SBarry Smith #define MatPreallocateFinalize(dnz,onz) __ierr = PetscFree(dnz);CHKERRQ(__ierr);}
2077c922b88SBarry Smith 
2087b80b807SBarry Smith /* Routines unique to particular data structures */
209ca44d042SBarry Smith EXTERN int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
210ca44d042SBarry Smith EXTERN int MatSeqAIJSetColumnIndices(Mat,int *);
211ca44d042SBarry Smith EXTERN int MatSeqBAIJSetColumnIndices(Mat,int *);
212ca44d042SBarry Smith EXTERN int MatCreateSeqAIJWithArrays(MPI_Comm,int,int,int*,int*,Scalar *,Mat*);
2137b80b807SBarry Smith 
214ca44d042SBarry Smith EXTERN int MatStoreValues(Mat);
215ca44d042SBarry Smith EXTERN int MatRetrieveValues(Mat);
2162e8a6d31SBarry Smith 
2177b80b807SBarry Smith /*
2187b80b807SBarry Smith   These routines are not usually accessed directly, rather solving is
2197b80b807SBarry Smith   done through the SLES, KSP and PC interfaces.
2207b80b807SBarry Smith */
2217b80b807SBarry Smith 
222b12f92e5SBarry Smith typedef char* MatOrderingType;
223b12f92e5SBarry Smith #define MATORDERING_NATURAL   "natural"
224b12f92e5SBarry Smith #define MATORDERING_ND        "nd"
225b12f92e5SBarry Smith #define MATORDERING_1WD       "1wd"
226b12f92e5SBarry Smith #define MATORDERING_RCM       "rcm"
227b12f92e5SBarry Smith #define MATORDERING_QMD       "qmd"
228b12f92e5SBarry Smith #define MATORDERING_ROWLENGTH "rowlength"
229b12f92e5SBarry Smith 
230ca44d042SBarry Smith EXTERN int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
231ca44d042SBarry Smith EXTERN int MatOrderingRegister(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
232aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
233f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,0)
234b12f92e5SBarry Smith #else
235f1af5d2fSBarry Smith #define MatOrderingRegisterDynamic(a,b,c,d) MatOrderingRegister(a,b,c,d)
236b12f92e5SBarry Smith #endif
237ca44d042SBarry Smith EXTERN int        MatOrderingRegisterDestroy(void);
238ca44d042SBarry Smith EXTERN int        MatOrderingRegisterAll(char*);
2392bad1931SBarry Smith extern PetscTruth MatOrderingRegisterAllCalled;
240d4fbbf0eSBarry Smith 
241ca44d042SBarry Smith EXTERN int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
242a2ce50c7SBarry Smith 
243ca44d042SBarry Smith EXTERN int MatCholeskyFactor(Mat,IS,double);
244ca44d042SBarry Smith EXTERN int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
245ca44d042SBarry Smith EXTERN int MatCholeskyFactorNumeric(Mat,Mat*);
246a2ce50c7SBarry Smith 
2475ef9f2a5SBarry Smith /*
2485ef9f2a5SBarry Smith    Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic()
24914822f30SBarry Smith    of MatLUFactor() and MatLUFactorSymbolic()
2505ef9f2a5SBarry Smith 
25114822f30SBarry Smith    Note: If any entries are added to this context, be sure
25214822f30SBarry Smith          to adjust MAT_ILUINFO_SIZE in finclude/petscmat.h and/or
25314822f30SBarry Smith          to adjust MAT_LUINFO_SIZE  in finclude/petscmat.h
25414822f30SBarry Smith 
25514822f30SBarry Smith    Note: The integer values below are passed in double to allow easy use from Fortran
2565ef9f2a5SBarry Smith  */
2575ef9f2a5SBarry Smith typedef struct {
2585ef9f2a5SBarry Smith   double     levels;  /* ILU(levels) */
2595ef9f2a5SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
2605ef9f2a5SBarry Smith   double     diagonal_fill;  /* force diagonal to fill in if initially not filled */
26136db0b34SBarry Smith 
26236db0b34SBarry Smith   double     dt;             /* drop tolerance */
26336db0b34SBarry Smith   double     dtcol;          /* tolerance for pivoting */
26436db0b34SBarry Smith   double     dtcount;        /* maximum nonzeros to be allowed per row */
2655ef9f2a5SBarry Smith } MatILUInfo;
2665ef9f2a5SBarry Smith 
26714822f30SBarry Smith typedef struct {
26814822f30SBarry Smith   double     fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
26914822f30SBarry Smith   double     dtcol;   /* tolerance for pivoting; pivot if off_diagonal*dtcol > diagonal */
27014822f30SBarry Smith } MatLUInfo;
27114822f30SBarry Smith 
27214822f30SBarry Smith EXTERN int MatLUFactor(Mat,IS,IS,MatLUInfo*);
273ca44d042SBarry Smith EXTERN int MatILUFactor(Mat,IS,IS,MatILUInfo*);
27414822f30SBarry Smith EXTERN int MatLUFactorSymbolic(Mat,IS,IS,MatLUInfo*,Mat*);
275ca44d042SBarry Smith EXTERN int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
276ca44d042SBarry Smith EXTERN int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
277ca44d042SBarry Smith EXTERN int MatLUFactorNumeric(Mat,Mat*);
278ca44d042SBarry Smith EXTERN int MatILUDTFactor(Mat,MatILUInfo*,IS,IS,Mat *);
279a2ce50c7SBarry Smith 
280ca44d042SBarry Smith EXTERN int MatSolve(Mat,Vec,Vec);
281ca44d042SBarry Smith EXTERN int MatForwardSolve(Mat,Vec,Vec);
282ca44d042SBarry Smith EXTERN int MatBackwardSolve(Mat,Vec,Vec);
283ca44d042SBarry Smith EXTERN int MatSolveAdd(Mat,Vec,Vec,Vec);
284ca44d042SBarry Smith EXTERN int MatSolveTranspose(Mat,Vec,Vec);
285ca44d042SBarry Smith EXTERN int MatSolveTransposeAdd(Mat,Vec,Vec,Vec);
2868ed539a5SBarry Smith 
287ca44d042SBarry Smith EXTERN int MatSetUnfactored(Mat);
288bb5a7306SBarry Smith 
289bb1eb677SSatish Balay /*  MatSORType may be bitwise ORd together, so do not change the numbers */
290bb1eb677SSatish Balay 
291ee50ffe9SBarry Smith typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
292ee50ffe9SBarry Smith               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
293ee50ffe9SBarry Smith               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
29484cb2905SBarry Smith               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
295ca44d042SBarry Smith EXTERN int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
2968ed539a5SBarry Smith 
297d4fbbf0eSBarry Smith /*
298639f9d9dSBarry Smith     These routines are for efficiently computing Jacobians via finite differences.
299639f9d9dSBarry Smith */
300b12f92e5SBarry Smith 
301b12f92e5SBarry Smith typedef char* MatColoringType;
302b12f92e5SBarry Smith #define MATCOLORING_NATURAL "natural"
303b12f92e5SBarry Smith #define MATCOLORING_SL      "sl"
304b12f92e5SBarry Smith #define MATCOLORING_LF      "lf"
305b12f92e5SBarry Smith #define MATCOLORING_ID      "id"
306b12f92e5SBarry Smith 
307ca44d042SBarry Smith EXTERN int MatGetColoring(Mat,MatColoringType,ISColoring*);
308ca44d042SBarry Smith EXTERN int MatColoringRegister(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
309aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
310f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,0)
311b12f92e5SBarry Smith #else
312f1af5d2fSBarry Smith #define MatColoringRegisterDynamic(a,b,c,d) MatColoringRegister(a,b,c,d)
313b12f92e5SBarry Smith #endif
314ca44d042SBarry Smith EXTERN int        MatColoringRegisterAll(char *);
3152bad1931SBarry Smith extern PetscTruth MatColoringRegisterAllCalled;
316ca44d042SBarry Smith EXTERN int        MatColoringRegisterDestroy(void);
317ca44d042SBarry Smith EXTERN int MatColoringPatch(Mat,int,int *,ISColoring*);
318639f9d9dSBarry Smith 
31984cb2905SBarry Smith /*
32084cb2905SBarry Smith     Data structures used to compute Jacobian vector products
32184cb2905SBarry Smith   efficiently using finite differences.
32284cb2905SBarry Smith */
3231a0a18cdSSatish Balay #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
324639f9d9dSBarry Smith 
325e2a1c21fSSatish Balay typedef struct _p_MatFDColoring *MatFDColoring;
326639f9d9dSBarry Smith 
327ca44d042SBarry Smith EXTERN int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
328ca44d042SBarry Smith EXTERN int MatFDColoringDestroy(MatFDColoring);
329ca44d042SBarry Smith EXTERN int MatFDColoringView(MatFDColoring,Viewer);
330ca44d042SBarry Smith EXTERN int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
331ca44d042SBarry Smith EXTERN int MatFDColoringSetParameters(MatFDColoring,double,double);
332ca44d042SBarry Smith EXTERN int MatFDColoringSetFrequency(MatFDColoring,int);
333ca44d042SBarry Smith EXTERN int MatFDColoringGetFrequency(MatFDColoring,int*);
334ca44d042SBarry Smith EXTERN int MatFDColoringSetFromOptions(MatFDColoring);
335ca44d042SBarry Smith EXTERN int MatFDColoringPrintHelp(MatFDColoring);
336ca44d042SBarry Smith EXTERN int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
337ca44d042SBarry Smith EXTERN int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
338639f9d9dSBarry Smith 
339639f9d9dSBarry Smith /*
3400752156aSBarry Smith     These routines are for partitioning matrices: currently used only
3413eda8832SBarry Smith   for adjacency matrix, MatCreateMPIAdj().
3420752156aSBarry Smith */
34391e9ee9fSBarry Smith #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
344ca161407SBarry Smith 
34591e9ee9fSBarry Smith typedef struct _p_MatPartitioning *MatPartitioning;
3462aabb6bbSBarry Smith typedef char* MatPartitioningType;
3472aabb6bbSBarry Smith #define MATPARTITIONING_CURRENT  "current"
3482aabb6bbSBarry Smith #define MATPARTITIONING_PARMETIS "parmetis"
349ca161407SBarry Smith 
350ca44d042SBarry Smith EXTERN int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
351ca44d042SBarry Smith EXTERN int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
352ca44d042SBarry Smith EXTERN int MatPartitioningSetAdjacency(MatPartitioning,Mat);
353ca44d042SBarry Smith EXTERN int MatPartitioningSetVertexWeights(MatPartitioning,int*);
354ca44d042SBarry Smith EXTERN int MatPartitioningApply(MatPartitioning,IS*);
355ca44d042SBarry Smith EXTERN int MatPartitioningDestroy(MatPartitioning);
3562aabb6bbSBarry Smith 
357ca44d042SBarry Smith EXTERN int MatPartitioningRegister(char*,char*,char*,int(*)(MatPartitioning));
358aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
359f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,0)
3602aabb6bbSBarry Smith #else
361f1af5d2fSBarry Smith #define MatPartitioningRegisterDynamic(a,b,c,d) MatPartitioningRegister(a,b,c,d)
3622aabb6bbSBarry Smith #endif
3632aabb6bbSBarry Smith 
364ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterAll(char *);
3652bad1931SBarry Smith extern PetscTruth MatPartitioningRegisterAllCalled;
366ca44d042SBarry Smith EXTERN int        MatPartitioningRegisterDestroy(void);
3672bad1931SBarry Smith 
368ca44d042SBarry Smith EXTERN int MatPartitioningView(MatPartitioning,Viewer);
369ca44d042SBarry Smith EXTERN int MatPartitioningSetFromOptions(MatPartitioning);
370ca44d042SBarry Smith EXTERN int MatPartitioningPrintHelp(MatPartitioning);
371ca44d042SBarry Smith EXTERN int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
372ca161407SBarry Smith 
373ca44d042SBarry Smith EXTERN int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
3740752156aSBarry Smith 
3750752156aSBarry Smith /*
3760a835dfdSSatish Balay     If you add entries here you must also add them to finclude/petscmat.h
377d4fbbf0eSBarry Smith */
3781c1c02c0SLois Curfman McInnes typedef enum { MATOP_SET_VALUES=0,
3791c1c02c0SLois Curfman McInnes                MATOP_GET_ROW=1,
3801c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ROW=2,
3811c1c02c0SLois Curfman McInnes                MATOP_MULT=3,
3821c1c02c0SLois Curfman McInnes                MATOP_MULT_ADD=4,
3837c922b88SBarry Smith                MATOP_MULT_TRANSPOSE=5,
3847c922b88SBarry Smith                MATOP_MULT_TRANSPOSE_ADD=6,
3851c1c02c0SLois Curfman McInnes                MATOP_SOLVE=7,
3861c1c02c0SLois Curfman McInnes                MATOP_SOLVE_ADD=8,
3877c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE=9,
3887c922b88SBarry Smith                MATOP_SOLVE_TRANSPOSE_ADD=10,
3891c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR=11,
3901c1c02c0SLois Curfman McInnes                MATOP_CHOLESKYFACTOR=12,
3911c1c02c0SLois Curfman McInnes                MATOP_RELAX=13,
3921c1c02c0SLois Curfman McInnes                MATOP_TRANSPOSE=14,
3931c1c02c0SLois Curfman McInnes                MATOP_GETINFO=15,
3941c1c02c0SLois Curfman McInnes                MATOP_EQUAL=16,
3951c1c02c0SLois Curfman McInnes                MATOP_GET_DIAGONAL=17,
3961c1c02c0SLois Curfman McInnes                MATOP_DIAGONAL_SCALE=18,
3971c1c02c0SLois Curfman McInnes                MATOP_NORM=19,
3981c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_BEGIN=20,
3991c1c02c0SLois Curfman McInnes                MATOP_ASSEMBLY_END=21,
4001c1c02c0SLois Curfman McInnes                MATOP_COMPRESS=22,
4011c1c02c0SLois Curfman McInnes                MATOP_SET_OPTION=23,
4021c1c02c0SLois Curfman McInnes                MATOP_ZERO_ENTRIES=24,
4031c1c02c0SLois Curfman McInnes                MATOP_ZERO_ROWS=25,
4041c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_SYMBOLIC=26,
4051c1c02c0SLois Curfman McInnes                MATOP_LUFACTOR_NUMERIC=27,
4061c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
4071c1c02c0SLois Curfman McInnes                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
4081c1c02c0SLois Curfman McInnes                MATOP_GET_SIZE=30,
4091c1c02c0SLois Curfman McInnes                MATOP_GET_LOCAL_SIZE=31,
4101c1c02c0SLois Curfman McInnes                MATOP_GET_OWNERSHIP_RANGE=32,
4111c1c02c0SLois Curfman McInnes                MATOP_ILUFACTOR_SYMBOLIC=33,
4121c1c02c0SLois Curfman McInnes                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
4131c1c02c0SLois Curfman McInnes                MATOP_GET_ARRAY=35,
4141c1c02c0SLois Curfman McInnes                MATOP_RESTORE_ARRAY=36,
4157bf97ca4SSatish Balay 
416005c665bSBarry Smith                MATOP_CONVERT_SAME_TYPE=37,
417005c665bSBarry Smith                MATOP_FORWARD_SOLVE=38,
418005c665bSBarry Smith                MATOP_BACKWARD_SOLVE=39,
419005c665bSBarry Smith                MATOP_ILUFACTOR=40,
420005c665bSBarry Smith                MATOP_INCOMPLETECHOLESKYFACTOR=41,
421005c665bSBarry Smith                MATOP_AXPY=42,
422005c665bSBarry Smith                MATOP_GET_SUBMATRICES=43,
423005c665bSBarry Smith                MATOP_INCREASE_OVERLAP=44,
424005c665bSBarry Smith                MATOP_GET_VALUES=45,
425005c665bSBarry Smith                MATOP_COPY=46,
426005c665bSBarry Smith                MATOP_PRINT_HELP=47,
427005c665bSBarry Smith                MATOP_SCALE=48,
428005c665bSBarry Smith                MATOP_SHIFT=49,
429005c665bSBarry Smith                MATOP_DIAGONAL_SHIFT=50,
430005c665bSBarry Smith                MATOP_ILUDT_FACTOR=51,
431005c665bSBarry Smith                MATOP_GET_BLOCK_SIZE=52,
432005c665bSBarry Smith                MATOP_GET_ROW_IJ=53,
433005c665bSBarry Smith                MATOP_RESTORE_ROW_IJ=54,
434005c665bSBarry Smith                MATOP_GET_COLUMN_IJ=55,
435005c665bSBarry Smith                MATOP_RESTORE_COLUMN_IJ=56,
436005c665bSBarry Smith                MATOP_FDCOLORING_CREATE=57,
437005c665bSBarry Smith                MATOP_COLORING_PATCH=58,
438005c665bSBarry Smith                MATOP_SET_UNFACTORED=59,
439005c665bSBarry Smith                MATOP_PERMUTE=60,
440005c665bSBarry Smith                MATOP_SET_VALUES_BLOCKED=61,
4411c1c02c0SLois Curfman McInnes                MATOP_DESTROY=250,
4421c1c02c0SLois Curfman McInnes                MATOP_VIEW=251
443fae171e0SBarry Smith              } MatOperation;
444ca44d042SBarry Smith EXTERN int MatHasOperation(Mat,MatOperation,PetscTruth*);
445ca44d042SBarry Smith EXTERN int MatShellSetOperation(Mat,MatOperation,void *);
446ca44d042SBarry Smith EXTERN int MatShellGetOperation(Mat,MatOperation,void **);
447112a2221SBarry Smith 
44890ace30eSBarry Smith /*
44990ace30eSBarry Smith    Codes for matrices stored on disk. By default they are
45090ace30eSBarry Smith  stored in a universal format. By changing the format with
451639f9d9dSBarry Smith  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
45290ace30eSBarry Smith  be stored in a way natural for the matrix, for example dense matrices
45390ace30eSBarry Smith  would be stored as dense. Matrices stored this way may only be
45490ace30eSBarry Smith  read into matrices of the same time.
45590ace30eSBarry Smith */
45690ace30eSBarry Smith #define MATRIX_BINARY_FORMAT_DENSE -1
45790ace30eSBarry Smith 
4583f1d51d7SBarry Smith /*
4593f1d51d7SBarry Smith      New matrix classes not yet distributed
4603f1d51d7SBarry Smith */
4613f1d51d7SBarry Smith /*
4623f1d51d7SBarry Smith     MatAIJIndices is a data structure for storing the nonzero location information
4633f1d51d7SBarry Smith   for sparse matrices. Several matrices with identical nonzero structure can share
4643f1d51d7SBarry Smith   the same MatAIJIndices.
4653f1d51d7SBarry Smith */
466e2a1c21fSSatish Balay typedef struct _p_MatAIJIndices* MatAIJIndices;
4673f1d51d7SBarry Smith 
468ca44d042SBarry Smith EXTERN int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
469ca44d042SBarry Smith EXTERN int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
470ca44d042SBarry Smith EXTERN int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
471ca44d042SBarry Smith EXTERN int MatDestroyAIJIndices(MatAIJIndices);
472ca44d042SBarry Smith EXTERN int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
473ca44d042SBarry Smith EXTERN int MatValidateAIJIndices(int,MatAIJIndices);
474ca44d042SBarry Smith EXTERN int MatShiftAIJIndices(MatAIJIndices);
475ca44d042SBarry Smith EXTERN int MatShrinkAIJIndices(MatAIJIndices);
476ca44d042SBarry Smith EXTERN int MatTransposeAIJIndices(MatAIJIndices,MatAIJIndices*);
4773f1d51d7SBarry Smith 
478ca44d042SBarry Smith EXTERN int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
479ca44d042SBarry Smith EXTERN int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
480ca44d042SBarry Smith EXTERN int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
4813f1d51d7SBarry Smith 
482ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
483ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
484ca44d042SBarry Smith EXTERN int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
4853f1d51d7SBarry Smith 
486ca44d042SBarry Smith EXTERN int MatMPIBAIJSetHashTableFactor(Mat,double);
487ca44d042SBarry Smith EXTERN int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
48808918a0eSSatish Balay EXTERN int MatMPIRowbsGetColor(Mat,ISColoring *);
489860d1616SSatish Balay 
490f069c275SSatish Balay typedef char* MATType;
491f069c275SSatish Balay EXTERN int MATCreate(MPI_Comm,int,int,int,int,Mat*);
492f069c275SSatish Balay EXTERN int MatSetType(Mat,MATType);
493f069c275SSatish Balay EXTERN int MatRegisterAll(char*);
494f069c275SSatish Balay EXTERN int MatRegister(char*,char*,char*,int(*)(Mat));
495f069c275SSatish Balay #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
496f069c275SSatish Balay #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,0)
497f069c275SSatish Balay #else
498f069c275SSatish Balay #define MatRegisterDynamic(a,b,c,d) MatRegister(a,b,c,d)
499f069c275SSatish Balay #endif
5003f1d51d7SBarry Smith 
501f069c275SSatish Balay EXTERN int MatCreateMAIJ(Mat,int,Mat*);
50292759ec0SBarry Smith EXTERN int MatSetTypeFromOptions(Mat);
503f069c275SSatish Balay 
504*06ef90c2SBarry Smith #define MATMAIJ "maij"
5052eac72dbSBarry Smith #endif
5062eac72dbSBarry Smith 
5072eac72dbSBarry Smith 
5089d00d63dSBarry Smith 
509