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
75  ) const
76  {
77 
78  using namespace amrex::literals; // for _rt and _prt
79 
80  // a complex type with two amrex::ParticleReal
82 
83  // convert transverse phase space coordinates to normalized units
84  amrex::ParticleReal const xn = x/(m_cn*sqrt(m_beta));
85  amrex::ParticleReal const yn = y/(m_cn*sqrt(m_beta));
86  amrex::ParticleReal const pxn = px*sqrt(m_beta)/m_cn + m_alpha*xn;
87  amrex::ParticleReal const pyn = py*sqrt(m_beta)/m_cn + m_alpha*yn;
88 
89  // assign complex position zeta = x + iy
90  Complex const zeta(xn, yn);
91  Complex const zetaconj(xn, -yn);
92  Complex const re1(1.0_prt, 0.0_prt);
93  Complex const im1(0.0_prt, 1.0_prt);
94 
95  // compute croot = sqrt(1-zeta**2)
96  Complex croot = amrex::pow(zeta, 2);
97  croot = re1 - croot;
98  croot = amrex::sqrt(croot);
99 
100  // compute carcsin = arcsin(zeta)
101  Complex carcsin = im1*zeta + croot;
102  carcsin = -im1*amrex::log(carcsin);
103 
104  // compute complex potential appearing in H invariant
105  Complex Hpotential = zeta/croot;
106  Hpotential = Hpotential*carcsin;
107 
108  // compute complex potential appearing in I invariant
109  Complex Ipotential = (zeta+zetaconj)/croot;
110  Ipotential = Ipotential*carcsin;
111 
112  // evaluate real parts
113  amrex::ParticleReal Hinv = Hpotential.m_real;
114  amrex::ParticleReal Iinv = Ipotential.m_real;
115 
116  // compute invariants H and I
117  amrex::ParticleReal const Jz = xn*pyn - yn*pxn;
118  Hinv = (pow(xn,2) + pow(yn,2) + pow(pxn,2) + pow(pyn,2))/2
119  + m_tn*Hinv;
120  Iinv = pow(Jz,2) + pow(pxn,2) + pow(xn,2) + m_tn*Iinv;
121 
122  return {Hinv, Iinv};
123 
124  }
125 
126  private:
127  amrex::ParticleReal m_alpha;
128  amrex::ParticleReal m_beta;
129  amrex::ParticleReal m_tn;
130  amrex::ParticleReal m_cn;
131 
132  };
133 
134 } // namespace impactx
135 
136 #endif // IMPACTX_INVARIANTS_H
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
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:26
beta
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:128
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:129
amrex::ParticleReal m_cn
dimensionless strength of the nonlinear insert
Definition: NonlinearLensInvariants.H:130
amrex::ParticleReal m_alpha
Definition: NonlinearLensInvariants.H:127