WarpX
Loading...
Searching...
No Matches
SmartCreate.H
Go to the documentation of this file.
1/* Copyright 2019-2020 Luca Fedeli, Neil Zaim
2 *
3 * This file is part of WarpX.
4 *
5 * License: BSD-3-Clause-LBNL
6 */
7
8#ifndef WARPX_SMART_CREATE_H_
9#define WARPX_SMART_CREATE_H_
10
12
13#include <AMReX.H>
14#include <AMReX_AmrCore.H>
15#include <AMReX_GpuContainers.H>
17#include <AMReX_Particle.H>
18#include <AMReX_ParticleTile.H>
19
33
35{
39
40 template <typename PartData>
43 PartData& prt, const int i_prt,
44 amrex::RandomEngine const& engine,
45 const amrex::Real x = 0.0,
46 const amrex::Real y = 0.0,
47 const amrex::Real z = 0.0,
48 const int cpu = 0,
49 const int id = 0) const noexcept
50 {
51#if defined(WARPX_DIM_3D)
52 prt.m_rdata[PIdx::x][i_prt] = x;
53 prt.m_rdata[PIdx::y][i_prt] = y;
54 prt.m_rdata[PIdx::z][i_prt] = z;
55#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
56 prt.m_rdata[PIdx::x][i_prt] = x;
57 prt.m_rdata[PIdx::z][i_prt] = z;
59#elif defined(WARPX_DIM_1D_Z)
60 prt.m_rdata[PIdx::z][i_prt] = z;
62#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
63 prt.m_rdata[PIdx::x][i_prt] = x;
65#endif
66
67 prt.m_idcpu[i_prt] = amrex::SetParticleIDandCPU(id, cpu);
68
69 // initialize the real components after position
70 for (int j = AMREX_SPACEDIM; j < PartData::NAR; ++j) {
71 prt.m_rdata[j][i_prt] = initializeRealValue(m_policy_real[j], engine);
72 }
73 for (int j = 0; j < prt.m_num_runtime_real; ++j) {
74 prt.m_runtime_rdata[j][i_prt] = initializeRealValue(m_policy_real[j+PartData::NAR], engine);
75 }
76
77 // initialize the int components
78 for (int j = 0; j < PartData::NAI; ++j) {
79 prt.m_idata[j][i_prt] = initializeIntValue(m_policy_int[j]);
80 }
81 for (int j = 0; j < prt.m_num_runtime_int; ++j) {
82 prt.m_runtime_idata[j][i_prt] = initializeIntValue(m_policy_int[j+PartData::NAI]);
83 }
84 }
85};
86
95{
98 bool m_defined{false};
99
100public:
101 template <class PartTileData>
102 SmartCreateFactory (const PartTileData& part) noexcept:
103 m_policy_real{getPolicies(part.GetRealSoANames())},
104 m_policy_int{getPolicies(part.GetIntSoANames())},
105 m_defined{true}
106 {}
107
108 [[nodiscard]] SmartCreate getSmartCreate () const noexcept
109 {
111 return SmartCreate{m_policy_real.dataPtr(),
112 m_policy_int.dataPtr()};
113 }
114
115 [[nodiscard]] bool isDefined () const noexcept { return m_defined; }
116};
117
118#endif //WARPX_SMART_CREATE_H_
#define AMREX_ASSERT(EX)
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int initializeIntValue(const InitializationPolicy policy) noexcept
Definition DefaultInitialization.H:78
InitializationPolicy
This set of initialization policies describes what happens when we need to create a new particle due ...
Definition DefaultInitialization.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal initializeRealValue(const InitializationPolicy policy, amrex::RandomEngine const &engine) noexcept
Definition DefaultInitialization.H:62
amrex::Gpu::DeviceVector< InitializationPolicy > PolicyVec
Definition SmartUtils.H:27
PolicyVec getPolicies(std::vector< std::string > const &names_vec) noexcept
Definition SmartUtils.cpp:16
PolicyVec m_policy_real
Definition SmartCreate.H:96
SmartCreateFactory(const PartTileData &part) noexcept
Definition SmartCreate.H:102
bool isDefined() const noexcept
Definition SmartCreate.H:115
SmartCreate getSmartCreate() const noexcept
Definition SmartCreate.H:108
bool m_defined
Definition SmartCreate.H:98
PolicyVec m_policy_int
Definition SmartCreate.H:97
__host__ __device__ void ignore_unused(const Ts &...)
__host__ __device__ std::uint64_t SetParticleIDandCPU(Long id, int cpu) noexcept
@ x
Definition WarpXParticleContainer.H:61
@ z
Definition WarpXParticleContainer.H:67
This is a functor for performing a "smart create" that works in both host and device code.
Definition SmartCreate.H:35
int m_weight_index
Definition SmartCreate.H:38
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(PartData &prt, const int i_prt, amrex::RandomEngine const &engine, const amrex::Real x=0.0, const amrex::Real y=0.0, const amrex::Real z=0.0, const int cpu=0, const int id=0) const noexcept
Definition SmartCreate.H:42
const InitializationPolicy * m_policy_int
Definition SmartCreate.H:37
const InitializationPolicy * m_policy_real
Definition SmartCreate.H:36