Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_Spectrum_Overlap_checkSignFunction.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_Sign.h"
27 
28 #include "gaugeFixing.h"
29 #include "source.h"
30 
31 #include "corr2pt_4spinor.h"
32 
33 #ifdef USE_TEST
34 #include "test.h"
35 #endif
36 
37 #ifdef USE_TESTMANAGER_AUTOREGISTER
38 #include "testManager.h"
39 #endif
40 
41 //====================================================================
43 
53 namespace Test_Spectrum_Overlap {
54  //- test-private parameters
55  namespace {
56  const std::string filename_input = "test_Spectrum_Overlap_CheckSignFunction.yaml";
57  const std::string filename_output = "stdout";
58 
59  class Parameters_Test_Spectrum_Overlap : public Parameters {
60  public:
61  Parameters_Test_Spectrum_Overlap()
62  {
63  Register_string("gauge_config_type_input", "NULL");
64  Register_string("config_filename_input", "NULL");
65 
66  Register_string("verbose_level", "NULL");
67 
68  Register_double("expected_result", 0.0);
69  }
70  };
71  }
72 
73  //- prototype declaration
74  int check_sign(void);
75 
76 #ifdef USE_TESTMANAGER_AUTOREGISTER
77  namespace {
78  static const bool is_registered = TestManager::RegisterTest(
79  "Spectrum.Overlap.CheckSignFunction",
81  );
82  }
83 #endif
84 
85  //====================================================================
86  int check_sign(void)
87  {
88  // #### parameter setup ####
89  int Ndim = CommonParameters::Ndim();
90  int Nc = CommonParameters::Nc();
91  int Nvol = CommonParameters::Nvol();
92 
93  Parameters *params_test = new Parameters_Test_Spectrum_Overlap;
94  Parameters *params_gfix = ParametersFactory::New("GaugeFixing");
95  Parameters *params_wilson = ParametersFactory::New("Fopr.Wilson");
96  Parameters *params_overlap = ParametersFactory::New("Fopr.Sign");
97  Parameters *params_source = ParametersFactory::New("Source");
98 
99  Parameters *params_all = new Parameters;
100 
101  params_all->Register_Parameters("Test_Spectrum_Overlap", params_test);
102  params_all->Register_Parameters("GaugeFixing", params_gfix);
103  params_all->Register_Parameters("Fopr_Wilson", params_wilson);
104  params_all->Register_Parameters("Fopr_Overlap", params_overlap);
105  params_all->Register_Parameters("Source", params_source);
106 
107  ParameterManager_YAML params_manager;
108  params_manager.read_params(filename_input, params_all);
109 
110  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
111  const string readfile = params_test->get_string("config_filename_input");
112  const string str_vlevel = params_test->get_string("verbose_level");
113 #ifdef USE_TEST
114  const double expected_result = params_test->get_double("expected_result");
115 #endif
116 
117  const string str_gfix_type = params_gfix->get_string("gauge_fixing_type");
118  const string str_gmset_type = params_wilson->get_string("gamma_matrix_type");
119  const string str_source_type = params_source->get_string("source_type");
120 
122 
123  //- print input parameters
124  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
125  vout.general(vl, " readfile = %s\n", readfile.c_str());
126  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
127  vout.general(vl, " gfix_type = %s\n", str_gfix_type.c_str());
128  vout.general(vl, " gmset_type = %s\n", str_gmset_type.c_str());
129  vout.general(vl, " source_type = %s\n", str_source_type.c_str());
130 
131  //- input parameter check
132  int err = 0;
133  err += ParameterCheck::non_NULL(str_gconf_read);
134  err += ParameterCheck::non_NULL(readfile);
135 
136  if (err) {
137  vout.crucial(vl, "Test_Spectrum_Overlap: Input parameters have not been set.\n");
138  abort();
139  }
140 
141 
142  // #### Set up a gauge configuration ####
143  Field_G *U = new Field_G(Nvol, Ndim);
144  GaugeConfig *gconf_read = new GaugeConfig(str_gconf_read);
145  gconf_read->read_file((Field *)U, readfile);
146  // gconf_read->set_cold((Field*)U);
147 
148 
149  // #### Gauge fixing ####
150  Staples *staple = new Staples;
151  Field_G *Ufix = new Field_G(Nvol, Ndim);
152 
153  int ndelay = 1000;
154  RandomNumbers *rand = new RandomNumbers_Mseries(ndelay);
155 
156  GaugeFixing *gfix = GaugeFixing::New(str_gfix_type, rand);
157  gfix->set_parameters(*params_gfix);
158 
159  double plaq = staple->plaquette(*U);
160  vout.general(vl, "plaq(original) = %18.14f\n", plaq);
161 
162  gfix->fix(*Ufix, *U);
163 
164  double plaq2 = staple->plaquette(*Ufix);
165  vout.general(vl, "plaq(fixed) = %18.14f\n", plaq2);
166  vout.general(vl, "plaq(diff) = %18.10e\n", plaq - plaq2);
167 
168 
169  // #### object setup ####
170  Fopr_Wilson *fopr_w = new Fopr_Wilson(str_gmset_type);
171  fopr_w->set_parameters(*params_wilson);
172  fopr_w->set_config(Ufix);
173 
174  int Nsbt = 0;
175  valarray<double> TDa;
176  valarray<Field> vk;
177 
178  //- with low-mode subtraction
179  //double Vthreshold = 0.15; // example value with low-mode subtraction
180  //calc_lowmodes(Nsbt, TDa, vk, Vthreshold, fopr_w);
181 
182  Fopr_Sign *fopr_sign = new Fopr_Sign(fopr_w);
183  fopr_sign->set_parameters(*params_overlap);
184  fopr_sign->set_config(Ufix);
185  if (Nsbt > 0) fopr_sign->set_lowmodes(Nsbt, &TDa, &vk);
186 
187  Source *source = Source::New(str_source_type);
188  source->set_parameters(*params_source);
189 
190 
191  // #### Execution main part ####
192  Field_F b;
193 
194  Field xq((Field)b);
195  Field xq2((Field)b);
196 
197  double xq_norm;
198  {
199  int ispin = 0;
200  {
201  int icolor = 0;
202  // for(int ispin = 0; ispin < Nd; ++ispin){
203  // for(int icolor = 0; icolor < Nc; ++icolor){
204 
205  int idx = icolor + Nc * ispin;
206  source->set(b, idx);
207 
208  xq = fopr_sign->mult((Field)b);
209  xq2 = fopr_sign->mult(xq);
210  xq2 -= (Field)b;
211 
212  xq_norm = xq2.norm2();
213 
214  vout.general(vl, " |sign^2(b) - b|^2 = %16.8e\n", xq_norm);
215  }
216  }
217 
218  double result = xq_norm;
219 
220 
221  // ##### tidy up #####
222  delete gconf_read;
223  delete U;
224  delete Ufix;
225 
226  delete rand;
227  delete staple;
228 
229  delete fopr_w;
230  delete fopr_sign;
231 
232  delete gfix;
233  delete source;
234 
235  delete params_test;
236  delete params_gfix;
237  delete params_wilson;
238  delete params_overlap;
239  delete params_source;
240  delete params_all;
241 
242 
243 #ifdef USE_TEST
244  return Test::verify(expected_result, result);
245 
246 #else
247  return EXIT_SUCCESS;
248 #endif
249  }
250 } // namespace Test_Spectrum_Overlap