16 #ifdef USE_PARAMETERS_FACTORY
39 #ifdef USE_PARAMETERS_FACTORY
52 const string str_vlevel = params.
get_string(
"verbose_level");
67 err += params.
fetch_int(
"number_of_poles", Np);
70 err += params.
fetch_int(
"maximum_number_of_iteration", Niter_ms);
71 err += params.
fetch_double(
"convergence_criterion_squared", Stop_cond_ms);
75 vout.
crucial(
m_vl,
"Fopr_Overlap_5d: fetch error, input parameter not found.\n");
79 set_parameters(mq, M0, Np, x_min, x_max, Niter_ms, Stop_cond_ms, bc);
85 const int Np,
const double x_min,
const double x_max,
86 const int Niter_ms,
const double Stop_cond_ms,
87 const std::valarray<int> bc)
100 for (
int mu = 0; mu < Ndim; ++mu) {
118 assert(bc.size() == Ndim);
132 for (
int mu = 0; mu < Ndim; ++mu) {
147 for (
int i = 0; i <
m_Np; i++) {
151 for (
int i = 0; i <
m_Np; i++) {
160 for (
int ip = 0; ip <
m_Np; ++ip) {
161 int ik = m_Np - ip - 1;
166 b_sum = b_sum +
m_bl[ip];
175 for (
int ik = 0; ik <
m_Np; ++ik) {
181 for (
int ik = 0; ik <
m_Np; ++ik) {
199 int Nin = (*vk)[0].nin();
200 int Nvol = (*vk)[0].nvol();
201 int Nvol2 = Nvol / 2;
203 for (
int k = 0; k < 2 *
m_Nsbt; ++k) {
204 m_vk[k].reset(Nin, Nvol2, 1);
207 Field vt(Nin, Nvol, 1);
208 Field vt_eo(Nin, Nvol2, 1);
210 for (
int k = 0; k <
m_Nsbt; ++k) {
220 for (
int k = 0; k <
m_Nsbt; ++k) {
221 double sign_ev =
m_ev[k] / fabs(
m_ev[k]);
258 Field t(Nin, Nvol, Nex), v(Nin, Nvol, Nex);
266 }
else if (jd == -1) {
291 int Nvol2 = w.
nvol();
294 Field z(Nin, Nvol2, 1);
295 Field z1(Nin, Nvol2, 1);
296 Field z2(Nin, Nvol2, 1);
298 Field w1(Nin, Nvol2, 1);
299 Field v1(Nin, Nvol2, 1);
306 for (
int j = 0; j <
m_Np; ++j) {
339 int Nvol2 = w.
nvol();
342 Field vx(Nin, Nvol2, 1);
343 Field vy(Nin, Nvol2, 1);
344 Field vj(Nin, Nvol2, 1);
345 Field v_tmp(Nin, Nvol2, 1);
348 for (
int ip = 0; ip <
m_Np; ++ip) {
356 vy += -
m_rl[ip] * v_tmp;
364 for (
int ip = 0; ip <
m_Np; ++ip) {
367 vj += -
m_sl[ip] * vy;
382 for (
int ip = 0; ip <
m_Np; ++ip) {
412 double prd_r, prd_i, vr, vi;
414 for (
int k = 0; k <
m_Nsbt; ++k) {
428 double prd_r, prd_i, v_r, v_i;
431 for (
int k = 0; k <
m_Nsbt; ++k) {
448 valarray<dcomplex> c(Nsbt2 * Nsbt2);
449 valarray<dcomplex> cinv(Nsbt2 * Nsbt2);
450 valarray<dcomplex> vprd(Nsbt2 * Nsbt2);
451 valarray<dcomplex> W(Nsbt2 * Nsbt2);
453 valarray<dcomplex> c_src(Nsbt2);
454 valarray<dcomplex> c_x(Nsbt2);
456 int Nin =
m_vk[0].nin();
457 int Nvol =
m_vk[0].nvol();
458 Field w(Nin, Nvol, 1);
459 Field v1(Nin, Nvol, 1);
460 Field v2(Nin, Nvol, 1);
463 double u0inv_a = 1.0 / u0_a;
467 for (
int ieo = 0; ieo < 2; ++ieo) {
469 for (
int i = 0; i < Nsbt; ++i) {
470 for (
int j = 0; j < i + 1; ++j) {
471 int i2 = i + ieo * Nsbt;
472 int j2 = j + ieo * Nsbt;
476 vprd[i + j * Nsbt2] = cmplx(a_r, a_i);
477 vprd[i + Nsbt + (j + Nsbt) * Nsbt2] = cmplx(a_r, a_i);
478 vprd[j + i * Nsbt2] = cmplx(a_r, -a_i);
479 vprd[j + Nsbt + (i + Nsbt) * Nsbt2] = cmplx(a_r, -a_i);
483 for (
int i = 0; i < Nsbt; ++i) {
484 for (
int j = 0; j < i + 1; ++j) {
485 int i2 = i + ieo * Nsbt;
486 int j2 = j + ieo * Nsbt;
491 vprd[i + (j + Nsbt) * Nsbt2] = cmplx(a_r, a_i);
492 vprd[i + Nsbt + j * Nsbt2] = cmplx(a_r, a_i);
493 vprd[j + (i + Nsbt) * Nsbt2] = cmplx(a_r, -a_i);
494 vprd[j + Nsbt + i * Nsbt2] = cmplx(a_r, -a_i);
500 for (
int i = 0; i < Nsbt2; ++i) {
501 c[i + i * Nsbt2] = cmplx(-m_u0, 0.0);
504 for (
int i = 0; i < Nsbt; ++i) {
507 c[i + (i + Nsbt) * Nsbt2] = cmplx(prf, 0.0);
510 for (
int i = 0; i < Nsbt; ++i) {
511 for (
int j = Nsbt; j < Nsbt2; ++j) {
512 c[i + j * Nsbt2] += cmplx(m_u0, 0.0) * vprd[i + j * Nsbt2];
518 for (
int i = 0; i < Nsbt2; ++i) {
519 W[i + i * Nsbt2] = cmplx(u0_a, 0.0);
522 for (
int i = 0; i < Nsbt2; ++i) {
523 for (
int j = 0; j < Nsbt2; ++j) {
524 for (
int k = 0; k < Nsbt2; ++k) {
525 W[i + j * Nsbt2] += c[i + k * Nsbt2] * vprd[k + j * Nsbt2];
531 for (
int i = 0; i < Nsbt2; ++i) {
532 for (
int j = 0; j < Nsbt2; ++j) {
533 c_src[j] = cmplx(-u0inv_a, 0.0) * c[j + i * Nsbt2];
538 for (
int j = 0; j < Nsbt2; ++j) {
539 cinv[j + i * Nsbt2] = c_x[j];
544 for (
int i = 0; i < Nsbt2 * Nsbt2; ++i) {
549 for (
int i = 0; i < Nsbt2 * Nsbt2; ++i) {
564 assert(v.
size() == size);
569 for (
int i = 0; i < size; i += 2) {
570 prd_r += v.
cmp(i) * w.
cmp(i) + v.
cmp(i + 1) * w.
cmp(i + 1);
571 prd_i += v.
cmp(i) * w.
cmp(i + 1) - v.
cmp(i + 1) * w.
cmp(i);
581 const double a_r,
const double a_i)
585 assert(v.
size() == size);
588 for (
int i = 0; i < size; i += 2) {
589 v_r = a_r * w.
cmp(i) - a_i * w.
cmp(i + 1);
590 v_i = a_r * w.
cmp(i + 1) + a_i * w.
cmp(i);
606 int Nvol2 = w1.
nvol();
607 Field vt(Nin, Nvol2, 1);
610 int Nsbt2 = 2 * Nsbt;
611 valarray<dcomplex> prd_vb(Nsbt2), coeff(Nsbt2);
612 valarray<dcomplex> u0c(Nsbt2 * Nsbt2), u0cinv(Nsbt2 * Nsbt2);
623 for (
int k = 0; k < Nsbt; ++k) {
625 prd_vb[k] = cmplx(a_r, a_i);
628 for (
int k = 0; k < Nsbt; ++k) {
630 prd_vb[k + Nsbt] = cmplx(a_r, a_i);
633 for (
int i = 0; i < Nsbt2; ++i) {
634 coeff[i] = cmplx(0.0, 0.0);
635 for (
int j = 0; j < Nsbt2; ++j) {
636 coeff[i] += u0cinv[i + j * Nsbt2] * prd_vb[j];
644 for (
int k = 0; k < Nsbt; ++k) {
645 add_c(vt,
m_vk[k + ieo * Nsbt], real(coeff[k]), imag(coeff[k]));
650 for (
int k = 0; k < Nsbt; ++k) {
652 real(coeff[k + Nsbt]), imag(coeff[k + Nsbt]));
660 const valarray<dcomplex>& W,
const valarray<dcomplex>& c_src)
666 assert(c_x.size() == Nsbt2);
667 assert(c_src.size() == Nsbt2);
668 assert(W.size() == (Nsbt2 * Nsbt2));
670 valarray<dcomplex> x(Nsbt2);
671 valarray<dcomplex> r(Nsbt2);
672 valarray<dcomplex> p(Nsbt2);
673 valarray<dcomplex> s(Nsbt2);
674 valarray<dcomplex> vt(Nsbt2);
677 double Encg = 1.e-32;
679 double ww =
norm_c(c_src);
680 double snorm = 1.0 / ww;
686 for (
int i = 0; i < Nsbt2; ++i) {
687 for (
int j = 0; j < Nsbt2; ++j) {
688 s[i] += conj(W[j + i * Nsbt2]) * c_src[j];
701 if (rr * snorm < Encg)
goto converged;
704 for (
int iter = 0; iter < Niter; ++iter) {
708 double alpha = rr / pap;
710 x += cmplx(alpha, 0.0) * p;
711 r -= cmplx(alpha, 0.0) * s;
717 if (rr * snorm < Encg) {
722 double beta = rr / rr0;
724 p *= cmplx(beta, 0.0);
738 for (
int i = 0; i < Nsbt2; ++i) {
739 for (
int j = 0; j < Nsbt2; ++j) {
740 s[i] += W[i + j * Nsbt2] * x[j];
750 vout.
general(
m_vl,
" u0 solver: Nconv = %4d, diff = %12.4e\n", nconv, diff);
756 const valarray<dcomplex>& W,
757 const valarray<dcomplex>& v1)
759 int size = v1.size();
761 assert(v2.size() == size);
762 assert(W.size() == (size * size));
764 valarray<dcomplex> vt(size);
766 vt = cmplx(0.0, 0.0);
767 for (
int i = 0; i < size; ++i) {
768 for (
int j = 0; j < size; ++j) {
769 vt[i] += W[i + j * size] * v1[j];
773 v2 = cmplx(0.0, 0.0);
774 for (
int i = 0; i < size; ++i) {
775 for (
int j = 0; j < size; ++j) {
776 v2[i] += conj(W[j + i * size]) * vt[j];
789 for (
int i = 0; i < size; ++i) {
790 vv += real(v[i]) * real(v[i]) + imag(v[i]) * imag(v[i]);
799 const valarray<dcomplex>& w)
805 for (
int i = 0; i < size; ++i) {
806 vw += real(v[i]) * real(w[i]) + imag(v[i]) * imag(w[i]);