Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
hmc_General.cpp
Go to the documentation of this file.
1 
14 #include "hmc_General.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("Metropolis_test", 0);
25 
26  param.Register_string("verbose_level", "NULL");
27  }
28 
29 
30 #ifdef USE_PARAMETERS_FACTORY
31  bool init_param = ParametersFactory::Register("HMC.General", append_entry);
32 #endif
33 }
34 //- end
35 
36 //- parameters class
38 //- end
39 
40 const std::string HMC_General::class_name = "HMC_General";
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 Mtpl_test;
51 
52  int err = 0;
53  err += params.fetch_int("Metropolis_test", Mtpl_test);
54 
55  if (err) {
56  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
57  abort();
58  }
59 
60  set_parameters(Mtpl_test);
61 }
62 
63 
64 //====================================================================
65 void HMC_General::set_parameters(int Mtpl_test)
66 {
67  //- print input parameters
68  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
69  vout.general(m_vl, " Number of actions: %4d\n", m_action.size());
70  vout.general(m_vl, " Mtlp_test = %4d\n", Mtpl_test);
71 
72  //- range check
73  // NB. Mtpl_test == 0 is allowed.
74 
75  //- store values
76  m_Mtpl_test = Mtpl_test;
77 }
78 
79 
80 //====================================================================
81 double HMC_General::update(Field_G& conf_org)
82 {
83  int Nc = CommonParameters::Nc();
84  int Lvol = CommonParameters::Lvol();
85 
86  Field_G U(conf_org);
87 
88  for (int i = 0; i < m_action.size(); ++i) {
89  m_action[i]->set_config(&U);
90  }
91 
92  int Nin = U.nin();
93  int Nvol = U.nvol();
94  int Nex = U.nex();
95 
96  Field_G iP(Nvol, Nex);
97 
98 
99  vout.general(m_vl, "HMC (general) start.\n");
100 
101  // Langevin step
102  double H_tot0 = langevin(iP, U);
103  vout.general(m_vl, " H_total(init) = %20.10f\n", H_tot0);
104 
105  double plaq0 = m_staple->plaquette(U);
106  vout.general(m_vl, " plaq(init) = %20.12f\n", plaq0);
107 
108  // initial Hamiltonian
109  // H_tot0 = calc_Hamiltonian(iP,U);
110 
111  // molecular dynamical integration
112  m_integrator->evolve(iP, U);
113 
114  // trial Hamiltonian
115  double H_tot1 = calc_Hamiltonian(iP, U);
116  vout.general(m_vl, " H_total(trial) = %20.10f\n", H_tot1);
117 
118  double plaq1 = m_staple->plaquette(U);
119  vout.general(m_vl, " plaq(trial) = %20.12f\n", plaq1);
120 
121 
122  // Metropolis test
123  vout.general(m_vl, "Metropolis test.\n");
124 
125  double diff_H = H_tot1 - H_tot0;
126  double Arprob = exp(-diff_H);
127  double rn = -1.0;
128  if (m_Mtpl_test != 0) {
129  rn = m_rand->get();
130  }
131  vout.general(m_vl, " H(diff) = %14.8f\n", diff_H);
132  vout.general(m_vl, " Acceptance = %14.8f\n", Arprob);
133  vout.general(m_vl, " Random number = %14.8f\n", rn);
134 
135  if (rn <= Arprob) { // accepted
136  vout.general(m_vl, " Accepted\n");
137  conf_org = U;
138  } else { // rejected
139  vout.general(m_vl, " Rejected\n");
140  }
141 
142 
143  double plaq_final = m_staple->plaquette(conf_org);
144  vout.general(m_vl, " plaq(final) = %20.12f\n", plaq_final);
145 
146  return plaq_final;
147 }
148 
149 
150 //====================================================================
152 {
153  int Nc = CommonParameters::Nc();
154  int Lvol = CommonParameters::Lvol();
155  int Ndim = CommonParameters::Ndim();
156  int NcA = Nc * Nc - 1;
157 
158  int size_iP = NcA * Lvol * Ndim;
159 
160  vout.general(m_vl, "Langevin step.\n");
161 
162  for (int i = 0; i < m_action.size(); ++i) {
163  m_action[i]->notify_linkv();
164  }
165 
166  for (int i = 0; i < m_director.size(); ++i) {
167  m_director[i]->notify_linkv();
168  }
169 
170  // kinetic term
171  double H_iP = m_Langevin_P->set_iP(iP);
172  vout.general(m_vl, " Kinetic term:\n");
173  vout.general(m_vl, " H_kin = %18.8f\n", H_iP);
174  vout.general(m_vl, " H_kin/dof = %18.8f\n", H_iP / size_iP);
175 
176 
177  double H_actions = 0.0;
178  for (int i = 0; i < m_action.size(); ++i) {
179  H_actions += m_action[i]->langevin(m_rand);
180  }
181 
182  double H_tot = H_iP + H_actions;
183  return H_tot;
184 }
185 
186 
187 //====================================================================
189 {
190  int Nin = U.nin();
191  int Nvol = U.nvol();
192  int Nex = U.nex();
193 
194  int Nc = CommonParameters::Nc();
195  int Nd = CommonParameters::Nd();
196  int Lvol = CommonParameters::Lvol();
197  int NcA = Nc * Nc - 1;
198 
199  int size_iP = NcA * Lvol * Nex;
200  // int size_U = Lvol * 6.0;
201  // int size_psf = Lvol * Nc * Nd;
202 
203 
204  vout.general(m_vl, "Hamiltonian calculation.\n");
205 
206  // kinetic term
207  double H_iP = calcH_P(iP);
208  vout.general(m_vl, " Kinetic term:\n");
209  vout.general(m_vl, " H_kin = %18.8f\n", H_iP);
210  vout.general(m_vl, " H_kin/dof = %18.8f\n", H_iP / size_iP);
211 
212  double H_actions = 0.0;
213  for (int i = 0; i < m_action.size(); ++i) {
214  H_actions += m_action[i]->calcH();
215  }
216 
217  double H_tot = H_iP + H_actions;
218  return H_tot;
219 }
220 
221 
222 //====================================================================
224 {
225  double hn = iP.norm();
226  double H_iP = 0.5 * hn * hn;
227 
228  return H_iP;
229 }
230 
231 
232 //====================================================================
233 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:207
virtual double get()=0
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
double calc_Hamiltonian(Field_G &iP, Field_G &U)
void set_parameters(const Parameters &params)
Definition: hmc_General.cpp:43
void general(const char *format,...)
Definition: bridgeIO.cpp:38
int m_Mtpl_test
Metropolis test: Mtpl_test=0: no test, !=0: test.
Definition: hmc_General.h:59
void Register_int(const string &, const int)
Definition: parameters.cpp:331
static const std::string class_name
Definition: hmc_General.h:56
int nvol() const
Definition: field.h:101
double set_iP(Field_G &iP)
Setting conjugate momenta and returns kinetic part of Hamiltonian.
Bridge::VerboseLevel m_vl
Definition: hmc_General.h:66
double plaquette(const Field_G &)
calculates plaquette value.
Definition: staples.cpp:32
RandomNumbers * m_rand
random number generator
Definition: hmc_General.h:63
double calcH_P(Field_G &iP)
Class for parameters.
Definition: parameters.h:40
valarray< Action * > m_action
actions
Definition: hmc_General.h:60
static int Lvol()
double langevin(Field_G &iP, Field_G &U)
int nin() const
Definition: field.h:100
SU(N) gauge field.
Definition: field_G.h:36
double norm() const
Definition: field.h:210
int nex() const
Definition: field.h:102
virtual void evolve(Field_G &iP, Field_G &U)=0
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
Langevin_Momentum * m_Langevin_P
Definition: hmc_General.h:65
static bool Register(const std::string &realm, const creator_callback &cb)
Integrator * m_integrator
MD integrator.
Definition: hmc_General.h:62
valarray< Director * > m_director
directors
Definition: hmc_General.h:61
string get_string(const string &key) const
Definition: parameters.cpp:85
double update(Field_G &)
Definition: hmc_General.cpp:81
Staples * m_staple
Definition: hmc_General.h:64
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:191