Bridge++  Ver. 1.3.x
test_HotStart_Eigenvalue.cpp
Go to the documentation of this file.
1 
14 #include <valarray>
15 using std::valarray;
16 
17 #include "test.h"
18 
19 #include "gaugeConfig.h"
20 
21 #include "eigen_QR_Cmplx.h"
22 
23 #include "randomNumbers_Mseries.h"
24 
25 //====================================================================
27 
34 namespace Test_HotStart {
35  const std::string test_name = "HotStart.Eigenvalue";
36 
37  //- test-private parameters
38  namespace {
39  const std::string filename_input = "test_HotStart_Eigenvalue.yaml";
40  const std::string filename_output = "stdout";
41 
42  class Parameters_Test_HotStart : public Parameters {
43  public:
44  Parameters_Test_HotStart()
45  {
46  Register_string("verbose_level", "NULL");
47 
48  Register_double("expected_result", 0.0);
49  }
50  };
51  }
52 
53  //- prototype declaration
54  int eigenvalue(void);
55 
56 #ifdef USE_TESTMANAGER_AUTOREGISTER
57  namespace {
58 #if defined(USE_GROUP_SU2)
59  // Nc=2 is not available.
60 #else
61  static const bool is_registered = TestManager::RegisterTest(
62  test_name,
64  );
65 #endif
66  }
67 #endif
68 
69  //====================================================================
70  int eigenvalue(void)
71  {
72  int Nc = CommonParameters::Nc();
73  int Nvol = CommonParameters::Nvol();
74  int Ndim = CommonParameters::Ndim();
75 
76  const double pi = 4.0 * atan(1.0);
77 
78  unique_ptr<Parameters> params_test(new Parameters_Test_HotStart);
79  unique_ptr<Parameters> params_all(new Parameters);
80 
81  params_all->Register_Parameters("Test_HotStart", params_test);
82 
83  ParameterManager::read(filename_input, params_all);
84 
85  const string str_vlevel = params_test->get_string("verbose_level");
86 
87  const bool do_check = params_test->is_set("expected_result");
88  const double expected_result = do_check ? params_test->get_double("expected_result") : 0.0;
89 
91 
92 
93  // #### Set up a gauge configuration ####
94  unique_ptr<Field_G> U(new Field_G(Nvol, Ndim));
95 
96  int i_seed_noise = 1234567;
97  unique_ptr<RandomNumbers> rand(new RandomNumbers_Mseries(i_seed_noise));
98  U->set_random(rand);
99 
100 
101  // #### object setup #####
102  unique_ptr<Timer> timer(new Timer(test_name));
103 
104 
105  // #### Execution main part ####
106  timer->start();
107 
108  double av = 0.0;
109  double va = 0.0;
110  Eigen_QR_Cmplx eigen_qr(Nc);
111  valarray<double> vec(2 * Nc);
112 
113  for (int site = 0; site < Nvol; ++site) {
114  for (int mu = 0; mu < Ndim; ++mu) {
115  vec = eigen_qr.solve(U->ptr(0, site, mu));
116  for (int icolor = 0; icolor < Nc; ++icolor) {
117  double arg = atan2(vec[2 * icolor + 1], vec[2 * icolor]);
118 
119  vout.detailed(vl, "%10.8f\n", arg);
120 
121  av += arg;
122  va += arg * arg;
123  }
124  }
125  }
126 
127  double av_all = Communicator::reduce_sum(av);
128  double va_all = Communicator::reduce_sum(va);
129  int Nval = CommonParameters::Lvol() * Ndim * Nc;
130 
131  av = av_all / Nval;
132  va = va_all / Nval - av * av;
133 
134  va = sqrt(va);
135 
136  vout.general(vl, "\n");
137  vout.general(vl, "Random SU(%d):\n", Nc);
138  vout.general(vl, " # of eigenvalue = %10d\n", Nval);
139  vout.general(vl, " ave = %23.16e\n", av);
140  vout.general(vl, " var = %23.16e\n", va);
141  vout.general(vl, " var(expected) = %23.16e\n", pi / sqrt(3.0));
142 
143  double result = av;
144 
145  timer->report();
146 
147 
148  if (do_check) {
149  return Test::verify(result, expected_result);
150  } else {
151  vout.detailed(vl, "check skipped: expected_result not set.\n\n");
152  return EXIT_SKIP;
153  }
154  }
155 } // namespace Test_HotStart
#define EXIT_SKIP
Definition: test.h:17
Random number generator base on M-series.
BridgeIO vout
Definition: bridgeIO.cpp:278
void detailed(const char *format,...)
Definition: bridgeIO.cpp:82
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:133
void general(const char *format,...)
Definition: bridgeIO.cpp:65
const std::string test_name
Class for parameters.
Definition: parameters.h:38
std::valarray< double > solve(const double *matrix)
static int Lvol()
void set_random(RandomNumbers *rand)
Definition: field_G_imp.cpp:62
static bool RegisterTest(const std::string &key, const Test_function func)
Definition: testManager.h:80
SU(N) gauge field.
Definition: field_G.h:38
bool is_set(const string &) const
Definition: parameters.cpp:372
double get_double(const string &key) const
Definition: parameters.cpp:27
Test of hot start.
void start()
Definition: timer.cpp:44
void Register_Parameters(const string &, Parameters *const)
Definition: parameters.cpp:358
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
static int reduce_sum(int count, double *recv_buf, double *send_buf, int pattern=0)
make a global sum of an array of double over the communicator. pattern specifies the dimensions to be...
static void read(const std::string &params_file, Parameters *params)
Definition: timer.h:31
string get_string(const string &key) const
Definition: parameters.cpp:87
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