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