ALPS MPS Codes
Reference documentation.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
dm_op_kron.h File Reference
#include "dmrg/block_matrix/indexing.h"
#include "dmrg/block_matrix/block_matrix.h"
#include "dmrg/block_matrix/grouped_symmetry.h"

Go to the source code of this file.

Functions

template<class Matrix , class SymmGroup >
void dm_kron (Index< SymmGroup > const &phys, block_matrix< Matrix, SymmGroup > const &A, block_matrix< Matrix, SymmGroup > const &B, block_matrix< Matrix, SymmGroup > &C)
 
template<class Matrix , class SymmGroup >
void dm_group_kron (Index< SymmGroup > const &phys_psi, block_matrix< Matrix, SymmGroup > const &A, block_matrix< Matrix, SymmGroup > const &B, block_matrix< Matrix, typename grouped_symmetry< SymmGroup >::type > &C)
 

Function Documentation

template<class Matrix , class SymmGroup >
void dm_group_kron ( Index< SymmGroup > const &  phys_psi,
block_matrix< Matrix, SymmGroup > const &  A,
block_matrix< Matrix, SymmGroup > const &  B,
block_matrix< Matrix, typename grouped_symmetry< SymmGroup >::type > &  C 
)

Definition at line 70 of file dm_op_kron.h.

74 {
75  typedef typename grouped_symmetry<SymmGroup>::type OutSymm;
77 
78  Index<SymmGroup> const & left_basis = phys_psi;
79  Index<SymmGroup> const & right_basis = phys_psi;
80 
81  typedef typename OutSymm::charge charge;
82  Index<OutSymm> phys_rho = group(phys_psi, adjoin(phys_psi));
83 
84  for (int i=0; i<A.n_blocks(); ++i) {
85  for (int j=0; j<B.n_blocks(); ++j) {
86  charge new_left = group(A.left_basis()[i].first, -B.left_basis()[j].first);
87  charge new_right = group(A.right_basis()[i].first, -B.right_basis()[j].first);
88 
89  Matrix tmp(phys_rho.size_of_block(new_left), phys_rho.size_of_block(new_right), 0);
90 
91  maquis::dmrg::detail::op_kron(tmp, B[j], A[i], 0, 0,
92  A.left_basis()[i].second, B.left_basis()[j].second,
93  A.right_basis()[i].second, B.right_basis()[j].second);
94 
95  C.match_and_add_block(tmp, new_left, new_right);
96  }
97  }
98 }
TrivialGroup::charge group(TrivialGroup::charge c1, TrivialGroup::charge c2)
size_type n_blocks() const
void match_and_add_block(Matrix const &, charge, charge)
std::size_t size_of_block(charge c) const
block_matrix< Matrix, SymmGroup > adjoin(block_matrix< Matrix, SymmGroup > const &m)
void op_kron(Matrix2 &out, const Matrix1 &in, const Matrix1 &alfa, size_t out_y_offset, size_t out_x_offset, size_t ldim1, size_t ldim2, size_t rdim1, size_t rdim2)
Definition: alps_detail.hpp:65
Index< SymmGroup > const & right_basis() const
Index< SymmGroup > const & left_basis() const
template<class Matrix , class SymmGroup >
void dm_kron ( Index< SymmGroup > const &  phys,
block_matrix< Matrix, SymmGroup > const &  A,
block_matrix< Matrix, SymmGroup > const &  B,
block_matrix< Matrix, SymmGroup > &  C 
)

Definition at line 35 of file dm_op_kron.h.

39 {
41 
42  Index<SymmGroup> const & left_basis = phys;
43  Index<SymmGroup> const & right_basis = phys;
44 
45  typedef typename SymmGroup::charge charge;
46  boost::function<charge (charge, charge)> phys_fuse = boost::lambda::bind(static_cast<charge(*)(charge, charge)>(SymmGroup::fuse),
47  boost::lambda::_1, -boost::lambda::_2);
48  ProductBasis<SymmGroup> pb_left(left_basis, left_basis, phys_fuse);
49  ProductBasis<SymmGroup> const& pb_right = pb_left;
50 
51  for (int i=0; i<A.n_blocks(); ++i) {
52  for (int j=0; j<B.n_blocks(); ++j) {
53  charge new_left = phys_fuse(A.left_basis()[i].first, B.left_basis()[j].first);
54  charge new_right = phys_fuse(A.right_basis()[i].first, B.right_basis()[j].first);
55 
56  Matrix tmp(pb_left.size(new_left), pb_right.size(new_right), 0);
57 
58  maquis::dmrg::detail::op_kron(tmp, B[j], A[i],
59  pb_left(A.left_basis()[i].first, B.left_basis()[j].first),
60  pb_right(A.right_basis()[i].first, B.right_basis()[j].first),
61  A.left_basis()[i].second, B.left_basis()[j].second,
62  A.right_basis()[i].second, B.right_basis()[j].second);
63 
64  C.match_and_add_block(tmp, new_left, new_right);
65  }
66  }
67 }
size_type n_blocks() const
void match_and_add_block(Matrix const &, charge, charge)
size_t size(charge pc) const
void op_kron(Matrix2 &out, const Matrix1 &in, const Matrix1 &alfa, size_t out_y_offset, size_t out_x_offset, size_t ldim1, size_t ldim2, size_t rdim1, size_t rdim2)
Definition: alps_detail.hpp:65
Index< SymmGroup > const & right_basis() const
Index< SymmGroup > const & left_basis() const
T fuse(const A &ind, T d)
Fuse indices n[i] into one p = n[i] d^i.