Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
RanluxEngine.h
Go to the documentation of this file.
1// -*- C++ -*-
2//
3// -----------------------------------------------------------------------
4// HEP Random
5// --- RanluxEngine ---
6// class header file
7// -----------------------------------------------------------------------
8// This file is part of Geant4 (simulation toolkit for HEP).
9//
10// The algorithm for this random engine has been taken from the original
11// implementation in FORTRAN by Fred James as part of the MATHLIB HEP
12// library.
13// The initialisation is carried out using a Multiplicative Congruential
14// generator using formula constants of L'Ecuyer as described in "F.James,
15// Comp. Phys. Comm. 60 (1990) 329-344".
16
17// =======================================================================
18// Adeyemi Adesanya - Created: 6th November 1995
19// Gabriele Cosmo - Adapted & Revised: 22nd November 1995
20// Adeyemi Adesanya - Added setSeeds() method: 2nd February 1996
21// Gabriele Cosmo - Added flatArray() method: 8th February 1996
22// - Added methods for engine status: 19th November 1996
23// - Added default luxury value for setSeed()
24// and setSeeds(): 21st July 1997
25// J.Marraffino - Added stream operators and related constructor.
26// Added automatic seed selection from seed table and
27// engine counter: 14th Feb 1998
28// Ken Smith - Added conversion operators: 6th Aug 1998
29// Mark Fischler Methods put, get for instance save/restore 12/8/04
30// Mark Fischler methods for anonymous save/restore 12/27/04
31// =======================================================================
32
33#ifndef RanluxEngine_h
34#define RanluxEngine_h 1
35
37
38namespace CLHEP {
39
40/**
41 * @author
42 * @ingroup random
43 */
45
46public:
47
48 RanluxEngine( std::istream& is );
50 RanluxEngine( long seed, int lxr = 3 );
51 RanluxEngine( int rowIndex, int colIndex, int lxr );
52 virtual ~RanluxEngine();
53 // Constructors and destructor
54
55// Luxury level is set in the same way as the original FORTRAN routine.
56// level 0 (p=24): equivalent to the original RCARRY of Marsaglia
57// and Zaman, very long period, but fails many tests.
58// level 1 (p=48): considerable improvement in quality over level 0,
59// now passes the gap test, but still fails spectral test.
60// level 2 (p=97): passes all known tests, but theoretically still
61// defective.
62// level 3 (p=223): DEFAULT VALUE. Any theoretically possible
63// correlations have very small chance of being observed.
64// level 4 (p=389): highest possible luxury, all 24 bits chaotic.
65
66 double flat();
67 // It returns a pseudo random number between 0 and 1,
68 // excluding the end points.
69
70 void flatArray (const int size, double* vect);
71 // Fills the array "vect" of specified size with flat random values.
72
73 void setSeed(long seed, int lxr=3);
74 // Sets the state of the algorithm according to seed.
75
76 void setSeeds(const long * seeds, int lxr=3);
77 // Sets the state of the algorithm according to the zero terminated
78 // array of seeds. Only the first seed is used.
79
80 void saveStatus( const char filename[] = "Ranlux.conf" ) const;
81 // Saves on file Ranlux.conf the current engine status.
82
83 void restoreStatus( const char filename[] = "Ranlux.conf" );
84 // Reads from file Ranlux.conf the last saved engine status
85 // and restores it.
86
87 void showStatus() const;
88 // Dumps the engine status on the screen.
89
90 int getLuxury() const { return luxury; }
91 // Gets the luxury level.
92
93 operator double(); // Returns same as flat()
94 operator float(); // less precise flat, faster if possible
95 operator unsigned int(); // 32-bit flat, but slower than double or float
96
97 virtual std::ostream & put (std::ostream & os) const;
98 virtual std::istream & get (std::istream & is);
99 static std::string beginTag ( );
100 virtual std::istream & getState ( std::istream & is );
101
102 std::string name() const;
103 static std::string engineName() {return "RanluxEngine";}
104
105 std::vector<unsigned long> put () const;
106 bool get (const std::vector<unsigned long> & v);
107 bool getState (const std::vector<unsigned long> & v);
108
109 static const unsigned int VECTOR_STATE_SIZE = 31;
110
111private:
112
113 int nskip, luxury;
114 float float_seed_table[24];
115 int i_lag,j_lag;
116 float carry;
117 int count24;
118 static const int int_modulus = 0x1000000;
119};
120
121} // namespace CLHEP
122
123#endif
static const unsigned int VECTOR_STATE_SIZE
Definition: RanluxEngine.h:109
void flatArray(const int size, double *vect)
std::string name() const
Definition: RanluxEngine.cc:63
void setSeeds(const long *seeds, int lxr=3)
virtual std::istream & getState(std::istream &is)
void saveStatus(const char filename[]="Ranlux.conf") const
std::vector< unsigned long > put() const
static std::string beginTag()
virtual std::istream & get(std::istream &is)
void showStatus() const
int getLuxury() const
Definition: RanluxEngine.h:90
void restoreStatus(const char filename[]="Ranlux.conf")
static std::string engineName()
Definition: RanluxEngine.h:103
void setSeed(long seed, int lxr=3)
Definition: DoubConv.h:17