ImpactX
Loading...
Searching...
No Matches
impactx::elements::DipEdge Struct Reference

#include <DipEdge.H>

Inheritance diagram for impactx::elements::DipEdge:
impactx::elements::mixin::Named impactx::elements::mixin::BeamOptic< DipEdge > impactx::elements::mixin::LinearTransport< DipEdge > impactx::elements::mixin::Thin impactx::elements::mixin::Alignment impactx::elements::mixin::NoFinalize

Public Types

using PType = ImpactXParticleContainer::ParticleType

Public Member Functions

 AMREX_ENUM_IN_CLASS (Model, linear, nonlinear,)
 AMREX_ENUM_IN_CLASS (Location, entry, exit,)
 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)
void reverse ()
void compute_constants (RefPart const &refpart)
template<typename T_Real = amrex::ParticleReal, typename T_IdCpu = uint64_t>
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
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator() (RefPart &AMREX_RESTRICT refpart) const
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map (RefPart const &AMREX_RESTRICT refpart) const
Public Member Functions inherited from impactx::elements::mixin::Named
AMREX_GPU_HOST void set_name (std::string const &new_name)
AMREX_GPU_HOST Named (std::optional< std::string > name)
AMREX_GPU_HOST_DEVICE ~Named ()
AMREX_GPU_HOST Named (Named const &other)
AMREX_GPU_HOST Namedoperator= (Named const &other)
AMREX_GPU_HOST_DEVICE Named (Named &&other) noexcept
AMREX_GPU_HOST_DEVICE Namedoperator= (Named &&other) noexcept
AMREX_FORCE_INLINE std::string name () const
AMREX_FORCE_INLINE bool has_name () const
Public Member Functions inherited from impactx::elements::mixin::BeamOptic< DipEdge >
void operator() (ImpactXParticleContainer &pc, int step, int period)
Public Member Functions inherited from impactx::elements::mixin::LinearTransport< DipEdge >
AMREX_GPU_HOST AMREX_FORCE_INLINE void operator() (Map6x6 &AMREX_RESTRICT cm, RefPart const &AMREX_RESTRICT ref) const
Public Member Functions inherited from impactx::elements::mixin::Thin
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator() (RefPart &AMREX_RESTRICT refpart) const
void reverse ()
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int nslice () const
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal ds () const
Public Member Functions inherited from impactx::elements::mixin::Alignment
 Alignment (amrex::ParticleReal dx, amrex::ParticleReal dy, amrex::ParticleReal rotation_degree)
 Alignment ()=default
 Alignment (Alignment const &)=default
Alignmentoperator= (Alignment const &)=default
 Alignment (Alignment &&)=default
Alignmentoperator= (Alignment &&rhs)=default
 ~Alignment ()=default
void compute_constants (RefPart const &refpart)
template<typename T_Real>
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
template<typename T_Real>
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void rotate_in (T_Real &AMREX_RESTRICT sx, T_Real &AMREX_RESTRICT sy) const
template<typename T_Real>
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
template<typename T_Real>
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void rotate_out (T_Real &AMREX_RESTRICT sx, T_Real &AMREX_RESTRICT sy) const
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dx () const
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dy () const
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal rotation () const
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool misaligned () const
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 rotation_map () const
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 rotate_aligned_map (Map6x6 const &R) const
Public Member Functions inherited from impactx::elements::mixin::NoFinalize
void finalize ()

Public Attributes

amrex::ParticleReal m_psi
amrex::ParticleReal m_rc
 pole face angle in rad
amrex::ParticleReal m_g
 bend radius in m
amrex::ParticleReal m_R
 gap parameter in m
amrex::ParticleReal m_K0
 scale length in m
amrex::ParticleReal m_K1
 fringe field integral
amrex::ParticleReal m_K2
 fringe field integral
amrex::ParticleReal m_K3
 fringe field integral
amrex::ParticleReal m_K4
 fringe field integral
amrex::ParticleReal m_K5
 fringe field integral
amrex::ParticleReal m_K6
 fringe field integral
Model m_model
 fringe field integral
Location m_location
 fringe field model: linear or nonlinear
bool m_modify_ref_part
 fringe field location: entry, or exit
Public Attributes inherited from impactx::elements::mixin::Alignment
amrex::ParticleReal m_dx = 0
amrex::ParticleReal m_dy = 0
 horizontal translation error [m]
amrex::ParticleReal m_rotation = 0
 vertical translation error [m]

Static Public Attributes

static constexpr auto type = "DipEdge"
static constexpr amrex::ParticleReal DEFAULT_R = 1
static constexpr amrex::ParticleReal DEFAULT_K0
static constexpr amrex::ParticleReal DEFAULT_K1 = 0
static constexpr amrex::ParticleReal DEFAULT_K2 = 1
static constexpr amrex::ParticleReal DEFAULT_K3 = amrex::ParticleReal(1.0 / 6.0)
static constexpr amrex::ParticleReal DEFAULT_K4 = 0
static constexpr amrex::ParticleReal DEFAULT_K5 = 0
static constexpr amrex::ParticleReal DEFAULT_K6 = 0
static constexpr Model DEFAULT_model = Model::linear
static constexpr Location DEFAULT_location = Location::entry
static constexpr bool DEFAULT_modify_ref_part = false
Static Public Attributes inherited from impactx::elements::mixin::Named
static constexpr std::nullopt_t DEFAULT_name = std::nullopt
Static Public Attributes inherited from impactx::elements::mixin::LinearTransport< DipEdge >
static constexpr bool has_linear_transport
Static Public Attributes inherited from impactx::elements::mixin::Alignment
static constexpr amrex::ParticleReal degree2rad
static constexpr amrex::ParticleReal DEFAULT_dx = 0
static constexpr amrex::ParticleReal DEFAULT_dy = 0
static constexpr amrex::ParticleReal DEFAULT_rotation_degree = 0

Private Attributes

amrex::ParticleReal m_R21
 apply fringe field to reference particle (true/false)
amrex::ParticleReal m_R43
amrex::ParticleReal m_beta
amrex::ParticleReal m_c1
amrex::ParticleReal m_c5
amrex::ParticleReal m_c13
amrex::ParticleReal m_c14
amrex::ParticleReal m_c15
amrex::ParticleReal m_c2_times_1plusdelta
amrex::ParticleReal m_c3_times_1plusdelta
amrex::ParticleReal m_c4_times_1plusdelta
amrex::ParticleReal m_c6_times_1plusdelta
amrex::ParticleReal m_c7_times_1plusdelta
amrex::ParticleReal m_c8_times_1plusdelta
amrex::ParticleReal m_c9_times_1plusdelta
amrex::ParticleReal m_c10_times_1plusdelta
amrex::ParticleReal m_c11_times_1plusdelta
amrex::ParticleReal m_c12_times_1plusdelta

Member Typedef Documentation

◆ PType

Constructor & Destructor Documentation

◆ DipEdge()

Edge focusing associated with bend entry or exit

This model assumes a first-order effect of nonzero gap. Here we use the linear fringe field map, given to first order in g/rc (gap / radius of curvature).

References: K. L. Brown, SLAC Report No. 75 (1982). K. Hwang and S. Y. Lee, PRAB 18, 122401 (2015).

Parameters
psiPole face entry/exit angle in rad.
rcRadius of curvature in m.
gGap parameter in m.
RLength scale parameter in m.
K0Fringe field integeral (unitless).
K1Fringe field integeral (unitless).
K2Fringe field integral (unitless).
K3Fringe field integral (unitless).
K4Fringe field integral (unitless).
K5Fringe field integral (unitless).
K6Fringe field integral (unitless).
modelFringe field model (linear or nonlinear).
locationFringe field location (entry or exit).
modify_ref_partApply fringe field to the reference particle (boolean).
dxhorizontal translation error in m
dyvertical translation error in m
rotation_degreerotation error in the transverse plane [degrees]
namea user defined and not necessarily unique name of the element

Member Function Documentation

◆ AMREX_ENUM_IN_CLASS() [1/2]

impactx::elements::DipEdge::AMREX_ENUM_IN_CLASS ( Location ,
entry ,
exit  )
Parameters
-for leading (entry) fringe field

◆ AMREX_ENUM_IN_CLASS() [2/2]

impactx::elements::DipEdge::AMREX_ENUM_IN_CLASS ( Model ,
linear ,
nonlinear  )
Parameters
-for the linear fringe field model

◆ compute_constants()

void impactx::elements::DipEdge::compute_constants ( RefPart const & refpart)
inline

Compute and cache the constants for the push.

In particular, used to pre-compute and cache variables that are independent of the individually tracked particle.

Parameters
refpartreference particle (unused)

◆ operator()() [1/2]

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void impactx::elements::DipEdge::operator() ( RefPart &AMREX_RESTRICT refpart) const
inline

This pushes the reference particle.

Parameters
[in,out]refpartreference particle

◆ operator()() [2/2]

template<typename T_Real = amrex::ParticleReal, typename T_IdCpu = uint64_t>
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void impactx::elements::DipEdge::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
inline

This is a dipedge functor, so that a variable of this type can be used like a dipedge function.

The

See also
compute_constants method must be called before pushing particles through this operator.
Parameters
xparticle position in x
yparticle position in y
tparticle position in t (unchanged by the linear model)
pxparticle momentum in x
pyparticle momentum in y
ptparticle momentum in t (unchanged)
idcpuparticle global index (unused)
refpartreference particle (unused)

◆ reverse()

void impactx::elements::DipEdge::reverse ( )
inline

Reverse the element (negate psi and K2, swap entry/exit)

Todo
the m_modify_ref_part=true parameter is not yet handled see https://github.com/BLAST-ImpactX/impactx/pull/1431

◆ transport_map()

AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 impactx::elements::DipEdge::transport_map ( RefPart const &AMREX_RESTRICT refpart) const
inline

This function returns the linear transport map.

Parameters
[in]refpartreference particle
Returns
6x6 transport matrix

Member Data Documentation

◆ DEFAULT_K0

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_K0
staticconstexpr

◆ DEFAULT_K1

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_K1 = 0
staticconstexpr

◆ DEFAULT_K2

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_K2 = 1
staticconstexpr

◆ DEFAULT_K3

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_K3 = amrex::ParticleReal(1.0 / 6.0)
staticconstexpr

◆ DEFAULT_K4

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_K4 = 0
staticconstexpr

◆ DEFAULT_K5

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_K5 = 0
staticconstexpr

◆ DEFAULT_K6

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_K6 = 0
staticconstexpr

◆ DEFAULT_location

Location impactx::elements::DipEdge::DEFAULT_location = Location::entry
staticconstexpr

◆ DEFAULT_model

Model impactx::elements::DipEdge::DEFAULT_model = Model::linear
staticconstexpr

◆ DEFAULT_modify_ref_part

bool impactx::elements::DipEdge::DEFAULT_modify_ref_part = false
staticconstexpr

◆ DEFAULT_R

amrex::ParticleReal impactx::elements::DipEdge::DEFAULT_R = 1
staticconstexpr

◆ m_beta

amrex::ParticleReal impactx::elements::DipEdge::m_beta
private

◆ m_c1

amrex::ParticleReal impactx::elements::DipEdge::m_c1
private

◆ m_c10_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c10_times_1plusdelta
private

◆ m_c11_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c11_times_1plusdelta
private

◆ m_c12_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c12_times_1plusdelta
private

◆ m_c13

amrex::ParticleReal impactx::elements::DipEdge::m_c13
private

◆ m_c14

amrex::ParticleReal impactx::elements::DipEdge::m_c14
private

◆ m_c15

amrex::ParticleReal impactx::elements::DipEdge::m_c15
private

◆ m_c2_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c2_times_1plusdelta
private

◆ m_c3_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c3_times_1plusdelta
private

◆ m_c4_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c4_times_1plusdelta
private

◆ m_c5

amrex::ParticleReal impactx::elements::DipEdge::m_c5
private

◆ m_c6_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c6_times_1plusdelta
private

◆ m_c7_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c7_times_1plusdelta
private

◆ m_c8_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c8_times_1plusdelta
private

◆ m_c9_times_1plusdelta

amrex::ParticleReal impactx::elements::DipEdge::m_c9_times_1plusdelta
private

◆ m_g

amrex::ParticleReal impactx::elements::DipEdge::m_g

bend radius in m

◆ m_K0

amrex::ParticleReal impactx::elements::DipEdge::m_K0

scale length in m

◆ m_K1

amrex::ParticleReal impactx::elements::DipEdge::m_K1

fringe field integral

◆ m_K2

amrex::ParticleReal impactx::elements::DipEdge::m_K2

fringe field integral

◆ m_K3

amrex::ParticleReal impactx::elements::DipEdge::m_K3

fringe field integral

◆ m_K4

amrex::ParticleReal impactx::elements::DipEdge::m_K4

fringe field integral

◆ m_K5

amrex::ParticleReal impactx::elements::DipEdge::m_K5

fringe field integral

◆ m_K6

amrex::ParticleReal impactx::elements::DipEdge::m_K6

fringe field integral

◆ m_location

Location impactx::elements::DipEdge::m_location

fringe field model: linear or nonlinear

◆ m_model

Model impactx::elements::DipEdge::m_model

fringe field integral

◆ m_modify_ref_part

bool impactx::elements::DipEdge::m_modify_ref_part

fringe field location: entry, or exit

◆ m_psi

amrex::ParticleReal impactx::elements::DipEdge::m_psi

◆ m_R

amrex::ParticleReal impactx::elements::DipEdge::m_R

gap parameter in m

◆ m_R21

amrex::ParticleReal impactx::elements::DipEdge::m_R21
private

apply fringe field to reference particle (true/false)

◆ m_R43

amrex::ParticleReal impactx::elements::DipEdge::m_R43
private

◆ m_rc

amrex::ParticleReal impactx::elements::DipEdge::m_rc

pole face angle in rad

◆ type

auto impactx::elements::DipEdge::type = "DipEdge"
staticconstexpr

The documentation for this struct was generated from the following file: