Bridge++  Ver.2.1.3
afopr_Rational-tmpl.h
Go to the documentation of this file.
1 
14 #include "Fopr/afopr_Rational.h"
15 
19 #include "lib/Tools/timer.h"
20 
21 //#ifdef USE_FACTORY_AUTOREGISTER
22 //namespace {
23 // bool init = Fopr_Rational::register_factory();
24 //}
25 //#endif
26 
27 template<typename AFIELD>
28 const std::string AFopr_Rational<AFIELD>::class_name = "AFopr_Rational";
29 
30 //====================================================================
31 template<typename AFIELD>
33 {
34  std::string vlevel;
35  if (!params.fetch_string("verbose_level", vlevel)) {
36  m_vl = vout.set_verbose_level(vlevel);
37  }
38 
39  //- fetch and check input parameters
40  int Np, n_exp, d_exp;
41  double x_min, x_max;
42  int Niter;
43  double Stop_cond;
44 
45  int err = 0;
46  err += params.fetch_int("number_of_poles", Np);
47  err += params.fetch_int("exponent_numerator", n_exp);
48  err += params.fetch_int("exponent_denominator", d_exp);
49  err += params.fetch_double("lower_bound", x_min);
50  err += params.fetch_double("upper_bound", x_max);
51  err += params.fetch_int("maximum_number_of_iteration", Niter);
52  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
53 
54  if (err) {
55  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
56  class_name.c_str());
57  exit(EXIT_FAILURE);
58  }
59 
60  set_parameters(Np, n_exp, d_exp, real_t(x_min), real_t(x_max),
61  Niter, real_t(Stop_cond));
62 }
63 
64 
65 //====================================================================
66 template<typename AFIELD>
68 {
69  params.set_int("number_of_poles", m_Np);
70  params.set_int("exponent_numerator", m_n_exp);
71  params.set_int("exponent_denominator", m_d_exp);
72  params.set_double("lower_bound", double(m_x_min));
73  params.set_double("upper_bound", double(m_x_max));
74  params.set_int("maximum_number_of_iteration", m_Niter);
75  params.set_double("convergence_criterion_squared", double(m_Stop_cond));
76 
77  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
78 }
79 
80 
81 //====================================================================
82 template<typename AFIELD>
84  const int Np,
85  const int n_exp, const int d_exp,
86  const real_t x_min, const real_t x_max,
87  const int Niter, const real_t Stop_cond)
88 {
89  //- print input parameters
90  vout.general(m_vl, "%s:\n", class_name.c_str());
91  vout.general(m_vl, " Np = %d\n", Np);
92  vout.general(m_vl, " n_exp = %d\n", n_exp);
93  vout.general(m_vl, " d_exp = %d\n", d_exp);
94  vout.general(m_vl, " x_min = %12.8f\n", x_min);
95  vout.general(m_vl, " x_max = %12.8f\n", x_max);
96  vout.general(m_vl, " Niter = %d\n", Niter);
97  vout.general(m_vl, " Stop_cond = %8.2e\n", Stop_cond);
98 
99  //- range check
100  int err = 0;
101  err += ParameterCheck::non_zero(Np);
102  err += ParameterCheck::non_zero(n_exp);
103  err += ParameterCheck::non_zero(d_exp);
104  // NB. x_min,x_max=0 is allowed.
105  err += ParameterCheck::non_zero(Niter);
106  err += ParameterCheck::square_non_zero(Stop_cond);
107 
108  if (err) {
109  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n", class_name.c_str());
110  exit(EXIT_FAILURE);
111  }
112 
113  //- store values
114  m_Np = Np;
115  m_n_exp = n_exp;
116  m_d_exp = d_exp;
117  m_x_min = x_min;
118  m_x_max = x_max;
119  m_Niter = Niter;
120  m_Stop_cond = Stop_cond;
121 
122  //- post-process
123  init_parameters();
124 }
125 
126 //====================================================================
127 template<typename AFIELD>
129 {
130  m_fopr->set_config(U);
131 }
132 
133 //====================================================================
134 template<typename AFIELD>
136 {
137  const int Nin = m_fopr->field_nin();
138  const int Nvol = m_fopr->field_nvol();
139  const int Nex = m_fopr->field_nex();
140 
141  const int Nshift = m_Np;
142 
143  const double x_min2 = m_x_min * m_x_min;
144  const double x_max2 = m_x_max * m_x_max;
145 
146  m_cl.resize(m_Np);
147  m_bl.resize(m_Np);
148 
149  m_xq.resize(m_Np);
150  for (int i = 0; i < Nshift; ++i) {
151  m_xq[i].reset(Nin, Nvol, Nex);
152  }
153 
154  Parameters params_solver;
155  params_solver.set_int("number_of_shifts", Nshift);
156  params_solver.set_int("maximum_number_of_iteration", m_Niter);
157  params_solver.set_double("convergence_criterion_squared", m_Stop_cond);
158  params_solver.set_string("verbose_level", vout.get_verbose_level(m_vl));
159 
160  m_solver = new AShiftsolver_CG<AFIELD, AFopr<AFIELD> >(
161  //m_fopr, m_Niter, m_Stop_cond);
162  m_fopr, params_solver);
163 
164  std::vector<double> bl(m_Np), cl(m_Np);
165  double a0;
166 
167  Math_Rational rational;
168  rational.set_parameters(m_Np, m_n_exp, m_d_exp,
169  double(x_min2), double(x_max2));
170  rational.get_parameters(a0, bl, cl);
171 
172  m_a0 = a0;
173 
174  vout.general(m_vl, " a0 = %18.14f\n", m_a0);
175  for (int i = 0; i < m_Np; i++) {
176  m_bl[i] = real_t(bl[i]);
177  m_cl[i] = real_t(cl[i]);
178  vout.general(m_vl, " bl[%d] = %18.14f cl[%d] = %18.14f\n",
179  i, m_bl[i], i, m_cl[i]);
180  }
181 }
182 
183 
184 //====================================================================
185 template<typename AFIELD>
187 {
188 #pragma omp barrier
189 
190  assert(v.nin() == b.nin());
191  assert(v.nvol() == b.nvol());
192  assert(v.nex() == b.nex());
193 
194  vout.general(m_vl, "Shift solver in rational function\n");
196 
197  vout.detailed(m_vl, "Number of shift values = %d\n", m_Np);
198 
199  int Nconv;
200  real_t diff;
201 
202  unique_ptr<Timer> timer(new Timer);
203  timer->start();
204 
205  m_fopr->set_mode("DdagD");
206 
207  m_solver->solve(m_xq, m_cl, b, Nconv, diff);
208 
209  timer->stop();
210 
211  vout.general(m_vl, "Nconv = %8d\n", Nconv);
212  vout.general(m_vl, "diff(max) = %22.15e\n", diff);
213 
214  double elapsed_time = timer->elapsed_sec();
215  vout.general(m_vl, "Elapsed time = %14.6f sec\n", elapsed_time);
216 
217  copy(v, b);
218  scal(v, real_t(m_a0));
219  for (int i = 0; i < m_Np; i++) {
220  axpy(v, real_t(m_bl[i]), m_xq[i]);
221  }
223 
224 #pragma omp barrier
225 }
226 
227 
228 //====================================================================
229 template<typename AFIELD>
231 {
232  real_t y = m_a0;
233 
234  for (int k = 0; k < m_Np; ++k) {
235  y += m_bl[k] / (x + m_cl[k]);
236  }
237 
238  return y;
239 }
240 
241 
242 //============================================================END=====
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
Parameters
Class for parameters.
Definition: parameters.h:46
AFopr_Rational::mult
void mult(AFIELD &v, const AFIELD &f)
multiplies fermion operator to a given field.
Definition: afopr_Rational-tmpl.h:186
AFopr_Rational::set_parameters
void set_parameters(const Parameters &params)
sets parameters by a Parameter object: to be implemented in a subclass.
Definition: afopr_Rational-tmpl.h:32
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:518
AFopr_Rational::func
real_t func(const real_t x)
Definition: afopr_Rational-tmpl.h:230
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Bridge::BridgeIO::detailed
void detailed(const char *format,...)
Definition: bridgeIO.cpp:281
Field::nex
int nex() const
Definition: field.h:128
Math_Rational::get_parameters
void get_parameters(double &norm, std::vector< double > &res, std::vector< double > &pole)
Definition: math_Rational.cpp:100
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:381
Field::nin
int nin() const
Definition: field.h:126
Timer
Definition: timer.h:31
copy
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:213
Field::real_t
double real_t
Definition: field.h:51
Math_Rational::set_parameters
void set_parameters(const Parameters &params)
Definition: math_Rational.cpp:20
afopr_Rational.h
timer.h
AFopr_Rational::get_parameters
void get_parameters(Parameters &params) const
gets parameters by a Parameter object: to be implemented in a subclass.
Definition: afopr_Rational-tmpl.h:67
ParameterCheck::square_non_zero
int square_non_zero(const double v)
Definition: parameterCheck.cpp:43
threadManager.h
AFopr_Rational
Fermion operator for rational approximation.
Definition: afopr_Rational.h:42
Field::nvol
int nvol() const
Definition: field.h:127
real_t
double real_t
Definition: bridgeACC_AField_double.cpp:14
AFopr_Rational::real_t
AFIELD::real_t real_t
Definition: afopr_Rational.h:45
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
ParameterCheck::non_zero
int non_zero(const double v)
Definition: parameterCheck.cpp:32
AFopr_Rational::set_config
void set_config(Field *U)
sets the gauge configuration.
Definition: afopr_Rational-tmpl.h:128
Parameters::set_int
void set_int(const string &key, const int value)
Definition: parameters.cpp:36
scal
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:262
Parameters::fetch_string
int fetch_string(const string &key, string &value) const
Definition: parameters.cpp:378
Parameters::fetch_double
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
commonParameters.h
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
Field
Container of Field-type object.
Definition: field.h:46
communicator.h
AShiftsolver_CG
Multishift Conjugate Gradient solver.
Definition: ashiftsolver_CG.h:33
AFopr_Rational::init_parameters
void init_parameters()
Definition: afopr_Rational-tmpl.h:135
Math_Rational
Determionation of coefficients of rational approximation.
Definition: math_Rational.h:40
Parameters::fetch_int
int fetch_int(const string &key, int &value) const
Definition: parameters.cpp:346
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:572
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:216