10#ifndef IMPACTX_SOFTSOL_H
11#define IMPACTX_SOFTSOL_H
63 4.409581845710694E-002,
64 -9.416427163897508E-006,
65 -2.459452716865687E-002,
66 -3.272762575737291E-002,
67 -2.936414401076162E-002,
68 -1.995780078926890E-002,
69 -9.102893342953847E-003,
70 -2.456410658713271E-006,
71 5.788233017324325E-003,
72 8.040408292420691E-003,
73 7.480064552867431E-003,
74 5.230254569468851E-003,
75 2.447614547094685E-003,
76 -1.095525090532255E-006,
77 -1.614586867387170E-003,
78 -2.281365457438345E-003,
79 -2.148709081338292E-003,
80 -1.522541739363011E-003,
81 -7.185505862719508E-004,
82 -6.171194824600157E-007,
83 4.842109305036943E-004,
84 6.874508102002901E-004,
85 6.535550288205728E-004,
86 4.648795813759210E-004,
87 2.216564722797528E-004,
88 -4.100982995210341E-007,
89 -1.499332112463395E-004,
90 -2.151538438342482E-004,
91 -2.044590946652016E-004,
92 -1.468242784844341E-004
96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
98 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
125 static constexpr auto type =
"SoftSolenoid";
154 std::vector<amrex::ParticleReal> cos_coef,
155 std::vector<amrex::ParticleReal> sin_coef,
164 std::optional<std::string>
name = std::nullopt
173 m_ncoef = int(cos_coef.size());
174 if (
m_ncoef !=
int(sin_coef.size()))
175 throw std::runtime_error(
"SoftSolenoid: cos and sin coefficients must have same length!");
194 using BeamOptic::operator();
207 Alignment::compute_constants(refpart);
229 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
258 auto const out = R *
v;
297 refpart.map =
decltype(refpart.map)::Identity();
300 refpart.spin_rotation_vector = {};
301 refpart.spin_coupling = {};
327 refpart.x = x + slice_ds*px/bgi;
328 refpart.y = y + slice_ds*py/bgi;
329 refpart.z = z + slice_ds*pz/bgi;
335 refpart.px = px*bgf/bgi;
336 refpart.py = py*bgf/bgi;
337 refpart.pz = pz*bgf/bgi;
340 refpart.s =
s + slice_ds;
358 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
377 T_Real lambdax = 0_prt;
378 T_Real lambday = 0_prt;
379 T_Real lambdaz = 0_prt;
388 auto const out = A *
v;
408 (*this)(x, y,
t, px, py, pt, idcpu, refpart);
413 using LinearTransport::operator();
437 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
445#if AMREX_DEVICE_COMPILE
464 if (std::abs(z) <= zmid)
466 bfield = 0.5_prt*cos_data[0];
467 bfieldint = z*bfield;
468 for (
int j=1; j <
m_ncoef; ++j)
470 bfield = bfield + cos_data[j] * std::cos(j*2*pi*z/zlen) +
471 sin_data[j] * std::sin(j*2*pi*z/zlen);
472 bfieldp = bfieldp-j*2*pi*cos_data[j] * std::sin(j*2*pi*z/zlen)/zlen +
473 j*2*pi*sin_data[j] * std::cos(j*2*pi*z/zlen)/zlen;
474 bfieldint = bfieldint + zlen*cos_data[j] * std::sin(j*2*pi*z/zlen)/(j*2*pi) -
475 zlen*sin_data[j] * std::cos(j*2*pi*z/zlen)/(j*2*pi);
478 return std::make_tuple(bfield, bfieldp, bfieldint);
503 refpart.
t =
t + tau/std::sqrt(1.0_prt - powi<-2>(pt));
517 refpart.
map(1,1) = R(1,1) + tau*R(2,1);
518 refpart.
map(1,2) = R(1,2) + tau*R(2,2);
519 refpart.
map(1,3) = R(1,3) + tau*R(2,3);
520 refpart.
map(1,4) = R(1,4) + tau*R(2,4);
522 refpart.
map(3,1) = R(3,1) + tau*R(4,1);
523 refpart.
map(3,2) = R(3,2) + tau*R(4,2);
524 refpart.
map(3,3) = R(3,3) + tau*R(4,3);
525 refpart.
map(3,4) = R(3,4) + tau*R(4,4);
527 refpart.
map(5,5) = R(5,5) + tau*R(6,5)/powi<2>(betgam);
528 refpart.
map(5,6) = R(5,6) + tau*R(6,6)/powi<2>(betgam);
569 refpart.
map(2,1) = R(2,1) - tau*alpha2*R(1,1);
570 refpart.
map(2,2) = R(2,2) - tau*alpha2*R(1,2);
571 refpart.
map(2,3) = R(2,3) - tau*alpha2*R(1,3);
572 refpart.
map(2,4) = R(2,4) - tau*alpha2*R(1,4);
574 refpart.
map(4,1) = R(4,1) - tau*alpha2*R(3,1);
575 refpart.
map(4,2) = R(4,2) - tau*alpha2*R(3,2);
576 refpart.
map(4,3) = R(4,3) - tau*alpha2*R(3,3);
577 refpart.
map(4,4) = R(4,4) - tau*alpha2*R(3,4);
591 dA(1,1) = Gfactor * tau * alpha2 * (-2_prt*sn + tau*cs*alpha);
592 dA(1,2) = 2_prt * Gfactor * tau * alpha * cs;
593 dA(1,3) = Gfactor * tau * alpha2 * (2_prt*cs + tau*sn*alpha);
594 dA(1,4) = 2_prt * Gfactor * tau * alpha * sn;
595 dA(2,1) = -Gfactor * tau * alpha2 * (2_prt*cs + tau*sn*alpha);
596 dA(2,2) = -2_prt * Gfactor * tau * alpha * sn;
597 dA(2,3) = Gfactor * tau * alpha2 * (-2_prt*sn + tau*cs*alpha);
598 dA(2,4) = 2_prt * Gfactor * tau * cs * alpha;
599 dA(3,6) = -2_prt *(1_prt + G) * tau * alpha/beta;
644 refpart.
map(1,1) = R(1,1)*cs + R(3,1)*sn;
645 refpart.
map(1,2) = R(1,2)*cs + R(3,2)*sn;
646 refpart.
map(1,3) = R(1,3)*cs + R(3,3)*sn;
647 refpart.
map(1,4) = R(1,4)*cs + R(3,4)*sn;
649 refpart.
map(2,1) = R(2,1)*cs + R(4,1)*sn;
650 refpart.
map(2,2) = R(2,2)*cs + R(4,2)*sn;
651 refpart.
map(2,3) = R(2,3)*cs + R(4,3)*sn;
652 refpart.
map(2,4) = R(2,4)*cs + R(4,4)*sn;
654 refpart.
map(3,1) = R(3,1)*cs - R(1,1)*sn;
655 refpart.
map(3,2) = R(3,2)*cs - R(1,2)*sn;
656 refpart.
map(3,3) = R(3,3)*cs - R(1,3)*sn;
657 refpart.
map(3,4) = R(3,4)*cs - R(1,4)*sn;
659 refpart.
map(4,1) = R(4,1)*cs - R(2,1)*sn;
660 refpart.
map(4,2) = R(4,2)*cs - R(2,2)*sn;
661 refpart.
map(4,3) = R(4,3)*cs - R(2,3)*sn;
662 refpart.
map(4,4) = R(4,4)*cs - R(2,4)*sn;
670 dv_z = -(1_prt + G) * tau * B0 * bz;
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
#define IMPACTX_PUSH_EXTERN_TEMPLATE(ElementType)
Definition PushAll.H:78
T_ParticleType ParticleType
#define IMPACTX_GPUDATA_EXTERN(ElementType)
Definition dynamicdata.H:169
amrex_particle_real ParticleReal
constexpr T powi(T x) noexcept
__host__ __device__ void ignore_unused(const Ts &...)
SmallMatrix< T, N, 1, Order::F, StartIndex > SmallVector
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:79
@ s
fixed s as the independent variable
Definition ImpactXParticleContainer.H:37
@ 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 amrex::ParticleReal beta_gamma() const
Definition ReferenceParticle.H:168
amrex::ParticleReal pt
energy, normalized by rest energy
Definition ReferenceParticle.H:42
amrex::SmallMatrix< amrex::ParticleReal, 6, 6, amrex::Order::F, 1 > map
linearized map
Definition ReferenceParticle.H:48
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal rigidity_Tm() const
Definition ReferenceParticle.H:261
amrex::SmallMatrix< amrex::ParticleReal, 3, 6, amrex::Order::F, 1 > spin_coupling
linearized spin-orbit coupling matrix
Definition ReferenceParticle.H:49
amrex::ParticleReal gyromagnetic_anomaly
anomalous magnetic moment [unitless]
Definition ReferenceParticle.H:45
amrex::SmallMatrix< amrex::ParticleReal, 3, 1, amrex::Order::F, 1 > spin_rotation_vector
reference spin rotation vector
Definition ReferenceParticle.H:50
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal beta() const
Definition ReferenceParticle.H:152
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal gamma() const
Definition ReferenceParticle.H:140
amrex::ParticleReal t
clock time * c in meters
Definition ReferenceParticle.H:38
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Sol_Bfield(amrex::ParticleReal const zeval) const
Definition SoftSol.H:439
int m_id
number of map integration steps per slice
Definition SoftSol.H:678
int m_mapsteps
unit specification for quad strength
Definition SoftSol.H:677
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void spin_and_phasespace_push(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_Real &AMREX_RESTRICT sx, T_Real &AMREX_RESTRICT sy, T_Real &AMREX_RESTRICT sz, T_IdCpu &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition SoftSol.H:360
void compute_constants(RefPart const &refpart)
Definition SoftSol.H:203
amrex::ParticleReal const * m_sin_d_data
non-owning pointer to device cosine coefficients
Definition SoftSol.H:684
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 SoftSol.H:231
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition SoftSol.H:422
static constexpr auto type
Definition SoftSol.H:125
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:615
SoftSolenoid(amrex::ParticleReal ds, amrex::ParticleReal bscale, std::vector< amrex::ParticleReal > cos_coef, std::vector< amrex::ParticleReal > sin_coef, int unit, amrex::ParticleReal dx=0, amrex::ParticleReal dy=0, amrex::ParticleReal rotation_degree=0, amrex::ParticleReal aperture_x=0, amrex::ParticleReal aperture_y=0, int mapsteps=10, int nslice=1, std::optional< std::string > name=std::nullopt)
Definition SoftSol.H:151
int m_ncoef
unique soft solenoid id used for data lookup map
Definition SoftSol.H:680
ImpactXParticleContainer::ParticleType PType
Definition SoftSol.H:126
void reverse()
Definition SoftSol.H:187
amrex::ParticleReal const * m_sin_h_data
non-owning pointer to host cosine coefficients
Definition SoftSol.H:682
amrex::ParticleReal const * m_cos_h_data
number of Fourier coefficients
Definition SoftSol.H:681
amrex::ParticleReal m_bscale
Definition SoftSol.H:675
mixin::GPUDataRegistry< SolenoidFourierCoefficients > DynamicData
Definition SoftSol.H:128
int m_unit
scaling factor for solenoid Bz field
Definition SoftSol.H:676
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:541
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:490
amrex::ParticleReal const * m_cos_d_data
non-owning pointer to host sine coefficients
Definition SoftSol.H:683
amrex::Vector< amrex::ParticleReal > default_sin_coef
Definition SoftSol.H:95
amrex::Vector< amrex::ParticleReal > default_cos_coef
Definition SoftSol.H:57
mixin::TrackedVector< amrex::ParticleReal > sin
Definition SoftSol.H:111
mixin::TrackedVector< amrex::ParticleReal > cos
Definition SoftSol.H:110
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 dynamicdata.H:54
static std::shared_ptr< SolenoidFourierCoefficients > const & get(int id)
Definition dynamicdata.H:98
static SolenoidFourierCoefficients & emplace(int id, Args &&... args)
Definition dynamicdata.H:125
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
Definition pipeaperture.H:26
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void apply_aperture(T_Real &AMREX_RESTRICT x, T_Real &AMREX_RESTRICT y, T_IdCpu &AMREX_RESTRICT idcpu) const
Definition pipeaperture.H:59
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_x() const
Definition pipeaperture.H:90
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_y() const
Definition pipeaperture.H:101
PipeAperture(amrex::ParticleReal aperture_x, amrex::ParticleReal aperture_y)
Definition pipeaperture.H:32
Definition spintransport.H:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void rotate_spin(T_Real const &AMREX_RESTRICT lambdax, T_Real const &AMREX_RESTRICT lambday, T_Real const &AMREX_RESTRICT lambdaz, T_Real &AMREX_RESTRICT sx, T_Real &AMREX_RESTRICT sy, T_Real &AMREX_RESTRICT sz) const
Definition spintransport.H:48
Thick(amrex::ParticleReal ds, int nslice)
Definition thick.H:30
amrex::ParticleReal m_ds
Definition thick.H:68
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal ds() const
Definition thick.H:53
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int nslice() const
Definition thick.H:43
Definition TrackedVector.H:49