Bridge++  Ver. 1.1.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 //====================================================================
51 {
52  const string str_vlevel = params.get_string("verbose_level");
53 
54  m_vl = vout.set_verbose_level(str_vlevel);
55 
56  //- fetch and check input parameters
57  int Np, n_exp, d_exp;
58  double x_min, x_max;
59  int Niter;
60  double Stop_cond;
61 
62  int err = 0;
63  err += params.fetch_int("number_of_poles", Np);
64  err += params.fetch_int("exponent_numerator", n_exp);
65  err += params.fetch_int("exponent_denominator", d_exp);
66  err += params.fetch_double("lower_bound", x_min);
67  err += params.fetch_double("upper_bound", x_max);
68  err += params.fetch_int("maximum_number_of_iteration", Niter);
69  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
70 
71  if (err) {
72  vout.crucial(m_vl, "Force_Rational: fetch error, input parameter not found.\n");
73  abort();
74  }
75 
76 
77  set_parameters(Np, n_exp, d_exp, x_min, x_max, Niter, Stop_cond);
78 }
79 
80 
81 //====================================================================
82 void Force_F_Rational::set_parameters(int Np, int n_exp, int d_exp,
83  double x_min, double x_max,
84  int Niter, double Stop_cond)
85 {
86  //- print input parameters
87  vout.general(m_vl, "Parameters of Force_F_Rational:\n");
88  vout.general(m_vl, " Np = %d\n", Np);
89  vout.general(m_vl, " n_exp = %d\n", n_exp);
90  vout.general(m_vl, " d_exp = %d\n", d_exp);
91  vout.general(m_vl, " x_min = %10.6f\n", x_min);
92  vout.general(m_vl, " x_max = %10.6f\n", x_max);
93  vout.general(m_vl, " Niter = %d\n", Niter);
94  vout.general(m_vl, " Stop_cond = %10.6f\n", Stop_cond);
95 
96  //- range check
97  int err = 0;
98  err += ParameterCheck::non_zero(Np);
99  err += ParameterCheck::non_zero(n_exp);
100  err += ParameterCheck::non_zero(d_exp);
101  // NB. x_min,x_max=0 is allowed.
102  err += ParameterCheck::non_zero(Niter);
103  err += ParameterCheck::square_non_zero(Stop_cond);
104 
105  if (err) {
106  vout.crucial(m_vl, "Force_Rational: parameter range check failed.\n");
107  abort();
108  }
109 
110  //- store values
111  m_Np = Np;
112  m_n_exp = n_exp;
113  m_d_exp = d_exp;
114  m_x_min = x_min;
115  m_x_max = x_max;
116  m_Niter = Niter;
117  m_Stop_cond = Stop_cond;
118 
119  // post-process
120  init_parameters();
121 }
122 
123 
124 //====================================================================
126 {
127  m_cl.resize(m_Np);
128  m_bl.resize(m_Np);
129 
130  // Rational approximation
131  double x_min2 = m_x_min * m_x_min;
132  double x_max2 = m_x_max * m_x_max;
133 
134  Math_Rational rational;
135  rational.set_parameters(m_Np, m_n_exp, m_d_exp, x_min2, x_max2);
136  rational.get_parameters(m_a0, m_bl, m_cl);
137 
138  vout.general(m_vl, " a0 = %18.14f\n", m_a0);
139  for (int i = 0; i < m_Np; i++) {
140  vout.general(m_vl, " bl[%d] = %18.14f cl[%d] = %18.14f\n",
141  i, m_bl[i], i, m_cl[i]);
142  }
143 }
144 
145 
146 //====================================================================
148 {
149  int Nc = CommonParameters::Nc();
150  int Nvol = CommonParameters::Nvol();
151  int Ndim = CommonParameters::Ndim();
152  int NinG = 2 * Nc * Nc;
153 
154  Field_G force(Nvol, Ndim), force1(Nvol, Ndim);
155  Mat_SU_N ut(Nc);
156 
157  force1 = force_udiv(eta);
158 
159  for (int mu = 0; mu < Ndim; ++mu) {
160  force.mult_Field_Gnn(mu, *m_U, mu, force1, mu);
161  force.at_Field_G(mu);
162  }
163  force *= -2.0;
164 
165  /*
166  for(int mu = 0; mu < Ndim; ++mu){
167  for(int site = 0; site < Nvol; ++site){
168  ut = m_U->mat(site,mu) * force1.mat(site,mu);
169  ut.at();
170  ut *= -2.0;
171  force.set_mat(site,mu,ut);
172  }
173  }
174  */
175 
176  return (Field)force;
177 }
178 
179 
180 //====================================================================
182 {
183  int Nc = CommonParameters::Nc();
184  int Nd = CommonParameters::Nd();
185  int Nvol = CommonParameters::Nvol();
186  int Ndim = CommonParameters::Ndim();
187  int NinG = 2 * Nc * Nc;
188 
189  int NinF = eta.nin();
190  int NvolF = eta.nvol();
191  int NexF = eta.nex();
192 
193  // Shiftsolver
194  int Nshift = m_Np;
195 
196  valarray<Field> psi(Nshift);
197  for (int i = 0; i < Nshift; ++i) {
198  psi[i].reset(NinF, NvolF, NexF);
199  }
200 
201  int Nconv;
202  double diff;
203 
204  vout.general(m_vl, " Shift solver in force calculation\n");
205  vout.general(m_vl, " Number of shift values = %d\n", m_cl.size());
206  m_fopr->set_mode("DdagD");
207 
209 
210  solver->solve(psi, m_cl, eta, Nconv, diff);
211  vout.general(m_vl, " diff(max) = %22.15e \n", diff);
212 
213  delete solver;
214 
215  Field force(NinG, Nvol, Ndim);
216  Field force1(NinG, Nvol, Ndim);
217  force = 0.0;
218 
219  for (int i = 0; i < Nshift; ++i) {
220  force1 = m_force->force_udiv(psi[i]);
221  force += m_bl[i] * force1;
222  }
223 
224  return force;
225 }
226 
227 
228 //====================================================================
229 //===========================================================END======