Bridge++  Ver. 1.3.x
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_int("number_of_steps", 0);
28  param.Register_double("lambda_Omelyan", 0.0);
29 
30  param.Register_string("verbose_level", "NULL");
31  }
32 
33 
34 #ifdef USE_PARAMETERS_FACTORY
35  bool init_param = ParametersFactory::Register("Integrator.Omelyan", append_entry);
36 #endif
37 }
38 //- end
39 
40 //- parameters class
42 //- end
43 
44 const std::string Integrator_Omelyan::class_name = "Integrator_Omelyan";
45 
46 //====================================================================
48 {
49  const string str_vlevel = params.get_string("verbose_level");
50 
51  m_vl = vout.set_verbose_level(str_vlevel);
52 
53  //- fetch and check input parameters
54  int level;
55  int Nstep;
56  double lambda_Omelyan;
57 
58  int err = 0;
59  err += params.fetch_int("level", level);
60  err += params.fetch_int("number_of_steps", Nstep);
61  err += params.fetch_double("lambda_Omelyan", lambda_Omelyan);
62 
63  if (err) {
64  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
65  exit(EXIT_FAILURE);
66  }
67 
68  set_parameters(level, Nstep, lambda_Omelyan);
69 }
70 
71 
72 //====================================================================
73 void Integrator_Omelyan::set_parameters(int level, int Nstep, double lambda_Omelyan)
74 {
75  //- print input parameters
76  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
77  vout.general(m_vl, " Level: %4d\n", level);
78  vout.general(m_vl, " Nstep = %4d\n", Nstep);
79  vout.general(m_vl, " lambda_Omelyan = %10.6f\n", lambda_Omelyan);
80 
81  //- range check
82  // NB. level,Estep,Nstep,lambda_Omelyan == 0 is allowed.
83 
84  //- store values
85  m_Nstep = Nstep;
86  m_level = level;
87  m_lambda = lambda_Omelyan;
88 }
89 
90 
91 //====================================================================
93 {
94  m_level = level;
95 }
96 
97 
98 //====================================================================
100 {
101  m_Nstep = nstep;
102 }
103 
104 
105 //====================================================================
106 void Integrator_Omelyan::set_parameter_nsteps(const std::vector<int>& nsteps)
107 {
108  if (nsteps.size() > 0) {
109  set_parameter_nstep(nsteps[0]);
110 
111  // transfer to lower levels
112  if (m_update_u && (nsteps.size() > 1)) {
113  std::vector<int> next_steps(nsteps.begin() + 1, nsteps.end());
114  m_update_u->set_parameter_nsteps(next_steps);
115  }
116  }
117 }
118 
119 
120 //====================================================================
121 void Integrator_Omelyan::set_parameter_lambda(const double lambda_omelyan)
122 {
123  m_lambda = lambda_omelyan;
124 }
125 
126 
127 //====================================================================
128 void Integrator_Omelyan::evolve(const double step_size, Field_G& iP, Field_G& U)
129 {
130  int Nin = U.nin();
131  int Nvol = U.nvol();
132  int Nex = U.nex();
133  int Nc = CommonParameters::Nc();
134 
135  vout.detailed(m_vl, "%s: level %d: nstep = %d, step_size = %8.6f\n", class_name.c_str(), m_level, m_Nstep, step_size);
136 
137  vout.general(m_vl, "Integration level-%d start.\n", m_level);
138 
139  if (m_Nstep > 0) {
140  double estep = step_size / m_Nstep;
141 
142  // initial lambda step
143  m_update_p->evolve(estep * m_lambda, iP, U);
144 
145  // molecular dynamics steps
146  for (int istep = 1; istep <= m_Nstep; ++istep) {
147  m_update_u->evolve(estep * 0.5, iP, U);
148 
149  m_update_p->evolve(estep * (1.0 - 2.0 * m_lambda), iP, U);
150 
151  m_update_u->evolve(estep * 0.5, iP, U);
152 
153  if (istep < m_Nstep) {
154  m_update_p->evolve(estep * m_lambda * 2.0, iP, U);
155  }
156  }
157 
158  // last lambda step
159  m_update_p->evolve(estep * m_lambda, iP, U);
160  } else {
161  vout.general(m_vl, "Nstep is zero. skip.\n");
162  }
163 
164  vout.general(m_vl, "Integration level-%d finished.\n", m_level);
165 }
166 
167 
168 //====================================================================
169 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:278
void detailed(const char *format,...)
Definition: bridgeIO.cpp:82
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
void general(const char *format,...)
Definition: bridgeIO.cpp:65
void Register_int(const string &, const int)
Definition: parameters.cpp:330
int nvol() const
Definition: field.h:116
void set_parameters(const Parameters &params)
Class for parameters.
Definition: parameters.h:38
void set_parameter_nsteps(const std::vector< int > &nsteps)
void set_parameter_nstep(const int nstep)
int nin() const
Definition: field.h:115
SU(N) gauge field.
Definition: field_G.h:38
void set_parameter_lambda(const double lambda_omelyan)
int nex() const
Definition: field.h:117
virtual void evolve(const double step_size, Field_G &iP, Field_G &U)=0
Bridge::VerboseLevel m_vl
Definition: integrator.h:62
static const std::string class_name
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
static bool Register(const std::string &realm, const creator_callback &cb)
void evolve(const double step_size, Field_G &iP, Field_G &U)
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
void set_parameter_level(const int level)
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28
virtual void set_parameter_nsteps(const std::vector< int > &nsteps)
Definition: integrator.h:49