Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
shiftsolver_CG_alt.cpp
Go to the documentation of this file.
1 
15 #include "shiftsolver_CG.h"
16 
17 #include <stdio.h>
18 #include <iostream>
19 
20 #include "commonParameters.h"
21 #include "communicator.h"
22 #include "bridgeIO.h"
23 using Bridge::vout;
24 
25 #include "fopr.h"
26 #include "field.h"
27 
28 
29 
30 //********************************************************************
31 void Shiftsolver_CG::solve(valarray<Field>& xq,
32  const valarray<double> sigma,
33  const Field& b, int& Nconv, double& diff) const
34 {
35  // vout.general(m_vl, "solver start\n");
36 
37  int Nshift = sigma.size();
38 
39  /*
40  vout.general(m_vl, "number of shift = %d\n", Nshift);
41  vout.general(m_vl, " values of shift:\n");
42  for(int i = 0; i<Nshift; ++i){
43  vout.general(m_vl, " %d %12.8f\n", i, sigma[i]);
44  }
45  */
46 
47  double snorm = 1.0 / b.norm2();
48 
49  Nconv = -1;
50  Field s(b);
51  Field r(s);
52  valarray<Field> p(Nshift);
53  valarray<Field> x(Nshift);
54 
55  valarray<double> zeta1(Nshift);
56  valarray<double> zeta2(Nshift);
57  valarray<double> csh2(Nshift);
58  valarray<double> pp(Nshift);
59 
60  int Nin = b.nin();
61  int Nvol = b.nvol();
62  int Nex = b.nex();
63  // vout.general(m_vl, "Nin, Nvol, Nex = %d, %d, %d\n",Nin,Nvol,Nex);
64  for (int i = 0; i < Nshift; ++i) {
65  p[i].reset(Nin, Nvol, Nex);
66  x[i].reset(Nin, Nvol, Nex);
67  zeta1[i] = 1.0;
68  zeta2[i] = 1.0;
69  csh2[i] = sigma[i] - sigma[0];
70  }
71 
72  double rr;
73  double alphap, betap, rrp;
74  int Nshift2 = Nshift;
75 
76  solve_init(x, p, r, s, rr, zeta1, zeta2, csh2, alphap, betap);
77  //vout.general(m_vl, " init: %22.15e\n",rr*snorm);
78 
79  for (int it = 0; it < Niter; it++) {
80  solve_step(x, p, r, s, rr, zeta1, zeta2, sigma, csh2, alphap, betap,
81  Nshift2, snorm, pp);
82  // vout.general(m_vl, "%6d %22.15e %4d\n",it,rr*snorm,Nshift2);
83 
84  if (rr * snorm < enorm) {
85  Nconv = it;
86  break;
87  }
88  }
89  if (Nconv == -1) {
90  cout << "Not converged." << __FILE__ << "(" << __LINE__ << ")" << endl;
91  abort();
92 
93  // vout.general(m_vl, " residues of solutions:\n");
94  diff = -1.0;
95  for (int i = 0; i < Nshift; ++i) {
96  // s = opr->mult(x[i]);
97  opr->mult(s, x[i]);
98  s += sigma[i] * x[i];
99  s -= b;
100  double diff1 = s * s;
101  diff1 *= snorm;
102  // vout.general(m_vl, "%6d %22.15e\n",i,diff1);
103  if (diff1 > diff) diff = diff1;
104  }
105  //vout.general(m_vl, " diff(max) = %22.15e \n",diff);
106 
107  for (int i = 0; i < Nshift; ++i) {
108  xq[i] = x[i];
109  }
110  }
111 
112 //********************************************************************
113  void Shiftsolver_CG::
114  solve_init(valarray<Field>& x, valarray<Field>& p,
115  Field& r, Field& s, double& rr,
116  valarray<double>& zeta1, valarray<double>& zeta2,
117  valarray<double>& csh2,
118  double& alphap, double& betap) const
119  {
120  int Nshift = p.size();
121 
122  //vout.general(m_vl, "number of shift = %d\n", Nshift);
123 
124  for (int i = 0; i < Nshift; ++i) {
125  p[i] = s;
126  x[i] = 0.0;
127  }
128 
129  r = s;
130  rr = r * r;
131  alphap = 0.0;
132  betap = 1.0;
133  }
134 
135 
136 //********************************************************************
137  void Shiftsolver_CG::
138  solve_step(valarray<Field>& x, valarray<Field>& p,
139  Field& r, Field& s, double& rr,
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
144  {
145  //s = opr->mult(p[0]);
146  opr->mult(s, p[0]);
147  s += sigma[0] * p[0];
148 
149  double rrp = rr;
150  double pap = s * p[0];
151  double beta = -rrp / pap;
152 
153 
154  x[0] -= beta * p[0];
155  r += beta * s;
156  rr = r * r;
157 
158  double alpha = rr / rrp;
159 
160  p[0] *= alpha;
161  p[0] += r;
162 
163  pp[0] = rr;
164 
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];
169  zeta = 1.0 / zeta;
170  double zr = zeta / zeta1[ish];
171  double betas = beta * zr;
172  double alphas = alpha * zr * zr;
173 
174  x[ish] -= betas * p[ish];
175  p[ish] *= alphas;
176  p[ish] += zeta * r;
177 
178  pp[ish] = p[ish] * p[ish];
179  pp[ish] *= snorm;
180 
181  zeta2[ish] = zeta1[ish];
182  zeta1[ish] = zeta;
183  }
184 
185  for (int ish = Nshift2 - 1; ish >= 0; --ish) {
186  // vout.general(m_vl, "%4d %16.8e\n",ish,pp[ish]);
187  if (pp[ish] > enorm) {
188  Nshift2 = ish + 1;
189  break;
190  }
191  }
192 
193  alphap = alpha;
194  betap = beta;
195  }
196 
197 
198 //********************************************************************
199 //************************************************************END*****
BridgeIO vout
Definition: bridgeIO.cpp:207
double norm2() const
Definition: field.cpp:469
void solve_init(double &)
std::valarray< Field > p
Container of Field-type object.
Definition: field.h:37
int nvol() const
Definition: field.h:101
void solve_step(double &, const std::valarray< double > &)
std::valarray< double > pp
int nin() const
Definition: field.h:100
std::valarray< Field > x
int nex() const
Definition: field.h:102
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