ImpactX
NonlinearLensInvariants.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_INVARIANTS_H
11 #define IMPACTX_INVARIANTS_H
12 
14 
15 #include <AMReX_Extension.H>
16 #include <AMReX_REAL.H>
17 #include <AMReX_GpuComplex.H>
18 
19 #include <cmath>
20 
21 namespace impactx::diagnostics
22 {
30  {
32 
38  struct Data {
39  amrex::ParticleReal H;
40  amrex::ParticleReal I;
41  };
42 
53  amrex::ParticleReal const alpha,
54  amrex::ParticleReal const beta,
55  amrex::ParticleReal const tn,
56  amrex::ParticleReal const cn )
57  : m_alpha(alpha), m_beta(beta), m_tn(tn), m_cn(cn)
58  {
59  }
60 
71  amrex::ParticleReal const x,
72  amrex::ParticleReal const y,
73  amrex::ParticleReal const px,
74  amrex::ParticleReal const py ) const
75  {
76 
77  using namespace amrex::literals; // for _rt and _prt
78 
79  // a complex type with two amrex::ParticleReal
81 
82  // convert transverse phase space coordinates to normalized units
83  amrex::ParticleReal xn = x/(m_cn*sqrt(m_beta));
84  amrex::ParticleReal yn = y/(m_cn*sqrt(m_beta));
85  amrex::ParticleReal pxn = px*sqrt(m_beta)/m_cn + m_alpha*x;
86  amrex::ParticleReal pyn = py*sqrt(m_beta)/m_cn + m_alpha*y;
87 
88  // assign complex position zeta = x + iy
89  Complex zeta(xn, yn);
90  Complex zetaconj(xn, -yn);
91  Complex re1(1.0_prt, 0.0_prt);
92  Complex im1(0.0_prt, 1.0_prt);
93 
94  // compute croot = sqrt(1-zeta**2)
95  Complex croot = amrex::pow(zeta, 2);
96  croot = re1 - croot;
97  croot = amrex::sqrt(croot);
98 
99  // compute carcsin = arcsin(zeta)
100  Complex carcsin = im1*zeta + croot;
101  carcsin = -im1*amrex::log(carcsin);
102 
103  // compute complex potential appearing in H invariant
104  Complex Hpotential = zeta/croot;
105  Hpotential = Hpotential*carcsin;
106 
107  // compute complex potential appearing in I invariant
108  Complex Ipotential = (zeta+zetaconj)/croot;
109  Ipotential = Ipotential*carcsin;
110 
111  // evaluate real parts
112  amrex::ParticleReal Hinv = Hpotential.m_real;
113  amrex::ParticleReal Iinv = Ipotential.m_real;
114 
115  // compute invariants H and I
116  amrex::ParticleReal Jz = xn*pyn - yn*pxn;
117  Hinv = (pow(xn,2) + pow(yn,2) + pow(pxn,2) + pow(pyn,2))/2
118  + m_tn*Hinv;
119  Iinv = pow(Jz,2) + pow(pxn,2) + pow(xn,2) + m_tn*Iinv;
120 
121  return {Hinv, Iinv};
122 
123  }
124 
125  private:
126  amrex::ParticleReal m_alpha;
127  amrex::ParticleReal m_beta;
128  amrex::ParticleReal m_tn;
129  amrex::ParticleReal m_cn;
130 
131  };
132 
133 } // namespace impactx
134 
135 #endif // IMPACTX_INVARIANTS_H
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
fftw_complex Complex
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > log(const GpuComplex< T > &a_z) noexcept
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
Definition: DiagnosticOutput.cpp:24
Definition: NonlinearLensInvariants.H:38
amrex::ParticleReal I
second phase space function ("second invariant")
Definition: NonlinearLensInvariants.H:40
amrex::ParticleReal H
first phase space function (Hamiltonian)
Definition: NonlinearLensInvariants.H:39
Definition: NonlinearLensInvariants.H:30
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Data operator()(amrex::ParticleReal const x, amrex::ParticleReal const y, amrex::ParticleReal const px, amrex::ParticleReal const py) const
Definition: NonlinearLensInvariants.H:70
ImpactXParticleContainer::ParticleType PType
Definition: NonlinearLensInvariants.H:31
amrex::ParticleReal m_beta
Twiss alpha.
Definition: NonlinearLensInvariants.H:127
NonlinearLensInvariants(amrex::ParticleReal const alpha, amrex::ParticleReal const beta, amrex::ParticleReal const tn, amrex::ParticleReal const cn)
Definition: NonlinearLensInvariants.H:52
amrex::ParticleReal m_tn
Twiss beta (m)
Definition: NonlinearLensInvariants.H:128
amrex::ParticleReal m_cn
dimensionless strength of the nonlinear insert
Definition: NonlinearLensInvariants.H:129
amrex::ParticleReal m_alpha
Definition: NonlinearLensInvariants.H:126