WarpX
BackTransformParticleFunctor.H
Go to the documentation of this file.
1 /* Copyright 2021 Revathi Jambunathan
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_BACKTRANSFORMPARTICLEFUNCTOR_H_
8 #define WARPX_BACKTRANSFORMPARTICLEFUNCTOR_H_
9 
12 
13 #include <AMReX.H>
14 #include <AMReX_AmrParticles.H>
15 
16 
17 
18 
23 {
25 
35  SelectParticles( const WarpXParIter& a_pti, TmpParticles& tmp_particle_data,
36  amrex::Real current_z_boost, amrex::Real old_z_boost,
37  int a_offset = 0);
38 
49  template <typename SrcData>
51  int operator() (const SrcData& src, int i) const noexcept
52  {
54  amrex::ParticleReal xp, yp, zp;
55  m_get_position(i, xp, yp, zp);
56  int Flag = 0;
57  if ( ( (zp >= m_current_z_boost) && (zpold[i] <= m_old_z_boost) ) ||
58  ( (zp <= m_current_z_boost) && (zpold[i] >= m_old_z_boost) ))
59  { Flag = 1;
60  }
61  return Flag;
62  }
63 
67  amrex::Real m_current_z_boost;
69  amrex::Real m_old_z_boost;
71  amrex::ParticleReal* AMREX_RESTRICT zpold = nullptr;
72 };
73 
78 {
79 
81 
92  LorentzTransformParticles ( const WarpXParIter& a_pti, TmpParticles& tmp_particle_data,
93  amrex::Real t_boost, amrex::Real dt,
94  amrex::Real t_lab, int a_offset = 0);
95 
105  template <typename DstData, typename SrcData>
107  void operator () (const DstData& dst, const SrcData& src, int i_src, int i_dst) const noexcept
108  {
110  using namespace amrex::literals;
111  // get current src position
112  amrex::ParticleReal xpnew, ypnew, zpnew;
113  m_get_position(i_src, xpnew, ypnew, zpnew);
114  const amrex::Real gamma_new_p = std::sqrt(1.0_rt + m_inv_c2*
115  ( m_uxpnew[i_src] * m_uxpnew[i_src]
116  + m_uypnew[i_src] * m_uypnew[i_src]
117  + m_uzpnew[i_src] * m_uzpnew[i_src]));
118  const amrex::Real gamma_old_p = std::sqrt(1.0_rt + m_inv_c2*
119  ( m_uxpold[i_src] * m_uxpold[i_src]
120  + m_uypold[i_src] * m_uypold[i_src]
121  + m_uzpold[i_src] * m_uzpold[i_src]));
122  const amrex::Real t_new_p = m_gammaboost * m_t_boost - m_uzfrm * zpnew * m_inv_c2;
123  const amrex::Real z_new_p = m_gammaboost* ( zpnew + m_betaboost * m_Phys_c * m_t_boost);
124  const amrex::Real uz_new_p = m_gammaboost * m_uzpnew[i_src] - gamma_new_p * m_uzfrm;
125  const amrex::Real t_old_p = m_gammaboost * (m_t_boost - m_dt)
126  - m_uzfrm * m_zpold[i_src] * m_inv_c2;
127  const amrex::Real z_old_p = m_gammaboost * ( m_zpold[i_src] + m_betaboost
128  * m_Phys_c * (m_t_boost - m_dt ) );
129  const amrex::Real uz_old_p = m_gammaboost * m_uzpold[i_src] - gamma_old_p * m_uzfrm;
130  // interpolate in time to t_lab
131  const amrex::Real weight_old = (t_new_p - m_t_lab)
132  / (t_new_p - t_old_p);
133  const amrex::Real weight_new = (m_t_lab - t_old_p)
134  / (t_new_p - t_old_p);
135  // weighted sum of old and new values
136  const amrex::ParticleReal xp = m_xpold[i_src] * weight_old + xpnew * weight_new;
137  const amrex::ParticleReal yp = m_ypold[i_src] * weight_old + ypnew * weight_new;
138  const amrex::ParticleReal zp = z_old_p * weight_old + z_new_p * weight_new;
139  const amrex::ParticleReal uxp = m_uxpold[i_src] * weight_old
140  + m_uxpnew[i_src] * weight_new;
141  const amrex::ParticleReal uyp = m_uypold[i_src] * weight_old
142  + m_uypnew[i_src] * weight_new;
143  const amrex::ParticleReal uzp = uz_old_p * weight_old
144  + uz_new_p * weight_new;
145 #if defined (WARPX_DIM_3D)
146  dst.m_rdata[PIdx::x][i_dst] = xp;
147  dst.m_rdata[PIdx::y][i_dst] = yp;
148  dst.m_rdata[PIdx::z][i_dst] = zp;
149 #elif defined (WARPX_DIM_RZ)
150  dst.m_rdata[PIdx::x][i_dst] = std::sqrt(xp*xp + yp*yp);
151  dst.m_rdata[PIdx::z][i_dst] = zp;
152  dst.m_rdata[PIdx::theta][i_dst] = std::atan2(yp, xp);
153 #elif defined (WARPX_DIM_XZ)
154  dst.m_rdata[PIdx::x][i_dst] = xp;
155  dst.m_rdata[PIdx::z][i_dst] = zp;
157 #elif defined (WARPX_DIM_1D_Z)
158  dst.m_rdata[PIdx::z][i_dst] = zp;
159  amrex::ignore_unused(xp, yp);
160 #else
161  amrex::ignore_unused(xp, yp, zp);
162 #endif
163  dst.m_rdata[PIdx::w][i_dst] = m_wpnew[i_src];
164  dst.m_rdata[PIdx::ux][i_dst] = uxp;
165  dst.m_rdata[PIdx::uy][i_dst] = uyp;
166  dst.m_rdata[PIdx::uz][i_dst] = uzp;
167  }
168 
170 
171  amrex::ParticleReal* AMREX_RESTRICT m_xpold = nullptr;
172  amrex::ParticleReal* AMREX_RESTRICT m_ypold = nullptr;
173  amrex::ParticleReal* AMREX_RESTRICT m_zpold = nullptr;
174 
175  amrex::ParticleReal* AMREX_RESTRICT m_uxpold = nullptr;
176  amrex::ParticleReal* AMREX_RESTRICT m_uypold = nullptr;
177  amrex::ParticleReal* AMREX_RESTRICT m_uzpold = nullptr;
178 
179  const amrex::ParticleReal* AMREX_RESTRICT m_uxpnew = nullptr;
180  const amrex::ParticleReal* AMREX_RESTRICT m_uypnew = nullptr;
181  const amrex::ParticleReal* AMREX_RESTRICT m_uzpnew = nullptr;
182  const amrex::ParticleReal* AMREX_RESTRICT m_wpnew = nullptr;
183 
184  amrex::Real m_gammaboost;
185  amrex::Real m_betaboost;
186  amrex::Real m_Phys_c;
187  amrex::Real m_uzfrm;
188  amrex::Real m_inv_c2;
189  amrex::Real m_t_boost;
190  amrex::Real m_dt;
191  amrex::Real m_t_lab;
192 };
193 
199 {
200 public:
201  BackTransformParticleFunctor(WarpXParticleContainer *pc_src, std::string species_name, int num_buffers);
203  void operator () (PinnedMemoryParticleContainer& pc_dst, int &TotalParticleCounter, int i_buffer) const override;
204  void InitData() override;
218  void PrepareFunctorData ( int i_buffer, bool z_slice_in_domain, amrex::Real old_z_boost,
219  amrex::Real current_z_boost, amrex::Real t_lab,
220  int snapshot_full) override;
221 private:
223  WarpXParticleContainer* m_pc_src = nullptr;
225  std::string m_species_name;
239 };
240 
241 
242 
243 
244 #endif //
#define AMREX_RESTRICT
#define AMREX_GPU_HOST_DEVICE
BackTransform functor to select particles and Lorentz Transform them and store in particle buffers.
Definition: BackTransformParticleFunctor.H:199
std::string m_species_name
Definition: BackTransformParticleFunctor.H:225
amrex::Vector< amrex::Real > m_t_lab
Definition: BackTransformParticleFunctor.H:233
amrex::Vector< int > m_perform_backtransform
Definition: BackTransformParticleFunctor.H:238
int m_num_buffers
Definition: BackTransformParticleFunctor.H:227
amrex::Vector< amrex::Real > m_current_z_boost
Definition: BackTransformParticleFunctor.H:229
amrex::Vector< amrex::Real > m_old_z_boost
Definition: BackTransformParticleFunctor.H:231
Functor to compute a diagnostic and store the result in existing ParticleContainer.
Definition: ComputeParticleDiagFunctor.H:19
Definition: NamedComponentParticleContainer.H:64
Definition: WarpXParticleContainer.H:53
Definition: WarpXParticleContainer.H:111
amrex::Vector< std::map< PairIndex, TmpParticleTile > > TmpParticles
Definition: WarpXParticleContainer.H:500
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
i
Definition: check_interp_points_and_weights.py:174
float dt
Definition: stencil.py:442
Transform functor to Lorentz-transform particles and obtain lab-frame data.
Definition: BackTransformParticleFunctor.H:78
amrex::Real m_betaboost
Definition: BackTransformParticleFunctor.H:185
amrex::Real m_dt
Definition: BackTransformParticleFunctor.H:190
amrex::Real m_t_boost
Definition: BackTransformParticleFunctor.H:189
amrex::Real m_inv_c2
Definition: BackTransformParticleFunctor.H:188
const amrex::ParticleReal *AMREX_RESTRICT m_wpnew
Definition: BackTransformParticleFunctor.H:182
amrex::Real m_gammaboost
Definition: BackTransformParticleFunctor.H:184
amrex::ParticleReal *AMREX_RESTRICT m_uzpold
Definition: BackTransformParticleFunctor.H:177
AMREX_GPU_HOST_DEVICE void operator()(const DstData &dst, const SrcData &src, int i_src, int i_dst) const noexcept
Functor call. This method computes the Lorentz-transform for particle attributes to obtain the lab-fr...
Definition: BackTransformParticleFunctor.H:107
amrex::ParticleReal *AMREX_RESTRICT m_zpold
Definition: BackTransformParticleFunctor.H:173
amrex::ParticleReal *AMREX_RESTRICT m_uypold
Definition: BackTransformParticleFunctor.H:176
amrex::ParticleReal *AMREX_RESTRICT m_uxpold
Definition: BackTransformParticleFunctor.H:175
amrex::Real m_uzfrm
Definition: BackTransformParticleFunctor.H:187
LorentzTransformParticles(const WarpXParIter &a_pti, TmpParticles &tmp_particle_data, amrex::Real t_boost, amrex::Real dt, amrex::Real t_lab, int a_offset=0)
Constructor of the LorentzTransformParticles functor.
Definition: BackTransformParticleFunctor.cpp:32
amrex::Real m_t_lab
Definition: BackTransformParticleFunctor.H:191
amrex::ParticleReal *AMREX_RESTRICT m_ypold
Definition: BackTransformParticleFunctor.H:172
const amrex::ParticleReal *AMREX_RESTRICT m_uxpnew
Definition: BackTransformParticleFunctor.H:179
amrex::Real m_Phys_c
Definition: BackTransformParticleFunctor.H:186
amrex::ParticleReal *AMREX_RESTRICT m_xpold
Definition: BackTransformParticleFunctor.H:171
const amrex::ParticleReal *AMREX_RESTRICT m_uzpnew
Definition: BackTransformParticleFunctor.H:181
const amrex::ParticleReal *AMREX_RESTRICT m_uypnew
Definition: BackTransformParticleFunctor.H:180
GetParticlePosition< PIdx > m_get_position
Definition: BackTransformParticleFunctor.H:169
@ theta
RZ needs all three position components.
Definition: NamedComponentParticleContainer.H:36
@ x
Definition: NamedComponentParticleContainer.H:27
@ uz
Definition: NamedComponentParticleContainer.H:34
@ w
weight
Definition: NamedComponentParticleContainer.H:33
@ uy
Definition: NamedComponentParticleContainer.H:34
@ z
Definition: NamedComponentParticleContainer.H:32
@ ux
Definition: NamedComponentParticleContainer.H:34
Filter to select particles that correspond to a z-slice of the corresponding lab-frame.
Definition: BackTransformParticleFunctor.H:23
amrex::Real m_current_z_boost
Definition: BackTransformParticleFunctor.H:67
amrex::ParticleReal *AMREX_RESTRICT zpold
Definition: BackTransformParticleFunctor.H:71
AMREX_GPU_HOST_DEVICE int operator()(const SrcData &src, int i) const noexcept
Functor call. This method determines if a given particle should be selected for Lorentz transformatio...
Definition: BackTransformParticleFunctor.H:51
SelectParticles(const WarpXParIter &a_pti, TmpParticles &tmp_particle_data, amrex::Real current_z_boost, amrex::Real old_z_boost, int a_offset=0)
Constructor of SelectParticles functor.
Definition: BackTransformParticleFunctor.cpp:18
amrex::Real m_old_z_boost
Definition: BackTransformParticleFunctor.H:69
GetParticlePosition< PIdx > m_get_position
Definition: BackTransformParticleFunctor.H:65