Bridge++  Ver. 1.3.x
test_IO_Data_Text.cpp
Go to the documentation of this file.
1 
14 #include "test.h"
15 
16 #include "gaugeConfig.h"
17 
18 #include "dataIO_Text.h"
19 #include "bridge_complex.h"
20 
21 #include "randomNumbers_Mseries.h"
22 
23 //====================================================================
25 
34 namespace Test_IO_Data {
35  const std::string test_name = "IO.Data.Text";
36 
37  //- test-private parameters
38  namespace {
39  const std::string filename_input = "test_IO_Data_Text.yaml";
40  const std::string filename_output = "stdout";
41 
42  class Parameters_Test_IO_GaugeConfig : public Parameters {
43  public:
44  Parameters_Test_IO_GaugeConfig()
45  {
46  Register_string("gauge_config_status", "NULL");
47  Register_string("gauge_config_type_input", "NULL");
48  Register_string("config_filename_input", "NULL");
49  Register_string("config_filename_output", "NULL");
50 
51  Register_int("data_size", 1024);
52 
53  Register_string("verbose_level", "NULL");
54  Register_double("expected_result", 0.0);
55  }
56  };
57  }
58 
59  //- prototype declaration
60  int test_io_data_text(void);
61 
62 #ifdef USE_TESTMANAGER_AUTOREGISTER
63  namespace {
64 #if defined(USE_GROUP_SU2)
65  // Nc=2 is not available.
66 #else
67  static const bool is_registered = TestManager::RegisterTest(
68  test_name,
70  );
71 #endif
72  }
73 #endif
74 
75  //====================================================================
77  {
78  // #### parameter setup ####
79  int Ndim = CommonParameters::Ndim();
80  int Nvol = CommonParameters::Nvol();
81  const double tiny = CommonParameters::epsilon_criterion();
82 
83  unique_ptr<Parameters> params_test(new Parameters_Test_IO_GaugeConfig);
84  unique_ptr<Parameters> params_all(new Parameters);
85 
86  params_all->Register_Parameters("Test_IO_Data", params_test);
87 
88  ParameterManager::read(filename_input, params_all);
89 
90  const string str_gconf_status = params_test->get_string("gauge_config_status");
91  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
92  const string readfile = params_test->get_string("config_filename_input");
93  const string testfile = params_test->get_string("config_filename_output");
94  const int data_size = params_test->get_int("data_size");
95  const string str_vlevel = params_test->get_string("verbose_level");
96 
97  const bool do_check = params_test->is_set("expected_result");
98  const double expected_result = do_check ? params_test->get_double("expected_result") : 0.0;
99 
101 
102  //- print input parameters
103  vout.general(vl, " gconf_status = %s\n", str_gconf_status.c_str());
104  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
105  vout.general(vl, " readfile = %s\n", readfile.c_str());
106  vout.general(vl, " testfile = %s\n", testfile.c_str());
107  vout.general(vl, " data_size = %d\n", data_size);
108  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
109  vout.general(vl, "\n");
110 
111  //- input parameter check
112  int err = 0;
113  err += ParameterCheck::non_NULL(str_gconf_status);
114  err += ParameterCheck::non_NULL(testfile);
115 
116  if (err) {
117  vout.crucial(vl, "%s: Input parameters have not been set.\n", test_name.c_str());
118  exit(EXIT_FAILURE);
119  }
120 
121 
122  // #### Set up a gauge configuration ####
123  unique_ptr<Field_G> U(new Field_G(Nvol, Ndim));
124  unique_ptr<GaugeConfig> gconf_read(new GaugeConfig(str_gconf_read));
125 
126  if (str_gconf_status == "Continue") {
127  gconf_read->read_file(U, readfile);
128  } else if (str_gconf_status == "Cold_start") {
129  U->set_unit();
130  } else if (str_gconf_status == "Hot_start") {
131  int i_seed_noise = 1234567;
132  unique_ptr<RandomNumbers> rand(new RandomNumbers_Mseries(i_seed_noise));
133  U->set_random(rand);
134  } else {
135  vout.crucial(vl, "%s: unsupported gconf status \"%s\".\n", test_name.c_str(), str_gconf_status.c_str());
136  exit(EXIT_FAILURE);
137  }
138 
139 
140  // ##### object setup #####
141  unique_ptr<DataIO> data_io(new DataIO_Text);
142  unique_ptr<Timer> timer(new Timer(test_name));
143 
144 
145  // #### Execution main part ####
146  timer->start();
147 
148  err = 0;
149 
150  //- first write to file.
151  std::vector<double> array(data_size);
152  double *p = U->ptr(0);
153 
154  for (size_t i = 0; i < data_size; ++i) {
155  array[i] = *p++;
156  }
157 
158  data_io->write_file(array, testfile, false);
159 
160 
161  //- write again with complex data.
162  std::vector<dcomplex> arrayc(data_size);
163  p = U->ptr(0);
164 
165  for (size_t i = 0; i < data_size; ++i) {
166  double x = *p++;
167  double y = *p++;
168 
169  arrayc[i] = cmplx(x, y);
170  }
171 
172  data_io->write_file(arrayc, testfile, true);
173 
174 
175  //- then read back from file.
176  std::vector<double> array2(data_size);
177 
178  data_io->read_file(array2, testfile);
179 
180 
181  //- check with reference config.
182  for (size_t i = 0; i < data_size; ++i) {
183  if (abs(array[i] - array2[i]) > tiny) ++err;
184  }
185 
186  vout.general(vl, "%s: \t%s\n", test_name.c_str(), (err == 0) ? "ok" : "failed");
187 
188 
189  int result = err;
190 
191  timer->report();
192 
193 
194  if (do_check) {
195  return Test::verify(result, expected_result);
196  } else {
197  vout.detailed(vl, "check skipped: expected_result not set.\n\n");
198  return EXIT_SKIP;
199  }
200  }
201 } // namespace Test_IO_Data
#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
static double epsilon_criterion()
void general(const char *format,...)
Definition: bridgeIO.cpp:65
int get_int(const string &key) const
Definition: parameters.cpp:42
Class for parameters.
Definition: parameters.h:38
DataIO_Text class for general file I/O in plain Text format.
Definition: dataIO_Text.h:44
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_unit()
Definition: field_G_imp.cpp:39
static bool RegisterTest(const std::string &key, const Test_function func)
Definition: testManager.h:80
Test of I/O.
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
int non_NULL(const std::string v)
Definition: checker.cpp:61
void start()
Definition: timer.cpp:44
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
void Register_Parameters(const string &, Parameters *const)
Definition: parameters.cpp:358
virtual void write_file(const double *v, const size_t n, const string &, const bool append=true)=0
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 void read(const std::string &params_file, Parameters *params)
int test_io_data_text(void)
GaugeConfig class for file I/O of gauge configuration.
Definition: gaugeConfig.h:61
const std::string test_name
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
virtual void read_file(double *v, const size_t n, const string &)=0