35 const string str_vlevel = params.
get_string(
"verbose_level");
44 err += params.
fetch_int(
"maximum_number_of_iteration", Niter);
45 err += params.
fetch_double(
"convergence_criterion_squared", Stop_cond);
48 vout.
crucial(
m_vl,
"Shiftsolver_CG: fetch error, input parameter not found.\n");
83 std::valarray<double> sigma,
85 int& Nconv,
double& diff)
89 int Nshift = sigma.size();
93 for(
int i = 0; i<Nshift; ++i){
107 zeta1.resize(Nshift);
108 zeta2.resize(Nshift);
112 for (
int i = 0; i < Nshift; ++i) {
113 p[i].reset(Nin, Nvol, Nex);
114 x[i].reset(Nin, Nvol, Nex);
117 csh2[i] = sigma[i] - sigma[0];
131 for (
int iter = 0; iter <
m_Niter; iter++) {
148 for (
int i = 0; i < Nshift; ++i) {
150 s += sigma[i] *
x[i];
152 double diff1 =
s *
s;
153 diff1 = sqrt(diff1 * snorm);
157 if (diff1 > diff) diff = diff1;
162 for (
int i = 0; i < Nshift; ++i) {
171 int Nshift =
p.size();
175 for (
int i = 0; i < Nshift; ++i) {
189 const std::valarray<double>& sigma)
192 s += sigma[0] *
p[0];
195 double pa_p = s * p[0];
196 double beta = -rr_p / pa_p;
202 double alpha = rr / rr_p;
210 for (
int ish = 1; ish <
Nshift2; ++ish) {
211 double zeta = (alpha_h -
csh2[ish] * beta) /
zeta1[ish]
212 + (1.0 - alpha_h) /
zeta2[ish];
214 double zr = zeta /
zeta1[ish];
215 double beta_s = beta * zr;
216 double alpha_s = alpha * zr * zr;
218 x[ish] -= beta_s * p[ish];
222 pp[ish] = p[ish] * p[ish];
229 for (
int ish = Nshift2 - 1; ish >= 0; --ish) {