32 const valarray<double> sigma,
33 const Field& b,
int& Nconv,
double& diff)
const
37 int Nshift = sigma.size();
52 valarray<Field>
p(Nshift);
53 valarray<Field>
x(Nshift);
55 valarray<double>
zeta1(Nshift);
56 valarray<double>
zeta2(Nshift);
57 valarray<double>
csh2(Nshift);
58 valarray<double>
pp(Nshift);
64 for (
int i = 0; i < Nshift; ++i) {
65 p[i].reset(Nin, Nvol, Nex);
66 x[i].reset(Nin, Nvol, Nex);
69 csh2[i] = sigma[i] - sigma[0];
73 double alphap, betap, rrp;
76 solve_init(x, p, r, s, rr, zeta1, zeta2, csh2, alphap, betap);
79 for (
int it = 0; it < Niter; it++) {
80 solve_step(x, p, r, s, rr, zeta1, zeta2, sigma, csh2, alphap, betap,
84 if (rr * snorm < enorm) {
90 cout <<
"Not converged." << __FILE__ <<
"(" << __LINE__ <<
")" << endl;
95 for (
int i = 0; i < Nshift; ++i) {
100 double diff1 = s *
s;
103 if (diff1 > diff) diff = diff1;
107 for (
int i = 0; i < Nshift; ++i) {
114 solve_init(valarray<Field>& x, valarray<Field>& p,
116 valarray<double>& zeta1, valarray<double>& zeta2,
117 valarray<double>& csh2,
118 double& alphap,
double& betap)
const
120 int Nshift = p.size();
124 for (
int i = 0; i < Nshift; ++i) {
138 solve_step(valarray<Field>& x, valarray<Field>& p,
140 valarray<double>& zeta1, valarray<double>& zeta2,
141 const valarray<double>& sigma, valarray<double>& csh2,
142 double& alphap,
double& betap,
143 int& Nshift2,
double& snorm, valarray<double>& pp)
const
147 s += sigma[0] * p[0];
150 double pap = s * p[0];
151 double beta = -rrp / pap;
158 double alpha = rr / rrp;
165 double alphah = 1.0 + alphap * beta / betap;
166 for (
int ish = 1; ish <
Nshift2; ++ish) {
167 double zeta = (alphah - csh2[ish] * beta) / zeta1[ish]
168 + (1.0 - alphah) / zeta2[ish];
170 double zr = zeta / zeta1[ish];
171 double betas = beta * zr;
172 double alphas = alpha * zr * zr;
174 x[ish] -= betas * p[ish];
178 pp[ish] = p[ish] * p[ish];
181 zeta2[ish] = zeta1[ish];
185 for (
int ish = Nshift2 - 1; ish >= 0; --ish) {
187 if (pp[ish] > enorm) {
void solve_init(double &)
Container of Field-type object.
void solve_step(double &, const std::valarray< double > &)
std::valarray< double > pp
void solve(std::valarray< Field > &solution, std::valarray< double > shift, const Field &source, int &Nconv, double &diff)
std::valarray< double > zeta1
std::valarray< double > zeta2
std::valarray< double > csh2