10#ifndef IMPACTX_DIPEDGE_H
11#define IMPACTX_DIPEDGE_H
46 static constexpr auto type =
"DipEdge";
122 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)
141 using BeamOptic::operator();
155 Alignment::compute_constants(refpart);
213 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
231 if (
m_model == Model::linear) {
245 T_Real
const inv_delta1 = 1_prt /
sqrt(1_prt - 2_prt*pt/
m_beta + powi<2>(pt));
259 xout = x - c3 - c10*powi<2>(x) + (c10 + c11)*powi<2>(y);
260 yout = y + 2_prt * c10 * x * y;
263 T_Real
const D = 1_prt - 4_prt*c10*c11*powi<2>(y) - 4_prt*powi<2>(c10)*(powi<2>(x)+powi<2>(y));
266 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);
267 T_Real
const dXdx = 1_prt - 2_prt*c10*x;
268 T_Real
const dXdy = 2_prt*(c10 + c11)*y;
269 T_Real
const dYdx = 2_prt*c10*y;
270 T_Real
const dYdy = 1_prt + 2_prt*c10*x;
272 pxout = (dYdy * (px - dRdx) - dYdx * (py - dRdy)) / D;
273 pyout = (-dXdy * (px - dRdx) + dXdx * (py - dRdy)) / D;
276 T_Real
const dDelta_dpt = (pt - 1_prt/
m_beta) * inv_delta1;
277 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)
278 + (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);
285 T_Real
const dt_ref = -c3_ref * dpx_ref /
m_beta;
331 amrex::ParticleReal const dpz_ref = pnorm*(-1_prt + std::sqrt(1_prt - powi<2>(dpx_ref/pnorm)));
335 refpart.x = x + (pz/pnorm)*dx_ref;
336 refpart.z = z - (px/pnorm)*dx_ref;
337 refpart.t =
t + dt_ref;
338 refpart.px = px + (pz/pnorm)*dpx_ref + (px/pnorm)*dpz_ref;
339 refpart.pz = pz - (px/pnorm)*dpx_ref + (pz/pnorm)*dpz_ref;
346 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
constexpr T powi(T x) noexcept
__host__ __device__ std::pair< double, double > sincos(double x)
__host__ __device__ GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
@ 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::ParticleReal m_c11_times_1plusdelta
Definition DipEdge.H:404
static constexpr auto type
Definition DipEdge.H:46
amrex::ParticleReal m_g
bend radius in m
Definition DipEdge.H:384
Location m_location
fringe field model: linear or nonlinear
Definition DipEdge.H:394
amrex::ParticleReal m_K5
fringe field integral
Definition DipEdge.H:391
amrex::ParticleReal m_K3
fringe field integral
Definition DipEdge.H:389
amrex::ParticleReal m_c5
Definition DipEdge.H:401
amrex::ParticleReal m_c9_times_1plusdelta
Definition DipEdge.H:403
amrex::ParticleReal m_c15
Definition DipEdge.H:401
static constexpr bool DEFAULT_modify_ref_part
Definition DipEdge.H:70
amrex::ParticleReal m_c14
Definition DipEdge.H:401
amrex::ParticleReal m_K0
scale length in m
Definition DipEdge.H:386
amrex::ParticleReal m_beta
Definition DipEdge.H:400
amrex::ParticleReal m_R21
apply fringe field to reference particle (true/false)
Definition DipEdge.H:400
amrex::ParticleReal m_R43
Definition DipEdge.H:400
amrex::ParticleReal m_c4_times_1plusdelta
Definition DipEdge.H:402
static constexpr amrex::ParticleReal DEFAULT_R
Definition DipEdge.H:59
static constexpr amrex::ParticleReal DEFAULT_K1
Definition DipEdge.H:62
static constexpr amrex::ParticleReal DEFAULT_K5
Definition DipEdge.H:66
amrex::ParticleReal m_c13
Definition DipEdge.H:401
static constexpr Model DEFAULT_model
Definition DipEdge.H:68
amrex::ParticleReal m_c1
Definition DipEdge.H:401
amrex::ParticleReal m_K4
fringe field integral
Definition DipEdge.H:390
amrex::ParticleReal m_K2
fringe field integral
Definition DipEdge.H:388
amrex::ParticleReal m_c8_times_1plusdelta
Definition DipEdge.H:403
AMREX_ENUM_IN_CLASS(Location, entry, exit,)
static constexpr amrex::ParticleReal DEFAULT_K2
Definition DipEdge.H:63
amrex::ParticleReal m_c12_times_1plusdelta
Definition DipEdge.H:404
AMREX_ENUM_IN_CLASS(Model, linear, nonlinear,)
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 const &AMREX_RESTRICT pt, T_IdCpu const &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition DipEdge.H:215
amrex::ParticleReal m_c3_times_1plusdelta
Definition DipEdge.H:402
static constexpr amrex::ParticleReal DEFAULT_K3
Definition DipEdge.H:64
DipEdge(amrex::ParticleReal psi, amrex::ParticleReal rc, amrex::ParticleReal g, amrex::ParticleReal R=DEFAULT_R, amrex::ParticleReal K0=DEFAULT_K0, amrex::ParticleReal K1=DEFAULT_K1, amrex::ParticleReal K2=DEFAULT_K2, amrex::ParticleReal K3=DEFAULT_K3, amrex::ParticleReal K4=DEFAULT_K4, amrex::ParticleReal K5=DEFAULT_K5, amrex::ParticleReal K6=DEFAULT_K6, Model model=DEFAULT_model, Location location=DEFAULT_location, bool modify_ref_part=DEFAULT_modify_ref_part, amrex::ParticleReal dx=DEFAULT_dx, amrex::ParticleReal dy=DEFAULT_dy, amrex::ParticleReal rotation_degree=DEFAULT_rotation_degree, std::optional< std::string > name=DEFAULT_name)
Definition DipEdge.H:100
void compute_constants(RefPart const &refpart)
Definition DipEdge.H:150
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition DipEdge.H:355
amrex::ParticleReal m_c7_times_1plusdelta
Definition DipEdge.H:403
amrex::ParticleReal m_K6
fringe field integral
Definition DipEdge.H:392
void reverse()
Definition DipEdge.H:131
amrex::ParticleReal m_c10_times_1plusdelta
Definition DipEdge.H:403
amrex::ParticleReal m_c2_times_1plusdelta
Definition DipEdge.H:402
amrex::ParticleReal m_psi
Definition DipEdge.H:382
static constexpr amrex::ParticleReal DEFAULT_K6
Definition DipEdge.H:67
amrex::ParticleReal m_c6_times_1plusdelta
Definition DipEdge.H:402
amrex::ParticleReal m_R
gap parameter in m
Definition DipEdge.H:385
bool m_modify_ref_part
fringe field location: entry, or exit
Definition DipEdge.H:395
amrex::ParticleReal m_rc
pole face angle in rad
Definition DipEdge.H:383
ImpactXParticleContainer::ParticleType PType
Definition DipEdge.H:47
static constexpr Location DEFAULT_location
Definition DipEdge.H:69
amrex::ParticleReal m_K1
fringe field integral
Definition DipEdge.H:387
static constexpr amrex::ParticleReal DEFAULT_K0
Definition DipEdge.H:60
static constexpr amrex::ParticleReal DEFAULT_K4
Definition DipEdge.H:65
Model m_model
fringe field integral
Definition DipEdge.H:393
Definition alignment.H:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dy() const
Definition alignment.H:193
static constexpr amrex::ParticleReal DEFAULT_dy
Definition alignment.H:34
static constexpr amrex::ParticleReal DEFAULT_dx
Definition alignment.H:33
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dx() const
Definition alignment.H:183
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 rotate_aligned_map(Map6x6 const &R) const
Definition alignment.H:267
Alignment(amrex::ParticleReal dx, amrex::ParticleReal dy, amrex::ParticleReal rotation_degree)
Definition alignment.H:43
static constexpr amrex::ParticleReal DEFAULT_rotation_degree
Definition alignment.H:35
Definition beamoptic.H:567
Definition lineartransport.H:50
static constexpr std::nullopt_t DEFAULT_name
Definition named.H:30
AMREX_GPU_HOST Named(std::optional< std::string > name)
Definition named.H:59
AMREX_FORCE_INLINE std::string name() const
Definition named.H:124
Definition nofinalize.H:22