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