Bridge++  Ver. 1.1.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 //====================================================================
51 {
52  const string str_vlevel = params.get_string("verbose_level");
53 
54  m_vl = vout.set_verbose_level(str_vlevel);
55 
56  //- fetch and check input parameters
57  string str_integrator_type;
58  double Estep;
59  int Nlevel;
60  valarray<int> Naction;
61  valarray<int> Nstep;
62  int Nprec;
63  double lambda_Omelyan;
64 
65  int err = 0;
66  err += params.fetch_string("integrator", str_integrator_type);
67  err += params.fetch_double("step_size", Estep);
68  err += params.fetch_int("number_of_levels", Nlevel);
69  err += params.fetch_int_vector("number_of_actions", Naction);
70  err += params.fetch_int_vector("number_of_steps", Nstep);
71  err += params.fetch_int("order_of_exp_iP", Nprec);
72  err += params.fetch_double("lambda_Omelyan", lambda_Omelyan);
73 
74  if (err) {
75  vout.crucial(m_vl, "Builder_Integrator: fetch error, input parameter not found.\n");
76  abort();
77  }
78 
79 
80  set_parameters(str_integrator_type, Estep, Nlevel, Naction, Nstep, Nprec, lambda_Omelyan);
81 }
82 
83 
84 //====================================================================
85 void Builder_Integrator::set_parameters(string str_integrator_type,
86  double Estep, int Nlevel,
87  const valarray<int>& Naction,
88  const valarray<int>& Nstep,
89  const int Nprec,
90  const double lambda_Omelyan)
91 {
92  //- print input parameters
93  vout.general(m_vl, "MD integrator builder:\n");
94  vout.general(m_vl, " Integrator = %s\n", str_integrator_type.c_str());
95  vout.general(m_vl, " Estep = %10.6f\n", Estep);
96  vout.general(m_vl, " Nlevel = %2d\n", Nlevel);
97  for (int lv = 0; lv < Nlevel; ++lv) {
98  vout.general(m_vl, " level = %2d: Naction = %2d Nstep = %4d\n",
99  lv, Naction[lv], Nstep[lv]);
100  }
101  vout.general(m_vl, " Nprec = %4d\n", Nprec);
102 
103  //- range check
104  int err = 0;
105  err += ParameterCheck::non_NULL(str_integrator_type);
106  // NB. Estep == 0 is allowed.
107  err += ParameterCheck::non_zero(Nlevel);
108  for (int lv = 0; lv < Nlevel; ++lv) {
109  err += ParameterCheck::non_zero(Naction[lv]);
110  }
111  // NB. Nstep == 0 is allowed.
112  err += ParameterCheck::non_zero(Nprec);
113  // NB. lambda_Omelyan == 0 is allowed.
114 
115  if (err) {
116  vout.crucial(m_vl, "Builder_Integrator: parameter range check failed.\n");
117  abort();
118  }
119 
120  //- store values
121  m_str_integrator_type = str_integrator_type;
122 
123  m_Estep = Estep;
124  m_Nlevel = Nlevel;
125 
126  m_Naction.resize(Nlevel);
127  m_Nstep.resize(Nlevel);
128 
129  for (int lv = 0; lv < m_Nlevel; ++lv) {
130  m_Naction[lv] = Naction[lv];
131  m_Nstep[lv] = Nstep[lv];
132  }
133 
134  m_Nprec = Nprec;
135  m_lambda_Omelyan = lambda_Omelyan;
136 }
137 
138 
139 //====================================================================
141 {
142  //- select leapfrog or omelyan
143  Integrator *integrator;
144 
145  if (m_str_integrator_type == "Leapfrog") {
146  integrator = build_leapfrog();
147  } else if (m_str_integrator_type == "Omelyan") {
148  integrator = build_omelyan();
149  } else {
150  vout.crucial("Builder_Integrator::build : unsupported smear type \"%s\".\n",
151  m_str_integrator_type.c_str());
152  abort();
153  }
154 
155  return integrator;
156 }
157 
158 
159 //====================================================================
161 {
162  // ##### Following setup is for PUP order.
163  m_integs.resize(m_Nlevel + 1);
164 
165  double estep_lowest = m_Estep;
166  for (int lv = 1; lv < m_Nlevel; ++lv) {
167  estep_lowest *= 1.0 / ((double)m_Nstep[lv]);
168  }
169  Integrator_UpdateU *updateU
171  updateU->set_parameters(estep_lowest, m_Nprec);
172  m_integs[m_Nlevel] = (Integrator *)updateU;
173 
174  double estep = estep_lowest;
175  int jaction = m_action.size();
176 
177  for (int lv = m_Nlevel - 1; lv >= 0; --lv) {
178  valarray<Action *> actions(m_Naction[lv]);
179 
180  jaction -= m_Naction[lv];
181  for (int lv2 = 0; lv2 < m_Naction[lv]; ++lv2) {
182  actions[lv2] = m_action[jaction + lv2];
183  }
184 
186  = new Integrator_Leapfrog(actions, m_integs[lv + 1]);
187  leapfrog->set_parameters(lv, estep, m_Nstep[lv]);
188  m_integs[lv] = (Integrator *)leapfrog;
189 
190  estep *= ((double)m_Nstep[lv]);
191  }
192 
193  return (Integrator *)m_integs[0];
194 }
195 
196 
197 //====================================================================
199 {
200  // ##### Following setup is for PUP order.
201  m_integs.resize(m_Nlevel + 1);
202 
203  double estep_lowest = m_Estep;
204  for (int lv = 1; lv < m_Nlevel; ++lv) {
205  estep_lowest *= 0.5 / ((double)m_Nstep[lv]);
206  }
207  Integrator_UpdateU *updateU
209  updateU->set_parameters(0.5 * estep_lowest, m_Nprec);
210  m_integs[m_Nlevel] = (Integrator *)updateU;
211 
212  double estep = estep_lowest;
213  int jaction = m_action.size();
214 
215  for (int lv = m_Nlevel - 1; lv >= 0; --lv) {
216  valarray<Action *> actions(m_Naction[lv]);
217 
218  jaction -= m_Naction[lv];
219  for (int lv2 = 0; lv2 < m_Naction[lv]; ++lv2) {
220  actions[lv2] = m_action[jaction + lv2];
221  }
222 
223  Integrator_Omelyan *omelyan
224  = new Integrator_Omelyan(actions, m_integs[lv + 1]);
225  omelyan->set_parameters(lv, estep, m_Nstep[lv], m_lambda_Omelyan);
226  m_integs[lv] = (Integrator *)omelyan;
227 
228  estep *= 2.0 * ((double)m_Nstep[lv]);
229  }
230 
231  return (Integrator *)m_integs[0];
232 }
233 
234 
235 //====================================================================
237 {
238  for (int lv = 0; lv < m_Nlevel + 1; ++lv) {
239  delete m_integs[lv];
240  }
241 }
242 
243 
244 //====================================================================
245 //============================================================END=====