1 /******************************************************************************
2  * Copyright 1998-2019 Lawrence Livermore National Security, LLC and other
3  * HYPRE Project Developers. See the top-level COPYRIGHT file for details.
4  *
5  * SPDX-License-Identifier: (Apache-2.0 OR MIT)
6  ******************************************************************************/
7 
8 /******************************************************************************
9  *
10  * Header info for CSR Block Matrix data structures
11  *
12  * Note: this matrix currently uses 0-based indexing.
13  * Note: everything is in terms of blocks (ie. num_rows is the number
14  *       of block rows)
15  *
16  *****************************************************************************/
17 
18 #ifndef hypre_CSR_BLOCK_MATRIX_HEADER
19 #define hypre_CSR_BLOCK_MATRIX_HEADER
20 
21 #include "seq_mv.h"
22 #include "_hypre_utilities.h"
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /*--------------------------------------------------------------------------
29  * CSR Block Matrix
30  *--------------------------------------------------------------------------*/
31 
32 typedef struct
33 {
34   HYPRE_Complex    *data;
35   HYPRE_Int        *i;
36   HYPRE_Int        *j;
37   HYPRE_BigInt     *big_j;
38   HYPRE_Int         block_size;
39   HYPRE_Int         num_rows;
40   HYPRE_Int         num_cols;
41   HYPRE_Int         num_nonzeros;
42   HYPRE_Int         owns_data;
43 
44 } hypre_CSRBlockMatrix;
45 
46 /*--------------------------------------------------------------------------
47  * Accessor functions for the CSR Block Matrix structure
48  *--------------------------------------------------------------------------*/
49 
50 #define hypre_CSRBlockMatrixData(matrix)         ((matrix) -> data)
51 #define hypre_CSRBlockMatrixI(matrix)            ((matrix) -> i)
52 #define hypre_CSRBlockMatrixJ(matrix)            ((matrix) -> j)
53 #define hypre_CSRBlockMatrixBigJ(matrix)         ((matrix) -> big_j)
54 #define hypre_CSRBlockMatrixBlockSize(matrix)    ((matrix) -> block_size)
55 #define hypre_CSRBlockMatrixNumRows(matrix)      ((matrix) -> num_rows)
56 #define hypre_CSRBlockMatrixNumCols(matrix)      ((matrix) -> num_cols)
57 #define hypre_CSRBlockMatrixNumNonzeros(matrix)  ((matrix) -> num_nonzeros)
58 #define hypre_CSRBlockMatrixOwnsData(matrix)     ((matrix) -> owns_data)
59 
60 /*--------------------------------------------------------------------------
61  * other functions for the CSR Block Matrix structure
62  *--------------------------------------------------------------------------*/
63 
64 hypre_CSRBlockMatrix
65       *hypre_CSRBlockMatrixCreate(HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int);
66 HYPRE_Int hypre_CSRBlockMatrixDestroy(hypre_CSRBlockMatrix *);
67 HYPRE_Int hypre_CSRBlockMatrixInitialize(hypre_CSRBlockMatrix *);
68 HYPRE_Int hypre_CSRBlockMatrixBigInitialize(hypre_CSRBlockMatrix *);
69 HYPRE_Int hypre_CSRBlockMatrixSetDataOwner(hypre_CSRBlockMatrix *, HYPRE_Int);
70 hypre_CSRMatrix
71       *hypre_CSRBlockMatrixCompress(hypre_CSRBlockMatrix *);
72 hypre_CSRMatrix
73       *hypre_CSRBlockMatrixConvertToCSRMatrix(hypre_CSRBlockMatrix *);
74 hypre_CSRBlockMatrix
75       *hypre_CSRBlockMatrixConvertFromCSRMatrix(hypre_CSRMatrix *, HYPRE_Int);
76 HYPRE_Int hypre_CSRBlockMatrixBlockAdd(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex*, HYPRE_Int);
77 
78 HYPRE_Int hypre_CSRBlockMatrixBlockMultAdd(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex, HYPRE_Complex *, HYPRE_Int);
79 HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex, HYPRE_Complex *, HYPRE_Int);
80 HYPRE_Int
81 hypre_CSRBlockMatrixBlockMultAddDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta,
82                                       HYPRE_Complex* o, HYPRE_Int block_size);
83 HYPRE_Int
84 hypre_CSRBlockMatrixBlockMultAddDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta,
85                                       HYPRE_Complex* o, HYPRE_Int block_size);
86 
87 
88 HYPRE_Int hypre_CSRBlockMatrixBlockInvMult(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int);
89 HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int);
90 
91 HYPRE_Int
92 hypre_CSRBlockMatrixBlockInvMultDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size);
93 
94 HYPRE_Int
95 hypre_CSRBlockMatrixBlockInvMultDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size);
96 
97 
98 
99 
100 HYPRE_Int hypre_CSRBlockMatrixBlockMultInv(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int);
101 HYPRE_Int hypre_CSRBlockMatrixBlockTranspose(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int);
102 
103 HYPRE_Int hypre_CSRBlockMatrixTranspose(hypre_CSRBlockMatrix *A,
104                                   hypre_CSRBlockMatrix **AT, HYPRE_Int data);
105 
106 HYPRE_Int hypre_CSRBlockMatrixBlockCopyData(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Complex, HYPRE_Int);
107 HYPRE_Int hypre_CSRBlockMatrixBlockCopyDataDiag(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Complex, HYPRE_Int);
108 
109 HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulate(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Int);
110 HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiag(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size);
111 
112 
113 
114 HYPRE_Int
115 hypre_CSRBlockMatrixMatvec(HYPRE_Complex alpha, hypre_CSRBlockMatrix *A,
116                            hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y);
117 
118 
119 HYPRE_Int
120 hypre_CSRBlockMatrixMatvecT( HYPRE_Complex alpha, hypre_CSRBlockMatrix *A, hypre_Vector  *x,
121                              HYPRE_Complex beta, hypre_Vector *y );
122 
123 HYPRE_Int
124 hypre_CSRBlockMatrixBlockInvMatvec(HYPRE_Complex* mat, HYPRE_Complex* v,
125                                    HYPRE_Complex* ov, HYPRE_Int block_size);
126 
127 HYPRE_Int
128 hypre_CSRBlockMatrixBlockMatvec(HYPRE_Complex alpha, HYPRE_Complex* mat, HYPRE_Complex* v, HYPRE_Complex beta,
129                                 HYPRE_Complex* ov, HYPRE_Int block_size);
130 
131 
132 HYPRE_Int hypre_CSRBlockMatrixBlockNorm(HYPRE_Int norm_type, HYPRE_Complex* data, HYPRE_Real* out, HYPRE_Int block_size);
133 
134 HYPRE_Int hypre_CSRBlockMatrixBlockSetScalar(HYPRE_Complex* o, HYPRE_Complex beta, HYPRE_Int block_size);
135 
136 HYPRE_Int hypre_CSRBlockMatrixComputeSign(HYPRE_Complex *i1, HYPRE_Complex *o, HYPRE_Int block_size);
137 HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size, HYPRE_Real *sign);
138 HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size, HYPRE_Real *sign);
139 
140 #ifdef __cplusplus
141 }
142 #endif
143 #endif
144