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>
242 auto const out = R *
v;
281 refpart.map =
decltype(refpart.map)::Identity();
284 refpart.spin_coupling = {};
301 refpart.x = x + slice_ds*px/bgi;
302 refpart.y = y + slice_ds*py/bgi;
303 refpart.z = z + slice_ds*pz/bgi;
309 refpart.px = px*bgf/bgi;
310 refpart.py = py*bgf/bgi;
311 refpart.pz = pz*bgf/bgi;
317 for (
int i=1; i<7; i++) {
318 for (
int j=1; j<7; j++) {
327 refpart.map(i, j) = refpart.map(i, j) * scale_in / scale_fin;
332 for (
int i=1; i<4; i++) {
333 for (
int j=2; j<7; j+=2) {
334 refpart.spin_coupling(i, j) *= bgi;
339 refpart.s =
s + slice_ds;
357 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
376 T_Real lambdax = 0_prt;
377 T_Real lambday = 0_prt;
378 T_Real lambdaz = 0_prt;
387 auto const out = A *
v;
398 (*this)(x, y,
t, px, py, pt, idcpu, refpart);
403 using LinearTransport::operator();
426 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
435#if AMREX_DEVICE_COMPILE
455 if (std::abs(z) <= zmid)
457 efield = 0.5_prt*cos_data[0];
458 efieldint = z*efield;
459 for (
int j=1; j <
m_ncoef; ++j)
461 efield = efield + cos_data[j] * std::cos(j*2*pi*z/zlen) +
462 sin_data[j] * std::sin(j*2*pi*z/zlen);
463 efieldp = efieldp-j*2*pi*cos_data[j] * std::sin(j*2*pi*z/zlen)/zlen +
464 j*2*pi*sin_data[j] * std::cos(j*2*pi*z/zlen)/zlen;
465 efieldpp = efieldpp- powi<2>(j*2*pi*cos_data[j]/zlen) * std::cos(j*2*pi*z/zlen) -
466 powi<2>(j*2*pi*sin_data[j]/zlen) * std::sin(j*2*pi*z/zlen);
467 efieldint = efieldint + zlen*cos_data[j] * std::sin(j*2*pi*z/zlen)/(j*2*pi) -
468 zlen*sin_data[j] * std::cos(j*2*pi*z/zlen)/(j*2*pi);
473 efieldint = std::copysign(zmid, z)*0.5_prt*cos_data[0];
474 for (
int j=1; j <
m_ncoef; ++j)
476 efieldint = efieldint - zlen*sin_data[j] * std::cos(j*pi)/(j*2*pi);
479 return std::make_tuple(efield, efieldp, efieldint);
503 refpart.
t =
t + tau/std::sqrt(1.0_prt - powi<-2>(pt));
517 refpart.
map(5,5) = R(5,5) + tau*R(6,5)/powi<3>(betgam);
518 refpart.
map(5,6) = R(5,6) + tau*R(6,6)/powi<3>(betgam);
527 auto [ez, ezp, ezint] =
RF_Efield(zeval);
534 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);
535 dA(1,4) = E0 * tau / std::sqrt(1_prt + powi<2>(pt)) * cos_term * (G + 1_prt/(1_prt - pt));
570 auto [ez, ezp, ezint] =
RF_Efield(zeval);
581 refpart.
map(1,1) = (1_prt-
s*L)*R(1,1) +
s*R(2,1);
582 refpart.
map(1,2) = (1_prt-
s*L)*R(1,2) +
s*R(2,2);
583 refpart.
map(2,1) = -
s * powi<2>(L)*R(1,1) + (1_prt+
s*L)*R(2,1);
584 refpart.
map(2,2) = -
s * powi<2>(L)*R(1,2) + (1_prt+
s*L)*R(2,2);
586 refpart.
map(3,3) = (1_prt-
s*L)*R(3,3) +
s*R(4,3);
587 refpart.
map(3,4) = (1_prt-
s*L)*R(3,4) +
s*R(4,4);
588 refpart.
map(4,3) = -
s * powi<2>(L)*R(3,3) + (1_prt+
s*L)*R(4,3);
589 refpart.
map(4,4) = -
s * powi<2>(L)*R(3,4) + (1_prt+
s*L)*R(4,4);
623 auto [ezf, ezpf, ezintf] =
RF_Efield(zeval);
627 refpart.
pt = pt - E0*(ezintf-ezint) * std::cos(k*
t+phi);
634 refpart.
map(2,1) = L*R(1,1) + R(2,1);
635 refpart.
map(2,2) = L*R(1,2) + R(2,2);
637 refpart.
map(4,3) = L*R(3,3) + R(4,3);
638 refpart.
map(4,4) = L*R(3,4) + R(4,4);
640 refpart.
map(6,5) = M*R(5,5) + R(6,5);
641 refpart.
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:79
@ 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:168
amrex::ParticleReal pt
energy, normalized by rest energy
Definition ReferenceParticle.H:42
amrex::SmallMatrix< amrex::ParticleReal, 6, 6, amrex::Order::F, 1 > map
linearized map
Definition ReferenceParticle.H:48
amrex::SmallMatrix< amrex::ParticleReal, 3, 6, amrex::Order::F, 1 > spin_coupling
linearized spin-orbit coupling matrix
Definition ReferenceParticle.H:49
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
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 &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition RFCavity.H:359
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:428
int m_ncoef
unique RF cavity id used for data lookup map
Definition RFCavity.H:651
static constexpr auto type
Definition RFCavity.H:112
int m_id
number of map integration steps per slice
Definition RFCavity.H:649
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:602
amrex::ParticleReal m_escale
Definition RFCavity.H:645
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:491
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:652
amrex::ParticleReal m_freq
scaling factor for RF electric field
Definition RFCavity.H:646
int m_mapsteps
RF driven phase in deg.
Definition RFCavity.H:648
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:552
amrex::ParticleReal const * m_cos_d_data
non-owning pointer to host sine coefficients
Definition RFCavity.H:654
amrex::ParticleReal const * m_sin_d_data
non-owning pointer to device cosine coefficients
Definition RFCavity.H:655
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:411
amrex::ParticleReal const * m_sin_h_data
non-owning pointer to host cosine coefficients
Definition RFCavity.H:653
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 &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition RFCavity.H:215
ImpactXParticleContainer::ParticleType PType
Definition RFCavity.H:113
amrex::ParticleReal m_phase
RF frequency in Hz.
Definition RFCavity.H:647
Definition alignment.H:27
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void shift_out(T_Real &AMREX_RESTRICT x, T_Real &AMREX_RESTRICT y, T_Real &AMREX_RESTRICT px, T_Real &AMREX_RESTRICT py) const
Definition alignment.H:109
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dy() const
Definition alignment.H:146
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dx() const
Definition alignment.H:136
Alignment(amrex::ParticleReal dx, amrex::ParticleReal dy, amrex::ParticleReal rotation_degree)
Definition alignment.H:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void shift_in(T_Real &AMREX_RESTRICT x, T_Real &AMREX_RESTRICT y, T_Real &AMREX_RESTRICT px, T_Real &AMREX_RESTRICT py) const
Definition alignment.H:78
Definition beamoptic.H:436
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 void apply_aperture(T_Real &AMREX_RESTRICT x, T_Real &AMREX_RESTRICT y, T_IdCpu &AMREX_RESTRICT idcpu) const
Definition pipeaperture.H:59
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