27 #ifndef IETL_LANCZOS_SOLVER_H
28 #define IETL_LANCZOS_SOLVER_H
49 template<
class Matrix,
class SymmGroup>
56 template<
class Matrix,
class SymmGroup>
64 template<
class Matrix,
class SymmGroup>
struct SiteProblem;
66 template<
class Matrix,
class SymmGroup>
73 , ortho_vecs(ortho_vecs)
75 for (std::size_t k = 0; k < m.
data().n_blocks(); ++k)
92 it != ortho_vecs.end(); ++it)
98 std::vector<MPSTensor<Matrix, SymmGroup> > ortho_vecs;
103 #include <ietl/vectorspace.h>
107 template<
class Matrix,
class SymmGroup>
116 template<
class Matrix,
class SymmGroup>
126 #include <ietl/lanczos.h>
128 template<
class Matrix,
class SymmGroup>
129 std::pair<double, MPSTensor<Matrix, SymmGroup> >
138 typedef ietl::vectorspace<Vector> Vecspace;
139 typedef boost::lagged_fibonacci607 Gen;
149 double rel_tol =
sqrt(std::numeric_limits<double>::epsilon());
150 double abs_tol = rel_tol;
152 ietl::lanczos_iteration_nlowest<double>
153 iter(100, n_evals, rel_tol, abs_tol);
155 std::vector<double> eigen, err;
156 std::vector<int> multiplicity;
159 lanczos.calculate_eigenvalues(iter, initial);
160 eigen = lanczos.eigenvalues();
161 err = lanczos.errors();
162 multiplicity = lanczos.multiplicities();
163 maquis::cout <<
"IETL used " << iter.iterations() <<
" iterations." << std::endl;
165 catch (std::runtime_error& e) {
166 maquis::cout <<
"Error in eigenvalue calculation: " << std::endl;
167 maquis::cout << e.what() << std::endl;
176 std::vector<double>::iterator start = eigen.begin();
177 std::vector<double>::iterator end = eigen.begin()+1;
178 std::vector<Vector> eigenvectors;
179 ietl::Info<double> info;
182 lanczos.eigenvectors(start, end, std::back_inserter(eigenvectors), info, initial, 100);
184 catch (std::runtime_error& e) {
185 maquis::cout <<
"Error in eigenvector calculation: " << std::endl;
186 maquis::cout << e.what() << std::endl;
197 assert( eigenvectors[0].scalar_norm() > 1e-8 );
198 assert( info.error_info(0) == 0 );
200 return std::make_pair(*eigen.begin(), eigenvectors[0]);
real_type scalar_norm() const
void make_left_paired() const
MPSTensor< Matrix, SymmGroup >::value_type scalar_type
MPOTensor< Matrix, SymmGroup > const & mpo
Matrix::value_type value_type
friend MPSTensor< Matrix, SymmGroup > new_vector(SingleSiteVS const &vs)
std::pair< double, MPSTensor< Matrix, SymmGroup > > solve_ietl_lanczos(SiteProblem< Matrix, SymmGroup > &sp, MPSTensor< Matrix, SymmGroup > const &initial, BaseParameters ¶ms)
maquis::traits::scalar_type< Matrix >::type scalar_type
SingleSiteVS(MPSTensor< Matrix, SymmGroup > const &m, std::vector< MPSTensor< Matrix, SymmGroup > > const &ortho_vecs)
scalar_type scalar_overlap(MPSTensor const &) const
friend std::size_t vec_dimension(SingleSiteVS const &vs)
void swap(MPSTensor< Matrix, SymmGroup > &x, MPSTensor< Matrix, SymmGroup > &y)
static MPSTensor< Matrix, SymmGroup > site_hamil2(MPSTensor< Matrix, SymmGroup > ket_tensor, Boundary< OtherMatrix, SymmGroup > const &left, Boundary< OtherMatrix, SymmGroup > const &right, MPOTensor< Matrix, SymmGroup > const &mpo)
Boundary< typename storage::constrained< Matrix >::type, SymmGroup > const & left
std::size_t num_rows(maquis::dmrg::one_matrix< T > const &m)
block_matrix< Matrix, SymmGroup > sqrt(block_matrix< Matrix, SymmGroup > m)
MPSTensor< Matrix, SymmGroup >::magnitude_type magnitude_type
MPSTensor< Matrix, SymmGroup >::scalar_type dot(MPSTensor< Matrix, SymmGroup > const &x, MPSTensor< Matrix, SymmGroup > const &y)
void generate(MPSTensor< Matrix, SymmGroup > &m, Generator g)
std::size_t num_cols(maquis::dmrg::one_matrix< T > const &m)
void project(MPSTensor< Matrix, SymmGroup > &t) const
Boundary< typename storage::constrained< Matrix >::type, SymmGroup > const & right
void swap_with(MPSTensor &b)
MPSTensor< Matrix, SymmGroup >::real_type two_norm(MPSTensor< Matrix, SymmGroup > const &x)
MPSTensor< Matrix, SymmGroup > vector_type
void mult(SiteProblem< Matrix, SymmGroup > const &H, MPSTensor< Matrix, SymmGroup > const &x, MPSTensor< Matrix, SymmGroup > &y)
block_matrix< Matrix, SymmGroup > & data()
maquis::traits::real_type< Matrix >::type real_type