1 #ifndef PART_BUNCH_BASE_HPP
2 #define PART_BUNCH_BASE_HPP
17 template <
class T,
unsigned Dim>
21 myNode_m(
Ippl::myNode()),
22 nodes_m(
Ippl::getNodes()),
28 lowParticleCount_m(false),
31 stateOfLastBoundP_(unitless),
38 globalMeanR_m(
Vector_t(0.0, 0.0, 0.0)),
39 globalToLocalQuaternion_m(
Quaternion_t(1.0, 0.0, 0.0, 0.0)),
57 couplingConstant_m(0.0),
64 binemitted_m(nullptr),
72 globalPartPerNode_m(nullptr),
75 periodLength_m(Physics::
c / 1e9),
107 template <
class T,
unsigned Dim>
118 template <
class T,
unsigned Dim>
120 if (dist_m != NULL) {
121 size_t isBeamEmitted = dist_m->getIfDistEmitting();
123 if (isBeamEmitted > 0)
132 template <
class T,
unsigned Dim>
137 int lastEmittedBin = dist_m->getLastEmittedEnergyBin();
139 return lastEmittedBin;
143 template <
class T,
unsigned Dim>
145 return dist_m->getNumberOfEmissionSteps();
149 template <
class T,
unsigned Dim>
151 return dist_m->getNumberOfEnergyBins();
155 template <
class T,
unsigned Dim>
158 size_t isBeamEmitting = dist_m->getIfDistEmitting();
160 if (isBeamEmitting > 0) {
161 *gmsg <<
"*****************************************************" <<
endl
162 <<
"Warning: attempted to rebin, but not all distribution" <<
endl
163 <<
"particles have been emitted. Rebin failed." <<
endl
164 <<
"*****************************************************" <<
endl;
172 template <
class T,
unsigned Dim>
174 bingamma_m = std::unique_ptr<double[]>(
new double[numberOfEnergyBins]);
175 binemitted_m = std::unique_ptr<size_t[]>(
new size_t[numberOfEnergyBins]);
176 for(
int i = 0; i < numberOfEnergyBins; i++)
181 template <
class T,
unsigned Dim>
185 return dist_m->getNumberOfEnergyBins() > 0;
191 template <
class T,
unsigned Dim>
194 if(unit_state_ == unitless)
196 "Cannot make a unitless PartBunch unitless");
198 bool hasToReset =
false;
199 if(!
R.isDirty()) hasToReset =
true;
201 for(
size_t i = 0; i < getLocalNum(); i++) {
203 if(use_dt_per_particle)
209 unit_state_ = unitless;
211 if(hasToReset)
R.resetDirtyFlag();
216 template <
class T,
unsigned Dim>
219 if(unit_state_ == units)
221 "Cannot apply units twice to PartBunch");
223 bool hasToReset =
false;
224 if(!
R.isDirty()) hasToReset =
true;
226 for(
size_t i = 0; i < getLocalNum(); i++) {
228 if(use_dt_per_particle)
236 if(hasToReset)
R.resetDirtyFlag();
240 template <
class T,
unsigned Dim>
246 template <
class T,
unsigned Dim>
248 std::vector<Distribution *> addedDistributions,
251 Inform m(
"setDistribution " );
263 template <
class T,
unsigned Dim>
269 template <
class T,
unsigned Dim>
271 return (pbin_m !=
nullptr);
275 template <
class T,
unsigned Dim>
281 template <
class T,
unsigned Dim>
287 template <
class T,
unsigned Dim>
290 return dist_m->getIfDistEmitting();
296 template <
class T,
unsigned Dim>
300 return pbin_m->weHaveBins();
306 template <
class T,
unsigned Dim>
309 *gmsg << *pbin_m <<
endl;
310 setEnergyBins(pbin_m->getNBins());
314 template <
class T,
unsigned Dim>
317 setEnergyBins(pbin_m->getNBins());
321 template <
class T,
unsigned Dim>
323 return dist_m->emitParticles(
this, eZ);
327 template <
class T,
unsigned Dim>
329 size_t numParticles = getLocalNum();
331 setTotalNum(numParticles);
335 template <
class T,
unsigned Dim>
344 template <
class T,
unsigned Dim>
347 return pbin_m->getNBins();
353 template <
class T,
unsigned Dim>
356 return pbin_m->getLastemittedBin();
362 template <
class T,
unsigned Dim>
365 pbin_m->setPartNum(bin, num);
370 template <
class T,
unsigned Dim>
373 const int emittedBins = dist_m->getNumberOfEnergyBins();
377 for(
int i = 0; i < emittedBins; i++)
380 for(
unsigned int n = 0;
n < getLocalNum();
n++)
381 bingamma_m[this->Bin[
n]] +=
sqrt(1.0 +
dot(this->P[
n], this->P[n]));
383 std::unique_ptr<size_t[]> particlesInBin(
new size_t[emittedBins]);
384 reduce(bingamma_m.get(), bingamma_m.get() + emittedBins, bingamma_m.get(),
OpAddAssign());
385 reduce(binemitted_m.get(), binemitted_m.get() + emittedBins, particlesInBin.get(),
OpAddAssign());
386 for(
int i = 0; i < emittedBins; i++) {
387 size_t &pInBin = particlesInBin[i];
389 bingamma_m[i] /= pInBin;
391 <<
" gamma = " << std::setw(8) << std::scientific
392 << std::setprecision(5) << bingamma_m[i]
393 <<
"; NpInBin= " << std::setw(8)
394 << std::setfill(
' ') << pInBin <<
endl);
401 particlesInBin.reset();
405 ERRORMSG(
"sum(Bins)= " << s <<
" != sum(R)= " << getTotalNum() <<
endl;);
407 if(emittedBins >= 2) {
408 for(
int i = 1; i < emittedBins; i++) {
409 if(binemitted_m[i - 1] != 0 && binemitted_m[i] != 0)
410 INFOMSG(
level2 <<
"d(gamma)= " << 100.0 *
std::abs(bingamma_m[i - 1] - bingamma_m[i]) / bingamma_m[i] <<
" [%] "
411 <<
"between bin " << i - 1 <<
" and " << i <<
endl);
417 template <
class T,
unsigned Dim>
420 const int emittedBins = pbin_m->getLastemittedBin();
422 for(
int i = 0; i < emittedBins; i++)
424 for(
unsigned int n = 0;
n < getLocalNum();
n++) {
425 if ( this->Bin[
n] > -1 ) {
426 bingamma_m[this->Bin[
n]] +=
sqrt(1.0 +
dot(this->P[
n], this->P[n]));
430 allreduce(*bingamma_m.get(), emittedBins, std::plus<double>());
432 for(
int i = 0; i < emittedBins; i++) {
433 if(pbin_m->getTotalNumPerBin(i) > 0)
434 bingamma_m[i] /= pbin_m->getTotalNumPerBin(i);
437 INFOMSG(
"Bin " << i <<
" : particle number = " << pbin_m->getTotalNumPerBin(i)
438 <<
" gamma = " << bingamma_m[i] <<
endl);
444 template <
class T,
unsigned Dim>
446 return bingamma_m[bin];
450 template <
class T,
unsigned Dim>
452 this->Q =
where(
eq(this->Bin, bin), q, 0.0);
456 template <
class T,
unsigned Dim>
458 this->Q =
where(
eq(this->Bin, bin), this->qi_m, 0.0);
462 template <
class T,
unsigned Dim>
465 std::size_t localnum = 0;
468 for(
unsigned long k = 0; k < getLocalNum(); ++ k)
469 if (
std::abs(
R[k](0) - meanR(0)) > x(0) ||
476 gather(&localnum, &globalPartPerNode_m[0], 1);
478 size_t npOutside = std::accumulate(globalPartPerNode_m.get(),
480 std::plus<size_t>());
495 template <
class T,
unsigned Dim>
497 std::vector<double> &lineDensity,
498 std::pair<double, double> &meshInfo)
501 get_bounds(rmin, rmax);
505 this->updateDomainLength(grid);
509 double length = rmax(2) - rmin(2);
510 double zmin = rmin(2) - dh_m * length, zmax = rmax(2) + dh_m * length;
511 double hz = (zmax - zmin) / (nBins - 2);
512 double perMeter = 1.0 / hz;
515 lineDensity.resize(nBins, 0.0);
516 std::fill(lineDensity.begin(), lineDensity.end(), 0.0);
518 const unsigned int lN = getLocalNum();
519 for (
unsigned int i = 0; i < lN; ++ i) {
520 const double z =
R[i](2) - 0.5 * hz;
521 unsigned int idx = (z - zmin) / hz;
522 double tau = (z - zmin) / hz - idx;
524 lineDensity[idx] += Q[i] * (1.0 - tau) * perMeter;
525 lineDensity[idx + 1] += Q[i] * tau * perMeter;
528 reduce(&(lineDensity[0]), &(lineDensity[0]) + nBins, &(lineDensity[0]),
OpAddAssign());
530 meshInfo.first = zmin;
531 meshInfo.second = hz;
536 template <
class T,
unsigned Dim>
544 if ( !(
R.isDirty() || ID.isDirty() ) && stateOfLastBoundP_ == unit_state_)
return;
546 stateOfLastBoundP_ = unit_state_;
549 const int dimIdx = (dcBeam_m? 2: 3);
557 this->updateDomainLength(nr_m);
559 get_bounds(rmin_m, rmax_m);
564 for(
int i = 0; i < dimIdx; i++) {
565 double length =
std::abs(rmax_m[i] - rmin_m[i]);
566 if (length < 1
e-10) {
570 rmax_m[i] += dh_m * length;
571 rmin_m[i] -= dh_m * length;
573 hr_m[i] = (rmax_m[i] - rmin_m[i]) / (nr_m[i] - 1);
576 rmax_m[2] = rmin_m[2] + periodLength_m;
577 hr_m[2] = periodLength_m / (nr_m[2] - 1);
579 for (
int i = 0; i < dimIdx; ++ i) {
580 volume *=
std::abs(rmax_m[i] - rmin_m[i]);
583 if (getIfBeamEmitting() && dist_m != NULL) {
585 double percent =
std::max(1.0 / (nr_m[2] - 1), dist_m->getPercentageEmitted());
586 double length =
std::abs(rmax_m[2] - rmin_m[2]) / (1.0 + 2 * dh_m);
587 if (percent < 1.0 && percent > 0.0) {
588 rmax_m[2] -= dh_m * length;
589 rmin_m[2] = rmax_m[2] - length / percent;
593 rmax_m[2] += dh_m * length;
594 rmin_m[2] -= dh_m * length;
596 hr_m[2] = (rmax_m[2] - rmin_m[2]) / (nr_m[2] - 1);
600 if (volume < 1
e-21 && getTotalNum() > 1 &&
std::abs(
sum(Q)) > 0.0) {
605 if(hr_m[0] * hr_m[1] * hr_m[2] <= 0) {
609 Vector_t origin = rmin_m -
Vector_t(hr_m[0] / 2.0, hr_m[1] / 2.0, hr_m[2] / 2.0);
610 this->updateFields(hr_m, origin);
621 template <
class T,
unsigned Dim>
627 const int dimIdx = 3;
630 std::unique_ptr<size_t[]> countLost;
632 const int tempN = pbin_m->getLastemittedBin();
633 countLost = std::unique_ptr<size_t[]>(
new size_t[tempN]);
634 for(
int ii = 0; ii < tempN; ii++) countLost[ii] = 0;
637 this->updateDomainLength(nr_m);
641 get_bounds(rmin_m, rmax_m);
644 len = rmax_m - rmin_m;
646 calcBeamParameters();
649 if (checkfactor != 0) {
652 if(checkfactor < 0) {
654 if (len[0] > checkfactor * rrms_m[0] ||
655 len[1] > checkfactor * rrms_m[1] ||
656 len[2] > checkfactor * rrms_m[2])
658 for(
unsigned int ii = 0; ii < this->getLocalNum(); ii++) {
662 if (
std::abs(
R[ii](0) - rmean_m(0)) > checkfactor * rrms_m[0] ||
663 std::abs(
R[ii](1) - rmean_m(1)) > checkfactor * rrms_m[1] ||
664 std::abs(
R[ii](2) - rmean_m(2)) > checkfactor * rrms_m[2])
670 countLost[Bin[ii]] += 1 ;
679 if (len[0] > checkfactor * rrms_m[0] ||
680 len[2] > checkfactor * rrms_m[2])
682 for(
unsigned int ii = 0; ii < this->getLocalNum(); ii++) {
686 if (
std::abs(
R[ii](0) - rmean_m(0)) > checkfactor * rrms_m[0] ||
687 std::abs(
R[ii](2) - rmean_m(2)) > checkfactor * rrms_m[2])
693 countLost[Bin[ii]] += 1 ;
703 for(
int i = 0; i < dimIdx; i++) {
704 double length =
std::abs(rmax_m[i] - rmin_m[i]);
705 rmax_m[i] += dh_m * length;
706 rmin_m[i] -= dh_m * length;
707 hr_m[i] = (rmax_m[i] - rmin_m[i]) / (nr_m[i] - 1);
711 this->updateFields(hr_m, rmin_m);
714 pbin_m->updatePartInBin_cyc(countLost.get());
720 countTotalNumPerBunch();
730 template <
class T,
unsigned Dim>
733 const unsigned int minNumParticlesPerCore = getMinimumNumberOfParticlesPerCore();
735 this->updateDomainLength(nr_m);
737 std::unique_ptr<size_t[]> tmpbinemitted;
742 const size_t localNum = getLocalNum();
744 if(weHaveEnergyBins()) {
745 tmpbinemitted = std::unique_ptr<size_t[]>(
new size_t[getNumberOfEnergyBins()]);
746 for(
int i = 0; i < getNumberOfEnergyBins(); i++) {
747 tmpbinemitted[i] = 0;
749 for(
unsigned int i = 0; i < localNum; i++) {
754 tmpbinemitted[Bin[i]]++;
757 for(
unsigned int i = 0; i < localNum; i++) {
758 if((Bin[i] < 0) && ((localNum - ne) > minNumParticlesPerCore)) {
763 lowParticleCount_m = ((localNum -
ne) <= minNumParticlesPerCore);
764 reduce(lowParticleCount_m, lowParticleCount_m,
OpOr());
767 if (lowParticleCount_m) {
769 m <<
level3 <<
"Warning low number of particles on some cores localNum= "
770 << localNum <<
" ne= " << ne <<
" NLocal= " << getLocalNum() <<
endl;
774 calcBeamParameters();
775 gatherLoadBalanceStatistics();
777 if(weHaveEnergyBins()) {
778 const int lastBin = dist_m->getLastEmittedEnergyBin();
779 for(
int i = 0; i < lastBin; i++) {
780 binemitted_m[i] = tmpbinemitted[i];
788 template <
class T,
unsigned Dim>
791 const unsigned int minNumParticlesPerCore = getMinimumNumberOfParticlesPerCore();
792 std::unique_ptr<size_t[]> tmpbinemitted;
794 const size_t localNum = getLocalNum();
795 const size_t totalNum = getTotalNum();
798 if(weHaveEnergyBins()) {
799 tmpbinemitted = std::unique_ptr<size_t[]>(
new size_t[getNumberOfEnergyBins()]);
800 for(
int i = 0; i < getNumberOfEnergyBins(); i++) {
801 tmpbinemitted[i] = 0;
803 for(
unsigned int i = 0; i < localNum; i++) {
808 tmpbinemitted[Bin[i]]++;
812 for(
size_t i = 0; i < localNum; i++) {
814 if ((localNum - ne) > minNumParticlesPerCore) {
820 lowParticleCount_m = ((localNum -
ne) <= minNumParticlesPerCore);
821 reduce(lowParticleCount_m, lowParticleCount_m,
OpOr());
825 performDestroy(
true);
828 calcBeamParameters();
829 gatherLoadBalanceStatistics();
831 if (weHaveEnergyBins()) {
832 const int lastBin = dist_m->getLastEmittedEnergyBin();
833 for(
int i = 0; i < lastBin; i++) {
834 binemitted_m[i] = tmpbinemitted[i];
837 size_t newTotalNum = getLocalNum();
840 setTotalNum(newTotalNum);
842 return totalNum - newTotalNum;
845 template <
class T,
unsigned Dim>
851 template <
class T,
unsigned Dim>
857 template <
class T,
unsigned Dim>
863 template <
class T,
unsigned Dim>
869 template <
class T,
unsigned Dim>
876 template <
class T,
unsigned Dim>
878 return this->
R[i](0);
883 template <
class T,
unsigned Dim>
885 return this->
R[i](1);
890 template <
class T,
unsigned Dim>
892 return this->
R[i](2);
897 template <
class T,
unsigned Dim>
904 template <
class T,
unsigned Dim>
910 template <
class T,
unsigned Dim>
917 template <
class T,
unsigned Dim>
920 this->getLocalBounds(rmin, rmax);
924 for (
unsigned int i = 0; i <
Dim; ++i) {
926 min[2*i + 1] = -rmax[i];
929 allreduce(min, 2*Dim, std::less<double>());
931 for (
unsigned int i = 0; i <
Dim; ++i) {
933 rmax[i] = -min[2*i + 1];
938 template <
class T,
unsigned Dim>
940 const size_t localNum = getLocalNum();
942 double maxValue = 1e8;
943 rmin =
Vector_t(maxValue, maxValue, maxValue);
944 rmax =
Vector_t(-maxValue, -maxValue, -maxValue);
950 for (
size_t i = 1; i < localNum; ++ i) {
951 for (
unsigned short d = 0; d < 3u; ++ d) {
952 if (rmin(d) >
R[i](d)) rmin(d) =
R[i](d);
953 else if (rmax(d) <
R[i](d)) rmax(d) =
R[i](d);
959 template <
class T,
unsigned Dim>
962 get_bounds(rmin, rmax);
964 std::pair<Vector_t, double> sphere;
965 sphere.first = 0.5 * (rmin + rmax);
966 sphere.second =
sqrt(
dot(rmax - sphere.first, rmax - sphere.first));
972 template <
class T,
unsigned Dim>
975 getLocalBounds(rmin, rmax);
977 std::pair<Vector_t, double> sphere;
978 sphere.first = 0.5 * (rmin + rmax);
979 sphere.second =
sqrt(
dot(rmax - sphere.first, rmax - sphere.first));
985 template <
class T,
unsigned Dim>
990 size_t i = getTotalNum();
1001 msg <<
"Created one particle i= " << i <<
endl;
1005 template <
class T,
unsigned Dim>
1016 template <
class T,
unsigned Dim>
1027 template <
class T,
unsigned Dim>
1040 template <
class T,
unsigned Dim>
1042 double &axmax,
double &aymax) {
1043 axmax = aymax = 0.0;
1046 for(
unsigned int ii = 0; ii < getLocalNum(); ii++) {
1048 part = get_part(ii);
1051 D(0, 0) * part.
x() + D(0, 1) * part.
px() + D(0, 2) * part.
y() +
1052 D(0, 3) * part.
py() + D(0, 4) * part.
t() + D(0, 5) * part.
pt();
1054 D(1, 0) * part.
x() + D(1, 1) * part.
px() + D(1, 2) * part.
y() +
1055 D(1, 3) * part.
py() + D(1, 4) * part.
t() + D(1, 5) * part.
pt();
1057 D(2, 0) * part.
x() + D(2, 1) * part.
px() + D(2, 2) * part.
y() +
1058 D(2, 3) * part.
py() + D(2, 4) * part.
t() + D(2, 5) * part.
pt();
1060 D(3, 0) * part.
x() + D(3, 1) * part.
px() + D(3, 2) * part.
y() +
1061 D(3, 3) * part.
py() + D(3, 4) * part.
t() + D(3, 5) * part.
pt();
1063 axmax =
std::max(axmax, (xnor * xnor + pxnor * pxnor));
1064 aymax =
std::max(aymax, (ynor * ynor + pynor * pynor));
1069 template <
class T,
unsigned Dim>
1075 template <
class T,
unsigned Dim>
1081 template <
class T,
unsigned Dim>
1087 template <
class T,
unsigned Dim>
1093 template <
class T,
unsigned Dim>
1099 template <
class T,
unsigned Dim>
1105 template <
class T,
unsigned Dim>
1111 template <
class T,
unsigned Dim>
1113 return eKin_m / (getM()*1
e-6) + 1.0;
1117 template <
class T,
unsigned Dim>
1123 template <
class T,
unsigned Dim>
1129 template <
class T,
unsigned Dim>
1135 template <
class T,
unsigned Dim>
1141 template <
class T,
unsigned Dim>
1147 template <
class T,
unsigned Dim>
1153 template <
class T,
unsigned Dim>
1159 template <
class T,
unsigned Dim>
1165 template <
class T,
unsigned Dim>
1171 template <
class T,
unsigned Dim>
1174 return dist_m->get_pmean();
1176 double gamma = 0.1 / getM() + 1;
1181 template <
class T,
unsigned Dim>
1187 template <
class T,
unsigned Dim>
1193 template <
class T,
unsigned Dim>
1199 template <
class T,
unsigned Dim>
1205 template <
class T,
unsigned Dim>
1211 template <
class T,
unsigned Dim>
1217 template <
class T,
unsigned Dim>
1223 template <
class T,
unsigned Dim>
1229 template <
class T,
unsigned Dim>
1235 template <
class T,
unsigned Dim>
1239 globalPartPerNode_m[i] = 0;
1241 std::size_t localnum = getLocalNum();
1242 gather(&localnum, &globalPartPerNode_m[0], 1);
1246 template <
class T,
unsigned Dim>
1248 return globalPartPerNode_m[p];
1252 template <
class T,
unsigned Dim>
1254 bounds(this->P, min, max);
1258 template <
class T,
unsigned Dim>
1261 Vector_t eps2, fac, rsqsum, psqsum, rpsum;
1265 const size_t locNp = getLocalNum();
1266 const size_t totalNum = getTotalNum();
1267 const double zero = 0.0;
1269 get_bounds(rmin_m, rmax_m);
1272 for(
unsigned int i = 0 ; i <
Dim; i++) {
1277 eps_norm_m(i) = 0.0;
1286 const size_t intN = calcMoments();
1287 const double N =
static_cast<double>(intN);
1289 for(
unsigned int i = 0 ; i <
Dim; i++) {
1290 rmean_m(i) = centroid_m[2 * i] / N;
1291 pmean_m(i) = centroid_m[(2 * i) + 1] / N;
1292 rsqsum(i) = moments_m(2 * i, 2 * i) - N * rmean_m(i) * rmean_m(i);
1293 psqsum(i) = moments_m((2 * i) + 1, (2 * i) + 1) - N * pmean_m(i) * pmean_m(i);
1296 rpsum(i) = moments_m((2 * i), (2 * i) + 1) - N * rmean_m(i) * pmean_m(i);
1298 eps2 = (rsqsum * psqsum - rpsum * rpsum) / (N * N);
1301 for(
unsigned int i = 0 ; i <
Dim; i++) {
1302 rrms_m(i) =
sqrt(rsqsum(i) / N);
1303 prms_m(i) =
sqrt(psqsum(i) / N);
1305 double tmp = rrms_m(i) * prms_m(i);
1306 fac(i) = (tmp == 0) ? zero : 1.0 / tmp;
1309 rprms_m = rpsum * fac;
1311 Dx_m = moments_m(0, 5) / N;
1312 DDx_m = moments_m(1, 5) / N;
1314 Dy_m = moments_m(2, 5) / N;
1315 DDy_m = moments_m(3, 5) / N;
1319 for(
size_t i = 0; i < locNp; i++)
1320 gamma +=
sqrt(1.0 +
dot(P[i], P[i]));
1322 allreduce(&gamma, 1, std::plus<double>());
1331 const double m0 = getM() * 1.E-6;
1332 double tmp = 1.0 /
std::pow(eKin_m / m0 + 1., 2.0);
1334 dE_m = prms_m(1) * m0 *
sqrt(1.0 - tmp);
1336 dE_m = prms_m(2) * m0 *
sqrt(1.0 - tmp);
1339 eps_m = eps_norm_m /
Vector_t(gamma *
sqrt(1.0 - 1.0 / (gamma * gamma)));
1345 template <
class T,
unsigned Dim>
1349 const double N =
static_cast<double>(getTotalNum());
1362 Vector_t eps2, fac, rsqsum, psqsum, rpsum;
1364 const double zero = 0.0;
1365 const double N =
static_cast<double>(pbin_m->getNp());
1366 calcMomentsInitial();
1368 for(
unsigned int i = 0 ; i <
Dim; i++) {
1369 rmean_m(i) = centroid_m[2 * i] / N;
1370 pmean_m(i) = centroid_m[(2 * i) + 1] / N;
1371 rsqsum(i) = moments_m(2 * i, 2 * i) - N * rmean_m(i) * rmean_m(i);
1372 psqsum(i) = moments_m((2 * i) + 1, (2 * i) + 1) - N * pmean_m(i) * pmean_m(i);
1375 rpsum(i) = moments_m((2 * i), (2 * i) + 1) - N * rmean_m(i) * pmean_m(i);
1377 eps2 = (rsqsum * psqsum - rpsum * rpsum) / (N * N);
1380 for(
unsigned int i = 0 ; i <
Dim; i++) {
1382 rrms_m(i) =
sqrt(rsqsum(i) / N);
1383 prms_m(i) =
sqrt(psqsum(i) / N);
1385 double tmp = rrms_m(i) * prms_m(i);
1386 fac(i) = (tmp == 0) ? zero : 1.0 / tmp;
1388 rprms_m = rpsum * fac;
1394 template <
class T,
unsigned Dim>
1396 return couplingConstant_m;
1400 template <
class T,
unsigned Dim>
1402 couplingConstant_m =
c;
1406 template <
class T,
unsigned Dim>
1409 if(getTotalNum() != 0)
1412 WARNMSG(
"Could not set total charge in PartBunch::setCharge based on getTotalNum" <<
endl);
1416 template <
class T,
unsigned Dim>
1422 template <
class T,
unsigned Dim>
1429 template <
class T,
unsigned Dim>
1432 return dist_m->getEkin();
1438 template <
class T,
unsigned Dim>
1441 return dist_m->getWorkFunctionRf();
1446 template <
class T,
unsigned Dim>
1449 return dist_m->getLaserEnergy();
1455 template <
class T,
unsigned Dim>
1461 template <
class T,
unsigned Dim>
1467 template <
class T,
unsigned Dim>
1470 fs_m->initSolver(
this);
1477 this->initialize(fs_m->getFieldLayout());
1484 template <
class T,
unsigned Dim>
1487 return fs_m->hasValidSolver();
1494 template <
class T,
unsigned Dim>
1497 return fs_m->getFieldSolverType();
1503 template <
class T,
unsigned Dim>
1509 template <
class T,
unsigned Dim>
1511 return stepsPerTurn_m;
1515 template <
class T,
unsigned Dim>
1517 globalTrackStep_m =
n;
1521 template <
class T,
unsigned Dim>
1523 return globalTrackStep_m;
1527 template <
class T,
unsigned Dim>
1529 localTrackStep_m =
n;
1533 template <
class T,
unsigned Dim>
1535 globalTrackStep_m++; localTrackStep_m++;
1539 template <
class T,
unsigned Dim>
1541 return localTrackStep_m;
1545 template <
class T,
unsigned Dim>
1548 bunchTotalNum_m.resize(n);
1549 bunchLocalNum_m.resize(n);
1553 template <
class T,
unsigned Dim>
1559 template <
class T,
unsigned Dim>
1561 PAssert_LT(n, (
short)bunchTotalNum_m.size());
1562 bunchTotalNum_m[
n] = totalnum;
1566 template <
class T,
unsigned Dim>
1568 PAssert_LT(n, (
short)bunchTotalNum_m.size());
1569 return bunchTotalNum_m[
n];
1573 template <
class T,
unsigned Dim>
1575 PAssert_LT(n, (
short)bunchLocalNum_m.size());
1576 bunchLocalNum_m[
n] = localnum;
1580 template <
class T,
unsigned Dim>
1582 PAssert_LT(n, (
short)bunchLocalNum_m.size());
1583 return bunchLocalNum_m[
n];
1587 template <
class T,
unsigned Dim>
1589 bunchTotalNum_m.clear();
1590 bunchTotalNum_m.resize(numBunch_m);
1591 bunchLocalNum_m.clear();
1592 bunchLocalNum_m.resize(numBunch_m);
1594 for (
size_t i = 0; i < this->getLocalNum(); ++i) {
1596 ++bunchLocalNum_m[this->bunchNum[i]];
1599 allreduce(bunchLocalNum_m.data(), bunchTotalNum_m.data(),
1600 bunchLocalNum_m.size(), std::plus<size_t>());
1602 size_t totalnum = std::accumulate(bunchTotalNum_m.begin(),
1603 bunchTotalNum_m.end(), 0);
1605 if ( totalnum != this->getTotalNum() )
1606 throw OpalException(
"PartBunchBase::countTotalNumPerBunch()",
1607 "Sum of total number of particles per bunch (" +
1608 std::to_string(totalnum) +
") != total number of particles (" +
1609 std::to_string(this->getTotalNum()) +
")");
1613 template <
class T,
unsigned Dim>
1615 globalMeanR_m = globalMeanR;
1619 template <
class T,
unsigned Dim>
1621 return globalMeanR_m;
1625 template <
class T,
unsigned Dim>
1628 globalToLocalQuaternion_m = globalToLocalQuaternion;
1632 template <
class T,
unsigned Dim>
1634 return globalToLocalQuaternion_m;
1638 template <
class T,
unsigned Dim>
1640 SteptoLastInj_m =
n;
1644 template <
class T,
unsigned Dim>
1646 return SteptoLastInj_m;
1650 template <
class T,
unsigned Dim>
1653 const int emittedBins = pbin_m->getLastemittedBin();
1654 double phi[emittedBins];
1655 double px[emittedBins];
1656 double py[emittedBins];
1657 double meanPhi = 0.0;
1659 for(
int ii = 0; ii < emittedBins; ii++) {
1665 for(
unsigned int ii = 0; ii < getLocalNum(); ii++) {
1667 px[Bin[ii]] += P[ii](0);
1668 py[Bin[ii]] += P[ii](1);
1673 for(
int ii = 0; ii < emittedBins; ii++) {
1674 phi[ii] = calculateAngle(px[ii], py[ii]);
1679 meanPhi /= emittedBins;
1690 template <
class T,
unsigned Dim>
1696 int maxbin = pbin_m->getNBins();
1697 size_t partInBin[maxbin];
1698 for(
int ii = 0; ii < maxbin; ii++) partInBin[ii] = 0;
1700 double pMin0 = 1.0e9;
1702 double maxbinIndex = 0;
1704 for(
unsigned long int n = 0;
n < getLocalNum();
n++) {
1705 double temp_betagamma =
sqrt(
pow(P[
n](0), 2) +
pow(P[
n](1), 2));
1706 if(pMin0 > temp_betagamma)
1707 pMin0 = temp_betagamma;
1712 double asinh0 = asinh(pMin);
1713 for(
unsigned long int n = 0;
n < getLocalNum();
n++) {
1715 double temp_betagamma =
sqrt(
pow(P[
n](0), 2) +
pow(P[
n](1), 2));
1716 int itsBinID =
floor((asinh(temp_betagamma) - asinh0) / eta + 1.0E-6);
1718 if(maxbinIndex < itsBinID) {
1719 maxbinIndex = itsBinID;
1722 if(itsBinID >= maxbin) {
1723 ERRORMSG(
"The bin number limit is " << maxbin <<
", please increase the energy interval and try again" <<
endl);
1726 partInBin[itsBinID]++;
1731 pbin_m->resetPartInBin_cyc(partInBin, maxbinIndex);
1742 template <
class T,
unsigned Dim>
1744 int maxbin = pbin_m->getNBins();
1745 std::size_t partInBin[maxbin];
1746 for (
int i = 0; i < maxbin; ++i) {
1750 for (std::size_t i = 0; i < getLocalNum(); ++i) {
1751 partInBin[Bin[i]]++;
1755 pbin_m->resetPartInBin_cyc(partInBin, numBunch_m - 1);
1764 template <
class T,
unsigned Dim>
1766 return reference->getQ();
1770 template <
class T,
unsigned Dim>
1772 return reference->getM();
1776 template <
class T,
unsigned Dim>
1778 return reference->getP();
1782 template <
class T,
unsigned Dim>
1784 return reference->getE();
1788 template <
class T,
unsigned Dim>
1793 template <
class T,
unsigned Dim>
1798 template <
class T,
unsigned Dim>
1800 const_cast<PartData *
>(reference)->setQ(q);
1804 template <
class T,
unsigned Dim>
1806 const_cast<PartData *
>(reference)->setM(m);
1810 template <
class T,
unsigned Dim>
1816 template <
class T,
unsigned Dim>
1818 return reference->getBeta();
1822 template <
class T,
unsigned Dim>
1824 return reference->getGamma();
1828 template <
class T,
unsigned Dim>
1834 template <
class T,
unsigned Dim>
1840 template <
class T,
unsigned Dim>
1847 template <
class T,
unsigned Dim>
1853 template <
class T,
unsigned Dim>
1855 return dist_m->getEmissionDeltaT();
1859 template <
class T,
unsigned Dim>
1861 binemitted_m[binNumber]++;
1865 template <
class T,
unsigned Dim>
1868 const double totalNp =
static_cast<double>(getTotalNum());
1869 const double locNp =
static_cast<double>(getLocalNum());
1873 for(
unsigned int k = 0; k < locNp; k++) {
1874 eKin_m +=
sqrt(
dot(P[k], P[k]) + 1.0);
1878 eKin_m *= getM() * 1.0e-6;
1886 template <
class T,
unsigned Dim>
1889 const double totalNp =
static_cast<double>(getTotalNum());
1890 const double locNp =
static_cast<double>(getLocalNum());
1893 for(
unsigned int k = 0; k < locNp; k++)
1894 avrgp +=
sqrt(
dot(P[k], P[k]));
1899 for(
unsigned int k = 0; k < locNp; k++)
1900 P[k](2) = P[k](2) - avrgp + avrgp_m;
1904 template <
class T,
unsigned Dim>
1907 if(getTotalNum() != 0) {
1910 double pathLength = get_sPos();
1912 os << std::scientific;
1914 os <<
"* ************** B U N C H ********************************************************* \n";
1915 os <<
"* NP = " << getTotalNum() <<
"\n";
1922 if (getTotalNum() >= 2) {
1924 os <<
"* rms momenta = " << std::setw(12) << std::setprecision(5) << prms_m <<
" [beta gamma]\n";
1926 os <<
"* mean momenta = " << std::setw(12) << std::setprecision(5) << pmean_m <<
" [beta gamma]\n";
1927 os <<
"* rms emittance = " << std::setw(12) << std::setprecision(5) << eps_m <<
" (not normalized)\n";
1928 os <<
"* rms correlation = " << std::setw(12) << std::setprecision(5) << rprms_m <<
"\n";
1931 os <<
"* dh = " << std::setw(13) << std::setprecision(5) << dh_m * 100 <<
" [%]\n";
1935 os <<
"* ********************************************************************************** " <<
endl;
1942 template <
class T,
unsigned Dim>
1945 double part[2 *
Dim];
1947 const unsigned long localNum = getLocalNum();
1959 std::vector<double> loc_moments(4 *
Dim +
Dim * ( 2 *
Dim + 1 ));
1961 long int totalNum = this->getTotalNum();
1966 for(
unsigned long k = 0; k < localNum; ++ k) {
1975 unsigned int l = 2 *
Dim;
1976 for (
unsigned int i = 0; i < 2 *
Dim; ++i) {
1977 loc_moments[i] -= part[i];
1978 for(
unsigned int j = 0; j <= i; j++) {
1979 loc_moments[l++] -= part[i] * part[j];
1983 for (
unsigned int i = 0; i <
Dim; ++i) {
1984 double r2 =
R[k](i) *
R[k](i);
1985 loc_moments[l] -= r2 *
R[k](i);
1986 loc_moments[Dim + l++] -= r2 * r2;
1993 allreduce(totalNum, 1, std::less<long int>());
1996 for(
unsigned long k = 0; k < localNum; ++ k) {
2004 unsigned int l = 2 *
Dim;
2005 for (
unsigned int i = 0; i < 2 *
Dim; ++i) {
2006 loc_moments[i] += part[i];
2007 for(
unsigned int j = 0; j <= i; j++) {
2008 loc_moments[l++] += part[i] * part[j];
2012 for (
unsigned int i = 0; i <
Dim; ++i) {
2013 double r2 =
R[k](i) *
R[k](i);
2014 loc_moments[l] += r2 *
R[k](i);
2015 loc_moments[Dim + l++] += r2 * r2;
2019 allreduce(loc_moments.data(), loc_moments.size(), std::plus<double>());
2022 for (
unsigned int i = 0; i< 2 *
Dim; ++i)
2023 centroid_m[i] = loc_moments[i];
2025 unsigned int l = 2 *
Dim;
2026 for (
unsigned int i = 0; i < 2 *
Dim; ++i) {
2027 for(
unsigned int j = 0; j <= i; j++) {
2028 moments_m(i, j) = loc_moments[l++];
2029 moments_m(j, i) = moments_m(i, j);
2038 int j = 2 * Dim + Dim * ( 2 * Dim + 1 );
2039 double invN = 1.0 / double(totalNum);
2040 for (
unsigned int i = 0; i <
Dim; ++i) {
2041 double w1 = centroid_m[2 * i] * invN;
2042 double w2 = moments_m(2 * i, 2 * i) * invN;
2043 double w3 = loc_moments[j + i] * invN;
2044 double w4 = loc_moments[j + Dim + i] * invN;
2046 halo_m(i) = w4 + w1 * (-4.0 * w3 + w1 * (6.0 * w2 - 3.0 * w1 * w1));
2047 double tmp = w2 - w1 * w1;
2048 halo_m(i) /= ( tmp * tmp );
2056 template <
class T,
unsigned Dim>
2059 double part[2 *
Dim];
2061 for(
unsigned int i = 0; i < 2 *
Dim; ++i) {
2062 centroid_m[i] = 0.0;
2063 for(
unsigned int j = 0; j <= i; ++j) {
2064 moments_m(i, j) = 0.0;
2065 moments_m(j, i) = moments_m(i, j);
2069 for(
size_t k = 0; k < pbin_m->getNp(); k++) {
2070 for(
int binNumber = 0; binNumber < pbin_m->getNBins(); binNumber++) {
2071 std::vector<double> p;
2073 if(pbin_m->getPart(k, binNumber, p)) {
2081 for(
unsigned int i = 0; i < 2 *
Dim; ++i) {
2082 centroid_m[i] += part[i];
2083 for(
unsigned int j = 0; j <= i; ++j) {
2084 moments_m(i, j) += part[i] * part[j];
2091 for(
unsigned int i = 0; i < 2 *
Dim; ++i) {
2092 for(
unsigned int j = 0; j < i; ++j) {
2093 moments_m(j, i) = moments_m(i, j);
2100 template <
class T,
unsigned Dim>
2102 double thetaXY =
atan2(y, x);
2108 template <
class T,
unsigned Dim>
2109 Inform &operator<<(Inform &os, PartBunchBase<T, Dim> &p) {
2118 template <
class T,
unsigned Dim>
2120 throw OpalException(
"PartBunchBase<T, Dim>::runTests() ",
"No test supported.");
2124 template <
class T,
unsigned Dim>
2129 template <
class T,
unsigned Dim>
2131 if (i >= getLocalNum() || j >= getLocalNum() || i == j)
return;
2133 std::swap(
R[i],
R[j]);
2134 std::swap(P[i], P[j]);
2135 std::swap(Q[i], Q[j]);
2136 std::swap(M[i], M[j]);
2137 std::swap(Phi[i], Phi[j]);
2138 std::swap(Ef[i], Ef[j]);
2139 std::swap(Eftmp[i], Eftmp[j]);
2140 std::swap(Bf[i], Bf[j]);
2141 std::swap(Bin[i], Bin[j]);
2142 std::swap(dt[i], dt[j]);
2143 std::swap(PType[i], PType[j]);
2144 std::swap(TriID[i], TriID[j]);
2145 std::swap(cavityGapCrossed[i], cavityGapCrossed[j]);
2146 std::swap(bunchNum[i], bunchNum[j]);
2150 template <
class T,
unsigned Dim>
2152 throw OpalException(
"PartBunchBase<T, Dim>::setBCAllPeriodic() ",
"Not supported BC.");
2156 template <
class T,
unsigned Dim>
2158 throw OpalException(
"PartBunchBase<T, Dim>::setBCAllOpen() ",
"Not supported BC.");
2162 template <
class T,
unsigned Dim>
2164 throw OpalException(
"PartBunchBase<T, Dim>::setBCForDCBeam() ",
"Not supported BC.");
2168 template <
class T,
unsigned Dim>
2175 template <
class T,
unsigned Dim>
2205 globalPartPerNode_m = std::unique_ptr<size_t[]>(
new size_t[
Ippl::getNodes()]);
2220 setMinimumNumberOfParticlesPerCore(0);
2224 template <
class T,
unsigned Dim>
2226 return pbase->getTotalNum();
2229 template <
class T,
unsigned Dim>
2231 return pbase->getLocalNum();
2235 template <
class T,
unsigned Dim>
2237 return pbase->getDestroyNum();
2240 template <
class T,
unsigned Dim>
2242 return pbase->getGhostNum();
2245 template <
class T,
unsigned Dim>
2247 pbase->setTotalNum(n);
2250 template <
class T,
unsigned Dim>
2252 pbase->setLocalNum(n);
2255 template <
class T,
unsigned Dim>
2257 return pbase->getMinimumNumberOfParticlesPerCore();
2260 template <
class T,
unsigned Dim>
2262 pbase->setMinimumNumberOfParticlesPerCore(n);
2265 template <
class T,
unsigned Dim>
2267 return pbase->getLayout();
2270 template <
class T,
unsigned Dim>
2272 return pbase->getLayout();
2275 template <
class T,
unsigned Dim>
2277 return pbase->getUpdateFlag(f);
2280 template <
class T,
unsigned Dim>
2282 pbase->setUpdateFlag(f, val);
2285 template <
class T,
unsigned Dim>
2287 return pbase->singleInitNode();
2290 template <
class T,
unsigned Dim>
2295 template <
class T,
unsigned Dim>
2304 template <
class T,
unsigned Dim>
2307 pbase->update(canSwap);
2313 template <
class T,
unsigned Dim>
2315 pbase->createWithID(
id);
2318 template <
class T,
unsigned Dim>
2323 template <
class T,
unsigned Dim>
2325 pbase->globalCreate(np);
2328 template <
class T,
unsigned Dim>
2330 pbase->destroy(M, I, doNow);
2333 template <
class T,
unsigned Dim>
2335 pbase->performDestroy(updateLocalNum);
2338 template <
class T,
unsigned Dim>
2340 pbase->ghostDestroy(M, I);
2343 template <
class T,
unsigned Dim>
2348 template <
class T,
unsigned Dim>
2353 for (
unsigned int i = 0; i <
Dim; i++) {
2354 rpmean(2*i)= rmean_m(i);
2355 rpmean((2*i)+1)= pmean_m(i);
2359 for (
unsigned int i = 0; i < 2 *
Dim; i++) {
2360 for (
unsigned int j = 0; j <= i; j++) {
2361 sigmaMatrix[i][j] = moments_m(i, j) - rpmean(i) * rpmean(j);
2362 sigmaMatrix[j][i] = sigmaMatrix[i][j];
virtual void swap(unsigned int i, unsigned int j)
double getWorkFunctionRf() const
Need the work function for the Schottky effect calculation (eV)
double & py()
Get reference to vertical momentum (no dimension).
Vector_t get_rprms() const
virtual double getPy0(int i)
IpplTimings::TimerRef selfFieldTimer_m
timer for selfField calculation
void switchOffUnitlessPositions(bool use_dt_per_particle=false)
double haloShift
The constant parameter C to shift halo, by < w^4 > / < w^2 > ^2 - C (w=x,y,z)
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
void getLocalBounds(Vector_t &rmin, Vector_t &rmax)
IpplTimings::TimerRef distrCreate_m
int getLastEmittedEnergyBin()
constexpr double e
The value of .
void destroy(size_t M, size_t I, bool doNow=false)
void setMinimumNumberOfParticlesPerCore(unsigned int n)
double calcMeanPhi()
calculate average angle of longitudinal direction of bins
std::string getFieldSolverType() const
Return the fieldsolver type if we have a fieldsolver.
void setPType(ParticleType::type)
long long getLocalTrackStep() const
ParticleType::type getPType() const
void gatherLoadBalanceStatistics()
The FieldSolver definition.
unsigned int getMinimumNumberOfParticlesPerCore() const
void setLocalNum(size_t n)
virtual void set_meshEnlargement(double dh)
void setLocalNumPerBunch(size_t numpart, short n)
void setGlobalMeanR(Vector_t globalMeanR)
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
The base class for all OPAL exceptions.
void setDistribution(Distribution *d, std::vector< Distribution * > addedDistributions, size_t &np)
double & x()
Get reference to horizontal position in m.
void setGlobalToLocalQuaternion(Quaternion_t globalToLocalQuaternion)
constexpr double two_pi
The value of .
PETE_TBTree< OpEQ, Index::PETE_Expr_t, PETE_Scalar< double > > eq(const Index &idx, double x)
Vector_t get_rrms() const
virtual void updateFields(const Vector_t &hr, const Vector_t &origin)
int getNumberOfEnergyBins()
double getCouplingConstant() const
virtual void do_binaryRepart()
const PartData * getReference() const
double get_meanKineticEnergy() const
virtual void setBCForDCBeam()
void setLocalTrackStep(long long n)
step in a TRACK command
void calcMomentsInitial()
void push_back(OpalParticle p)
Vector_t get_pmean_Distribution() const
PETE_TBTree< OpNE, Index::PETE_Expr_t, PETE_Scalar< double > > ne(const Index &idx, double x)
virtual double getY(int i)
Vector_t get_emit() const
std::string getLengthString(double spos, unsigned int precision=3)
void setTotalNumPerBunch(size_t numpart, short n)
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
size_t getGhostNum() const
FMatrix< double, 2 *Dim, 2 *Dim > getSigmaMatrix()
size_t getTotalNum() const
virtual void resetInterpolationCache(bool clearCache=false)
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
Vector_t get_prms() const
virtual void setBCAllOpen()
virtual const std::string & where() const
double getInitialBeta() const
std::string getChargeString(double charge, unsigned int precision=3)
Inform & level2(Inform &inf)
void ghostDestroy(size_t M, size_t I)
std::unique_ptr< size_t[]> globalPartPerNode_m
void bounds(const PETE_Expr< T1 > &expr, Vektor< T2, D > &minval, Vektor< T2, D > &maxval)
IpplTimings::TimerRef distrReload_m
timer for IC, can not be in Distribution.h
bool reduce(Communicate &, InputIterator, InputIterator, OutputIterator, const ReduceOp &, bool *IncludeVal=0)
Vector_t get_rmean() const
static OpalData * getInstance()
void setCouplingConstant(double c)
void calcBeamParameters()
virtual double getPy(int i)
virtual double getGamma(int i)
Vector_t get_pmean() const
Vector_t get_maxExtent() const
Vector_t get_halo() const
ParticleLayout< T, Dim > & getLayout()
PartBunchBase(AbstractParticle< T, Dim > *pb)
constexpr double pi
The value of .
IpplTimings::TimerRef boundpTimer_m
void gather(const T *input, T *output, int count, int root=0)
bool singleInitNode() const
void setUpdateFlag(UpdateFlags_t f, bool val)
void countTotalNumPerBunch()
IpplTimings::TimerRef boundpBoundsTimer_m
OpalParticle get_part(int ii)
virtual double getBeta(int i)
std::string getTimeString(double time, unsigned int precision=3)
Quaternion_t getGlobalToLocalQuaternion()
void allreduce(const T *input, T *output, int count, Op op)
constexpr double c
The velocity of light in m/s.
void setEnergyBins(int numberOfEnergyBins)
size_t getTotalNumPerBunch(short n) const
void setStepsPerTurn(int n)
static void startTimer(TimerRef t)
void get_PBounds(Vector_t &min, Vector_t &max) const
double getChargePerParticle() const
get the macro particle charge
virtual void addAttribute(ParticleAttribBase &pa)=0
void setTEmission(double t)
virtual double getY0(int i)
std::unique_ptr< Inform > pmsg_m
size_t calcNumPartsOutside(Vector_t x)
returns the number of particles outside of a box defined by x
PETE_TTTree< OpWhere, typename Cond_t::PETE_Expr_t, typename True_t::PETE_Expr_t, PETE_Scalar< Vektor< T, Dim > > > where(const PETE_Expr< Cond_t > &c, const PETE_Expr< True_t > &t, const Vektor< T, Dim > &f)
PETE_TBTree< FnArcTan2, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > atan2(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
Vector_t get_norm_emit() const
void switchToUnitlessPositions(bool use_dt_per_particle=false)
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
double getInitialGamma() const
Vektor< double, 3 > Vector_t
void setMass(double mass)
void setTotalNum(size_t n)
Vector_t get_origin() const
void maximumAmplitudes(const FMatrix< double, 6, 6 > &D, double &axmax, double &aymax)
Return maximum amplitudes.
size_t getLocalNum() const
Vector_t get_centroid() const
void set_part(FVector< double, 6 > z, int ii)
double & pt()
Get reference to relative momentum error (no dimension).
virtual double getPx0(int i)
size_t getLocalNumPerBunch(short n) const
Inform & print(Inform &os)
IpplTimings::TimerRef histoTimer_m
Tps< T > sqrt(const Tps< T > &x)
Square root.
double getCharge() const
get the total charge per simulation particle
void setLocalBinCount(size_t num, int bin)
short getNumBunch() const
void performDestroy(bool updateLocalNum=false)
IpplTimings::TimerRef boundpUpdateTimer_m
bool resetPartBinID2(const double eta)
reset Bin[] for each particle according to the method given in paper PAST-AB(064402) by G...
std::pair< Vector_t, double > getLocalBoundingSphere()
virtual double getPz(int i)
void createWithID(unsigned id)
void globalCreate(size_t np)
virtual double getX0(int i)
virtual Vector_t get_hr() const
void setNumBunch(short n)
double getBinGamma(int bin)
Get gamma of one bin.
double getQ() const
Access to reference data.
size_t getLoadBalance(int p) const
double & y()
Get reference to vertical displacement in m.
size_t getDestroyNum() const
size_t getNumberOfEmissionSteps()
std::unique_ptr< LossDataSink > lossDs_m
virtual void setBCAllPeriodic()
std::ios_base::fmtflags FmtFlags_t
void calcGammas()
Compute the gammas of all bins.
virtual const char * what() const
virtual void setBinCharge(int bin, double q)
Set the charge of one bin to the value of q and all other to zero.
virtual double getZ(int i)
double & t()
Get reference to longitudinal displacement c*t in m.
std::pair< Vector_t, double > getBoundingSphere()
virtual void setSolver(FieldSolver *fs)
void iterateEmittedBin(int binNumber)
Inform & level3(Inform &inf)
double & px()
Get reference to horizontal momentum (no dimension).
const PartData * reference
void setBeamFrequency(double v)
double getEmissionDeltaT()
static TimerRef getTimer(const char *nm)
IpplTimings::TimerRef statParamTimer_m
double getLaserEnergy() const
Need the laser energy for the Schottky effect calculation (eV)
void get_bounds(Vector_t &rmin, Vector_t &rmax)
virtual void setZ(int i, double zcoo)
virtual double getX(int i)
static void stopTimer(TimerRef t)
virtual double getPx(int i)
int getStepsPerTurn() const
void calcBeamParametersInitial()
Inform & level1(Inform &inf)
std::string getEnergyString(double energyInMeV, unsigned int precision=3)
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
bool getUpdateFlag(UpdateFlags_t f) const
void createOpalT(PartBunchBase< double, 3 > *beam, std::vector< Distribution * > addedDistributions, size_t &numberOfParticles)
void setChargeZeroPart(double q)
void calcLineDensity(unsigned int nBins, std::vector< double > &lineDensity, std::pair< double, double > &meshInfo)
calculates the 1d line density (not normalized) and append it to a file.
double getEkin() const
Need Ek for the Schottky effect calculation (eV)
void setPBins(PartBins *pbin)
void setup(AbstractParticle< T, Dim > *pb)
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Inform & endl(Inform &inf)
Vector_t getGlobalMeanR()
void setGlobalTrackStep(long long n)
step in multiple TRACK commands
double calculateAngle(double x, double y)
angle range [0~2PI) degree
void setSteptoLastInj(int n)
size_t emitParticles(double eZ)
Emit particles in the given bin i.e. copy the particles from the bin structure into the particle cont...
long long getGlobalTrackStep() const
void correctEnergy(double avrgp)