strumpack::HSS::HSSMatrixMPI< scalar_t > Class Template Reference

Distributed memory implementation of the HSS (Hierarchically Semi-Separable) matrix format. More...

#include <HSSMatrixMPI.hpp>

Inheritance diagram for strumpack::HSS::HSSMatrixMPI< scalar_t >:
Collaboration diagram for strumpack::HSS::HSSMatrixMPI< scalar_t >:

Public Member Functions

 HSSMatrixMPI (const DistM_t &A, const opts_t &opts)
 
 HSSMatrixMPI (const structured::ClusterTree &t, const DistM_t &A, const opts_t &opts)
 
 HSSMatrixMPI (const structured::ClusterTree &t, const BLACSGrid *g, const opts_t &opts)
 
 HSSMatrixMPI (std::size_t m, std::size_t n, const BLACSGrid *Agrid, const dmult_t &Amult, const delem_t &Aelem, const opts_t &opts)
 
 HSSMatrixMPI (std::size_t m, std::size_t n, const BLACSGrid *Agrid, const dmult_t &Amult, const delem_blocks_t &Aelem, const opts_t &opts)
 
 HSSMatrixMPI (const structured::ClusterTree &t, const BLACSGrid *Agrid, const dmult_t &Amult, const delem_t &Aelem, const opts_t &opts)
 
 HSSMatrixMPI (kernel::Kernel< real_t > &K, const BLACSGrid *Agrid, const opts_t &opts)
 
 HSSMatrixMPI (const HSSMatrixMPI< scalar_t > &other)
 
 HSSMatrixMPI (HSSMatrixMPI< scalar_t > &&other)=default
 
HSSMatrixMPI< scalar_t > & operator= (const HSSMatrixMPI< scalar_t > &other)
 
HSSMatrixMPI< scalar_t > & operator= (HSSMatrixMPI< scalar_t > &&other)=default
 
std::unique_ptr< HSSMatrixBase< scalar_t > > clone () const override
 
const HSSMatrixBase< scalar_t > * child (int c) const
 
HSSMatrixBase< scalar_t > * child (int c)
 
const BLACSGridgrid () const override
 
const BLACSGridgrid (const BLACSGrid *grid) const override
 
const BLACSGridgrid_local () const override
 
const MPICommComm () const
 
MPI_Comm comm () const
 
int Ptotal () const override
 
int Pactive () const override
 
void compress (const DistM_t &A, const opts_t &opts)
 
void compress (const dmult_t &Amult, const delem_t &Aelem, const opts_t &opts)
 
void compress (const dmult_t &Amult, const delem_blocks_t &Aelem, const opts_t &opts)
 
void compress (const kernel::Kernel< real_t > &K, const opts_t &opts)
 
void factor () override
 
void partial_factor ()
 
void solve (DistM_t &b) const override
 
void forward_solve (WorkSolveMPI< scalar_t > &w, const DistM_t &b, bool partial) const override
 
void backward_solve (WorkSolveMPI< scalar_t > &w, DistM_t &x) const override
 
DistM_t apply (const DistM_t &b) const
 
DistM_t applyC (const DistM_t &b) const
 
void mult (Trans op, const DistM_t &x, DistM_t &y) const override
 
scalar_t get (std::size_t i, std::size_t j) const
 
DistM_t extract (const std::vector< std::size_t > &I, const std::vector< std::size_t > &J, const BLACSGrid *Bgrid) const
 
std::vector< DistM_textract (const std::vector< std::vector< std::size_t > > &I, const std::vector< std::vector< std::size_t > > &J, const BLACSGrid *Bgrid) const
 
void extract_add (const std::vector< std::size_t > &I, const std::vector< std::size_t > &J, DistM_t &B) const
 
void extract_add (const std::vector< std::vector< std::size_t > > &I, const std::vector< std::vector< std::size_t > > &J, std::vector< DistM_t > &B) const
 
void Schur_update (DistM_t &Theta, DistM_t &Vhat, DistM_t &DUB01, DistM_t &Phi) const
 
void Schur_product_direct (const DistM_t &Theta, const DistM_t &Vhat, const DistM_t &DUB01, const DistM_t &Phi, const DistM_t &_ThetaVhatC, const DistM_t &VhatCPhiC, const DistM_t &R, DistM_t &Sr, DistM_t &Sc) const
 
std::size_t max_rank () const
 
std::size_t total_memory () const
 
std::size_t total_nonzeros () const
 
std::size_t total_factor_nonzeros () const
 
std::size_t max_levels () const
 
std::size_t rank () const override
 
std::size_t memory () const override
 
std::size_t nonzeros () const override
 
std::size_t factor_nonzeros () const override
 
std::size_t levels () const override
 
void print_info (std::ostream &out=std::cout, std::size_t roff=0, std::size_t coff=0) const override
 
DistM_t dense () const
 
void shift (scalar_t sigma) override
 
const TreeLocalRangestree_ranges () const
 
void to_block_row (const DistM_t &A, DenseM_t &sub_A, DistM_t &leaf_A) const override
 
void allocate_block_row (int d, DenseM_t &sub_A, DistM_t &leaf_A) const override
 
void from_block_row (DistM_t &A, const DenseM_t &sub_A, const DistM_t &leaf_A, const BLACSGrid *lgrid) const override
 
void delete_trailing_block () override
 
void reset () override
 
- Public Member Functions inherited from strumpack::HSS::HSSMatrixBase< scalar_t >
 HSSMatrixBase (std::size_t m, std::size_t n, bool active)
 
virtual ~HSSMatrixBase ()=default
 
 HSSMatrixBase (const HSSMatrixBase< scalar_t > &other)
 
HSSMatrixBase< scalar_t > & operator= (const HSSMatrixBase< scalar_t > &other)
 
 HSSMatrixBase (HSSMatrixBase &&h)=default
 
HSSMatrixBaseoperator= (HSSMatrixBase &&h)=default
 
virtual std::unique_ptr< HSSMatrixBase< scalar_t > > clone () const =0
 
std::pair< std::size_t, std::size_t > dims () const
 
std::size_t rows () const override
 
std::size_t cols () const override
 
bool leaf () const
 
virtual std::size_t factor_nonzeros () const
 
const HSSMatrixBase< scalar_t > & child (int c) const
 
HSSMatrixBase< scalar_t > & child (int c)
 
bool is_compressed () const
 
bool is_untouched () const
 
bool active () const
 
virtual std::size_t levels () const =0
 
virtual void print_info (std::ostream &out=std::cout, std::size_t roff=0, std::size_t coff=0) const =0
 
void set_openmp_task_depth (int depth)
 
virtual void shift (scalar_t sigma) override=0
 
virtual void draw (std::ostream &of, std::size_t rlo, std::size_t clo) const
 
virtual void forward_solve (WorkSolveMPI< scalar_t > &w, const DistM_t &b, bool partial) const
 
virtual void backward_solve (WorkSolveMPI< scalar_t > &w, DistM_t &x) const
 
virtual const BLACSGridgrid () const
 
virtual const BLACSGridgrid (const BLACSGrid *local_grid) const
 
virtual const BLACSGridgrid_local () const
 
virtual int Ptotal () const
 
virtual int Pactive () const
 
virtual void to_block_row (const DistM_t &A, DenseM_t &sub_A, DistM_t &leaf_A) const
 
virtual void allocate_block_row (int d, DenseM_t &sub_A, DistM_t &leaf_A) const
 
virtual void from_block_row (DistM_t &A, const DenseM_t &sub_A, const DistM_t &leaf_A, const BLACSGrid *lg) const
 
- Public Member Functions inherited from strumpack::structured::StructuredMatrix< scalar_t >
virtual ~StructuredMatrix ()=default
 
virtual std::size_t rows () const =0
 
virtual std::size_t cols () const =0
 
virtual std::size_t memory () const =0
 
virtual std::size_t nonzeros () const =0
 
virtual std::size_t rank () const =0
 
virtual std::size_t local_rows () const
 
virtual std::size_t begin_row () const
 
virtual std::size_t end_row () const
 
virtual const std::vector< int > & dist () const
 
virtual const std::vector< int > & rdist () const
 
virtual const std::vector< int > & cdist () const
 
virtual void mult (Trans op, const DenseMatrix< scalar_t > &x, DenseMatrix< scalar_t > &y) const
 
void mult (Trans op, int m, const scalar_t *x, int ldx, scalar_t *y, int ldy) const
 
virtual void mult (Trans op, const DistributedMatrix< scalar_t > &x, DistributedMatrix< scalar_t > &y) const
 
virtual void factor ()
 
virtual void solve (DenseMatrix< scalar_t > &b) const
 
virtual void solve (int nrhs, scalar_t *b, int ldb) const
 
virtual void solve (DistributedMatrix< scalar_t > &b) const
 
virtual void shift (scalar_t s)
 

Friends

class DistSamples< scalar_t >
 
template<typename T >
void apply_HSS (Trans ta, const HSSMatrixMPI< T > &a, const DistributedMatrix< T > &b, T beta, DistributedMatrix< T > &c)
 

Detailed Description

template<typename scalar_t>
class strumpack::HSS::HSSMatrixMPI< scalar_t >

Distributed memory implementation of the HSS (Hierarchically Semi-Separable) matrix format.

This is for non-symmetric matrices, but can be used with symmetric matrices as well. This class inherits from StructuredMatrix.

Template Parameters
scalar_tCan be float, double, std:complex<float> or std::complex<double>.
See also
HSSMatrix, structured::StructuredMatrix

Member Function Documentation

◆ allocate_block_row()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::allocate_block_row ( int  d,
DenseM_t sub_A,
DistM_t leaf_A 
) const
overridevirtual

◆ backward_solve()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::backward_solve ( WorkSolveMPI< scalar_t > &  w,
DistM_t x 
) const
overridevirtual

◆ clone()

template<typename scalar_t >
std::unique_ptr< HSSMatrixBase< scalar_t > > strumpack::HSS::HSSMatrixMPI< scalar_t >::clone ( ) const
overridevirtual

Clone this HSS matrix. TODO delete this??

Returns
std::unique_ptr to a clone of this HSS matrix.

Implements strumpack::HSS::HSSMatrixBase< scalar_t >.

◆ factor()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::factor ( )
overridevirtual

Compute a factorization (or the inverse) of this matrix, to be used later for solving linear systems. The actual type of factorization depends on the StructuredMatrix::Type of this matrix.

Reimplemented from strumpack::structured::StructuredMatrix< scalar_t >.

◆ factor_nonzeros()

template<typename scalar_t >
std::size_t strumpack::HSS::HSSMatrixMPI< scalar_t >::factor_nonzeros ( ) const
overridevirtual

◆ forward_solve()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::forward_solve ( WorkSolveMPI< scalar_t > &  w,
const DistM_t b,
bool  partial 
) const
overridevirtual

◆ from_block_row()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::from_block_row ( DistM_t A,
const DenseM_t sub_A,
const DistM_t leaf_A,
const BLACSGrid lgrid 
) const
overridevirtual

◆ grid() [1/2]

template<typename scalar_t >
const BLACSGrid * strumpack::HSS::HSSMatrixMPI< scalar_t >::grid ( ) const
inlineoverridevirtual

◆ grid() [2/2]

template<typename scalar_t >
const BLACSGrid * strumpack::HSS::HSSMatrixMPI< scalar_t >::grid ( const BLACSGrid grid) const
inlineoverridevirtual

◆ grid_local()

template<typename scalar_t >
const BLACSGrid * strumpack::HSS::HSSMatrixMPI< scalar_t >::grid_local ( ) const
inlineoverridevirtual

◆ levels()

template<typename scalar_t >
std::size_t strumpack::HSS::HSSMatrixMPI< scalar_t >::levels ( ) const
overridevirtual

Return the number of levels in the HSS matrix.

Returns
Number of HSS levels (>= 1).

Implements strumpack::HSS::HSSMatrixBase< scalar_t >.

◆ memory()

template<typename scalar_t >
std::size_t strumpack::HSS::HSSMatrixMPI< scalar_t >::memory ( ) const
overridevirtual

Return the total amount of memory used by this matrix, in bytes.

Returns
Memory usage in bytes.
See also
nonzeros

Implements strumpack::structured::StructuredMatrix< scalar_t >.

◆ mult()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::mult ( Trans  op,
const DistM_t x,
DistM_t y 
) const
overridevirtual

Multiply the StructuredMatrix (A) with a dense matrix: y = op(A)*x. x and y are 2d block cyclic.

Parameters
optake transpose/conjugate or not
xmatrix, x.rows() == op(A).cols()
ymatrix, y.cols() == x.cols(), y.rows() == A.rows()

Reimplemented from strumpack::structured::StructuredMatrix< scalar_t >.

◆ nonzeros()

template<typename scalar_t >
std::size_t strumpack::HSS::HSSMatrixMPI< scalar_t >::nonzeros ( ) const
overridevirtual

Return the total number of nonzeros stored by this matrix.

Returns
Nonzeros in the matrix representation.
See also
memory

Implements strumpack::structured::StructuredMatrix< scalar_t >.

◆ Pactive()

template<typename scalar_t >
int strumpack::HSS::HSSMatrixMPI< scalar_t >::Pactive ( ) const
inlineoverridevirtual

◆ print_info()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::print_info ( std::ostream &  out = std::cout,
std::size_t  roff = 0,
std::size_t  coff = 0 
) const
overridevirtual

Print info about this HSS matrix, such as tree info, ranks, etc.

Parameters
outStream to print to, defaults to std::cout
roffRow offset of top left corner, defaults to 0. This is used to recursively print the tree, you can leave this at the default.
coffColumn offset of top left corner, defaults to 0. This is used to recursively print the tree, you can leave this at the default.

Implements strumpack::HSS::HSSMatrixBase< scalar_t >.

◆ Ptotal()

template<typename scalar_t >
int strumpack::HSS::HSSMatrixMPI< scalar_t >::Ptotal ( ) const
inlineoverridevirtual

◆ rank()

template<typename scalar_t >
std::size_t strumpack::HSS::HSSMatrixMPI< scalar_t >::rank ( ) const
overridevirtual

Return the maximum rank of this matrix over all low-rank compressed blocks.

Returns
Maximum rank.

Implements strumpack::structured::StructuredMatrix< scalar_t >.

◆ shift()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::shift ( scalar_t  sigma)
overridevirtual

Apply a shift to the diagonal of this matrix. Ie, this += sigma * I, with I the identity matrix. Call this after compression.

Parameters
sigmaShift to be applied to the diagonal.

Implements strumpack::HSS::HSSMatrixBase< scalar_t >.

◆ solve()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::solve ( DistM_t b) const
overridevirtual

Solve a linear system A*x=b, with this StructuredMatrix (A). This solve is done in-place.

Parameters
bright-hand side, b.rows() == A.cols(), will be overwritten with the solution x.

Reimplemented from strumpack::structured::StructuredMatrix< scalar_t >.

◆ to_block_row()

template<typename scalar_t >
void strumpack::HSS::HSSMatrixMPI< scalar_t >::to_block_row ( const DistM_t A,
DenseM_t sub_A,
DistM_t leaf_A 
) const
overridevirtual

The documentation for this class was generated from the following file: