Bridge++  Ver. 1.2.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 const std::string Fprop_Wilson_Shift::class_name = "Fprop_Wilson_Shift";
47 
48 //====================================================================
50 {
51  const string str_vlevel = params.get_string("verbose_level");
52 
53  m_vl = vout.set_verbose_level(str_vlevel);
54 
55  //- fetch and check input parameters
56  int Nshift;
57  valarray<double> sigma;
58  int Niter;
59  double Stop_cond;
60 
61  int err = 0;
62  err += params.fetch_int("number_of_shifts", Nshift);
63  err += params.fetch_double_vector("shifted_mass_difference", sigma);
64  err += params.fetch_int("maximum_number_of_iteration", Niter);
65  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
66 
67  if (err) {
68  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
69  abort();
70  }
71 
72 
73  set_parameters(Nshift, sigma, Niter, Stop_cond);
74 }
75 
76 
77 //====================================================================
78 void Fprop_Wilson_Shift::set_parameters(const int Nshift, const valarray<double> sigma,
79  const int Niter, const double Stop_cond)
80 {
81  //- print input parameters
82  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
83  vout.general(m_vl, " Nshift = %d\n", Nshift);
84  for (int i = 0; i < Nshift; ++i) {
85  vout.general(m_vl, " sigma[%d] = %16.8e\n", i, sigma[i]);
86  }
87  vout.general(m_vl, " Niter = %d\n", Niter);
88  vout.general(m_vl, " Stop_cond = %16.8e\n", Stop_cond);
89 
90  //- range check
91  // NB. Nshift,sigma == 0 is allowed.
92  int err = 0;
93  err += ParameterCheck::non_zero(Niter);
94  err += ParameterCheck::square_non_zero(Stop_cond);
95 
96  if (err) {
97  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
98  abort();
99  }
100 
101  //- store values
102  m_Nshift = Nshift;
103  m_sigma.resize(Nshift);
104  m_sigma = sigma;
105 
106  m_Niter = Niter;
107  m_Stop_cond = Stop_cond;
108 }
109 
110 
111 //====================================================================
112 double Fprop_Wilson_Shift::calc(std::valarray<Field_F> *xq2,
113  const Field_F& b)
114 {
115  int Nin = b.nin();
116  int Nvol = b.nvol();
117  int Nex = b.nex();
118 
119  int Nshift = m_Nshift;
120 
121  std::valarray<double> sigma = m_sigma;
122 
123  std::valarray<Field> xq(Nshift);
124 
125  for (int i = 0; i < Nshift; ++i) {
126  xq[i].reset(Nin, Nvol, Nex);
127  }
128 
129  int Nconv;
130  double diff;
131 
132 
133  // vout.general(m_vl, "size of xq = %d\n", xq->size());
134  // vout.general(m_vl, "size of xq[0] = %d\n", xq[0].nvol());
135 
136  vout.general(m_vl, "%s:\n", class_name.c_str());
137  vout.general(m_vl, " Number of shift values = %d\n", sigma.size());
138  assert(xq2->size() == sigma.size());
139 
140  m_fopr->set_mode("DdagD");
141 
142  // std::valarray<Field_F>* xq2 = new std::valarray<Field_F>;
143 
144  /*
145  std::valarray<Field_F>* xq2;
146  xq2->resize(xq->size());
147  for(int i=0; i<xq->size(); ++i){
148  xq2[i] = (Field*) xq[i];
149  }
150  */
151 
153  solver->solve(xq, sigma, (Field)b, Nconv, diff);
154 
155  vout.general(m_vl, " residues of solutions(2):\n");
156 
157  // Field version: works
158  Field s((Field)b);
159  Field x((Field)b);
160  Field t((Field)b);
161  double diff1 = 0.0; // superficial initialization
162  for (int i = 0; i < Nshift; ++i) {
163  x = xq[i];
164  double sg = sigma[i];
165  s = m_fopr->mult(x);
166  s += sg * x;
167  s -= t;
168  //double diff1 = s * s;
169  diff1 = s * s;
170 
171  vout.general(m_vl, "i_shift,diff = %6d %22.15e\n", i, diff1);
172  }
173 
174  for (int i = 0; i < Nshift; ++i) {
175  (*xq2)[i] = (Field_F)xq[i];
176  }
177 
178  // Field_F version: does not work
179  // This will be solved by Noaki-san someday.
180 
181  /*
182  Field_F s(b);
183  for(int i=0; i<Nshift; ++i){
184  double sg = sigma[i];
185  s = m_fopr->mult(xq[i]);
186  s += sg * xq[i];
187  s -= b;
188  double diff1 = s * s;
189  vout.general(m_vl, "%6d %22.15e\n",i,diff1);
190  }
191  */
192 
193  double result = diff1;
194 
195  delete solver;
196 
197  return result;
198 }
BridgeIO vout
Definition: bridgeIO.cpp:207
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
void general(const char *format,...)
Definition: bridgeIO.cpp:38
void Register_int(const string &, const int)
Definition: parameters.cpp:331
const Field mult(const Field &f)
multiplies fermion operator to a given field and returns the resultant field.
Definition: fopr_Wilson.h:75
Container of Field-type object.
Definition: field.h:37
int nvol() const
Definition: field.h:101
Multishift Conjugate Gradient solver.
static const std::string class_name
Class for parameters.
Definition: parameters.h:40
Wilson-type fermion field.
Definition: field_F.h:37
int square_non_zero(const double v)
Definition: checker.cpp:41
int fetch_double_vector(const string &key, std::valarray< double > &val) const
Definition: parameters.cpp:158
int nin() const
Definition: field.h:100
int nex() const
Definition: field.h:102
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: fopr_Wilson.cpp:91
void solve(std::valarray< Field > &solution, std::valarray< double > shift, const Field &source, int &Nconv, double &diff)
static bool Register(const std::string &realm, const creator_callback &cb)
std::valarray< double > m_sigma
int non_zero(const double v)
Definition: checker.cpp:31
void Register_double_vector(const string &, const std::valarray< double > &)
Definition: parameters.cpp:338
void Register_double(const string &, const double)
Definition: parameters.cpp:324
Bridge::VerboseLevel m_vl
void set_parameters(const Parameters &params)
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:85
int fetch_int(const string &key, int &val) const
Definition: parameters.cpp:141
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191
double calc(std::valarray< Field_F > *, const Field_F &)