10#ifndef IMPACTX_DIPEDGE_H
11#define IMPACTX_DIPEDGE_H
57 static constexpr auto type =
"DipEdge";
100 dipedge::Model model,
101 dipedge::Location location,
102 bool modify_ref_part =
false,
106 std::optional<std::string>
name = std::nullopt
110 m_psi(psi),
m_rc(rc),
m_g(g),
m_R(R),
m_K0(K0),
m_K1(K1),
m_K2(K2),
m_K3(K3),
m_K4(K4),
m_K5(K5),
m_K6(K6),
m_model(model),
m_location(location),
m_modify_ref_part(modify_ref_part)
124 ? dipedge::Location::exit
125 : dipedge::Location::entry;
129 using BeamOptic::operator();
143 Alignment::compute_constants(refpart);
201 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
222 if (
m_model == dipedge::Model::linear) {
236 T_Real
const inv_delta1 = 1_prt /
sqrt(1_prt - 2_prt*pt/
m_beta + powi<2>(pt));
250 xout = x - c3 - c10*powi<2>(x) + (c10 + c11)*powi<2>(y);
251 yout = y + 2_prt * c10 * x * y;
254 T_Real
const D = 1_prt - 4_prt*c10*c11*powi<2>(y) - 4_prt*powi<2>(c10)*(powi<2>(x)+powi<2>(y));
257 T_Real
const dRdy = 2_prt*(-
m_c14 +
m_c5 - c7)*y + 2_prt*(-
m_c15/2_prt + c10*
m_c5 - c11*
m_c5 - c9)*x*y - 4_prt*c12*powi<3>(y);
258 T_Real
const dXdx = 1_prt - 2_prt*c10*x;
259 T_Real
const dXdy = 2_prt*(c10 + c11)*y;
260 T_Real
const dYdx = 2_prt*c10*y;
261 T_Real
const dYdy = 1_prt + 2_prt*c10*x;
263 pxout = (dYdy * (px - dRdx) - dYdx * (py - dRdy)) / D;
264 pyout = (-dXdy * (px - dRdx) + dXdx * (py - dRdy)) / D;
267 T_Real
const dDelta_dpt = (pt - 1_prt/
m_beta) * inv_delta1;
268 tout =
t - dDelta_dpt * inv_delta1 * ((c2 + c3*
m_c5)*x + (c10*
m_c5 + c8)*powi<3>(x) - c7*powi<2>(y) - c12*powi<4>(y)
269 + (c10*
m_c5 - c11*
m_c5 - c9)*x*powi<2>(y) + pxout*(-c3 + (c11 + c10)*powi<2>(y) - c10*powi<2>(x)) + 2_prt*pyout*c10*x*y);
276 T_Real
const dt_ref = -c3_ref * dpx_ref /
m_beta;
326 amrex::ParticleReal const dpz_ref = pnorm*(-1_prt + std::sqrt(1_prt - powi<2>(dpx_ref/pnorm)));
330 refpart.x = x + (pz/pnorm)*dx_ref;
331 refpart.z = z - (px/pnorm)*dx_ref;
332 refpart.t =
t + dt_ref;
333 refpart.px = px + (pz/pnorm)*dpx_ref + (px/pnorm)*dpz_ref;
334 refpart.pz = pz - (px/pnorm)*dpx_ref + (pz/pnorm)*dpz_ref;
342 using LinearTransport::operator();
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
#define IMPACTX_PUSH_EXTERN_TEMPLATE(ElementType)
Definition PushAll.H:78
T_ParticleType ParticleType
amrex_particle_real ParticleReal
__host__ __device__ std::pair< double, double > sincos(double x)
constexpr T powi(T x) noexcept
__host__ __device__ GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
AMREX_ENUM(Model, linear, nonlinear)
@ 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 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 DipEdge.H:203
amrex::ParticleReal m_c11_times_1plusdelta
Definition DipEdge.H:399
static constexpr auto type
Definition DipEdge.H:57
amrex::ParticleReal m_g
bend radius in m
Definition DipEdge.H:379
amrex::ParticleReal m_K5
fringe field integral
Definition DipEdge.H:386
amrex::ParticleReal m_K3
fringe field integral
Definition DipEdge.H:384
amrex::ParticleReal m_c5
Definition DipEdge.H:396
amrex::ParticleReal m_c9_times_1plusdelta
Definition DipEdge.H:398
amrex::ParticleReal m_c15
Definition DipEdge.H:396
amrex::ParticleReal m_c14
Definition DipEdge.H:396
amrex::ParticleReal m_K0
scale length in m
Definition DipEdge.H:381
amrex::ParticleReal m_beta
Definition DipEdge.H:395
amrex::ParticleReal m_R21
apply fringe field to reference particle (true/false)
Definition DipEdge.H:395
amrex::ParticleReal m_R43
Definition DipEdge.H:395
amrex::ParticleReal m_c4_times_1plusdelta
Definition DipEdge.H:397
amrex::ParticleReal m_c13
Definition DipEdge.H:396
amrex::ParticleReal m_c1
Definition DipEdge.H:396
amrex::ParticleReal m_K4
fringe field integral
Definition DipEdge.H:385
dipedge::Location m_location
fringe field model: linear or nonlinear
Definition DipEdge.H:389
amrex::ParticleReal m_K2
fringe field integral
Definition DipEdge.H:383
amrex::ParticleReal m_c8_times_1plusdelta
Definition DipEdge.H:398
amrex::ParticleReal m_c12_times_1plusdelta
Definition DipEdge.H:399
amrex::ParticleReal m_c3_times_1plusdelta
Definition DipEdge.H:397
dipedge::Model m_model
fringe field integral
Definition DipEdge.H:388
void compute_constants(RefPart const &refpart)
Definition DipEdge.H:138
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition DipEdge.H:351
amrex::ParticleReal m_c7_times_1plusdelta
Definition DipEdge.H:398
amrex::ParticleReal m_K6
fringe field integral
Definition DipEdge.H:387
void reverse()
Definition DipEdge.H:119
amrex::ParticleReal m_c10_times_1plusdelta
Definition DipEdge.H:398
amrex::ParticleReal m_c2_times_1plusdelta
Definition DipEdge.H:397
amrex::ParticleReal m_psi
Definition DipEdge.H:377
DipEdge(amrex::ParticleReal psi, amrex::ParticleReal rc, amrex::ParticleReal g, amrex::ParticleReal R, amrex::ParticleReal K0, amrex::ParticleReal K1, amrex::ParticleReal K2, amrex::ParticleReal K3, amrex::ParticleReal K4, amrex::ParticleReal K5, amrex::ParticleReal K6, dipedge::Model model, dipedge::Location location, bool modify_ref_part=false, amrex::ParticleReal dx=0, amrex::ParticleReal dy=0, amrex::ParticleReal rotation_degree=0, std::optional< std::string > name=std::nullopt)
Definition DipEdge.H:88
amrex::ParticleReal m_c6_times_1plusdelta
Definition DipEdge.H:397
amrex::ParticleReal m_R
gap parameter in m
Definition DipEdge.H:380
bool m_modify_ref_part
fringe field location: entry, or exit
Definition DipEdge.H:390
amrex::ParticleReal m_rc
pole face angle in rad
Definition DipEdge.H:378
ImpactXParticleContainer::ParticleType PType
Definition DipEdge.H:58
amrex::ParticleReal m_K1
fringe field integral
Definition DipEdge.H:382
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 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