Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_Spectrum_Overlap_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 #include "staples.h"
22 
23 #include "randomNumbers_Mseries.h"
24 
25 #include "fopr_Wilson.h"
26 #include "fopr_Overlap.h"
27 
28 #include "eigensolver_IRLanczos.h"
29 
30 #include "gammaMatrixSet.h"
31 #include "gaugeFixing.h"
32 #include "solver.h"
33 #include "source.h"
34 
35 #include "corr2pt_4spinor.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 //====================================================================
47 
61 namespace Test_Spectrum_Overlap {
62  //- test-private parameters
63  namespace {
64  const std::string filename_input = "test_Spectrum_Overlap_Hadron2ptFunction.yaml";
65  const std::string filename_output = "stdout";
66 
67  class Parameters_Test_Spectrum_Overlap : public Parameters {
68  public:
69  Parameters_Test_Spectrum_Overlap()
70  {
71  Register_string("gauge_config_type_input", "NULL");
72  Register_string("config_filename_input", "NULL");
73 
74  Register_string("verbose_level", "NULL");
75 
76  Register_double("expected_result", 0.0);
77  }
78  };
79  }
80 
81  //- prototype declaration
82  int hadron_2ptFunction(void);
83 
84 #ifdef USE_TESTMANAGER_AUTOREGISTER
85  namespace {
86  static const bool is_registered = TestManager::RegisterTest(
87  "Spectrum.Overlap.Hadron2ptFunction",
88  hadron_2ptFunction
89  );
90  }
91 #endif
92 
93  //====================================================================
95  {
96  // #### parameter setup ####
97  int Ndim = CommonParameters::Ndim();
98  int Nc = CommonParameters::Nc();
99  int Nd = CommonParameters::Nd();
100  int Nvol = CommonParameters::Nvol();
101 
102  Parameters *params_test = new Parameters_Test_Spectrum_Overlap;
103  Parameters *params_gfix = ParametersFactory::New("GaugeFixing");
104  Parameters *params_wilson = ParametersFactory::New("Fopr.Wilson");
105  Parameters *params_overlap = ParametersFactory::New("Fopr.Overlap");
106  Parameters *params_irlanczos = ParametersFactory::New("Eigensolver.IRLanczos");
107  Parameters *params_solver = ParametersFactory::New("Solver");
108  Parameters *params_source = ParametersFactory::New("Source");
109 
110  Parameters *params_all = new Parameters;
111 
112  params_all->Register_Parameters("Test_Spectrum_Overlap", params_test);
113  params_all->Register_Parameters("GaugeFixing", params_gfix);
114  params_all->Register_Parameters("Fopr_Wilson", params_wilson);
115  params_all->Register_Parameters("Fopr_Overlap", params_overlap);
116  params_all->Register_Parameters("Eigensolver", params_irlanczos);
117  params_all->Register_Parameters("Solver", params_solver);
118  params_all->Register_Parameters("Source", params_source);
119 
120  ParameterManager_YAML params_manager;
121  params_manager.read_params(filename_input, params_all);
122 
123  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
124  const string readfile = params_test->get_string("config_filename_input");
125  const string str_vlevel = params_test->get_string("verbose_level");
126 #ifdef USE_TEST
127  const double expected_result = params_test->get_double("expected_result");
128 #endif
129 
130  const string str_gfix_type = params_gfix->get_string("gauge_fixing_type");
131  const string str_gmset_type = params_wilson->get_string("gamma_matrix_type");
132  const string str_solver_type = params_solver->get_string("solver_type");
133  const string str_source_type = params_source->get_string("source_type");
134 
136 
137  //- print input parameters
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, " gfix_type = %s\n", str_gfix_type.c_str());
142  vout.general(vl, " gmset_type = %s\n", str_gmset_type.c_str());
143  vout.general(vl, " solver_type = %s\n", str_solver_type.c_str());
144  vout.general(vl, " source_type = %s\n", str_source_type.c_str());
145 
146  //- input parameter check
147  int err = 0;
148  err += ParameterCheck::non_NULL(str_gconf_read);
149  err += ParameterCheck::non_NULL(readfile);
150 
151  if (err) {
152  vout.crucial(vl, "Test_Spectrum_Overlap: Input parameters have not been set.\n");
153  abort();
154  }
155 
156 
157  // #### Set up a gauge configuration ####
158  Field_G *U = new Field_G(Nvol, Ndim);
159  GaugeConfig *gconf_read = new GaugeConfig(str_gconf_read);
160  gconf_read->read_file((Field *)U, readfile);
161  // gconf_read->set_cold((Field*)U);
162 
163 
164  // #### Gauge fixing ####
165  Staples *staple = new Staples;
166  Field_G *Ufix = new Field_G(Nvol, Ndim);
167 
168  int ndelay = 1000;
169  RandomNumbers *rand = new RandomNumbers_Mseries(ndelay);
170 
171  GaugeFixing *gfix = GaugeFixing::New(str_gfix_type, rand);
172  gfix->set_parameters(*params_gfix);
173 
174  double plaq = staple->plaquette(*U);
175  vout.general(vl, "plaq(original) = %18.14f\n", plaq);
176 
177  gfix->fix(*Ufix, *U);
178 
179  double plaq2 = staple->plaquette(*Ufix);
180  vout.general(vl, "plaq(fixed) = %18.14f\n", plaq2);
181  vout.general(vl, "plaq(diff) = %18.10e\n", plaq - plaq2);
182 
183 
184  // #### object setup ####
185  GammaMatrixSet *gmset = GammaMatrixSet::New(str_gmset_type);
186 
187  Fopr_Wilson *fopr_w = new Fopr_Wilson(str_gmset_type);
188  fopr_w->set_parameters(*params_wilson);
189  fopr_w->set_config(Ufix);
190 
191  //- with low-mode subtraction
192  // int Nsbt = 0;
193  // valarray<double> TDa;
194  // valarray<Field> vk;
195  // calc_lowmodes(*params_irlanczos, Nsbt, TDa, vk, fopr_w);
196 
197  Fopr_Overlap *fopr_overlap = new Fopr_Overlap(fopr_w);
198  fopr_overlap->set_parameters(*params_overlap);
199  fopr_overlap->set_config(Ufix);
200  // fopr_overlap->set_lowmodes(Nsbt, &TDa, &vk);
201 
202  Solver *solver = Solver::New(str_solver_type, fopr_overlap);
203  solver->set_parameters(*params_solver);
204 
205  Source *source = Source::New(str_source_type);
206  source->set_parameters(*params_source);
207 
208 
209  // #### Execution main part ####
210  valarray<Field_F> sq(Nc * Nd);
211  Field_F b;
212 
213  vout.general(vl, "\n");
214  vout.general(vl, "Solving quark propagator:\n");
215  vout.general(vl, " color spin Nconv diff diff2\n");
216 
217  // { int ispin = 0;
218  // { int icolor = 0;
219  for (int ispin = 0; ispin < Nd; ++ispin) {
220  for (int icolor = 0; icolor < Nc; ++icolor) {
221  int idx = icolor + Nc * ispin;
222  source->set(b, idx);
223 
224  int Nconv;
225  double diff;
226 
227  fopr_overlap->set_mode("D");
228  solver->solve(sq[idx], b, Nconv, diff);
229 
230  Field y(b);
231  fopr_overlap->set_mode("D");
232  y -= fopr_overlap->mult(sq[idx]);
233  double diff2 = y.norm2();
234 
235  vout.general(vl, " %2d %2d %6d %12.4e %12.4e\n",
236  icolor, ispin, Nconv, diff, diff2);
237  }
238  }
239 
240 
241  //- meson correlators
242  std::ofstream log_file;
243  if (filename_output != "stdout") {
244  log_file.open(filename_output.c_str());
245  vout.init(log_file);
246  }
247 
248  vout.general(vl, "\n");
249  vout.general(vl, "2-point correlator:\n");
250 
251  Corr2pt_4spinor corr(gmset);
252  //corr.meson_all(sq,sq);
253  double result = corr.meson_all(sq, sq);
254 
255  if (filename_output != "stdout") {
256  log_file.close();
257  vout.init(std::cout);
258  }
259 
260 
261  // #### tidy up ####
262  delete gconf_read;
263  delete U;
264  delete Ufix;
265 
266  delete rand;
267  delete staple;
268 
269  delete fopr_w;
270  delete fopr_overlap;
271 
272  delete gfix;
273  delete gmset;
274  delete solver;
275  delete source;
276 
277  delete params_test;
278  delete params_gfix;
279  delete params_wilson;
280  delete params_overlap;
281  delete params_irlanczos;
282  delete params_solver;
283  delete params_source;
284  delete params_all;
285 
286 
287 #ifdef USE_TEST
288  return Test::verify(expected_result, result);
289 
290 #else
291  return EXIT_SUCCESS;
292 #endif
293  }
294 } // namespace Test_Spectrum_Overlap