OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
PartBins.h
Go to the documentation of this file.
1 
16 #ifndef OPAL_Bins_HH
17 #define OPAL_Bins_HH
18 
19 #ifndef PartBinTest
20 #include "Algorithms/PBunchDefs.h"
21 #else
22 #include "ranlib.h"
23 #define Inform ostream
24 #endif
25 
26 #include <gsl/gsl_rng.h>
27 #include <gsl/gsl_histogram.h>
28 #include <gsl/gsl_cdf.h>
29 #include <gsl/gsl_randist.h>
30 
31 
32 class PartBins {
33 
43 public:
44 
45 
46  PartBins(int bins, int sbins);
47 
48  virtual ~PartBins();
49 
50 
52  inline int getDelBinCont(int bin) {
53  int a = nDelBin_m[bin];
54  reduce(a, a, OpAddAssign());
55  return a;
56  }
57 
58 
60  void fill(std::vector<double> &p) {
61  tmppart_m.push_back(p);
62  isEmitted_m.push_back(false);
63  }
64 
66  size_t getNp() {
67  // size_t a = tmppart_m.size();
68  // reduce(a, a, OpAddAssign());
69  // return a;
70  return tmppart_m.size();
71  }
72 
74  void setPartNum(int bin, long long num) {nBin_m[bin] = num;}
75 
77  void setBinEmitted(int bin) {binsEmitted_m[bin] = true;}
78 
79  bool getBinEmitted(int bin) {return binsEmitted_m[bin];}
80 
82  bool doEmission() {return getNp() > 0;}
83 
84  bool isEmitted(int n, int /*bin*/) {
85  return isEmitted_m[n]; //(isEmitted_m[n][0]==1) && (isEmitted_m[n][1] == bin);
86  }
87 
88  void setEmitted(int n, int /*bin*/) {
89  isEmitted_m[n] = true;
90  }
91 
92  void updatePartPos(int n, int /*bin*/, double z) {
93  tmppart_m[n][2] = z;
94  }
95 
96  void updateExtramePos(int bin, double dz) {
97  xbinmax_m[bin] += dz;
98  xbinmin_m[bin] += dz;
99  }
100 
102  bool getPart(size_t n, int bin, std::vector<double> &p);
103 
107  void sortArray();
108 
110  void calcHBins();
111  size_t getSum();
112  void calcGlobalExtrema();
113  void calcExtrema();
114  void getExtrema(double &min, double &max) {
115  min = xmin_m;
116  max = xmax_m;
117  }
118 
120  void updateStatus(int bunchCount, size_t nPartInBin);
122  void resetPartInBin(size_t newPartNum[]);
124  void resetPartInBin_cyc(size_t newPartNum[], int binID);
126  void updatePartInBin(size_t countLost[]);
128  void updatePartInBin_cyc(size_t countLost[]);
129 
130  void updateDeletedPartsInBin(size_t countLost[]) ;
131 
132  void setGamma(double gamma) { gamma_m = gamma;}
133  double getGamma() {return gamma_m;}
134 
135 protected:
136 
137  double gamma_m;
142  int getBin(double x);
143 
144  int bins_m;
145  int sBins_m;
146 
148  double xmin_m;
149  double xmax_m;
150 
152  std::unique_ptr<double[]> xbinmin_m;
153  std::unique_ptr<double[]> xbinmax_m;
154 
156  double hBin_m;
157 
159  std::vector< std::vector<double> > tmppart_m;
160  std::vector< bool > isEmitted_m;
162  // std::vector< bool > binsEmitted_m;
163  std::unique_ptr<bool[]> binsEmitted_m;
164 
169 public:
170 
171  Inform &print(Inform &os);
172 
173  int getSBins() { return sBins_m; };
174 
176  virtual int getNBins() {return gsl_histogram_bins(h_m.get()) / sBins_m; }
177 
179  virtual int getNSBins() {return gsl_histogram_bins(h_m.get()); }
180 
181  int getBinToEmit() {
182  int save;
183  if(nemittedBins_m < getNBins()) {
184  save = nemittedBins_m;
185  nemittedBins_m++;
186  return save;
187  } else
188  return -1;
189  }
190 
192  int save;
193  if(nemittedSBins_m < getNSBins()) {
194  save = nemittedSBins_m;
195  nemittedSBins_m++;
196  return save;
197  } else
198  return -1;
199  }
200 
203 
205  void setActualemittedBin(int bin) {nemittedBins_m = bin; }
206 
208  void resetBins() {
209  h_m.reset(nullptr);
210  }
211 
212  virtual bool weHaveBins() {
213  return h_m != nullptr;
214  }
215 
217  void sortArrayT();
218 
219  inline void setHistogram(gsl_histogram *h) { h_m.reset(h);}
220 
222  virtual inline size_t getGlobalBinCount(int bin) {
223  size_t a = gsl_histogram_get(h_m.get(), bin);
224  reduce(a, a, OpAddAssign());
225  return a;
226  }
227 
229  virtual inline size_t getLocalBinCount(int bin) {
230  size_t ret = 0;
231  for(int i = sBins_m * bin; i < sBins_m * (bin + 1); i++) {
232  ret += gsl_histogram_get(h_m.get(), i);
233  }
234  return ret;
235  }
236 
238  inline size_t getLocalSBinCount(int bin) { return gsl_histogram_get(h_m.get(), bin);}
239 
240 
242  size_t getTotalNum();
243 
245  size_t getTotalNumPerBin(int b);
246 
247 
248 protected:
249 
252 
255 
257  std::unique_ptr<size_t[]> nBin_m;
258 
260  std::unique_ptr<size_t[]> nDelBin_m;
261 
262  std::unique_ptr<gsl_histogram> h_m;
263 
264 };
265 
266 inline Inform &operator<<(Inform &os, PartBins &p) {
267  return p.print(os);
268 }
269 
270 
271 class AscendingLocationSort: public std::binary_function< std::vector<double>, std::vector<double>, bool> {
272 public:
273  AscendingLocationSort(int direction = 0): direction_m(direction)
274  {;}
275 
276  bool operator()(const std::vector<double>& first_part, const std::vector<double>& second_part) {
277  return first_part[direction_m] < second_part[direction_m];
278  }
279 private:
281 };
282 
283 class DescendingLocationSort: public std::binary_function< std::vector<double>, std::vector<double>, bool> {
284 public:
285  DescendingLocationSort(int direction = 0): direction_m(direction)
286  {;}
287 
288  bool operator()(const std::vector<double>& first_part, const std::vector<double>& second_part) {
289  return first_part[direction_m] > second_part[direction_m];
290  }
291 private:
293 };
294 
295 #endif // OPAL_Bins_HH
AscendingLocationSort(int direction=0)
Definition: PartBins.h:273
double hBin_m
Definition: PartBins.h:156
void setActualemittedBin(int bin)
Definition: PartBins.h:205
virtual int getNSBins()
Definition: PartBins.h:179
void updateExtramePos(int bin, double dz)
Definition: PartBins.h:96
std::ostream & operator<<(std::ostream &os, const Attribute &attr)
Definition: Attribute.cpp:167
std::unique_ptr< bool[]> binsEmitted_m
Definition: PartBins.h:163
bool operator()(const std::vector< double > &first_part, const std::vector< double > &second_part)
Definition: PartBins.h:276
virtual int getNBins()
Definition: PartBins.h:176
virtual bool weHaveBins()
Definition: PartBins.h:212
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:123
std::unique_ptr< double[]> xbinmin_m
Definition: PartBins.h:152
double xmax_m
Definition: PartBins.h:149
size_t getSum()
Definition: PartBins.cpp:185
void sortArray()
Definition: PartBins.cpp:147
void setGamma(double gamma)
Definition: PartBins.h:132
void sortArrayT()
Definition: PartBins.cpp:174
int getDelBinCont(int bin)
How many deleted particles are on one bin.
Definition: PartBins.h:52
std::vector< bool > isEmitted_m
Definition: PartBins.h:160
void getExtrema(double &min, double &max)
Definition: PartBins.h:114
virtual ~PartBins()
Definition: PartBins.cpp:131
int sBins_m
Definition: PartBins.h:145
DescendingLocationSort(int direction=0)
Definition: PartBins.h:285
int getBin(double x)
Definition: PartBins.cpp:239
double xmin_m
Definition: PartBins.h:148
int getSBinToEmit()
Definition: PartBins.h:191
std::unique_ptr< size_t[]> nDelBin_m
Definition: PartBins.h:260
void setEmitted(int n, int)
Definition: PartBins.h:88
size_t getTotalNum()
How many particles are in all the bins.
Definition: PartBins.cpp:39
void setPartNum(int bin, long long num)
Definition: PartBins.h:74
bool reduce(Communicate &, InputIterator, InputIterator, OutputIterator, const ReduceOp &, bool *IncludeVal=0)
Definition: GlobalComm.hpp:55
int nemittedBins_m
Definition: PartBins.h:251
std::unique_ptr< size_t[]> nBin_m
Definition: PartBins.h:257
double gamma_m
Definition: PartBins.h:137
PartBins(int bins, int sbins)
Definition: PartBins.cpp:10
void calcGlobalExtrema()
Definition: PartBins.cpp:192
void updatePartInBin_cyc(size_t countLost[])
Definition: PartBins.cpp:101
void fill(std::vector< double > &p)
Add a particle to the temporary container.
Definition: PartBins.h:60
double getGamma()
Definition: PartBins.h:133
size_t getLocalSBinCount(int bin)
How many particles are in one sampling bin.
Definition: PartBins.h:238
void resetPartInBin(size_t newPartNum[])
Definition: PartBins.cpp:110
Inform & print(Inform &os)
Definition: PartBins.cpp:216
void updatePartPos(int n, int, double z)
Definition: PartBins.h:92
bool doEmission()
Is true if we still have particles to emit.
Definition: PartBins.h:82
virtual size_t getLocalBinCount(int bin)
How many particles are on one energy bin.
Definition: PartBins.h:229
bool operator()(const std::vector< double > &first_part, const std::vector< double > &second_part)
Definition: PartBins.h:288
void setHistogram(gsl_histogram *h)
Definition: PartBins.h:219
size_t getTotalNumPerBin(int b)
How many particles are in the bin b.
Definition: PartBins.cpp:53
void resetBins()
If the bunch object rebins we need to call resetBins()
Definition: PartBins.h:208
void updateStatus(int bunchCount, size_t nPartInBin)
Definition: PartBins.cpp:60
int getLastemittedBin()
Definition: PartBins.h:202
virtual size_t getGlobalBinCount(int bin)
How many particles are on one bin.
Definition: PartBins.h:222
int getSBins()
Definition: PartBins.h:173
bool getBinEmitted(int bin)
Definition: PartBins.h:79
void calcExtrema()
Definition: PartBins.cpp:206
bool getPart(size_t n, int bin, std::vector< double > &p)
Definition: PartBins.cpp:137
size_t getNp()
get the number of particles in the temporary particle structure used for binning
Definition: PartBins.h:66
int bins_m
Definition: PartBins.h:144
std::unique_ptr< double[]> xbinmax_m
Definition: PartBins.h:153
void calcHBins()
Definition: PartBins.cpp:178
int nemittedSBins_m
Definition: PartBins.h:254
void updateDeletedPartsInBin(size_t countLost[])
Definition: PartBins.cpp:70
Definition: Inform.h:41
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:95
void setBinEmitted(int bin)
Definition: PartBins.h:77
std::vector< std::vector< double > > tmppart_m
Definition: PartBins.h:159
int getBinToEmit()
Definition: PartBins.h:181
void resetPartInBin_cyc(size_t newPartNum[], int binID)
Definition: PartBins.cpp:119
std::unique_ptr< gsl_histogram > h_m
Definition: PartBins.h:262
bool isEmitted(int n, int)
Definition: PartBins.h:84
void updatePartInBin(size_t countLost[])
Definition: PartBins.cpp:84