10 #ifndef IMPACTX_RFCAVITY_H
11 #define IMPACTX_RFCAVITY_H
48 4.3443060026047219e-002,
49 8.5602654094946495e-002,
53 -5.2579522442877296e-003,
54 -5.5025369142193678e-002,
55 4.6845673335028933e-002,
56 -2.3279346335638568e-002,
57 4.0800777539657775e-003,
58 4.1378326533752169e-003,
59 -2.5040533340490805e-003,
60 -4.0654981400000964e-003,
61 9.6630592067498289e-003,
62 -8.5275895985990214e-003,
63 -5.8078747006425020e-002,
64 -2.4044337836660403e-002,
65 1.0968240064697212e-002,
66 -3.4461179858301418e-003,
67 -8.1201564869443749e-004,
68 2.1438992904959380e-003,
69 -1.4997753525697276e-003,
70 1.8685171825676386e-004
74 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
75 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86 namespace RFCavityData
92 static inline std::map<int, std::vector<amrex::ParticleReal>>
h_cos_coef = {};
94 static inline std::map<int, std::vector<amrex::ParticleReal>>
h_sin_coef = {};
97 static inline std::map<int, amrex::Gpu::DeviceVector<amrex::ParticleReal>>
d_cos_coef = {};
99 static inline std::map<int, amrex::Gpu::DeviceVector<amrex::ParticleReal>>
d_sin_coef = {};
107 static constexpr
auto name =
"RFCavity";
123 amrex::ParticleReal
ds,
124 amrex::ParticleReal escale,
125 amrex::ParticleReal freq,
126 amrex::ParticleReal phase,
127 std::vector<amrex::ParticleReal> cos_coef,
128 std::vector<amrex::ParticleReal> sin_coef,
140 if (
m_ncoef !=
int(sin_coef.size()))
141 throw std::runtime_error(
"RFCavity: cos and sin coefficients must have same length!");
153 cos_coef.begin(), cos_coef.end(),
156 sin_coef.begin(), sin_coef.end(),
166 using BeamOptic::operator();
179 PType& AMREX_RESTRICT p,
180 amrex::ParticleReal & AMREX_RESTRICT px,
181 amrex::ParticleReal & AMREX_RESTRICT py,
182 amrex::ParticleReal & AMREX_RESTRICT pt,
183 [[maybe_unused]]
RefPart const & refpart
186 using namespace amrex::literals;
189 amrex::ParticleReal
const x = p.pos(
RealAoS::x);
190 amrex::ParticleReal
const y = p.pos(
RealAoS::y);
191 amrex::ParticleReal
const t = p.pos(
RealAoS::t);
194 amrex::ParticleReal pxout = px;
195 amrex::ParticleReal pyout = py;
196 amrex::ParticleReal ptout = pt;
208 p.pos(
RealAoS::x) = R(1,1)*x + R(1,2)*px + R(1,3)*y
209 + R(1,4)*py + R(1,5)*t + R(1,6)*pt;
210 pxout = R(2,1)*x + R(2,2)*px + R(2,3)*y
211 + R(2,4)*py + R(2,5)*t + R(2,6)*pt;
212 p.pos(
RealAoS::y) = R(3,1)*x + R(3,2)*px + R(3,3)*y
213 + R(3,4)*py + R(3,5)*t + R(3,6)*pt;
214 pyout = R(4,1)*x + R(4,2)*px + R(4,3)*y
215 + R(4,4)*py + R(4,5)*t + R(4,6)*pt;
216 p.pos(
RealAoS::t) = R(5,1)*x + R(5,2)*px + R(5,3)*y
217 + R(5,4)*py + R(5,5)*t + R(5,6)*pt;
218 ptout = R(6,1)*x + R(6,2)*px + R(6,3)*y
219 + R(6,4)*py + R(6,5)*t + R(6,6)*pt;
234 using namespace amrex::literals;
237 amrex::ParticleReal
const x = refpart.x;
238 amrex::ParticleReal
const px = refpart.px;
239 amrex::ParticleReal
const y = refpart.y;
240 amrex::ParticleReal
const py = refpart.py;
241 amrex::ParticleReal
const z = refpart.z;
242 amrex::ParticleReal
const pz = refpart.pz;
243 amrex::ParticleReal
const pt = refpart.pt;
244 amrex::ParticleReal
const s = refpart.s;
245 amrex::ParticleReal
const sedge = refpart.sedge;
248 for (
int i=1;
i<7;
i++) {
249 for (
int j=1; j<7; j++) {
251 refpart.map(
i, j) = 1.0_prt;
253 refpart.map(
i, j) = 0.0_prt;
258 amrex::ParticleReal
const slice_ds =
m_ds /
nslice();
261 amrex::ParticleReal
const bgi =
sqrt(
pow(pt, 2) - 1.0_prt);
264 amrex::ParticleReal
const zin =
s - sedge;
265 amrex::ParticleReal
const zout = zin + slice_ds;
269 amrex::ParticleReal
const ptf = refpart.pt;
272 refpart.x = x + slice_ds*px/bgi;
273 refpart.y = y + slice_ds*py/bgi;
274 refpart.z = z + slice_ds*pz/bgi;
277 amrex::ParticleReal
const bgf =
sqrt(
pow(ptf, 2) - 1.0_prt);
280 refpart.px = px*bgf/bgi;
281 refpart.py = py*bgf/bgi;
282 refpart.pz = pz*bgf/bgi;
285 amrex::ParticleReal scale_in = 1.0_prt;
286 amrex::ParticleReal scale_fin = 1.0_prt;
288 for (
int i=1;
i<7;
i++) {
289 for (
int j=1; j<7; j++) {
298 refpart.map(
i, j) = refpart.map(
i, j) * scale_in / scale_fin;
303 refpart.s =
s + slice_ds;
312 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
316 using namespace amrex::literals;
320 #if AMREX_DEVICE_COMPILE
330 amrex::ParticleReal
const zlen =
m_ds;
331 amrex::ParticleReal
const zmid = zlen / 2.0_prt;
334 amrex::ParticleReal efield = 0.0;
335 amrex::ParticleReal efieldp = 0.0;
336 amrex::ParticleReal efieldpp = 0.0;
337 amrex::ParticleReal efieldint = 0.0;
338 amrex::ParticleReal
const z = zeval - zmid;
340 if (std::abs(z) <= zmid)
342 efield = 0.5_prt*cos_data[0];
343 efieldint = z*efield;
344 for (
int j=1; j <
m_ncoef; ++j)
346 efield = efield + cos_data[j]*cos(j*2*
pi*z/zlen) +
347 sin_data[j]*sin(j*2*
pi*z/zlen);
348 efieldp = efieldp-j*2*
pi*cos_data[j]*sin(j*2*
pi*z/zlen)/zlen +
349 j*2*
pi*sin_data[j]*cos(j*2*
pi*z/zlen)/zlen;
350 efieldpp = efieldpp-
pow(j*2*
pi*cos_data[j]/zlen,2) *cos(j*2*
pi*z/zlen) -
351 pow(j*2*
pi*sin_data[j]/zlen,2) *sin(j*2*
pi*z/zlen);
352 efieldint = efieldint + zlen*cos_data[j]*sin(j*2*
pi*z/zlen)/(j*2*
pi) -
353 zlen*sin_data[j]*cos(j*2*
pi*z/zlen)/(j*2*
pi);
356 return std::make_tuple(efield, efieldp, efieldint);
368 void map3 (amrex::ParticleReal
const tau,
370 [[maybe_unused]] amrex::ParticleReal & zeval)
const
372 using namespace amrex::literals;
375 amrex::ParticleReal
const t = refpart.
t;
376 amrex::ParticleReal
const pt = refpart.
pt;
379 refpart.
t = t + tau/
sqrt(1.0_prt -
pow(pt, -2));
389 amrex::ParticleReal
const betgam = refpart.
beta_gamma();
391 refpart.
map(5,5) = R(5,5) + tau*R(6,5)/
pow(betgam,3);
392 refpart.
map(5,6) = R(5,6) + tau*R(6,6)/
pow(betgam,3);
404 void map2 (amrex::ParticleReal
const tau,
406 amrex::ParticleReal & zeval)
const
408 using namespace amrex::literals;
410 amrex::ParticleReal
const t = refpart.
t;
411 amrex::ParticleReal
const pt = refpart.
pt;
416 amrex::ParticleReal
const k = (2.0_prt*
pi/
c)*
m_freq;
417 amrex::ParticleReal
const phi =
m_phase*(
pi/180.0_prt);
418 amrex::ParticleReal
const E0 =
m_escale;
421 auto [ez, ezp, ezint] =
RF_Efield(zeval);
429 amrex::ParticleReal
const s = tau/refpart.
beta_gamma();
430 amrex::ParticleReal
const L = E0*ezp*sin(k*t+phi)/(2.0_prt*k);
432 refpart.
map(1,1) = (1.0_prt-
s*L)*R(1,1) +
s*R(2,1);
433 refpart.
map(1,2) = (1.0_prt-
s*L)*R(1,2) +
s*R(2,2);
434 refpart.
map(2,1) = -
s*
pow(L,2)*R(1,1) + (1.0_prt+
s*L)*R(2,1);
435 refpart.
map(2,2) = -
s*
pow(L,2)*R(1,2) + (1.0_prt+
s*L)*R(2,2);
437 refpart.
map(3,3) = (1.0_prt-
s*L)*R(3,3) +
s*R(4,3);
438 refpart.
map(3,4) = (1.0_prt-
s*L)*R(3,4) +
s*R(4,4);
439 refpart.
map(4,3) = -
s*
pow(L,2)*R(3,3) + (1.0_prt+
s*L)*R(4,3);
440 refpart.
map(4,4) = -
s*
pow(L,2)*R(3,4) + (1.0_prt+
s*L)*R(4,4);
452 void map1 (amrex::ParticleReal
const tau,
454 amrex::ParticleReal & zeval)
const
456 using namespace amrex::literals;
458 amrex::ParticleReal
const t = refpart.
t;
459 amrex::ParticleReal
const pt = refpart.
pt;
460 amrex::ParticleReal
const z = zeval;
465 amrex::ParticleReal
const k = (2.0_prt*
pi/
c)*
m_freq;
466 amrex::ParticleReal
const phi =
m_phase*(
pi/180.0_prt);
467 amrex::ParticleReal
const E0 =
m_escale;
473 auto [ezf, ezpf, ezintf] =
RF_Efield(zeval);
477 refpart.
pt = pt - E0*(ezintf-ezint)*cos(k*t+phi);
481 amrex::ParticleReal
const M = E0*(ezintf-ezint)*k*sin(k*t+phi);
482 amrex::ParticleReal
const L = E0*(ezpf-ezp)*sin(k*t+phi)/(2.0_prt*k)+M/2.0_prt;
484 refpart.
map(2,1) = L*R(1,1) + R(2,1);
485 refpart.
map(2,2) = L*R(1,2) + R(2,2);
487 refpart.
map(4,3) = L*R(3,3) + R(4,3);
488 refpart.
map(4,4) = L*R(3,4) + R(4,4);
490 refpart.
map(6,5) = M*R(5,5) + R(6,5);
491 refpart.
map(6,6) = M*R(5,6) + R(6,6);
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
T_ParticleType ParticleType
static constexpr amrex::Real pi
void copyAsync(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
static constexpr HostToDevice hostToDevice
void streamSynchronize() noexcept
constexpr std::enable_if_t< std::is_floating_point< T >::value, T > pi()
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > pow(const GpuComplex< T > &a_z, const T &a_y) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
static std::map< int, std::vector< amrex::ParticleReal > > h_cos_coef
host: cosine coefficients in Fourier expansion of on-axis electric field Ez
Definition: RFCavity.H:92
static std::map< int, std::vector< amrex::ParticleReal > > h_sin_coef
host: sine coefficients in Fourier expansion of on-axis electric field Ez
Definition: RFCavity.H:94
static std::map< int, amrex::Gpu::DeviceVector< amrex::ParticleReal > > d_sin_coef
device: sine coefficients in Fourier expansion of on-axis electric field Ez
Definition: RFCavity.H:99
static std::map< int, amrex::Gpu::DeviceVector< amrex::ParticleReal > > d_cos_coef
device: cosine coefficients in Fourier expansion of on-axis electric field Ez
Definition: RFCavity.H:97
static int next_id
last used id for a created RF cavity
Definition: RFCavity.H:89
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
Definition: ImpactX.cpp:32
Definition: RFCavity.H:44
amrex::Vector< amrex::ParticleReal > default_sin_coef
Definition: RFCavity.H:73
amrex::Vector< amrex::ParticleReal > default_cos_coef
Definition: RFCavity.H:45
Definition: RFCavity.H:106
amrex::ParticleReal m_escale
Definition: RFCavity.H:512
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:178
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition: RFCavity.H:404
amrex::ParticleReal * m_cos_h_data
number of Fourier coefficients
Definition: RFCavity.H:519
amrex::ParticleReal m_phase
RF frequency in Hz.
Definition: RFCavity.H:514
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, int mapsteps=1, int nslice=1)
Definition: RFCavity.H:122
void finalize()
Definition: RFCavity.H:497
amrex::ParticleReal * m_cos_d_data
non-owning pointer to host sine coefficients
Definition: RFCavity.H:521
int m_mapsteps
RF driven phase in deg.
Definition: RFCavity.H:515
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition: RFCavity.H:452
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, [[maybe_unused]] amrex::ParticleReal &zeval) const
Definition: RFCavity.H:368
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:314
static constexpr auto name
Definition: RFCavity.H:107
amrex::ParticleReal * m_sin_d_data
non-owning pointer to device cosine coefficients
Definition: RFCavity.H:522
ImpactXParticleContainer::ParticleType PType
Definition: RFCavity.H:108
int m_id
number of map integration steps per slice
Definition: RFCavity.H:516
amrex::ParticleReal * m_sin_h_data
non-owning pointer to host cosine coefficients
Definition: RFCavity.H:520
amrex::ParticleReal m_freq
scaling factor for RF electric field
Definition: RFCavity.H:513
int m_ncoef
unique RF cavity id used for data lookup map
Definition: RFCavity.H:518
@ x
position in x [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:42
@ y
position in y [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:43
@ t
c * time-of-flight [m] (at fixed s)
Definition: ImpactXParticleContainer.H:44
Definition: ReferenceParticle.H:30
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal beta_gamma() const
Definition: ReferenceParticle.H:79
amrex::ParticleReal pt
energy deviation, normalized by rest energy
Definition: ReferenceParticle.H:39
amrex::Array2D< amrex::ParticleReal, 1, 6, 1, 6 > map
linearized map
Definition: ReferenceParticle.H:44
amrex::ParticleReal t
clock time * c in meters
Definition: ReferenceParticle.H:35
Definition: beamoptic.H:135
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
amrex::ParticleReal m_ds
Definition: thick.H:56
Thick(amrex::ParticleReal const ds, int const nslice)
Definition: thick.H:30