Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MixMaxRng.h
Go to the documentation of this file.
1//
2// -*- C++ -*-
3//
4// -----------------------------------------------------------------------
5// HEP Random
6// --- MixMaxRng ---
7// class header file
8// -----------------------------------------------------------------------
9//
10// This file interfaces the MixMax PseudoRandom Number Generator
11// proposed by:
12//
13// G.K.Savvidy and N.G.Ter-Arutyunian,
14// On the Monte Carlo simulation of physical systems,
15// J.Comput.Phys. 97, 566 (1991);
16// Preprint EPI-865-16-86, Yerevan, Jan. 1986
17// http://dx.doi.org/10.1016/0021-9991(91)90015-D
18//
19// K.Savvidy
20// "The MIXMAX random number generator"
21// Comp. Phys. Commun. (2015)
22// http://dx.doi.org/10.1016/j.cpc.2015.06.003
23//
24// K.Savvidy and G.Savvidy
25// "Spectrum and Entropy of C-systems. MIXMAX random number generator"
26// Chaos, Solitons & Fractals, Volume 91, (2016) pp. 33-38
27// http://dx.doi.org/10.1016/j.chaos.2016.05.003
28//
29// =======================================================================
30// Implementation by Konstantin Savvidy - Copyright 2004-2017
31// =======================================================================
32
33#ifndef MixMaxRng_h
34#define MixMaxRng_h 1
35
36#include <array>
37#include <cstdint>
39
40namespace CLHEP {
41
42/**
43 * @author K.Savvidy
44 * @ingroup random
45 */
46
47using myID_t = std::uint32_t;
48using myuint_t = unsigned long long int;
49
51
52 static const int N = 17;
53
54public:
55
56 MixMaxRng(std::istream& is);
57 MixMaxRng();
58 MixMaxRng(long seed);
59 ~MixMaxRng();
60 // Constructors and destructor.
61
62 MixMaxRng(const MixMaxRng& rng);
63 MixMaxRng& operator=(const MixMaxRng& rng);
64 // Copy constructor and assignment operator.
65
66 double flat() { return (S.counter<=(N-1)) ? generate(S.counter):iterate(); }
67 // Returns a pseudo random number between 0 and 1
68 // (excluding the zero: in (0,1] )
69 // smallest number which it will give is approximately 10^-19
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 dum=0);
75 // Sets the state of the algorithm according to seed.
76
77 void setSeeds(const long * seeds, int seedNum=0);
78 // Sets the initial state of the engine according to the array of between one and four 32-bit seeds.
79 // If the size of long is greater on the platform, only the lower 32-bits are used.
80 // Streams created from seeds differing by at least one bit somewhere are guaranteed absolutely
81 // to be independent and non-colliding for at least the next 10^100 random numbers
82
83 void saveStatus( const char filename[] = "MixMaxRngState.conf" ) const;
84 // Saves the the current engine state in the file given, by default MixMaxRngState.conf
85
86 void restoreStatus( const char filename[] = "MixMaxRngState.conf" );
87 // Reads a valid engine state from a given file, by default MixMaxRngState.conf
88 // and restores it.
89
90 void showStatus() const;
91 // Dumps the engine status on the screen.
92
93 operator double();
94 // Returns same as flat()
95 operator float();
96 // less precise flat, faster if possible
97 operator unsigned int();
98 // 32-bit flat
99
100 virtual std::ostream & put (std::ostream & os) const;
101 virtual std::istream & get (std::istream & is);
102 static std::string beginTag ( );
103 virtual std::istream & getState ( std::istream & is );
104
105 std::string name() const { return "MixMaxRng"; }
106 static std::string engineName();
107
108 std::vector<unsigned long> put () const;
109 bool get (const std::vector<unsigned long> & v);
110 bool getState (const std::vector<unsigned long> & v);
111
112private:
113
114 static constexpr long long int SPECIAL = ((N==17)? 0 : ((N==240)? 487013230256099140ULL:0) ); // etc...
115 static constexpr long long int SPECIALMUL= ((N==17)? 36: ((N==240)? 51 :53) ); // etc...
116 // Note the potential for confusion...
117 static constexpr int BITS=61;
118 static constexpr myuint_t M61=2305843009213693951ULL;
119 static constexpr double INV_M61=0.43368086899420177360298E-18;
120 static constexpr unsigned int VECTOR_STATE_SIZE = 2*N+4; // 2N+4 for MIXMAX
121
122 #define MIXMAX_MOD_MERSENNE(k) ((((k)) & M61) + (((k)) >> BITS) )
123
124 static constexpr int rng_get_N();
125 static constexpr long long int rng_get_SPECIAL();
126 static constexpr int rng_get_SPECIALMUL();
127 void seed_uniquestream( myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID );
128 void seed_spbox(myuint_t);
129 void print_state() const;
130 myuint_t precalc();
131 myuint_t get_next() ;
132 inline double get_next_float() { return get_next_float_packbits(); }
133 // Returns a random double with all 52 bits random, in the range (0,1]
134
135 MixMaxRng Branch();
136 void BranchInplace(int id);
137
138 MixMaxRng(myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID ); // Constructor with four 32-bit seeds
139 inline void seed64(myuint_t seedval) { seed_uniquestream( 0, 0, (myID_t)(seedval>>32), (myID_t)seedval ); } // seed with one 64-bit seed
140
141 double generate(int i);
142 double iterate();
143
144 double get_next_float_packbits();
145#if defined __GNUC__
146#pragma GCC diagnostic push
147#pragma GCC diagnostic ignored "-Wstrict-aliasing"
148#pragma GCC diagnostic ignored "-Wuninitialized"
149#endif
150 inline double convert1double(myuint_t u)
151 {
152 const double one = 1;
153 const myuint_t onemask = *(myuint_t*)&one;
154 myuint_t tmp = (u>>9) | onemask; // bits between 52 and 62 dont affect the result!
155 double d = *(double*)&tmp;
156 return d-1.0;
157 }
158#if defined __GNUC__
159#pragma GCC diagnostic pop
160#endif
161 myuint_t MOD_MULSPEC(myuint_t k);
162 myuint_t MULWU(myuint_t k);
163 void seed_vielbein( unsigned int i); // seeds with the i-th unit vector, i = 0..N-1, for testing only
164 myuint_t iterate_raw_vec(myuint_t* Y, myuint_t sumtotOld);
165 myuint_t apply_bigskip(myuint_t* Vout, myuint_t* Vin, myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID );
166 myuint_t modadd(myuint_t foo, myuint_t bar);
167#if defined(__x86_64__)
168 myuint_t mod128(__uint128_t s);
169 myuint_t fmodmulM61(myuint_t cum, myuint_t a, myuint_t b);
170#else // on all other platforms, including 32-bit linux, PPC and PPC64, ARM and all Windows
171 myuint_t fmodmulM61(myuint_t cum, myuint_t s, myuint_t a);
172#endif
173
174private:
175
176 struct rng_state_st
177 {
178 std::array<myuint_t, N> V;
179 myuint_t sumtot;
180 int counter;
181 };
182
183 typedef struct rng_state_st rng_state_t; // struct alias
184 rng_state_t S;
185};
186
187} // namespace CLHEP
188
189#endif
G4double S(G4double temp)
G4double Y(G4double density)
void restoreStatus(const char filename[]="MixMaxRngState.conf")
Definition: MixMaxRng.cc:124
void showStatus() const
Definition: MixMaxRng.cc:204
void flatArray(const int size, double *vect)
Definition: MixMaxRng.cc:326
void setSeed(long seed, int dum=0)
Definition: MixMaxRng.cc:214
std::string name() const
Definition: MixMaxRng.h:105
static std::string beginTag()
Definition: MixMaxRng.cc:402
void saveStatus(const char filename[]="MixMaxRngState.conf") const
Definition: MixMaxRng.cc:104
virtual std::istream & get(std::istream &is)
Definition: MixMaxRng.cc:384
MixMaxRng & operator=(const MixMaxRng &rng)
Definition: MixMaxRng.cc:87
virtual std::istream & getState(std::istream &is)
Definition: MixMaxRng.cc:407
std::vector< unsigned long > put() const
Definition: MixMaxRng.cc:367
double flat()
Definition: MixMaxRng.h:66
void setSeeds(const long *seeds, int seedNum=0)
Definition: MixMaxRng.cc:225
static std::string engineName()
Definition: MixMaxRng.cc:252
#define N
Definition: crc32.c:56
Definition: DoubConv.h:17
std::uint32_t myID_t
Definition: MixMaxRng.h:47
unsigned long long int myuint_t
Definition: MixMaxRng.h:48