Bridge++  Ver. 1.3.x
test_SF_fAfP_Boundary_Meson_2ptFunction.cpp
Go to the documentation of this file.
1 
14 #include "test.h"
15 
16 #include "gaugeConfig.h"
17 
18 #include "fopr_Clover_SF.h"
19 #include "source_Wall_SF.h"
20 
21 #include "director_Smear.h"
22 #include "fopr_Smeared.h"
23 
24 #include "gammaMatrixSet.h"
25 #include "projection.h"
26 #include "smear.h"
27 #include "solver.h"
28 
29 #include "fprop_Standard_lex.h"
30 
31 #include "corr2pt_Wilson_SF.h"
32 
33 #include "randomNumbers_Mseries.h"
34 
35 //====================================================================
36 
54 namespace Test_SF_fAfP {
55  const std::string test_name = "SF_fAfP.Boundary_Meson_2ptFunction";
56 
57  //- test-private parameters
58  namespace {
59  const std::string filename_input = "test_SF_fAfP_Boundary_Meson_2ptFunction.yaml";
60  const std::string filename_output = "stdout";
61 
62  class Parameters_Test_SF_fAfP : public Parameters {
63  public:
64  Parameters_Test_SF_fAfP()
65  {
66  Register_string("gauge_config_status", "NULL");
67  Register_string("gauge_config_type_input", "NULL");
68  Register_string("config_filename_input", "NULL");
69 
70  Register_string("verbose_level", "NULL");
71 
72  Register_double("expected_result", 0.0);
73  }
74  };
75  }
76 
77  //- prototype declaration
79 
80 #ifdef USE_TESTMANAGER_AUTOREGISTER
81  namespace {
82 #if defined(USE_OPENMP) || defined(USE_GROUP_SU2)
83  // Nc=2 is not available.
84 #else
85  static const bool is_registered = TestManager::RegisterTest(
86  test_name,
88  );
89 #endif
90  }
91 #endif
92 
93  //====================================================================
95  {
96  // ##### parameter setup #####
97  int Nc = CommonParameters::Nc();
98  int Nd = CommonParameters::Nd();
99  int Ndim = CommonParameters::Ndim();
100  int Nvol = CommonParameters::Nvol();
101 
102  unique_ptr<Parameters> params_test(new Parameters_Test_SF_fAfP);
103  unique_ptr<Parameters> params_clover(ParametersFactory::New("Fopr.Clover_SF"));
104  unique_ptr<Parameters> params_proj(ParametersFactory::New("Projection"));
105  unique_ptr<Parameters> params_smear(ParametersFactory::New("Smear"));
106  unique_ptr<Parameters> params_dr_smear(ParametersFactory::New("Director_Smear"));
107  unique_ptr<Parameters> params_solver(ParametersFactory::New("Solver"));
108  unique_ptr<Parameters> params_source(ParametersFactory::New("Source_Wall_SF"));
109  unique_ptr<Parameters> params_all(new Parameters);
110 
111  params_all->Register_Parameters("Test_SF_fAfP", params_test);
112  params_all->Register_Parameters("Fopr_Clover_SF", params_clover);
113  params_all->Register_Parameters("Projection", params_proj);
114  params_all->Register_Parameters("Smear_SF", params_smear);
115  params_all->Register_Parameters("Director_Smear", params_dr_smear);
116  params_all->Register_Parameters("Solver", params_solver);
117  params_all->Register_Parameters("Source_Wall_SF", params_source);
118 
119  ParameterManager::read(filename_input, params_all);
120 
121  const string str_gconf_status = params_test->get_string("gauge_config_status");
122  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
123  const string readfile = params_test->get_string("config_filename_input");
124  const string str_vlevel = params_test->get_string("verbose_level");
125 
126  const bool do_check = params_test->is_set("expected_result");
127  const double expected_result = do_check ? params_test->get_double("expected_result") : 0.0;
128 
129  const string str_gmset_type = params_clover->get_string("gamma_matrix_type");
130  const string str_proj_type = params_proj->get_string("projection_type");
131  const string str_smear_type = params_smear->get_string("smear_type");
132  const string str_solver_type = params_solver->get_string("solver_type");
133 
135 
136  //- print input parameters
137  vout.general(vl, " gconf_status = %s\n", str_gconf_status.c_str());
138  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
139  vout.general(vl, " readfile = %s\n", readfile.c_str());
140  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
141  vout.general(vl, " gmset_type = %s\n", str_gmset_type.c_str());
142  vout.general(vl, " proj_type = %s\n", str_proj_type.c_str());
143  vout.general(vl, " smear_type = %s\n", str_smear_type.c_str());
144  vout.general(vl, " solver_type = %s\n", str_solver_type.c_str());
145  vout.general(vl, "\n");
146 
147  //- input parameter check
148  int err = 0;
149  err += ParameterCheck::non_NULL(str_gconf_status);
150 
151  if (err) {
152  vout.crucial(vl, "%s: Input parameters have not been set.\n", test_name.c_str());
153  exit(EXIT_FAILURE);
154  }
155 
156 
157  // #### Set up a gauge configuration ####
158  unique_ptr<Field_G> U(new Field_G(Nvol, Ndim));
159  unique_ptr<GaugeConfig> gconf_read(new GaugeConfig(str_gconf_read));
160 
161  if (str_gconf_status == "Continue") {
162  gconf_read->read_file(U, readfile);
163  } else if (str_gconf_status == "Cold_start") {
164  U->set_unit();
165  } else if (str_gconf_status == "Hot_start") {
166  int i_seed_noise = 1234567;
167  unique_ptr<RandomNumbers> rand(new RandomNumbers_Mseries(i_seed_noise));
168  U->set_random(rand);
169  } else {
170  vout.crucial(vl, "%s: unsupported gconf status \"%s\".\n", test_name.c_str(), str_gconf_status.c_str());
171  exit(EXIT_FAILURE);
172  }
173 
174  unique_ptr<Projection> proj(Projection::New(str_proj_type));
175  unique_ptr<Smear> smear(Smear::New(str_smear_type, proj));
176  smear->set_parameters(*params_smear);
177 
178  unique_ptr<Director> dr_smear(new Director_Smear(smear));
179  dr_smear->set_parameters(*params_dr_smear);
180  dr_smear->set_config(U);
181 
182  unique_ptr<Director_Smear> dr_smear_config(new Director_Smear(smear));
183  dr_smear_config->set_parameters(*params_dr_smear);
184  dr_smear_config->set_config(U);
185 
186  int Nsmear = dr_smear_config->get_Nsmear();
187  Field_G *Usmear = (Field_G *)dr_smear_config->getptr_smearedConfig(Nsmear);
188 
189 
190  // #### object setup #####
191  unique_ptr<GammaMatrixSet> gmset(GammaMatrixSet::New(str_gmset_type));
192 
193  //- NB. Chiral repr has not been implemented for SF, yet.
194  // unique_ptr<Fopr> fopr_c(Fopr::New("Clover_SF", str_gmset_type));
195  unique_ptr<Fopr> fopr_c(new Fopr_Clover_SF());
196  fopr_c->set_parameters(*params_clover);
197 
198  unique_ptr<Fopr> fopr_smear(Fopr::New("Smeared", fopr_c, dr_smear));
199  //- NB. U will be converted to Usmear in fopr->set_config
200  fopr_smear->set_config(U);
201 
202  unique_ptr<Solver> solver(Solver::New(str_solver_type, fopr_smear));
203  solver->set_parameters(*params_solver);
204 
205  unique_ptr<Fprop> fprop_lex(new Fprop_Standard_lex(solver));
206 
208  source->set_parameters(*params_source);
209  source->set_config(Usmear);
210 
211  unique_ptr<Timer> timer(new Timer(test_name));
212 
213 
214  // #### Execution main part ####
215  timer->start();
216 
217  std::vector<Field_F> H(Nc * Nd);
218  std::vector<Field_F> Hpr(Nc * Nd);
219  Field_F xq, b, b2;
220 
221  int Nconv;
222  double diff, diff2;
223 
224  vout.general(vl, "\n");
225  vout.general(vl, "Solving quark propagator:\n");
226  vout.general(vl, " color spin Nconv diff diff2\n");
227 
228  for (int icolor = 0; icolor < Nc; ++icolor) {
229  for (int ispin = 0; ispin < Nd / 2; ++ispin) {
230  source->set_t0(b, icolor, ispin);
231 
232  int idx = icolor + Nc * ispin;
233  fprop_lex->invert_D(xq, b, Nconv, diff);
234 
235  Field_F y(b);
236  fopr_smear->set_mode("D");
237 
238  fopr_smear->mult(y, xq); // y = fopr_w->mult(xq);
239  axpy(y, -1.0, b); // y -= b;
240  diff2 = y.norm2();
241 
242  vout.general(vl, " %2d %2d %6d %12.4e %12.4e\n",
243  icolor, ispin, Nconv, diff, diff2);
244 
245  H[idx] = xq;
246  xq.set(0.0);
247  Hpr[idx] = xq;
248  }
249 
250  for (int ispin = Nd / 2; ispin < Nd; ++ispin) {
251  source->set_tT(b, icolor, ispin);
252 
253  int idx = icolor + Nc * ispin;
254  fprop_lex->invert_D(xq, b, Nconv, diff);
255 
256  Field_F y(b);
257  fopr_smear->set_mode("D");
258 
259  fopr_smear->mult(y, xq); // y = fopr_w->mult(xq);
260  axpy(y, -1.0, b); // y -= b;
261  diff2 = y.norm2();
262 
263  vout.general(vl, " %2d %2d %6d %12.4e %12.4e\n",
264  icolor, ispin, Nconv, diff, diff2);
265 
266  Hpr[idx] = xq;
267  xq.set(0.0);
268  H[idx] = xq;
269  }
270  }
271 
272 #if 0
273  //For debug
274  Index_lex index;
275  for (int t = 0; t < 2; ++t) {
276  int site = index.site(0, 0, 0, t);
277  for (int c1 = 0; c1 < Nc; ++c1) {
278  for (int c0 = 0; c0 < Nc; ++c0) {
279  for (int s1 = 0; s1 < Nd; ++s1) {
280  for (int s0 = 0; s0 < Nd; ++s0) {
281  vout.general(vl, "H[%d,%d,%d,%d,%d]=%lf %lf\n",
282  t, c1, c0, s1, s0,
283  H[c0 + Nc * s0].cmp_r(c1, s1, site),
284  H[c0 + Nc * s0].cmp_i(c1, s1, site));
285  }
286  }
287  }
288  }
289  }
290  for (int t = 0; t < 2; ++t) {
291  int site = index.site(0, 0, 0, t);
292  for (int c1 = 0; c1 < Nc; ++c1) {
293  for (int c0 = 0; c0 < Nc; ++c0) {
294  for (int s1 = 0; s1 < Nd; ++s1) {
295  for (int s0 = 0; s0 < Nd; ++s0) {
296  vout.general(vl, "Hpr[%d,%d,%d,%d,%d]=%lf %lf\n",
297  t, c1, c0, s1, s0,
298  Hpr[c0 + Nc * s0].cmp_r(c1, s1, site),
299  Hpr[c0 + Nc * s0].cmp_i(c1, s1, site));
300  }
301  }
302  }
303  }
304  }
305 #endif
306 
307  //- meson correlators
308  vout.general(vl, "\n");
309  vout.general(vl, "boundary 2-point correlator with SF BC:\n");
310 
311  Corr2pt_Wilson_SF corr(gmset);
312  double result = corr.fAfP(H, Hpr);
313 
314  timer->report();
315 
316 
317  if (do_check) {
318  return Test::verify(result, expected_result);
319  } else {
320  vout.detailed(vl, "check skipped: expected_result not set.\n\n");
321  return EXIT_SKIP;
322  }
323  }
324 } // namespace Test_SF_fAfP
#define EXIT_SKIP
Definition: test.h:17
Random number generator base on M-series.
BridgeIO vout
Definition: bridgeIO.cpp:278
void set_config(Field *U)
setting pointer to configuration
void detailed(const char *format,...)
Definition: bridgeIO.cpp:82
double norm2() const
Definition: field.cpp:441
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:155
int site(const int &x, const int &y, const int &z, const int &t) const
Definition: index_lex.h:53
void general(const char *format,...)
Definition: bridgeIO.cpp:65
virtual void set_config(Field *)=0
setting pointer to the gauge configuration.
Two-point correlator for Wilson-type fermions with SF BC.
virtual void set_parameters(const Parameters &)=0
Class for parameters.
Definition: parameters.h:38
static Parameters * New(const std::string &realm)
void read_file(Field *U, const string &filename)
Definition: gaugeConfig.cpp:56
void set_random(RandomNumbers *rand)
Definition: field_G_imp.cpp:62
void set_tT(Field_F &src, int ic, int id)
Set the 3D wall source at t=T-1.
Wilson-type fermion field.
Definition: field_F.h:37
virtual void set_parameters(const Parameters &params)=0
void set_unit()
Definition: field_G_imp.cpp:39
static bool RegisterTest(const std::string &key, const Test_function func)
Definition: testManager.h:80
virtual void invert_D(Field &, const Field &, int &, double &)=0
SU(N) gauge field.
Definition: field_G.h:38
Field * getptr_smearedConfig(int i_smear)
get pointer to i-th smeared config (0th is original thin link)
double fAfP(const std::vector< Field_F > &sq1, const std::vector< Field_F > &sq2)
bool is_set(const string &) const
Definition: parameters.cpp:372
void set_t0(Field_F &src, int ic, int id)
Set the 3D wall source at t=1.
double get_double(const string &key) const
Definition: parameters.cpp:27
void set_parameters(const Parameters &params)
Lexical site index.
Definition: index_lex.h:34
virtual void set_parameters(const Parameters &)=0
int non_NULL(const std::string v)
Definition: checker.cpp:61
void start()
Definition: timer.cpp:44
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
Get quark propagator for Fopr with lexical site index.
void set_config(Field *U)
set pointer to original thin link variable
int get_Nsmear()
get number of applied smearing operation
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
virtual void set_parameters(const Parameters &params)=0
void Register_Parameters(const string &, Parameters *const)
Definition: parameters.cpp:358
Manager of smeared configurations.
int verify(const double result, const double expected, double eps)
Definition: test.cpp:27
Bridge::VerboseLevel vl
Definition: checker.cpp:18
VerboseLevel
Definition: bridgeIO.h:39
virtual void mult(Field &, const Field &)=0
multiplies fermion operator to a given field (2nd argument)
void set_parameters(const Parameters &params)
set parameters, must be called before set_config
virtual void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: fopr.h:85
static void read(const std::string &params_file, Parameters *params)
GaugeConfig class for file I/O of gauge configuration.
Definition: gaugeConfig.h:61
Definition: timer.h:31
string get_string(const string &key) const
Definition: parameters.cpp:87
virtual void set_config(Field *U)=0
void report(const Bridge::VerboseLevel vl=Bridge::GENERAL)
Definition: timer.cpp:128
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28