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>
255 auto const out = R *
v;
318 refpart.x = x + slice_ds*px/bgi;
319 refpart.y = y + slice_ds*py/bgi;
320 refpart.z = z + slice_ds*pz/bgi;
326 refpart.px = px*bgf/bgi;
327 refpart.py = py*bgf/bgi;
328 refpart.pz = pz*bgf/bgi;
331 refpart.s =
s + slice_ds;
349 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
368 T_Real lambdax = 0_prt;
369 T_Real lambday = 0_prt;
370 T_Real lambdaz = 0_prt;
379 auto const out = A *
v;
399 (*this)(x, y,
t, px, py, pt, idcpu, refpart);
404 using LinearTransport::operator();
429 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
437#if AMREX_DEVICE_COMPILE
456 if (std::abs(z) <= zmid)
458 bfield = 0.5_prt*cos_data[0];
459 bfieldint = z*bfield;
460 for (
int j=1; j <
m_ncoef; ++j)
462 bfield = bfield + cos_data[j] * std::cos(j*2*pi*z/zlen) +
463 sin_data[j] * std::sin(j*2*pi*z/zlen);
464 bfieldp = bfieldp-j*2*pi*cos_data[j] * std::sin(j*2*pi*z/zlen)/zlen +
465 j*2*pi*sin_data[j] * std::cos(j*2*pi*z/zlen)/zlen;
466 bfieldint = bfieldint + zlen*cos_data[j] * std::sin(j*2*pi*z/zlen)/(j*2*pi) -
467 zlen*sin_data[j] * std::cos(j*2*pi*z/zlen)/(j*2*pi);
470 return std::make_tuple(bfield, bfieldp, bfieldint);
495 refpart.
t =
t + tau/std::sqrt(1.0_prt - powi<-2>(pt));
509 m_map(1,1) = R(1,1) + tau*R(2,1);
510 m_map(1,2) = R(1,2) + tau*R(2,2);
511 m_map(1,3) = R(1,3) + tau*R(2,3);
512 m_map(1,4) = R(1,4) + tau*R(2,4);
514 m_map(3,1) = R(3,1) + tau*R(4,1);
515 m_map(3,2) = R(3,2) + tau*R(4,2);
516 m_map(3,3) = R(3,3) + tau*R(4,3);
517 m_map(3,4) = R(3,4) + tau*R(4,4);
519 m_map(5,5) = R(5,5) + tau*R(6,5)/powi<2>(betgam);
520 m_map(5,6) = R(5,6) + tau*R(6,6)/powi<2>(betgam);
561 m_map(2,1) = R(2,1) - tau*alpha2*R(1,1);
562 m_map(2,2) = R(2,2) - tau*alpha2*R(1,2);
563 m_map(2,3) = R(2,3) - tau*alpha2*R(1,3);
564 m_map(2,4) = R(2,4) - tau*alpha2*R(1,4);
566 m_map(4,1) = R(4,1) - tau*alpha2*R(3,1);
567 m_map(4,2) = R(4,2) - tau*alpha2*R(3,2);
568 m_map(4,3) = R(4,3) - tau*alpha2*R(3,3);
569 m_map(4,4) = R(4,4) - tau*alpha2*R(3,4);
583 dA(1,1) = Gfactor * tau * alpha2 * (-2_prt*sn + tau*cs*alpha);
584 dA(1,2) = 2_prt * Gfactor * tau * alpha * cs;
585 dA(1,3) = Gfactor * tau * alpha2 * (2_prt*cs + tau*sn*alpha);
586 dA(1,4) = 2_prt * Gfactor * tau * alpha * sn;
587 dA(2,1) = -Gfactor * tau * alpha2 * (2_prt*cs + tau*sn*alpha);
588 dA(2,2) = -2_prt * Gfactor * tau * alpha * sn;
589 dA(2,3) = Gfactor * tau * alpha2 * (-2_prt*sn + tau*cs*alpha);
590 dA(2,4) = 2_prt * Gfactor * tau * cs * alpha;
591 dA(3,6) = -2_prt *(1_prt + G) * tau * alpha/beta;
636 m_map(1,1) = R(1,1)*cs + R(3,1)*sn;
637 m_map(1,2) = R(1,2)*cs + R(3,2)*sn;
638 m_map(1,3) = R(1,3)*cs + R(3,3)*sn;
639 m_map(1,4) = R(1,4)*cs + R(3,4)*sn;
641 m_map(2,1) = R(2,1)*cs + R(4,1)*sn;
642 m_map(2,2) = R(2,2)*cs + R(4,2)*sn;
643 m_map(2,3) = R(2,3)*cs + R(4,3)*sn;
644 m_map(2,4) = R(2,4)*cs + R(4,4)*sn;
646 m_map(3,1) = R(3,1)*cs - R(1,1)*sn;
647 m_map(3,2) = R(3,2)*cs - R(1,2)*sn;
648 m_map(3,3) = R(3,3)*cs - R(1,3)*sn;
649 m_map(3,4) = R(3,4)*cs - R(1,4)*sn;
651 m_map(4,1) = R(4,1)*cs - R(2,1)*sn;
652 m_map(4,2) = R(4,2)*cs - R(2,2)*sn;
653 m_map(4,3) = R(4,3)*cs - R(2,3)*sn;
654 m_map(4,4) = R(4,4)*cs - R(2,4)*sn;
662 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:82
@ 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:167
amrex::ParticleReal pt
energy, normalized by rest energy
Definition ReferenceParticle.H:42
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal rigidity_Tm() const
Definition ReferenceParticle.H:260
amrex::ParticleReal gyromagnetic_anomaly
anomalous magnetic moment [unitless]
Definition ReferenceParticle.H:45
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal beta() const
Definition ReferenceParticle.H:151
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal gamma() const
Definition ReferenceParticle.H:139
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:431
int m_id
number of map integration steps per slice
Definition SoftSol.H:670
int m_mapsteps
unit specification for quad strength
Definition SoftSol.H:669
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:676
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition SoftSol.H:413
static constexpr auto type
Definition SoftSol.H:125
amrex::SmallMatrix< amrex::ParticleReal, 3, 6, amrex::Order::F, 1 > m_spin_coupling
linearized map
Definition SoftSol.H:684
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:607
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
amrex::SmallMatrix< amrex::ParticleReal, 6, 6, amrex::Order::F, 1 > m_map
non-owning pointer to device sine coefficients
Definition SoftSol.H:683
int m_ncoef
unique soft solenoid id used for data lookup map
Definition SoftSol.H:672
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:674
amrex::ParticleReal const * m_cos_h_data
number of Fourier coefficients
Definition SoftSol.H:673
amrex::ParticleReal m_bscale
Definition SoftSol.H:667
mixin::GPUDataRegistry< SolenoidFourierCoefficients > DynamicData
Definition SoftSol.H:128
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 const &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition SoftSol.H:351
int m_unit
scaling factor for solenoid Bz field
Definition SoftSol.H:668
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:533
amrex::SmallMatrix< amrex::ParticleReal, 3, 1, amrex::Order::F, 1 > m_spin_rotation_vector
linearized spin-orbit coupling matrix
Definition SoftSol.H:685
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:482
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 const &AMREX_RESTRICT idcpu, RefPart const &AMREX_RESTRICT refpart) const
Definition SoftSol.H:231
amrex::ParticleReal const * m_cos_d_data
non-owning pointer to host sine coefficients
Definition SoftSol.H:675
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:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dy() const
Definition alignment.H:189
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal dx() const
Definition alignment.H:179
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 rotate_aligned_map(Map6x6 const &R) const
Definition alignment.H:263
Alignment(amrex::ParticleReal dx, amrex::ParticleReal dy, amrex::ParticleReal rotation_degree)
Definition alignment.H:39
Definition beamoptic.H:529
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 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