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)
56 prt.m_rdata[PIdx::x][i_prt] = x;
57 prt.m_rdata[PIdx::z][i_prt] = z;
59#elif defined(WARPX_DIM_RZ)
60 prt.m_rdata[PIdx::r][i_prt] = x;
61 prt.m_rdata[PIdx::z][i_prt] = z;
63#elif defined(WARPX_DIM_1D_Z)
64 prt.m_rdata[PIdx::z][i_prt] = z;
66#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
67 prt.m_rdata[PIdx::r][i_prt] = x;
69#endif
70
71 prt.m_idcpu[i_prt] = amrex::SetParticleIDandCPU(id, cpu);
72
73 // initialize the real components after position
74 for (int j = AMREX_SPACEDIM; j < PartData::NAR; ++j) {
75 prt.m_rdata[j][i_prt] = initializeRealValue(m_policy_real[j], engine);
76 }
77 for (int j = 0; j < prt.m_num_runtime_real; ++j) {
78 prt.m_runtime_rdata[j][i_prt] = initializeRealValue(m_policy_real[j+PartData::NAR], engine);
79 }
80
81 // initialize the int components
82 for (int j = 0; j < PartData::NAI; ++j) {
83 prt.m_idata[j][i_prt] = initializeIntValue(m_policy_int[j]);
84 }
85 for (int j = 0; j < prt.m_num_runtime_int; ++j) {
86 prt.m_runtime_idata[j][i_prt] = initializeIntValue(m_policy_int[j+PartData::NAI]);
87 }
88 }
89};
90
99{
102 bool m_defined{false};
103
104public:
105 template <class PartTileData>
106 explicit
107 SmartCreateFactory (const PartTileData& part) noexcept:
108 m_policy_real{getPolicies(part.GetRealSoANames())},
109 m_policy_int{getPolicies(part.GetIntSoANames())},
110 m_defined{true}
111 {}
112
113 [[nodiscard]] SmartCreate getSmartCreate () const noexcept
114 {
116 return SmartCreate{m_policy_real.dataPtr(),
117 m_policy_int.dataPtr()};
118 }
119
120 [[nodiscard]] bool isDefined () const noexcept { return m_defined; }
121};
122
123#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:81
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:65
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:100
SmartCreateFactory(const PartTileData &part) noexcept
Definition SmartCreate.H:107
bool isDefined() const noexcept
Definition SmartCreate.H:120
SmartCreate getSmartCreate() const noexcept
Definition SmartCreate.H:113
bool m_defined
Definition SmartCreate.H:102
PolicyVec m_policy_int
Definition SmartCreate.H:101
amrex_real Real
__host__ __device__ void ignore_unused(const Ts &...)
__host__ __device__ std::uint64_t SetParticleIDandCPU(Long id, int cpu) noexcept
@ x
Definition WarpXParticleContainer.H:70
@ z
Definition WarpXParticleContainer.H:70
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