Bridge++  Ver. 1.3.x
test_RandomNumbers_SFMT_GaussianField.cpp
Go to the documentation of this file.
1 
14 #ifdef USE_SFMTLIB
15 
16 #include "test.h"
17 
18 #include "randomNumbers_SFMT.h"
19 
20 //====================================================================
22 
31 namespace Test_RandomNumbers_SFMT {
32  const std::string test_name = "RandomNumbers.SFMT.GaussianField";
33 
34  //- test-private parameters
35  namespace {
36  const std::string filename_input = "test_RandomNumbers_SFMT_GaussianField.yaml";
37  const std::string filename_output = "stdout";
38 
39  class Parameters_Test_RandomNumbers : public Parameters {
40  public:
41  Parameters_Test_RandomNumbers()
42  {
43  Register_int("seed", 0);
44 
45  Register_string("verbose_level", "NULL");
46 
47  Register_double("expected_result", 0.0);
48  }
49  };
50  }
51 
52  //- prototype declaration
53  int gaussian_field(void);
54 
55 #ifdef USE_TESTMANAGER_AUTOREGISTER
56  namespace {
57  static const bool is_registered = TestManager::RegisterTest(
58  test_name,
60  );
61  }
62 #endif
63 
64  //====================================================================
65  int gaussian_field(void)
66  {
67  // #### parameter setup ####
68  unique_ptr<Parameters> params_test(new Parameters_Test_RandomNumbers);
69  unique_ptr<Parameters> params_all(new Parameters);
70 
71  params_all->Register_Parameters("Test_RandomNumbers", params_test);
72 
73  ParameterManager::read(filename_input, params_all);
74 
75  int iseed = params_test->get_int("seed");
76  const string str_vlevel = params_test->get_string("verbose_level");
77 
78  const bool do_check = params_test->is_set("expected_result");
79  const double expected_result = do_check ? params_test->get_double("expected_result") : 0.0;
80 
82 
83  //- print input parameters
84  vout.general(vl, " iseed = %d\n", iseed);
85  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
86  vout.general(vl, "\n");
87 
88 
89  // #### object setup ####
90  unique_ptr<RandomNumbers> rand(new RandomNumbers_SFMT(iseed));
91  unique_ptr<Timer> timer(new Timer(test_name));
92 
93 
94  // #### Execution main part ####
95  timer->start();
96 
97  int Nin = 29;
98  int Nvol = CommonParameters::Nvol();
99  int Nex = 33;
100  Field v(Nin, Nvol, Nex);
101 
102  double av = 0.0;
103  double vr = 0.0;
104 
105  rand->gauss_lex_global(v);
106 
107  int size = v.size();
108  for (int i = 0; i < size; ++i) {
109  av += v.cmp(i);
110  vr += v.cmp(i) * v.cmp(i);
111  // vout.general(vl, " %10.8f\n",v.cmp(i));
112  }
113 
114  double av_all = Communicator::reduce_sum(av);
115  double vr_all = Communicator::reduce_sum(vr);
116 
117  int global_size = CommonParameters::Lvol() * Nin * Nex;
118 
119  av = av_all / global_size;
120  vr = vr_all / global_size - av * av;
121  vr = sqrt(vr);
122 
123  vout.general(vl, "\n");
124  vout.general(vl, "Gaussian distribution (Field):\n");
125  vout.general(vl, " number of samples = %10d\n", size);
126  vout.general(vl, " average = %10.8f\n", av);
127  vout.general(vl, " variance = %10.8f\n", vr);
128  vout.general(vl, " variance(expect) = %10.8f\n", 1.0 / sqrt(2.0));
129 
130  double result = vr;
131 
132  timer->report();
133 
134  printf("result = %24.20f\n", result);
135 
136 
137  if (do_check) {
138  return Test::verify(result, expected_result);
139  } else {
140  vout.detailed(vl, "check skipped: expected_result not set.\n\n");
141  return EXIT_SKIP;
142  }
143  }
144 } // namespace Test_RandomNumbers
145 #endif // USE_SFMTLIB
#define EXIT_SKIP
Definition: test.h:17
BridgeIO vout
Definition: bridgeIO.cpp:278
void detailed(const char *format,...)
Definition: bridgeIO.cpp:82
void general(const char *format,...)
Definition: bridgeIO.cpp:65
const std::string test_name
Container of Field-type object.
Definition: field.h:39
Class for parameters.
Definition: parameters.h:38
static int Lvol()
static bool RegisterTest(const std::string &key, const Test_function func)
Definition: testManager.h:80
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
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28