Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
randomNumbers_Mseries.cpp
Go to the documentation of this file.
1 
14 #include "randomNumbers_Mseries.h"
15 
16 using std::string;
17 
18 //====================================================================
20 {
21  vout.general(m_vl, "RandomNumbers_Mseries: read from file = %s\n", filename.c_str());
22 
23  std::ifstream infile;
24  infile.open(filename.c_str());
25 
26  if (!infile) {
27  vout.crucial(m_vl, "RandomNumbers_Mseries: unable to open input file.\n");
28  return;
29  }
30 
31  infile >> jr >> kr;
32 
33  for (int i = 0; i < Np; i++) {
34  infile >> w[i];
35  }
36 
37  infile.close();
38 }
39 
40 
41 //====================================================================
42 void RandomNumbers_Mseries::initset(const int ndelay)
43 {
44  vout.general(m_vl, " Random number init: ndelay =%10d\n", ndelay);
45 
46  int IP = Np;
47  int IQ = Nq;
48 
49  int MACRM = 40;
50  int MACRI = 1;
51  unsigned IB[IP];
52 
53  unsigned IX = MACRI;
54  for (int i = 0; i < IP; ++i) {
55  IX = IX * 69069;
56  IB[i] = IX >> 31;
57  }
58 
59  int JR = 0;
60  int KR = IP - IQ;
61  for (int j = 0; j < IP; ++j) {
62  unsigned iwork = 0;
63 
64  for (int i = 0; i < 32; ++i) {
65  iwork = iwork * 2 + IB[JR];
66  IB[JR] = IB[JR] ^ IB[KR];
67  ++JR;
68  if (JR == IP) JR = 0;
69  ++KR;
70  if (KR == IP) KR = 0;
71  }
72 
73  w[j] = iwork >> 1;
74  }
75 
76  jr = JR;
77  kr = KR;
78 
79  delay3(ndelay);
80 }
81 
82 
83 //====================================================================
84 void RandomNumbers_Mseries::delay3(const int ndelay)
85 {
86  int IP = Np;
87  int IQ = Nq;
88 
89  int LAMBDA = ndelay;
90 
91  int MACRM = 40;
92  int MACRI = 1;
93 
94  unsigned IWK[2 * IP - 1];
95  unsigned C[2 * IP];
96  unsigned IB[IP + 32];
97 
98  int MU = MACRM;
99 
100  for (int i = 0; i < IP; ++i) {
101  IWK[i] = w[i];
102  }
103 
104  for (int i = IP; i < 2 * IP - 1; ++i) {
105  IWK[i] = IWK[i - IP] ^ IWK[i - IQ];
106  }
107 
108  for (int i = 0; i < MU; ++i) {
109  IB[i] = 0;
110  }
111  int M = LAMBDA;
112  int NB = MU - 1;
113 
114 continued220:
115  if (M <= IP - 1) goto continued300;
116  ++NB;
117  IB[NB] = M % 2;
118  M = M / 2;
119  goto continued220;
120 
121 continued300:
122  for (int i = 0; i < IP; ++i) {
123  C[i] = 0;
124  }
125 
126  C[M] = 1;
127  for (int j = NB; j >= 0; --j) {
128  for (int i = IP - 1; i >= 0; --i) {
129  C[2 * i + IB[j]] = C[i];
130  C[2 * i + 1 - IB[j]] = 0;
131  }
132  for (int i = 2 * IP - 1; i >= IP; --i) {
133  C[i - IP] = C[i - IP] ^ C[i];
134  C[i - IQ] = C[i - IQ] ^ C[i];
135  }
136  }
137 
138  for (int j = 0; j < IP; ++j) {
139  unsigned iwork = 0;
140  for (int i = 0; i < IP; ++i) {
141  iwork = iwork ^ (C[i] * IWK[j + i]);
142  }
143  w[j] = iwork;
144  }
145 }
146 
147 
148 //====================================================================
149 void RandomNumbers_Mseries::writefile(const string filename)
150 {
151  vout.general(m_vl, "RandomNumbers_Mseries: write down to file = %s\n", filename.c_str());
152 
153  std::ofstream outfile;
154  outfile.open(filename.c_str());
155 
156  if (!outfile) {
157  vout.crucial(m_vl, "RandomNumbers_Mseries: unable to open output file.\n");
158  return;
159  }
160 
161  outfile << " " << jr << " " << kr << std::endl;
162 
163  for (int i = 0; i < Np; i++) {
164  outfile << " " << w[i] << std::endl;
165  }
166 
167  outfile.close();
168 }
169 
170 
171 //====================================================================
172 //============================================================END=====