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