Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
32 namespace Test_IO_Data {
33  const std::string test_name = "IO.Data.Text";
34 
35  //- test-private parameters
36  namespace {
37  const std::string filename_input = "test_IO_Data_Text.yaml";
38  const std::string filename_output = "stdout";
39 
40  class Parameters_Test_IO_GaugeConfig : public Parameters {
41  public:
42  Parameters_Test_IO_GaugeConfig()
43  {
44  Register_string("gauge_config_status", "NULL");
45  Register_string("gauge_config_type_input", "NULL");
46  Register_string("config_filename_input", "NULL");
47  Register_string("config_filename_output", "NULL");
48 
49  Register_int("data_size", 1024);
50 
51  Register_string("verbose_level", "NULL");
52  Register_double("expected_result", 0.0);
53  }
54  };
55  }
56 
57  //- prototype declaration
58  int test_io_data_text(void);
59 
60 #ifdef USE_TESTMANAGER_AUTOREGISTER
61  namespace {
62 #if defined(USE_GROUP_SU2)
63  // Nc=2 is not available.
64 #else
65  static const bool is_registered = TestManager::RegisterTest(
66  test_name,
68  );
69 #endif
70  }
71 #endif
72 
73  //====================================================================
75  {
76  // #### parameter setup ####
77  int Ndim = CommonParameters::Ndim();
78  int Nvol = CommonParameters::Nvol();
79  const double tiny = CommonParameters::epsilon_criterion();
80 
81  Parameters *params_test = new Parameters_Test_IO_GaugeConfig;
82  Parameters *params_all = new Parameters;
83 
84  params_all->Register_Parameters("Test_IO_Data", params_test);
85 
86  ParameterManager_YAML params_manager;
87  params_manager.read_params(filename_input, params_all);
88 
89  const string str_gconf_status = params_test->get_string("gauge_config_status");
90  const string str_gconf_read = params_test->get_string("gauge_config_type_input");
91  const string readfile = params_test->get_string("config_filename_input");
92  const string testfile = params_test->get_string("config_filename_output");
93  const int data_size = params_test->get_int("data_size");
94  const string str_vlevel = params_test->get_string("verbose_level");
95 
96  const bool do_check = params_test->is_set("expected_result");
97  const double expected_result = do_check ? params_test->get_double("expected_result") : 0.0;
98 
100 
101  //- print input parameters
102  vout.general(vl, " gconf_status = %s\n", str_gconf_status.c_str());
103  vout.general(vl, " gconf_read = %s\n", str_gconf_read.c_str());
104  vout.general(vl, " readfile = %s\n", readfile.c_str());
105  vout.general(vl, " testfile = %s\n", testfile.c_str());
106  vout.general(vl, " data_size = %d\n", data_size);
107  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
108  vout.general(vl, "\n");
109 
110  //- input parameter check
111  int err = 0;
112  err += ParameterCheck::non_NULL(str_gconf_status);
113  err += ParameterCheck::non_NULL(testfile);
114 
115  if (err) {
116  vout.crucial(vl, "%s: Input parameters have not been set.\n", test_name.c_str());
117  abort();
118  }
119 
120 
121  // #### Set up a gauge configuration ####
122  Field_G *U = new Field_G(Nvol, Ndim);
123  GaugeConfig *gconf_read = new GaugeConfig(str_gconf_read);
124 
125  if (str_gconf_status == "Continue") {
126  gconf_read->read_file((Field *)U, readfile);
127  } else if (str_gconf_status == "Cold_start") {
128  U->set_unit();
129  } else if (str_gconf_status == "Hot_start") {
130  RandomNumbers_Mseries rand(1234567);
131  U->set_random(&rand);
132  } else {
133  vout.crucial(vl, "%s: unsupported gconf status \"%s\".\n", test_name.c_str(), str_gconf_status.c_str());
134  abort();
135  }
136 
137 
138  // ##### object setup #####
139  DataIO *data_io = new DataIO_Text;
140  Timer *timer = new Timer(test_name);
141 
142 
143  // #### Execution main part ####
144  timer->start();
145 
146  err = 0;
147 
148  //- first write to file.
149  std::valarray<double> array(data_size);
150  double *p = U->ptr(0);
151 
152  for (size_t i = 0; i < data_size; ++i) {
153  array[i] = *p++;
154  }
155 
156  data_io->write_file(array, testfile, false);
157 
158 
159  //- write again with complex data.
160  std::valarray<dcomplex> arrayc(data_size);
161  p = U->ptr(0);
162 
163  for (size_t i = 0; i < data_size; ++i) {
164  double x = *p++;
165  double y = *p++;
166 
167  arrayc[i] = cmplx(x, y);
168  }
169 
170  data_io->write_file(arrayc, testfile, true);
171 
172 
173  //- then read back from file.
174  std::valarray<double> array2(data_size);
175 
176  data_io->read_file(array2, testfile);
177 
178 
179  //- check with reference config.
180  for (size_t i = 0; i < data_size; ++i) {
181  if (abs(array[i] - array2[i]) > tiny) ++err;
182  }
183 
184  vout.general(vl, "Test_IO_Data:\t%s\n", (err == 0) ? "ok" : "failed");
185 
186 
187  int result = err;
188 
189  timer->report();
190 
191 
192  // #### tydy up ####
193  delete params_test;
194  delete params_all;
195 
196  delete timer;
197 
198  delete U;
199  delete gconf_read;
200  delete data_io;
201 
202 
203  if (do_check) {
204  return Test::verify(expected_result, result);
205  } else {
206  vout.detailed(vl, "check skipped: expected_result not set.\n\n");
207  return EXIT_SKIP;
208  }
209  }
210 } // namespace Test_IO_Data
#define EXIT_SKIP
Definition: test.h:17
Random number generator base on M-series.
BridgeIO vout
Definition: bridgeIO.cpp:207
void read_params(const std::string &params_file, Parameters *params)
read parameters from file.
void detailed(const char *format,...)
Definition: bridgeIO.cpp:50
static double epsilon_criterion()
void general(const char *format,...)
Definition: bridgeIO.cpp:38
double * ptr(const int jin, const int site, const int jex)
Definition: field.h:118
Container of Field-type object.
Definition: field.h:37
int get_int(const string &key) const
Definition: parameters.cpp:40
Class for parameters.
Definition: parameters.h:40
DataIO_Text class for general file I/O in plain Text format.
Definition: dataIO_Text.h:40
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:79
SU(N) gauge field.
Definition: field_G.h:36
bool is_set(const string &) const
Definition: parameters.cpp:366
double get_double(const string &key) const
Definition: parameters.cpp:25
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:26
void Register_Parameters(const string &, Parameters *const)
Definition: parameters.cpp:359
virtual void write_file(const double *v, const size_t n, const string &, const bool append=true)=0
Bridge::VerboseLevel vl
Definition: checker.cpp:18
VerboseLevel
Definition: bridgeIO.h:25
int test_io_data_text(void)
Parameter manager with YAML parser.
GaugeConfig class for file I/O of gauge configuration.
Definition: gaugeConfig.h:56
const std::string test_name
Definition: timer.h:31
int verify(const double expected, const double result)
Definition: test.cpp:27
DataIO class for file I/O of general collection of data.
Definition: dataIO.h:44
void read_file(Field *u, const string &filename)
Definition: gaugeConfig.cpp:85
string get_string(const string &key) const
Definition: parameters.cpp:85
void report(const Bridge::VerboseLevel vl=Bridge::GENERAL)
Definition: timer.cpp:128
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191
virtual void read_file(double *v, const size_t n, const string &)=0