ImpactX
Loading...
Searching...
No Matches
ToFixedT.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_T_H
11#define IMPACTX_TO_FIXED_T_H
12
14
15#include <AMReX_GpuQualifiers.H>
16#include <AMReX_Math.H>
17#include <AMReX_REAL.H>
18
19#include <cmath>
20
21
23{
24 struct ToFixedT
25 {
27
35 ToFixedT (amrex::ParticleReal const ptd)
36 : m_ptd(ptd)
37 {
38 }
39
52 amrex::ParticleReal & x,
53 amrex::ParticleReal & y,
54 amrex::ParticleReal & t,
55 amrex::ParticleReal & px,
56 amrex::ParticleReal & py,
57 amrex::ParticleReal & pt) const
58 {
59 using namespace amrex::literals;
61
62 // small tolerance to avoid NaN for pz<0:
63 constexpr amrex::ParticleReal tol = 1.0e-8_prt;
64
65 // compute value of reference pzd = beta*gamma
66 amrex::ParticleReal const argd = -1.0_prt + powi<2>(m_ptd);
67 // AMREX_ASSERT_WITH_MESSAGE(argd > 0.0_prt, "invalid pzd arg (<=0)");
68 amrex::ParticleReal const pzdf = argd > 0.0_prt ? std::sqrt(argd) : tol;
69
70 // transform momenta to dynamic units (eg, so that momenta are
71 // normalized by mc):
72 px = px * pzdf;
73 py = py * pzdf;
74 pt = pt * pzdf;
75
76 // compute value of particle pz = beta*gamma
77 amrex::ParticleReal const arg = -1.0_prt + powi<2>(m_ptd+pt) - powi<2>(px) - powi<2>(py);
78 // AMREX_ASSERT_WITH_MESSAGE(arg > 0.0_prt, "invalid pz arg (<=0)");
79 amrex::ParticleReal const pzf = arg > 0.0_prt ? std::sqrt(arg) : tol;
80
81 // transform position and momentum (from fixed s to fixed t)
82 x = x + px*t/(m_ptd+pt);
83 // px = px;
84 y = y + py*t/(m_ptd+pt);
85 // py = py;
86 auto & z = t; // We store z in the same memory slot as t.
87 z = pzf * t / (m_ptd + pt);
88 auto & pz = pt; // We store pz in the same memory slot as pt.
89 pz = pzf - pzdf;
90
91 // transform momenta to static units (eg, so that momenta are
92 // normalized by pzdf):
93 px = px / pzdf;
94 py = py / pzdf;
95 pz = pz / pzdf;
96 }
97
98 private:
99 amrex::ParticleReal m_ptd;
100 };
101
102} // namespace impactx::transformation
103
104#endif // IMPACTX_TO_FIXED_T_H
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
constexpr T powi(T x) noexcept
Definition CoordinateTransformation.cpp:24
@ t
fixed t as the independent variable
Definition ImpactXParticleContainer.H:38
ToFixedT(amrex::ParticleReal const ptd)
Definition ToFixedT.H:35
amrex::ParticleReal m_ptd
Design value of pt/mc2 = -gamma.
Definition ToFixedT.H:99
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(amrex::ParticleReal &x, amrex::ParticleReal &y, amrex::ParticleReal &t, amrex::ParticleReal &px, amrex::ParticleReal &py, amrex::ParticleReal &pt) const
Definition ToFixedT.H:51
ImpactXParticleContainer::ParticleType PType
Definition ToFixedT.H:26