ImpactX
Loading...
Searching...
No Matches
Gaussian.H
Go to the documentation of this file.
1/* Copyright 2022-2023 The Regents of the University of California, through Lawrence
2 * Berkeley National Laboratory (subject to receipt of any required
3 * approvals from the U.S. Dept. of Energy). All rights reserved.
4 *
5 * This file is part of ImpactX.
6 *
7 * Authors: Chad Mitchell, Axel Huebl
8 * License: BSD-3-Clause-LBNL
9 */
10#ifndef IMPACTX_DISTRIBUTION_GAUSSIAN
11#define IMPACTX_DISTRIBUTION_GAUSSIAN
12
14
15#include <ablastr/constant.H>
16
17#include <AMReX_Random.H>
18#include <AMReX_REAL.H>
19
20#include <cmath>
21
22
24{
25 struct Gaussian
26 {
43 amrex::ParticleReal lambdax,
44 amrex::ParticleReal lambday,
45 amrex::ParticleReal lambdat,
46 amrex::ParticleReal lambdapx,
47 amrex::ParticleReal lambdapy,
48 amrex::ParticleReal lambdapt,
49 amrex::ParticleReal muxpx=0.0,
50 amrex::ParticleReal muypy=0.0,
51 amrex::ParticleReal mutpt=0.0,
52 amrex::ParticleReal meanx=0.0,
53 amrex::ParticleReal meany=0.0,
54 amrex::ParticleReal meant=0.0,
55 amrex::ParticleReal meanpx=0.0,
56 amrex::ParticleReal meanpy=0.0,
57 amrex::ParticleReal meanpt=0.0,
58 amrex::ParticleReal dispx=0.0,
59 amrex::ParticleReal disppx=0.0,
60 amrex::ParticleReal dispy=0.0,
61 amrex::ParticleReal disppy=0.0,
62 amrex::ParticleReal cutx=0.0,
63 amrex::ParticleReal cuty=0.0,
64 amrex::ParticleReal cutt=0.0
65 )
66 : m_lambdaX(lambdax), m_lambdaY(lambday), m_lambdaT(lambdat), m_lambdaPx(lambdapx), m_lambdaPy(lambdapy),
67 m_lambdaPt(lambdapt), m_muxpx(muxpx), m_muypy(muypy), m_mutpt(mutpt), m_meanx(meanx), m_meany(meany),
68 m_meant(meant), m_meanpx(meanpx), m_meanpy(meanpy), m_meanpt(meanpt), m_dispx(dispx), m_disppx(disppx),
69 m_dispy(dispy), m_disppy(disppy), m_cutX(cutx), m_cutY(cuty), m_cutT(cutt)
70 {
71 }
72
80 void initialize ([[maybe_unused]] amrex::ParticleReal bunch_charge, [[maybe_unused]] RefPart const & ref)
81 {
82 }
83
88 void
90 {
91 }
92
111 amrex::RandomEngine const & engine
112 ) const
113 {
114 using namespace amrex::literals;
116
117 amrex::ParticleReal ln1,u1,u2;
118 amrex::ParticleReal root,a1,a2;
119
120 // Generate three pairs of (optionally truncated) normal random variables using Box-Muller:
121
122 u1 = amrex::Random(engine);
123 u2 = amrex::Random(engine);
124 if (m_cutX > 0.0_prt) {
126 amrex::ParticleReal ef = std::exp(-f);
127 amrex::ParticleReal r2scale = 1_prt - f*ef/(1_prt - ef);
128 amrex::ParticleReal r2 = -2_prt * std::log(1_prt - u1*(1_prt - ef));
129 ln1 = std::sqrt(r2 / r2scale);
130 } else {
131 ln1 = std::sqrt(-2_prt*std::log(u1));
132 }
133 x = ln1 * std::cos(2_prt*pi*u2);
134 px = ln1 * std::sin(2_prt*pi*u2);
135
136 u1 = amrex::Random(engine);
137 u2 = amrex::Random(engine);
138 if (m_cutY > 0.0_prt) {
140 amrex::ParticleReal ef = std::exp(-f);
141 amrex::ParticleReal r2scale = 1_prt - f*ef/(1_prt - ef);
142 amrex::ParticleReal r2 = -2_prt * std::log(1_prt - u1*(1_prt - ef));
143 ln1 = std::sqrt(r2 / r2scale);
144 } else {
145 ln1 = std::sqrt(-2_prt*std::log(u1));
146 }
147 y = ln1 * std::cos(2_prt*pi*u2);
148 py = ln1 * std::sin(2_prt*pi*u2);
149
150 u1 = amrex::Random(engine);
151 u2 = amrex::Random(engine);
152 if (m_cutT > 0.0_prt) {
154 amrex::ParticleReal ef = std::exp(-f);
155 amrex::ParticleReal r2scale = 1_prt - f*ef/(1_prt - ef);
156 amrex::ParticleReal r2 = -2_prt * std::log(1_prt - u1*(1_prt - ef));
157 ln1 = std::sqrt(r2 / r2scale);
158 } else {
159 ln1 = std::sqrt(-2_prt*std::log(u1));
160 }
161 t = ln1 * std::cos(2_prt*pi*u2);
162 pt = ln1 * std::sin(2_prt*pi*u2);
163
164 // Transform to produce the desired second moments/correlations:
165 root = std::sqrt(1.0_prt-m_muxpx*m_muxpx);
166 a1 = m_lambdaX * x / root;
167 a2 = m_lambdaPx * (-m_muxpx * x / root + px);
168 x = a1;
169 px = a2;
170 root = std::sqrt(1.0_prt-m_muypy*m_muypy);
171 a1 = m_lambdaY * y / root;
172 a2 = m_lambdaPy * (-m_muypy * y / root + py);
173 y = a1;
174 py = a2;
175 root = std::sqrt(1.0_prt-m_mutpt*m_mutpt);
176 a1 = m_lambdaT * t / root;
177 a2 = m_lambdaPt * (-m_mutpt * t / root + pt);
178 t = a1;
179 pt = a2;
180
181 // Apply dispersive correlations
182 x = x - m_dispx * pt;
183 px = px - m_disppx * pt;
184 y = y - m_dispy * pt;
185 py = py - m_disppy * pt;
186
187 // Apply centroid translation
188 x = x + m_meanx;
189 px = px + m_meanpx;
190 y = y + m_meany;
191 py = py + m_meanpy;
192 t = t + m_meant;
193 pt = pt + m_meanpt;
194 }
195
203 };
204
205} // namespace impactx::distribution
206
207#endif // IMPACTX_DISTRIBUTION_GAUSSIAN
#define AMREX_FORCE_INLINE
#define AMREX_RESTRICT
#define AMREX_GPU_HOST_DEVICE
amrex_particle_real ParticleReal
Real Random()
Definition All.H:28
@ t
fixed t as the independent variable
Definition ImpactXParticleContainer.H:38
Definition ReferenceParticle.H:33
amrex::ParticleReal m_lambdaX
Definition Gaussian.H:196
amrex::ParticleReal m_meanpt
Definition Gaussian.H:200
amrex::ParticleReal m_cutX
dispersion and its derivative
Definition Gaussian.H:202
amrex::ParticleReal m_lambdaPy
Definition Gaussian.H:197
amrex::ParticleReal m_meany
Definition Gaussian.H:199
amrex::ParticleReal m_lambdaY
Definition Gaussian.H:196
amrex::ParticleReal m_disppy
Definition Gaussian.H:201
amrex::ParticleReal m_disppx
Definition Gaussian.H:201
amrex::ParticleReal m_cutY
Definition Gaussian.H:202
amrex::ParticleReal m_dispy
Definition Gaussian.H:201
amrex::ParticleReal m_muypy
Definition Gaussian.H:198
amrex::ParticleReal m_lambdaPx
related position axis intercepts (length) of the phase space ellipse
Definition Gaussian.H:197
amrex::ParticleReal m_meanpy
Definition Gaussian.H:200
amrex::ParticleReal m_lambdaPt
Definition Gaussian.H:197
void initialize(amrex::ParticleReal bunch_charge, RefPart const &ref)
Definition Gaussian.H:80
amrex::ParticleReal m_meanpx
spatial coordinates of centroid offset
Definition Gaussian.H:200
amrex::ParticleReal m_meant
Definition Gaussian.H:199
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(amrex::ParticleReal &AMREX_RESTRICT x, amrex::ParticleReal &AMREX_RESTRICT y, amrex::ParticleReal &AMREX_RESTRICT t, amrex::ParticleReal &AMREX_RESTRICT px, amrex::ParticleReal &AMREX_RESTRICT py, amrex::ParticleReal &AMREX_RESTRICT pt, amrex::RandomEngine const &engine) const
Definition Gaussian.H:104
amrex::ParticleReal m_dispx
momentum coordinates of centroid offset
Definition Gaussian.H:201
amrex::ParticleReal m_muxpx
related momentum axis intercepts of the phase space ellipse
Definition Gaussian.H:198
Gaussian(amrex::ParticleReal lambdax, amrex::ParticleReal lambday, amrex::ParticleReal lambdat, amrex::ParticleReal lambdapx, amrex::ParticleReal lambdapy, amrex::ParticleReal lambdapt, amrex::ParticleReal muxpx=0.0, amrex::ParticleReal muypy=0.0, amrex::ParticleReal mutpt=0.0, amrex::ParticleReal meanx=0.0, amrex::ParticleReal meany=0.0, amrex::ParticleReal meant=0.0, amrex::ParticleReal meanpx=0.0, amrex::ParticleReal meanpy=0.0, amrex::ParticleReal meanpt=0.0, amrex::ParticleReal dispx=0.0, amrex::ParticleReal disppx=0.0, amrex::ParticleReal dispy=0.0, amrex::ParticleReal disppy=0.0, amrex::ParticleReal cutx=0.0, amrex::ParticleReal cuty=0.0, amrex::ParticleReal cutt=0.0)
Definition Gaussian.H:42
amrex::ParticleReal m_cutT
Definition Gaussian.H:202
void finalize()
Definition Gaussian.H:89
amrex::ParticleReal m_lambdaT
Definition Gaussian.H:196
amrex::ParticleReal m_meanx
correlation length-momentum
Definition Gaussian.H:199
amrex::ParticleReal m_mutpt
Definition Gaussian.H:198