18 #ifdef USE_PARAMETERS_FACTORY 
   37 #ifdef USE_PARAMETERS_FACTORY 
   52   const string str_vlevel = params.
get_string(
"verbose_level");
 
   57   string str_sortfield_type;
 
   60   double Enorm_eigen, Vthreshold;
 
   63   err += params.
fetch_string(
"eigensolver_mode", str_sortfield_type);
 
   64   err += params.
fetch_int(
"number_of_wanted_eigenvectors", Nk);
 
   65   err += params.
fetch_int(
"number_of_working_eigenvectors", Np);
 
   66   err += params.
fetch_int(
"maximum_number_of_iteration", Niter_eigen);
 
   67   err += params.
fetch_double(
"convergence_criterion_squared", Enorm_eigen);
 
   68   err += params.
fetch_double(
"threshold_value", Vthreshold);
 
   75   set_parameters(str_sortfield_type, Nk, Np, Niter_eigen, Enorm_eigen, Vthreshold);
 
   82                                            int Niter_eigen, 
double Enorm_eigen,
 
   95                                            int Niter_eigen, 
double Enorm_eigen,
 
  130                                   int& Nsbt, 
int& Nconv, 
const Field& b)
 
  144   if (Nk + Np > TDa.size()) {
 
  147   } 
else if (Nk + Np > vk.size()) {
 
  152   std::vector<double> TDb(Nm);
 
  153   std::vector<double> TDa2(Nm);
 
  154   std::vector<double> TDb2(Nm);
 
  155   std::vector<double> Qt(Nm * Nm);
 
  156   std::vector<int>    Iconv(Nm);
 
  158   int                Nin  = vk[0].nin();
 
  159   int                Nvol = vk[0].nvol();
 
  160   int                Nex  = vk[0].nex();
 
  161   std::vector<Field> B(Nm);
 
  162   for (
int k = 0; k < Nm; ++k) {
 
  163     B[k].reset(Nin, Nvol, Nex);
 
  184   double vnorm = 
dot(vk[0], vk[0]);
 
  185   vk[0].set(1.0 / sqrt(vnorm));
 
  189   for (
int k = 0; k < k2; ++k) {
 
  190     step(Nm, k, TDa, TDb, vk, f);
 
  194   for (
int iter = 0; iter < Niter_eigen; ++iter) {
 
  197     int Nm2 = Nm - kconv;
 
  199     for (
int k = k2; k < Nm; ++k) {
 
  200       step(Nm, k, TDa, TDb, vk, f);
 
  204     scal(f, TDb[Nm - 1]);
 
  207     for (
int k = 0; k < Nm2; ++k) {
 
  208       TDa2[k] = TDa[k + k1 - 1];
 
  209       TDb2[k] = TDb[k + k1 - 1];
 
  212     tqri(TDa2, TDb2, Nm2, Nm, Qt);
 
  219     for (
int ip = k2; ip < Nm; ++ip) {
 
  220       double Dsh  = TDa2[ip - kconv];
 
  223       qrtrf(TDa, TDb, Nm, Nm, Qt, Dsh, kmin, kmax);
 
  226     for (
int i = 0; i < (Nk + 1); ++i) {
 
  230     for (
int j = k1 - 1; j < k2 + 1; ++j) {
 
  231       for (
int k = 0; k < Nm; ++k) {
 
  232         axpy(B[j], Qt[k + Nm * j], vk[k]);
 
  236     for (
int j = k1 - 1; j < k2 + 1; ++j) {
 
  241     scal(f, Qt[Nm - 1 + Nm * (k2 - 1)]);
 
  242     axpy(f, TDb[k2 - 1], vk[k2]);
 
  245     beta_k = sqrt(beta_k);
 
  250     double beta_r = 1.0 / beta_k;
 
  252     scal(vk[k2], beta_r);
 
  253     TDb[k2 - 1] = beta_k;
 
  260     tqri(TDa2, TDb2, Nk, Nm, Qt);
 
  261     for (
int k = 0; k < Nk; ++k) {
 
  265     for (
int j = 0; j < Nk; ++j) {
 
  266       for (
int k = 0; k < Nk; ++k) {
 
  267         axpy(B[j], Qt[k + j * Nm], vk[k]);
 
  274     for (
int i = 0; i < Nk; ++i) {
 
  276       double vnum = 
dot(B[i], v);
 
  277       double vden = 
dot(B[i], B[i]);
 
  281       TDa2[i] = vnum / vden;
 
  282       axpy(v, -TDa2[i], B[i]);
 
  284       double vv = 
dot(v, v);
 
  288       if (vv < Enorm_eigen) {
 
  302     if (Kthreshold > 0) {
 
  307       for (
int i = 0; i < Kdis; ++i) {
 
  308         TDa[i] = TDa2[Iconv[i]];
 
  313       for (
int i = 0; i < Kdis; ++i) {
 
  314         vk[i] = B[Iconv[idx[i]]];
 
  317       Nsbt = Kdis - Kthreshold;
 
  339                                  std::vector<double>& TDb, std::vector<Field>& vk,
 
  347     double alph = 
dot(vk[k], w);
 
  349     axpy(w, -alph, vk[k]);
 
  351     double beta = 
dot(w, w);
 
  353     double beta_r = 1.0 / beta;
 
  355     scal(vk[k + 1], beta_r);
 
  361     axpy(w, -TDb[k - 1], vk[k - 1]);
 
  363     double alph = 
dot(vk[k], w);
 
  365     axpy(w, -alph, vk[k]);
 
  367     double beta = 
dot(w, w);
 
  369     double beta_r = 1.0 / beta;
 
  377     if (k < Nm - 1) vk[k + 1] = w;
 
  384                                                       std::vector<Field>& vk, 
int k)
 
  386   for (
int j = 0; j < k; ++j) {
 
  387     dcomplex prod = 
dotc(vk[j], w);
 
  388     prod = cmplx(-1.0, 0.0) * prod;
 
  389     axpy(w, prod, vk[j]);
 
  397   for (
int i = 0; i < Qt.size(); ++i) {
 
  401   for (
int k = 0; k < Nm; ++k) {
 
  402     Qt[k + k * Nm] = 1.0;
 
  409                                  std::vector<double>& TDb,
 
  410                                  int Nk, 
int Nm, std::vector<double>& Qt)
 
  412   int Niter = 100 * Nm;
 
  420   for (
int iter = 0; iter < Niter; ++iter) {
 
  422     double dsub = TDa[kmax - 1] - TDa[kmax - 2];
 
  423     double dd   = sqrt(dsub * dsub + 4.0 * TDb[kmax - 2] * TDb[kmax - 2]);
 
  424     double Dsh  = 0.5 * (TDa[kmax - 2] + TDa[kmax - 1]
 
  425                          + fabs(dd) * (dsub / fabs(dsub)));
 
  429     qrtrf(TDa, TDb, Nk, Nm, Qt, Dsh, kmin, kmax);
 
  432     for (
int j = kmax - 1; j >= kmin; --j) {
 
  433       double dds = fabs(TDa[j - 1]) + fabs(TDa[j]);
 
  434       if (fabs(TDb[j - 1]) + dds > dds) {
 
  437         for (
int j = 0; j < kmax - 1; ++j) {
 
  438           double dds = fabs(TDa[j]) + fabs(TDa[j + 1]);
 
  440           if (fabs(TDb[j]) + dds > dds) {
 
  468                                   std::vector<double>& TDb,
 
  469                                   int Nk, 
int Nm, std::vector<double>& Qt,
 
  470                                   double Dsh, 
int kmin, 
int kmax)
 
  475   double Fden = 1.0 / sqrt((TDa[k] - Dsh) * (TDa[k] - Dsh)
 
  477   double c = (TDa[k] - Dsh) * Fden;
 
  478   double s = -TDb[k] * Fden;
 
  480   double tmpa1 = TDa[k];
 
  481   double tmpa2 = TDa[k + 1];
 
  482   double tmpb  = TDb[k];
 
  484   TDa[k]     = c * c * tmpa1 + s * s * tmpa2 - 2.0 * c * s * tmpb;
 
  485   TDa[k + 1] = s * s * tmpa1 + c * c * tmpa2 + 2.0 * c * s * tmpb;
 
  486   TDb[k]     = c * s * (tmpa1 - tmpa2) + (c * c - s * s) * tmpb;
 
  488   TDb[k + 1] = c * TDb[k + 1];
 
  490   for (
int i = 0; i < Nk; ++i) {
 
  491     double Qtmp1 = Qt[i + Nm * k];
 
  492     double Qtmp2 = Qt[i + Nm * (k + 1)];
 
  493     Qt[i + Nm * k]       = c * Qtmp1 - s * Qtmp2;
 
  494     Qt[i + Nm * (k + 1)] = s * Qtmp1 + c * Qtmp2;
 
  498   for (
int k = kmin; k < kmax - 1; ++k) {
 
  499     double Fden = 1.0 / sqrt(x * x + TDb[k - 1] * TDb[k - 1]);
 
  500     double c    = TDb[k - 1] * Fden;
 
  501     double s    = -x * Fden;
 
  503     double tmpa1 = TDa[k];
 
  504     double tmpa2 = TDa[k + 1];
 
  505     double tmpb  = TDb[k];
 
  506     TDa[k]     = c * c * tmpa1 + s * s * tmpa2 - 2.0 * c * s * tmpb;
 
  507     TDa[k + 1] = s * s * tmpa1 + c * c * tmpa2 + 2.0 * c * s * tmpb;
 
  508     TDb[k]     = c * s * (tmpa1 - tmpa2) + (c * c - s * s) * tmpb;
 
  509     TDb[k - 1] = c * TDb[k - 1] - s * x;
 
  512       TDb[k + 1] = c * TDb[k + 1];
 
  515     for (
int i = 0; i < Nk; ++i) {
 
  516       double Qtmp1 = Qt[i + Nm * k];
 
  517       double Qtmp2 = Qt[i + Nm * (k + 1)];
 
  518       Qt[i + Nm * k]       = c * Qtmp1 - s * Qtmp2;
 
  519       Qt[i + Nm * (k + 1)] = s * Qtmp1 + c * Qtmp2;
 
void scal(Field &x, const double a)
scal(x, a): x = a * x 
 
Bridge::VerboseLevel m_vl
 
void qrtrf(std::vector< double > &TDa, std::vector< double > &TDb, int Nk, int Nm, std::vector< double > &Qt, double Dsh, int kmin, int kmax)
 
void Register_string(const string &, const string &)
 
double dot(const Field &y, const Field &x)
 
void general(const char *format,...)
 
void Register_int(const string &, const int)
 
void sort(std::vector< double > &v)
sort an array of values; v is sorted on exit. 
 
Container of Field-type object. 
 
void solve(std::vector< double > &TDa, std::vector< Field > &vk, int &Nsbt, int &Nconv, const Field &b)
 
void tqri(std::vector< double > &TDa, std::vector< double > &TDb, int Nk, int Nm, std::vector< double > &Qt)
 
void setUnit_Qt(int Nm, std::vector< double > &Qt)
 
static const std::string class_name
 
int square_non_zero(const double v)
 
Parameters_Eigensolver_IRLanczos()
 
void set_parameters(const Parameters ¶ms)
 
std::vector< int > sort_index(std::vector< double > &v)
sort an array and return list of index; v is sorted on exit. 
 
dcomplex dotc(const Field &y, const Field &x)
 
int fetch_string(const string &key, string &val) const 
 
void paranoiac(const char *format,...)
 
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y 
 
void step(int Nm, int k, std::vector< double > &TDa, std::vector< double > &TDb, std::vector< Field > &vk, Field &f)
 
void crucial(const char *format,...)
 
void schmidt_orthogonalization(Field &w, std::vector< Field > &vk, int k)
 
static bool Register(const std::string &realm, const creator_callback &cb)
 
virtual void mult(Field &, const Field &)=0
multiplies fermion operator to a given field (2nd argument) 
 
int non_negative(const int v)
 
void Register_double(const string &, const double)
 
int fetch_double(const string &key, double &val) const 
 
string get_string(const string &key) const 
 
bool comp(const double lhs, const double rhs)
call sort condition. 
 
int fetch_int(const string &key, int &val) const 
 
static VerboseLevel set_verbose_level(const std::string &str)