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