Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
integrator_Omelyan.cpp
Go to the documentation of this file.
1 
14 #include "integrator_Omelyan.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using Bridge::vout;
21 
22 //- parameter entries
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_int("level", 0);
27  param.Register_double("step_size", 0.0);
28  param.Register_int("number_of_steps", 0);
29  param.Register_double("lambda_Omelyan", 0.0);
30 
31  param.Register_string("verbose_level", "NULL");
32  }
33 
34 
35 #ifdef USE_PARAMETERS_FACTORY
36  bool init_param = ParametersFactory::Register("Integrator.Omelyan", append_entry);
37 #endif
38 }
39 //- end
40 
41 //- parameters class
43 //- end
44 
45 const std::string Integrator_Omelyan::class_name = "Integrator_Omelyan";
46 
47 //====================================================================
49 {
50  const string str_vlevel = params.get_string("verbose_level");
51 
52  m_vl = vout.set_verbose_level(str_vlevel);
53 
54  //- fetch and check input parameters
55  int level;
56  double Estep;
57  int Nstep;
58  double lambda_Omelyan;
59 
60  int err = 0;
61  err += params.fetch_int("level", level);
62  err += params.fetch_double("step_size", Estep);
63  err += params.fetch_int("number_of_steps", Nstep);
64  err += params.fetch_double("lambda_Omelyan", lambda_Omelyan);
65 
66  if (err) {
67  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
68  abort();
69  }
70 
71 
72  set_parameters(level, Estep, Nstep, lambda_Omelyan);
73 }
74 
75 
76 //====================================================================
77 void Integrator_Omelyan::set_parameters(int level, double Estep, int Nstep,
78  double lambda_Omelyan)
79 {
80  //- print input parameters
81  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
82  vout.general(m_vl, " Level: %4d\n", level);
83  vout.general(m_vl, " Estep = %10.6f\n", Estep);
84  vout.general(m_vl, " Nstep = %4d\n", Nstep);
85  vout.general(m_vl, " lambda_Omelyan = %10.6f\n", lambda_Omelyan);
86  vout.general(m_vl, " Number of actions: %4d\n", m_action.size());
87 
88  //- range check
89  // NB. level,Estep,Nstep,lambda_Omelyan == 0 is allowed.
90 
91  //- store values
92  m_Estep = Estep;
93  m_Nstep = Nstep;
94  m_level = level;
95  m_lambda = lambda_Omelyan;
96 }
97 
98 
99 //====================================================================
101 {
102  int Nin = U.nin();
103  int Nvol = U.nvol();
104  int Nex = U.nex();
105  int Nc = CommonParameters::Nc();
106 
107  double estep = m_Estep;
108  // double esteph = 0.5 * estep;
109  double estep2;
110 
111  Field force(Nin, Nvol, Nex), force1(Nin, Nvol, Nex);
112 
113 
114  vout.general(m_vl, "Integration level-%d start.\n", m_level);
115 
116  // Initial half step of update of iP
117  estep2 = estep * m_lambda;
118  if (m_Nstep > 0) {
119  int istep = 0;
120  vout.general(m_vl, "istep = %d\n", istep);
121  force = 0.0;
122  for (int i = 0; i < m_action.size(); ++i) {
123  force1 = m_action[i]->force();
124  force += estep2 * force1;
125  }
126  iP += (Field_G)force;
127  }
128 
129  // Molecular dynamics step
130  for (int istep = 1; istep < m_Nstep + 1; istep++) {
131  vout.general(m_vl, "istep = %d\n", istep);
132 
133  m_integ_next->evolve(iP, U);
134 
135  estep2 = estep * (1.0 - 2.0 * m_lambda);
136  force = 0.0;
137  for (int i = 0; i < m_action.size(); ++i) {
138  force1 = m_action[i]->force();
139  force += estep2 * force1;
140  }
141  iP += (Field_G)force;
142 
143  m_integ_next->evolve(iP, U);
144 
145  estep2 = estep * 2.0 * m_lambda;
146  if (istep == m_Nstep) estep2 = estep * m_lambda;
147 
148  force = 0.0;
149  for (int i = 0; i < m_action.size(); ++i) {
150  force1 = m_action[i]->force();
151  force += estep2 * force1;
152  }
153  iP += (Field_G)force;
154  } // here istep loop ends
155 
156  vout.general(m_vl, "Integration level-%d finished.\n", m_level);
157 }
158 
159 
160 //====================================================================
161 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:207
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
void general(const char *format,...)
Definition: bridgeIO.cpp:38
void Register_int(const string &, const int)
Definition: parameters.cpp:331
void evolve(Field_G &iP, Field_G &U)
Container of Field-type object.
Definition: field.h:37
int nvol() const
Definition: field.h:101
void set_parameters(const Parameters &params)
Class for parameters.
Definition: parameters.h:40
int nin() const
Definition: field.h:100
std::valarray< Action * > m_action
SU(N) gauge field.
Definition: field_G.h:36
int nex() const
Definition: field.h:102
virtual void evolve(Field_G &iP, Field_G &U)=0
Bridge::VerboseLevel m_vl
Definition: integrator.h:47
static const std::string class_name
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
static bool Register(const std::string &realm, const creator_callback &cb)
void Register_double(const string &, const double)
Definition: parameters.cpp:324
Integrator * m_integ_next
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
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191