19 #ifdef USE_PARAMETERS_FACTORY
38 #ifdef USE_PARAMETERS_FACTORY
51 const string str_vlevel = params.
get_string(
"verbose_level");
56 string str_sortfield_type;
59 double Enorm_eigen, Vthreshold;
62 err += params.
fetch_string(
"eigensolver_mode", str_sortfield_type);
63 err += params.
fetch_int(
"number_of_wanted_eigenvectors", Nk);
64 err += params.
fetch_int(
"number_of_working_eigenvectors", Np);
65 err += params.
fetch_int(
"maximum_number_of_iteration", Niter_eigen);
66 err += params.
fetch_double(
"convergence_criterion_squared", Enorm_eigen);
67 err += params.
fetch_double(
"threshold_value", Vthreshold);
70 vout.
crucial(
m_vl,
"Eigensolver_IRLanczos: fetch error, input parameter not found.\n");
81 int Niter_eigen,
double Enorm_eigen,
101 vout.
crucial(
m_vl,
"Eigensolver_IRLanczos: parameter range check failed.\n");
116 int& Nsbt,
int& Nconv,
const Field& b)
130 if (Nk + Np > TDa.size()) {
131 vout.
crucial(
m_vl,
"Eigensolver_IRLanczos: valarray TDa is too small.\n");
133 }
else if (Nk + Np > vk.size()) {
134 vout.
crucial(
m_vl,
"Eigensolver_IRLanczos: valarray vk is too small.\n");
138 valarray<double> TDb(Nm);
139 valarray<double> TDa2(Nm);
140 valarray<double> TDb2(Nm);
141 valarray<double> Qt(Nm * Nm);
142 valarray<int> Iconv(Nm);
144 int Nin = vk[0].nin();
145 int Nvol = vk[0].nvol();
146 int Nex = vk[0].nex();
147 valarray<Field> B(Nm);
148 for (
int k = 0; k < Nm; ++k) {
149 B[k].reset(Nin, Nvol, Nex);
170 double vnorm = vk[0] * vk[0];
171 vk[0] = 1.0 / sqrt(vnorm);
175 for (
int k = 0; k < k2; ++k) {
176 step(Nm, k, TDa, TDb, vk, f);
180 for (
int iter = 0; iter < Niter_eigen; ++iter) {
183 int Nm2 = Nm - kconv;
185 for (
int k = k2; k < Nm; ++k) {
186 step(Nm, k, TDa, TDb, vk, f);
192 for (
int k = 0; k < Nm2; ++k) {
193 TDa2[k] = TDa[k + k1 - 1];
194 TDb2[k] = TDb[k + k1 - 1];
197 tqri(TDa2, TDb2, Nm2, Nm, Qt);
204 for (
int ip = k2; ip < Nm; ++ip) {
205 double Dsh = TDa2[ip - kconv];
208 qrtrf(TDa, TDb, Nm, Nm, Qt, Dsh, kmin, kmax);
211 for (
int i = 0; i < (Nk + 1); ++i) {
215 for (
int j = k1 - 1; j < k2 + 1; ++j) {
216 for (
int k = 0; k < Nm; ++k) {
217 B[j] += Qt[k + Nm * j] * vk[k];
221 for (
int j = k1 - 1; j < k2 + 1; ++j) {
226 f *= Qt[Nm - 1 + Nm * (k2 - 1)];
227 f += TDb[k2 - 1] * vk[k2];
229 beta_k = sqrt(beta_k);
234 double beta_r = 1.0 / beta_k;
236 TDb[k2 - 1] = beta_k;
243 tqri(TDa2, TDb2, Nk, Nm, Qt);
244 for (
int k = 0; k < Nk; ++k) {
248 for (
int j = 0; j < Nk; ++j) {
249 for (
int k = 0; k < Nk; ++k) {
250 B[j] += Qt[k + j * Nm] * vk[k];
257 for (
int i = 0; i < Nk; ++i) {
259 double vnum = B[i] * v;
260 double vden = B[i] * B[i];
264 TDa2[i] = vnum / vden;
270 if (vv < Enorm_eigen) {
284 if (Kthreshold > 0) {
289 for (
int i = 0; i < Kdis; ++i) {
290 TDa[i] = TDa2[Iconv[i]];
296 Nsbt = Kdis - Kthreshold;
318 valarray<double>& TDb, valarray<Field>& vk,
326 double alph = vk[k] * w;
331 double beta_r = 1.0 / beta;
332 vk[k + 1] = beta_r * w;
338 w -= TDb[k - 1] * vk[k - 1];
339 double alph = vk[k] * w;
344 double beta_r = 1.0 / beta;
352 if (k < Nm - 1) vk[k + 1] = w;
359 valarray<Field>& vk,
int k)
361 for (
int j = 0; j < k; ++j) {
363 w.
daxpy(-prod, vk[j]);
371 for (
int i = 0; i < Qt.size(); ++i) {
375 for (
int k = 0; k < Nm; ++k) {
376 Qt[k + k * Nm] = 1.0;
383 valarray<double>& TDb,
384 int Nk,
int Nm, valarray<double>& Qt)
386 int Niter = 100 * Nm;
394 for (
int iter = 0; iter < Niter; ++iter) {
396 double dsub = TDa[kmax - 1] - TDa[kmax - 2];
397 double dd = sqrt(dsub * dsub + 4.0 * TDb[kmax - 2] * TDb[kmax - 2]);
398 double Dsh = 0.5 * (TDa[kmax - 2] + TDa[kmax - 1]
399 + fabs(dd) * (dsub / fabs(dsub)));
403 qrtrf(TDa, TDb, Nk, Nm, Qt, Dsh, kmin, kmax);
406 for (
int j = kmax - 1; j >= kmin; --j) {
407 double dds = fabs(TDa[j - 1]) + fabs(TDa[j]);
408 if (fabs(TDb[j - 1]) + dds > dds) {
411 for (
int j = 0; j < kmax - 1; ++j) {
412 double dds = fabs(TDa[j]) + fabs(TDa[j + 1]);
414 if (fabs(TDb[j]) + dds > dds) {
434 vout.
crucial(
m_vl,
"Eigensolver_IRLanczos: QL method NOT converged, Niter = %d.\n", Niter);
442 valarray<double>& TDb,
443 int Nk,
int Nm, valarray<double>& Qt,
444 double Dsh,
int kmin,
int kmax)
449 double Fden = 1.0 / sqrt((TDa[k] - Dsh) * (TDa[k] - Dsh)
451 double c = (TDa[k] - Dsh) * Fden;
452 double s = -TDb[k] * Fden;
454 double tmpa1 = TDa[k];
455 double tmpa2 = TDa[k + 1];
456 double tmpb = TDb[k];
458 TDa[k] = c * c * tmpa1 + s * s * tmpa2 - 2.0 * c * s * tmpb;
459 TDa[k + 1] = s * s * tmpa1 + c * c * tmpa2 + 2.0 * c * s * tmpb;
460 TDb[k] = c * s * (tmpa1 - tmpa2) + (c * c - s * s) * tmpb;
462 TDb[k + 1] = c * TDb[k + 1];
464 for (
int i = 0; i < Nk; ++i) {
465 double Qtmp1 = Qt[i + Nm * k];
466 double Qtmp2 = Qt[i + Nm * (k + 1)];
467 Qt[i + Nm * k] = c * Qtmp1 - s * Qtmp2;
468 Qt[i + Nm * (k + 1)] = s * Qtmp1 + c * Qtmp2;
472 for (
int k = kmin; k < kmax - 1; ++k) {
473 double Fden = 1.0 / sqrt(x * x + TDb[k - 1] * TDb[k - 1]);
474 double c = TDb[k - 1] * Fden;
475 double s = -x * Fden;
477 double tmpa1 = TDa[k];
478 double tmpa2 = TDa[k + 1];
479 double tmpb = TDb[k];
480 TDa[k] = c * c * tmpa1 + s * s * tmpa2 - 2.0 * c * s * tmpb;
481 TDa[k + 1] = s * s * tmpa1 + c * c * tmpa2 + 2.0 * c * s * tmpb;
482 TDb[k] = c * s * (tmpa1 - tmpa2) + (c * c - s * s) * tmpb;
483 TDb[k - 1] = c * TDb[k - 1] - s * x;
486 TDb[k + 1] = c * TDb[k + 1];
489 for (
int i = 0; i < Nk; ++i) {
490 double Qtmp1 = Qt[i + Nm * k];
491 double Qtmp2 = Qt[i + Nm * (k + 1)];
492 Qt[i + Nm * k] = c * Qtmp1 - s * Qtmp2;
493 Qt[i + Nm * (k + 1)] = s * Qtmp1 + c * Qtmp2;