ALPS MPS Codes
Reference documentation.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Classes | Namespaces | Functions
ietl_lanczos_solver.h File Reference
#include "dmrg/utils/BaseParameters.h"
#include <ietl/vectorspace.h>
#include <ietl/lanczos.h>

Go to the source code of this file.

Classes

struct  SiteProblem< Matrix, SymmGroup >
 
class  SingleSiteVS< Matrix, SymmGroup >
 
struct  ietl::vectorspace_traits< SingleSiteVS< Matrix, SymmGroup > >
 

Namespaces

 ietl
 

Functions

template<class Matrix , class SymmGroup , class Generator >
void ietl::generate (MPSTensor< Matrix, SymmGroup > &m, Generator g)
 
template<class Matrix , class SymmGroup >
void ietl::generate (MPSTensor< Matrix, SymmGroup > &m, MPSTensor< Matrix, SymmGroup > const &m2)
 
template<class Matrix , class SymmGroup >
void ietl::swap (MPSTensor< Matrix, SymmGroup > &x, MPSTensor< Matrix, SymmGroup > &y)
 
template<class Matrix , class SymmGroup >
MPSTensor< Matrix, SymmGroup >
::scalar_type 
ietl::dot (MPSTensor< Matrix, SymmGroup > const &x, MPSTensor< Matrix, SymmGroup > const &y)
 
template<class Matrix , class SymmGroup >
MPSTensor< Matrix, SymmGroup >
::real_type 
ietl::two_norm (MPSTensor< Matrix, SymmGroup > const &x)
 
template<class Matrix , class SymmGroup >
void ietl::mult (SiteProblem< Matrix, SymmGroup > const &H, MPSTensor< Matrix, SymmGroup > const &x, MPSTensor< Matrix, SymmGroup > &y)
 
template<class Matrix , class SymmGroup >
std::pair< double, MPSTensor
< Matrix, SymmGroup > > 
solve_ietl_lanczos (SiteProblem< Matrix, SymmGroup > &sp, MPSTensor< Matrix, SymmGroup > const &initial, BaseParameters &params)
 

Function Documentation

template<class Matrix , class SymmGroup >
std::pair<double, MPSTensor<Matrix, SymmGroup> > solve_ietl_lanczos ( SiteProblem< Matrix, SymmGroup > &  sp,
MPSTensor< Matrix, SymmGroup > const &  initial,
BaseParameters params 
)

Definition at line 130 of file ietl_lanczos_solver.h.

133 {
134  typedef MPSTensor<Matrix, SymmGroup> Vector;
135 
137 
138  typedef ietl::vectorspace<Vector> Vecspace;
139  typedef boost::lagged_fibonacci607 Gen;
140 
141  ietl::lanczos<SiteProblem<Matrix, SymmGroup>, SingleSiteVS<Matrix, SymmGroup> > lanczos(sp, vs);
142 
143  // Vector test;
144  // ietl::mult(sp, mps[site], test);
145  // test.divide_by_scalar(test.scalar_norm());
146  // test -= mps[site];
147  // maquis::cout << "How close to eigenstate? " << test.scalar_norm() << std::endl;
148 
149  double rel_tol = sqrt(std::numeric_limits<double>::epsilon());
150  double abs_tol = rel_tol;
151  int n_evals = 1;
152  ietl::lanczos_iteration_nlowest<double>
153  iter(100, n_evals, rel_tol, abs_tol);
154 
155  std::vector<double> eigen, err;
156  std::vector<int> multiplicity;
157 
158  try{
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;
164  }
165  catch (std::runtime_error& e) {
166  maquis::cout << "Error in eigenvalue calculation: " << std::endl;
167  maquis::cout << e.what() << std::endl;
168  exit(1);
169  }
170 
171 // maquis::cout << "Energies: ";
172 // std::copy(eigen.begin(), eigen.begin()+n_evals, std::ostream_iterator<double>(maquis::cout, " "));
173 // maquis::cout << std::endl;
174  // maquis::cout << "Energy: " << eigen[0] << std::endl;
175 
176  std::vector<double>::iterator start = eigen.begin();
177  std::vector<double>::iterator end = eigen.begin()+1;
178  std::vector<Vector> eigenvectors; // for storing the eigenvectors.
179  ietl::Info<double> info; // (m1, m2, ma, eigenvalue, residualm, status).
180 
181  try {
182  lanczos.eigenvectors(start, end, std::back_inserter(eigenvectors), info, initial, 100);
183  }
184  catch (std::runtime_error& e) {
185  maquis::cout << "Error in eigenvector calculation: " << std::endl;
186  maquis::cout << e.what() << std::endl;
187  exit(1);
188  }
189 
190  // for(int i = 0; i < info.size(); i++)
191  // maquis::cout << " m1(" << i+1 << "): " << info.m1(i) << ", m2(" << i+1 << "): "
192  // << info.m2(i) << ", ma(" << i+1 << "): " << info.ma(i) << " eigenvalue("
193  // << i+1 << "): " << info.eigenvalue(i) << " residual(" << i+1 << "): "
194  // << info.residual(i) << " error_info(" << i+1 << "): "
195  // << info.error_info(i) << "\n\n";
196 
197  assert( eigenvectors[0].scalar_norm() > 1e-8 );
198  assert( info.error_info(0) == 0 );
199 
200  return std::make_pair(*eigen.begin(), eigenvectors[0]);
201 }
block_matrix< Matrix, SymmGroup > sqrt(block_matrix< Matrix, SymmGroup > m)