Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
CLHEP::Ranlux64Engine Class Reference

#include <Ranlux64Engine.h>

+ Inheritance diagram for CLHEP::Ranlux64Engine:

Public Member Functions

 Ranlux64Engine (std::istream &is)
 
 Ranlux64Engine ()
 
 Ranlux64Engine (long seed, int lxr=1)
 
 Ranlux64Engine (int rowIndex, int colIndex, int lxr)
 
virtual ~Ranlux64Engine ()
 
double flat ()
 
void flatArray (const int size, double *vect)
 
void setSeed (long seed, int lxr=1)
 
void setSeeds (const long *seeds, int lxr=1)
 
void saveStatus (const char filename[]="Ranlux64.conf") const
 
void restoreStatus (const char filename[]="Ranlux64.conf")
 
void showStatus () const
 
int getLuxury () const
 
virtual std::ostream & put (std::ostream &os) const
 
virtual std::istream & get (std::istream &is)
 
virtual std::istream & getState (std::istream &is)
 
std::string name () const
 
std::vector< unsigned long > put () const
 
bool get (const std::vector< unsigned long > &v)
 
bool getState (const std::vector< unsigned long > &v)
 
- Public Member Functions inherited from CLHEP::HepRandomEngine
 HepRandomEngine ()
 
virtual ~HepRandomEngine ()
 
bool operator== (const HepRandomEngine &engine)
 
bool operator!= (const HepRandomEngine &engine)
 
long getSeed () const
 
const long * getSeeds () const
 
virtual operator double ()
 
virtual operator float ()
 
virtual operator unsigned int ()
 

Static Public Member Functions

static std::string beginTag ()
 
static std::string engineName ()
 
- Static Public Member Functions inherited from CLHEP::HepRandomEngine
static std::string beginTag ()
 
static HepRandomEnginenewEngine (std::istream &is)
 
static HepRandomEnginenewEngine (const std::vector< unsigned long > &v)
 

Static Public Attributes

static const unsigned int VECTOR_STATE_SIZE = 30
 

Additional Inherited Members

- Static Protected Member Functions inherited from CLHEP::HepRandomEngine
static double exponent_bit_32 ()
 
static double mantissa_bit_12 ()
 
static double mantissa_bit_24 ()
 
static double mantissa_bit_32 ()
 
static double twoToMinus_32 ()
 
static double twoToMinus_48 ()
 
static double twoToMinus_49 ()
 
static double twoToMinus_53 ()
 
static double nearlyTwoToMinus_54 ()
 
static bool checkFile (std::istream &file, const std::string &filename, const std::string &classname, const std::string &methodname)
 
- Protected Attributes inherited from CLHEP::HepRandomEngine
long theSeed
 
const long * theSeeds
 

Detailed Description

Author

Definition at line 48 of file Ranlux64Engine.h.

Constructor & Destructor Documentation

◆ Ranlux64Engine() [1/4]

CLHEP::Ranlux64Engine::Ranlux64Engine ( std::istream & is)

Definition at line 151 of file Ranlux64Engine.cc.

153{
154 is >> *this;
155}

◆ Ranlux64Engine() [2/4]

CLHEP::Ranlux64Engine::Ranlux64Engine ( )

Definition at line 107 of file Ranlux64Engine.cc.

109{
110 luxury = 1;
111 int numEngines = numberOfEngines++;
112 int cycle = std::abs(int(numEngines/maxIndex));
113 int curIndex = std::abs(int(numEngines%maxIndex));
114
115 long mask = ((cycle & 0x007fffff) << 8);
116 long seedlist[2];
117 HepRandom::getTheTableSeeds( seedlist, curIndex );
118 seedlist[0] ^= mask;
119 seedlist[1] = 0;
120
121 setSeeds(seedlist, luxury);
122 advance ( 8 ); // Discard some iterations and ensure that
123 // this sequence won't match one where seeds
124 // were provided.
125}
static void getTheTableSeeds(long *seeds, int index)
Definition Random.cc:254
void setSeeds(const long *seeds, int lxr=1)

◆ Ranlux64Engine() [3/4]

CLHEP::Ranlux64Engine::Ranlux64Engine ( long seed,
int lxr = 1 )

Definition at line 127 of file Ranlux64Engine.cc.

129{
130 luxury = lux;
131 long seedlist[2]={seed,0};
132 setSeeds(seedlist, lux);
133 advance ( 2*lux + 1 ); // Discard some iterations to use a different
134 // point in the sequence.
135}

◆ Ranlux64Engine() [4/4]

CLHEP::Ranlux64Engine::Ranlux64Engine ( int rowIndex,
int colIndex,
int lxr )

Definition at line 137 of file Ranlux64Engine.cc.

139{
140 luxury = lux;
141 int cycle = std::abs(int(rowIndex/maxIndex));
142 int row = std::abs(int(rowIndex%maxIndex));
143 long mask = (( cycle & 0x000007ff ) << 20 );
144 long seedlist[2];
145 HepRandom::getTheTableSeeds( seedlist, row );
146 seedlist[0] ^= mask;
147 seedlist[1]= 0;
148 setSeeds(seedlist, lux);
149}

◆ ~Ranlux64Engine()

CLHEP::Ranlux64Engine::~Ranlux64Engine ( )
virtual

Definition at line 157 of file Ranlux64Engine.cc.

157{}

Member Function Documentation

◆ beginTag()

std::string CLHEP::Ranlux64Engine::beginTag ( )
static

Definition at line 642 of file Ranlux64Engine.cc.

642 {
643 return "Ranlux64Engine-begin";
644}

◆ engineName()

static std::string CLHEP::Ranlux64Engine::engineName ( )
inlinestatic

Definition at line 91 of file Ranlux64Engine.h.

91{return "Ranlux64Engine";}

Referenced by restoreStatus().

◆ flat()

double CLHEP::Ranlux64Engine::flat ( )
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 159 of file Ranlux64Engine.cc.

159 {
160 // Luscher improves the speed by computing several numbers in a shot,
161 // in a manner similar to that of the Tausworth in DualRand or the Hurd
162 // engines. Thus, the real work is done in update(). Here we merely ensure
163 // that zero, which the algorithm can produce, is never returned by flat().
164
165 if (index <= 0) update();
166 return randoms[--index] + twoToMinus_49();
167}
static double twoToMinus_49()

Referenced by flatArray().

◆ flatArray()

void CLHEP::Ranlux64Engine::flatArray ( const int size,
double * vect )
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 376 of file Ranlux64Engine.cc.

376 {
377 for( int i=0; i < size; ++i ) {
378 vect[i] = flat();
379 }
380}

◆ get() [1/2]

bool CLHEP::Ranlux64Engine::get ( const std::vector< unsigned long > & v)
virtual

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 688 of file Ranlux64Engine.cc.

688 {
689 if ((v[0] & 0xffffffffUL) != engineIDulong<Ranlux64Engine>()) {
690 std::cerr <<
691 "\nRanlux64Engine get:state vector has wrong ID word - state unchanged\n";
692 return false;
693 }
694 return getState(v);
695}
virtual std::istream & getState(std::istream &is)
unsigned long engineIDulong()

◆ get() [2/2]

std::istream & CLHEP::Ranlux64Engine::get ( std::istream & is)
virtual

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 624 of file Ranlux64Engine.cc.

625{
626 char beginMarker [MarkerLen];
627 is >> std::ws;
628 is.width(MarkerLen); // causes the next read to the char* to be <=
629 // that many bytes, INCLUDING A TERMINATION \0
630 // (Stroustrup, section 21.3.2)
631 is >> beginMarker;
632 if (strcmp(beginMarker,"Ranlux64Engine-begin")) {
633 is.clear(std::ios::badbit | is.rdstate());
634 std::cerr << "\nInput stream mispositioned or"
635 << "\nRanlux64Engine state description missing or"
636 << "\nwrong engine type found." << std::endl;
637 return is;
638 }
639 return getState(is);
640}

◆ getLuxury()

int CLHEP::Ranlux64Engine::getLuxury ( ) const
inline

Definition at line 82 of file Ranlux64Engine.h.

82{ return luxury; }

Referenced by G4WorkerRunManager::G4WorkerRunManager().

◆ getState() [1/2]

bool CLHEP::Ranlux64Engine::getState ( const std::vector< unsigned long > & v)
virtual

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 697 of file Ranlux64Engine.cc.

697 {
698 if (v.size() != VECTOR_STATE_SIZE ) {
699 std::cerr <<
700 "\nRanlux64Engine get:state vector has wrong length - state unchanged\n";
701 return false;
702 }
703 std::vector<unsigned long> t(2);
704 for (int i=0; i<12; ++i) {
705 t[0] = v[2*i+1]; t[1] = v[2*i+2];
706 randoms[i] = DoubConv::longs2double(t);
707 }
708 t[0] = v[25]; t[1] = v[26];
709 carry = DoubConv::longs2double(t);
710 index = (int)v[27];
711 luxury = (int)v[28];
712 pDiscard = (int)v[29];
713 return true;
714}
static double longs2double(const std::vector< unsigned long > &v)
Definition DoubConv.cc:110
static const unsigned int VECTOR_STATE_SIZE

◆ getState() [2/2]

std::istream & CLHEP::Ranlux64Engine::getState ( std::istream & is)
virtual

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 646 of file Ranlux64Engine.cc.

647{
648 if ( possibleKeywordInput ( is, "Uvec", theSeed ) ) {
649 std::vector<unsigned long> v;
650 unsigned long uu;
651 for (unsigned int ivec=0; ivec < VECTOR_STATE_SIZE; ++ivec) {
652 is >> uu;
653 if (!is) {
654 is.clear(std::ios::badbit | is.rdstate());
655 std::cerr << "\nRanlux64Engine state (vector) description improper."
656 << "\ngetState() has failed."
657 << "\nInput stream is probably mispositioned now." << std::endl;
658 return is;
659 }
660 v.push_back(uu);
661 }
662 getState(v);
663 return (is);
664 }
665
666// is >> theSeed; Removed, encompassed by possibleKeywordInput()
667
668 char endMarker [MarkerLen];
669 for (int i=0; i<12; ++i) {
670 is >> randoms[i];
671 }
672 is >> carry; is >> index;
673 is >> luxury; is >> pDiscard;
674 pDozens = pDiscard / 12;
675 endIters = pDiscard % 12;
676 is >> std::ws;
677 is.width(MarkerLen);
678 is >> endMarker;
679 if (strcmp(endMarker,"Ranlux64Engine-end")) {
680 is.clear(std::ios::badbit | is.rdstate());
681 std::cerr << "\nRanlux64Engine state description incomplete."
682 << "\nInput stream is probably mispositioned now." << std::endl;
683 return is;
684 }
685 return is;
686}
bool possibleKeywordInput(IS &is, const std::string &key, T &t)

Referenced by get(), get(), getState(), and restoreStatus().

◆ name()

std::string CLHEP::Ranlux64Engine::name ( ) const
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 105 of file Ranlux64Engine.cc.

105{return "Ranlux64Engine";}

◆ put() [1/2]

std::vector< unsigned long > CLHEP::Ranlux64Engine::put ( ) const
virtual

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 608 of file Ranlux64Engine.cc.

608 {
609 std::vector<unsigned long> v;
610 v.push_back (engineIDulong<Ranlux64Engine>());
611 std::vector<unsigned long> t;
612 for (int i=0; i<12; ++i) {
613 t = DoubConv::dto2longs(randoms[i]);
614 v.push_back(t[0]); v.push_back(t[1]);
615 }
616 t = DoubConv::dto2longs(carry);
617 v.push_back(t[0]); v.push_back(t[1]);
618 v.push_back(static_cast<unsigned long>(index));
619 v.push_back(static_cast<unsigned long>(luxury));
620 v.push_back(static_cast<unsigned long>(pDiscard));
621 return v;
622}
static std::vector< unsigned long > dto2longs(double d)
Definition DoubConv.cc:94

Referenced by put(), and saveStatus().

◆ put() [2/2]

std::ostream & CLHEP::Ranlux64Engine::put ( std::ostream & os) const
virtual

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 597 of file Ranlux64Engine.cc.

598{
599 char beginMarker[] = "Ranlux64Engine-begin";
600 os << beginMarker << "\nUvec\n";
601 std::vector<unsigned long> v = put();
602 for (unsigned int i=0; i<v.size(); ++i) {
603 os << v[i] << "\n";
604 }
605 return os;
606}
std::vector< unsigned long > put() const

◆ restoreStatus()

void CLHEP::Ranlux64Engine::restoreStatus ( const char filename[] = "Ranlux64.conf")
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 544 of file Ranlux64Engine.cc.

545{
546 std::ifstream inFile( filename, std::ios::in);
547 if (!checkFile ( inFile, filename, engineName(), "restoreStatus" )) {
548 std::cerr << " -- Engine state remains unchanged\n";
549 return;
550 }
551 if ( possibleKeywordInput ( inFile, "Uvec", theSeed ) ) {
552 std::vector<unsigned long> v;
553 unsigned long xin;
554 for (unsigned int ivec=0; ivec < VECTOR_STATE_SIZE; ++ivec) {
555 inFile >> xin;
556 if (!inFile) {
557 inFile.clear(std::ios::badbit | inFile.rdstate());
558 std::cerr << "\nJamesRandom state (vector) description improper."
559 << "\nrestoreStatus has failed."
560 << "\nInput stream is probably mispositioned now." << std::endl;
561 return;
562 }
563 v.push_back(xin);
564 }
565 getState(v);
566 return;
567 }
568
569 if (!inFile.bad() && !inFile.eof()) {
570// inFile >> theSeed; removed -- encompased by possibleKeywordInput
571 for (int i=0; i<12; ++i) {
572 inFile >> randoms[i];
573 }
574 inFile >> carry; inFile >> index;
575 inFile >> luxury; inFile >> pDiscard;
576 pDozens = pDiscard / 12;
577 endIters = pDiscard % 12;
578 }
579}
static bool checkFile(std::istream &file, const std::string &filename, const std::string &classname, const std::string &methodname)
static std::string engineName()

◆ saveStatus()

void CLHEP::Ranlux64Engine::saveStatus ( const char filename[] = "Ranlux64.conf") const
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 532 of file Ranlux64Engine.cc.

533{
534 std::ofstream outFile( filename, std::ios::out ) ;
535 if (!outFile.bad()) {
536 outFile << "Uvec\n";
537 std::vector<unsigned long> v = put();
538 for (unsigned int i=0; i<v.size(); ++i) {
539 outFile << v[i] << "\n";
540 }
541 }
542}

◆ setSeed()

void CLHEP::Ranlux64Engine::setSeed ( long seed,
int lxr = 1 )
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 382 of file Ranlux64Engine.cc.

382 {
383
384// The initialization is carried out using a Multiplicative
385// Congruential generator using formula constants of L'Ecuyer
386// as described in "A review of pseudorandom number generators"
387// (Fred James) published in Computer Physics Communications 60 (1990)
388// pages 329-344
389
390 const int ecuyer_a(53668);
391 const int ecuyer_b(40014);
392 const int ecuyer_c(12211);
393 const int ecuyer_d(2147483563);
394
395 const int lux_levels[3] = {109, 202, 397};
396 theSeed = seed;
397
398 if( (lux > 2)||(lux < 0) ){
399 pDiscard = (lux >= 12) ? (lux-12) : lux_levels[1];
400 }else{
401 pDiscard = lux_levels[luxury];
402 }
403 pDozens = pDiscard / 12;
404 endIters = pDiscard % 12;
405
406 long init_table[24];
407 long next_seed = seed;
408 long k_multiple;
409 int i;
410 next_seed &= 0xffffffff;
411 while( next_seed >= ecuyer_d ) {
412 next_seed -= ecuyer_d;
413 }
414
415 for(i = 0;i != 24;i++){
416 k_multiple = next_seed / ecuyer_a;
417 next_seed = ecuyer_b * (next_seed - k_multiple * ecuyer_a)
418 - k_multiple * ecuyer_c;
419 if(next_seed < 0) {
420 next_seed += ecuyer_d;
421 }
422 next_seed &= 0xffffffff;
423 init_table[i] = next_seed;
424 }
425 // are we on a 64bit machine?
426 if( sizeof(long) >= 8 ) {
427 int64_t topbits1, topbits2;
428#ifdef WIN32
429 topbits1 = ( (int64_t) seed >> 32) & 0xffff ;
430 topbits2 = ( (int64_t) seed >> 48) & 0xffff ;
431#else
432 topbits1 = detail::rshift<32>(seed) & 0xffff ;
433 topbits2 = detail::rshift<48>(seed) & 0xffff ;
434#endif
435 init_table[0] ^= topbits1;
436 init_table[2] ^= topbits2;
437 //std::cout << " init_table[0] " << init_table[0] << " from " << topbits1 << std::endl;
438 //std::cout << " init_table[2] " << init_table[2] << " from " << topbits2 << std::endl;
439 }
440
441 for(i = 0;i < 12; i++){
442 randoms[i] = (init_table[2*i ] ) * 2.0 * twoToMinus_32() +
443 (init_table[2*i+1] >> 15) * twoToMinus_48();
444 //if( randoms[i] < 0. || randoms[i] > 1. ) {
445 //std::cout << "setSeed: init_table " << init_table[2*i ] << std::endl;
446 //std::cout << "setSeed: init_table " << init_table[2*i+1] << std::endl;
447 //std::cout << "setSeed: random " << i << " is " << randoms[i] << std::endl;
448 //}
449 }
450
451 carry = 0.0;
452 if ( randoms[11] == 0. ) carry = twoToMinus_48();
453 // Perform an update before returning the first random number.
454 index = -1;
455
456} // setSeed()
static double twoToMinus_32()
static double twoToMinus_48()
unsigned long rshift(unsigned long value)

Referenced by setSeeds().

◆ setSeeds()

void CLHEP::Ranlux64Engine::setSeeds ( const long * seeds,
int lxr = 1 )
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 458 of file Ranlux64Engine.cc.

458 {
459// old code only uses the first long in seeds
460// setSeed( *seeds ? *seeds : 32767, lux );
461// theSeeds = seeds;
462
463// using code from Ranlux - even those are 32bit seeds,
464// that is good enough to completely differentiate the sequences
465
466 const int ecuyer_a = 53668;
467 const int ecuyer_b = 40014;
468 const int ecuyer_c = 12211;
469 const int ecuyer_d = 2147483563;
470
471 const int lux_levels[3] = {109, 202, 397};
472 const long *seedptr;
473
474 theSeeds = seeds;
475 seedptr = seeds;
476
477 if(seeds == 0){
478 setSeed(theSeed,lux);
479 theSeeds = &theSeed;
480 return;
481 }
482
483 theSeed = *seeds;
484
485// number of additional random numbers that need to be 'thrown away'
486// every 24 numbers is set using luxury level variable.
487
488 if( (lux > 2)||(lux < 0) ){
489 pDiscard = (lux >= 12) ? (lux-12) : lux_levels[1];
490 }else{
491 pDiscard = lux_levels[luxury];
492 }
493 pDozens = pDiscard / 12;
494 endIters = pDiscard % 12;
495
496 long init_table[24];
497 long next_seed = *seeds;
498 long k_multiple;
499 int i;
500
501 for( i = 0;(i != 24)&&(*seedptr != 0);i++){
502 init_table[i] = *seedptr & 0xffffffff;
503 seedptr++;
504 }
505
506 if(i != 24){
507 next_seed = init_table[i-1];
508 for(;i != 24;i++){
509 k_multiple = next_seed / ecuyer_a;
510 next_seed = ecuyer_b * (next_seed - k_multiple * ecuyer_a)
511 - k_multiple * ecuyer_c;
512 if(next_seed < 0) {
513 next_seed += ecuyer_d;
514 }
515 next_seed &= 0xffffffff;
516 init_table[i] = next_seed;
517 }
518 }
519
520 for(i = 0;i < 12; i++){
521 randoms[i] = (init_table[2*i ] ) * 2.0 * twoToMinus_32() +
522 (init_table[2*i+1] >> 15) * twoToMinus_48();
523 }
524
525 carry = 0.0;
526 if ( randoms[11] == 0. ) carry = twoToMinus_48();
527 // Perform an update before returning the first random number.
528 index = -1;
529
530}
void setSeed(long seed, int lxr=1)

Referenced by Ranlux64Engine(), Ranlux64Engine(), and Ranlux64Engine().

◆ showStatus()

void CLHEP::Ranlux64Engine::showStatus ( ) const
virtual

Implements CLHEP::HepRandomEngine.

Definition at line 581 of file Ranlux64Engine.cc.

582{
583 std::cout << std::endl;
584 std::cout << "--------- Ranlux engine status ---------" << std::endl;
585 std::cout << " Initial seed = " << theSeed << std::endl;
586 std::cout << " randoms[] = ";
587 for (int i=0; i<12; ++i) {
588 std::cout << randoms[i] << std::endl;
589 }
590 std::cout << std::endl;
591 std::cout << " carry = " << carry << ", index = " << index << std::endl;
592 std::cout << " luxury = " << luxury << " pDiscard = "
593 << pDiscard << std::endl;
594 std::cout << "----------------------------------------" << std::endl;
595}

Member Data Documentation

◆ VECTOR_STATE_SIZE

const unsigned int CLHEP::Ranlux64Engine::VECTOR_STATE_SIZE = 30
static

Definition at line 97 of file Ranlux64Engine.h.

Referenced by getState(), getState(), and restoreStatus().


The documentation for this class was generated from the following files: