32 #ifndef BLR_MATRIX_HPP 
   33 #define BLR_MATRIX_HPP 
   41 #include "BLRTileBLAS.hpp"  
   54       std::function<void(
const std::vector<std::size_t>&,
 
   55                          const std::vector<std::size_t>&,
 
   83                 const std::vector<std::size_t>& rowtiles,
 
   84                 const std::vector<std::size_t>& coltiles,
 
   90       BLRMatrix(std::size_t m, 
const std::vector<std::size_t>& rowtiles,
 
   91                 std::size_t n, 
const std::vector<std::size_t>& coltiles);
 
   93       std::size_t 
rows()
 const override { 
return m_; }
 
   94       std::size_t 
cols()
 const override { 
return n_; }
 
   98       std::size_t 
rank() 
const override;
 
  103       void draw(std::ostream& of, std::size_t roff, std::size_t coff) 
const;
 
  105       void print(
const std::string& name) 
const;
 
  115       const std::vector<int>& piv()
 const { 
return piv_; }
 
  130       std::size_t rg2t(std::size_t i) 
const;
 
  131       std::size_t cg2t(std::size_t j) 
const;
 
  133       scalar_t operator()(std::size_t i, std::size_t j) 
const;
 
  134       scalar_t& operator()(std::size_t i, std::size_t j);
 
  135       DenseM_t extract(
const std::vector<std::size_t>& I,
 
  136                        const std::vector<std::size_t>& J) 
const;
 
  139       void decompress_local_columns(
int c_min, 
int c_max);
 
  140       void remove_tiles_before_local_column(
int c_min, 
int c_max);
 
  142       std::size_t rowblocks()
 const { 
return nbrows_; }
 
  143       std::size_t colblocks()
 const { 
return nbcols_; }
 
  144       std::size_t tilerows(std::size_t i)
 const { 
return roff_[i+1] - roff_[i]; }
 
  145       std::size_t tilecols(std::size_t j)
 const { 
return coff_[j+1] - coff_[j]; }
 
  146       std::size_t tileroff(std::size_t i)
 const { 
return roff_[i]; }
 
  147       std::size_t tilecoff(std::size_t j)
 const { 
return coff_[j]; }
 
  149       BLRTile<scalar_t>& tile(std::size_t i, std::size_t j);
 
  150       const BLRTile<scalar_t>& tile(std::size_t i, std::size_t j) 
const;
 
  151       std::unique_ptr<BLRTile<scalar_t>>& block(std::size_t i, std::size_t j);
 
  152       DenseMW_t tile(DenseM_t& A, std::size_t i, std::size_t j) 
const;
 
  153       DenseTile<scalar_t>& tile_dense(std::size_t i, std::size_t j);
 
  154       const DenseTile<scalar_t>& tile_dense(std::size_t i, std::size_t j) 
const;
 
  156       void compress_tile(std::size_t i, std::size_t j, 
const Opts_t& opts);
 
  157       void fill(scalar_t v);
 
  158       void fill_col(scalar_t v, std::size_t k, std::size_t CP);
 
  161       construct_and_partial_factor(DenseM_t& A11, DenseM_t& A12,
 
  162                                    DenseM_t& A21, DenseM_t& A22,
 
  163                                    BLRMatrix<scalar_t>& B11,
 
  164                                    BLRMatrix<scalar_t>& B12,
 
  165                                    BLRMatrix<scalar_t>& B21,
 
  166                                    const std::vector<std::size_t>& tiles1,
 
  167                                    const std::vector<std::size_t>& tiles2,
 
  168                                    const adm_t& admissible,
 
  172       construct_and_partial_factor(BLRMatrix<scalar_t>& B11,
 
  173                                    BLRMatrix<scalar_t>& B12,
 
  174                                    BLRMatrix<scalar_t>& B21,
 
  175                                    BLRMatrix<scalar_t>& B22,
 
  176                                    const std::vector<std::size_t>& tiles1,
 
  177                                    const std::vector<std::size_t>& tiles2,
 
  178                                    const adm_t& admissible,
 
  182       construct_and_partial_factor_col(BLRMatrix<scalar_t>& B11,
 
  183                                        BLRMatrix<scalar_t>& B12,
 
  184                                        BLRMatrix<scalar_t>& B21,
 
  185                                        BLRMatrix<scalar_t>& B22,
 
  186                                        const std::vector<std::size_t>& tiles1,
 
  187                                        const std::vector<std::size_t>& tiles2,
 
  188                                        const adm_t& admissible,
 
  190                                        const std::function<
void 
  191                                        (
int, 
bool, std::size_t)>& blockcol);
 
  194       construct_and_partial_factor(std::size_t n1, std::size_t n2,
 
  195                                    const extract_t<scalar_t>& A11,
 
  196                                    const extract_t<scalar_t>& A12,
 
  197                                    const extract_t<scalar_t>& A21,
 
  198                                    const extract_t<scalar_t>& A22,
 
  199                                    BLRMatrix<scalar_t>& B11,
 
  200                                    BLRMatrix<scalar_t>& B12,
 
  201                                    BLRMatrix<scalar_t>& B21,
 
  202                                    BLRMatrix<scalar_t>& B22,
 
  203                                    const std::vector<std::size_t>& tiles1,
 
  204                                    const std::vector<std::size_t>& tiles2,
 
  205                                    const adm_t& admissible,
 
  206                                    const BLROptions<scalar_t>& opts);
 
  209       trsmLNU_gemm(
const BLRMatrix<scalar_t>& F1,
 
  210                    const BLRMatrix<scalar_t>& F2,
 
  211                    DenseM_t& B1, DenseM_t& B2, 
int task_depth);
 
  214       gemm_trsmUNN(
const BLRMatrix<scalar_t>& F1,
 
  215                    const BLRMatrix<scalar_t>& F2,
 
  216                    DenseM_t& B1, DenseM_t& B2, 
int task_depth);
 
  219       std::size_t m_ = 0, n_ = 0, nbrows_ = 0, nbcols_ = 0;
 
  220       std::vector<std::size_t> roff_, coff_, cl2l_, rl2l_;
 
  221       std::vector<std::unique_ptr<BLRTile<scalar_t>>> blocks_;
 
  222       std::vector<int> piv_;
 
  224       void create_dense_tile(std::size_t i, std::size_t j, DenseM_t& A);
 
  225       void create_dense_tile(std::size_t i, std::size_t j,
 
  226                              const extract_t<scalar_t>& Aelem);
 
  227       void create_dense_tile_left_looking(std::size_t i, std::size_t j,
 
  228                                           const extract_t<scalar_t>& Aelem);
 
  229       void create_dense_tile_left_looking(std::size_t i, std::size_t j,
 
  231                                           const extract_t<scalar_t>& Aelem,
 
  232                                           const BLRMatrix<scalar_t>& B21,
 
  233                                           const BLRMatrix<scalar_t>& B12);
 
  234       void create_LR_tile(std::size_t i, std::size_t j,
 
  235                           DenseM_t& A, 
const Opts_t& opts);
 
  236       void create_LR_tile_left_looking(std::size_t i, std::size_t j,
 
  237                                        const extract_t<scalar_t>& Aelem,
 
  240       void create_LR_tile_left_looking(std::size_t i, std::size_t j,
 
  242                                        const extract_t<scalar_t>& Aelem,
 
  243                                        const BLRMatrix<scalar_t>& B21,
 
  244                                        const BLRMatrix<scalar_t>& B12,
 
  247       void LUAR_B11(std::size_t i, std::size_t j, std::size_t kmax,
 
  248                     DenseM_t& A11, 
const Opts_t& opts, 
int* B);
 
  249       void LUAR_B12(std::size_t i, std::size_t j, std::size_t kmax,
 
  250                     BLRMatrix<scalar_t>& B11, DenseM_t& A12,
 
  251                     const Opts_t& opts, 
int* B);
 
  252       void LUAR_B21(std::size_t i, std::size_t j, std::size_t kmax,
 
  253                     BLRMatrix<scalar_t>& B11, DenseM_t& A21,
 
  254                     const Opts_t& opts, 
int* B);
 
  256       template<
typename T> 
friend 
  257       void draw(
const BLRMatrix<T>& H, 
const std::string& name);
 
  258       template<
typename T,
typename I> 
friend class BLRExtendAdd;
 
  261     template<
typename scalar_t> 
void 
  262     LUAR(
const std::vector<BLRTile<scalar_t>*>& Ti,
 
  263          const std::vector<BLRTile<scalar_t>*>& Tj,
 
  264          DenseMatrixWrapper<scalar_t>& tij,
 
  265          const BLROptions<scalar_t>& opts, 
int* B);
 
  267     template<
typename scalar_t> 
void 
  268     LUAR_B22(std::size_t i, std::size_t j, std::size_t kmax,
 
  269              BLRMatrix<scalar_t>& B12, BLRMatrix<scalar_t>& B21,
 
  270              DenseMatrix<scalar_t>& A22,
 
  271              const BLROptions<scalar_t>& opts, 
int* B);
 
  273     template<
typename scalar_t> 
void 
  275          const BLRMatrix<scalar_t>& a, DenseMatrix<scalar_t>& b,
 
  278     template<
typename scalar_t> 
void 
  280          DenseMatrix<scalar_t>& b, 
int task_depth);
 
  282     template<
typename scalar_t> 
void 
  283     gemv(
Trans ta, scalar_t alpha, 
const BLRMatrix<scalar_t>& a,
 
  284          const DenseMatrix<scalar_t>& x, scalar_t beta,
 
  285          DenseMatrix<scalar_t>& y, 
int task_depth);
 
  287     template<
typename scalar_t> 
void 
  288     gemm(
Trans ta, 
Trans tb, scalar_t alpha, 
const BLRMatrix<scalar_t>& a,
 
  289          const BLRMatrix<scalar_t>& b, scalar_t beta,
 
  290          DenseMatrix<scalar_t>& c, 
int task_depth);
 
  292     template<
typename scalar_t> 
void 
  293     gemm(
Trans ta, 
Trans tb, scalar_t alpha, 
const BLRMatrix<scalar_t>& A,
 
  294          const DenseMatrix<scalar_t>& B, scalar_t beta,
 
  295          DenseMatrix<scalar_t>& C, 
int task_depth);
 
  297     template<
typename scalar_t>
 
  298     void draw(
const BLRMatrix<scalar_t>& B, 
const std::string& name) {
 
  299       std::ofstream of(
"plot" + name + 
".gnuplot");
 
  300       of << 
"set terminal pdf enhanced color size 5,4" << std::endl;
 
  301       of << 
"set output '" << name << 
".pdf'" << std::endl;
 
  303       of << 
"set xrange [0:" << B.cols() << 
"]" << std::endl;
 
  304       of << 
"set yrange [" << B.rows() << 
":0]" << std::endl;
 
  305       of << 
"plot x lt -1 notitle" << std::endl;
 
Contains class holding BLROptions.
Contains the structured matrix interfaces.
Definition: BLRMatrix.hpp:49
Class to represent a block low-rank matrix.
Definition: BLRMatrix.hpp:74
std::size_t rows() const override
Definition: BLRMatrix.hpp:93
std::size_t cols() const override
Definition: BLRMatrix.hpp:94
std::size_t nonzeros() const override
std::size_t memory() const override
std::size_t rank() const override
void solve(DenseM_t &x) const override
Definition: BLRMatrix.hpp:109
void mult(Trans op, const DenseM_t &x, DenseM_t &y) const override
Class containing several options for the BLR code and data-structures.
Definition: BLROptions.hpp:82
Definition: BLRMatrix.hpp:48
Like DenseMatrix, this class represents a matrix, stored in column major format, to allow direct use ...
Definition: DenseMatrix.hpp:1015
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition: DenseMatrix.hpp:138
void laswp(const std::vector< int > &P, bool fwd)
Class to represent a structured matrix. This is the abstract base class for several types of structur...
Definition: StructuredMatrix.hpp:209
Definition: StrumpackOptions.hpp:43
UpLo
Definition: DenseMatrix.hpp:83
void trsv(UpLo ul, Trans ta, Diag d, const DenseMatrix< scalar_t > &a, DenseMatrix< scalar_t > &b, int depth=0)
void gemv(Trans ta, scalar_t alpha, const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &x, scalar_t beta, DenseMatrix< scalar_t > &y, int depth=0)
Trans
Definition: DenseMatrix.hpp:51
void trsm(Side s, UpLo ul, Trans ta, Diag d, scalar_t alpha, const DenseMatrix< scalar_t > &a, DenseMatrix< scalar_t > &b, int depth=0)
Side
Definition: DenseMatrix.hpp:74
void gemm(Trans ta, Trans tb, scalar_t alpha, const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b, scalar_t beta, DenseMatrix< scalar_t > &c, int depth=0)
Diag
Definition: DenseMatrix.hpp:92