5 #include "CLHEP/Random/Random.h"
7 #include "CLHEP/Random/engineIDulong.h"
22 dsfmt_init_gen_rand (dsfmt, seed);
30 dsfmt_init_by_array (dsfmt, seeds_nc, key_length);
39 static const int MarkerLen = 64;
43 std::atomic<int> dSFMTEngine::numEngines = 0;
47 dSFMTEngine::dSFMTEngine():m_dsfmt(0)
53 int curIndex = abs(
int(engineNum%
maxIndex));
56 HepRandom::getTheTableSeeds( seedlist, curIndex );
57 seedlist[0] = (seedlist[0])^
mask;
81 int err=posix_memalign((
void**)&
m_dsfmt,16,
sizeof(dsfmt_t));
84 std::stringstream errstring;
85 errstring <<
"dSFMTEngine::init_dsfmt() : could not allocate memory for dsfmt data structure, error=" <<
err;
86 throw std::runtime_error(errstring.str());
131 const int numBuff=DSFMT_N;
132 while (
i < numBuff && seeds[
i]) {
146 const int numBuff=DSFMT_N;
148 while (
i < numBuff && seeds[
i]) {
163 for (
int i=0;
i<DSFMT_N + 1; ++
i)
outFile <<std::setprecision(20)
174 std::cerr <<
" -- Engine state remains unchanged\n";
180 for (
int i=0; i<DSFMT_N + 1; ++i) inFile >>
m_dsfmt->status[
i].u32[0] >>
m_dsfmt->status[
i].u32[1]
188 std::cout <<
"--------- dSFMT engine status ---------\n";
189 int pr = std::cout.precision();
190 std::cout.precision(20);
191 std::cout <<
" Current index = " <<
m_dsfmt->idx <<
"\n";
192 std::cout <<
" Array status[] = \n";
193 for (
int i=0;
i<DSFMT_N + 1; ++
i) {
194 std::cout <<
m_dsfmt->status[
i].u32[0] <<
" " <<
m_dsfmt->status[
i].u32[1] <<
" "
197 std::cout <<
"----------------------------------------" << std::endl;
198 std::cout.precision(
pr);
202 return (
float)flat();
205 dSFMTEngine::operator
unsigned int() {
206 return dsfmt_genrand_uint32(m_dsfmt);
211 char beginMarker[] =
"dSFMTEngine-begin";
212 char endMarker[] =
"dSFMTEngine-end";
214 int pr =
os.precision(20);
215 os <<
" " << beginMarker <<
" ";
217 for (
int i=0;
i<DSFMT_N + 1; ++
i) {
223 os << endMarker <<
"\n";
229 std::vector<unsigned long>
v;
230 v.push_back (engineIDulong<dSFMTEngine>());
232 for (
int i=0;
i<DSFMT_N + 1; ++
i) {
233 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[
i].u32[0]));
234 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[
i].u32[1]));
235 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[
i].u32[2]));
236 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[
i].u32[3]));
243 char beginMarker [MarkerLen];
249 if (strcmp(beginMarker,
"dSFMTEngine-begin")) {
250 is.clear(std::ios::badbit | is.rdstate());
251 std::cerr <<
"\nInput stream mispositioned or"
252 <<
"\ndSFMTEngine state description missing or"
253 <<
"\nwrong engine type found." << std::endl;
260 return "dSFMTEngine-begin";
265 char endMarker [MarkerLen];
268 for (
int i=0;
i<DSFMT_N + 1; ++
i) {
278 if (strcmp(endMarker,
"dSFMTEngine-end")) {
279 is.clear(std::ios::badbit | is.rdstate());
280 std::cerr <<
"\ndSFMTEngine state description incomplete."
281 <<
"\nInput stream is probably mispositioned now." << std::endl;
288 if ((
v[0] & 0xffffffffUL) != engineIDulong<dSFMTEngine>()) {
290 "\ndSFMTEngine get:state vector has wrong ID word - state unchanged\n";
299 "\ndSFMTEngine get:state vector has wrong length - state unchanged\n";
304 for (
int i=0;
i<DSFMT_N + 1; ++
i) {