Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fopr_Rational_SF.cpp
Go to the documentation of this file.
1 
14 #include "fopr_Rational_SF.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 //- parameter entry
21 namespace {
22  void append_entry(Parameters& param)
23  {
24  param.Register_int("number_of_poles", 0);
25  param.Register_int("exponent_numerator", 0);
26  param.Register_int("exponent_denominator", 0);
27  param.Register_double("lower_bound", 0.0);
28  param.Register_double("upper_bound", 0.0);
29  param.Register_int("maximum_number_of_iteration", 0);
30  param.Register_double("convergence_criterion_squared", 0.0);
31 
32  param.Register_string("verbose_level", "NULL");
33  }
34 
35 
36 #ifdef USE_PARAMETERS_FACTORY
37  bool init_param = ParametersFactory::Register("Fopr.Rational_SF", append_entry);
38 #endif
39 }
40 //- end
41 
42 //- parameters class
44 //- end
45 
46 //====================================================================
48 {
49  const string str_vlevel = params.get_string("verbose_level");
50 
51  m_vl = vout.set_verbose_level(str_vlevel);
52 
53  //- fetch and check input parameters
54  int Np, n_exp, d_exp;
55  double x_min, x_max;
56  int Niter;
57  double Stop_cond;
58 
59  int err = 0;
60  err += params.fetch_int("number_of_poles", Np);
61  err += params.fetch_int("exponent_numerator", n_exp);
62  err += params.fetch_int("exponent_denominator", d_exp);
63  err += params.fetch_double("lower_bound", x_min);
64  err += params.fetch_double("upper_bound", x_max);
65  err += params.fetch_int("maximum_number_of_iteration", Niter);
66  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
67 
68  if (err) {
69  vout.crucial(m_vl, "Fopr_Rational_SF: fetch error, input parameter not found.\n");
70  abort();
71  }
72 
73 
74  set_parameters(Np, n_exp, d_exp, x_min, x_max, Niter, Stop_cond);
75 }
76 
77 
78 //====================================================================
79 void Fopr_Rational_SF::set_parameters(int Np, int n_exp, int d_exp,
80  double x_min, double x_max,
81  int Niter, double Stop_cond)
82 {
83  //- print input parameters
84  vout.general(m_vl, "Parameters of Fopr_Rational_SF:\n");
85  vout.general(m_vl, " Np = %d\n", Np);
86  vout.general(m_vl, " n_exp = %d\n", n_exp);
87  vout.general(m_vl, " d_exp = %d\n", d_exp);
88  vout.general(m_vl, " x_min = %10.6f\n", x_min);
89  vout.general(m_vl, " x_max = %10.6f\n", x_max);
90  vout.general(m_vl, " Niter = %d\n", Niter);
91  vout.general(m_vl, " Stop_cond = %10.6f\n", Stop_cond);
92 
93  //- range check
94  int err = 0;
95  err += ParameterCheck::non_zero(Np);
96  err += ParameterCheck::non_zero(n_exp);
97  err += ParameterCheck::non_zero(d_exp);
98  // NB. x_min,x_max == 0 is allowed.
99  err += ParameterCheck::non_zero(Niter);
100  err += ParameterCheck::square_non_zero(Stop_cond);
101 
102  if (err) {
103  vout.crucial(m_vl, "Fopr_Rational_SF: parameter range check failed.\n");
104  abort();
105  }
106 
107  //- store values
108  m_Np = Np;
109  m_n_exp = n_exp;
110  m_d_exp = d_exp;
111  m_x_min = x_min;
112  m_x_max = x_max;
113  m_Niter = Niter;
114  m_Stop_cond = Stop_cond;
115 
116  //- post-process
117  init_parameters();
118 }
119 
120 
121 //====================================================================
123 {
124  int Nin = m_fopr->field_nin();
125  int Nvol = m_fopr->field_nvol();
126  int Nex = m_fopr->field_nex();
127 
128  int Nshift = m_Np;
129 
130  double x_min2 = m_x_min * m_x_min;
131  double x_max2 = m_x_max * m_x_max;
132 
133  m_cl.resize(m_Np);
134  m_bl.resize(m_Np);
135 
136  m_xq.resize(m_Np);
137  for (int i = 0; i < Nshift; ++i) {
138  m_xq[i].reset(Nin, Nvol, Nex);
139  }
140 
142 
143  Math_Rational rational;
144  rational.set_parameters(m_Np, m_n_exp, m_d_exp, x_min2, x_max2);
145  rational.get_parameters(m_a0, m_bl, m_cl);
146 
147  vout.general(m_vl, " a0 = %18.14f\n", m_a0);
148  for (int i = 0; i < m_Np; i++) {
149  vout.general(m_vl, " bl[%d] = %18.14f cl[%d] = %18.14f\n",
150  i, m_bl[i], i, m_cl[i]);
151  }
152 }
153 
154 
155 //====================================================================
156 
165 {
166  int Nconv;
167  double diff;
168 
169  Field_F_SF set_zero;
170 
171  Field v(b);
172 
173  vout.general(m_vl, " Shift solver in rational function\n");
174  vout.general(m_vl, " Number of shift values = %d\n", m_Np);
175 
176  set_zero.set_boundary_zero(v);
177 
178  m_fopr->set_mode("DdagD");
179  m_solver->solve(m_xq, m_cl, v, Nconv, diff);
180 
181  vout.general(m_vl, " diff(max) = %22.15e \n", diff);
182 
183  v = b;
184  v *= m_a0;
185  for (int i = 0; i < m_Np; i++) {
186  v += m_bl[i] * m_xq[i];
187  }
188 
189  set_zero.set_boundary_zero(v);
190 
191  return v;
192 }
193 
194 
195 //====================================================================
196 double Fopr_Rational_SF::func(double x)
197 {
198  double y = m_a0;
199 
200  for (int k = 0; k < m_Np; ++k) {
201  y += m_bl[k] / (x + m_cl[k]);
202  }
203 
204  return y;
205 }
206 
207 
208 //====================================================================
209 //============================================================END=====