Bridge++  Ver.2.1.3
hmc_General.cpp
Go to the documentation of this file.
1 
14 #include "hmc_General.h"
15 
16 const std::string HMC_General::class_name = "HMC_General";
17 
18 //====================================================================
21  std::vector<Director *> director,
22  Integrator *integrator,
23  RandomNumbers *rand)
24  : m_vl(CommonParameters::Vlevel())
25 {
26  ActionSet action_set = action_list.get_actions();
27 
28  m_action.resize(action_set.size());
29  for (int i = 0; i < action_set.size(); ++i) {
30  m_action[i] = action_set[i];
31  }
32  m_director.resize(director.size());
33  for (int i = 0; i < director.size(); ++i) {
34  m_director[i] = director[i];
35  }
36  m_integrator = integrator;
37  m_rand = rand;
38  m_staple = new Staple_lex;
39  m_Metropolis_test = false;
41  m_trajectory_length = 0.0;
42 }
43 
44 
45 //====================================================================
47 // with params
49  std::vector<Director *> director,
50  Integrator *integrator,
51  RandomNumbers *rand,
52  const Parameters& params)
53  : m_vl(CommonParameters::Vlevel())
54 {
55  ActionSet action_set = action_list.get_actions();
56 
57  m_action.resize(action_set.size());
58  for (int i = 0; i < action_set.size(); ++i) {
59  m_action[i] = action_set[i];
60  }
61  m_director.resize(director.size());
62  for (int i = 0; i < director.size(); ++i) {
63  m_director[i] = director[i];
64  }
65  m_integrator = integrator;
66  m_rand = rand;
67  m_staple = new Staple_lex;
68  m_Metropolis_test = false;
70  m_trajectory_length = 0.0;
71 
72  set_parameters(params);
73 }
74 
75 
76 //====================================================================
79  Integrator *integrator,
80  RandomNumbers *rand)
81  : m_vl(CommonParameters::Vlevel())
82 {
83  ActionSet action_set = action_list.get_actions();
84 
85  m_action.resize(action_set.size());
86  for (int i = 0; i < action_set.size(); ++i) {
87  m_action[i] = action_set[i];
88  }
89 
90  m_director.resize(0);
91 
92  m_integrator = integrator;
93  m_rand = rand;
94  m_staple = new Staple_lex;
95  m_Metropolis_test = false;
97  m_trajectory_length = 0.0;
98 }
99 
100 
101 //====================================================================
103 // with params
105  Integrator *integrator,
106  RandomNumbers *rand,
107  const Parameters& params)
108  : m_vl(CommonParameters::Vlevel())
109 {
110  ActionSet action_set = action_list.get_actions();
111 
112  m_action.resize(action_set.size());
113  for (int i = 0; i < action_set.size(); ++i) {
114  m_action[i] = action_set[i];
115  }
116 
117  m_director.resize(0);
118 
119  m_integrator = integrator;
120  m_rand = rand;
121  m_staple = new Staple_lex;
122  m_Metropolis_test = false;
124  m_trajectory_length = 0.0;
125 
126  set_parameters(params);
127 }
128 
129 
130 //====================================================================
133 {
134  delete m_Langevin_P;
135  delete m_staple;
136 }
137 
138 
139 //====================================================================
141 {
142  std::string vlevel;
143  if (!params.fetch_string("verbose_level", vlevel)) {
144  m_vl = vout.set_verbose_level(vlevel);
145  }
146 
147  //- fetch and check input parameters
148  double traj_length;
149  bool Metropolis_test;
150 
151  int err = 0;
152  err += params.fetch_double("trajectory_length", traj_length);
153  err += params.fetch_bool("Metropolis_test", Metropolis_test);
154 
155  if (err) {
156  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
157  class_name.c_str());
158  exit(EXIT_FAILURE);
159  }
160 
161  set_parameters(traj_length, Metropolis_test);
162 }
163 
164 
165 //====================================================================
167 {
168  params.set_double("trajectory_length", m_trajectory_length);
169  params.set_bool("Metropolis_test", m_Metropolis_test);
170 
171  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
172 }
173 
174 
175 //====================================================================
176 void HMC_General::set_parameters(const double trajectory_length, const int Metropolis_test)
177 {
178  vout.crucial(m_vl, "%s: warning: integer variable for Metroplis_test is obsolete. use boolean parameter.\n", class_name.c_str());
179 
180  return set_parameters(trajectory_length, (Metropolis_test == 0) ? false : true);
181 }
182 
183 
184 //====================================================================
185 void HMC_General::set_parameters(const double trajectory_length, const bool Metropolis_test)
186 {
187  //- print input parameters
188  vout.general(m_vl, "%s:\n", class_name.c_str());
189  vout.general(m_vl, " Number of actions: %4d\n", m_action.size());
190  vout.general(m_vl, " traj_length = %8.6f\n", trajectory_length);
191  vout.general(m_vl, " Metropolis_test = %s\n", Metropolis_test ? "true" : "false");
192 
193  //- range check
194  // NB. Metropolis_test == 0 is allowed.
195 
196  //- store values
197  m_trajectory_length = trajectory_length;
198  m_Metropolis_test = Metropolis_test;
199 }
200 
201 
202 //====================================================================
204 {
205  const int Nc = CommonParameters::Nc();
206 
207  Field_G U(Uorg);
208 
209  for (int i = 0; i < m_action.size(); ++i) {
210 
211  m_action[i]->set_config(&U);
212  }
213 
214  const int Nin = U.nin();
215  const int Nvol = U.nvol();
216  const int Nex = U.nex();
217 
218  Field_G iP(Nvol, Nex);
219 
220  vout.general(m_vl, "\n");
221  vout.general(m_vl, "HMC (general) start.\n");
222  vout.general(m_vl, "\n");
223 
224  // Langevin step
225  const double H_total0 = langevin(iP, U);
226  vout.general(m_vl, "H_total(init) = %20.10f\n", H_total0);
227 
228  const double plaq0 = m_staple->plaquette(U);
229  vout.general(m_vl, "plaq(init) = %20.12f\n", plaq0);
230  vout.general(m_vl, "\n");
231 
232  // initial Hamiltonian
233  // H_total0 = calc_Hamiltonian(iP,U);
234 
235  // molecular dynamical integration
237  vout.general(m_vl, "\n");
238 
239  // trial Hamiltonian
240  const double H_total1 = calc_Hamiltonian(iP, U);
241  vout.general(m_vl, "H_total(trial) = %20.10f\n", H_total1);
242 
243  const double plaq1 = m_staple->plaquette(U);
244  vout.general(m_vl, "plaq(trial) = %20.12f\n", plaq1);
245 
246 
247  // Metropolis test
248  vout.general(m_vl, "Metropolis test.\n");
249 
250  const double diff_H = H_total1 - H_total0;
251  const double exp_minus_diff_H = exp(-diff_H);
252 
253  double rand = -1.0;
254  if (m_Metropolis_test) {
255  rand = m_rand->get();
256  }
257  vout.general(m_vl, " H(diff) = %14.8f\n", diff_H);
258  vout.general(m_vl, " exp(-diff_H) = %14.8f\n", exp_minus_diff_H);
259  vout.general(m_vl, " Random number = %14.8f\n", rand);
260 
261  if (rand <= exp_minus_diff_H) { // accepted
262  vout.general(m_vl, " Metropolis Accepted\n");
263  Uorg = U;
264  } else { // rejected
265  vout.general(m_vl, " Metropolis Rejected\n");
266  }
267 
268  const double plaq_final = m_staple->plaquette(Uorg);
269  vout.general(m_vl, "plaq(final) = %20.12f\n", plaq_final);
270 
271  return plaq_final;
272 }
273 
274 
275 //====================================================================
276 double HMC_General::langevin(Field_G& iP, const Field_G& U)
277 {
278  const int Nc = CommonParameters::Nc();
279  const int Ndim = CommonParameters::Ndim();
280  const int NcA = Nc * Nc - 1;
281 
282  const int Nvol = CommonParameters::Nvol();
283  const int NPE = CommonParameters::NPE();
284 
285  vout.general(m_vl, "Langevin step:\n");
286 
287  // discard caches
289 
290  for (int i = 0; i < m_director.size(); ++i) {
291  m_director[i]->notify_linkv();
292  }
293 
294  // kinetic term
295  double H_iP = m_Langevin_P->set_iP(iP);
296 
297  double Fgauge = 1.0/(double(NcA * Nvol * Ndim) * double(NPE));
298  vout.general(m_vl, " Kinetic term:\n");
299  vout.general(m_vl, " H_kin = %18.8f\n", H_iP);
300  vout.general(m_vl, " H_kin/dof = %18.8f\n", H_iP * Fgauge);
301 
303 
304  double H_actions = 0.0;
305  for (int i = 0; i < m_action.size(); ++i) {
306  H_actions += m_action[i]->langevin(m_rand);
307  }
308 
310 
311  double H_total = H_iP + H_actions;
312  return H_total;
313 }
314 
315 
316 //====================================================================
317 double HMC_General::calc_Hamiltonian(const Field_G& iP, const Field_G& U)
318 {
319  const int Nin = U.nin();
320  const int Nvol = U.nvol();
321  const int Nex = U.nex();
322 
323  const int Nc = CommonParameters::Nc();
324  const int Nd = CommonParameters::Nd();
325  const int NcA = Nc * Nc - 1;
326 
327  const int NPE = CommonParameters::NPE();
328 
329  vout.general(m_vl, "Hamiltonian calculation:\n");
330 
331  // kinetic term
332  double H_iP = calcH_P(iP);
333  double Fgauge = 1.0/(double(NcA * Nvol * Nex) * double(NPE));
334  vout.general(m_vl, " Kinetic term:\n");
335  vout.general(m_vl, " H_kin = %18.8f\n", H_iP);
336  vout.general(m_vl, " H_kin/dof = %18.8f\n", H_iP * Fgauge);
337 
339 
340  double H_actions = 0.0;
341  for (int i = 0; i < m_action.size(); ++i) {
342  H_actions += m_action[i]->calcH();
343  }
344 
346 
347  double H_total = H_iP + H_actions;
348  return H_total;
349 }
350 
351 
352 //====================================================================
353 double HMC_General::calcH_P(const Field_G& iP)
354 {
355  const double hn = iP.norm();
356  const double H_iP = 0.5 * hn * hn;
357 
358  return H_iP;
359 }
360 
361 
362 //============================================================END=====
Parameters::set_bool
void set_bool(const string &key, const bool value)
Definition: parameters.cpp:30
HMC_General::m_trajectory_length
double m_trajectory_length
Definition: hmc_General.h:59
HMC_General::HMC_General
HMC_General(const ActionList &action_list, std::vector< Director * > director, Integrator *integrator, RandomNumbers *rand)
constructor with action_list, directors, and random number generator
Definition: hmc_General.cpp:20
Langevin_Momentum::set_iP
double set_iP(Field_G &iP)
Setting conjugate momenta and returns kinetic part of Hamiltonian.
Definition: langevin_Momentum.cpp:17
Integrator::invalidate_cache
virtual void invalidate_cache()=0
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
CommonParameters
Common parameter class: provides parameters as singleton.
Definition: commonParameters.h:42
HMC_General::m_integrator
Integrator * m_integrator
MD integrator.
Definition: hmc_General.h:55
HMC_General::update
double update(Field_G &)
Definition: hmc_General.cpp:203
CommonParameters::Ndim
static int Ndim()
Definition: commonParameters.h:117
Parameters
Class for parameters.
Definition: parameters.h:46
Staple_lex::plaquette
double plaquette(const Field_G &)
calculates plaquette value.
Definition: staple_lex.cpp:89
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:518
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Field::nex
int nex() const
Definition: field.h:128
RandomNumbers
Base class of random number generators.
Definition: randomNumbers.h:43
HMC_General::m_Langevin_P
Langevin_Momentum * m_Langevin_P
Definition: hmc_General.h:58
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
HMC_General::m_rand
RandomNumbers * m_rand
random number generator
Definition: hmc_General.h:56
HMC_General::m_action
std::vector< Action * > m_action
actions
Definition: hmc_General.h:53
Field::nin
int nin() const
Definition: field.h:126
Parameters::fetch_bool
int fetch_bool(const string &key, bool &value) const
Definition: parameters.cpp:391
ActionSet
std::vector< Action * > ActionSet
Definition: action_list.h:38
ActionList
lists of actions at respective integrator levels.
Definition: action_list.h:40
HMC_General::get_parameters
void get_parameters(Parameters &params) const
Definition: hmc_General.cpp:166
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
hmc_General.h
HMC_General::langevin
double langevin(Field_G &iP, const Field_G &U)
Definition: hmc_General.cpp:276
RandomNumbers::get
virtual double get()=0
HMC_General::set_parameters
void set_parameters(const Parameters &params)
Definition: hmc_General.cpp:140
HMC_General::m_director
std::vector< Director * > m_director
directors
Definition: hmc_General.h:54
Field::norm
double norm() const
Definition: field.h:226
HMC_General::~HMC_General
~HMC_General()
destructor
Definition: hmc_General.cpp:132
HMC_General::class_name
static const std::string class_name
Definition: hmc_General.h:48
HMC_General::m_vl
Bridge::VerboseLevel m_vl
Definition: hmc_General.h:61
HMC_General::calcH_P
double calcH_P(const Field_G &iP)
Definition: hmc_General.cpp:353
Langevin_Momentum
Langevin part of HMC for conjugate momentum to link variable.
Definition: langevin_Momentum.h:38
Field::nvol
int nvol() const
Definition: field.h:127
HMC_General::calc_Hamiltonian
double calc_Hamiltonian(const Field_G &iP, const Field_G &U)
Definition: hmc_General.cpp:317
CommonParameters::NPE
static int NPE()
Definition: commonParameters.h:101
CommonParameters::Nd
static int Nd()
Definition: commonParameters.h:116
Staple_lex
Staple construction.
Definition: staple_lex.h:39
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
HMC_General::m_staple
Staple_lex * m_staple
Definition: hmc_General.h:57
ActionList::get_actions
ActionSet get_actions() const
Definition: action_list.cpp:82
Parameters::fetch_string
int fetch_string(const string &key, string &value) const
Definition: parameters.cpp:378
Parameters::fetch_double
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
Field_G
SU(N) gauge field.
Definition: field_G.h:38
Integrator
Base class of Integrator class family.
Definition: integrator.h:29
Integrator::evolve
virtual void evolve(const double step_size, Field_G &iP, Field_G &U)=0
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
HMC_General::m_Metropolis_test
bool m_Metropolis_test
Metropolis test: enabled if true.
Definition: hmc_General.h:52
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:572
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:216