33 #include "CLHEP/Random/defs.h"
34 #include "CLHEP/Random/Random.h"
35 #include "CLHEP/Random/DRand48Engine.h"
36 #include "CLHEP/Random/RandomFunc.h"
37 #include "CLHEP/Random/engineIDulong.h"
45 static const int MarkerLen = 64;
47 int DRand48Engine::numEngines = 0;
52 int DRand48Engine::maxIndex = 215;
67 int cycle = abs(
int(numEngines/maxIndex));
68 int curIndex = abs(
int(numEngines%maxIndex));
70 long mask = ((cycle & 0x007fffff) << 8);
83 int cycle = abs(
int(rowIndex/maxIndex));
84 int row = abs(
int(rowIndex%maxIndex));
85 int col = abs(
int(colIndex%2));
86 long mask = ((cycle & 0x000007ff) << 20);
88 seed = (
seeds[col])^mask;
115 std::ofstream outFile( filename, std::ios::out ) ;
117 if (!outFile.bad()) {
119 std::vector<unsigned long>
v =
put();
121 std::cout <<
"Result of v = put() is:\n";
123 for (
unsigned int i=0;
i<
v.size(); ++
i) {
124 outFile <<
v[
i] <<
"\n";
126 std::cout <<
v[
i] <<
" ";
127 if (
i%6==0) std::cout <<
"\n";
136 unsigned short dummy[] = { 0, 0, 0 };
137 unsigned short* cseed =
seed48(dummy);
138 if (!outFile.bad()) {
139 outFile <<
theSeed << std::endl;
140 for (
int i=0;
i<3; ++
i) {
141 outFile << cseed[
i] << std::endl;
152 unsigned short cseed[3];
155 std::cerr <<
" -- Engine state remains unchanged\n";
159 std::vector<unsigned long>
v;
164 std::cout <<
"ivec = " << ivec <<
" xin = " << xin <<
" ";
165 if (ivec%3 == 0) std::cout <<
"\n";
168 inFile.clear(std::ios::badbit | inFile.rdstate());
169 std::cerr <<
"\nDRand48Engine state (vector) description improper."
170 <<
"\nrestoreStatus has failed."
171 <<
"\nInput stream is probably mispositioned now." << std::endl;
180 if (!inFile.bad() && !inFile.eof()) {
182 for (
int i=0;
i<3; ++
i)
190 unsigned short dummy[] = { 0, 0, 0 };
191 unsigned short* cseed =
seed48(dummy);
192 std::cout << std::endl;
193 std::cout <<
"-------- DRand48 engine status ---------" << std::endl;
194 std::cout <<
" Initial seed = " <<
theSeed << std::endl;
195 std::cout <<
" Current seeds = " << cseed[0] <<
", ";
196 std::cout << cseed[1] <<
", ";
197 std::cout << cseed[2] << std::endl;
198 std::cout <<
"----------------------------------------" << std::endl;
199 for (
int i=0;
i<3; ++
i)
223 char beginMarker[] =
"DRand48Engine-begin";
224 os << beginMarker <<
"\nUvec\n";
225 std::vector<unsigned long>
v =
put();
226 for (
unsigned int i=0;
i<
v.size(); ++
i) {
232 unsigned short dummy[] = { 0, 0, 0 };
233 unsigned short* cseed =
seed48(dummy);
234 char endMarker[] =
"DRand48Engine-end";
235 os <<
" " << beginMarker <<
" ";
237 for (
int i=0;
i<3; ++
i) {
239 os << cseed[
i] <<
" ";
241 os << endMarker <<
" ";
248 std::vector<unsigned long>
v;
249 v.push_back (engineIDulong<DRand48Engine>());
250 unsigned short dummy[] = { 0, 0, 0 };
251 unsigned short* cseed =
seed48(dummy);
252 for (
int i=0;
i<3; ++
i) {
254 v.push_back (
static_cast<unsigned long>(cseed[
i]));
262 char beginMarker [MarkerLen];
268 if (strcmp(beginMarker,
"DRand48Engine-begin")) {
269 is.clear(std::ios::badbit |
is.rdstate());
270 std::cerr <<
"\nInput stream mispositioned or"
271 <<
"\nDRand48Engine state description missing or"
272 <<
"\nwrong engine type found." << std::endl;
279 return "DRand48Engine-begin";
284 unsigned short cseed[3];
286 std::vector<unsigned long>
v;
289 std::cout <<
"DRand48Engine::getState detected Uvec keyword\n";
296 std::cout <<
"ivec = " << ivec <<
" uu = " << uu <<
"\n";
299 is.clear(std::ios::badbit |
is.rdstate());
300 std::cerr <<
"\nDRand48Engine state (vector) description improper."
301 <<
"\ngetState() has failed."
302 <<
"\nInput stream is probably mispositioned now." << std::endl;
313 char endMarker [MarkerLen];
315 for (
int i=1;
i<3; ++
i) {
321 if (strcmp(endMarker,
"DRand48Engine-end")) {
322 is.clear(std::ios::badbit |
is.rdstate());
323 std::cerr <<
"\nDRand48Engine state description incomplete."
324 <<
"\nInput stream is probably mispositioned now." << std::endl;
332 if ((
v[0] & 0xffffffffUL) != engineIDulong<DRand48Engine>()) {
334 "\nDRand48Engine get:state vector has wrong ID word - state unchanged\n";
343 "\nDRand48Engine getState:state vector has wrong length - state unchanged\n";
346 unsigned short cseed[3];
347 for (
int i=0;
i<3; ++
i) {
348 cseed[
i] =
static_cast<unsigned short>(
v[
i+1]);