OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
PartBins.cpp
Go to the documentation of this file.
1 #include "Algorithms/PartBins.h"
3 #include "Physics/Physics.h"
4 #include <cfloat>
5 #include <limits>
6 #include <vector>
7 
8 extern Inform *gmsg;
9 
10 PartBins::PartBins(int bins, int sbins) :
11  gamma_m(1.0),
12  bins_m(bins),
13  sBins_m(sbins),
14  xmin_m(0.0),
15  xmax_m(0.0),
16  hBin_m(0.0),
17  nemittedBins_m(0),
18  nemittedSBins_m(0) {
19 
20  // number of particles in the bins on the local node
21  nBin_m = std::unique_ptr<size_t[]>(new size_t[bins_m]);
22  xbinmin_m = std::unique_ptr<double[]>(new double[bins_m]);
23  xbinmax_m = std::unique_ptr<double[]>(new double[bins_m]);
24 
25  // flag whether the bin contain particles or not
26  binsEmitted_m = std::unique_ptr<bool[]>(new bool[bins_m]);
27 
28  nDelBin_m = std::unique_ptr<size_t[]>(new size_t[bins_m]);
29 
30  for(int i = 0; i < bins_m; i++) {
31  nDelBin_m[i] = nBin_m[i] = 0;
32  xbinmin_m[i] = std::numeric_limits<double>::max();
33  xbinmax_m[i] = -xbinmin_m[i];
34  binsEmitted_m[i] = false;
35  }
36 }
37 
38 
40  size_t s = 0;
41  size_t sd = 0;
42  size_t gs = 0;
43 
44  for(int i = 0; i < getLastemittedBin(); i++) {
45  s += nBin_m[i];
46  sd += nDelBin_m[i];
47  }
48  gs = s - sd;
49  reduce(gs, gs, OpAddAssign());
50  return gs;
51 }
52 
54  size_t s = 0;
55  s = nBin_m[b];
56  reduce(s, s, OpAddAssign());
57  return s;
58 }
59 
60 void PartBins::updateStatus(const int bunchCount, const size_t partInBin) {
61  // array index of binsEmitted_m[] starts from 0
62  // nemittedBins_m and bins_m index starts from 1
63  binsEmitted_m[bunchCount - 1] = true;
64  size_t NpartInBin = partInBin;
65  reduce(NpartInBin, NpartInBin, OpAddAssign());
66  nBin_m[bunchCount - 1] = NpartInBin;
68 }
69 
70 void PartBins::updateDeletedPartsInBin(size_t countLost[]) {
71  Inform msg("updateDeletedPartsInBin ");
72 
73  const int lastEmittedBin = getLastemittedBin();
74  reduce(&(countLost[0]), &(countLost[0]) + lastEmittedBin, &(countLost[0]), OpAddAssign());
75  for(int ii = 0; ii < lastEmittedBin; ii++) {
76  if(countLost[ii] > 0) {
77  nDelBin_m[ii] = countLost[ii];
78  msg << "In Bin: " << ii << ", " << nDelBin_m[ii] << " particle(s) lost" << endl;
79  }
80  }
81 }
82 
83 
84 void PartBins::updatePartInBin(size_t countLost[]) {
85 
86  Inform msg0("updatePartInBin ");
87 
88  for(int ii = 0; ii < nemittedBins_m; ii++) {
89  msg0 << "In Bin: " << ii << ", " << nBin_m[ii] << " particles " << endl;
90  }
91 
92  reduce(&(countLost[0]), &(countLost[0]) + nemittedBins_m, &(countLost[0]), OpAddAssign());
93  for(int ii = 0; ii < nemittedBins_m; ii++) {
94  if(countLost[ii] > 0) {
95  nBin_m[ii] -= countLost[ii];
96  msg0 << "In Bin: " << ii << ", " << countLost[ii] << " particle(s) lost" << endl;
97  }
98  }
99 }
100 
101 void PartBins::updatePartInBin_cyc(size_t countLost[]) {
102 
103  for(int ii = 0; ii < nemittedBins_m; ii++) {
104  if(countLost[ii] > 0)
105  nBin_m[ii] -= countLost[ii];
106  }
107 }
108 
109 
110 void PartBins::resetPartInBin(size_t newPartNum[]) {
111  reduce(&(newPartNum[0]), &(newPartNum[0]) + nemittedBins_m, &(newPartNum[0]), OpAddAssign());
112  for(int ii = 0; ii < nemittedBins_m; ii++) {
113  nBin_m[ii] = newPartNum[ii];
114  INFOMSG("After reset Bin: " << ii << ", particle(s): " << newPartNum[ii] << endl);
115  }
116 }
117 
118 
119 void PartBins::resetPartInBin_cyc(size_t newPartNum[], int maxbinIndex) {
120  reduce(maxbinIndex, maxbinIndex, OpMaxAssign());
121  nemittedBins_m = maxbinIndex + 1;
122 
123  for(int ii = 0; ii < nemittedBins_m; ii++) {
124  nBin_m[ii] = newPartNum[ii]; // only count particles on the local node
125  setBinEmitted(ii); // set true for this bin
126  }
127 }
128 
129 
130 
132  tmppart_m.clear();
133  isEmitted_m.clear();
134 }
135 
136 
137 bool PartBins::getPart(size_t n, int bin, std::vector<double> &p) {
138 
139  if(tmppart_m[n][6] == bin) {
140  p = tmppart_m[n];
141  return true;
142  } else
143  return false;
144 }
145 
153  double sshift = sqrt(1. - (1. / (gamma_m * gamma_m))) * Physics::c * 1e-13;
154  std::sort(tmppart_m.begin(), tmppart_m.end(), DescendingLocationSort(2));
155  xmax_m = tmppart_m[0][2];
156  xmin_m = tmppart_m.back()[2];
157 
158  for(unsigned int n = 0; n < tmppart_m.size(); n++)
159  tmppart_m[n][2] -= xmax_m + sshift; /* push particles back */
160 
161  xmin_m -= xmax_m + 0.0001 * (xmax_m - xmin_m) + sshift; /* lower the limits */
162  xmax_m = -sshift;
163 
165  reduce(xmax_m, xmax_m, OpMaxAssign());
166 
167  hBin_m = (fabs(xmax_m - xmin_m)) / (bins_m);
168  calcHBins();
169  for(int n = 0; n < bins_m; n++)
170  if(nBin_m[n] == 0) setBinEmitted(n);
171 }
172 
173 
176 }
177 
179 
180  for(unsigned int n = 0; n < tmppart_m.size(); n++)
181  tmppart_m[n][6] = getBin(tmppart_m[n][2]);
182  calcExtrema();
183 }
184 
186  size_t s = 0;
187  for(int n = 0; n < bins_m; n++)
188  s += nBin_m[n];
189  return s;
190 }
191 
194  xmax_m = -xmin_m;
195  for(unsigned int n = 0; n < tmppart_m.size(); n++) {
196  if(tmppart_m[n][2] <= xmin_m)
197  xmin_m = tmppart_m[n][2];
198  if(tmppart_m[n][2] >= xmax_m)
199  xmax_m = tmppart_m[n][2];
200  }
201  double xdiff = 0.01 * (xmax_m - xmin_m);
202  xmin_m -= xdiff;
203  xmax_m += xdiff;
204 }
205 
207  for(unsigned int n = 0; n < tmppart_m.size(); n++) {
208  if(xbinmin_m[(int)tmppart_m[n][6]] >= tmppart_m[n][2])
209  xbinmin_m[(int)tmppart_m[n][6]] = tmppart_m[n][2];
210 
211  if(xbinmax_m[(int)tmppart_m[n][6]] <= tmppart_m[n][2])
212  xbinmax_m[(int)tmppart_m[n][6]] = tmppart_m[n][2];
213  }
214 }
215 
217 
218  os << "-----------------------------------------" << endl;
219  os << " CREATE BINNED GAUSS DISTRIBUTION DONE " << endl;
220 
221  os << "Bins= " << bins_m << " hBin= " << hBin_m << " Particle vector length " << tmppart_m.size() << endl;
222 
223  //for(int i = 0; i < gsl_histogram_bins(h_m); i++)
224  //os << "Bin # " << i << " val " << gsl_histogram_get(h_m, i) << endl;
225  for(int i = 0; i < bins_m; i++) {
226  size_t msum = 0;
227  for(int j = 0; j < sBins_m; j++)
228  msum += gsl_histogram_get(h_m.get(), i * sBins_m + j);
229  os << "Bin # " << i << " val " << msum << endl;
230  }
231 
232  if(getLastemittedBin() >= 0)
233  os << "Last emitted bin is " << getLastemittedBin() << endl;
234  else
235  os << "No bin is emitted !" << endl;
236  return os;
237 }
238 
239 int PartBins::getBin(double x) {
244  int b = (int) floor(fabs(xmax_m - x) / hBin_m);
245  nBin_m[b]++;
246  return b;
247 }
double hBin_m
Definition: PartBins.h:156
void setActualemittedBin(int bin)
Definition: PartBins.h:205
std::unique_ptr< bool[]> binsEmitted_m
Definition: PartBins.h:163
constexpr double e
The value of .
Definition: Physics.h:40
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
Definition: PETE.h:815
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
Inform * gmsg
Definition: Main.cpp:21
void sortArray()
Definition: PartBins.cpp:147
void sortArrayT()
Definition: PartBins.cpp:174
std::vector< bool > isEmitted_m
Definition: PartBins.h:160
virtual ~PartBins()
Definition: PartBins.cpp:131
int sBins_m
Definition: PartBins.h:145
int getBin(double x)
Definition: PartBins.cpp:239
double xmin_m
Definition: PartBins.h:148
std::unique_ptr< size_t[]> nDelBin_m
Definition: PartBins.h:260
size_t getTotalNum()
How many particles are in all the bins.
Definition: PartBins.cpp:39
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
Defines a structure to hold energy bins and their associated data.
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
#define INFOMSG(msg)
Definition: IpplInfo.h:397
void resetPartInBin(size_t newPartNum[])
Definition: PartBins.cpp:110
Inform & print(Inform &os)
Definition: PartBins.cpp:216
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
size_t getTotalNumPerBin(int b)
How many particles are in the bin b.
Definition: PartBins.cpp:53
void updateStatus(int bunchCount, size_t nPartInBin)
Definition: PartBins.cpp:60
int getLastemittedBin()
Definition: PartBins.h:202
void calcExtrema()
Definition: PartBins.cpp:206
bool getPart(size_t n, int bin, std::vector< double > &p)
Definition: PartBins.cpp:137
int bins_m
Definition: PartBins.h:144
std::unique_ptr< double[]> xbinmax_m
Definition: PartBins.h:153
void calcHBins()
Definition: PartBins.cpp:178
void updateDeletedPartsInBin(size_t countLost[])
Definition: PartBins.cpp:70
Definition: Inform.h:41
void setBinEmitted(int bin)
Definition: PartBins.h:77
std::vector< std::vector< double > > tmppart_m
Definition: PartBins.h:159
void resetPartInBin_cyc(size_t newPartNum[], int binID)
Definition: PartBins.cpp:119
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Definition: PETE.h:816
std::unique_ptr< gsl_histogram > h_m
Definition: PartBins.h:262
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
void updatePartInBin(size_t countLost[])
Definition: PartBins.cpp:84