Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fprop_Wilson_Shift.cpp
Go to the documentation of this file.
1 
14 #include "fprop_Wilson_Shift.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 //- parameter entry
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_int("number_of_shifts", 0);
27  param.Register_double_vector("shifted_mass_difference", valarray<double>());
28 
29  param.Register_int("maximum_number_of_iteration", 0);
30  param.Register_double("convergence_criterion_squared", 0.0);
31 
32  param.Register_string("verbose_level", "NULL");
33  }
34 
35 
36 #ifdef USE_PARAMETERS_FACTORY
37  bool init_param = ParametersFactory::Register("Fprop_Wilson_Shift", append_entry);
38 #endif
39 }
40 //- end
41 
42 //- parameters class
44 //- end
45 
46 //====================================================================
48 {
49  const string str_vlevel = params.get_string("verbose_level");
50 
51  m_vl = vout.set_verbose_level(str_vlevel);
52 
53  //- fetch and check input parameters
54  int Nshift;
55  valarray<double> sigma;
56  int Niter;
57  double Stop_cond;
58 
59  int err = 0;
60  err += params.fetch_int("number_of_shifts", Nshift);
61  err += params.fetch_double_vector("shifted_mass_difference", sigma);
62  err += params.fetch_int("maximum_number_of_iteration", Niter);
63  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
64 
65  if (err) {
66  vout.crucial(m_vl, "Fprop_Wilson_Shift: fetch error, input parameter not found.\n");
67  abort();
68  }
69 
70 
71  set_parameters(Nshift, sigma, Niter, Stop_cond);
72 }
73 
74 
75 //====================================================================
76 void Fprop_Wilson_Shift::set_parameters(const int Nshift, const valarray<double> sigma,
77  const int Niter, const double Stop_cond)
78 {
79  //- print input parameters
80  vout.general(m_vl, "Parameters of Fprop_Wilson_Shift:\n");
81  vout.general(m_vl, " Nshift = %d\n", Nshift);
82  for (int i = 0; i < Nshift; ++i) {
83  vout.general(m_vl, " sigma[%d] = %16.8e\n", i, sigma[i]);
84  }
85  vout.general(m_vl, " Niter = %d\n", Niter);
86  vout.general(m_vl, " Stop_cond = %16.8e\n", Stop_cond);
87 
88  //- range check
89  // NB. Nshift,sigma == 0 is allowed.
90  int err = 0;
91  err += ParameterCheck::non_zero(Niter);
92  err += ParameterCheck::square_non_zero(Stop_cond);
93 
94  if (err) {
95  vout.crucial(m_vl, "Fprop_Wilson_Shift: parameter range check failed.\n");
96  abort();
97  }
98 
99  //- store values
100  m_Nshift = Nshift;
101  m_sigma.resize(Nshift);
102  m_sigma = sigma;
103 
104  m_Niter = Niter;
105  m_Stop_cond = Stop_cond;
106 }
107 
108 
109 //====================================================================
110 double Fprop_Wilson_Shift::calc(std::valarray<Field_F> *xq2,
111  const Field_F& b)
112 {
113  int Nin = b.nin();
114  int Nvol = b.nvol();
115  int Nex = b.nex();
116 
117  int Nshift = m_Nshift;
118  std::valarray<double> sigma = m_sigma;
119 
120  std::valarray<Field> xq(Nshift);
121 
122  for (int i = 0; i < Nshift; ++i) {
123  xq[i].reset(Nin, Nvol, Nex);
124  }
125 
126  int Nconv;
127  double diff;
128 
129 
130  // vout.general(m_vl, "size of xq = %d\n", xq->size());
131  // vout.general(m_vl, "size of xq[0] = %d\n", xq[0].nvol());
132 
133  vout.general(m_vl, "Fprop_Wilson_Shift:\n");
134  vout.general(m_vl, " Number of shift values = %d\n", sigma.size());
135  assert(xq2->size() == sigma.size());
136 
137  m_fopr->set_mode("DdagD");
138 
139  // std::valarray<Field_F>* xq2 = new std::valarray<Field_F>;
140 
141  /*
142  std::valarray<Field_F>* xq2;
143  xq2->resize(xq->size());
144  for(int i=0; i<xq->size(); ++i){
145  xq2[i] = (Field*) xq[i];
146  }
147  */
148 
150  solver->solve(xq, sigma, (Field)b, Nconv, diff);
151 
152  vout.general(m_vl, " residues of solutions(2):\n");
153 
154  // Field version: works
155  Field s((Field)b);
156  Field x((Field)b);
157  Field t((Field)b);
158  double diff1 = 0.0; // superficial initialization
159  for (int i = 0; i < Nshift; ++i) {
160  x = xq[i];
161  double sg = sigma[i];
162  s = m_fopr->mult(x);
163  s += sg * x;
164  s -= t;
165  //double diff1 = s * s;
166  diff1 = s * s;
167 
168  vout.general(m_vl, "i_shift,diff = %6d %22.15e\n", i, diff1);
169  }
170 
171  for (int i = 0; i < Nshift; ++i) {
172  (*xq2)[i] = (Field_F)xq[i];
173  }
174 
175  // Field_F version: does not work
176  // This will be solved by Noaki-san someday.
177 
178  /*
179  Field_F s(b);
180  for(int i=0; i<Nshift; ++i){
181  double sg = sigma[i];
182  s = m_fopr->mult(xq[i]);
183  s += sg * xq[i];
184  s -= b;
185  double diff1 = s * s;
186  vout.general(m_vl, "%6d %22.15e\n",i,diff1);
187  }
188  */
189 
190  double result = diff1;
191 
192  delete solver;
193 
194  return result;
195 }