WarpX
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 
11 #include "DefaultInitialization.H"
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 
35 {
38  const int m_weight_index = 0;
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 #else
60  prt.m_rdata[PIdx::z][i_prt] = z;
62 #endif
63 
64  prt.m_idcpu[i_prt] = amrex::SetParticleIDandCPU(id, cpu);
65 
66  // initialize the real components after position
67  for (int j = AMREX_SPACEDIM; j < PartData::NAR; ++j) {
68  prt.m_rdata[j][i_prt] = initializeRealValue(m_policy_real[j], engine);
69  }
70  for (int j = 0; j < prt.m_num_runtime_real; ++j) {
71  prt.m_runtime_rdata[j][i_prt] = initializeRealValue(m_policy_real[j+PartData::NAR], engine);
72  }
73 
74  // initialize the int components
75  for (int j = 0; j < PartData::NAI; ++j) {
76  prt.m_idata[j][i_prt] = initializeIntValue(m_policy_int[j]);
77  }
78  for (int j = 0; j < prt.m_num_runtime_int; ++j) {
79  prt.m_runtime_idata[j][i_prt] = initializeIntValue(m_policy_int[j+PartData::NAI]);
80  }
81  }
82 };
83 
92 {
95  bool m_defined{false};
96 
97 public:
98  template <class PartTileData>
99  SmartCreateFactory (const PartTileData& part) noexcept:
100  m_policy_real{getPolicies(part.getParticleComps())},
101  m_policy_int{getPolicies(part.getParticleiComps())},
102  m_defined{true}
103  {}
104 
105  [[nodiscard]] SmartCreate getSmartCreate () const noexcept
106  {
110  }
111 
112  [[nodiscard]] bool isDefined () const noexcept { return m_defined; }
113 };
114 
115 #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
PolicyVec getPolicies(const NameMap &names) noexcept
Definition: SmartUtils.cpp:16
A factory for creating SmartCreate functors.
Definition: SmartCreate.H:92
PolicyVec m_policy_real
Definition: SmartCreate.H:93
SmartCreateFactory(const PartTileData &part) noexcept
Definition: SmartCreate.H:99
bool isDefined() const noexcept
Definition: SmartCreate.H:112
SmartCreate getSmartCreate() const noexcept
Definition: SmartCreate.H:105
bool m_defined
Definition: SmartCreate.H:95
PolicyVec m_policy_int
Definition: SmartCreate.H:94
T * dataPtr() noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::uint64_t SetParticleIDandCPU(Long id, int cpu) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
@ x
Definition: NamedComponentParticleContainer.H:27
@ z
Definition: NamedComponentParticleContainer.H:32
This is a functor for performing a "smart create" that works in both host and device code.
Definition: SmartCreate.H:35
const 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