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,
124 static constexpr auto type =
"SoftSolenoid";
153 std::vector<amrex::ParticleReal> cos_coef,
154 std::vector<amrex::ParticleReal> sin_coef,
163 std::optional<std::string>
name = std::nullopt
172 m_ncoef = int(cos_coef.size());
173 if (
m_ncoef !=
int(sin_coef.size()))
174 throw std::runtime_error(
"SoftSolenoid: cos and sin coefficients must have same length!");
193 using BeamOptic::operator();
206 Alignment::compute_constants(refpart);
228 template<
typename T_Real=amrex::ParticleReal,
typename T_IdCpu=u
int64_t>
257 auto const out = R *
v;
296 refpart.map =
decltype(refpart.map)::Identity();
322 refpart.x = x + slice_ds*px/bgi;
323 refpart.y = y + slice_ds*py/bgi;
324 refpart.z = z + slice_ds*pz/bgi;
330 refpart.px = px*bgf/bgi;
331 refpart.py = py*bgf/bgi;
332 refpart.pz = pz*bgf/bgi;
335 refpart.s =
s + slice_ds;
339 using LinearTransport::operator();
363 std::tuple<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
371#if AMREX_DEVICE_COMPILE
390 if (std::abs(z) <= zmid)
392 bfield = 0.5_prt*cos_data[0];
393 bfieldint = z*bfield;
394 for (
int j=1; j <
m_ncoef; ++j)
396 bfield = bfield + cos_data[j] * std::cos(j*2*pi*z/zlen) +
397 sin_data[j] * std::sin(j*2*pi*z/zlen);
398 bfieldp = bfieldp-j*2*pi*cos_data[j] * std::sin(j*2*pi*z/zlen)/zlen +
399 j*2*pi*sin_data[j] * std::cos(j*2*pi*z/zlen)/zlen;
400 bfieldint = bfieldint + zlen*cos_data[j] * std::sin(j*2*pi*z/zlen)/(j*2*pi) -
401 zlen*sin_data[j] * std::cos(j*2*pi*z/zlen)/(j*2*pi);
404 return std::make_tuple(bfield, bfieldp, bfieldint);
429 refpart.
t =
t + tau/std::sqrt(1.0_prt - powi<-2>(pt));
443 refpart.
map(1,1) = R(1,1) + tau*R(2,1);
444 refpart.
map(1,2) = R(1,2) + tau*R(2,2);
445 refpart.
map(1,3) = R(1,3) + tau*R(2,3);
446 refpart.
map(1,4) = R(1,4) + tau*R(2,4);
448 refpart.
map(3,1) = R(3,1) + tau*R(4,1);
449 refpart.
map(3,2) = R(3,2) + tau*R(4,2);
450 refpart.
map(3,3) = R(3,3) + tau*R(4,3);
451 refpart.
map(3,4) = R(3,4) + tau*R(4,4);
453 refpart.
map(5,5) = R(5,5) + tau*R(6,5)/powi<2>(betgam);
454 refpart.
map(5,6) = R(5,6) + tau*R(6,6)/powi<2>(betgam);
495 refpart.
map(2,1) = R(2,1) - tau*alpha2*R(1,1);
496 refpart.
map(2,2) = R(2,2) - tau*alpha2*R(1,2);
497 refpart.
map(2,3) = R(2,3) - tau*alpha2*R(1,3);
498 refpart.
map(2,4) = R(2,4) - tau*alpha2*R(1,4);
500 refpart.
map(4,1) = R(4,1) - tau*alpha2*R(3,1);
501 refpart.
map(4,2) = R(4,2) - tau*alpha2*R(3,2);
502 refpart.
map(4,3) = R(4,3) - tau*alpha2*R(3,3);
503 refpart.
map(4,4) = R(4,4) - tau*alpha2*R(3,4);
545 refpart.
map(1,1) = R(1,1)*cs + R(3,1)*sn;
546 refpart.
map(1,2) = R(1,2)*cs + R(3,2)*sn;
547 refpart.
map(1,3) = R(1,3)*cs + R(3,3)*sn;
548 refpart.
map(1,4) = R(1,4)*cs + R(3,4)*sn;
550 refpart.
map(2,1) = R(2,1)*cs + R(4,1)*sn;
551 refpart.
map(2,2) = R(2,2)*cs + R(4,2)*sn;
552 refpart.
map(2,3) = R(2,3)*cs + R(4,3)*sn;
553 refpart.
map(2,4) = R(2,4)*cs + R(4,4)*sn;
555 refpart.
map(3,1) = R(3,1)*cs - R(1,1)*sn;
556 refpart.
map(3,2) = R(3,2)*cs - R(1,2)*sn;
557 refpart.
map(3,3) = R(3,3)*cs - R(1,3)*sn;
558 refpart.
map(3,4) = R(3,4)*cs - R(1,4)*sn;
560 refpart.
map(4,1) = R(4,1)*cs - R(2,1)*sn;
561 refpart.
map(4,2) = R(4,2)*cs - R(2,2)*sn;
562 refpart.
map(4,3) = R(4,3)*cs - R(2,3)*sn;
563 refpart.
map(4,4) = R(4,4)*cs - R(2,4)*sn;
#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:130
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:166
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:259
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:365
int m_id
number of map integration steps per slice
Definition SoftSol.H:570
int m_mapsteps
unit specification for quad strength
Definition SoftSol.H:569
void compute_constants(RefPart const &refpart)
Definition SoftSol.H:202
amrex::ParticleReal const * m_sin_d_data
non-owning pointer to device cosine coefficients
Definition SoftSol.H:576
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:230
AMREX_GPU_HOST AMREX_FORCE_INLINE Map6x6 transport_map(RefPart const &AMREX_RESTRICT refpart) const
Definition SoftSol.H:348
static constexpr auto type
Definition SoftSol.H:124
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map3(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:516
int m_ncoef
unique soft solenoid id used for data lookup map
Definition SoftSol.H:572
ImpactXParticleContainer::ParticleType PType
Definition SoftSol.H:125
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=1, int nslice=1, std::optional< std::string > name=std::nullopt)
Definition SoftSol.H:150
void reverse()
Definition SoftSol.H:186
amrex::ParticleReal const * m_sin_h_data
non-owning pointer to host cosine coefficients
Definition SoftSol.H:574
amrex::ParticleReal const * m_cos_h_data
number of Fourier coefficients
Definition SoftSol.H:573
amrex::ParticleReal m_bscale
Definition SoftSol.H:567
mixin::GPUDataRegistry< SolenoidFourierCoefficients > DynamicData
Definition SoftSol.H:127
int m_unit
scaling factor for solenoid Bz field
Definition SoftSol.H:568
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map2(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:467
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void map1(amrex::ParticleReal const tau, RefPart &refpart, amrex::ParticleReal &zeval) const
Definition SoftSol.H:416
amrex::ParticleReal const * m_cos_d_data
non-owning pointer to host sine coefficients
Definition SoftSol.H:575
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:50
static std::shared_ptr< SolenoidFourierCoefficients > const & get(int id)
Definition dynamicdata.H:73
static SolenoidFourierCoefficients & emplace(int id, Args &&... args)
Definition dynamicdata.H:100
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
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