27 #ifndef BLOCK_MATRIX_H
28 #define BLOCK_MATRIX_H
41 #include <boost/ptr_container/ptr_vector.hpp>
43 template<
class Matrix,
class SymmGroup>
46 friend class block_matrix<typename storage::constrained<Matrix>::type, SymmGroup>;
48 typedef typename SymmGroup::charge charge;
58 Index<SymmGroup> cols);
62 template <class OtherMatrix>
63 block_matrix(block_matrix<OtherMatrix,SymmGroup> const&);
66 template<class OtherMatrix>
67 block_matrix& operator=(const block_matrix<OtherMatrix, SymmGroup>& rhs);
80 Matrix & operator[](size_type c);
81 Matrix const & operator[](size_type c) const;
82 value_type & operator()(std::pair<charge, size_type> const & r,
83 std::pair<charge, size_type> const & c);
84 value_type const & operator()(std::pair<charge, size_type> const & r,
85 std::pair<charge, size_type> const & c) const;
94 bool
has_block(std::pair<charge, size_type> const & r,
95 std::pair<charge, size_type> const & c) const;
112 template<class Generator>
117 void
reserve(charge, charge, std::size_t, std::size_t);
118 inline void
reserve_pos(charge, charge, std::size_t, std::size_t);
122 size_type new_r, size_type new_c,
123 bool pretend = false);
125 friend void
swap(block_matrix & x, block_matrix & y)
127 swap(x.data_, y.data_);
128 swap(x.rows_, y.rows_);
129 swap(x.cols_, y.cols_);
135 assert( rows_.position(r) == cols_.position(c) );
136 return data_[rows_.position(r)];
142 assert( rows_.position(r) == cols_.position(c) );
143 return data_[rows_.position(r)];
146 template<
class Archive>
void load(Archive & ar);
147 template<
class Archive>
void save(Archive & ar)
const;
149 template <
class Archive>
150 inline void serialize(Archive & ar,
const unsigned int version);
156 boost::ptr_vector<Matrix> data_;
160 template<
class Matrix,
class SymmGroup>
168 template<
class Matrix,
class SymmGroup>
176 template<
class Matrix,
class SymmGroup>
183 template<
class Matrix,
class SymmGroup>
191 template<
class Matrix,
class SymmGroup>
195 for (
size_t i = 0; i < m.
n_blocks(); ++i)
include all symmetry definitions
std::size_t size_of(block_matrix< Matrix, SymmGroup > const &m)
size_type n_blocks() const
std::size_t num_elements() const
void match_and_add_block(Matrix const &, charge, charge)
void serialize(Archive &ar, const unsigned int version)
size_type insert_block(Matrix const &, charge, charge)
std::string description() const
void shift_basis(charge diff)
scalar_type trace() const
definition of block_matrix class
void resize_block(charge r, charge c, size_type new_r, size_type new_c, bool pretend=false)
maquis::traits::scalar_type< typename storage::constrained< Matrix >::type >::type scalar_type
include one of the Index class definitions
block_matrix< Matrix, SymmGroup > operator-(block_matrix< Matrix, SymmGroup > b1, block_matrix< Matrix, SymmGroup > const &b2)
block_matrix< Matrix, SymmGroup > operator+(block_matrix< Matrix, SymmGroup > b1, block_matrix< Matrix, SymmGroup > const &b2)
friend void swap(block_matrix &x, block_matrix &y)
bool has_block(charge r, charge c) const
block_matrix< Matrix, SymmGroup > operator*(const typename block_matrix< Matrix, SymmGroup >::scalar_type &v, block_matrix< Matrix, SymmGroup > bm)
Index< SymmGroup > const & right_basis() const
void generate(Generator g)
void remove_block(charge r, charge c)
Matrix & operator()(charge r, charge c)
void reserve(charge, charge, std::size_t, std::size_t)
maquis::traits::real_type< typename storage::constrained< Matrix >::type >::type real_type
void save(Archive &ar) const
Matrix const & operator()(charge r, charge c) const
size_type find_block(charge r, charge c) const
void reserve_pos(charge, charge, std::size_t, std::size_t)
Index< SymmGroup > const & left_basis() const
typename storage::constrained< Matrix >::type::value_type value_type
typename storage::constrained< Matrix >::type::size_type size_type