OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
DistributionMoments.h
Go to the documentation of this file.
1//
2// Class DistributionMoments
3// Computes the statistics of particle distributions.
4//
5// Copyright (c) 2021, Christof Metzger-Kraus
6// All rights reserved
7//
8// This file is part of OPAL.
9//
10// OPAL is free software: you can redistribute it and/or modify
11// it under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// You should have received a copy of the GNU General Public License
16// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
17//
18#ifndef DISTRIBUTIONMOMENTS_H
19#define DISTRIBUTIONMOMENTS_H
20
21#include "Ippl.h"
22#include <Kokkos_Core.hpp>
24#include "Physics/Physics.h"
25#include "Physics/Units.h"
26
27#include <vector>
28
29template <typename T, unsigned Dim = 3>
30using Vector_t = ippl::Vector<T, Dim>;
31
32typedef typename std::pair<Vector_t<double, 3>, Vector_t<double, 3>> VectorPair_t;
33
34typedef boost::numeric::ublas::matrix<double> matrix_t;
35
36class OpalParticle;
37
39public:
41 void foo();
42 void compute(
43 const std::vector<OpalParticle>::const_iterator&,
44 const std::vector<OpalParticle>::const_iterator&);
45 void computeMoments(ippl::ParticleAttrib<Vector_t<double,3>>::view_type& Rview,
46 ippl::ParticleAttrib<Vector_t<double,3>>::view_type& Pview,
47 ippl::ParticleAttrib<double>::view_type& Mview,
48 size_t Np,
49 size_t Nlocal);
50 void computeMinMaxPosition(ippl::ParticleAttrib<Vector_t<double,3>>::view_type& Rview, size_t Nlcoal);
52 void computeDebyeLength(ippl::ParticleAttrib<Vector_t<double,3>>::view_type& Rview,
53 ippl::ParticleAttrib<Vector_t<double,3>>::view_type& Pview,
54 size_t Np,
55 size_t Nlocal,
56 double density);
57 void computePlasmaParameter(double);
58
70
79
80 double getMeanTime() const;
81 double getStdTime() const;
82 double getMeanGamma() const;
83 double getMeanGammaZ() const;
84 double getMeanKineticEnergy() const;
85 double getTemperature() const;
86 double getDebyeLength() const;
87 double getPlasmaParameter() const;
88 double getStdKineticEnergy() const;
89 double getDx() const;
90 double getDDx() const;
91 double getDy() const;
92 double getDDy() const;
95 matrix_t getMoments6x6() const;
96 double getTotalCharge() const;
97 double getTotalMass() const;
98 double getTotalNumParticles() const;
99
100 void computeMeans(ippl::ParticleAttrib<Vector_t<double,3>>::view_type& Rview,
101 ippl::ParticleAttrib<Vector_t<double,3>>::view_type& Pview,
102 ippl::ParticleAttrib<double>::view_type& Mview,
103 size_t Np,
104 size_t Nlocal);
105private:
106 bool isParticleExcluded(const OpalParticle&) const;
107
108 //template <class InputIt>
109 //void computeMeans(const InputIt&, const InputIt&);
110 // template <class InputIt>
111 // void computeStatistics(const InputIt&, const InputIt&);
112 template <class InputIt>
113 void computePercentiles(const InputIt&, const InputIt&);
114 using iterator_t = std::vector<Vector_t<double, 2>>::const_iterator;
115 std::pair<double, iterator_t> determinePercentilesDetail(
116 const iterator_t& begin, const iterator_t& end,
117 const std::vector<int>& globalAccumulatedHistogram,
118 const std::vector<int>& localAccumulatedHistogram, unsigned int dimension,
119 int numRequiredParticles) const;
120 double computeNormalizedEmittance(const iterator_t& begin, const iterator_t& end) const;
121
122 void fillMembers(std::vector<double>&);
123
124 void reset();
125
127
146
148 double stdTime_m;
156
161
165
170};
171
175
179
183
187
191
195
199
203
207
211
212inline double DistributionMoments::getMeanTime() const {
213 return meanTime_m;
214}
215
216inline double DistributionMoments::getStdTime() const {
217 return stdTime_m;
218}
219
221 return meanGamma_m;
222}
223
225 return meanGammaZ_m;
226}
227
229 return meanKineticEnergy_m;
230}
231
232// Compute and return the value of temperature in K
237 return debyeLength_m;
238}
240 return plasmaParameter_m;
241}
242
244 return stdKineticEnergy_m;
245}
246
247inline double DistributionMoments::getDx() const {
248 return moments_m(0, 5);
249}
250
251inline double DistributionMoments::getDDx() const {
252 return moments_m(1, 5);
253}
254
255inline double DistributionMoments::getDy() const {
256 return moments_m(2, 5);
257}
258
259inline double DistributionMoments::getDDy() const {
260 return moments_m(3, 5);
261}
262
266
270
272 return moments_m;
273}
274
276 return totalCharge_m;
277}
278
280 return totalMass_m;
281}
282
284 return totalNumParticles_m;
285}
286
290
294
298
302
306
310
314
318
320 Vector_t<double, 3> maxDistance;
321 for (unsigned int i = 0; i < 3; ++i) {
322 maxDistance[i] = std::max(std::abs(maxR_m[i]), std::abs(minR_m[i]));
323 }
324 return maxDistance;
325}
326
327#endif
boost::numeric::ublas::matrix< double > matrix_t
Definition BoostMatrix.h:23
std::pair< Vector_t< double, 3 >, Vector_t< double, 3 > > VectorPair_t
boost::numeric::ublas::matrix< double > matrix_t
ippl::Vector< T, Dim > Vector_t
PartBunch< T, Dim >::ConstIterator end(PartBunch< T, Dim > const &bunch)
PartBunch< T, Dim >::ConstIterator begin(PartBunch< T, Dim > const &bunch)
typename ippl::detail::ViewType< ippl::Vector< double, Dim >, 1 >::view_type view_type
constexpr double kB
Boltzman's constant in eV/K.
Definition Physics.h:60
constexpr double c
The velocity of light in m/s.
Definition Physics.h:45
constexpr double eV2kg
Definition Units.h:110
void fillMembers(std::vector< double > &)
Vector_t< double, 3 > sixtyEightPercentile_m
std::vector< Vector_t< double, 2 > >::const_iterator iterator_t
double getMeanKineticEnergy() const
Vector_t< double, 3 > get68Percentile() const
Vector_t< double, 3 > getMinPosition() const
Vector_t< double, 3 > getMeanMomentum() const
Vector_t< double, 3 > ninetyFivePercentile_m
Vector_t< double, 3 > getStandardDeviationPosition() const
Vector_t< double, 3 > getNormalizedEmittance() const
Vector_t< double, 3 > get99_99Percentile() const
double getTotalCharge() const
Vector_t< double, 3 > minR_m
static const double percentileFourSigmasNormalDist_m
double getTemperature() const
matrix_t getMoments6x6() const
double getDebyeLength() const
Vector_t< double, 3 > getHalo() const
Vector_t< double, 3 > ninetyNinePercentile_m
void compute(const std::vector< OpalParticle >::const_iterator &, const std::vector< OpalParticle >::const_iterator &)
double getStdKineticEnergy() const
Vector_t< double, 3 > getNormalizedEmittance99Percentile() const
Vector_t< double, 3 > getStandardDeviationMomentum() const
void computeMoments(ippl::ParticleAttrib< Vector_t< double, 3 > >::view_type &Rview, ippl::ParticleAttrib< Vector_t< double, 3 > >::view_type &Pview, ippl::ParticleAttrib< double >::view_type &Mview, size_t Np, size_t Nlocal)
Vector_t< double, 3 > getMeanPosition() const
Vector_t< double, 3 > getStandardDeviationRP() const
Vector_t< double, 3 > ninetyNine_NinetyNinePercentile_m
double getPlasmaParameter() const
Vector_t< double, 3 > normalizedEps_m
Vector_t< double, 3 > normalizedEps68Percentile_m
void computeMinMaxPosition(ippl::ParticleAttrib< Vector_t< double, 3 > >::view_type &Rview, size_t Nlcoal)
Vector_t< double, 3 > meanP_m
Vector_t< double, 3 > getNormalizedEmittance99_99Percentile() const
void computeDebyeLength(ippl::ParticleAttrib< Vector_t< double, 3 > >::view_type &Rview, ippl::ParticleAttrib< Vector_t< double, 3 > >::view_type &Pview, size_t Np, size_t Nlocal, double density)
double computeNormalizedEmittance(const iterator_t &begin, const iterator_t &end) const
Vector_t< double, 3 > halo_m
double getTotalNumParticles() const
Vector_t< double, 3 > stdP_m
Vector_t< double, 3 > normalizedEps99Percentile_m
Vector_t< double, 3 > getMaxPosition() const
Vector_t< double, 3 > stdR_m
static const double percentileThreeSigmasNormalDist_m
Vector_t< double, 3 > getNormalizedEmittance95Percentile() const
Vector_t< double, 3 > getGeometricEmittance() const
Vector_t< double, 3 > meanR_m
void computeMeans(ippl::ParticleAttrib< Vector_t< double, 3 > >::view_type &Rview, ippl::ParticleAttrib< Vector_t< double, 3 > >::view_type &Pview, ippl::ParticleAttrib< double >::view_type &Mview, size_t Np, size_t Nlocal)
void computePercentiles(const InputIt &, const InputIt &)
static const double percentileTwoSigmasNormalDist_m
Vector_t< double, 3 > get95Percentile() const
Vector_t< double, 6 > getCentroid() const
Vector_t< double, 3 > getNormalizedEmittance68Percentile() const
Vector_t< double, 3 > normalizedEps99_99Percentile_m
bool isParticleExcluded(const OpalParticle &) const
Vector_t< double, 3 > maxR_m
Vector_t< double, 3 > stdRP_m
std::pair< double, iterator_t > determinePercentilesDetail(const iterator_t &begin, const iterator_t &end, const std::vector< int > &globalAccumulatedHistogram, const std::vector< int > &localAccumulatedHistogram, unsigned int dimension, int numRequiredParticles) const
Vector_t< double, 3 > geometricEps_m
static const double percentileOneSigmaNormalDist_m
Vector_t< double, 3 > get99Percentile() const
Vector_t< double, 6 > getMeans() const
Vector_t< double, 6 > means_m
Vector_t< double, 6 > centroid_m
Vector_t< double, 3 > getMaxR() const
Vector_t< double, 3 > normalizedEps95Percentile_m