xref: /petsc/include/petscmat.h (revision ac2a4f0d24b3b6a4ee93edbcad41f4bb9e923944)
1 /* $Id: mat.h,v 1.180 1999/06/15 13:48:08 balay Exp bsmith $ */
2 /*
3      Include file for the matrix component of PETSc
4 */
5 #ifndef __MAT_H
6 #define __MAT_H
7 #include "vec.h"
8 
9 #define MAT_COOKIE         PETSC_COOKIE+5
10 
11 typedef struct _p_Mat*           Mat;
12 
13 #define MAX_MATRIX_TYPES 14
14 /*
15    The default matrix data storage formats and routines to create them.
16 
17    MATLASTTYPE is "end-of-list" marker that can be used to check that
18    MAX_MATRIX_TYPES is large enough.  The rule is
19    MAX_MATRIX_TYPES >= MATLASTTYPE .
20 
21    To do: add a test program that checks the consistency of these values.
22 */
23 typedef enum { MATSAME=-1,  MATSEQDENSE, MATSEQAIJ,   MATMPIAIJ,   MATSHELL,
24                MATMPIROWBS, MATSEQBDIAG, MATMPIBDIAG, MATMPIDENSE, MATSEQBAIJ,
25                MATMPIBAIJ,  MATMPICSN,   MATSEQCSN,   MATSEQADJ,   MATMPIADJ,
26                MATLASTTYPE } MatType;
27 
28 extern int MatCreate(MPI_Comm,int,int,int,int,Mat*);
29 extern int MatCreateSeqDense(MPI_Comm,int,int,Scalar*,Mat*);
30 extern int MatCreateMPIDense(MPI_Comm,int,int,int,int,Scalar*,Mat*);
31 extern int MatCreateSeqAIJ(MPI_Comm,int,int,int,int*,Mat*);
32 extern int MatCreateMPIAIJ(MPI_Comm,int,int,int,int,int,int*,int,int*,Mat*);
33 extern int MatCreateMPIRowbs(MPI_Comm,int,int,int,int*,void*,Mat*);
34 extern int MatCreateSeqBDiag(MPI_Comm,int,int,int,int,int*,Scalar**,Mat*);
35 extern int MatCreateMPIBDiag(MPI_Comm,int,int,int,int,int,int*,Scalar**,Mat*);
36 extern int MatCreateSeqBAIJ(MPI_Comm,int,int,int,int,int*,Mat*);
37 extern int MatCreateMPIBAIJ(MPI_Comm,int,int,int,int,int,int,int*,int,int*,Mat*);
38 extern int MatCreateSeqAdj(MPI_Comm,int,int,int*,int*,Mat *);
39 extern int MatCreateMPIAdj(MPI_Comm,int,int,int*,int*,Mat*);
40 
41 extern int MatDestroy(Mat);
42 
43 extern int MatCreateShell(MPI_Comm,int,int,int,int,void *,Mat*);
44 extern int MatShellGetContext(Mat,void **);
45 
46 extern int MatPrintHelp(Mat);
47 extern int MatGetMaps(Mat,Map*,Map*);
48 
49 /* ------------------------------------------------------------*/
50 extern int MatSetValues(Mat,int,int*,int,int*,Scalar*,InsertMode);
51 extern int MatSetValuesBlocked(Mat,int,int*,int,int*,Scalar*,InsertMode);
52 
53 typedef enum {MAT_FLUSH_ASSEMBLY=1,MAT_FINAL_ASSEMBLY=0} MatAssemblyType;
54 extern int MatAssemblyBegin(Mat,MatAssemblyType);
55 extern int MatAssemblyEnd(Mat,MatAssemblyType);
56 extern int MatAssembled(Mat,PetscTruth*);
57 
58 #define MatSetValue(v,i,j,va,mode) \
59 {int _ierr,_row = i,_col = j; Scalar _va = va; \
60   _ierr = MatSetValues(v,1,&_row,1,&_col,&_va,mode);CHKERRQ(_ierr); \
61 }
62 #define MatGetValue(v,i,j,va) \
63 {int _ierr,_row = i,_col = j; \
64   _ierr = MatGetValues(v,1,&_row,1,&_col,&va);CHKERRQ(_ierr); \
65 }
66 /*
67    Any additions/changes here MUST also be made in include/finclude/mat.h
68 */
69 typedef enum {MAT_ROW_ORIENTED=1,MAT_COLUMN_ORIENTED=2,MAT_ROWS_SORTED=4,
70               MAT_COLUMNS_SORTED=8,MAT_NO_NEW_NONZERO_LOCATIONS=16,
71               MAT_YES_NEW_NONZERO_LOCATIONS=32,MAT_SYMMETRIC=64,
72               MAT_STRUCTURALLY_SYMMETRIC=65,MAT_NO_NEW_DIAGONALS=66,
73               MAT_YES_NEW_DIAGONALS=67,MAT_INODE_LIMIT_1=68,MAT_INODE_LIMIT_2=69,
74               MAT_INODE_LIMIT_3=70,MAT_INODE_LIMIT_4=71,MAT_INODE_LIMIT_5=72,
75               MAT_IGNORE_OFF_PROC_ENTRIES=73,MAT_ROWS_UNSORTED=74,
76               MAT_COLUMNS_UNSORTED=75,MAT_NEW_NONZERO_LOCATION_ERR=76,
77               MAT_NEW_NONZERO_ALLOCATION_ERR=77,MAT_USE_HASH_TABLE=78} MatOption;
78 extern int MatSetOption(Mat,MatOption);
79 extern int MatGetType(Mat,MatType*,char**);
80 extern int MatGetTypeFromOptions(MPI_Comm,char*,MatType*,PetscTruth*);
81 
82 extern int MatGetValues(Mat,int,int*,int,int*,Scalar*);
83 extern int MatGetRow(Mat,int,int *,int **,Scalar**);
84 extern int MatRestoreRow(Mat,int,int *,int **,Scalar**);
85 extern int MatGetColumn(Mat,int,int *,int **,Scalar**);
86 extern int MatRestoreColumn(Mat,int,int *,int **,Scalar**);
87 extern int MatGetColumnVector(Mat,Vec,int);
88 extern int MatGetArray(Mat,Scalar **);
89 extern int MatRestoreArray(Mat,Scalar **);
90 extern int MatGetBlockSize(Mat,int *);
91 
92 extern int MatMult(Mat,Vec,Vec);
93 extern int MatMultAdd(Mat,Vec,Vec,Vec);
94 extern int MatMultTrans(Mat,Vec,Vec);
95 extern int MatMultTransAdd(Mat,Vec,Vec,Vec);
96 
97 typedef enum {MAT_DO_NOT_COPY_VALUES, MAT_COPY_VALUES} MatDuplicateOption;
98 
99 extern int MatConvert(Mat,MatType,Mat*);
100 extern int MatDuplicate(Mat,MatDuplicateOption,Mat*);
101 extern int MatConvertRegister(MatType,MatType,int (*)(Mat,MatType,Mat*));
102 extern int MatConvertRegisterAll(void);
103 
104 typedef enum {SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER} MatStructure;
105 
106 extern int MatCopy(Mat,Mat,MatStructure);
107 extern int MatView(Mat,Viewer);
108 extern int MatLoad(Viewer,MatType,Mat*);
109 extern int MatLoadRegister(MatType,int (*)(Viewer,MatType,Mat*));
110 extern int MatLoadRegisterAll(void);
111 
112 extern int MatGetRowIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
113 extern int MatRestoreRowIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
114 extern int MatGetColumnIJ(Mat,int,PetscTruth,int*,int **,int **,PetscTruth *);
115 extern int MatRestoreColumnIJ(Mat,int,PetscTruth,int *,int **,int **,PetscTruth *);
116 
117 /*
118    Context of matrix information, used with MatGetInfo()
119    Note: If any entries are added to this context, be sure
120          to adjust MAT_INFO_SIZE in finclude/mat.h
121  */
122 typedef struct {
123   PLogDouble rows_global, columns_global;         /* number of global rows and columns */
124   PLogDouble rows_local, columns_local;           /* number of local rows and columns */
125   PLogDouble block_size;                          /* block size */
126   PLogDouble nz_allocated, nz_used, nz_unneeded;  /* number of nonzeros */
127   PLogDouble memory;                              /* memory allocated */
128   PLogDouble assemblies;                          /* number of matrix assemblies */
129   PLogDouble mallocs;                             /* number of mallocs during MatSetValues() */
130   PLogDouble fill_ratio_given, fill_ratio_needed; /* fill ratio for LU/ILU */
131   PLogDouble factor_mallocs;                      /* number of mallocs during factorization */
132 } MatInfo;
133 
134 typedef enum {MAT_LOCAL=1,MAT_GLOBAL_MAX=2,MAT_GLOBAL_SUM=3} MatInfoType;
135 extern int MatGetInfo(Mat,MatInfoType,MatInfo*);
136 extern int MatValid(Mat,PetscTruth*);
137 extern int MatGetDiagonal(Mat,Vec);
138 extern int MatTranspose(Mat,Mat*);
139 extern int MatPermute(Mat,IS,IS,Mat *);
140 extern int MatDiagonalScale(Mat,Vec,Vec);
141 extern int MatDiagonalShift(Mat,Vec);
142 extern int MatEqual(Mat,Mat, PetscTruth*);
143 
144 extern int MatNorm(Mat,NormType,double *);
145 extern int MatZeroEntries(Mat);
146 extern int MatZeroRows(Mat,IS,Scalar*);
147 extern int MatZeroColumns(Mat,IS,Scalar*);
148 
149 extern int MatUseScaledForm(Mat,PetscTruth);
150 extern int MatScaleSystem(Mat,Vec,Vec);
151 extern int MatUnScaleSystem(Mat,Vec,Vec);
152 
153 extern int MatGetSize(Mat,int*,int*);
154 extern int MatGetLocalSize(Mat,int*,int*);
155 extern int MatGetOwnershipRange(Mat,int*,int*);
156 
157 typedef enum {MAT_INITIAL_MATRIX, MAT_REUSE_MATRIX} MatReuse;
158 extern int MatGetSubMatrices(Mat,int,IS *,IS *,MatReuse,Mat **);
159 extern int MatDestroyMatrices(int, Mat **);
160 extern int MatGetSubMatrix(Mat,IS,IS,int,MatReuse,Mat *);
161 
162 extern int MatIncreaseOverlap(Mat,int,IS *,int);
163 
164 extern int MatAXPY(Scalar *,Mat,Mat);
165 extern int MatAYPX(Scalar *,Mat,Mat);
166 extern int MatCompress(Mat);
167 
168 extern int MatScale(Scalar *,Mat);
169 extern int MatShift(Scalar *,Mat);
170 
171 extern int MatSetLocalToGlobalMapping(Mat, ISLocalToGlobalMapping);
172 extern int MatSetLocalToGlobalMappingBlock(Mat, ISLocalToGlobalMapping);
173 extern int MatZeroRowsLocal(Mat,IS,Scalar*);
174 extern int MatSetValuesLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
175 extern int MatSetValuesBlockedLocal(Mat,int,int*,int,int*,Scalar*,InsertMode);
176 
177 extern int MatSetStashInitialSize(Mat,int, int);
178 
179 /* Routines unique to particular data structures */
180 extern int MatBDiagGetData(Mat,int*,int*,int**,int**,Scalar***);
181 extern int MatSeqAIJSetColumnIndices(Mat,int *);
182 extern int MatSeqBAIJSetColumnIndices(Mat,int *);
183 
184 extern int MatStoreValues(Mat);
185 extern int MatRetrieveValues(Mat);
186 
187 /*
188   These routines are not usually accessed directly, rather solving is
189   done through the SLES, KSP and PC interfaces.
190 */
191 
192 typedef char* MatOrderingType;
193 #define MATORDERING_NATURAL   "natural"
194 #define MATORDERING_ND        "nd"
195 #define MATORDERING_1WD       "1wd"
196 #define MATORDERING_RCM       "rcm"
197 #define MATORDERING_QMD       "qmd"
198 #define MATORDERING_ROWLENGTH "rowlength"
199 
200 extern int MatGetOrdering(Mat,MatOrderingType,IS*,IS*);
201 extern int MatOrderingRegister_Private(char*,char*,char*,int(*)(Mat,MatOrderingType,IS*,IS*));
202 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
203 #define MatOrderingRegister(a,b,c,d) MatOrderingRegister_Private(a,b,c,0)
204 #else
205 #define MatOrderingRegister(a,b,c,d) MatOrderingRegister_Private(a,b,c,d)
206 #endif
207 extern int MatOrderingRegisterDestroy(void);
208 extern int MatOrderingRegisterAll(char*);
209 extern int MatOrderingRegisterAllCalled;
210 
211 extern int MatReorderForNonzeroDiagonal(Mat,double,IS,IS);
212 
213 extern int MatCholeskyFactor(Mat,IS,double);
214 extern int MatCholeskyFactorSymbolic(Mat,IS,double,Mat*);
215 extern int MatCholeskyFactorNumeric(Mat,Mat*);
216 
217 /*
218    Context of matrix information, used with MatILUFactor() and MatILUFactorSymbolic()
219    Note: If any entries are added to this context, be sure
220          to adjust MAT_ILUINFO_SIZE in finclude/mat.h
221 
222    Note: The integer values below are passed in double to allow easy use from
223          Fortran
224  */
225 typedef struct {
226   double levels;  /* ILU(levels) */
227   double fill;    /* expected fill; nonzeros in factored matrix/nonzeros in original matrix*/
228   double diagonal_fill;  /* force diagonal to fill in if initially not filled */
229 } MatILUInfo;
230 
231 extern int MatLUFactor(Mat,IS,IS,double);
232 extern int MatILUFactor(Mat,IS,IS,MatILUInfo*);
233 extern int MatLUFactorSymbolic(Mat,IS,IS,double,Mat*);
234 extern int MatILUFactorSymbolic(Mat,IS,IS,MatILUInfo*,Mat*);
235 extern int MatIncompleteCholeskyFactorSymbolic(Mat,IS,double,int,Mat*);
236 extern int MatLUFactorNumeric(Mat,Mat*);
237 extern int MatILUDTFactor(Mat,double,int,IS,IS,Mat *);
238 
239 extern int MatSolve(Mat,Vec,Vec);
240 extern int MatForwardSolve(Mat,Vec,Vec);
241 extern int MatBackwardSolve(Mat,Vec,Vec);
242 extern int MatSolveAdd(Mat,Vec,Vec,Vec);
243 extern int MatSolveTrans(Mat,Vec,Vec);
244 extern int MatSolveTransAdd(Mat,Vec,Vec,Vec);
245 
246 extern int MatSetUnfactored(Mat);
247 
248 /*  MatSORType may be bitwise ORd together, so do not change the numbers */
249 
250 typedef enum {SOR_FORWARD_SWEEP=1,SOR_BACKWARD_SWEEP=2,SOR_SYMMETRIC_SWEEP=3,
251               SOR_LOCAL_FORWARD_SWEEP=4,SOR_LOCAL_BACKWARD_SWEEP=8,
252               SOR_LOCAL_SYMMETRIC_SWEEP=12,SOR_ZERO_INITIAL_GUESS=16,
253               SOR_EISENSTAT=32,SOR_APPLY_UPPER=64,SOR_APPLY_LOWER=128} MatSORType;
254 extern int MatRelax(Mat,Vec,double,MatSORType,double,int,Vec);
255 
256 /*
257     These routines are for efficiently computing Jacobians via finite differences.
258 */
259 
260 typedef char* MatColoringType;
261 #define MATCOLORING_NATURAL "natural"
262 #define MATCOLORING_SL      "sl"
263 #define MATCOLORING_LF      "lf"
264 #define MATCOLORING_ID      "id"
265 
266 extern int MatGetColoring(Mat,MatColoringType,ISColoring*);
267 extern int MatColoringRegister_Private(char*,char*,char*,int(*)(Mat,MatColoringType,ISColoring *));
268 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
269 #define MatColoringRegister(a,b,c,d) MatColoringRegister_Private(a,b,c,0)
270 #else
271 #define MatColoringRegister(a,b,c,d) MatColoringRegister_Private(a,b,c,d)
272 #endif
273 extern int MatColoringRegisterAll(char *);
274 extern int MatColoringRegisterAllCalled;
275 extern int MatColoringRegisterDestroy(void);
276 extern int MatColoringPatch(Mat,int,int *,ISColoring*);
277 
278 /*
279     Data structures used to compute Jacobian vector products
280   efficiently using finite differences.
281 */
282 #define MAT_FDCOLORING_COOKIE PETSC_COOKIE + 23
283 
284 typedef struct _p_MatFDColoring *MatFDColoring;
285 
286 extern int MatFDColoringCreate(Mat,ISColoring,MatFDColoring *);
287 extern int MatFDColoringDestroy(MatFDColoring);
288 extern int MatFDColoringView(MatFDColoring,Viewer);
289 extern int MatFDColoringSetFunction(MatFDColoring,int (*)(void),void*);
290 extern int MatFDColoringSetParameters(MatFDColoring,double,double);
291 extern int MatFDColoringSetFrequency(MatFDColoring,int);
292 extern int MatFDColoringGetFrequency(MatFDColoring,int*);
293 extern int MatFDColoringSetFromOptions(MatFDColoring);
294 extern int MatFDColoringPrintHelp(MatFDColoring);
295 extern int MatFDColoringApply(Mat,MatFDColoring,Vec,MatStructure*,void *);
296 extern int MatFDColoringApplyTS(Mat,MatFDColoring,double,Vec,MatStructure*,void *);
297 
298 /*
299     These routines are for partitioning matrices: currently used only
300   for adjacency matrix, MatCreateSeqAdj() or MatCreateMPIAdj().
301 */
302 #define MATPARTITIONING_COOKIE PETSC_COOKIE + 25
303 
304 typedef struct _p_MatPartitioning *MatPartitioning;
305 typedef char* MatPartitioningType;
306 #define MATPARTITIONING_CURRENT  "current"
307 #define MATPARTITIONING_PARMETIS "parmetis"
308 
309 extern int MatPartitioningCreate(MPI_Comm,MatPartitioning*);
310 extern int MatPartitioningSetType(MatPartitioning,MatPartitioningType);
311 extern int MatPartitioningSetAdjacency(MatPartitioning,Mat);
312 extern int MatPartitioningSetVertexWeights(MatPartitioning,double*);
313 extern int MatPartitioningApply(MatPartitioning,IS*);
314 extern int MatPartitioningDestroy(MatPartitioning);
315 
316 extern int MatPartitioningRegister_Private(char*,char*,char*,int(*)(MatPartitioning));
317 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
318 #define MatPartitioningRegister(a,b,c,d) MatPartitioningRegister_Private(a,b,c,0)
319 #else
320 #define MatPartitioningRegister(a,b,c,d) MatPartitioningRegister_Private(a,b,c,d)
321 #endif
322 
323 extern int MatPartitioningRegisterAll(char *);
324 extern int MatPartitioningRegisterAllCalled;
325 extern int MatPartitioningRegisterDestroy(void);
326 extern int MatPartitioningView(MatPartitioning,Viewer);
327 extern int MatPartitioningSetFromOptions(MatPartitioning);
328 extern int MatPartitioningPrintHelp(MatPartitioning);
329 extern int MatPartitioningGetType(MatPartitioning,MatPartitioningType*);
330 
331 extern int MatPartitioningParmetisSetCoarseSequential(MatPartitioning);
332 
333 /*
334     If you add entries here you must also add them to finclude/mat.h
335 */
336 typedef enum { MATOP_SET_VALUES=0,
337                MATOP_GET_ROW=1,
338                MATOP_RESTORE_ROW=2,
339                MATOP_MULT=3,
340                MATOP_MULT_ADD=4,
341                MATOP_MULT_TRANS=5,
342                MATOP_MULT_TRANS_ADD=6,
343                MATOP_SOLVE=7,
344                MATOP_SOLVE_ADD=8,
345                MATOP_SOLVE_TRANS=9,
346                MATOP_SOLVE_TRANS_ADD=10,
347                MATOP_LUFACTOR=11,
348                MATOP_CHOLESKYFACTOR=12,
349                MATOP_RELAX=13,
350                MATOP_TRANSPOSE=14,
351                MATOP_GETINFO=15,
352                MATOP_EQUAL=16,
353                MATOP_GET_DIAGONAL=17,
354                MATOP_DIAGONAL_SCALE=18,
355                MATOP_NORM=19,
356                MATOP_ASSEMBLY_BEGIN=20,
357                MATOP_ASSEMBLY_END=21,
358                MATOP_COMPRESS=22,
359                MATOP_SET_OPTION=23,
360                MATOP_ZERO_ENTRIES=24,
361                MATOP_ZERO_ROWS=25,
362                MATOP_LUFACTOR_SYMBOLIC=26,
363                MATOP_LUFACTOR_NUMERIC=27,
364                MATOP_CHOLESKY_FACTOR_SYMBOLIC=28,
365                MATOP_CHOLESKY_FACTOR_NUMERIC=29,
366                MATOP_GET_SIZE=30,
367                MATOP_GET_LOCAL_SIZE=31,
368                MATOP_GET_OWNERSHIP_RANGE=32,
369                MATOP_ILUFACTOR_SYMBOLIC=33,
370                MATOP_INCOMPLETECHOLESKYFACTOR_SYMBOLIC=34,
371                MATOP_GET_ARRAY=35,
372                MATOP_RESTORE_ARRAY=36,
373 
374                MATOP_CONVERT_SAME_TYPE=37,
375                MATOP_FORWARD_SOLVE=38,
376                MATOP_BACKWARD_SOLVE=39,
377                MATOP_ILUFACTOR=40,
378                MATOP_INCOMPLETECHOLESKYFACTOR=41,
379                MATOP_AXPY=42,
380                MATOP_GET_SUBMATRICES=43,
381                MATOP_INCREASE_OVERLAP=44,
382                MATOP_GET_VALUES=45,
383                MATOP_COPY=46,
384                MATOP_PRINT_HELP=47,
385                MATOP_SCALE=48,
386                MATOP_SHIFT=49,
387                MATOP_DIAGONAL_SHIFT=50,
388                MATOP_ILUDT_FACTOR=51,
389                MATOP_GET_BLOCK_SIZE=52,
390                MATOP_GET_ROW_IJ=53,
391                MATOP_RESTORE_ROW_IJ=54,
392                MATOP_GET_COLUMN_IJ=55,
393                MATOP_RESTORE_COLUMN_IJ=56,
394                MATOP_FDCOLORING_CREATE=57,
395                MATOP_COLORING_PATCH=58,
396                MATOP_SET_UNFACTORED=59,
397                MATOP_PERMUTE=60,
398                MATOP_SET_VALUES_BLOCKED=61,
399                MATOP_DESTROY=250,
400                MATOP_VIEW=251
401              } MatOperation;
402 extern int MatHasOperation(Mat,MatOperation,PetscTruth*);
403 extern int MatShellSetOperation(Mat,MatOperation,void *);
404 extern int MatShellGetOperation(Mat,MatOperation,void **);
405 
406 /*
407    Codes for matrices stored on disk. By default they are
408  stored in a universal format. By changing the format with
409  ViewerSetFormat(viewer,VIEWER_FORMAT_BINARY_NATIVE); the matrices will
410  be stored in a way natural for the matrix, for example dense matrices
411  would be stored as dense. Matrices stored this way may only be
412  read into matrices of the same time.
413 */
414 #define MATRIX_BINARY_FORMAT_DENSE -1
415 
416 /*
417      New matrix classes not yet distributed
418 */
419 /*
420     MatAIJIndices is a data structure for storing the nonzero location information
421   for sparse matrices. Several matrices with identical nonzero structure can share
422   the same MatAIJIndices.
423 */
424 typedef struct _p_MatAIJIndices* MatAIJIndices;
425 
426 extern int MatCreateAIJIndices(int,int,int*,int*,PetscTruth,MatAIJIndices*);
427 extern int MatCreateAIJIndicesEmpty(int,int,int*,PetscTruth,MatAIJIndices*);
428 extern int MatAttachAIJIndices(MatAIJIndices,MatAIJIndices*);
429 extern int MatDestroyAIJIndices(MatAIJIndices);
430 extern int MatCopyAIJIndices(MatAIJIndices,MatAIJIndices*);
431 extern int MatValidateAIJIndices(int,MatAIJIndices);
432 extern int MatShiftAIJIndices(MatAIJIndices);
433 extern int MatShrinkAIJIndices(MatAIJIndices);
434 extern int MatTransposeAIJIndices(MatAIJIndices, MatAIJIndices*);
435 
436 extern int MatCreateSeqCSN(MPI_Comm,int,int,int*,int,Mat*);
437 extern int MatCreateSeqCSN_Single(MPI_Comm,int,int,int*,int,Mat*);
438 extern int MatCreateSeqCSNWithPrecision(MPI_Comm,int,int,int*,int,ScalarPrecision,Mat*);
439 
440 extern int MatCreateSeqCSNIndices(MPI_Comm,MatAIJIndices,int,Mat *);
441 extern int MatCreateSeqCSNIndices_Single(MPI_Comm,MatAIJIndices,int,Mat *);
442 extern int MatCreateSeqCSNIndicesWithPrecision(MPI_Comm,MatAIJIndices,int,ScalarPrecision,Mat *);
443 
444 extern int MatMPIBAIJSetHashTableFactor(Mat,double);
445 extern int MatSeqAIJGetInodeSizes(Mat,int *,int *[],int *);
446 
447 
448 #endif
449 
450 
451 
452