10 #ifndef IMPACTX_RFCAVITY_H 11 #define IMPACTX_RFCAVITY_H 36 static constexpr
auto name =
"RFCavity";
50 amrex::ParticleReal
const ds,
51 amrex::ParticleReal
const escale,
52 amrex::ParticleReal
const freq,
53 amrex::ParticleReal
const phase,
63 using BeamOptic::operator();
76 PType& AMREX_RESTRICT p,
77 amrex::ParticleReal & AMREX_RESTRICT px,
78 amrex::ParticleReal & AMREX_RESTRICT py,
79 amrex::ParticleReal & AMREX_RESTRICT pt,
80 [[maybe_unused]]
RefPart const & refpart
83 using namespace amrex::literals;
86 amrex::ParticleReal
const x = p.pos(0);
87 amrex::ParticleReal
const y = p.pos(1);
88 amrex::ParticleReal
const t = p.pos(2);
91 amrex::ParticleReal pxout = px;
92 amrex::ParticleReal pyout = py;
93 amrex::ParticleReal ptout = pt;
105 p.pos(0) = R(1,1)*x + R(1,2)*px + R(1,3)*y
106 + R(1,4)*py + R(1,5)*t + R(1,6)*pt;
107 pxout = R(2,1)*x + R(2,2)*px + R(2,3)*y
108 + R(2,4)*py + R(2,5)*t + R(2,6)*pt;
109 p.pos(1) = R(3,1)*x + R(3,2)*px + R(3,3)*y
110 + R(3,4)*py + R(3,5)*t + R(3,6)*pt;
111 pyout = R(4,1)*x + R(4,2)*px + R(4,3)*y
112 + R(4,4)*py + R(4,5)*t + R(4,6)*pt;
113 p.pos(2) = R(5,1)*x + R(5,2)*px + R(5,3)*y
114 + R(5,4)*py + R(5,5)*t + R(5,6)*pt;
115 ptout = R(6,1)*x + R(6,2)*px + R(6,3)*y
116 + R(6,4)*py + R(6,5)*t + R(6,6)*pt;
131 using namespace amrex::literals;
134 amrex::ParticleReal
const x = refpart.x;
135 amrex::ParticleReal
const px = refpart.px;
136 amrex::ParticleReal
const y = refpart.y;
137 amrex::ParticleReal
const py = refpart.py;
138 amrex::ParticleReal
const z = refpart.z;
139 amrex::ParticleReal
const pz = refpart.pz;
140 amrex::ParticleReal
const pt = refpart.pt;
141 amrex::ParticleReal
const s = refpart.s;
142 amrex::ParticleReal
const sedge = refpart.sedge;
145 for (
int i=1;
i<7;
i++) {
146 for (
int j=1; j<7; j++) {
148 refpart.map(
i, j) = 1.0_prt;
150 refpart.map(
i, j) = 0.0_prt;
155 amrex::ParticleReal
const slice_ds =
m_ds /
nslice();
158 amrex::ParticleReal
const bgi =
sqrt(
pow(pt, 2) - 1.0_prt);
161 amrex::ParticleReal
const zin = s - sedge;
162 amrex::ParticleReal
const zout = zin + slice_ds;
166 amrex::ParticleReal
const ptf = refpart.pt;
169 refpart.x = x + slice_ds*px/bgi;
170 refpart.y = y + slice_ds*py/bgi;
171 refpart.z = z + slice_ds*pz/bgi;
174 amrex::ParticleReal
const bgf =
sqrt(
pow(ptf, 2) - 1.0_prt);
177 refpart.px = px*bgf/bgi;
178 refpart.py = py*bgf/bgi;
179 refpart.pz = pz*bgf/bgi;
182 amrex::ParticleReal scale_in = 1.0_prt;
183 amrex::ParticleReal scale_fin = 1.0_prt;
185 for (
int i=1;
i<7;
i++) {
186 for (
int j=1; j<7; j++) {
195 refpart.map(
i, j) = refpart.map(
i, j) * scale_in / scale_fin;
200 refpart.s = s + slice_ds;
209 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
213 using namespace amrex::literals;
217 constexpr amrex::ParticleReal zlen = 1.31879807_prt;
218 constexpr amrex::ParticleReal zmid = zlen / 2.0_prt;
219 constexpr
int ncoef = 25;
227 constexpr std::array<amrex::ParticleReal, ncoef> cos_coef = {
230 4.3443060026047219e-002,
231 8.5602654094946495e-002,
235 -5.2579522442877296e-003,
236 -5.5025369142193678e-002,
237 4.6845673335028933e-002,
238 -2.3279346335638568e-002,
239 4.0800777539657775e-003,
240 4.1378326533752169e-003,
241 -2.5040533340490805e-003,
242 -4.0654981400000964e-003,
243 9.6630592067498289e-003,
244 -8.5275895985990214e-003,
245 -5.8078747006425020e-002,
246 -2.4044337836660403e-002,
247 1.0968240064697212e-002,
248 -3.4461179858301418e-003,
249 -8.1201564869443749e-004,
250 2.1438992904959380e-003,
251 -1.4997753525697276e-003,
252 1.8685171825676386e-004
254 constexpr std::array<amrex::ParticleReal, ncoef> sin_coef = {};
257 amrex::ParticleReal efield = 0.0;
258 amrex::ParticleReal efieldp = 0.0;
259 amrex::ParticleReal efieldpp = 0.0;
260 amrex::ParticleReal efieldint = 0.0;
261 amrex::ParticleReal
const z = zeval - zmid;
265 efield = 0.5_prt*cos_coef[0];
266 efieldint = z*efield;
267 for (
int j=1; j < ncoef; ++j)
269 efield = efield + cos_coef[j]*cos(j*2*
pi*z/zlen) +
270 sin_coef[j]*sin(j*2*
pi*z/zlen);
271 efieldp = efieldp-j*2*
pi*cos_coef[j]*sin(j*2*
pi*z/zlen)/zlen +
272 j*2*
pi*sin_coef[j]*cos(j*2*
pi*z/zlen)/zlen;
273 efieldpp = efieldpp-
pow(j*2*
pi*cos_coef[j]/zlen,2) *cos(j*2*
pi*z/zlen) -
274 pow(j*2*
pi*sin_coef[j]/zlen,2) *sin(j*2*
pi*z/zlen);
275 efieldint = efieldint + zlen*cos_coef[j]*sin(j*2*
pi*z/zlen)/(j*2*
pi) -
276 zlen*sin_coef[j]*cos(j*2*
pi*z/zlen)/(j*2*
pi);
279 return std::make_tuple(efield, efieldp, efieldint);
291 void map3 (amrex::ParticleReal
const tau,
293 [[maybe_unused]] amrex::ParticleReal & zeval)
const 295 using namespace amrex::literals;
298 amrex::ParticleReal
const t = refpart.
t;
299 amrex::ParticleReal
const pt = refpart.
pt;
302 refpart.
t = t + tau/
sqrt(1.0_prt -
pow(pt, -2));
312 amrex::ParticleReal
const betgam = refpart.
beta_gamma();
314 refpart.
map(5,5) = R(5,5) + tau*R(6,5)/
pow(betgam,3);
315 refpart.
map(5,6) = R(5,6) + tau*R(6,6)/
pow(betgam,3);
327 void map2 (amrex::ParticleReal
const tau,
329 amrex::ParticleReal & zeval)
const 331 using namespace amrex::literals;
333 amrex::ParticleReal
const t = refpart.
t;
334 amrex::ParticleReal
const pt = refpart.
pt;
339 amrex::ParticleReal
const k = (2.0_prt*
pi/
c)*
m_freq;
340 amrex::ParticleReal
const phi =
m_phase*(
pi/180.0_prt);
341 amrex::ParticleReal
const E0 =
m_escale;
352 amrex::ParticleReal
const s = tau/refpart.
beta_gamma();
353 amrex::ParticleReal
const L = E0*ezp*sin(k*t+phi)/(2.0_prt*k);
355 refpart.
map(1,1) = (1.0_prt-s*L)*R(1,1) + s*R(2,1);
356 refpart.
map(1,2) = (1.0_prt-s*L)*R(1,2) + s*R(2,2);
357 refpart.
map(2,1) = -s*
pow(L,2)*R(1,1) + (1.0_prt+s*L)*R(2,1);
358 refpart.
map(2,2) = -s*
pow(L,2)*R(1,2) + (1.0_prt+s*L)*R(2,2);
360 refpart.
map(3,3) = (1.0_prt-s*L)*R(3,3) + s*R(4,3);
361 refpart.
map(3,4) = (1.0_prt-s*L)*R(3,4) + s*R(4,4);
362 refpart.
map(4,3) = -s*
pow(L,2)*R(3,3) + (1.0_prt+s*L)*R(4,3);
363 refpart.
map(4,4) = -s*
pow(L,2)*R(3,4) + (1.0_prt+s*L)*R(4,4);
375 void map1 (amrex::ParticleReal
const tau,
377 amrex::ParticleReal & zeval)
const 379 using namespace amrex::literals;
381 amrex::ParticleReal
const t = refpart.
t;
382 amrex::ParticleReal
const pt = refpart.
pt;
383 amrex::ParticleReal
const z = zeval;
388 amrex::ParticleReal
const k = (2.0_prt*
pi/
c)*
m_freq;
389 amrex::ParticleReal
const phi =
m_phase*(
pi/180.0_prt);
390 amrex::ParticleReal
const E0 =
m_escale;
396 auto [ezf, ezpf, ezintf] =
RF_Efield(zeval);
400 refpart.
pt = pt - E0*(ezintf-ezint)*cos(k*t+phi);
404 amrex::ParticleReal
const M = E0*(ezintf-ezint)*k*sin(k*t+phi);
405 amrex::ParticleReal
const L = E0*(ezpf-ezp)*sin(k*t+phi)/(2.0_prt*k)+M/2.0_prt;
407 refpart.
map(2,1) = L*R(1,1) + R(2,1);
408 refpart.
map(2,2) = L*R(1,2) + R(2,2);
410 refpart.
map(4,3) = L*R(3,3) + R(4,3);
411 refpart.
map(4,4) = L*R(3,4) + R(4,4);
413 refpart.
map(6,5) = M*R(5,5) + R(6,5);
414 refpart.
map(6,6) = M*R(5,6) + R(6,6);
426 #endif // IMPACTX_RFCAVITY_H
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp2_integrate_split3(RefPart &refpart, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, T_Element const &element)
Definition: Integrators.H:53
constexpr std::enable_if_t< std::is_floating_point< T >::value, T > pi()
int m_mapsteps
RF driven phase in deg.
Definition: RFCavity.H:421
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(PType &AMREX_RESTRICT p, amrex::ParticleReal &AMREX_RESTRICT px, amrex::ParticleReal &AMREX_RESTRICT py, amrex::ParticleReal &AMREX_RESTRICT pt, [[maybe_unused]] RefPart const &refpart) const
Definition: RFCavity.H:75
Definition: ImpactX.cpp:31
RFCavity(amrex::ParticleReal const ds, amrex::ParticleReal const escale, amrex::ParticleReal const freq, amrex::ParticleReal const phase, int const mapsteps, int const nslice)
Definition: RFCavity.H:49
amrex::ParticleReal m_phase
RF frequency in Hz.
Definition: RFCavity.H:420
Definition: beamoptic.H:131
amrex::ParticleReal pt
energy deviation, normalized by rest energy
Definition: ReferenceParticle.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
amrex::ParticleReal t
clock time * c in meters
Definition: ReferenceParticle.H:35
amrex::Array2D< amrex::ParticleReal, 1, 6, 1, 6 > map
linearized map
Definition: ReferenceParticle.H:44
Particle< NStructReal, NStructInt > ParticleType
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T abs(const GpuComplex< T > &a_z) noexcept
Thick(amrex::ParticleReal const ds, int const nslice)
Definition: thick.H:30
Definition: ReferenceParticle.H:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > pow(const GpuComplex< T > &a_z, const T &a_y) noexcept
amrex::ParticleReal m_escale
Definition: RFCavity.H:418
static constexpr auto name
Definition: RFCavity.H:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal beta_gamma() const
Definition: ReferenceParticle.H:79
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RF_Efield(amrex::ParticleReal const zeval) const
Definition: RFCavity.H:211
static constexpr amrex::Real pi
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal ds() const
Definition: thick.H:50
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int nslice() const
Definition: thick.H:40
Definition: RFCavity.H:32
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition: RFCavity.H:327
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, [[maybe_unused]] amrex::ParticleReal &zeval) const
Definition: RFCavity.H:291
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition: RFCavity.H:375
amrex::ParticleReal m_ds
Definition: thick.H:56
amrex::ParticleReal m_freq
scaling factor for RF electric field
Definition: RFCavity.H:419