Program Listing for File Lanczos.cpp

Return to documentation for file (src_ed/Hamiltonian/Lanczos.cpp)

#include "Lanczos.hpp"

//------------------------------------------------------------------------------
// external variables or declarations

using namespace std;
std::normal_distribution<double> normal_dis(0.0, 1.0);

//------------------------------------------------------------------------------
// variables local to this file



void EigensystemTridiagonal(bool evector_flag, vector<double> &alpha, vector<double> &beta, vector<double> &energy, vector<double> &evector)
{
  if(alpha.size()==1){
    energy.clear();
    erase(evector);
    energy.push_back(alpha[0]);
    if(evector_flag) evector.push_back(1.0);
    return;
  }
  size_t M = alpha.size();

  vector<double> d(alpha), e(beta), work(2*M), z(M*M);

  char jobz;

  if(evector_flag) jobz='V'; else jobz='N';
  integer info, ldz, nn;
  nn = M;
  ldz = M;

  // call to a LAPACK routine
  dstev_(&jobz, &nn, (doublereal*)d.data(), (doublereal*)e.data(), (doublereal*)z.data(), &ldz, (doublereal*)work.data(), &info);

  QCM_ASSERT((int)info==0);

  energy.assign(d.begin(),d.begin()+M);
  if(evector_flag) evector.assign(z.begin(), z.begin()+M);
}