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