Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_SF_fAfP_Boundary_Meson_2ptFunction.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 "fopr_Clover_SF.h"
23 #include "source_Wall_SF.h"
24 
25 #include "director_Smear.h"
26 #include "fopr_Smeared.h"
27 
28 #include "gammaMatrixSet.h"
29 #include "projection.h"
30 #include "smear.h"
31 #include "solver.h"
32 
33 #include "fprop_Standard_lex.h"
34 
35 #include "corr2pt_Wilson_SF.h"
36 
37 #ifdef USE_TEST
38 #include "test.h"
39 #endif
40 
41 #ifdef USE_TESTMANAGER_AUTOREGISTER
42 #include "testManager.h"
43 #endif
44 
45 //====================================================================
46 
62 namespace Test_SF_fAfP {
63  //- test-private parameters
64  namespace {
65  const std::string filename_input = "test_SF_fAfP_Boundary_Meson_2ptFunction.yaml";
66  const std::string filename_output = "stdout";
67 
68  class Parameters_Test_SF_fAfP : public Parameters {
69  public:
70  Parameters_Test_SF_fAfP()
71  {
72  Register_string("gauge_config_type_input", "NULL");
73  Register_string("config_filename_input", "NULL");
74 
75  Register_string("gauge_config_type_output", "NULL");
76  Register_string("config_filename_output", "NULL");
77 
78  Register_string("verbose_level", "NULL");
79 
80  Register_double("expected_result", 0.0);
81  }
82  };
83  }
84 
85  //- prototype declaration
87 
88 #ifdef USE_TESTMANAGER_AUTOREGISTER
89  namespace {
90  static const bool is_registered = TestManager::RegisterTest(
91  "SF_fAfP.Boundary_Meson_2ptFunction",
92  boundary_meson_2ptFunction
93  );
94  }
95 #endif
96 
97  //====================================================================
99  {
100  // ##### parameter setup #####
101  int Nc = CommonParameters::Nc();
102  int Nd = CommonParameters::Nd();
103  int Ndim = CommonParameters::Ndim();
104  int Nvol = CommonParameters::Nvol();
105 
106  Parameters *params_test = new Parameters_Test_SF_fAfP;
107  Parameters *params_clover = ParametersFactory::New("Fopr.Clover_SF");
108  Parameters *params_proj = ParametersFactory::New("Projection");
109  Parameters *params_smear = ParametersFactory::New("Smear");
110  Parameters *params_dr_smear = ParametersFactory::New("Director_Smear");
111  Parameters *params_solver = ParametersFactory::New("Solver");
112  Parameters *params_source = ParametersFactory::New("Source_Wall_SF");
113 
114  Parameters *params_all = new Parameters;
115 
116  params_all->Register_Parameters("Test_SF_fAfP", params_test);
117  params_all->Register_Parameters("Fopr_Clover_SF", params_clover);
118  params_all->Register_Parameters("Projection", params_proj);
119  params_all->Register_Parameters("Smear_SF", params_smear);
120  params_all->Register_Parameters("Director_Smear", params_dr_smear);
121  params_all->Register_Parameters("Solver", params_solver);
122  params_all->Register_Parameters("Source_Wall_SF", params_source);
123 
124  ParameterManager_YAML params_manager;
125  params_manager.read_params(filename_input, params_all);
126 
127  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
128  const string readfile = params_test->get_string("config_filename_input");
129  const string str_gconf_write = params_test->get_string("gauge_config_type_output");
130  const string writefile = params_test->get_string("config_filename_output");
131  const string str_vlevel = params_test->get_string("verbose_level");
132 #ifdef USE_TEST
133  const double expected_result = params_test->get_double("expected_result");
134 #endif
135 
136  const string str_gmset_type = params_clover->get_string("gamma_matrix_type");
137  const string str_proj_type = params_proj->get_string("projection_type");
138  const string str_smear_type = params_smear->get_string("smear_type");
139  const string str_solver_type = params_solver->get_string("solver_type");
140 
142 
143  //- print input parameters
144  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
145  vout.general(vl, " readfile = %s\n", readfile.c_str());
146  vout.general(vl, " gconf_write = %s\n", str_gconf_write.c_str());
147  vout.general(vl, " writefile = %s\n", writefile.c_str());
148  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
149  vout.general(vl, " gmset_type = %s\n", str_gmset_type.c_str());
150  vout.general(vl, " proj_type = %s\n", str_proj_type.c_str());
151  vout.general(vl, " smear_type = %s\n", str_smear_type.c_str());
152  vout.general(vl, " solver_type = %s\n", str_solver_type.c_str());
153  vout.general(vl, "\n");
154 
155  //- input parameter check
156  int err = 0;
157  err += ParameterCheck::non_NULL(str_gconf_read);
158  err += ParameterCheck::non_NULL(readfile);
159  err += ParameterCheck::non_NULL(str_gconf_write);
160  err += ParameterCheck::non_NULL(writefile);
161 
162  if (err) {
163  vout.crucial(vl, "Test_SF_fAfP: Input parameters have not been set.\n");
164  abort();
165  }
166 
167 
168  // #### Set up a gauge configuration ####
169  Field_G *U = new Field_G(Nvol, Ndim);
170  GaugeConfig *gconf_read = new GaugeConfig(str_gconf_read);
171  gconf_read->read_file((Field *)U, readfile);
172  // gconf_read->set_cold((Field*)U);
173 
174  Projection *proj = Projection::New(str_proj_type);
175 
176  Smear *smear = Smear::New(str_smear_type, proj);
177  smear->set_parameters(*params_smear);
178 
179  Director_Smear *dr_smear = new Director_Smear((Smear *)smear);
180  dr_smear->set_parameters(*params_dr_smear);
181  dr_smear->set_config(U);
182 
183  int Nsmear = dr_smear->get_Nsmear();
184  Field_G *Usmear = (Field_G *)dr_smear->getptr_smearedConfig(Nsmear);
185 
186 
187  // #### object setup #####
188  GammaMatrixSet *gmset = GammaMatrixSet::New(str_gmset_type);
189 
190  //- NB. Chiral has not been implemented for SF, yet.
191  // Fopr_Clover_SF* fopr_c = new Fopr_Clover_SF(str_gmset_type);
192  Fopr_Clover_SF *fopr_c = new Fopr_Clover_SF();
193  fopr_c->set_parameters(*params_clover);
194 
195  Fopr_Smeared *fopr_smear = new Fopr_Smeared((Fopr *)fopr_c, dr_smear);
196  Fopr *fopr = fopr_smear;
197  //- NB. U will be converted to Usmear in fopr->set_config
198  fopr->set_config(U);
199 
200  Solver *solver = Solver::New(str_solver_type, fopr);
201  solver->set_parameters(*params_solver);
202 
203  Fprop *fprop_lex = new Fprop_Standard_lex(solver);
204 
205  Source_Wall_SF *source = new Source_Wall_SF();
206  source->set_parameters(*params_source);
207  source->set_config(Usmear);
208 
209 
210  // #### Execution main part ####
211  valarray<Field_F> H(Nc * Nd);
212  valarray<Field_F> Hpr(Nc * Nd);
213  Field_F xq, b, b2;
214 
215  int Nconv;
216  double diff, diff2;
217 
218  vout.general(vl, "\n");
219  vout.general(vl, "Solving quark propagator:\n");
220  vout.general(vl, " color spin Nconv diff diff2\n");
221 
222  for (int icolor = 0; icolor < Nc; ++icolor) {
223  for (int ispin = 0; ispin < Nd / 2; ++ispin) {
224  source->set_t0(b, icolor, ispin);
225 
226  int idx = icolor + Nc * ispin;
227  fprop_lex->invert_D(xq, b, Nconv, diff);
228 
229  Field_F y(b);
230  fopr->set_mode("D");
231  y -= (Field_F)fopr->mult(xq);
232  diff2 = y.norm2();
233  vout.general(vl, " %2d %2d %6d %12.4e %12.4e\n",
234  icolor, ispin, Nconv, diff, diff2);
235 
236  H[idx] = xq;
237  xq = 0.0;
238  Hpr[idx] = xq;
239  }
240 
241  for (int ispin = Nd / 2; ispin < Nd; ++ispin) {
242  source->set_tT(b, icolor, ispin);
243 
244  int idx = icolor + Nc * ispin;
245  fprop_lex->invert_D(xq, b, Nconv, diff);
246 
247  Field_F y(b);
248  fopr->set_mode("D");
249  y -= (Field_F)fopr->mult(xq);
250  diff2 = y.norm2();
251  vout.general(vl, " %2d %2d %6d %12.4e %12.4e\n",
252  icolor, ispin, Nconv, diff, diff2);
253 
254  Hpr[idx] = xq;
255  xq = 0.0;
256  H[idx] = xq;
257  }
258  }
259 
260 #if 0
261  //For debug
262  Index_lex index;
263  for (int t = 0; t < 2; ++t) {
264  int site = index.site(0, 0, 0, t);
265  for (int c1 = 0; c1 < Nc; ++c1) {
266  for (int c0 = 0; c0 < Nc; ++c0) {
267  for (int s1 = 0; s1 < Nd; ++s1) {
268  for (int s0 = 0; s0 < Nd; ++s0) {
269  vout.general(vl, "H[%d,%d,%d,%d,%d]=%lf %lf\n",
270  t, c1, c0, s1, s0,
271  H[c0 + Nc * s0].cmp_r(c1, s1, site),
272  H[c0 + Nc * s0].cmp_i(c1, s1, site));
273  }
274  }
275  }
276  }
277  }
278  for (int t = 0; t < 2; ++t) {
279  int site = index.site(0, 0, 0, t);
280  for (int c1 = 0; c1 < Nc; ++c1) {
281  for (int c0 = 0; c0 < Nc; ++c0) {
282  for (int s1 = 0; s1 < Nd; ++s1) {
283  for (int s0 = 0; s0 < Nd; ++s0) {
284  vout.general(vl, "Hpr[%d,%d,%d,%d,%d]=%lf %lf\n",
285  t, c1, c0, s1, s0,
286  Hpr[c0 + Nc * s0].cmp_r(c1, s1, site),
287  Hpr[c0 + Nc * s0].cmp_i(c1, s1, site));
288  }
289  }
290  }
291  }
292  }
293 #endif
294 
295  //- meson correlators
296  vout.general(vl, "\n");
297  vout.general(vl, "boundary 2-point correlator with SF BC:\n");
298 
299  Corr2pt_Wilson_SF corr(gmset);
300  double result = corr.fAfP(H, Hpr);
301 
302 
303  // ##### tidy up #####
304  delete U;
305  delete gconf_read;
306 
307  delete dr_smear;
308  delete fprop_lex;
309 
310  delete fopr_c;
311  delete fopr_smear;
312 
313  delete gmset;
314  delete proj;
315  delete smear;
316  delete solver;
317  delete source;
318 
319  delete params_test;
320  delete params_clover;
321  delete params_proj;
322  delete params_smear;
323  delete params_dr_smear;
324  delete params_solver;
325  delete params_source;
326  delete params_all;
327 
328 
329 #ifdef USE_TEST
330  return Test::verify(expected_result, result);
331 
332 #else
333  return EXIT_SUCCESS;
334 #endif
335  }
336 } // namespace Test_SF_fAfP