Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_HMC_Clover_SF_Leapfrog_Nf2.cpp
Go to the documentation of this file.
1 
14 #include "parameterManager_YAML.h"
15 #include "parameters_factory.h"
16 
17 #include "bridgeIO.h"
18 using Bridge::vout;
19 
20 #include "gaugeConfig.h"
21 
22 #include "staples_SF.h"
23 #include "action_G_Plaq_SF.h"
24 #include "action_G_Rectangle_SF.h"
25 
26 #include "fopr_Clover_SF.h"
27 #include "force_F_Clover_SF.h"
28 
29 #include "randomNumbers_Mseries.h"
30 #include "randomNumbers_MT19937.h"
31 
32 #include "director_Smear.h"
33 #include "fopr_Smeared.h"
34 #include "force_F_Smeared.h"
35 
36 #include "action_F_Standard_SF.h"
37 
38 #include "forceSmear.h"
39 #include "projection.h"
40 #include "smear.h"
41 #include "solver.h"
42 
43 #include "hmc_General.h"
44 #include "builder_Integrator.h"
45 #include "integrator.h"
46 
47 #ifdef USE_TEST
48 #include "test.h"
49 #endif
50 
51 #ifdef USE_TESTMANAGER_AUTOREGISTER
52 #include "testManager.h"
53 #endif
54 
55 //====================================================================
57 
83 namespace Test_HMC_Clover_SF {
84  //- test-private parameters
85  namespace {
86  const std::string filename_input = "test_HMC_Clover_SF_Leapfrog_Nf2.yaml";
87  const std::string filename_output = "stdout";
88 
89  class Parameters_Test_HMC_Clover_SF : public Parameters {
90  public:
91  Parameters_Test_HMC_Clover_SF()
92  {
93  Register_string("gauge_config_status", "NULL");
94 
95  Register_string("gauge_config_type_input", "NULL");
96  Register_string("config_filename_input", "NULL");
97 
98  Register_string("gauge_config_type_output", "NULL");
99  Register_string("config_filename_output", "NULL");
100 
101  Register_int("trajectory_number", 0);
102  Register_int("trajectory_number_step", 0);
103  Register_int("save_config_interval", 0);
104 
105  Register_string("verbose_level", "NULL");
106 
107  Register_double("expected_result", 0.0);
108  }
109  };
110  }
111 
112  //- prototype declaration
113  int leapfrog_Nf2(void);
114 
115 #ifdef USE_TESTMANAGER_AUTOREGISTER
116  namespace {
117  static const bool is_registered = TestManager::RegisterTest(
118  "HMC.Clover_SF.Leapfrog_Nf2",
119  leapfrog_Nf2
120  );
121  }
122 #endif
123 
124  //====================================================================
125  int leapfrog_Nf2(void)
126  {
127  // ##### parameter setup #####
128  int Nc = CommonParameters::Nc();
129  int Nvol = CommonParameters::Nvol();
130  int Ndim = CommonParameters::Ndim();
131  int NinG = 2 * Nc * Nc;
132 
133  Parameters *params_test = new Parameters_Test_HMC_Clover_SF;
134  Parameters *params_action_G = ParametersFactory::New("Action.G_Rectangle_SF");
135  Parameters *params_clover = ParametersFactory::New("Fopr.Clover_SF");
136  Parameters *params_proj = ParametersFactory::New("Projection");
137  Parameters *params_smear = ParametersFactory::New("Smear");
138  Parameters *params_dr_smear = ParametersFactory::New("Director_Smear");
139  Parameters *params_integrator = ParametersFactory::New("Builder_Integrator");
140  Parameters *params_hmc = ParametersFactory::New("HMC.General");
141 
142  Parameters *params_all = new Parameters;
143 
144  params_all->Register_Parameters("Test_HMC_Clover_SF", params_test);
145  params_all->Register_Parameters("Action_G_Rectangle_SF", params_action_G);
146  params_all->Register_Parameters("Fopr_Clover_Nf2_SF", params_clover);
147  params_all->Register_Parameters("Projection", params_proj);
148  params_all->Register_Parameters("Smear", params_smear);
149  params_all->Register_Parameters("Director_Smear", params_dr_smear);
150  params_all->Register_Parameters("Builder_Integrator", params_integrator);
151  params_all->Register_Parameters("HMC_General", params_hmc);
152 
153  ParameterManager_YAML params_manager;
154  params_manager.read_params(filename_input, params_all);
155 
156  const string str_gconf_status = params_test->get_string("gauge_config_status");
157  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
158  const string readfile = params_test->get_string("config_filename_input");
159  const string str_gconf_write = params_test->get_string("gauge_config_type_output");
160  const string writefile = params_test->get_string("config_filename_output");
161  int iconf = params_test->get_int("trajectory_number");
162  int Ntraj = params_test->get_int("trajectory_number_step");
163  const int i_save_conf = params_test->get_int("save_config_interval");
164  const string str_vlevel = params_test->get_string("verbose_level");
165 #ifdef USE_TEST
166  const double expected_result = params_test->get_double("expected_result");
167 #endif
168 
169  const string str_gmset_type = params_clover->get_string("gamma_matrix_type");
170  const string str_proj_type = params_proj->get_string("projection_type");
171  const string str_smear_type = params_smear->get_string("smear_type");
172 
174 
175  //- print input parameters
176  vout.general(vl, " gconf_status = %s\n", str_gconf_status.c_str());
177  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
178  vout.general(vl, " readfile = %s\n", readfile.c_str());
179  vout.general(vl, " gconf_write = %s\n", str_gconf_write.c_str());
180  vout.general(vl, " writefile = %s\n", writefile.c_str());
181  vout.general(vl, " iconf = %d\n", iconf);
182  vout.general(vl, " Ntraj = %d\n", Ntraj);
183  vout.general(vl, " i_save_conf = %d\n", i_save_conf);
184  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
185 
186  vout.general(vl, " gmset_type = %s\n", str_gmset_type.c_str());
187  vout.general(vl, " proj_type = %s\n", str_proj_type.c_str());
188  vout.general(vl, " smear_type = %s\n", str_smear_type.c_str());
189  vout.general(vl, "\n");
190 
191  //- input parameter check
192  int err = 0;
193  err += ParameterCheck::non_NULL(str_gconf_read);
194  err += ParameterCheck::non_NULL(readfile);
195  err += ParameterCheck::non_NULL(str_gconf_write);
196  err += ParameterCheck::non_NULL(writefile);
197  err += ParameterCheck::non_zero(iconf);
198  err += ParameterCheck::non_zero(Ntraj);
199  err += ParameterCheck::non_zero(i_save_conf);
200 
201  if (err) {
202  vout.crucial(vl, "Test_HMC_Clover_SF: Input parameters have not been set.\n");
203  abort();
204  }
205 
206 
207  // ##### object setup #####
208  Field_G *U = new Field_G(Nvol, Ndim);
209  GaugeConfig *gconf_read = new GaugeConfig(str_gconf_read);
210 
211  if (str_gconf_status == "Continue") {
212  gconf_read->read_file((Field *)U, readfile);
213  } else if (str_gconf_status == "Start_cold") {
214  gconf_read->set_cold((Field *)U);
215  } else {
216  vout.crucial(vl, "Test_HMC_Clover_SF: unsupported gconf status \"%s\".\n", str_gconf_status.c_str());
217  abort();
218  }
219 
220 
222  action_G->set_parameters(*params_action_G);
223 
224  Fopr_Clover_SF *fopr_w = new Fopr_Clover_SF();
225  fopr_w->set_parameters(*params_clover);
226  Force_F_Clover_SF *force_fopr_w = new Force_F_Clover_SF();
227  force_fopr_w->set_parameters(*params_clover);
228 
229 
230  Projection *proj = Projection::New(str_proj_type);
231  Smear *smear = Smear::New(str_smear_type, proj);
232  smear->set_parameters(*params_smear);
233 
234  ForceSmear *force_smear = ForceSmear::New(str_smear_type, proj);
235  force_smear->set_parameters(*params_smear);
236 
237  Director_Smear *dr_smear = new Director_Smear((Smear *)smear);
238  dr_smear->set_parameters(*params_dr_smear);
239 
240  Fopr_Smeared *fopr_smear = new Fopr_Smeared((Fopr *)fopr_w, dr_smear);
241  Force_F_Smeared *force_fopr_smear
242  = new Force_F_Smeared((Force *)force_fopr_w, (ForceSmear *)force_smear, dr_smear);
243 
244 
245  Action_F_Standard_SF *action_F_Nf2
246  = new Action_F_Standard_SF((Fopr *)fopr_smear, (Force *)force_fopr_smear);
247  action_F_Nf2->set_label("Nf=2 smeared clover fermion");
248 
249 
250  valarray<Action *> actions(2);
251  actions[0] = (Action *)action_F_Nf2;
252  actions[1] = (Action *)action_G;
253 
254  valarray<Director *> directors(1);
255  directors[0] = (Director *)dr_smear;
256 
257  Builder_Integrator *builder = new Builder_Integrator(actions, directors);
258  builder->set_parameters(*params_integrator);
259  Integrator *integrator = builder->build();
260 
261 
262  //- M series random number intialization
263  // int ndelay = 200000;
264  // RandomNumbers_Mseries rand(ndelay);
265 
266  //- Mersenne Twister for random number generator.
267  RandomNumbers_MT19937 *rand;
268  if (iconf == 0) {
269  std::vector<unsigned long> seed(4);
270  seed[0] = 0x6a92;
271  seed[1] = 0x3708;
272  seed[2] = 0xab41;
273  seed[3] = 0x5c52;
274  rand = new RandomNumbers_MT19937(seed);
275  } else {
276  rand = new RandomNumbers_MT19937(iconf);
277  }
278 
279  HMC_General hmc(actions, directors, integrator, (RandomNumbers *)rand);
280  hmc.set_parameters(*params_hmc);
281 
282 
283  // #### Execution main part ####
284  vout.general(vl, "HMC start: Ntraj = %d\n", Ntraj);
285 
286  double result = 0.0;
287  for (int traj = 0; traj < Ntraj; ++traj) {
288  vout.general(vl, "\n");
289  vout.general(vl, "traj = %d\n", traj);
290 
291  result = hmc.update(*U);
292  }
293 
294  if (Communicator::nodeid() == 0) {
295  rand->writefile("rand_MT");
296  }
297 
298 
299  // ##### tidy up #####
300  delete params_test;
301  delete params_action_G;
302  delete params_clover;
303  delete params_smear;
304  delete params_dr_smear;
305  delete params_integrator;
306  delete params_hmc;
307  delete params_all;
308 
309  delete U;
310  delete gconf_read;
311 
312  delete rand;
313 
314  delete action_G;
315 
316  delete fopr_w;
317  delete force_fopr_w;
318  delete action_F_Nf2;
319 
320  delete proj;
321  delete smear;
322  delete force_smear;
323  delete dr_smear;
324  delete fopr_smear;
325  delete force_fopr_smear;
326 
327  delete builder;
328 
329 
330 #ifdef USE_TEST
331  return Test::verify(expected_result, result);
332 
333 #else
334  return EXIT_SUCCESS;
335 #endif
336  }
337 } // namespace Test_HMC_Clover_SF