Bridge++  Ver. 1.3.x
builder_Integrator.cpp
Go to the documentation of this file.
1 
14 #include "builder_Integrator.h"
15 
16 #include "integrator_UpdateU.h"
17 #include "integrator_UpdateP.h"
18 #include "integrator_Leapfrog.h"
19 #include "integrator_Omelyan.h"
20 
21 //- parameter entries
22 namespace {
23  void append_entry(Parameters& param)
24  {
25  param.Register_string("integrator", "NULL");
26 
27  param.Register_int_vector("number_of_steps", std::vector<int>());
28 
29  //- NB. one of level_of_actions and number_of_actions is required.
30  param.Register_int("number_of_levels", 0);
31  param.Register_int_vector("level_of_actions", std::vector<int>());
32 
33  param.Register_int("order_of_exp_iP", 0);
34  param.Register_double("lambda_Omelyan", 0.0);
35 
36  param.Register_string("verbose_level", "NULL");
37  }
38 
39 
40 #ifdef USE_PARAMETERS_FACTORY
41  bool init_param = ParametersFactory::Register("Builder_Integrator", append_entry);
42 #endif
43 }
44 //- end
45 
46 //- parameters class
48 //- end
49 
50 const std::string Builder_Integrator::class_name = "Builder_Integrator";
51 
52 //====================================================================
53 Builder_Integrator::Builder_Integrator(const ActionList& action_list, std::vector<Director *> director)
54  : m_vl(CommonParameters::Vlevel()),
55  m_Nprec(0),
56  m_lambda_Omelyan(0.0),
57  m_str_integrator_type(""),
58  m_actions(action_list),
59  m_director(director)
60 {
62 
63  m_Nprec = 0;
64  m_lambda_Omelyan = 0.0;
65 }
66 
67 
68 //====================================================================
70 {
71  const std::string str_vlevel = params.get_string("verbose_level");
72 
73  m_vl = vout.set_verbose_level(str_vlevel);
74 
75  //- fetch and check input parameters
76  std::string str_integrator_type;
77 
78  std::vector<int> Nstep;
79 
80  int Nprec;
81  double lambda_Omelyan;
82 
83  int err = 0;
84 
85  if (m_str_integrator_type == "") {
86  err += params.fetch_string("integrator", str_integrator_type);
87  } else {
88  str_integrator_type = m_str_integrator_type;
89  }
90 
91  err += params.fetch_int_vector("number_of_steps", Nstep);
92 
93  err += params.fetch_int("order_of_exp_iP", Nprec);
94 
95  if ((m_str_integrator_type == "") || (m_str_integrator_type == "Omelyan")) {
96  err += params.fetch_double("lambda_Omelyan", lambda_Omelyan);
97  } else {
98  lambda_Omelyan = 0.0;
99  }
100 
101  if (err) {
102  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
103  exit(EXIT_FAILURE);
104  }
105 
106 
107  set_parameters(str_integrator_type, Nstep, Nprec, lambda_Omelyan);
108 }
109 
110 
111 //====================================================================
112 void Builder_Integrator::set_parameters(std::string str_integrator_type,
113  const std::vector<int>& Nstep,
114  const int Nprec,
115  const double lambda_Omelyan)
116 {
117  //- print input parameters
118  vout.general(m_vl, "%s:\n", class_name.c_str());
119  vout.general(m_vl, " Integrator = %s\n", str_integrator_type.c_str());
120  for (int lv = 0; lv < Nstep.size(); ++lv) {
121  vout.general(m_vl, " level = %2d: Nstep = %4d\n", lv, Nstep[lv]);
122  }
123  vout.general(m_vl, " Nprec = %4d\n", Nprec);
124 
125  //- range check
126  int err = 0;
127  err += ParameterCheck::non_NULL(str_integrator_type);
128  // NB. Nstep == 0 is allowed.
129  err += ParameterCheck::non_zero(Nprec);
130  // NB. lambda_Omelyan == 0 is allowed.
131 
132  if (err) {
133  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
134  exit(EXIT_FAILURE);
135  }
136 
137  //- store values
138  m_str_integrator_type = str_integrator_type;
139 
140  m_Nstep = Nstep;
141 
142  m_Nprec = Nprec;
143  m_lambda_Omelyan = lambda_Omelyan;
144 }
145 
146 
147 //====================================================================
149 {
150  //- select leapfrog or omelyan
151  Integrator *integrator;
152 
153  if (m_str_integrator_type == "Leapfrog") {
154  integrator = build_leapfrog();
155  } else if (m_str_integrator_type == "Omelyan") {
156  integrator = build_omelyan();
157  } else {
158  vout.crucial("%s::build : unsupported integrator type \"%s\".\n", class_name.c_str(), m_str_integrator_type.c_str());
159  exit(EXIT_FAILURE);
160  }
161 
162  return integrator;
163 }
164 
165 
166 //====================================================================
168 {
169  // ##### Following setup is for PUP order.
170 
171  // lowest level: update_U
173 
174  m_integs.push_back(update_u);
175 
176  update_u->set_parameters(m_Nprec);
177 
178  Integrator *integrator = update_u;
179 
180  for (int lv = m_Nstep.size() - 1; lv >= 0; --lv) {
182  m_integs.push_back(update_p);
183 
184  // append notify client
185  update_u->append_notify(update_p);
186 
187  Integrator_Leapfrog *integ = new Integrator_Leapfrog(update_p, integrator);
188  m_integs.push_back(integ);
189 
190  integ->set_parameters(lv, m_Nstep[lv]);
191 
192  // forward to upper level integrator
193  integrator = integ;
194  }
195 
196  return integrator;
197 }
198 
199 
200 //====================================================================
202 {
203  // ##### Following setup is for PUP order.
204 
205  // lowest level: update_U
207 
208  m_integs.push_back(update_u);
209 
210  update_u->set_parameters(m_Nprec);
211 
212  Integrator *integrator = update_u;
213 
214  for (int lv = m_Nstep.size() - 1; lv >= 0; --lv) {
216  m_integs.push_back(update_p);
217 
218  // append notify client
219  update_u->append_notify(update_p);
220 
221  Integrator_Omelyan *integ = new Integrator_Omelyan(update_p, integrator);
222  m_integs.push_back(integ);
223 
224  integ->set_parameters(lv, m_Nstep[lv], m_lambda_Omelyan);
225 
226  // forward to upper level integrator
227  integrator = integ;
228  }
229 
230  return integrator;
231 }
232 
233 
234 //====================================================================
236 {
237  for (size_t i = 0, n = m_integs.size(); i < n; ++i) {
238  if (m_integs[i]) delete m_integs[i];
239  }
240 
241  m_integs.resize(0);
242 }
243 
244 
245 //====================================================================
246 //============================================================END=====
void Register_int_vector(const string &, const std::vector< int > &)
Definition: parameters.cpp:344
BridgeIO vout
Definition: bridgeIO.cpp:278
Integrator * build_leapfrog()
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
std::vector< int > m_Nstep
Number of steps at each level.
void set_parameters(const Parameters &params)
void general(const char *format,...)
Definition: bridgeIO.cpp:65
void Register_int(const string &, const int)
Definition: parameters.cpp:330
Bridge::VerboseLevel m_vl
void set_parameters(const Parameters &params)
void set_parameters(const Parameters &params)
std::vector< Director * > m_director
Class for parameters.
Definition: parameters.h:38
int m_Nprec
precision parameter of exponentiation
void append_notify(Integrator *const integ)
Base class of Integrator class family.
Definition: integrator.h:31
ActionSet get_actions() const
Definition: action_list.cpp:80
void set_parameters(const Parameters &params)
Builder_Integrator(const ActionList &action_list, std::vector< Director * > director=std::vector< Director * >())
constructor with ActionList
std::string m_str_integrator_type
static const std::string class_name
std::vector< Integrator * > m_integs
Integrator to be constructed.
Integrator * build_omelyan()
int fetch_string(const string &key, string &val) const
Definition: parameters.cpp:194
Common parameter class: provides parameters as singleton.
int non_NULL(const std::string v)
Definition: checker.cpp:61
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
lists of actions at respective integrator levels.
Definition: action_list.h:40
static bool Register(const std::string &realm, const creator_callback &cb)
int non_zero(const double v)
Definition: checker.cpp:31
std::string get_integrator_type(const int level) const
void Register_double(const string &, const double)
Definition: parameters.cpp:323
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:87
int fetch_int(const string &key, int &val) const
Definition: parameters.cpp:141
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28
int fetch_int_vector(const string &key, std::vector< int > &val) const
Definition: parameters.cpp:176