ImpactX
ToFixedS.H
Go to the documentation of this file.
1 /* Copyright 2022-2023 The Regents of the University of California, through Lawrence
2  * Berkeley National Laboratory (subject to receipt of any required
3  * approvals from the U.S. Dept. of Energy). All rights reserved.
4  *
5  * This file is part of ImpactX.
6  *
7  * Authors: Chad Mitchell, Axel Huebl
8  * License: BSD-3-Clause-LBNL
9  */
10 #ifndef IMPACTX_TO_FIXED_S_H
11 #define IMPACTX_TO_FIXED_S_H
12 
14 
15 #include <AMReX_GpuQualifiers.H>
16 #include <AMReX_Math.H>
17 #include <AMReX_REAL.H>
18 
19 #include <cmath>
20 
21 
22 namespace impactx
23 {
24 namespace transformation
25 {
26  struct ToFixedS
27  {
29 
37  ToFixedS( amrex::ParticleReal const pzd )
38  : m_pzd(pzd)
39  {
40  }
41 
52  PType& p,
53  amrex::ParticleReal & px,
54  amrex::ParticleReal & py,
55  amrex::ParticleReal & pt) const
56  {
57  using namespace amrex::literals;
58 
59  // access AoS data such as positions and cpu/id
60  amrex::ParticleReal const x = p.pos(0);
61  amrex::ParticleReal const y = p.pos(1);
62  amrex::ParticleReal const t = p.pos(2);
63 
64  // compute value of reference ptd = -gamma
65  amrex::ParticleReal const argd = 1.0_prt + pow(m_pzd, 2);
66  AMREX_ASSERT_WITH_MESSAGE(argd > 0.0_prt, "invalid ptd arg (<=0)");
67  amrex::ParticleReal const ptdf = argd > 0.0_prt ? -sqrt(argd) : -1.0_prt;
68 
69  // transform momenta to dynamic units (e.g., so that momenta are
70  // normalized by mc):
71  px = px*m_pzd;
72  py = py*m_pzd;
73  pt = pt*m_pzd;
74 
75  // compute value of particle pt = -gamma
76  amrex::ParticleReal const arg = 1.0_prt + pow(m_pzd+pt, 2) + pow(px, 2) + pow(py, 2);
77  AMREX_ASSERT_WITH_MESSAGE(arg > 0.0_prt, "invalid pt arg (<=0)");
78  amrex::ParticleReal const ptf = arg > 0.0_prt ? -sqrt(arg) : -1.0_prt;
79 
80  // transform position and momentum (from fixed t to fixed s)
81 
82  p.pos(0) = x - px*t/(m_pzd+pt);
83  // px = px;
84  p.pos(1) = y - py*t/(m_pzd+pt);
85  // py = py;
86  p.pos(2) = ptf*t/(m_pzd+pt); // This now represents t.
87  pt = ptf - ptdf; // This now represents pt.
88 
89  // transform momenta to static units (eg, so that momenta are
90  // normalized by pzd):
91  px = px/m_pzd;
92  py = py/m_pzd;
93  pt = pt/m_pzd;
94 
95  }
96 
97  private:
98  amrex::ParticleReal m_pzd;
99  };
100 
101 } // namespace transformation
102 } // namespace impactx
103 
104 #endif // IMPACTX_TO_FIXED_S_H
Definition: ImpactX.cpp:31
Definition: ToFixedS.H:26
amrex::ParticleReal m_pzd
Definition: ToFixedS.H:98
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T arg(const GpuComplex< T > &a_z) noexcept
#define AMREX_ASSERT_WITH_MESSAGE(EX, MSG)
ToFixedS(amrex::ParticleReal const pzd)
Definition: ToFixedS.H:37
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(PType &p, amrex::ParticleReal &px, amrex::ParticleReal &py, amrex::ParticleReal &pt) const
Definition: ToFixedS.H:51
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > pow(const GpuComplex< T > &a_z, const T &a_y) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept