Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
builder_Integrator.cpp
Go to the documentation of this file.
1 
14 #include "builder_Integrator.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 using std::string;
22 
23 //- parameter entries
24 namespace {
25  void append_entry(Parameters& param)
26  {
27  param.Register_string("integrator", "NULL");
28  param.Register_double("step_size", 0.0);
29  param.Register_int("number_of_levels", 0);
30  param.Register_int_vector("number_of_actions", valarray<int>());
31  param.Register_int_vector("number_of_steps", valarray<int>());
32  param.Register_int("order_of_exp_iP", 0);
33  param.Register_double("lambda_Omelyan", 0.0);
34 
35  param.Register_string("verbose_level", "NULL");
36  }
37 
38 
39 #ifdef USE_PARAMETERS_FACTORY
40  bool init_param = ParametersFactory::Register("Builder_Integrator", append_entry);
41 #endif
42 }
43 //- end
44 
45 //- parameters class
47 //- end
48 
49 const std::string Builder_Integrator::class_name = "Builder_Integrator";
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  string str_integrator_type;
60  double Estep;
61  int Nlevel;
62  valarray<int> Naction;
63  valarray<int> Nstep;
64  int Nprec;
65  double lambda_Omelyan;
66 
67  int err = 0;
68  err += params.fetch_string("integrator", str_integrator_type);
69  err += params.fetch_double("step_size", Estep);
70  err += params.fetch_int("number_of_levels", Nlevel);
71  err += params.fetch_int_vector("number_of_actions", Naction);
72  err += params.fetch_int_vector("number_of_steps", Nstep);
73  err += params.fetch_int("order_of_exp_iP", Nprec);
74  err += params.fetch_double("lambda_Omelyan", lambda_Omelyan);
75 
76  if (err) {
77  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
78  abort();
79  }
80 
81 
82  set_parameters(str_integrator_type, Estep, Nlevel, Naction, Nstep, Nprec, lambda_Omelyan);
83 }
84 
85 
86 //====================================================================
87 void Builder_Integrator::set_parameters(string str_integrator_type,
88  double Estep, int Nlevel,
89  const valarray<int>& Naction,
90  const valarray<int>& Nstep,
91  const int Nprec,
92  const double lambda_Omelyan)
93 {
94  //- print input parameters
95  vout.general(m_vl, "%s:\n", class_name.c_str());
96  vout.general(m_vl, " Integrator = %s\n", str_integrator_type.c_str());
97  vout.general(m_vl, " Estep = %10.6f\n", Estep);
98  vout.general(m_vl, " Nlevel = %2d\n", Nlevel);
99  for (int lv = 0; lv < Nlevel; ++lv) {
100  vout.general(m_vl, " level = %2d: Naction = %2d Nstep = %4d\n",
101  lv, Naction[lv], Nstep[lv]);
102  }
103  vout.general(m_vl, " Nprec = %4d\n", Nprec);
104 
105  //- range check
106  int err = 0;
107  err += ParameterCheck::non_NULL(str_integrator_type);
108  // NB. Estep == 0 is allowed.
109  err += ParameterCheck::non_zero(Nlevel);
110  for (int lv = 0; lv < Nlevel; ++lv) {
111  err += ParameterCheck::non_zero(Naction[lv]);
112  }
113  // NB. Nstep == 0 is allowed.
114  err += ParameterCheck::non_zero(Nprec);
115  // NB. lambda_Omelyan == 0 is allowed.
116 
117  if (err) {
118  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
119  abort();
120  }
121 
122  //- store values
123  m_str_integrator_type = str_integrator_type;
124 
125  m_Estep = Estep;
126  m_Nlevel = Nlevel;
127 
128  m_Naction.resize(Nlevel);
129  m_Nstep.resize(Nlevel);
130 
131  for (int lv = 0; lv < m_Nlevel; ++lv) {
132  m_Naction[lv] = Naction[lv];
133  m_Nstep[lv] = Nstep[lv];
134  }
135 
136  m_Nprec = Nprec;
137  m_lambda_Omelyan = lambda_Omelyan;
138 }
139 
140 
141 //====================================================================
143 {
144  //- select leapfrog or omelyan
145  Integrator *integrator;
146 
147  if (m_str_integrator_type == "Leapfrog") {
148  integrator = build_leapfrog();
149  } else if (m_str_integrator_type == "Omelyan") {
150  integrator = build_omelyan();
151  } else {
152  vout.crucial("%s::build : unsupported smear type \"%s\".\n", class_name.c_str(), m_str_integrator_type.c_str());
153  abort();
154  }
155 
156  return integrator;
157 }
158 
159 
160 //====================================================================
162 {
163  // ##### Following setup is for PUP order.
164  m_integs.resize(m_Nlevel + 1);
165 
166  double estep_lowest = m_Estep;
167  for (int lv = 1; lv < m_Nlevel; ++lv) {
168  estep_lowest *= 1.0 / ((double)m_Nstep[lv]);
169  }
170  Integrator_UpdateU *updateU
172  updateU->set_parameters(estep_lowest, m_Nprec);
173  m_integs[m_Nlevel] = (Integrator *)updateU;
174 
175  double estep = estep_lowest;
176  int jaction = m_action.size();
177 
178  for (int lv = m_Nlevel - 1; lv >= 0; --lv) {
179  valarray<Action *> actions(m_Naction[lv]);
180 
181  jaction -= m_Naction[lv];
182  for (int lv2 = 0; lv2 < m_Naction[lv]; ++lv2) {
183  actions[lv2] = m_action[jaction + lv2];
184  }
185 
187  = new Integrator_Leapfrog(actions, m_integs[lv + 1]);
188  leapfrog->set_parameters(lv, estep, m_Nstep[lv]);
189  m_integs[lv] = (Integrator *)leapfrog;
190 
191  estep *= ((double)m_Nstep[lv]);
192  }
193 
194  return (Integrator *)m_integs[0];
195 }
196 
197 
198 //====================================================================
200 {
201  // ##### Following setup is for PUP order.
202  m_integs.resize(m_Nlevel + 1);
203 
204  double estep_lowest = m_Estep;
205  for (int lv = 1; lv < m_Nlevel; ++lv) {
206  estep_lowest *= 0.5 / ((double)m_Nstep[lv]);
207  }
208  Integrator_UpdateU *updateU
210  updateU->set_parameters(0.5 * estep_lowest, m_Nprec);
211  m_integs[m_Nlevel] = (Integrator *)updateU;
212 
213  double estep = estep_lowest;
214  int jaction = m_action.size();
215 
216  for (int lv = m_Nlevel - 1; lv >= 0; --lv) {
217  valarray<Action *> actions(m_Naction[lv]);
218 
219  jaction -= m_Naction[lv];
220  for (int lv2 = 0; lv2 < m_Naction[lv]; ++lv2) {
221  actions[lv2] = m_action[jaction + lv2];
222  }
223 
224  Integrator_Omelyan *omelyan
225  = new Integrator_Omelyan(actions, m_integs[lv + 1]);
226  omelyan->set_parameters(lv, estep, m_Nstep[lv], m_lambda_Omelyan);
227  m_integs[lv] = (Integrator *)omelyan;
228 
229  estep *= 2.0 * ((double)m_Nstep[lv]);
230  }
231 
232  return (Integrator *)m_integs[0];
233 }
234 
235 
236 //====================================================================
238 {
239  for (int lv = 0; lv < m_Nlevel + 1; ++lv) {
240  delete m_integs[lv];
241  }
242 }
243 
244 
245 //====================================================================
246 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:207
Integrator * build_leapfrog()
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
void set_parameters(const Parameters &params)
void general(const char *format,...)
Definition: bridgeIO.cpp:38
void Register_int(const string &, const int)
Definition: parameters.cpp:331
double m_Estep
step size of each molecular dynamical evolution
std::valarray< Action * > m_action
Bridge::VerboseLevel m_vl
void set_parameters(const Parameters &params)
void set_parameters(const Parameters &params)
Class for parameters.
Definition: parameters.h:40
int m_Nprec
precision parameter of exponentiation
int fetch_int_vector(const string &key, std::valarray< int > &val) const
Definition: parameters.cpp:176
std::valarray< int > m_Nstep
Number of steps at each level.
Base class of Integrator class family.
Definition: integrator.h:31
std::valarray< Integrator * > m_integs
Integrator to be constructed.
int m_Nlevel
Number of levels.
std::valarray< int > m_Naction
Number of actions at each level.
void set_parameters(const Parameters &params)
std::string m_str_integrator_type
static const std::string class_name
Integrator * build_omelyan()
int fetch_string(const string &key, string &val) const
Definition: parameters.cpp:194
int non_NULL(const std::string v)
Definition: checker.cpp:61
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
static bool Register(const std::string &realm, const creator_callback &cb)
int non_zero(const double v)
Definition: checker.cpp:31
void Register_double(const string &, const double)
Definition: parameters.cpp:324
void Register_int_vector(const string &, const std::valarray< int > &)
Definition: parameters.cpp:345
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:85
int fetch_int(const string &key, int &val) const
Definition: parameters.cpp:141
std::valarray< Director * > m_director
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191