35 const std::string str_vlevel = params.
get_string(
"verbose_level");
40 std::string str_sortfield_type;
43 double Enorm_eigen, Vthreshold;
46 err += params.
fetch_string(
"eigensolver_mode", str_sortfield_type);
47 err += params.
fetch_int(
"number_of_wanted_eigenvectors", Nk);
48 err += params.
fetch_int(
"number_of_working_eigenvectors", Np);
49 err += params.
fetch_int(
"maximum_number_of_iteration", Niter_eigen);
50 err += params.
fetch_double(
"convergence_criterion_squared", Enorm_eigen);
51 err += params.
fetch_double(
"threshold_value", Vthreshold);
59 set_parameters(str_sortfield_type, Nk, Np, Niter_eigen, Enorm_eigen, Vthreshold);
65 const int Nk,
const int Np,
66 const int Niter_eigen,
const double Enorm_eigen,
67 const double Vthreshold)
79 const int Niter_eigen,
double Enorm_eigen,
114 int& Nsbt,
int& Nconv,
const Field& b)
125 const int Nm = Nk + Np;
127 if (Nk + Np > TDa.size()) {
130 }
else if (Nk + Np > vk.size()) {
135 std::vector<double> TDb(Nm);
136 std::vector<double> TDa2(Nm);
137 std::vector<double> TDb2(Nm);
138 std::vector<double> Qt(Nm * Nm);
139 std::vector<int> Iconv(Nm);
141 const int Nin = vk[0].nin();
142 const int Nvol = vk[0].nvol();
143 const int Nex = vk[0].nex();
144 std::vector<Field> B(Nm);
145 for (
int k = 0; k < Nm; ++k) {
146 B[k].reset(Nin, Nvol, Nex);
166 const double vnorm =
dot(vk[0], vk[0]);
167 vk[0].set(1.0 / sqrt(vnorm));
171 for (
int k = 0; k < k2; ++k) {
172 step(Nm, k, TDa, TDb, vk, f);
176 for (
int iter = 0; iter < Niter_eigen; ++iter) {
179 int Nm2 = Nm - kconv;
181 for (
int k = k2; k < Nm; ++k) {
182 step(Nm, k, TDa, TDb, vk, f);
186 scal(f, TDb[Nm - 1]);
189 for (
int k = 0; k < Nm2; ++k) {
190 TDa2[k] = TDa[k + k1 - 1];
191 TDb2[k] = TDb[k + k1 - 1];
194 tqri(TDa2, TDb2, Nm2, Nm, Qt);
201 for (
int ip = k2; ip < Nm; ++ip) {
202 double Dsh = TDa2[ip - kconv];
205 qrtrf(TDa, TDb, Nm, Nm, Qt, Dsh, kmin, kmax);
208 for (
int i = 0; i < (Nk + 1); ++i) {
212 for (
int j = k1 - 1; j < k2 + 1; ++j) {
213 for (
int k = 0; k < Nm; ++k) {
214 axpy(B[j], Qt[k + Nm * j], vk[k]);
218 for (
int j = k1 - 1; j < k2 + 1; ++j) {
223 scal(f, Qt[Nm - 1 + Nm * (k2 - 1)]);
224 axpy(f, TDb[k2 - 1], vk[k2]);
226 double beta_k =
dot(f, f);
227 beta_k = sqrt(beta_k);
232 const double beta_r = 1.0 / beta_k;
234 scal(vk[k2], beta_r);
235 TDb[k2 - 1] = beta_k;
242 tqri(TDa2, TDb2, Nk, Nm, Qt);
243 for (
int k = 0; k < Nk; ++k) {
247 for (
int j = 0; j < Nk; ++j) {
248 for (
int k = 0; k < Nk; ++k) {
249 axpy(B[j], Qt[k + j * Nm], vk[k]);
256 for (
int i = 0; i < Nk; ++i) {
258 const double vnum =
dot(B[i], v);
259 const double vden =
dot(B[i], B[i]);
263 TDa2[i] = vnum / vden;
264 axpy(v, -TDa2[i], B[i]);
266 const double vv =
dot(v, v);
270 if (vv < Enorm_eigen) {
284 if (Kthreshold > 0) {
289 for (
int i = 0; i < Kdis; ++i) {
290 TDa[i] = TDa2[Iconv[i]];
295 for (
int i = 0; i < Kdis; ++i) {
296 vk[i] = B[Iconv[idx[i]]];
299 Nsbt = Kdis - Kthreshold;
321 std::vector<double>& TDa, std::vector<double>& TDb,
322 std::vector<Field>& vk,
Field& w)
329 const double alph =
dot(vk[k], w);
331 axpy(w, -alph, vk[k]);
333 double beta =
dot(w, w);
336 const double beta_r = 1.0 / beta;
338 scal(vk[k + 1], beta_r);
344 axpy(w, -TDb[k - 1], vk[k - 1]);
346 const double alph =
dot(vk[k], w);
348 axpy(w, -alph, vk[k]);
350 double beta =
dot(w, w);
353 const double beta_r = 1.0 / beta;
361 if (k < Nm - 1) vk[k + 1] = w;
368 const std::vector<Field>& vk,
const int k)
370 for (
int j = 0; j < k; ++j) {
371 dcomplex prod =
dotc(vk[j], w);
372 prod *= cmplx(-1.0, 0.0);
373 axpy(w, prod, vk[j]);
381 for (
int i = 0; i < Qt.size(); ++i) {
385 for (
int k = 0; k < Nm; ++k) {
386 Qt[k + k * Nm] = 1.0;
393 std::vector<double>& TDb,
394 const int Nk,
const int Nm, std::vector<double>& Qt)
396 const int Niter = 100 * Nm;
404 for (
int iter = 0; iter < Niter; ++iter) {
406 double dsub = TDa[kmax - 1] - TDa[kmax - 2];
407 double dd = sqrt(dsub * dsub + 4.0 * TDb[kmax - 2] * TDb[kmax - 2]);
408 double Dsh = 0.5 * (TDa[kmax - 2] + TDa[kmax - 1]
409 + fabs(dd) * (dsub / fabs(dsub)));
413 qrtrf(TDa, TDb, Nk, Nm, Qt, Dsh, kmin, kmax);
416 for (
int j = kmax - 1; j >= kmin; --j) {
417 double dds = fabs(TDa[j - 1]) + fabs(TDa[j]);
418 if (fabs(TDb[j - 1]) + dds > dds) {
421 for (
int j = 0; j < kmax - 1; ++j) {
422 double dds = fabs(TDa[j]) + fabs(TDa[j + 1]);
424 if (fabs(TDb[j]) + dds > dds) {
452 std::vector<double>& TDb,
453 const int Nk,
const int Nm, std::vector<double>& Qt,
454 const double Dsh,
const int kmin,
const int kmax)
456 const int k = kmin - 1;
458 const double Fden = 1.0 / sqrt((TDa[k] - Dsh) * (TDa[k] - Dsh)
460 const double c = (TDa[k] - Dsh) * Fden;
461 const double s = -TDb[k] * Fden;
463 const double tmpa1 = TDa[k];
464 const double tmpa2 = TDa[k + 1];
465 const double tmpb = TDb[k];
467 TDa[k] = c * c * tmpa1 + s * s * tmpa2 - 2.0 * c * s * tmpb;
468 TDa[k + 1] = s * s * tmpa1 + c * c * tmpa2 + 2.0 * c * s * tmpb;
469 TDb[k] = c * s * (tmpa1 - tmpa2) + (c * c - s * s) * tmpb;
470 double x = -s * TDb[k + 1];
471 TDb[k + 1] = c * TDb[k + 1];
473 for (
int i = 0; i < Nk; ++i) {
474 double Qtmp1 = Qt[i + Nm * k];
475 double Qtmp2 = Qt[i + Nm * (k + 1)];
476 Qt[i + Nm * k] = c * Qtmp1 - s * Qtmp2;
477 Qt[i + Nm * (k + 1)] = s * Qtmp1 + c * Qtmp2;
481 for (
int k = kmin; k < kmax - 1; ++k) {
482 double Fden = 1.0 / sqrt(x * x + TDb[k - 1] * TDb[k - 1]);
483 double c = TDb[k - 1] * Fden;
484 double s = -x * Fden;
486 double tmpa1 = TDa[k];
487 double tmpa2 = TDa[k + 1];
488 double tmpb = TDb[k];
489 TDa[k] = c * c * tmpa1 + s * s * tmpa2 - 2.0 * c * s * tmpb;
490 TDa[k + 1] = s * s * tmpa1 + c * c * tmpa2 + 2.0 * c * s * tmpb;
491 TDb[k] = c * s * (tmpa1 - tmpa2) + (c * c - s * s) * tmpb;
492 TDb[k - 1] = c * TDb[k - 1] - s * x;
495 TDb[k + 1] = c * TDb[k + 1];
498 for (
int i = 0; i < Nk; ++i) {
499 double Qtmp1 = Qt[i + Nm * k];
500 double Qtmp2 = Qt[i + Nm * (k + 1)];
501 Qt[i + Nm * k] = c * Qtmp1 - s * Qtmp2;
502 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 setUnit_Qt(const int Nm, std::vector< double > &Qt)
void detailed(const char *format,...)
double dot(const Field &y, const Field &x)
void general(const char *format,...)
void sort(std::vector< double > &v)
sort an array of values; v is sorted on exit.
Container of Field-type object.
int fetch_double(const string &key, double &value) const
void solve(std::vector< double > &TDa, std::vector< Field > &vk, int &Nsbt, int &Nconv, const Field &b)
int fetch_string(const string &key, string &value) const
static const std::string class_name
int square_non_zero(const double v)
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_int(const string &key, int &value) const
void paranoiac(const char *format,...)
void qrtrf(std::vector< double > &TDa, std::vector< double > &TDb, const int Nk, const int Nm, std::vector< double > &Qt, const double Dsh, const int kmin, const int kmax)
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
void crucial(const char *format,...)
virtual void mult(Field &, const Field &)=0
multiplies fermion operator to a given field (2nd argument)
int non_negative(const int v)
void step(const int Nm, const int k, std::vector< double > &TDa, std::vector< double > &TDb, std::vector< Field > &vk, Field &f)
void tqri(std::vector< double > &TDa, std::vector< double > &TDb, const int Nk, const int Nm, std::vector< double > &Qt)
string get_string(const string &key) const
bool comp(const double lhs, const double rhs)
call sort condition.
static VerboseLevel set_verbose_level(const std::string &str)
void schmidt_orthogonalization(Field &w, const std::vector< Field > &vk, const int k)