Bridge++  Ver. 1.1.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 //====================================================================
47 {
48  const string str_vlevel = params.get_string("verbose_level");
49 
50  m_vl = vout.set_verbose_level(str_vlevel);
51 
52  //- fetch and check input parameters
53  int level;
54  double Estep;
55  int Nstep;
56  double lambda_Omelyan;
57 
58  int err = 0;
59  err += params.fetch_int("level", level);
60  err += params.fetch_double("step_size", Estep);
61  err += params.fetch_int("number_of_steps", Nstep);
62  err += params.fetch_double("lambda_Omelyan", lambda_Omelyan);
63 
64  if (err) {
65  vout.crucial(m_vl, "Integrator_Omelyan: fetch error, input parameter not found.\n");
66  abort();
67  }
68 
69 
70  set_parameters(level, Estep, Nstep, lambda_Omelyan);
71 }
72 
73 
74 //====================================================================
75 void Integrator_Omelyan::set_parameters(int level, double Estep, int Nstep,
76  double lambda_Omelyan)
77 {
78  //- print input parameters
79  vout.general(m_vl, "Integrator (Omelyan) setup:\n");
80  vout.general(m_vl, " Level: %4d\n", m_level);
81  vout.general(m_vl, " Estep = %10.6f\n", m_Estep);
82  vout.general(m_vl, " Nstep = %4d\n", m_Nstep);
83  vout.general(m_vl, " Number of actions: %4d\n", m_action.size());
84  vout.general(m_vl, " lambda_Omelyan = %10.6f\n", m_lambda);
85 
86  //- range check
87  // NB. level,Estep,Nstep,lambda_Omelyan == 0 is allowed.
88 
89  //- store values
90  m_Estep = Estep;
91  m_Nstep = Nstep;
92  m_level = level;
93  m_lambda = lambda_Omelyan;
94 }
95 
96 
97 //====================================================================
99 {
100  int Nin = U.nin();
101  int Nvol = U.nvol();
102  int Nex = U.nex();
103  int Nc = CommonParameters::Nc();
104 
105  double estep = m_Estep;
106  // double esteph = 0.5 * estep;
107  double estep2;
108 
109  Field force(Nin, Nvol, Nex), force1(Nin, Nvol, Nex);
110 
111 
112  vout.general(m_vl, "Integration level-%d start.\n", m_level);
113 
114  // Initial half step of update of iP
115  estep2 = estep * m_lambda;
116  if (m_Nstep > 0) {
117  int istep = 0;
118  vout.general(m_vl, "istep = %d\n", istep);
119  force = 0.0;
120  for (int i = 0; i < m_action.size(); ++i) {
121  force1 = m_action[i]->force();
122  force += estep2 * force1;
123  }
124  iP += (Field_G)force;
125  }
126 
127  // Molecular dynamics step
128  for (int istep = 1; istep < m_Nstep + 1; istep++) {
129  vout.general(m_vl, "istep = %d\n", istep);
130 
131  m_integ_next->evolve(iP, U);
132 
133  estep2 = estep * (1.0 - 2.0 * m_lambda);
134  force = 0.0;
135  for (int i = 0; i < m_action.size(); ++i) {
136  force1 = m_action[i]->force();
137  force += estep2 * force1;
138  }
139  iP += (Field_G)force;
140 
141  m_integ_next->evolve(iP, U);
142 
143  estep2 = estep * 2.0 * m_lambda;
144  if (istep == m_Nstep) estep2 = estep * m_lambda;
145 
146  force = 0.0;
147  for (int i = 0; i < m_action.size(); ++i) {
148  force1 = m_action[i]->force();
149  force += estep2 * force1;
150  }
151  iP += (Field_G)force;
152  } // here istep loop ends
153 
154  vout.general(m_vl, "Integration level-%d finished.\n", m_level);
155 }
156 
157 
158 //====================================================================
159 //============================================================END=====