Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
math_Rational.cpp
Go to the documentation of this file.
1 
14 #include "math_Rational.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 //- parameter entries
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("number_of_partitions", 0);
30 
31  param.Register_string("verbose_level", "NULL");
32  }
33 
34 
35 #ifdef USE_PARAMETERS_FACTORY
36  bool init_param = ParametersFactory::Register("Math_Rational", append_entry);
37 #endif
38 }
39 //- end
40 
41 //- parameters class
43 //- end
44 
45 //====================================================================
47 {
48  const string str_vlevel = params.get_string("verbose_level");
49 
50  m_vl = vout.set_verbose_level(str_vlevel);
51 
52  //- fetch and check input parameters
53  int Np, n_exp, d_exp;
54  double x_min, x_max;
55  int Niter;
56 
57  int err = 0;
58  err += params.fetch_int("number_of_poles", Np);
59  err += params.fetch_int("exponent_numerator", n_exp);
60  err += params.fetch_int("exponent_denominator", d_exp);
61  err += params.fetch_double("lower_bound", x_min);
62  err += params.fetch_double("upper_bound", x_max);
63 
64  if (err) {
65  vout.crucial(m_vl, "Math_Rational: fetch error, input parameter not found.\n");
66  abort();
67  }
68 
69 
70  set_parameters(Np, n_exp, d_exp, x_min, x_max);
71 }
72 
73 
74 //====================================================================
75 void Math_Rational::set_parameters(const int Np, const int n_exp, const int d_exp,
76  const double x_min, const double x_max)
77 {
78  //- print input parameters
79  vout.general(m_vl, "Parameters of Math_Rational:\n");
80  vout.general(m_vl, " Np = %d\n", Np);
81  vout.general(m_vl, " n_exp = %d\n", n_exp);
82  vout.general(m_vl, " d_exp = %d\n", d_exp);
83  vout.general(m_vl, " x_min = %10.6f\n", x_min);
84  vout.general(m_vl, " x_max = %10.6f\n", x_max);
85 
86  //- range check
87  int err = 0;
88  err += ParameterCheck::non_zero(Np);
89  err += ParameterCheck::non_zero(n_exp);
90  err += ParameterCheck::non_zero(d_exp);
91  // NB. x_min,x_max == 0 is allowed.
92 
93  if (err) {
94  vout.crucial(m_vl, "Math_Rational: parameter range check failed.\n");
95  abort();
96  }
97 
98  //- store values
99  m_Np = Np;
100  m_n_exp = n_exp;
101  m_d_exp = d_exp;
102  m_x_min = x_min;
103  m_x_max = x_max;
104 
105  //- post-process
106  m_res.resize(m_Np);
107  m_pole.resize(m_Np);
108 
109  set_coeff();
110 }
111 
112 
113 //====================================================================
114 void Math_Rational::get_parameters(double& norm, std::valarray<double>& res,
115  std::valarray<double>& pole)
116 {
117  if (res.size() != m_Np) {
118  vout.crucial(m_vl, "Math_Rational: size of cl is not correct\n");
119  abort();
120  }
121 
122  if (pole.size() != m_Np) {
123  vout.crucial(m_vl, "Math_Rational: size of bl is not correct\n");
124  abort();
125  }
126 
127  norm = m_norm;
128  for (int i = 0; i < m_Np; ++i) {
129  res[i] = m_res[i];
130  pole[i] = m_pole[i];
131  }
132 }
133 
134 
135 //====================================================================
137 {
138  read_file();
139 }
140 
141 
142 //====================================================================
144 {
145  // setting input file
146  char filename[FILENAME_MAX];
147 
148  snprintf(filename, FILENAME_MAX,
149  "parameter_rational.%1d_%1d%s_%02d_%010.8f_%07.3f",
150  abs(m_n_exp), m_d_exp,
151  ((m_n_exp < 0) ? "inv" : ""),
152  m_Np,
153  m_x_min, m_x_max);
154 
155  vout.general(m_vl, "Math_rational: expected filename: %s\n", filename);
156 
157  int Np, n_exp, d_exp;
158  double x_min, x_max;
159 
160  // read parameters from file
161  std::fstream parameterfile;
162  parameterfile.open(filename, std::ios::in);
163  if (!parameterfile.is_open()) {
164  vout.crucial(m_vl, "Failed to open parameter file. %s(%d)\n",
165  __FILE__, __LINE__);
166  abort();
167  }
168 
169  parameterfile >> Np >> n_exp >> d_exp;
170  parameterfile >> x_min >> x_max;
171  parameterfile >> m_error;
172  parameterfile >> m_norm;
173  for (int i = 0; i < Np; i++) {
174  parameterfile >> m_res[i] >> m_pole[i];
175  }
176  parameterfile.close();
177 
178  vout.general(m_vl, "Math_Rational: read parameter file successful.\n");
179 
180  /*
181  vout.general(m_vl, " Rational approximation (read from file): %s\n",
182  filename.c_str());
183  vout.general(m_vl, " Np = %d\n", m_Np);
184  vout.general(m_vl, " n_exp = %d, d_exp = %d\n", m_n_exp,m_d_exp);
185  vout.general(m_vl, " x_min = %12.8f\n", m_x_min);
186  vout.general(m_vl, " x_max = %12.8f\n", m_x_max);
187  vout.general(m_vl, " error = %18.16e\n", m_error);
188  vout.general(m_vl, " RA_a0 = %18.16e\n", m_norm );
189  for(int i = 0; i < n; i++){
190  vout.general(m_vl, " RA_b[%d] = %18.16e, RA_c[%d] = %18.16e\n",
191  i, m_res[i], i, m_pole[i]);
192  }
193  */
194 
195  assert(m_Np == Np);
196  assert(m_n_exp == n_exp);
197  assert(m_d_exp == d_exp);
198  assert(fabs(m_x_min - x_min) < 1.e-12);
199  // assert(fabs(m_x_min - x_min) < 1.e-12);
200  // assert(fabs(m_x_max - x_max) < 1.e-12);
201  assert(fabs(m_x_min - x_min) < 1.e-8);
202  assert(fabs(m_x_max - x_max) < 1.e-8);
203 }
204 
205 
206 //====================================================================
207 double Math_Rational::func(double x)
208 {
209  double y = m_norm;
210 
211  for (int k = 0; k < m_Np; ++k) {
212  y += m_res[k] / (x + m_pole[k]);
213  }
214 
215  return y;
216 }
217 
218 
219 //====================================================================
220 //============================================================END=====