10#ifndef IMPACTX_RFCAVITY_H
11#define IMPACTX_RFCAVITY_H
58 4.3443060026047219e-002,
59 8.5602654094946495e-002,
63 -5.2579522442877296e-003,
64 -5.5025369142193678e-002,
65 4.6845673335028933e-002,
66 -2.3279346335638568e-002,
67 4.0800777539657775e-003,
68 4.1378326533752169e-003,
69 -2.5040533340490805e-003,
70 -4.0654981400000964e-003,
71 9.6630592067498289e-003,
72 -8.5275895985990214e-003,
73 -5.8078747006425020e-002,
74 -2.4044337836660403e-002,
75 1.0968240064697212e-002,
76 -3.4461179858301418e-003,
77 -8.1201564869443749e-004,
78 2.1438992904959380e-003,
79 -1.4997753525697276e-003,
80 1.8685171825676386e-004
84 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
85 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112 static constexpr auto type =
"RFCavity";
140 std::vector<amrex::ParticleReal> cos_coef,
141 std::vector<amrex::ParticleReal> sin_coef,
149 std::optional<std::string>
name = std::nullopt
158 m_ncoef = int(cos_coef.size());
159 if (
m_ncoef !=
int(sin_coef.size()))
160 throw std::runtime_error(
"RFCavity: cos and sin coefficients must have same length!");
179 using BeamOptic::operator();
192 Alignment::compute_constants(refpart);
213 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
239 auto const out = R *
v;
292 refpart.x = x + slice_ds*px/bgi;
293 refpart.y = y + slice_ds*py/bgi;
294 refpart.z = z + slice_ds*pz/bgi;
300 refpart.px = px*bgf/bgi;
301 refpart.py = py*bgf/bgi;
302 refpart.pz = pz*bgf/bgi;
308 for (
int i=1; i<7; i++) {
309 for (
int j=1; j<7; j++) {
318 m_map(i, j) =
m_map(i, j) * scale_in / scale_fin;
323 for (
int i=1; i<4; i++) {
324 for (
int j=2; j<7; j+=2) {
330 refpart.s =
s + slice_ds;
348 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
367 T_Real lambdax = 0_prt;
368 T_Real lambday = 0_prt;
369 T_Real lambdaz = 0_prt;
378 auto const out = A *
v;
389 (*this)(x, y,
t, px, py, pt, idcpu, refpart);
394 using LinearTransport::operator();
418 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
427#if AMREX_DEVICE_COMPILE
447 if (std::abs(z) <= zmid)
449 efield = 0.5_prt*cos_data[0];
450 efieldint = z*efield;
451 for (
int j=1; j <
m_ncoef; ++j)
453 efield = efield + cos_data[j] * std::cos(j*2*pi*z/zlen) +
454 sin_data[j] * std::sin(j*2*pi*z/zlen);
455 efieldp = efieldp-j*2*pi*cos_data[j] * std::sin(j*2*pi*z/zlen)/zlen +
456 j*2*pi*sin_data[j] * std::cos(j*2*pi*z/zlen)/zlen;
457 efieldpp = efieldpp- powi<2>(j*2*pi*cos_data[j]/zlen) * std::cos(j*2*pi*z/zlen) -
458 powi<2>(j*2*pi*sin_data[j]/zlen) * std::sin(j*2*pi*z/zlen);
459 efieldint = efieldint + zlen*cos_data[j] * std::sin(j*2*pi*z/zlen)/(j*2*pi) -
460 zlen*sin_data[j] * std::cos(j*2*pi*z/zlen)/(j*2*pi);
465 efieldint = std::copysign(zmid, z)*0.5_prt*cos_data[0];
466 for (
int j=1; j <
m_ncoef; ++j)
468 efieldint = efieldint - zlen*sin_data[j] * std::cos(j*pi)/(j*2*pi);
471 return std::make_tuple(efield, efieldp, efieldint);
495 refpart.
t =
t + tau/std::sqrt(1.0_prt - powi<-2>(pt));
509 m_map(5,5) = R(5,5) + tau*R(6,5)/powi<3>(betgam);
510 m_map(5,6) = R(5,6) + tau*R(6,6)/powi<3>(betgam);
519 auto [ez, ezp, ezint] =
RF_Efield(zeval);
526 dA(1,3) = E0 * tau / 2_prt * (k * ez * (G*pt - 1_prt) * sin_term / std::sqrt(1_prt + powi<2>(pt)) + cos_term * (G + 1_prt/(1_prt - pt)) * ezp);
527 dA(1,4) = E0 * tau / std::sqrt(1_prt + powi<2>(pt)) * cos_term * (G + 1_prt/(1_prt - pt));
562 auto [ez, ezp, ezint] =
RF_Efield(zeval);
573 m_map(1,1) = (1_prt-
s*L)*R(1,1) +
s*R(2,1);
574 m_map(1,2) = (1_prt-
s*L)*R(1,2) +
s*R(2,2);
575 m_map(2,1) = -
s * powi<2>(L)*R(1,1) + (1_prt+
s*L)*R(2,1);
576 m_map(2,2) = -
s * powi<2>(L)*R(1,2) + (1_prt+
s*L)*R(2,2);
578 m_map(3,3) = (1_prt-
s*L)*R(3,3) +
s*R(4,3);
579 m_map(3,4) = (1_prt-
s*L)*R(3,4) +
s*R(4,4);
580 m_map(4,3) = -
s * powi<2>(L)*R(3,3) + (1_prt+
s*L)*R(4,3);
581 m_map(4,4) = -
s * powi<2>(L)*R(3,4) + (1_prt+
s*L)*R(4,4);
615 auto [ezf, ezpf, ezintf] =
RF_Efield(zeval);
619 refpart.
pt = pt - E0*(ezintf-ezint) * std::cos(k*
t+phi);
626 m_map(2,1) = L*R(1,1) + R(2,1);
627 m_map(2,2) = L*R(1,2) + R(2,2);
629 m_map(4,3) = L*R(3,3) + R(4,3);
630 m_map(4,4) = L*R(3,4) + R(4,4);
632 m_map(6,5) = M*R(5,5) + R(6,5);
633 m_map(6,6) = M*R(5,6) + R(6,6);
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
#define IMPACTX_PUSH_EXTERN_TEMPLATE(ElementType)
Definition PushAll.H:78
T_ParticleType ParticleType
#define IMPACTX_GPUDATA_EXTERN(ElementType)
Definition dynamicdata.H:169
amrex_particle_real ParticleReal
constexpr T powi(T x) noexcept
__host__ __device__ void ignore_unused(const Ts &...)
SmallMatrix< T, N, 1, Order::F, StartIndex > SmallVector
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:82
@ s
fixed s as the independent variable
Definition ImpactXParticleContainer.H:37
@ t
fixed t as the independent variable
Definition ImpactXParticleContainer.H:38
amrex::SmallMatrix< amrex::ParticleReal, 6, 6, amrex::Order::F, 1 > Map6x6
Definition CovarianceMatrix.H:20
static constexpr __host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > Identity() noexcept
Definition ReferenceParticle.H:33
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal beta_gamma() const
Definition ReferenceParticle.H:167
amrex::ParticleReal pt
energy, normalized by rest energy
Definition ReferenceParticle.H:42
amrex::ParticleReal gyromagnetic_anomaly
anomalous magnetic moment [unitless]
Definition ReferenceParticle.H:45
amrex::ParticleReal t
clock time * c in meters
Definition ReferenceParticle.H:38
mixin::TrackedVector< amrex::ParticleReal > sin
Definition RFCavity.H:98
mixin::TrackedVector< amrex::ParticleReal > cos
Definition RFCavity.H:97
amrex::Vector< amrex::ParticleReal > default_sin_coef
Definition RFCavity.H:83
amrex::Vector< amrex::ParticleReal > default_cos_coef
Definition RFCavity.H:55
Definition RFCavity.H:111
void compute_constants(RefPart const &refpart)
Definition RFCavity.H:188
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:420
int m_ncoef
unique RF cavity id used for data lookup map
Definition RFCavity.H:643
static constexpr auto type
Definition RFCavity.H:112
int m_id
number of map integration steps per slice
Definition RFCavity.H:641
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:594
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void spin_and_phasespace_push(T_Real &AMREX_RESTRICT x, T_Real &AMREX_RESTRICT y, T_Real &AMREX_RESTRICT t, T_Real &AMREX_RESTRICT px, T_Real &AMREX_RESTRICT py, T_Real &AMREX_RESTRICT pt, T_Real &AMREX_RESTRICT sx, T_Real &AMREX_RESTRICT sy, T_Real &AMREX_RESTRICT sz, T_IdCpu const &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition RFCavity.H:350
amrex::ParticleReal m_escale
Definition RFCavity.H:637
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:483
mixin::GPUDataRegistry< CavityFourierCoefficients > DynamicData
Definition RFCavity.H:115
void reverse()
Definition RFCavity.H:172
amrex::ParticleReal const * m_cos_h_data
number of Fourier coefficients
Definition RFCavity.H:644
amrex::ParticleReal m_freq
scaling factor for RF electric field
Definition RFCavity.H:638
amrex::SmallMatrix< amrex::ParticleReal, 6, 6, amrex::Order::F, 1 > m_map
non-owning pointer to device sine coefficients
Definition RFCavity.H:654
int m_mapsteps
RF driven phase in deg.
Definition RFCavity.H:640
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:544
amrex::ParticleReal const * m_cos_d_data
non-owning pointer to host sine coefficients
Definition RFCavity.H:646
amrex::ParticleReal const * m_sin_d_data
non-owning pointer to device cosine coefficients
Definition RFCavity.H:647
RFCavity(amrex::ParticleReal ds, amrex::ParticleReal escale, amrex::ParticleReal freq, amrex::ParticleReal phase, std::vector< amrex::ParticleReal > cos_coef, std::vector< amrex::ParticleReal > sin_coef, amrex::ParticleReal dx=0, amrex::ParticleReal dy=0, amrex::ParticleReal rotation_degree=0, amrex::ParticleReal aperture_x=0, amrex::ParticleReal aperture_y=0, int mapsteps=10, int nslice=1, std::optional< std::string > name=std::nullopt)
Definition RFCavity.H:135
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition RFCavity.H:402
amrex::ParticleReal const * m_sin_h_data
non-owning pointer to host cosine coefficients
Definition RFCavity.H:645
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(T_Real &AMREX_RESTRICT x, T_Real &AMREX_RESTRICT y, T_Real &AMREX_RESTRICT t, T_Real &AMREX_RESTRICT px, T_Real &AMREX_RESTRICT py, T_Real &AMREX_RESTRICT pt, T_IdCpu const &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition RFCavity.H:215
amrex::SmallMatrix< amrex::ParticleReal, 3, 6, amrex::Order::F, 1 > m_spin_coupling
linearized map
Definition RFCavity.H:655
ImpactXParticleContainer::ParticleType PType
Definition RFCavity.H:113
amrex::ParticleReal m_phase
RF frequency in Hz.
Definition RFCavity.H:639
Definition alignment.H:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dy() const
Definition alignment.H:189
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dx() const
Definition alignment.H:179
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 rotate_aligned_map(Map6x6 const &R) const
Definition alignment.H:263
Alignment(amrex::ParticleReal dx, amrex::ParticleReal dy, amrex::ParticleReal rotation_degree)
Definition alignment.H:39
Definition beamoptic.H:529
Definition dynamicdata.H:54
static std::shared_ptr< CavityFourierCoefficients > const & get(int id)
Definition dynamicdata.H:98
static CavityFourierCoefficients & emplace(int id, Args &&... args)
Definition dynamicdata.H:125
Definition lineartransport.H:50
AMREX_GPU_HOST Named(std::optional< std::string > name)
Definition named.H:57
AMREX_FORCE_INLINE std::string name() const
Definition named.H:122
Definition nofinalize.H:22
Definition pipeaperture.H:26
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_x() const
Definition pipeaperture.H:90
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_y() const
Definition pipeaperture.H:101
PipeAperture(amrex::ParticleReal aperture_x, amrex::ParticleReal aperture_y)
Definition pipeaperture.H:32
Definition spintransport.H:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void rotate_spin(T_Real const &AMREX_RESTRICT lambdax, T_Real const &AMREX_RESTRICT lambday, T_Real const &AMREX_RESTRICT lambdaz, T_Real &AMREX_RESTRICT sx, T_Real &AMREX_RESTRICT sy, T_Real &AMREX_RESTRICT sz) const
Definition spintransport.H:48
Thick(amrex::ParticleReal ds, int nslice)
Definition thick.H:30
amrex::ParticleReal m_ds
Definition thick.H:68
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal ds() const
Definition thick.H:53
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int nslice() const
Definition thick.H:43
Definition TrackedVector.H:49