WarpX
CopyParticleAttribs.H
Go to the documentation of this file.
1 /* Copyright 2020 Andrew Myers
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_PARTICLES_PUSHER_COPYPARTICLEATTRIBS_H_
8 #define WARPX_PARTICLES_PUSHER_COPYPARTICLEATTRIBS_H_
9 
11 
12 #include <AMReX_REAL.H>
13 
14 #include <limits>
15 
16 
22 {
24 
26 
27  const amrex::ParticleReal* AMREX_RESTRICT uxp = nullptr;
28  const amrex::ParticleReal* AMREX_RESTRICT uyp = nullptr;
29  const amrex::ParticleReal* AMREX_RESTRICT uzp = nullptr;
30 
31  amrex::ParticleReal* AMREX_RESTRICT xpold = nullptr;
32  amrex::ParticleReal* AMREX_RESTRICT ypold = nullptr;
33  amrex::ParticleReal* AMREX_RESTRICT zpold = nullptr;
34 
35  amrex::ParticleReal* AMREX_RESTRICT uxpold = nullptr;
36  amrex::ParticleReal* AMREX_RESTRICT uypold = nullptr;
37  amrex::ParticleReal* AMREX_RESTRICT uzpold = nullptr;
38 
39  CopyParticleAttribs () = default;
40 
49  CopyParticleAttribs (const WarpXParIter& a_pti, TmpParticles& tmp_particle_data,
50  long a_offset = 0) noexcept
51  {
52  if (tmp_particle_data.empty()) { return; }
53 
54  const auto& attribs = a_pti.GetAttribs();
55 
56  uxp = attribs[PIdx::ux].dataPtr() + a_offset;
57  uyp = attribs[PIdx::uy].dataPtr() + a_offset;
58  uzp = attribs[PIdx::uz].dataPtr() + a_offset;
59 
60  const auto lev = a_pti.GetLevel();
61  const auto index = a_pti.GetPairIndex();
62  xpold = tmp_particle_data[lev].at(index)[TmpIdx::xold ].dataPtr() + a_offset;
63  ypold = tmp_particle_data[lev].at(index)[TmpIdx::yold ].dataPtr() + a_offset;
64  zpold = tmp_particle_data[lev].at(index)[TmpIdx::zold ].dataPtr() + a_offset;
65  uxpold = tmp_particle_data[lev].at(index)[TmpIdx::uxold].dataPtr() + a_offset;
66  uypold = tmp_particle_data[lev].at(index)[TmpIdx::uyold].dataPtr() + a_offset;
67  uzpold = tmp_particle_data[lev].at(index)[TmpIdx::uzold].dataPtr() + a_offset;
68 
69  m_get_position = GetParticlePosition<PIdx>(a_pti, a_offset);
70  }
71 
76  void operator() (const long i) const noexcept
77  {
78  AMREX_ASSERT(uxp != nullptr);
79  AMREX_ASSERT(uyp != nullptr);
80  AMREX_ASSERT(uzp != nullptr);
81 
82  AMREX_ASSERT(xpold != nullptr);
83  AMREX_ASSERT(ypold != nullptr);
84  AMREX_ASSERT(zpold != nullptr);
85 
86  AMREX_ASSERT(uxpold != nullptr);
87  AMREX_ASSERT(uypold != nullptr);
88  AMREX_ASSERT(uzpold != nullptr);
89 
90  amrex::ParticleReal x, y, z;
91  m_get_position(i, x, y, z);
92 
93  xpold[i] = x;
94  ypold[i] = y;
95  zpold[i] = z;
96 
97  uxpold[i] = uxp[i];
98  uypold[i] = uyp[i];
99  uzpold[i] = uzp[i];
100  }
101 };
102 
103 #endif // WARPX_PARTICLES_PUSHER_COPYPARTICLEATTRIBS_H_
#define AMREX_ASSERT(EX)
#define AMREX_FORCE_INLINE
#define AMREX_RESTRICT
#define AMREX_GPU_HOST_DEVICE
Definition: WarpXParticleContainer.H:53
const std::array< RealVector, PIdx::nattribs > & GetAttribs() const
Definition: WarpXParticleContainer.H:61
amrex::Vector< std::map< PairIndex, TmpParticleTile > > TmpParticles
Definition: WarpXParticleContainer.H:500
T * dataPtr() noexcept
i
Definition: check_interp_points_and_weights.py:174
index
Definition: run_automated.py:328
Functor that creates copies of the current particle positions and momenta for later use....
Definition: CopyParticleAttribs.H:22
amrex::ParticleReal *AMREX_RESTRICT uxpold
Definition: CopyParticleAttribs.H:35
const amrex::ParticleReal *AMREX_RESTRICT uxp
Definition: CopyParticleAttribs.H:27
GetParticlePosition< PIdx > m_get_position
Definition: CopyParticleAttribs.H:25
const amrex::ParticleReal *AMREX_RESTRICT uyp
Definition: CopyParticleAttribs.H:28
amrex::ParticleReal *AMREX_RESTRICT ypold
Definition: CopyParticleAttribs.H:32
amrex::ParticleReal *AMREX_RESTRICT uzpold
Definition: CopyParticleAttribs.H:37
amrex::ParticleReal *AMREX_RESTRICT uypold
Definition: CopyParticleAttribs.H:36
amrex::ParticleReal *AMREX_RESTRICT xpold
Definition: CopyParticleAttribs.H:31
amrex::ParticleReal *AMREX_RESTRICT zpold
Definition: CopyParticleAttribs.H:33
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(const long i) const noexcept
copy the position and momentum of particle i to the temporary data holder
Definition: CopyParticleAttribs.H:76
const amrex::ParticleReal *AMREX_RESTRICT uzp
Definition: CopyParticleAttribs.H:29
CopyParticleAttribs(const WarpXParIter &a_pti, TmpParticles &tmp_particle_data, long a_offset=0) noexcept
Construct a new functor.
Definition: CopyParticleAttribs.H:49
CopyParticleAttribs()=default
@ uz
Definition: NamedComponentParticleContainer.H:34
@ uy
Definition: NamedComponentParticleContainer.H:34
@ ux
Definition: NamedComponentParticleContainer.H:34
@ uzold
Definition: WarpXParticleContainer_fwd.H:38
@ yold
Definition: WarpXParticleContainer_fwd.H:38
@ xold
Definition: WarpXParticleContainer_fwd.H:37
@ zold
Definition: WarpXParticleContainer_fwd.H:38
@ uyold
Definition: WarpXParticleContainer_fwd.H:38
@ uxold
Definition: WarpXParticleContainer_fwd.H:38