Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fopr_Chebyshev.cpp
Go to the documentation of this file.
1 
14 #include "fopr_Chebyshev.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("degree_of_polynomial", 0);
25  param.Register_double("threshold_value", 0.0);
26  param.Register_double("upper_bound", 0.0);
27 
28  param.Register_string("verbose_level", "NULL");
29  }
30 
31 
32 #ifdef USE_PARAMETERS_FACTORY
33  bool init_param = ParametersFactory::Register("Fopr.Chebyshev", append_entry);
34 #endif
35 }
36 //- end
37 
38 //- parameters class
40 //- end
41 
42 //====================================================================
44 {
45  const string str_vlevel = params.get_string("verbose_level");
46 
47  m_vl = vout.set_verbose_level(str_vlevel);
48 
49  //- fetch and check input parameters
50  int Np;
51  double v_threshold, v_max;
52 
53  int err = 0;
54  err += params.fetch_int("degree_of_polynomial", Np);
55  err += params.fetch_double("threshold_value", v_threshold);
56  err += params.fetch_double("upper_bound", v_max);
57 
58  if (err) {
59  vout.crucial(m_vl, "Fopr_Chebyshev: fetch error, input parameter not found.\n");
60  abort();
61  }
62 
63 
64  set_parameters(Np, v_threshold, v_max);
65 }
66 
67 
68 //====================================================================
69 void Fopr_Chebyshev::set_parameters(int Np, double v_threshold, double v_max)
70 {
71  //- print input parameters
72  vout.general(m_vl, "Parameters of Fopr_Chebyshev:\n");
73  vout.general(m_vl, " Np = %d\n", Np);
74  vout.general(m_vl, " v_threshold = %16.8e\n", v_threshold);
75  vout.general(m_vl, " v_max = %16.8e\n", v_max);
76 
77 
78  //- range check
79  int err = 0;
81  // NB. v_threshold,v_max == 0 is allowed.
82 
83  if (err) {
84  vout.crucial(m_vl, "Fopr_Chebyshev: parameter range check failed.\n");
85  abort();
86  }
87 
88  //- store values
89  m_Npcb = Np;
90 
91  double b_max = v_max / v_threshold;
92  double r = 2.0 / (b_max * b_max - 1.0);
93  double s = v_threshold / sqrt(0.5 * r);
94 
95  m_Fcb1 = 2.0 / (s * s);
96  m_Fcb2 = -(1.0 + r);
97 
98  vout.general(m_vl, " Fcb1 = %16.8e\n", m_Fcb1);
99  vout.general(m_vl, " Fcb2 = %16.8e\n", m_Fcb2);
100 }
101 
102 
103 //====================================================================
105 {
106  std::valarray<Field> dj(3);
107  int Nin = w.nin();
108  int Nvol = w.nvol();
109  int Nex = w.nex();
110 
111  Field v(Nin, Nvol, Nex);
112 
113  for (int k = 0; k < 3; ++k) {
114  dj[k].reset(Nin, Nvol, Nex);
115  }
116 
117  dj[0] = (-1.0) * w;
118  dj[1] = 0.0;
119 
120  int jn = 2;
121  int jp1 = 1;
122  int jp2 = 0;
123 
124  for (int j = m_Npcb; j >= 2; --j) {
125  dj[jn] = m_fopr->mult(dj[jp1]);
126  dj[jn] *= m_Fcb1;
127  dj[jn] += m_Fcb2 * dj[jp1];
128 
129  dj[jn] *= 2.0;
130  dj[jn] -= 1.0 * dj[jp2];
131 
132  jn = (jn + 1) % 3;
133  jp1 = (jp1 + 1) % 3;
134  jp2 = (jp2 + 1) % 3;
135  }
136 
137  v = m_fopr->mult(dj[jp1]);
138  v *= m_Fcb1;
139  v += m_Fcb2 * dj[jp1];
140  v -= dj[jp2];
141 
142 
143  return v;
144 }
145 
146 
147 //====================================================================
148 double Fopr_Chebyshev::mult(double x)
149 {
150  std::valarray<double> dj(3);
151 
152  dj[0] = -1.0;
153  dj[1] = 0.0;
154 
155  int jn = 2;
156  int jp1 = 1;
157  int jp2 = 0;
158 
159  for (int j = m_Npcb; j >= 2; --j) {
160  dj[jn] = x * dj[jp1];
161  dj[jn] *= m_Fcb1;
162  dj[jn] += m_Fcb2 * dj[jp1];
163 
164  dj[jn] *= 2.0;
165  dj[jn] -= 1.0 * dj[jp2];
166 
167  jn = (jn + 1) % 3;
168  jp1 = (jp1 + 1) % 3;
169  jp2 = (jp2 + 1) % 3;
170  }
171 
172  double v = x * dj[jp1];
173  v *= m_Fcb1;
174  v += m_Fcb2 * dj[jp1];
175  v -= dj[jp2];
176 
177  return v;
178 }
179 
180 
181 //====================================================================
182 //============================================================END=====