10#ifndef IMPACTX_DIPEDGE_H
11#define IMPACTX_DIPEDGE_H
57 static constexpr auto type =
"DipEdge";
88 amrex::ParticleReal psi,
89 amrex::ParticleReal rc,
90 amrex::ParticleReal g,
91 amrex::ParticleReal R,
92 amrex::ParticleReal K0,
93 amrex::ParticleReal K1,
94 amrex::ParticleReal K2,
95 amrex::ParticleReal K3,
96 amrex::ParticleReal K4,
97 amrex::ParticleReal K5,
98 amrex::ParticleReal K6,
100 dipedge::Location location,
101 amrex::ParticleReal
dx = 0,
102 amrex::ParticleReal
dy = 0,
103 amrex::ParticleReal rotation_degree = 0,
104 std::optional<std::string>
name = std::nullopt
108 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)
113 using BeamOptic::operator();
124 using namespace amrex::literals;
127 Alignment::compute_constants(refpart);
136 amrex::ParticleReal
const vf = (1.0_prt + powi<2>(sin_psi))
148 amrex::ParticleReal
const tan_psi = sin_psi/cos_psi;
149 amrex::ParticleReal
const sec_psi = 1_prt/cos_psi;
152 amrex::ParticleReal
const loc =
m_location == dipedge::Location::entry ? 1_prt : -1_prt;
185 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
199 using namespace amrex::literals;
206 if (
m_model == dipedge::Model::linear) {
220 T_Real
const inv_delta1 = 1_prt / sqrt(1_prt - 2_prt*pt/
m_beta + powi<2>(pt));
234 xout = x - c3 - c10*powi<2>(x) + (c10 + c11)*powi<2>(y);
235 yout = y + 2_prt * c10 * x * y;
238 T_Real
const D = 1_prt - 4_prt*c10*c11*powi<2>(y) - 4_prt*powi<2>(c10)*(powi<2>(x)+powi<2>(y));
241 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);
242 T_Real
const dXdx = 1_prt - 2_prt*c10*x;
243 T_Real
const dXdy = 2_prt*(c10 + c11)*y;
244 T_Real
const dYdx = 2_prt*c10*y;
245 T_Real
const dYdy = 1_prt + 2_prt*c10*x;
247 pxout = (dYdy * (px - dRdx) - dYdx * (py - dRdy)) / D;
248 pyout = (-dXdy * (px - dRdx) + dXdx * (py - dRdy)) / D;
251 T_Real
const dDelta_dpt = (pt - 1_prt/
m_beta) * inv_delta1;
252 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)
253 + (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);
268 using Thin::operator();
271 using LinearTransport::operator();
282 using namespace amrex::literals;
289 amrex::ParticleReal
const R21 = std::tan(
m_psi) /
m_rc;
293 amrex::ParticleReal
const vf = (1.0_prt + powi<2>(sin_psi))
297 amrex::ParticleReal
const R43 = vf - R21;
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
T_ParticleType ParticleType
__host__ __device__ std::pair< double, double > sincos(double x)
constexpr T powi(T x) 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:31
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:187
amrex::ParticleReal m_c11_times_1plusdelta
Definition DipEdge.H:327
static constexpr auto type
Definition DipEdge.H:57
amrex::ParticleReal m_g
bend radius in m
Definition DipEdge.H:308
amrex::ParticleReal m_K5
fringe field integral
Definition DipEdge.H:315
amrex::ParticleReal m_K3
fringe field integral
Definition DipEdge.H:313
amrex::ParticleReal m_c5
Definition DipEdge.H:324
amrex::ParticleReal m_c9_times_1plusdelta
Definition DipEdge.H:326
amrex::ParticleReal m_c15
Definition DipEdge.H:324
amrex::ParticleReal m_c14
Definition DipEdge.H:324
amrex::ParticleReal m_K0
scale length in m
Definition DipEdge.H:310
amrex::ParticleReal m_beta
Definition DipEdge.H:323
amrex::ParticleReal m_R21
fringe field location: entry, or exit
Definition DipEdge.H:323
amrex::ParticleReal m_R43
Definition DipEdge.H:323
amrex::ParticleReal m_c4_times_1plusdelta
Definition DipEdge.H:325
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, amrex::ParticleReal dx=0, amrex::ParticleReal dy=0, amrex::ParticleReal rotation_degree=0, std::optional< std::string > name=std::nullopt)
Definition DipEdge.H:87
amrex::ParticleReal m_c13
Definition DipEdge.H:324
amrex::ParticleReal m_c1
Definition DipEdge.H:324
amrex::ParticleReal m_K4
fringe field integral
Definition DipEdge.H:314
dipedge::Location m_location
fringe field model: linear or nonlinear
Definition DipEdge.H:318
amrex::ParticleReal m_K2
fringe field integral
Definition DipEdge.H:312
amrex::ParticleReal m_c8_times_1plusdelta
Definition DipEdge.H:326
amrex::ParticleReal m_c12_times_1plusdelta
Definition DipEdge.H:327
amrex::ParticleReal m_c3_times_1plusdelta
Definition DipEdge.H:325
dipedge::Model m_model
fringe field integral
Definition DipEdge.H:317
void compute_constants(RefPart const &refpart)
Definition DipEdge.H:122
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition DipEdge.H:280
amrex::ParticleReal m_c7_times_1plusdelta
Definition DipEdge.H:326
amrex::ParticleReal m_K6
fringe field integral
Definition DipEdge.H:316
amrex::ParticleReal m_c10_times_1plusdelta
Definition DipEdge.H:326
amrex::ParticleReal m_c2_times_1plusdelta
Definition DipEdge.H:325
amrex::ParticleReal m_psi
Definition DipEdge.H:306
amrex::ParticleReal m_c6_times_1plusdelta
Definition DipEdge.H:325
amrex::ParticleReal m_R
gap parameter in m
Definition DipEdge.H:309
amrex::ParticleReal m_rc
pole face angle in rad
Definition DipEdge.H:307
ImpactXParticleContainer::ParticleType PType
Definition DipEdge.H:58
amrex::ParticleReal m_K1
fringe field integral
Definition DipEdge.H:311
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:219
Definition lineartransport.H:29
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