10#ifndef IMPACTX_RFCAVITY_H
11#define IMPACTX_RFCAVITY_H
57 4.3443060026047219e-002,
58 8.5602654094946495e-002,
62 -5.2579522442877296e-003,
63 -5.5025369142193678e-002,
64 4.6845673335028933e-002,
65 -2.3279346335638568e-002,
66 4.0800777539657775e-003,
67 4.1378326533752169e-003,
68 -2.5040533340490805e-003,
69 -4.0654981400000964e-003,
70 9.6630592067498289e-003,
71 -8.5275895985990214e-003,
72 -5.8078747006425020e-002,
73 -2.4044337836660403e-002,
74 1.0968240064697212e-002,
75 -3.4461179858301418e-003,
76 -8.1201564869443749e-004,
77 2.1438992904959380e-003,
78 -1.4997753525697276e-003,
79 1.8685171825676386e-004
83 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 static constexpr auto type =
"RFCavity";
138 std::vector<amrex::ParticleReal> cos_coef,
139 std::vector<amrex::ParticleReal> sin_coef,
147 std::optional<std::string>
name = std::nullopt
156 m_ncoef = int(cos_coef.size());
157 if (
m_ncoef !=
int(sin_coef.size()))
158 throw std::runtime_error(
"RFCavity: cos and sin coefficients must have same length!");
177 using BeamOptic::operator();
190 Alignment::compute_constants(refpart);
211 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
240 auto const out = R *
v;
279 refpart.map =
decltype(refpart.map)::Identity();
296 refpart.x = x + slice_ds*px/bgi;
297 refpart.y = y + slice_ds*py/bgi;
298 refpart.z = z + slice_ds*pz/bgi;
304 refpart.px = px*bgf/bgi;
305 refpart.py = py*bgf/bgi;
306 refpart.pz = pz*bgf/bgi;
312 for (
int i=1; i<7; i++) {
313 for (
int j=1; j<7; j++) {
322 refpart.map(i, j) = refpart.map(i, j) * scale_in / scale_fin;
327 refpart.s =
s + slice_ds;
331 using LinearTransport::operator();
354 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
363#if AMREX_DEVICE_COMPILE
383 if (std::abs(z) <= zmid)
385 efield = 0.5_prt*cos_data[0];
386 efieldint = z*efield;
387 for (
int j=1; j <
m_ncoef; ++j)
389 efield = efield + cos_data[j] * std::cos(j*2*pi*z/zlen) +
390 sin_data[j] * std::sin(j*2*pi*z/zlen);
391 efieldp = efieldp-j*2*pi*cos_data[j] * std::sin(j*2*pi*z/zlen)/zlen +
392 j*2*pi*sin_data[j] * std::cos(j*2*pi*z/zlen)/zlen;
393 efieldpp = efieldpp- powi<2>(j*2*pi*cos_data[j]/zlen) * std::cos(j*2*pi*z/zlen) -
394 powi<2>(j*2*pi*sin_data[j]/zlen) * std::sin(j*2*pi*z/zlen);
395 efieldint = efieldint + zlen*cos_data[j] * std::sin(j*2*pi*z/zlen)/(j*2*pi) -
396 zlen*sin_data[j] * std::cos(j*2*pi*z/zlen)/(j*2*pi);
401 efieldint = std::copysign(zmid, z)*0.5_prt*cos_data[0];
402 for (
int j=1; j <
m_ncoef; ++j)
404 efieldint = efieldint - zlen*sin_data[j] * std::cos(j*pi)/(j*2*pi);
407 return std::make_tuple(efield, efieldp, efieldint);
431 refpart.
t =
t + tau/std::sqrt(1.0_prt - powi<-2>(pt));
443 refpart.
map(5,5) = R(5,5) + tau*R(6,5)/powi<3>(betgam);
444 refpart.
map(5,6) = R(5,6) + tau*R(6,6)/powi<3>(betgam);
474 auto [ez, ezp, ezint] =
RF_Efield(zeval);
485 refpart.
map(1,1) = (1_prt-
s*L)*R(1,1) +
s*R(2,1);
486 refpart.
map(1,2) = (1_prt-
s*L)*R(1,2) +
s*R(2,2);
487 refpart.
map(2,1) = -
s * powi<2>(L)*R(1,1) + (1_prt+
s*L)*R(2,1);
488 refpart.
map(2,2) = -
s * powi<2>(L)*R(1,2) + (1_prt+
s*L)*R(2,2);
490 refpart.
map(3,3) = (1_prt-
s*L)*R(3,3) +
s*R(4,3);
491 refpart.
map(3,4) = (1_prt-
s*L)*R(3,4) +
s*R(4,4);
492 refpart.
map(4,3) = -
s * powi<2>(L)*R(3,3) + (1_prt+
s*L)*R(4,3);
493 refpart.
map(4,4) = -
s * powi<2>(L)*R(3,4) + (1_prt+
s*L)*R(4,4);
526 auto [ezf, ezpf, ezintf] =
RF_Efield(zeval);
530 refpart.
pt = pt - E0*(ezintf-ezint) * std::cos(k*
t+phi);
537 refpart.
map(2,1) = L*R(1,1) + R(2,1);
538 refpart.
map(2,2) = L*R(1,2) + R(2,2);
540 refpart.
map(4,3) = L*R(3,3) + R(4,3);
541 refpart.
map(4,4) = L*R(3,4) + R(4,4);
543 refpart.
map(6,5) = M*R(5,5) + R(6,5);
544 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:130
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:166
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::ParticleReal t
clock time * c in meters
Definition ReferenceParticle.H:38
mixin::TrackedVector< amrex::ParticleReal > sin
Definition RFCavity.H:97
mixin::TrackedVector< amrex::ParticleReal > cos
Definition RFCavity.H:96
amrex::Vector< amrex::ParticleReal > default_sin_coef
Definition RFCavity.H:82
amrex::Vector< amrex::ParticleReal > default_cos_coef
Definition RFCavity.H:54
Definition RFCavity.H:109
void compute_constants(RefPart const &refpart)
Definition RFCavity.H:186
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:356
int m_ncoef
unique RF cavity id used for data lookup map
Definition RFCavity.H:553
static constexpr auto type
Definition RFCavity.H:110
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=1, int nslice=1, std::optional< std::string > name=std::nullopt)
Definition RFCavity.H:133
int m_id
number of map integration steps per slice
Definition RFCavity.H:551
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:505
amrex::ParticleReal m_escale
Definition RFCavity.H:547
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:419
mixin::GPUDataRegistry< CavityFourierCoefficients > DynamicData
Definition RFCavity.H:113
void reverse()
Definition RFCavity.H:170
amrex::ParticleReal const * m_cos_h_data
number of Fourier coefficients
Definition RFCavity.H:554
amrex::ParticleReal m_freq
scaling factor for RF electric field
Definition RFCavity.H:548
int m_mapsteps
RF driven phase in deg.
Definition RFCavity.H:550
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition RFCavity.H:456
amrex::ParticleReal const * m_cos_d_data
non-owning pointer to host sine coefficients
Definition RFCavity.H:556
amrex::ParticleReal const * m_sin_d_data
non-owning pointer to device cosine coefficients
Definition RFCavity.H:557
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition RFCavity.H:339
amrex::ParticleReal const * m_sin_h_data
non-owning pointer to host cosine coefficients
Definition RFCavity.H:555
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:213
ImpactXParticleContainer::ParticleType PType
Definition RFCavity.H:111
amrex::ParticleReal m_phase
RF frequency in Hz.
Definition RFCavity.H:549
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:50
static std::shared_ptr< CavityFourierCoefficients > const & get(int id)
Definition dynamicdata.H:73
static CavityFourierCoefficients & emplace(int id, Args &&... args)
Definition dynamicdata.H:100
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
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