OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
MultiVariateGaussian.h
Go to the documentation of this file.
1#ifndef IPPL_MULTI_VARIATE_GAUSSIAN_H
2#define IPPL_MULTI_VARIATE_GAUSSIAN_H
3
4#include "Distribution.h"
5#include "SamplingBase.hpp"
6#include <Kokkos_Random.hpp>
7#include "Ippl.h"
8#include "Utilities/Options.h"
9#include "OPALTypes.h"
10#include <memory>
11#include <cmath>
12
16using GeneratorPool = typename Kokkos::Random_XorShift64_Pool<>;
17using Dist_t = ippl::random::NormalDistribution<double, 3>;
18using Matrix_t = ippl::Vector<ippl::Vector<double, 6>, 6>;
19
33public:
41 MultiVariateGaussian(std::shared_ptr<ParticleContainer_t> &pc,
42 std::shared_ptr<FieldContainer_t> &fc,
43 std::shared_ptr<Distribution_t> &opalDist);
44
56 MultiVariateGaussian(std::shared_ptr<ParticleContainer_t> pc,
57 const Vector_t<double, 3>& meanR,
58 const Vector_t<double, 3>& meanP,
59 const Vector_t<double, 3>& sigmaR,
60 const Vector_t<double, 3>& sigmaP,
61 const Vector_t<double, 3>& cutoffR,
62 const Vector_t<double, 3>& cutoffP,
63 bool fixMeanR=true,
64 bool fixMeanP=true);
65
77 MultiVariateGaussian(std::shared_ptr<ParticleContainer_t> pc,
78 const Vector_t<double, 3>& meanR,
79 const Vector_t<double, 3>& meanP,
80 const Matrix_t &cov,
81 const Vector_t<double, 3>& cutoffR,
82 const Vector_t<double, 3>& cutoffP,
83 bool fixMeanR=true,
84 bool fixMeanP=true);
89
94
101 void generateParticles(size_t &numberOfParticles, Vector_t<double, 3> nr) override;
102
106 IpplTimings::TimerRef samplerTimer_m;
107
108 void setMeanR(const Vector_t<double, 3>& meanR) {
109 meanR_m = meanR;
110 }
111
112 void setMeanP(const Vector_t<double, 3>& meanP) {
113 meanP_m = meanP;
114 }
115
116 void setCutoffR(const Vector_t<double, 3>& cutoffR) {
117 cutoffR_m = cutoffR;
118 }
119
120 void setCutoffP(const Vector_t<double, 3>& cutoffP) {
121 cutoffP_m = cutoffP;
122 }
123
124 void setFixMeanR(bool fixMeanR) {
125 fixMeanR_m = fixMeanR;
126 }
127
128 void setFixMeanP(bool fixMeanP) {
129 fixMeanP_m = fixMeanP;
130 }
131
132 void setSigmaR(const Vector_t<double, 3>& sigmaR) {
133 sigmaR_m = sigmaR;
134 }
135 void setSigmaP(const Vector_t<double, 3>& sigmaP) {
136 sigmaP_m = sigmaP;
137 }
138
139 void setCovarianceMatrix(const Matrix_t &cov) {
140 cov_m = cov;
141 }
142
143 void setL(const Matrix_t &L) {
144 L_m = L;
145 }
146
147private:
148 /*
149 * @brief Mean vectors for position and momentum.
150 */
152
153 /*
154 * @brief Covariance matrix for the Gaussian distribution.
155 */
157
158 /*
159 * @brief Cholesky cov=LT*L factorized matrix for the Gaussian distribution.
160 */
162
163 /*
164 * @brief Sampling bounds for the particle distribution.
165 */
167
168 /*
169 * @brief Normalized sampling bounds for the particle distribution.
170 */
172
177
183
187 void initRandomPool();
188
193
199
205};
206
207#endif // IPPL_MULTI_VARIATE_GAUSSIAN_H
208
ParticleContainer< double, 3 > ParticleContainer_t
Definition Component.h:30
ippl::Vector< T, Dim > Vector_t
typename Kokkos::Random_XorShift64_Pool<> GeneratorPool
ippl::Vector< ippl::Vector< double, 6 >, 6 > Matrix_t
ippl::Vector< ippl::Vector< double, 6 >, 6 > Matrix_t
Distribution Distribution_t
Definition FlatTop.cpp:9
ippl::random::NormalDistribution< double, 3 > Dist_t
Definition FlatTop.cpp:11
FieldContainer< double, 3 > FieldContainer_t
const int nr
void setCovarianceMatrix(const Matrix_t &cov)
Vector_t< double, 6 > normMax_m
Vector_t< double, 3 > sigmaP_m
IpplTimings::TimerRef samplerTimer_m
Timer for performance profiling.
bool fixMeanR_m
Flag to exactly fix the mean R and P of particles after sampling.
Vector_t< double, 3 > meanP_m
void setCutoffR(const Vector_t< double, 3 > &cutoffR)
void setMeanP(const Vector_t< double, 3 > &meanP)
Vector_t< double, 6 > max_m
Vector_t< double, 3 > normPmin_m
void setCutoffP(const Vector_t< double, 3 > &cutoffP)
Vector_t< double, 3 > pmax_m
void ComputeCholeskyFactorization()
Computes the Cholesky factorization of the covariance matrix.
Vector_t< double, 3 > rmin_m
Vector_t< double, 3 > rmax_m
Vector_t< double, 3 > pmin_m
Vector_t< double, 3 > cutoffR_m
Cutoff multipliers for position and momentum distributions.
Vector_t< double, 6 > min_m
Min and Max bounds for all 6 dimensions (R0,P0,R1,P1,R2,P2).
Vector_t< double, 3 > normPmax_m
void setL(const Matrix_t &L)
void setFixMeanR(bool fixMeanR)
void setMeanR(const Vector_t< double, 3 > &meanR)
Vector_t< double, 6 > normMin_m
void initRandomPool()
Initializes the random number generator pool.
Vector_t< double, 3 > normRmax_m
void generateParticles(size_t &numberOfParticles, Vector_t< double, 3 > nr) override
Generates particles based on the defined Gaussian distribution.
Vector_t< double, 3 > meanR_m
Vector_t< double, 3 > sigmaR_m
Standard deviations for position and momentum distributions.
MultiVariateGaussian(std::shared_ptr< ParticleContainer_t > &pc, std::shared_ptr< FieldContainer_t > &fc, std::shared_ptr< Distribution_t > &opalDist)
Constructor for MultiVariateGaussian.
void setSigmaP(const Vector_t< double, 3 > &sigmaP)
GeneratorPool randPool_m
Pool of random number generators for parallel sampling.
void setSigmaR(const Vector_t< double, 3 > &sigmaR)
void ComputeCenteredBounds()
Computes centered bounds for the particle distribution.
Vector_t< double, 3 > cutoffP_m
Vector_t< double, 3 > normRmin_m
void setFixMeanP(bool fixMeanP)
SamplingBase(std::shared_ptr< ParticleContainer_t > &pc, std::shared_ptr< FieldContainer_t > &fc, std::shared_ptr< Distribution_t > &dist)