Bridge++  Ver. 1.3.x
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 
21 //- parameter entry
22 namespace {
23  void append_entry(Parameters& param)
24  {
25  param.Register_int("number_of_shifts", 0);
26  param.Register_double_vector("shifted_mass_difference", std::vector<double>());
27 
28  param.Register_int("maximum_number_of_iteration", 0);
29  param.Register_double("convergence_criterion_squared", 0.0);
30 
31  param.Register_string("verbose_level", "NULL");
32  }
33 
34 
35 #ifdef USE_PARAMETERS_FACTORY
36  bool init_param = ParametersFactory::Register("Fprop_Wilson_Shift", append_entry);
37 #endif
38 }
39 //- end
40 
41 //- parameters class
43 //- end
44 
45 const std::string Fprop_Wilson_Shift::class_name = "Fprop_Wilson_Shift";
46 
47 //====================================================================
49 {
50  const string str_vlevel = params.get_string("verbose_level");
51 
52  m_vl = vout.set_verbose_level(str_vlevel);
53 
54  //- fetch and check input parameters
55  int Nshift;
56  std::vector<double> sigma;
57  int Niter;
58  double Stop_cond;
59 
60  int err = 0;
61  err += params.fetch_int("number_of_shifts", Nshift);
62  err += params.fetch_double_vector("shifted_mass_difference", sigma);
63  err += params.fetch_int("maximum_number_of_iteration", Niter);
64  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
65 
66  if (err) {
67  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
68  exit(EXIT_FAILURE);
69  }
70 
71 
72  set_parameters(Nshift, sigma, Niter, Stop_cond);
73 }
74 
75 
76 //====================================================================
77 void Fprop_Wilson_Shift::set_parameters(const int Nshift, const std::vector<double> sigma,
78  const int Niter, const double Stop_cond)
79 {
80  //- print input parameters
81  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
82  vout.general(m_vl, " Nshift = %d\n", Nshift);
83  for (int i = 0; i < Nshift; ++i) {
84  vout.general(m_vl, " sigma[%d] = %16.8e\n", i, sigma[i]);
85  }
86  vout.general(m_vl, " Niter = %d\n", Niter);
87  vout.general(m_vl, " Stop_cond = %16.8e\n", Stop_cond);
88 
89  //- range check
90  // NB. Nshift,sigma == 0 is allowed.
91  int err = 0;
92  err += ParameterCheck::non_zero(Niter);
93  err += ParameterCheck::square_non_zero(Stop_cond);
94 
95  if (err) {
96  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
97  exit(EXIT_FAILURE);
98  }
99 
100  //- store values
101  m_Nshift = Nshift;
102  m_sigma.resize(Nshift);
103  m_sigma = sigma;
104 
105  m_Niter = Niter;
106  m_Stop_cond = Stop_cond;
107 }
108 
109 
110 //====================================================================
111 double Fprop_Wilson_Shift::calc(std::vector<Field_F> *xq2,
112  const Field_F& b)
113 {
114  int Nin = b.nin();
115  int Nvol = b.nvol();
116  int Nex = b.nex();
117 
118  int Nshift = m_Nshift;
119 
120  std::vector<double> sigma = m_sigma;
121 
122  std::vector<Field> xq(Nshift);
123 
124  for (int i = 0; i < Nshift; ++i) {
125  xq[i].reset(Nin, Nvol, Nex);
126  }
127 
128  int Nconv;
129  double diff;
130 
131 
132  // vout.general(m_vl, "size of xq = %d\n", xq->size());
133  // vout.general(m_vl, "size of xq[0] = %d\n", xq[0].nvol());
134 
135  vout.general(m_vl, "%s:\n", class_name.c_str());
136  vout.general(m_vl, " Number of shift values = %d\n", sigma.size());
137  assert(xq2->size() == sigma.size());
138 
139  m_fopr->set_mode("DdagD");
140 
141  // std::vector<Field_F>* xq2 = new std::vector<Field_F>;
142 
143  /*
144  std::vector<Field_F>* xq2;
145  xq2->resize(xq->size());
146  for(int i=0; i<xq->size(); ++i){
147  xq2[i] = (Field*) xq[i];
148  }
149  */
150 
152  solver->solve(xq, sigma, (Field)b, Nconv, diff);
153 
154  vout.general(m_vl, " residues of solutions(2):\n");
155 
156  // Field version: works
157  Field s((Field)b);
158  Field x((Field)b);
159  Field t((Field)b);
160  double diff1 = 0.0; // superficial initialization
161  for (int i = 0; i < Nshift; ++i) {
162  x = xq[i];
163  double sg = sigma[i];
164  m_fopr->mult(s, x);
165  axpy(s, sg, x);
166  axpy(s, -1.0, t);
167  diff1 = dot(s, s);
168 
169  vout.general(m_vl, "i_shift,diff = %6d %22.15e\n", i, diff1);
170  }
171 
172  for (int i = 0; i < Nshift; ++i) {
173  (*xq2)[i] = (Field_F)xq[i];
174  }
175 
176  double result = diff1;
177 
178  delete solver;
179 
180  return result;
181 }
BridgeIO vout
Definition: bridgeIO.cpp:278
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
double dot(const Field &y, const Field &x)
Definition: field.cpp:46
void general(const char *format,...)
Definition: bridgeIO.cpp:65
void Register_int(const string &, const int)
Definition: parameters.cpp:330
Container of Field-type object.
Definition: field.h:39
int nvol() const
Definition: field.h:116
Multishift Conjugate Gradient solver.
static const std::string class_name
Class for parameters.
Definition: parameters.h:38
Wilson-type fermion field.
Definition: field_F.h:37
int square_non_zero(const double v)
Definition: checker.cpp:41
int nin() const
Definition: field.h:115
std::vector< double > m_sigma
void mult(Field &v, const Field &f)
multiplies fermion operator to a given field (2nd argument)
int nex() const
Definition: field.h:117
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
static bool Register(const std::string &realm, const creator_callback &cb)
void Register_double_vector(const string &, const std::vector< double > &)
Definition: parameters.cpp:337
int non_zero(const double v)
Definition: checker.cpp:31
int fetch_double_vector(const string &key, std::vector< double > &val) const
Definition: parameters.cpp:158
void Register_double(const string &, const double)
Definition: parameters.cpp:323
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:87
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:28
void solve(std::vector< Field > &solution, const std::vector< double > &shift, const Field &source, int &Nconv, double &diff)
double calc(std::vector< Field_F > *, const Field_F &)