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 
47  CopyParticleAttribs (const WarpXParIter& a_pti, TmpParticles& tmp_particle_data,
48  int a_offset = 0) noexcept
49  {
50  if (tmp_particle_data.size() == 0) return;
51 
52  auto& attribs = a_pti.GetAttribs();
53 
54  uxp = attribs[PIdx::ux].dataPtr() + a_offset;
55  uyp = attribs[PIdx::uy].dataPtr() + a_offset;
56  uzp = attribs[PIdx::uz].dataPtr() + a_offset;
57 
58  const auto lev = a_pti.GetLevel();
59  const auto index = a_pti.GetPairIndex();
60  xpold = tmp_particle_data[lev][index][TmpIdx::xold ].dataPtr() + a_offset;
61  ypold = tmp_particle_data[lev][index][TmpIdx::yold ].dataPtr() + a_offset;
62  zpold = tmp_particle_data[lev][index][TmpIdx::zold ].dataPtr() + a_offset;
63  uxpold = tmp_particle_data[lev][index][TmpIdx::uxold].dataPtr() + a_offset;
64  uypold = tmp_particle_data[lev][index][TmpIdx::uyold].dataPtr() + a_offset;
65  uzpold = tmp_particle_data[lev][index][TmpIdx::uzold].dataPtr() + a_offset;
66 
67  m_get_position = GetParticlePosition(a_pti, a_offset);
68  }
69 
73  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
74  void operator() (const int i) const noexcept
75  {
76  AMREX_ASSERT(uxp != nullptr);
77  AMREX_ASSERT(uyp != nullptr);
78  AMREX_ASSERT(uzp != nullptr);
79 
80  AMREX_ASSERT(xpold != nullptr);
81  AMREX_ASSERT(ypold != nullptr);
82  AMREX_ASSERT(zpold != nullptr);
83 
84  AMREX_ASSERT(uxpold != nullptr);
85  AMREX_ASSERT(uypold != nullptr);
86  AMREX_ASSERT(uzpold != nullptr);
87 
88  amrex::ParticleReal x, y, z;
89  m_get_position(i, x, y, z);
90 
91  xpold[i] = x;
92  ypold[i] = y;
93  zpold[i] = z;
94 
95  uxpold[i] = uxp[i];
96  uypold[i] = uyp[i];
97  uzpold[i] = uzp[i];
98  }
99 };
100 
101 #endif // WARPX_PARTICLES_PUSHER_COPYPARTICLEATTRIBS_H_
amrex::ParticleReal *AMREX_RESTRICT ypold
Definition: CopyParticleAttribs.H:32
Definition: WarpXParticleContainer.H:57
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(const int i) const noexcept
copy the position and momentum of particle i to the temporary data holder
Definition: CopyParticleAttribs.H:74
Definition: WarpXParticleContainer.H:58
amrex::ParticleReal *AMREX_RESTRICT uzpold
Definition: CopyParticleAttribs.H:37
def x
Definition: read_lab_particles.py:25
const std::array< RealVector, PIdx::nattribs > & GetAttribs() const
Definition: WarpXParticleContainer.H:86
index
Definition: run_automated.py:303
amrex::ParticleReal *AMREX_RESTRICT uxpold
Definition: CopyParticleAttribs.H:35
amrex::ParticleReal *AMREX_RESTRICT xpold
Definition: CopyParticleAttribs.H:31
def z
Definition: read_lab_particles.py:26
const amrex::ParticleReal *AMREX_RESTRICT uzp
Definition: CopyParticleAttribs.H:29
const amrex::ParticleReal *AMREX_RESTRICT uxp
Definition: CopyParticleAttribs.H:27
Functor that creates copies of the current particle positions and momenta for later use...
Definition: CopyParticleAttribs.H:21
WarpXParticleContainer::TmpParticles TmpParticles
Definition: CopyParticleAttribs.H:23
CopyParticleAttribs(const WarpXParIter &a_pti, TmpParticles &tmp_particle_data, int a_offset=0) noexcept
Construct a new functor.
Definition: CopyParticleAttribs.H:47
amrex::ParticleReal *AMREX_RESTRICT uypold
Definition: CopyParticleAttribs.H:36
i
Definition: check_interp_points_and_weights.py:171
const amrex::ParticleReal *AMREX_RESTRICT uyp
Definition: CopyParticleAttribs.H:28
GetParticlePosition m_get_position
Definition: CopyParticleAttribs.H:25
Definition: WarpXParticleContainer.H:37
Definition: WarpXParticleContainer.H:58
Definition: WarpXParticleContainer.H:37
amrex::Vector< std::map< PairIndex, TmpParticleTile > > TmpParticles
Definition: WarpXParticleContainer.H:419
Definition: WarpXParticleContainer.H:37
Definition: WarpXParticleContainer.H:58
Definition: WarpXParticleContainer.H:58
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel...
Definition: GetAndSetPosition.H:25
amrex::ParticleReal *AMREX_RESTRICT zpold
Definition: CopyParticleAttribs.H:33
Definition: WarpXParticleContainer.H:76
Definition: WarpXParticleContainer.H:58