Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
action_F_Rational.cpp
Go to the documentation of this file.
1 
14 #include "action_F_Rational.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("Np", 0);
25  param.Register_int("n_exp", 0);
26  param.Register_int("d_exp", 0);
27  param.Register_double("x_min", 0.0);
28  param.Register_double("x_max", 0.0);
29  param.Register_int("Niter", 0);
30  param.Register_double("Stop_cond", 0.0);
31 
32  param.Register_string("verbose_level", "NULL");
33  }
34 
35 
36 #ifdef USE_PARAMETERS_FACTORY
37  bool init_param = ParametersFactory::Register("Action.F_Rational", append_entry);
38 #endif
39 }
40 //- end
41 
42 //- parameters class
44 //- end
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 Np, n_exp, d_exp;
55  double x_min, x_max;
56  int Niter;
57  double Stop_cond;
58 
59  int err = 0;
60  err += params.fetch_int("Np", Np);
61  err += params.fetch_int("n_exp", n_exp);
62  err += params.fetch_int("d_exp", d_exp);
63  err += params.fetch_double("x_min", x_min);
64  err += params.fetch_double("x_max", x_max);
65  err += params.fetch_int("Niter", Niter);
66  err += params.fetch_double("Stop_cond", Stop_cond);
67 
68  if (err) {
69  vout.crucial(m_vl, "Action_F_Rational: fetch error, input parameter not found.\n");
70  abort();
71  }
72 
73 
74  set_parameters(Np, n_exp, d_exp, x_min, x_max, Niter, Stop_cond);
75 }
76 
77 
78 //====================================================================
79 void Action_F_Rational::set_parameters(int Np, int n_exp, int d_exp,
80  double x_min, double x_max,
81  int Niter, double Stop_cond)
82 {
83  //- print input parameters
84  vout.general(m_vl, "Action_F_Rational:\n");
85  vout.general(m_vl, " Np = %4d\n", Np);
86  vout.general(m_vl, " n_exp = %4d\n", n_exp);
87  vout.general(m_vl, " d_exp = %4d\n", d_exp);
88  vout.general(m_vl, " x_min = %8.4f\n", x_min);
89  vout.general(m_vl, " x_max = %8.4f\n", x_max);
90  vout.general(m_vl, " Niter = %6d\n", Niter);
91  vout.general(m_vl, " Stop_cond = %8.2e\n", Stop_cond);
92 
93  //- range check
94  int err = 0;
95  err += ParameterCheck::non_zero(Np);
96  err += ParameterCheck::non_zero(n_exp);
97  err += ParameterCheck::non_zero(d_exp);
98  // NB. x_min,x_max == 0 is allowed.
99  err += ParameterCheck::non_negative(Niter);
100  err += ParameterCheck::square_non_zero(Stop_cond);
101 
102  if (err) {
103  vout.crucial(m_vl, "Action_F_Rational: parameter range check failed.\n");
104  abort();
105  }
106 
107  //- store values
108  m_Np = Np;
109  m_n_exp = n_exp;
110  m_d_exp = d_exp;
111  m_x_min = x_min;
112  m_x_max = x_max;
113  m_Niter = Niter;
114  m_Stop_cond = Stop_cond;
115 
116  //- post-process
117  setup();
118 }
119 
120 
121 //====================================================================
123 {
124  int Nc = CommonParameters::Nc();
125  int Nvol = CommonParameters::Nvol();
126  int Ndim = CommonParameters::Ndim();
127  int NinG = 2 * Nc * Nc;
128 
129  m_force.reset(NinG, Nvol, Ndim);
130 
131  // rational operator for Langevin step.
133  int d_exp2 = 2 * m_d_exp;
136 
137  // rational operator for Hamiltonian calculation.
139  int n_expm = -m_n_exp;
142 
143  // force of rational operator
147 
148  // link variable update flag
149  m_status_linkv = 0;
150 }
151 
152 
153 //====================================================================
155 {
156  delete m_force_rational;
157  delete m_fopr_H;
158  delete m_fopr_langev;
159 }
160 
161 
162 //====================================================================
164 {
165  int NinF = m_fopr->field_nin();
166  int NvolF = m_fopr->field_nvol();
167  int NexF = m_fopr->field_nex();
168  int size_psf = NinF * NvolF * NexF * CommonParameters::NPE();
169 
170  m_psf.reset(NinF, NvolF, NexF);
171 
172  vout.general(m_vl, " Action_F_Rational: %s\n", m_label.c_str());
173 
174  Field xi(NinF, NvolF, NexF);
175  rand->gauss_lex_global(xi);
176 
178  m_psf = m_fopr_langev->mult(xi);
179 
180  double xi2 = xi.norm();
181  double H_psf = xi2 * xi2;
182 
183  vout.general(m_vl, " H_Frational = %18.8f\n", H_psf);
184  vout.general(m_vl, " H_F/dof = %18.8f\n", H_psf / size_psf);
185 
186  return H_psf;
187 }
188 
189 
190 //====================================================================
192 {
193  int NinF = m_fopr->field_nin();
194  int NvolF = m_fopr->field_nvol();
195  int NexF = m_fopr->field_nex();
196  int size_psf = NinF * NvolF * NexF * CommonParameters::NPE();
197 
198  Field v1(NinF, NvolF, NexF);
199 
200  vout.general(m_vl, " Action_F_Rational: %s\n", m_label.c_str());
201 
203  v1 = m_fopr_H->mult(m_psf);
204 
205  double H_psf = v1 * m_psf;
206 
207  vout.general(m_vl, " H_Frational = %18.8f\n", H_psf);
208  vout.general(m_vl, " H_F/dof = %18.8f\n", H_psf / size_psf);
209 
210  return H_psf;
211 }
212 
213 
214 //====================================================================
216 {
217  if (m_status_linkv == 0) {
218  int Nvol = m_U->nvol();
219  int Nex = m_U->nex();
220 
221  Field_G force(Nvol, Nex), force1(Nvol, Nex);
222 
223  vout.general(m_vl, " Action_F_Rational: %s\n", m_label.c_str());
224 
227 
228  m_force = (Field)force;
229  ++m_status_linkv;
230 
231  double Fave, Fmax, Fdev;
232  m_force.stat(Fave, Fmax, Fdev);
233  vout.general(m_vl, " Frational_ave = %12.6f Frational_max = %12.6f Frational_dev = %12.6f\n",
234  Fave, Fmax, Fdev);
235 
236  return m_force;
237  } else {
238  vout.general(m_vl, " Frational returns previous force.\n");
239  return m_force;
240  }
241 }
242 
243 
244 //====================================================================
245 //============================================================END=====