Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
integrator_Leapfrog.cpp
Go to the documentation of this file.
1 
14 #include "integrator_Leapfrog.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("level", 0);
25  param.Register_double("step_size", 0.0);
26  param.Register_int("number_of_steps", 0);
27 
28  param.Register_string("verbose_level", "NULL");
29  }
30 
31 
32 #ifdef USE_PARAMETERS_FACTORY
33  bool init_param = ParametersFactory::Register("Integrator.Leapfrog", append_entry);
34 #endif
35 }
36 //- end
37 
38 //- parameters class
40 //- end
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 level;
51  double Estep;
52  int Nstep;
53 
54  int err = 0;
55  err += params.fetch_int("level", level);
56  err += params.fetch_double("step_size", Estep);
57  err += params.fetch_int("number_of_steps", Nstep);
58 
59  if (err) {
60  vout.crucial(m_vl, "Integrator_Leapfrog: fetch error, input parameter not found.\n");
61  abort();
62  }
63 
64 
65  set_parameters(level, Estep, Nstep);
66 }
67 
68 
69 //====================================================================
70 void Integrator_Leapfrog::set_parameters(int level, double Estep, int Nstep)
71 {
72  //- print input parameters
73  vout.general(m_vl, "Integrator (leapfrog) setup:\n");
74  vout.general(m_vl, " Level: %4d\n", m_level);
75  vout.general(m_vl, " Estep = %10.6f\n", m_Estep);
76  vout.general(m_vl, " Nstep = %4d\n", m_Nstep);
77  vout.general(m_vl, " Number of actions: %4d\n", m_action.size());
78 
79  //- range check
80  // NB. level,Estep,Nstep == 0 is allowed.
81 
82  //- store values
83  m_Estep = Estep;
84  m_Nstep = Nstep;
85  m_level = level;
86 }
87 
88 
89 //====================================================================
91 {
92  int Nin = U.nin();
93  int Nvol = U.nvol();
94  int Nex = U.nex();
95  int Nc = CommonParameters::Nc();
96 
97  double estep = m_Estep;
98  double esteph = 0.5 * estep;
99  double estep2;
100 
101  Field force(Nin, Nvol, Nex), force1(Nin, Nvol, Nex);
102 
103 
104  vout.general(m_vl, "Integration level-%d start.\n", m_level);
105 
106  // Initial half step of update of iP
107  if (m_Nstep > 0) {
108  int istep = 0;
109  vout.general(m_vl, "istep = %d\n", istep);
110  force = 0.0;
111  for (int i = 0; i < m_action.size(); ++i) {
112  force1 = m_action[i]->force();
113  force += esteph * force1;
114  }
115  iP += (Field_G)force;
116  }
117 
118  // Molecular dynamics step
119  for (int istep = 1; istep < m_Nstep + 1; istep++) {
120  vout.general(m_vl, "istep = %d\n", istep);
121 
122  m_integ_next->evolve(iP, U);
123 
124  estep2 = estep;
125  if (istep == m_Nstep) estep2 = esteph;
126 
127  force = 0.0;
128  for (int i = 0; i < m_action.size(); ++i) {
129  force1 = m_action[i]->force();
130  force += estep2 * force1;
131  }
132  iP += (Field_G)force;
133  } // here istep loop ends
134 
135  vout.general(m_vl, "Integration level-%d finished.\n", m_level);
136 }
137 
138 
139 //====================================================================
140 //============================================================END=====