Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_Spectrum_Clover_2ptFunction_eo.cpp
Go to the documentation of this file.
1 
13 #include <sstream>
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 #include "staples.h"
22 
23 #include "randomNumbers_Mseries.h"
24 
25 #include "fopr_Clover.h"
26 #include "fopr_Clover_eo.h"
27 #include "fprop_Standard_eo.h"
28 
29 #include "director_Smear.h"
30 #include "fopr_Smeared.h"
31 
32 #include "gammaMatrixSet.h"
33 #include "gaugeFixing.h"
34 #include "projection.h"
35 #include "smear.h"
36 #include "solver.h"
37 #include "source.h"
38 
39 #include "corr2pt_4spinor.h"
40 
41 #ifdef USE_TEST
42 #include "test.h"
43 #endif
44 
45 #ifdef USE_TESTMANAGER_AUTOREGISTER
46 #include "testManager.h"
47 #endif
48 
49 //====================================================================
51 
65 namespace Test_Spectrum_Clover {
66  //- test-private parameters
67  namespace {
68  const std::string filename_input = "test_Spectrum_Clover_Hadron2ptFunction.yaml";
69  const std::string filename_output = "stdout";
70 
71  class Parameters_Test_Spectrum_Clover : public Parameters {
72  public:
73  Parameters_Test_Spectrum_Clover()
74  {
75  Register_string("gauge_config_type_input", "NULL");
76  Register_string("config_filename_input", "NULL");
77 
78  Register_int("number_of_valence_quarks", 0);
79 
80  Register_string("verbose_level", "NULL");
81 
82  Register_double("expected_result", 0.0);
83  }
84  };
85 
86  class Parameters_Quark : virtual public Parameters {
87  public:
88  Parameters_Quark()
89  {
90  Register_Parameters("Fopr_Clover", ParametersFactory::New("Fopr.Clover"));
91  Register_Parameters("Source", ParametersFactory::New("Source"));
92  }
93  };
94  }
95 
96  //- prototype declaration
97  int hadron_2ptFunction_eo(void);
98 
99 #ifdef USE_TESTMANAGER_AUTOREGISTER
100  namespace {
101  static const bool is_registered = TestManager::RegisterTest(
102  "Spectrum.Clover.Hadron2ptFunction_eo",
104  );
105  }
106 #endif
107 
108  //====================================================================
110  {
111  // #### parameter setup ####
112  int Nc = CommonParameters::Nc();
113  int Nd = CommonParameters::Nd();
114  int Ndim = CommonParameters::Ndim();
115  int Nvol = CommonParameters::Nvol();
116 
117  ParameterManager_YAML params_manager;
118 
119  Parameters *params_test = new Parameters_Test_Spectrum_Clover;
120 
121  Parameters *params_pre = new Parameters;
122 
123  params_pre->Register_Parameters("Test_Spectrum_Clover", params_test);
124 
125  params_manager.read_params(filename_input, params_pre);
126 
127 
128  const int N_quark = params_test->get_int("number_of_valence_quarks");
129  std::vector<Parameters *> params_quark(N_quark);
130 
131  for (int iq = 0; iq < N_quark; ++iq) {
132  params_quark[iq] = new Parameters_Quark;
133  }
134 
135  Parameters *params_gfix = ParametersFactory::New("GaugeFixing");
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_solver = ParametersFactory::New("Solver");
140 
141  Parameters *params_all = new Parameters;
142 
143 
144  std::stringstream oss;
145 
146  for (int iq = 0; iq < N_quark; ++iq) {
147  oss.str("");
148  oss << "Quark_" << iq + 1;
149  string str = oss.str();
150  params_all->Register_Parameters(str.c_str(), params_quark[iq]);
151  }
152 
153  params_all->Register_Parameters("GaugeFixing", params_gfix);
154  params_all->Register_Parameters("Projection", params_proj);
155  params_all->Register_Parameters("Smear", params_smear);
156  params_all->Register_Parameters("Director_Smear", params_dr_smear);
157  params_all->Register_Parameters("Solver", params_solver);
158 
159  params_manager.read_params(filename_input, params_all);
160 
161  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
162  const string readfile = params_test->get_string("config_filename_input");
163  const string str_vlevel = params_test->get_string("verbose_level");
164 #ifdef USE_TEST
165  const double expected_result = params_test->get_double("expected_result");
166 #endif
167 
168  const string str_gfix_type = params_gfix->get_string("gauge_fixing_type");
169 
170  std::vector<Parameters *> params_clover(N_quark);
171  std::vector<Parameters *> params_source(N_quark);
172 
173  for (int iq = 0; iq < N_quark; ++iq) {
174  params_clover[iq] = params_quark[iq]->get_Parameters("Fopr_Clover");
175  params_source[iq] = params_quark[iq]->get_Parameters("Source");
176  }
177 
178  const string str_proj_type = params_proj->get_string("projection_type");
179  const string str_smear_type = params_smear->get_string("smear_type");
180  const string str_solver_type = params_solver->get_string("solver_type");
181 
183 
184  //- print input parameters
185  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
186  vout.general(vl, " readfile = %s\n", readfile.c_str());
187  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
188  vout.general(vl, " gfix_type = %s\n", str_gfix_type.c_str());
189  vout.general(vl, " proj_type = %s\n", str_proj_type.c_str());
190  vout.general(vl, " smear_type = %s\n", str_smear_type.c_str());
191  vout.general(vl, " solver_type = %s\n", str_solver_type.c_str());
192 
193  // NB. all str_gmset_type are supposed to be the same.
194  string str_gmset_type = params_clover[0]->get_string("gamma_matrix_type");
195  vout.general(vl, " gmset_type = %s\n", str_gmset_type.c_str());
196 
197  std::vector<std::string> str_source_type(N_quark);
198 
199  for (int iq = 0; iq < N_quark; ++iq) {
200  vout.general(vl, " Quark_%d:\n", iq + 1);
201 
202  str_source_type[iq] = params_source[iq]->get_string("source_type");
203  vout.general(vl, " source_type = %s\n", str_source_type[iq].c_str());
204  }
205  vout.general(vl, "\n");
206 
207  //- input parameter check
208  int err = 0;
209  err += ParameterCheck::non_NULL(str_gconf_read);
210  err += ParameterCheck::non_NULL(readfile);
211 
212  if (err) {
213  vout.crucial(vl, "Test_Spectrum_Clover: Input parameters have not been set.\n");
214  abort();
215  }
216 
217 
218  // #### Set up a gauge configuration ####
219  Field_G *U = new Field_G(Nvol, Ndim);
220  GaugeConfig *gconf_read = new GaugeConfig(str_gconf_read);
221  gconf_read->read_file((Field *)U, readfile);
222  // gconf_read->set_cold((Field*)U);
223 
224  Projection *proj = Projection::New(str_proj_type);
225  Smear *smear = Smear::New(str_smear_type, proj);
226  smear->set_parameters(*params_smear);
227 
228  Director_Smear *dr_smear = new Director_Smear((Smear *)smear);
229  dr_smear->set_parameters(*params_dr_smear);
230  dr_smear->set_config(U);
231 
232  int Nsmear = dr_smear->get_Nsmear();
233  Field_G *Usmear = (Field_G *)dr_smear->getptr_smearedConfig(Nsmear);
234 
235 
236  // #### Gauge fixing ####
237  Staples *staple = new Staples;
238  Field_G *Ufix = new Field_G(Nvol, Ndim);
239 
240  int ndelay = 1000;
241  RandomNumbers *rand = new RandomNumbers_Mseries(ndelay);
242 
243  GaugeFixing *gfix = GaugeFixing::New(str_gfix_type, rand);
244  gfix->set_parameters(*params_gfix);
245 
246  double plaq = staple->plaquette(*Usmear);
247  vout.general(vl, "plaq(original) = %18.14f\n", plaq);
248 
249  gfix->fix(*Ufix, *Usmear);
250 
251  double plaq2 = staple->plaquette(*Ufix);
252  vout.general(vl, "plaq(fixed) = %18.14f\n", plaq2);
253  vout.general(vl, "plaq(diff) = %18.10e\n", plaq - plaq2);
254 
255 
256  // #### object setup #####
257  GammaMatrixSet *gmset = GammaMatrixSet::New(str_gmset_type);
258 
259  std::vector<Fopr_Clover_eo *> fopr_c_eo(N_quark);
260  std::vector<Solver *> solver(N_quark);
261  std::vector<Fprop *> fprop_eo(N_quark);
262  std::vector<Source *> source(N_quark);
263 
264  // NB. Fopr_Clover is used only for check of diff2 below.
265  std::vector<Fopr_Clover *> fopr_c(N_quark);
266 
267  for (int iq = 0; iq < N_quark; ++iq) {
268  fopr_c_eo[iq] = new Fopr_Clover_eo(str_gmset_type);
269  fopr_c_eo[iq]->set_parameters(*params_clover[iq]);
270  fopr_c_eo[iq]->set_config(Ufix);
271 
272  solver[iq] = Solver::New(str_solver_type, fopr_c_eo[iq]);
273  solver[iq]->set_parameters(*params_solver);
274 
275  fprop_eo[iq] = new Fprop_Standard_eo(solver[iq]);
276 
277  source[iq] = Source::New(str_source_type[iq]);
278  source[iq]->set_parameters(*params_source[iq]);
279 
280  fopr_c[iq] = new Fopr_Clover(str_gmset_type);
281  fopr_c[iq]->set_parameters(*params_clover[iq]);
282  fopr_c[iq]->set_config(Ufix);
283  }
284  vout.general(vl, "\n");
285 
286 
287  // #### Execution main part ####
288  typedef std::valarray<Field_F> PropagatorSet;
289 
290  std::vector<PropagatorSet> sq(N_quark);
291  for (int iq = 0; iq < N_quark; ++iq) {
292  sq[iq].resize(Nc * Nd);
293 
294  for (int i = 0; i < Nc * Nd; ++i) {
295  sq[iq][i] = 0.0;
296  }
297  }
298 
299  Field_F b;
300  b = 0.0;
301 
302  int Nconv;
303  double diff, diff2;
304 
305  for (int iq = 0; iq < N_quark; ++iq) {
306  vout.general(vl, "Solving quark propagator, flavor = %d:\n", iq + 1);
307  vout.general(vl, " color spin Nconv diff diff2\n");
308 
309  for (int ispin = 0; ispin < Nd; ++ispin) {
310  for (int icolor = 0; icolor < Nc; ++icolor) {
311  int idx = icolor + Nc * ispin;
312  source[iq]->set(b, idx);
313 
314  fprop_eo[iq]->invert_D(sq[iq][idx], b, Nconv, diff);
315 
316  Field_F y(b);
317  fopr_c[iq]->set_mode("D");
318  y -= (Field_F)fopr_c[iq]->mult(sq[iq][idx]);
319  diff2 = y.norm2();
320 
321  vout.general(vl, " %2d %2d %6d %12.4e %12.4e\n",
322  icolor, ispin, Nconv, diff, diff2);
323  }
324  }
325 
326  vout.general(vl, "\n");
327  }
328 
329 
330  //- meson correlators
331  std::ofstream log_file;
332  if (filename_output != "stdout") {
333  log_file.open(filename_output.c_str());
334  vout.init(log_file);
335  }
336 
337  vout.general(vl, "2-point correlator:\n");
338  Corr2pt_4spinor corr(gmset);
339  valarray<double> result(N_quark);
340 
341  //- case(iq_1 == iq_2)
342  for (int iq = 0; iq < N_quark; ++iq) {
343  vout.general(vl, "Flavor combination = %d, %d\n", iq + 1, iq + 1);
344  result[iq] = corr.meson_all(sq[iq], sq[iq]);
345  vout.general(vl, "\n");
346  }
347 
348 
349  //- case(iq_1 < iq_2)
350  for (int iq = 0; iq < N_quark; ++iq) {
351  for (int jq = iq + 1; jq < N_quark; ++jq) {
352  vout.general(vl, "Flavor combination = %d, %d\n", iq + 1, jq + 1);
353  double result_2 = corr.meson_all(sq[iq], sq[jq]);
354  vout.general(vl, "\n");
355  }
356  }
357 
358  if (filename_output != "stdout") {
359  log_file.close();
360  vout.init(std::cout);
361  }
362 
363 
364  // #### tydy up ####
365  delete gconf_read;
366  delete U;
367  delete Ufix;
368 
369  delete dr_smear;
370 
371  delete rand;
372  delete staple;
373 
374  for (int iq = 0; iq < N_quark; ++iq) {
375  delete fopr_c_eo[iq];
376  delete solver[iq];
377  delete fprop_eo[iq];
378  delete source[iq];
379  delete fopr_c[iq];
380  }
381 
382  delete gfix;
383  delete gmset;
384  delete proj;
385  delete smear;
386 
387  delete params_pre;
388  delete params_test;
389  delete params_gfix;
390  delete params_proj;
391  delete params_smear;
392  delete params_dr_smear;
393  delete params_solver;
394 
395  for (int iq = 0; iq < N_quark; ++iq) {
396  delete params_clover[iq];
397  delete params_source[iq];
398  delete params_quark[iq];
399  }
400 
401  delete params_all;
402 
403 
404 #ifdef USE_TEST
405  return Test::verify(expected_result, result[0]);
406 
407 #else
408  return EXIT_SUCCESS;
409 #endif
410  }
411 } // namespace Test_Spectrum_Clover