35 const std::string
test_name =
"RandomNumbers.SFMT.Global";
39 const std::string filename_input =
"test_RandomNumbers_SFMT_Global.yaml";
40 const std::string filename_output =
"stdout";
42 class Parameters_Test_RandomNumbers :
public Parameters {
44 Parameters_Test_RandomNumbers()
46 Register_int(
"seed", 0);
48 Register_string(
"verbose_level",
"NULL");
50 Register_double(
"expected_result", 0.0);
58 #ifdef USE_TESTMANAGER_AUTOREGISTER
71 unique_ptr<Parameters> params_test(
new Parameters_Test_RandomNumbers);
72 unique_ptr<Parameters> params_all(
new Parameters);
74 params_all->Register_Parameters(
"Test_RandomNumbers", params_test);
78 int seed = params_test->get_int(
"seed");
79 const string str_vlevel = params_test->get_string(
"verbose_level");
81 const bool do_check = params_test->is_set(
"expected_result");
82 const double expected_result = do_check ? params_test->get_double(
"expected_result") : 0.0;
88 vout.
general(vl,
" vlevel = %s\n", str_vlevel.c_str());
93 unique_ptr<Timer> timer(
new Timer(test_name));
100 vout.
general(vl,
"Serial and Node-parallel test of Random Number Generator:\n");
109 vout.
general(vl,
"field size: nin = %d, nex = %d, nvol = %d, lvol = %d\n", nin, nex, nvol, lvol);
112 const size_t nsample = 1024;
113 double data[nsample];
114 for (
size_t i = 0; i < nsample; ++i) {
120 Field field1(nin, nvol, nex);
123 unique_ptr<RandomNumbers> rand(
new RandomNumbers_SFMT(seed));
127 rand->uniform_lex_global(field1);
130 for (
size_t i = 0; i < nsample; ++i) {
131 data[i] = rand->get();
136 Field field2(0, 0, 0);
139 unique_ptr<RandomNumbers> rand(
new RandomNumbers_SFMT(seed));
141 field2.reset(nin, lvol, nex);
143 double *p = field2.ptr(0);
145 for (
size_t i = 0, n = field2.size(); i < n; ++i) {
151 Field field1b(0, 0, 0);
154 field1b.reset(nin, lvol, nex);
159 fieldio.gather(&field1b, &field1);
165 if (field1b.size() != field2.size()) {
166 vout.
crucial(vl,
"%s: field size mismatch.\n", test_name.c_str());
170 double *p1 = field1b.ptr(0);
171 double *p2 = field2.ptr(0);
173 for (
size_t i = 0, n = field2.size(); i < n; ++i) {
174 if (*p1++ != *p2++) ++err1;
179 vout.
general(vl,
"%s: serial and parallel: err = %d\n", test_name.c_str(), err1);
189 for (
size_t i = 0; i < nsample; ++i) {
190 if (data[i] != buf[i]) ++err2;
195 vout.
general(vl,
"%s: check local state at rank %d, err = %d\n", test_name.c_str(), ipe, err2);
202 unique_ptr<RandomNumbers_SFMT> rand(
new RandomNumbers_SFMT(seed));
206 rand->writefile(
"RNG_SFMT.state");
208 vout.
detailed(
"%s: number of samples = %lu\n", test_name.c_str(), nsample);
210 for (
size_t i = 0; i < nsample; ++i) {
211 data[i] = rand->get();
215 rand->readfile(
"RNG_SFMT.state");
220 for (
size_t i = 0; i < nsample; ++i) {
221 if (data[i] != rand->get()) ++err3_part;
226 vout.
general(vl,
"%s: save/restore test: err = %d\n", test_name.c_str(), err3);
230 field1.reset(nin, nvol, nex);
233 unique_ptr<RandomNumbers> rand(
new RandomNumbers_SFMT(seed));
237 rand->gauss_lex_global(field1);
241 unique_ptr<RandomNumbers> rand(
new RandomNumbers_SFMT(seed));
243 field2.reset(nin, lvol, nex);
245 double *p = field2.ptr(0);
247 if (field2.nin() % 2 == 0) {
250 for (
int j = 0, Nex = field2.nex(); j < Nex; ++j) {
251 for (
int isite = 0, Nvol = field2.nvol(); isite < Nvol; ++isite) {
252 for (
int i = 0, Nin = field2.nin(); i < Nin; i += 2) {
262 for (
int j = 0, Nex = field2.nex(); j < Nex; ++j) {
263 for (
int isite = 0, Nvol = field2.nvol(); isite < Nvol; ++isite) {
264 for (
int i = 0, Nin = field2.nin(); i < Nin; ++i) {
274 field1b.reset(nin, lvol, nex);
277 fieldio.gather(&field1b, &field1);
282 if (field1b.size() != field2.size()) {
283 vout.
crucial(vl,
"%s: field size mismatch.\n", test_name.c_str());
287 double *p1 = field1b.ptr(0);
288 double *p2 = field2.ptr(0);
290 for (
size_t i = 0, n = field2.size(); i < n; ++i) {
291 if (*p1++ != *p2++) ++err4;
296 vout.
general(vl,
"%s: serial and parallel for gaussian: err = %d\n", test_name.c_str(), err4);
300 double result = err1 + err2 + err3 + err4;
308 vout.
detailed(vl,
"check skipped: expected_result not set.\n\n");
void detailed(const char *format,...)
void general(const char *format,...)
const std::string test_name
Container of Field-type object.
FieldIO_Text class for file I/O of Field data in plain text format.
static int send_1to1(int count, double *recv_buf, double *send_buf, int p_to, int p_from, int tag)
send array of double from rank p_from to rank p_to. communication distinguished by tag...
static bool RegisterTest(const std::string &key, const Test_function func)
void crucial(const char *format,...)
int verify(const double result, const double expected, double eps)
static int size()
size of small world.
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 ¶ms_file, Parameters *params)
static int broadcast(int count, double *data, int sender)
broadcast array of double from sender.
static bool is_primary()
check if the present node is primary in small communicator.
static VerboseLevel set_verbose_level(const std::string &str)