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