diff options
Diffstat (limited to 'Source/Particles/ParticleCreation/CopyParticle.H')
-rw-r--r-- | Source/Particles/ParticleCreation/CopyParticle.H | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Source/Particles/ParticleCreation/CopyParticle.H b/Source/Particles/ParticleCreation/CopyParticle.H new file mode 100644 index 000000000..bd2d530fb --- /dev/null +++ b/Source/Particles/ParticleCreation/CopyParticle.H @@ -0,0 +1,90 @@ +#ifndef COPYPARTICLE_H_ +#define COPYPARTICLE_H_ + +#include "WarpXParticleContainer.H" + +/** + * \brief Functor to copy one particle + * + * This is meant to be a very small class captured by value in kernel launches, + * that can be initialized on the host and copied to the device at each + * iteration. It should be general enough to be used by all processes. + * + * Pointers to SoA data are saved when constructor is called. + * AoS data is passed as argument of operator (). + */ +class copyParticle +{ + +public: + + // ID of MPI rank + int m_cpuid; + // If true, will copy old attribs for back-transforme diagnostics + bool m_do_back_transformed_product; + // Source old (runtime) attribs for back-transformed diagnostics + amrex::GpuArray<amrex::ParticleReal*,3> m_runtime_uold_source; + // Source attribs + amrex::GpuArray<amrex::ParticleReal*,PIdx::nattribs> m_attribs_source; + // Product attribs + amrex::GpuArray<amrex::ParticleReal*,PIdx::nattribs> m_attribs_product; + // Product runtime attribs + amrex::GpuArray<amrex::ParticleReal*,6> m_runtime_attribs_product; + + // Simple constructor + AMREX_GPU_HOST_DEVICE + copyParticle( + const int cpuid, const int do_back_transformed_product, + const amrex::GpuArray<amrex::ParticleReal*,3> runtime_uold_source, + const amrex::GpuArray<amrex::ParticleReal*,PIdx::nattribs> attribs_source, + const amrex::GpuArray<amrex::ParticleReal*,PIdx::nattribs> attribs_product, + const amrex::GpuArray<amrex::ParticleReal*,6> runtime_attribs_product) + : + m_cpuid(cpuid), + m_do_back_transformed_product(do_back_transformed_product), + m_runtime_uold_source(runtime_uold_source), + m_attribs_source(attribs_source), + m_attribs_product(attribs_product), + m_runtime_attribs_product(runtime_attribs_product){} + + /** + * \brief Overload operator () to do the copy of 1 particle + * + * \param is index of source particle + * \param ip index of product particle + * \param pid_product ID of first product particle + * \param p_source Struct with data for 1 source particle (position etc.) + * \param p_source Struct with data for 1 product particle (position etc.) + */ + AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE + void operator () (int is, int ip, int pid_product, + WarpXParticleContainer::ParticleType& p_source, + WarpXParticleContainer::ParticleType& p_product) const noexcept + { + // Copy particle from source to product: AoS + p_product.id() = pid_product + ip; + p_product.cpu() = m_cpuid; + p_product.pos(0) = p_source.pos(0); + p_product.pos(1) = p_source.pos(1); +#if (AMREX_SPACEDIM == 3) + p_product.pos(2) = p_source.pos(2); +#endif + // Copy particle from source to product: SoA + for (int ia = 0; ia < PIdx::nattribs; ++ia) { + m_attribs_product[ia][ip] = m_attribs_source[ia][is]; + } + // Update xold etc. if boosted frame diagnostics required + // for product species. Fill runtime attribs with a copy of + // current properties (xold = x etc.). + if (m_do_back_transformed_product) { + m_runtime_attribs_product[0][ip] = p_source.pos(0); + m_runtime_attribs_product[1][ip] = p_source.pos(1); + m_runtime_attribs_product[2][ip] = p_source.pos(2); + m_runtime_attribs_product[3][ip] = m_runtime_uold_source[0][ip]; + m_runtime_attribs_product[4][ip] = m_runtime_uold_source[1][ip]; + m_runtime_attribs_product[5][ip] = m_runtime_uold_source[2][ip]; + } + } +}; + +#endif // COPYPARTICLE_H_ |