10#ifndef IMPACTX_SOFTSOL_H
11#define IMPACTX_SOFTSOL_H
62 4.409581845710694E-002,
63 -9.416427163897508E-006,
64 -2.459452716865687E-002,
65 -3.272762575737291E-002,
66 -2.936414401076162E-002,
67 -1.995780078926890E-002,
68 -9.102893342953847E-003,
69 -2.456410658713271E-006,
70 5.788233017324325E-003,
71 8.040408292420691E-003,
72 7.480064552867431E-003,
73 5.230254569468851E-003,
74 2.447614547094685E-003,
75 -1.095525090532255E-006,
76 -1.614586867387170E-003,
77 -2.281365457438345E-003,
78 -2.148709081338292E-003,
79 -1.522541739363011E-003,
80 -7.185505862719508E-004,
81 -6.171194824600157E-007,
82 4.842109305036943E-004,
83 6.874508102002901E-004,
84 6.535550288205728E-004,
85 4.648795813759210E-004,
86 2.216564722797528E-004,
87 -4.100982995210341E-007,
88 -1.499332112463395E-004,
89 -2.151538438342482E-004,
90 -2.044590946652016E-004,
91 -1.468242784844341E-004
95 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
124 static constexpr auto type =
"SoftSolenoid";
156 std::vector<amrex::ParticleReal> cos_coef,
157 std::vector<amrex::ParticleReal> sin_coef,
175 m_ncoef = int(cos_coef.size());
176 if (
m_ncoef !=
int(sin_coef.size()))
177 throw std::runtime_error(
"SoftSolenoid: cos and sin coefficients must have same length!");
196 using BeamOptic::operator();
209 Alignment::compute_constants(refpart);
231 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
257 auto const out = R *
v;
320 refpart.x = x + slice_ds*px/bgi;
321 refpart.y = y + slice_ds*py/bgi;
322 refpart.z = z + slice_ds*pz/bgi;
328 refpart.px = px*bgf/bgi;
329 refpart.py = py*bgf/bgi;
330 refpart.pz = pz*bgf/bgi;
333 refpart.s =
s + slice_ds;
350 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
369 T_Real lambdax = 0_prt;
370 T_Real lambday = 0_prt;
371 T_Real lambdaz = 0_prt;
380 auto const out = A *
v;
400 (*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
static constexpr int DEFAULT_unit
Definition SoftSol.H:129
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:205
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:124
static constexpr int DEFAULT_mapsteps
Definition SoftSol.H:130
SoftSolenoid(amrex::ParticleReal ds, amrex::ParticleReal bscale, std::vector< amrex::ParticleReal > cos_coef, std::vector< amrex::ParticleReal > sin_coef, int unit=DEFAULT_unit, amrex::ParticleReal dx=DEFAULT_dx, amrex::ParticleReal dy=DEFAULT_dy, amrex::ParticleReal rotation_degree=DEFAULT_rotation_degree, amrex::ParticleReal aperture_x=DEFAULT_aperture_x, amrex::ParticleReal aperture_y=DEFAULT_aperture_y, int mapsteps=DEFAULT_mapsteps, int nslice=DEFAULT_nslice, std::optional< std::string > name=DEFAULT_name)
Definition SoftSol.H:153
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
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:125
void reverse()
Definition SoftSol.H:189
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:127
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:352
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:233
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:94
amrex::Vector< amrex::ParticleReal > default_cos_coef
Definition SoftSol.H:56
amrex::Gpu::TrackedVector< amrex::ParticleReal > sin
Definition SoftSol.H:110
amrex::Gpu::TrackedVector< amrex::ParticleReal > cos
Definition SoftSol.H:109
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 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
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
Definition pipeaperture.H:26
static constexpr amrex::ParticleReal DEFAULT_aperture_x
Definition pipeaperture.H:27
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_x() const
Definition pipeaperture.H:93
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_y() const
Definition pipeaperture.H:104
static constexpr amrex::ParticleReal DEFAULT_aperture_y
Definition pipeaperture.H:28
PipeAperture(amrex::ParticleReal aperture_x, amrex::ParticleReal aperture_y)
Definition pipeaperture.H:35
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
static constexpr int DEFAULT_nslice
Definition thick.H:25
Thick(amrex::ParticleReal ds, int nslice)
Definition thick.H:32
amrex::ParticleReal m_ds
Definition thick.H:70
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal ds() const
Definition thick.H:55
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int nslice() const
Definition thick.H:45