Geant4 10.7.0
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 lux=1)
 
 Ranlux64Engine (int rowIndex, int colIndex, int lux)
 
virtual ~Ranlux64Engine ()
 
double flat ()
 
void flatArray (const int size, double *vect)
 
void setSeed (long seed, int lux=1)
 
void setSeeds (const long *seeds, int lux=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)
 
virtual double flat ()=0
 
virtual void flatArray (const int size, double *vect)=0
 
virtual void setSeed (long seed, int)=0
 
virtual void setSeeds (const long *seeds, int)=0
 
virtual void saveStatus (const char filename[]="Config.conf") const =0
 
virtual void restoreStatus (const char filename[]="Config.conf")=0
 
virtual void showStatus () const =0
 
virtual std::string name () const =0
 
virtual std::ostream & put (std::ostream &os) const
 
virtual std::istream & get (std::istream &is)
 
virtual std::istream & getState (std::istream &is)
 
virtual std::vector< unsigned long > put () const
 
virtual bool get (const std::vector< unsigned long > &v)
 
virtual bool getState (const std::vector< unsigned long > &v)
 
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 lux=1)

◆ Ranlux64Engine() [3/4]

CLHEP::Ranlux64Engine::Ranlux64Engine ( long  seed,
int  lux = 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  lux 
)

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 640 of file Ranlux64Engine.cc.

640 {
641 return "Ranlux64Engine-begin";
642}

◆ 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 686 of file Ranlux64Engine.cc.

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

◆ get() [2/2]

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

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 622 of file Ranlux64Engine.cc.

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

◆ getLuxury()

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

Definition at line 82 of file Ranlux64Engine.h.

82{ return luxury; }

Referenced by G4UserWorkerThreadInitialization::SetupRNGEngine().

◆ getState() [1/2]

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

Reimplemented from CLHEP::HepRandomEngine.

Definition at line 695 of file Ranlux64Engine.cc.

695 {
696 if (v.size() != VECTOR_STATE_SIZE ) {
697 std::cerr <<
698 "\nRanlux64Engine get:state vector has wrong length - state unchanged\n";
699 return false;
700 }
701 std::vector<unsigned long> t(2);
702 for (int i=0; i<12; ++i) {
703 t[0] = v[2*i+1]; t[1] = v[2*i+2];
704 randoms[i] = DoubConv::longs2double(t);
705 }
706 t[0] = v[25]; t[1] = v[26];
707 carry = DoubConv::longs2double(t);
708 index = v[27];
709 luxury = v[28];
710 pDiscard = v[29];
711 return true;
712}
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 644 of file Ranlux64Engine.cc.

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

Referenced by 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 606 of file Ranlux64Engine.cc.

606 {
607 std::vector<unsigned long> v;
608 v.push_back (engineIDulong<Ranlux64Engine>());
609 std::vector<unsigned long> t;
610 for (int i=0; i<12; ++i) {
611 t = DoubConv::dto2longs(randoms[i]);
612 v.push_back(t[0]); v.push_back(t[1]);
613 }
614 t = DoubConv::dto2longs(carry);
615 v.push_back(t[0]); v.push_back(t[1]);
616 v.push_back(static_cast<unsigned long>(index));
617 v.push_back(static_cast<unsigned long>(luxury));
618 v.push_back(static_cast<unsigned long>(pDiscard));
619 return v;
620}
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 595 of file Ranlux64Engine.cc.

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

◆ restoreStatus()

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

Implements CLHEP::HepRandomEngine.

Definition at line 542 of file Ranlux64Engine.cc.

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

◆ saveStatus()

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

Implements CLHEP::HepRandomEngine.

Definition at line 530 of file Ranlux64Engine.cc.

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

◆ setSeed()

void CLHEP::Ranlux64Engine::setSeed ( long  seed,
int  lux = 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 index = 11;
454
455} // setSeed()
static double twoToMinus_32()
static double twoToMinus_48()

Referenced by setSeeds().

◆ setSeeds()

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

Implements CLHEP::HepRandomEngine.

Definition at line 457 of file Ranlux64Engine.cc.

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

Referenced by Ranlux64Engine().

◆ showStatus()

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

Implements CLHEP::HepRandomEngine.

Definition at line 579 of file Ranlux64Engine.cc.

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

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(), and restoreStatus().


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