OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
RNGBitReverse.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 /***************************************************************************
3  *
4  * The IPPL Framework
5  *
6  *
7  * Visit http://people.web.psi.ch/adelmann/ for more details
8  *
9  ***************************************************************************/
10 
11 #ifndef RNG_BIT_REVERSE_H
12 #define RNG_BIT_REVERSE_H
13 
14 /***********************************************************************
15  *
16  * class RNGBitReverse
17  * class RNGBitReverseSequence : public SequenceGen<RNGBitReverse>
18  *
19  * RNGBitReverse generates a set of values distributed over some domain
20  * based on a bit-reversal algorithm. These numbers will be uniformly
21  * distributed over the [0...1] domain. It requires the following
22  * parameters and values:
23  *
24  * base - used in bit reversal calculation; must be a prime number
25  * seed - a starting unsigned integer, which is incremented as new values
26  * are calculated. If not specified, it defaults to 1 initially.
27  * It is incremented after each calculation.
28  *
29  * RNGBitReverseSequence is derived from SequenceGen, and makes it easier
30  * to use this RNG in expressions.
31  * Use RNGBitReverse as a scalar or container element, and use
32  * RNGBitReverseSequence when you need a sequence of numbers to fill
33  * a container.
34  *
35  ***********************************************************************/
36 
37 // include files
38 #include "Utility/SequenceGen.h"
39 
40 
42 
43 public:
44  // return type
45  typedef double Return_t;
46 
47 public:
48  // default constructor
49  RNGBitReverse(unsigned int base = 2, unsigned long seed = 1)
50  : Base(base), Seed(seed) {}
51 
52  // copy constructor
54  : Base(brg.Base), Seed(brg.Seed) {}
55 
56  // destructor
57  ~RNGBitReverse(void) {}
58 
59  // advance seed for RNG n times
60  inline void AdvanceSeed(unsigned long n = 0) { Seed += n; }
61 
62  // set seed to specified value
63  inline void SetSeed(unsigned long seed) { Seed = seed; }
64 
65  // set base to specified value (should be a prime number!)
66  inline void SetBase(unsigned int base) { Base = base; }
67 
68  // get seed value
69  inline unsigned long GetSeed(void) const { return Seed; }
70 
71  // get base value
72  inline unsigned int GetBase(void) const { return Base; }
73 
74  // get the next random number in sequence
75  inline Return_t GetRandom(void) const {
76  Return_t rev = 0.0;
77  Return_t power = 1.0;
78  long inum = Seed;
79  while (inum > 0) {
80  int iquot = inum/Base;
81  int irem = inum - iquot*Base;
82  power /= Return_t(Base);
83  rev += Return_t(irem)*power;
84  inum = iquot;
85  }
86  Seed++;
87  return rev;
88  }
89 
90  // pseudonym for GetRandom()
91  inline Return_t operator()(void) const { return GetRandom(); }
92 
93  // conversion to Return_t, same as GetRandom()
94  inline operator Return_t() const { return GetRandom(); }
95 
96 private:
97  // the base and seed for this generator
98  unsigned int Base;
99  mutable unsigned long Seed;
100 };
101 
103 
104 
105 // A version of SequenceGen with extra constructors to make using this
106 // class easier. This is the version that people should use to fill
107 // containers with a random number sequence in an expression. This
108 // class is PETE-aware via its inheritance from SequenceGen.
109 
111 
112 public:
113  // default constructor
114  RNGBitReverseSequence(unsigned int base = 2, unsigned long seed = 1)
115  : SequenceGen<RNGBitReverse>(RNGBitReverse(base,seed)) {}
116 
117  // copy constructor
119  : SequenceGen<RNGBitReverse>(rngseq.getGenerator()) {}
120 
121  // destructor
123 
124  // wrappers around RNG generator functions
125  inline void AdvanceSeed(unsigned long adv = 0) {
126  getGenerator().AdvanceSeed(adv);
127  }
128 
129  inline void SetSeed(unsigned long seed) { getGenerator().SetSeed(seed); }
130  inline void SetBase(unsigned int base) { getGenerator().SetBase(base); }
131  inline unsigned long GetSeed(void) const { return getGenerator().GetSeed(); }
132  inline unsigned int GetBase(void) const { return getGenerator().GetBase(); }
133 
134  inline Return_t GetRandom(void) { return getGenerator().GetRandom(); }
135  inline Return_t operator()(void) { return getGenerator().GetRandom(); }
136 };
137 
138 #endif // RNG_BIT_REVERSE_H
139 
140 /***************************************************************************
141  * $RCSfile: RNGBitReverse.h,v $ $Author: adelmann $
142  * $Revision: 1.1.1.1 $ $Date: 2003/01/23 07:40:33 $
143  * IPPL_VERSION_ID: $Id: RNGBitReverse.h,v 1.1.1.1 2003/01/23 07:40:33 adelmann Exp $
144  ***************************************************************************/
int seed
The current random seed.
Definition: Options.cpp:41
void AdvanceSeed(unsigned long adv=0)
#define RNG_BASIC_MATH(GEN)
Definition: SequenceGen.h:65
void SetBase(unsigned int base)
unsigned int Base
Definition: RNGBitReverse.h:98
RNGBitReverse(unsigned int base=2, unsigned long seed=1)
Definition: RNGBitReverse.h:49
unsigned int GetBase(void) const
Definition: RNGBitReverse.h:72
Return_t GetRandom(void)
RNGBitReverse(const RNGBitReverse &brg)
Definition: RNGBitReverse.h:53
RNGBitReverse::Return_t Return_t
Definition: SequenceGen.h:89
RNGBitReverseSequence(const RNGBitReverseSequence &rngseq)
Return_t operator()(void)
void AdvanceSeed(unsigned long n=0)
Definition: RNGBitReverse.h:60
Return_t GetRandom(void) const
Definition: RNGBitReverse.h:75
void SetSeed(unsigned long seed)
unsigned long Seed
Definition: RNGBitReverse.h:99
unsigned long GetSeed(void) const
Definition: RNGBitReverse.h:69
unsigned long GetSeed(void) const
~RNGBitReverse(void)
Definition: RNGBitReverse.h:57
Return_t operator()(void) const
Definition: RNGBitReverse.h:91
void SetSeed(unsigned long seed)
Definition: RNGBitReverse.h:63
RNGBitReverseSequence(unsigned int base=2, unsigned long seed=1)
unsigned int GetBase(void) const
void SetBase(unsigned int base)
Definition: RNGBitReverse.h:66