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
Ranlux64Engine.h
Go to the documentation of this file.
1// $Id:$
2// -*- C++ -*-
3//
4// -----------------------------------------------------------------------
5// HEP Random
6// --- Ranlux64Engine ---
7// class header file
8// -----------------------------------------------------------------------
9// The algorithm for this random engine has been taken from the notes of
10// a double-precision ranlux implementation by Martin Luscher, dated
11// November 1997.
12//
13// Like the previous ranlux generator, this one also has "luxury" levels,
14// determining how many pseudo-random numbers are discarded for every
15// twelve values used. Three levels are given, with the note that Luscher
16// himself advocates only the highest two levels for this engine.
17// level 0 (p=109): Throw away 109 values for every 12 used
18// level 1 (p=202): (default) Throw away 202 values for every 12 used
19// level 2 (p=397): Throw away 397 values for every 12 used
20//
21// The initialization is carried out using a Multiplicative Congruential
22// generator using formula constants of L'Ecuyer as described in "F.James,
23// Comp. Phys. Comm. 60 (1990) 329-344".
24// =======================================================================
25// Ken Smith - Created Initial draft: 14th Jul 1998
26// - Added conversion operators: 6th Aug 1998
27// Mark Fischler
28// 9/9/98 - Added update() routine to allow computation of many at once
29// - Replaced algorithm with jone exactly matching Luscher:
30// 48-bits generated
31// skip n-12 instead of n numbers
32// - Corrected protection agains overflow
33// 12/8/04 - Methods for instance save/restore
34// 12/27/04 - methods for anonymous save/restore 12/27/04
35//
36// =======================================================================
37
38#ifndef Ranlux64Engine_h
39#define Ranlux64Engine_h
40
42
43namespace CLHEP {
44
45/**
46 * @author
47 * @ingroup random
48 */
50
51public:
52
53 Ranlux64Engine( std::istream& is );
55 Ranlux64Engine( long seed, int lux = 1 );
56 Ranlux64Engine( int rowIndex, int colIndex, int lux );
57 virtual ~Ranlux64Engine();
58 // Constructors and destructor
59
60 double flat();
61 // It returns a pseudo random number between 0 and 1,
62 // excluding the end points.
63
64 void flatArray (const int size, double* vect);
65 // Fills the array "vect" of specified size with flat random values.
66
67 void setSeed(long seed, int lux=1);
68 // Sets the state of the algorithm according to seed.
69
70 void setSeeds(const long * seeds, int lux=1);
71 // Sets the state of the algorithm according to the zero terminated
72 // array of seeds. Only the first seed is used.
73
74 void saveStatus( const char filename[] = "Ranlux64.conf" ) const;
75 // Saves in named file the current engine status.
76
77 void restoreStatus( const char filename[] = "Ranlux64.conf" );
78 // Reads from named file the last saved engine status and restores it.
79
80 void showStatus() const;
81 // Dumps the engine status on the screen.
82
83 int getLuxury() const { return luxury; }
84 // Gets the luxury level.
85
86 virtual std::ostream & put (std::ostream & os) const;
87 virtual std::istream & get (std::istream & is);
88 static std::string beginTag ( );
89 virtual std::istream & getState ( std::istream & is );
90
91 std::string name() const;
92 static std::string engineName() {return "Ranlux64Engine";}
93
94 std::vector<unsigned long> put () const;
95 bool get (const std::vector<unsigned long> & v);
96 bool getState (const std::vector<unsigned long> & v);
97
98 static const unsigned int VECTOR_STATE_SIZE = 30;
99
100private:
101
102 void update();
103 void advance(int dozens);
104
105 int pDiscard; // separate sequence by p-r = p-12 discarded elements
106 int pDozens; // pDiscard / 12;
107 int endIters; // pDiscard % 12;
108 int luxury;
109
110 int index;
111 double randoms[12]; // randoms [i] is the x[n-i] of Luscher's note
112 double carry;
113
114 static int numEngines;
115 static int maxIndex;
116
117}; // Ranlux64Engine
118
119} // namespace CLHEP
120
121#endif // Ranlux64Engine_h
std::string name() const
void setSeeds(const long *seeds, int lux=1)
void restoreStatus(const char filename[]="Ranlux64.conf")
std::vector< unsigned long > put() const
virtual std::istream & getState(std::istream &is)
static std::string engineName()
void saveStatus(const char filename[]="Ranlux64.conf") const
static std::string beginTag()
void flatArray(const int size, double *vect)
void setSeed(long seed, int lux=1)
static const unsigned int VECTOR_STATE_SIZE
virtual std::istream & get(std::istream &is)
Definition: DoubConv.h:17