Geant4 Cross Reference |
1 // -*- C++ -*- 1 // -*- C++ -*- 2 // 2 // 3 // ------------------------------------------- 3 // ----------------------------------------------------------------------- 4 // Hep Random 4 // Hep Random 5 // --- DualRand --- 5 // --- DualRand --- 6 // class header file 6 // class header file 7 // ------------------------------------------- 7 // ----------------------------------------------------------------------- 8 // 8 // 9 // Canopy random number generator DualRand 9 // Canopy random number generator DualRand 10 // Re-written as C++ routine for 32-bit ints 10 // Re-written as C++ routine for 32-bit ints MF 1/26/98 11 // 11 // 12 // Exclusive or of a feedback shift register 12 // Exclusive or of a feedback shift register and integer congruence 13 // random number generator. The feedback shi 13 // random number generator. The feedback shift register uses offsets 14 // 127 and 97. The integer congruence genera 14 // 127 and 97. The integer congruence generator uses a different 15 // multiplier for each stream. The multiplie 15 // multiplier for each stream. The multipliers are chosen to give 16 // full period and maximum "potency" for modu 16 // full period and maximum "potency" for modulo 2^32. The period of 17 // the combined random number generator is 2^ 17 // the combined random number generator is 2^159 - 2^32, and the 18 // sequences are different for each stream (n 18 // sequences are different for each stream (not just started in a 19 // different place). 19 // different place). 20 // 20 // 21 // =========================================== 21 // ======================================================================= 22 // Canopy random number generator DualRand. 22 // Canopy random number generator DualRand. 23 // Doug Toussaint 5/25/88 23 // Doug Toussaint 5/25/88 24 // Optimized by GMH 7/26/88 24 // Optimized by GMH 7/26/88 25 // Optimized by GMH 7/26/88 25 // Optimized by GMH 7/26/88 26 // Repaired by GMH 12/1/88 to update modular 26 // Repaired by GMH 12/1/88 to update modular congruence state 27 // Put into ranlib by GMH 6/23/89 27 // Put into ranlib by GMH 6/23/89 28 // Re-written as C++ routine for 32-bit ints 28 // Re-written as C++ routine for 32-bit ints MF 1/26/98 29 // Re-written for CLHEP package KLS 6/0 29 // Re-written for CLHEP package KLS 6/04/98 30 // Removed pow() from flat method for speed K 30 // Removed pow() from flat method for speed KLS 7/21/98 31 // Ken Smith - Added conversion operators: 31 // Ken Smith - Added conversion operators: 6th Aug 1998 32 // Mark Fischler methods for distrib. inst 32 // Mark Fischler methods for distrib. instance save/restore 12/8/04 33 // Mark Fischler methods for anonymous sav 33 // Mark Fischler methods for anonymous save/restore 12/27/04 34 // Mark Fischler - methods for vector save/re 34 // Mark Fischler - methods for vector save/restore 3/7/05 35 // =========================================== 35 // ======================================================================= 36 36 37 37 38 #ifndef DualRand_h 38 #ifndef DualRand_h 39 #define DualRand_h 39 #define DualRand_h 40 40 41 #include "CLHEP/Random/RandomEngine.h" 41 #include "CLHEP/Random/RandomEngine.h" 42 42 43 namespace CLHEP { 43 namespace CLHEP { 44 44 45 /** 45 /** 46 * @author 46 * @author 47 * @ingroup random 47 * @ingroup random 48 */ 48 */ 49 class DualRand: public HepRandomEngine { 49 class DualRand: public HepRandomEngine { 50 50 51 public: 51 public: 52 52 53 DualRand(); 53 DualRand(); 54 DualRand(long seed); 54 DualRand(long seed); 55 DualRand(std::istream & is); 55 DualRand(std::istream & is); 56 DualRand(int rowIndex, int colIndex); 56 DualRand(int rowIndex, int colIndex); 57 virtual ~DualRand(); 57 virtual ~DualRand(); 58 58 59 // let the compiler generate the copy constr 59 // let the compiler generate the copy constructors 60 //DualRand(const DualRand & p); 60 //DualRand(const DualRand & p); 61 //DualRand & operator=(const DualRand & p); 61 //DualRand & operator=(const DualRand & p); 62 62 63 double flat(); 63 double flat(); 64 // Returns a pseudo random number between 0 64 // Returns a pseudo random number between 0 and 1 65 // (excluding the end points) 65 // (excluding the end points) 66 66 67 void flatArray(const int size, double * vect 67 void flatArray(const int size, double * vect); 68 // Fills an array "vect" of specified size w 68 // Fills an array "vect" of specified size with flat random values. 69 69 70 void setSeed(long seed, int); 70 void setSeed(long seed, int); 71 // Sets the state of the algorithm according 71 // Sets the state of the algorithm according to seed. 72 72 73 void setSeeds(const long * seeds, int); 73 void setSeeds(const long * seeds, int); 74 // Sets the state of the algorithm according 74 // Sets the state of the algorithm according to the zero-terminated 75 // array of seeds. 75 // array of seeds. 76 76 77 void saveStatus( const char filename[] = "Du 77 void saveStatus( const char filename[] = "DualRand.conf") const; 78 // Saves on named file the current engine st 78 // Saves on named file the current engine status. 79 79 80 void restoreStatus( const char filename[] = 80 void restoreStatus( const char filename[] = "DualRand.conf" ); 81 // Reads from named file the last saved engi 81 // Reads from named file the last saved engine status and restores it. 82 82 83 void showStatus() const; 83 void showStatus() const; 84 // Dumps the current engine status on the sc 84 // Dumps the current engine status on the screen. 85 85 86 operator double(); // Returns same as 86 operator double(); // Returns same as flat() 87 operator float(); // flat value, wit 87 operator float(); // flat value, without worrying about filling bits 88 operator unsigned int(); // 32-bit flat val 88 operator unsigned int(); // 32-bit flat value, quickest of all 89 89 90 virtual std::ostream & put (std::ostream & o 90 virtual std::ostream & put (std::ostream & os) const; 91 virtual std::istream & get (std::istream & i 91 virtual std::istream & get (std::istream & is); 92 static std::string beginTag ( ); 92 static std::string beginTag ( ); 93 virtual std::istream & getState ( std::istre 93 virtual std::istream & getState ( std::istream & is ); 94 94 95 std::string name() const; 95 std::string name() const; 96 static std::string engineName() {return "Dua 96 static std::string engineName() {return "DualRand";} 97 97 98 std::vector<unsigned long> put () const; 98 std::vector<unsigned long> put () const; 99 bool get (const std::vector<unsigned long> & 99 bool get (const std::vector<unsigned long> & v); 100 bool getState (const std::vector<unsigned lo 100 bool getState (const std::vector<unsigned long> & v); 101 101 102 static const unsigned int VECTOR_STATE_SIZE 102 static const unsigned int VECTOR_STATE_SIZE = 9; 103 103 104 private: 104 private: 105 105 106 // This generator is composed of two others 106 // This generator is composed of two others combined: 107 107 108 class Tausworthe { 108 class Tausworthe { 109 public: 109 public: 110 Tausworthe(); 110 Tausworthe(); 111 Tausworthe(unsigned int seed); 111 Tausworthe(unsigned int seed); 112 operator unsigned int(); 112 operator unsigned int(); 113 void put(std::ostream & os) const; 113 void put(std::ostream & os) const; 114 void put(std::vector<unsigned long> & v) c 114 void put(std::vector<unsigned long> & v) const; 115 void get(std::istream & is); 115 void get(std::istream & is); 116 bool get(std::vector<unsigned long>::const 116 bool get(std::vector<unsigned long>::const_iterator & iv); 117 private: 117 private: 118 int wordIndex; 118 int wordIndex; 119 unsigned int words[4]; 119 unsigned int words[4]; 120 }; // Tausworthe 120 }; // Tausworthe 121 121 122 class IntegerCong { 122 class IntegerCong { 123 public: 123 public: 124 IntegerCong(); 124 IntegerCong(); 125 IntegerCong(unsigned int seed, int streamN 125 IntegerCong(unsigned int seed, int streamNumber); 126 operator unsigned int(); 126 operator unsigned int(); 127 void put(std::ostream & os) const; 127 void put(std::ostream & os) const; 128 void put(std::vector<unsigned long> & v) c 128 void put(std::vector<unsigned long> & v) const; 129 void get(std::istream & is); 129 void get(std::istream & is); 130 bool get(std::vector<unsigned long>::const 130 bool get(std::vector<unsigned long>::const_iterator & iv); 131 private: 131 private: 132 unsigned int state, multiplier, addend; 132 unsigned int state, multiplier, addend; 133 }; // IntegerCong 133 }; // IntegerCong 134 134 135 int numEngines; 135 int numEngines; 136 Tausworthe tausworthe; 136 Tausworthe tausworthe; 137 IntegerCong integerCong; 137 IntegerCong integerCong; 138 138 139 }; // DualRand 139 }; // DualRand 140 140 141 } // namespace CLHEP 141 } // namespace CLHEP 142 142 143 #endif // DualRand_h 143 #endif // DualRand_h 144 144