Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_Spectrum_Overlap_2ptFunction_5dSolver.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 #include "fopr_Overlap_5d.h"
28 #include "fprop_Overlap_5d.h"
29 
30 #include "eigensolver_IRLanczos.h"
31 
32 #include "gammaMatrixSet.h"
33 #include "gaugeFixing.h"
34 #include "solver.h"
35 #include "sortField.h"
36 #include "source.h"
37 
38 #include "corr2pt_4spinor.h"
39 
40 #ifdef USE_TEST
41 #include "test.h"
42 #endif
43 
44 #ifdef USE_TESTMANAGER_AUTOREGISTER
45 #include "testManager.h"
46 #endif
47 
48 //====================================================================
50 
64 namespace Test_Spectrum_Overlap {
65  //- test-private parameters
66  namespace {
67  const std::string filename_input = "test_Spectrum_Overlap_Hadron2ptFunction_5dSolver.yaml";
68  const std::string filename_output = "stdout";
69 
70  class Parameters_Test_Spectrum_Overlap : public Parameters {
71  public:
72  Parameters_Test_Spectrum_Overlap()
73  {
74  Register_string("gauge_config_type_input", "NULL");
75  Register_string("config_filename_input", "NULL");
76 
77  Register_string("verbose_level", "NULL");
78 
79  Register_double("expected_result", 0.0);
80  }
81  };
82  }
83 
84  //- prototype declaration
86  void calc_lowmodes(Parameters *params_irlanczos,
87  int& Nsbt,
88  valarray<double>& TDa,
89  valarray<Field>& vk,
90  Fopr *fopr);
91 
92 #ifdef USE_TESTMANAGER_AUTOREGISTER
93  namespace {
94  static const bool is_registered = TestManager::RegisterTest(
95  "Spectrum.Overlap.Hadron2ptFunction_5dSolver",
97  );
98  }
99 #endif
100 
101  //====================================================================
103  {
104  // #### parameter setup ####
105  int Nc = CommonParameters::Nc();
106  int Nd = CommonParameters::Nd();
107  int Nvol = CommonParameters::Nvol();
108  int Ndim = CommonParameters::Ndim();
109  int NinF = 2 * Nc * Nd;
110 
111  Parameters *params_test = new Parameters_Test_Spectrum_Overlap;
112  Parameters *params_gfix = ParametersFactory::New("GaugeFixing");
113  Parameters *params_wilson = ParametersFactory::New("Fopr.Wilson");
114  Parameters *params_overlap = ParametersFactory::New("Fopr.Overlap");
115  Parameters *params_irlanczos = ParametersFactory::New("Eigensolver.IRLanczos");
116  Parameters *params_solver = ParametersFactory::New("Solver");
117  Parameters *params_source = ParametersFactory::New("Source");
118 
119  Parameters *params_all = new Parameters;
120 
121  params_all->Register_Parameters("Test_Spectrum_Overlap", params_test);
122  params_all->Register_Parameters("GaugeFixing", params_gfix);
123  params_all->Register_Parameters("Fopr_Wilson", params_wilson);
124  params_all->Register_Parameters("Fopr_Overlap_5d_solver", params_overlap);
125  params_all->Register_Parameters("Eigensolver", params_irlanczos);
126  params_all->Register_Parameters("Solver", params_solver);
127  params_all->Register_Parameters("Source", params_source);
128 
129  ParameterManager_YAML params_manager;
130  params_manager.read_params(filename_input, params_all);
131 
132  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
133  const string readfile = params_test->get_string("config_filename_input");
134  const string str_vlevel = params_test->get_string("verbose_level");
135 #ifdef USE_TEST
136  const double expected_result = params_test->get_double("expected_result");
137 #endif
138 
139  const string str_gfix_type = params_gfix->get_string("gauge_fixing_type");
140  const string str_gmset_type = params_wilson->get_string("gamma_matrix_type");
141  const string str_source_type = params_source->get_string("source_type");
142 
144 
145  //- print input parameters
146  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
147  vout.general(vl, " readfile = %s\n", readfile.c_str());
148  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
149  vout.general(vl, " gfix_type = %s\n", str_gfix_type.c_str());
150  vout.general(vl, " gmset_type = %s\n", str_gmset_type.c_str());
151  vout.general(vl, " source_type = %s\n", str_source_type.c_str());
152 
153  //- input parameter check
154  int err = 0;
155  err += ParameterCheck::non_NULL(str_gconf_read);
156  err += ParameterCheck::non_NULL(readfile);
157 
158  if (err) {
159  vout.crucial(vl, "Test_Spectrum_Overlap: Input parameters have not been set.\n");
160  abort();
161  }
162 
163 
164  // #### Set up a gauge configuration ####
165  Field_G *U = new Field_G(Nvol, Ndim);
166  GaugeConfig *gconf_read = new GaugeConfig(str_gconf_read);
167  gconf_read->read_file((Field *)U, readfile);
168  // gconf_read->set_cold((Field*)U);
169 
170 
171  // #### Gauge fixing ####
172  Staples *staple = new Staples;
173  Field_G *Ufix = new Field_G(Nvol, Ndim);
174 
175  int ndelay = 1000;
176  RandomNumbers *rand = new RandomNumbers_Mseries(ndelay);
177 
178  GaugeFixing *gfix = GaugeFixing::New(str_gfix_type, rand);
179  gfix->set_parameters(*params_gfix);
180 
181  double plaq = staple->plaquette(*U);
182  vout.general(vl, "plaq(original) = %18.14f\n", plaq);
183 
184  gfix->fix(*Ufix, *U);
185 
186  double plaq2 = staple->plaquette(*Ufix);
187  vout.general(vl, "plaq(fixed) = %18.14f\n", plaq2);
188  vout.general(vl, "plaq(diff) = %18.10e\n", plaq - plaq2);
189 
190 
191  // #### object setup ####
192  GammaMatrixSet *gmset = GammaMatrixSet::New(str_gmset_type);
193 
194  Fopr_Wilson *fopr_w = new Fopr_Wilson(str_gmset_type);
195  fopr_w->set_parameters(*params_wilson);
196  fopr_w->set_config(Ufix);
197 
198  int Nsbt = 0;
199  valarray<double> TDa;
200  valarray<Field> vk;
201 
202  // with low-mode subtraction
203  calc_lowmodes(params_irlanczos, Nsbt, TDa, vk, fopr_w);
204 
205  Fopr_Overlap *fopr_overlap = new Fopr_Overlap(fopr_w);
206  fopr_overlap->set_parameters(*params_overlap);
207  fopr_overlap->set_config(Ufix);
208  fopr_overlap->set_lowmodes(Nsbt, &TDa, &vk);
209 
210  Fprop_Overlap_5d *fprop_5d = new Fprop_Overlap_5d(fopr_overlap, Ufix);
211  fprop_5d->set_parameters(*params_overlap, *params_solver);
212  fprop_5d->set_lowmodes(Nsbt, &TDa, &vk);
213 
214  Source *source = Source::New(str_source_type);
215  source->set_parameters(*params_source);
216 
217 
218  // #### Execution main part ####
219  valarray<Field_F> sq(Nc * Nd);
220  Field_F b;
221 
222  vout.general(vl, "\n");
223  vout.general(vl, "Solving quark propagator:\n");
224  vout.general(vl, " color spin Nconv diff diff2\n");
225 
226  // { int ispin = 0;
227  // { int icolor = 0;
228  for (int ispin = 0; ispin < Nd; ++ispin) {
229  for (int icolor = 0; icolor < Nc; ++icolor) {
230  int idx = icolor + Nc * ispin;
231  source->set(b, idx);
232 
233  fprop_5d->calc_fprop(sq[idx], (Field)b);
234  }
235  }
236 
237  //- meson correlators
238  std::ofstream log_file;
239  if (filename_output != "stdout") {
240  log_file.open(filename_output.c_str());
241  vout.init(log_file);
242  }
243 
244  vout.general(vl, "\n");
245  vout.general(vl, "2-point correlator:\n");
246  Corr2pt_4spinor corr(gmset);
247  //corr.meson_all(sq,sq);
248  double result = corr.meson_all(sq, sq);
249 
250  if (filename_output != "stdout") {
251  log_file.close();
252  vout.init(std::cout);
253  }
254 
255 
256  // ##### tidy up #####
257  delete gconf_read;
258  delete U;
259  delete Ufix;
260 
261  delete rand;
262  delete staple;
263 
264  delete fopr_w;
265  delete fopr_overlap;
266  delete fprop_5d;
267 
268  delete gfix;
269  delete gmset;
270  delete source;
271 
272  delete params_test;
273  delete params_gfix;
274  delete params_wilson;
275  delete params_overlap;
276  delete params_irlanczos;
277  delete params_solver;
278  delete params_source;
279  delete params_all;
280 
281 
282 #ifdef USE_TEST
283  return Test::verify(expected_result, result);
284 
285 #else
286  return EXIT_SUCCESS;
287 #endif
288  }
289 
290 
291  //====================================================================
292  void calc_lowmodes(Parameters *params_irlanczos,
293  int& Nsbt,
294  valarray<double>& TDa,
295  valarray<Field>& vk,
296  Fopr *fopr)
297  {
298  // ##### parameter setup #####
300 
301  const string str_sortfield_type = params_irlanczos->get_string("eigensolver_mode");
302  const int Nk = params_irlanczos->get_int("number_of_wanted_eigenvectors");
303  const int Np = params_irlanczos->get_int("number_of_working_eigenvectors");
304 
305  Field_F b;
306  int Nin = b.nin();
307  int Nvol = b.nvol();
308  int Nex = b.nex();
309 
310  int Nmm = Nk + Np;
311 
312  TDa.resize(Nmm);
313  vk.resize(Nmm);
314 
315 
316  // #### object setup ####
317  SortField *sort = SortField::New(str_sortfield_type);
318 
319  Eigensolver_IRLanczos *eigen = new Eigensolver_IRLanczos(fopr, sort);
320  eigen->set_parameters(*params_irlanczos);
321 
322 
323  // #### Execution main part ####
324  for (int k = 0; k < Nmm; ++k) {
325  vk[k].reset(Nin, Nvol, Nex);
326  }
327  int Nconv = -100;
328 
329  fopr->set_mode("H");
330  eigen->solve(TDa, vk, Nsbt, Nconv, (Field)b);
331 
332  Field v;
333  v.reset(Nin, Nvol, Nex);
334 
335  fopr->set_mode("H");
336  for (int i = 0; i < Nsbt; ++i) {
337  v = fopr->mult(vk[i]);
338  v -= TDa[i] * vk[i];
339  double vv = v * v;
340 
341  vout.general(vl, "Eigenvalues: %4d %20.14f %20.15e\n", i, TDa[i], vv);
342  }
343 
344 
345  // ##### tidy up #####
346  delete eigen;
347  delete sort;
348  }
349 } // namespace Test_Spectrum_Overlap