xref: /petsc/src/mat/impls/aij/seq/bas/spbas.h (revision 4e278199b78715991f5c71ebbd945c1489263e6c)
1 /*
2    Define type spbas_matrix: sparse matrices using pointers
3 
4    Global matrix information
5       nrows, ncols: dimensions
6       nnz         : number of nonzeros (in whole matrix)
7       col_idx_type: storage scheme for column numbers
8                     SPBAS_COLUMN_NUMBERS:
9                         array icol contains column indices:
10                            A(i,icol[i][j]) = values[i][j]
11                     SPBAS_DIAGONAL_OFFSETS:
12                         array icol contains diagonal offsets:
13                            A(i,i+icol[i][j]) = values[i][j]
14                     SPBAS_OFFSET_ARRAY:
15                         array icol contains offsets wrt array
16                         icol0:
17                            A(i,icol0[i]+icol[i][j]) = values[i][j]
18 
19    Information about each row
20       row_nnz     : number of nonzeros for each row
21       icol0       : column index offset (when needed, otherwise NULL)
22       icols       : array of diagonal offsets for each row, as descibed
23                     for col_idx_type, above
24       values      : array of matrix entries for each row
25                     when values == NULL, this matrix is really
26                     a sparseness pattern, not a matrix
27 
28    The other fields describe the way in which the data are stored
29    in memory.
30 
31       block_data  : The pointers icols[i] all point to places in a
32                     single allocated array. Only for icols[0] was
33                     malloc called. Freeing icols[0] will free
34                     all other icols=arrays as well.
35                     Same for arrays values[i]
36 */
37 
38 #define SPBAS_COLUMN_NUMBERS   (0)
39 #define SPBAS_DIAGONAL_OFFSETS (1)
40 #define SPBAS_OFFSET_ARRAY     (2)
41 
42 #define NEGATIVE_DIAGONAL (-42)
43 
44 typedef struct {
45   PetscInt nrows;
46   PetscInt ncols;
47   PetscInt nnz;
48   PetscInt col_idx_type;
49 
50   PetscInt    *row_nnz;
51   PetscInt    *icol0;
52   PetscInt    **icols;
53   PetscScalar **values;
54 
55   PetscBool   block_data;
56   PetscInt    n_alloc_icol;
57   PetscInt    n_alloc_val;
58   PetscInt    *alloc_icol;
59   PetscScalar *alloc_val;
60 } spbas_matrix;
61 
62 /*
63   spbas_compress_pattern:
64      calculate a compressed sparseness pattern for a sparseness pattern
65      given in compressed row storage. The compressed sparseness pattern may
66      require (much) less memory.
67 
68   spbas_memory_requirement:
69      Calculate the number of bytes needed to store tha matrix
70 
71   spbas_incomplete_cholesky:
72      Incomplete Cholesky decomposition
73 
74   spbas_delete:
75      de-allocate the arrays owned by this matrix
76 
77   spbas_matrix_to_crs:
78      Convert an spbas_matrix to compessed row storage
79 
80   spbas_dump:
81      Print the matrix in i,j,val-format
82 
83   spbas_transpose:
84      Return the transpose of a matrix
85 
86   spbas_pattern_only:
87      Return the sparseness pattern (matrix without values) of a
88      compressed row storage
89 */
90 PetscErrorCode spbas_compress_pattern(PetscInt*,PetscInt*,PetscInt,PetscInt,PetscInt,spbas_matrix*,PetscReal*);
91 size_t         spbas_memory_requirement(spbas_matrix);
92 PetscErrorCode spbas_delete(spbas_matrix);
93 PetscErrorCode spbas_incomplete_cholesky(Mat,const PetscInt*,const PetscInt*,spbas_matrix,PetscReal,PetscReal,spbas_matrix*);
94 PetscErrorCode spbas_matrix_to_crs(spbas_matrix, MatScalar **,PetscInt **,PetscInt**);
95 PetscErrorCode spbas_dump(const char*,spbas_matrix);
96 PetscErrorCode spbas_transpose(spbas_matrix,spbas_matrix*);
97 PetscErrorCode spbas_apply_reordering(spbas_matrix*, const PetscInt*, const PetscInt*);
98 PetscErrorCode spbas_pattern_only(PetscInt, PetscInt, PetscInt*, PetscInt*, spbas_matrix*);
99 PetscErrorCode spbas_power (spbas_matrix, PetscInt, spbas_matrix*);
100 PetscErrorCode spbas_keep_upper(spbas_matrix*);
101 
102