Bridge++  Ver. 1.3.x
force_F_Rational.cpp
Go to the documentation of this file.
1 
14 #include "force_F_Rational.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using Bridge::vout;
21 
22 //- parameter entries
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_int("number_of_poles", 0);
27  param.Register_int("exponent_numerator", 0);
28  param.Register_int("exponent_denominator", 0);
29  param.Register_double("lower_bound", 0.0);
30  param.Register_double("upper_bound", 0.0);
31  param.Register_int("maximum_number_of_iteration", 0);
32  param.Register_double("convergence_criterion_squared", 0.0);
33 
34  param.Register_string("verbose_level", "NULL");
35  }
36 
37 
38 #ifdef USE_PARAMETERS_FACTORY
39  bool init_param = ParametersFactory::Register("Force.F_Rational", append_entry);
40 #endif
41 }
42 //- end
43 
44 //- parameters class
46 //- end
47 
48 const std::string Force_F_Rational::class_name = "Force_F_Rational";
49 
50 //====================================================================
52 {
53  const string str_vlevel = params.get_string("verbose_level");
54 
55  m_vl = vout.set_verbose_level(str_vlevel);
56 
57  //- fetch and check input parameters
58  int Np, n_exp, d_exp;
59  double x_min, x_max;
60  int Niter;
61  double Stop_cond;
62 
63  int err = 0;
64  err += params.fetch_int("number_of_poles", Np);
65  err += params.fetch_int("exponent_numerator", n_exp);
66  err += params.fetch_int("exponent_denominator", d_exp);
67  err += params.fetch_double("lower_bound", x_min);
68  err += params.fetch_double("upper_bound", x_max);
69  err += params.fetch_int("maximum_number_of_iteration", Niter);
70  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
71 
72  if (err) {
73  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
74  exit(EXIT_FAILURE);
75  }
76 
77 
78  set_parameters(Np, n_exp, d_exp, x_min, x_max, Niter, Stop_cond);
79 }
80 
81 
82 //====================================================================
83 void Force_F_Rational::set_parameters(int Np, int n_exp, int d_exp,
84  double x_min, double x_max,
85  int Niter, double Stop_cond)
86 {
87  //- print input parameters
88  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
89  vout.general(m_vl, " Np = %d\n", Np);
90  vout.general(m_vl, " n_exp = %d\n", n_exp);
91  vout.general(m_vl, " d_exp = %d\n", d_exp);
92  vout.general(m_vl, " x_min = %10.6f\n", x_min);
93  vout.general(m_vl, " x_max = %10.6f\n", x_max);
94  vout.general(m_vl, " Niter = %d\n", Niter);
95  vout.general(m_vl, " Stop_cond = %10.6f\n", Stop_cond);
96 
97  //- range check
98  int err = 0;
99  err += ParameterCheck::non_zero(Np);
100  err += ParameterCheck::non_zero(n_exp);
101  err += ParameterCheck::non_zero(d_exp);
102  // NB. x_min,x_max=0 is allowed.
103  err += ParameterCheck::non_zero(Niter);
104  err += ParameterCheck::square_non_zero(Stop_cond);
105 
106  if (err) {
107  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
108  exit(EXIT_FAILURE);
109  }
110 
111  //- store values
112  m_Np = Np;
113  m_n_exp = n_exp;
114  m_d_exp = d_exp;
115  m_x_min = x_min;
116  m_x_max = x_max;
117  m_Niter = Niter;
118  m_Stop_cond = Stop_cond;
119 
120  //- post-process
121  m_cl.resize(m_Np);
122  m_bl.resize(m_Np);
123 
124  //- Rational approximation
125  double x_min2 = m_x_min * m_x_min;
126  double x_max2 = m_x_max * m_x_max;
127 
128  Math_Rational rational;
129  rational.set_parameters(m_Np, m_n_exp, m_d_exp, x_min2, x_max2);
130  rational.get_parameters(m_a0, m_bl, m_cl);
131 
132  vout.general(m_vl, " a0 = %18.14f\n", m_a0);
133  for (int i = 0; i < m_Np; i++) {
134  vout.general(m_vl, " bl[%d] = %18.14f cl[%d] = %18.14f\n",
135  i, m_bl[i], i, m_cl[i]);
136  }
137 }
138 
139 
140 //====================================================================
141 void Force_F_Rational::force_udiv(Field& force_, const Field& eta_)
142 {
143  int Nvol = CommonParameters::Nvol();
144  int Ndim = CommonParameters::Ndim();
145 
146  Field_G force(Nvol, Ndim);
147  Field_F eta(eta_);
148 
149  force_udiv_impl(force, eta);
150  copy(force_, force); // force_ = force;
151 }
152 
153 
154 //====================================================================
156 {
157  int Nc = CommonParameters::Nc();
158  int Nd = CommonParameters::Nd();
159  int Nvol = CommonParameters::Nvol();
160  int Ndim = CommonParameters::Ndim();
161 
162  int NinF = eta.nin();
163  int NvolF = eta.nvol();
164  int NexF = eta.nex();
165 
166  //- Shiftsolver
167  int Nshift = m_Np;
168 
169  std::vector<Field> psi(Nshift);
170 
171  for (int i = 0; i < Nshift; ++i) {
172  psi[i].reset(NinF, NvolF, NexF);
173  }
174 
175  int Nconv;
176  double diff;
177 
178  vout.general(m_vl, " Shift solver in force calculation\n");
179  vout.general(m_vl, " Number of shift values = %d\n", m_cl.size());
180  m_fopr->set_mode("DdagD");
181 
183 
184  solver->solve(psi, m_cl, eta, Nconv, diff);
185  vout.general(m_vl, " diff(max) = %22.15e \n", diff);
186 
187  delete solver;
188 
189  force.set(0.0);
190 
191  Field_G force1(Nvol, Ndim);
192 
193  for (int i = 0; i < Nshift; ++i) {
194  m_force->force_udiv(force1, psi[i]);
195  scal(force1, m_bl[i]); // force1 *= m_bl[i];
196  axpy(force, 1.0, force1); // force += force1;
197  }
198 }
199 
200 
201 //====================================================================
203 {
204  vout.crucial(m_vl, "%s: not implemented.\n", __func__);
205  exit(EXIT_FAILURE);
206 }
207 
208 
209 //====================================================================
211 {
212  vout.crucial(m_vl, "%s: not implemented.\n", __func__);
213  exit(EXIT_FAILURE);
214 }
215 
216 
217 //====================================================================
218 //===========================================================END======
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:282
void get_parameters(double &norm, std::vector< double > &res, std::vector< double > &pole)
BridgeIO vout
Definition: bridgeIO.cpp:278
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:155
void general(const char *format,...)
Definition: bridgeIO.cpp:65
void Register_int(const string &, const int)
Definition: parameters.cpp:330
Bridge::VerboseLevel m_vl
Definition: force.h:72
void set_parameters(const Parameters &params)
Container of Field-type object.
Definition: field.h:39
std::vector< double > m_bl
int nvol() const
Definition: field.h:116
Multishift Conjugate Gradient solver.
Class for parameters.
Definition: parameters.h:38
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:381
std::vector< double > m_cl
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
SU(N) gauge field.
Definition: field_G.h:38
void force_core1(Field &, const Field &, const Field &)
static const std::string class_name
int nex() const
Definition: field.h:117
void force_udiv_impl(Field_G &, const Field_F &)
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
virtual void force_udiv(Field &, const Field &)
Definition: force.h:62
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
void force_udiv1(Field &, const Field &, const Field &)
static bool Register(const std::string &realm, const creator_callback &cb)
int non_zero(const double v)
Definition: checker.cpp:31
virtual void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: fopr.h:85
void force_udiv(Field &, const Field &)
void Register_double(const string &, const double)
Definition: parameters.cpp:323
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
void set_parameters(const Parameters &params)
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)