WarpX
Loading...
Searching...
No Matches
InjectorDensity.H
Go to the documentation of this file.
1/* Copyright 2019 Axel Huebl, Maxence Thevenet, Weiqun Zhang
2 * Michael Rowan
3 *
4 *
5 * This file is part of WarpX.
6 *
7 * License: BSD-3-Clause-LBNL
8 */
9#ifndef WARPX_INJECTOR_DENSITY_H_
10#define WARPX_INJECTOR_DENSITY_H_
11
13
14#include <AMReX.H>
15#include <AMReX_Array.H>
16#include <AMReX_BoxArray.H>
17#include <AMReX_DataAllocator.H>
19#include <AMReX_Geometry.H>
20#include <AMReX_GpuQualifiers.H>
21#include <AMReX_Parser.H>
22#include <AMReX_REAL.H>
23#include <AMReX_Vector.H>
24
25#include <functional>
26#include <string>
27
28// struct whose getDensity returns constant density.
30{
31 explicit InjectorDensityConstant (amrex::Real a_rho) noexcept : m_rho(a_rho) {}
32
33 [[nodiscard]]
37 {
38 return m_rho;
39 }
40
41private:
43};
44
45// struct whose getDensity returns local density computed from parser.
47{
48 explicit InjectorDensityParser (amrex::ParserExecutor<3> const& a_parser) noexcept
49 : m_parser(a_parser) {}
50
51 [[nodiscard]]
55 {
56 return m_parser(x,y,z);
57 }
58
60};
61
62// struct whose getDensity returns density from file.
64{
65 InjectorDensityFromFile (std::string const& a_file_name, std::string const& a_F_name,
66 amrex::Geometry const& a_geom, bool a_distributed);
67
68 void clear ();
69
70 // This function needs to be called before intializing the density
71 // profile, if the openPMD data are distributed. When the openPMD data
72 // are loaded in the constructor of this class, we do not know the
73 // paricle containers' BoxArray and DistributionMapping yet.
74 void prepare (amrex::BoxArray const& grids,
76 amrex::IntVect const& ngrow,
77 std::function<amrex::Real(amrex::Real)> const& get_zlab);
78
79 // This function needs to be called before we do continuous injection of
80 // particles to inform the injector to load the data we need.
81 void prepare (amrex::RealBox const& pbox, int moving_dir, int moving_sign,
82 std::function<amrex::Real(amrex::Real)> const& get_zlab);
83
84 // For distributed data, this function prepares the injector for loading
85 // data in this Box. Here `li` is the local index for the Box in a
86 // particle container.
87 void prepare (int li);
88
89 [[nodiscard]] bool distributed () const;
90
91 [[nodiscard]]
95 {
96#if (AMREX_SPACEDIM < 3)
98#endif
99#if (AMREX_SPACEDIM == 1)
101#elif defined(WARPX_DIM_RZ)
102 return m_external_field_view(amrex::RealVect{std::sqrt(x*x+y*y),z});
103#elif defined(WARPX_DIM_XZ)
105#else
107#endif
108 }
109
110private:
113};
114
115// Base struct for density injector.
116// InjectorDensity contains a union (called Object) that holds any one
117// instance of:
118// - InjectorDensityConstant : to generate constant density;
119// - InjectorDensityParser : to generate density from parser;
120// - InjectorDensityFromFile : to generate density from file;
121// The choice is made at runtime, depending in the constructor called.
122// This mimics virtual functions.
124{
125 // This constructor stores a InjectorDensityConstant in union object.
127 : type(Type::constant),
128 object(t,a_rho)
129 { }
130
131 // This constructor stores a InjectorDensityParser in union object.
133 : type(Type::parser),
134 object(t,a_parser)
135 { }
136
137 // This constructor stores a InjectorDensityFromFile in union object.
138 InjectorDensity (InjectorDensityFromFile* t, std::string const& a_file_name,
139 std::string const& a_F_name, amrex::Geometry const& a_geom,
140 bool a_distributed)
141 : type(Type::fromfile),
142 object(t,a_file_name,a_F_name,a_geom,a_distributed)
143 { }
144
145 // Explicitly prevent the compiler from generating copy constructors
146 // and copy assignment operators.
149 void operator= (InjectorDensity const&) = delete;
150 void operator= (InjectorDensity &&) = delete;
151
152 // Default destructor
153 ~InjectorDensity () = default;
154
155 void clear ();
156
157 void prepare (amrex::BoxArray const& grids,
158 amrex::DistributionMapping const& dmap,
159 amrex::IntVect const& ngrow,
160 std::function<amrex::Real(amrex::Real)> const& get_zlab);
161
162 void prepare (amrex::RealBox const& pbox, int moving_dir, int moving_sign,
163 std::function<amrex::Real(amrex::Real)> const& get_zlab);
164
165 void prepare (int li, InjectorDensity** inj_rho);
166
167 [[nodiscard]] bool needPreparation () const;
168
169 [[nodiscard]] bool distributed () const;
170
171 // call getDensity from the object stored in the union
172 // (the union is called Object, and the instance is called object).
173 [[nodiscard]]
177 {
178 switch (type)
179 {
180 case Type::parser:
181 {
182 return object.parser.getDensity(x,y,z);
183 }
184 case Type::constant:
185 {
186 return object.constant.getDensity(x,y,z);
187 }
188 case Type::fromfile:
189 {
190 return object.fromfile.getDensity(x,y,z);
191 }
192 default:
193 {
194 amrex::Abort("InjectorDensity: unknown type");
195 return 0.0;
196 }
197 }
198 }
199
200private:
201 enum struct Type { constant, parser, fromfile };
203
204 // An instance of union Object constructs and stores any one of
205 // the objects declared (constant or parser or predefined).
206 union Object {
208 : constant(a_rho) {}
210 : parser(a_parser) {}
211 Object (InjectorDensityFromFile*, std::string const& a_file_name,
212 std::string const& a_F_name, amrex::Geometry const& a_geom,
213 bool a_distributed)
214 : fromfile(a_file_name, a_F_name, a_geom, a_distributed) {}
218 };
220#if defined(AMREX_USE_OMP) && !defined(AMREX_USE_GPU)
221 std::unique_ptr<void,amrex::DataDeleter> inj_rho_data;
223#endif
224};
225
226// In order for InjectorDensity to be trivially copyable, its destructor
227// must be trivial. So we have to rely on a custom deleter for unique_ptr.
230 if (p) {
231 p->clear();
232 delete p;
233 }
234 }
235};
236
237#endif //WARPX_INJECTOR_DENSITY_H_
#define AMREX_GPU_HOST_DEVICE
Definition ExternalField.H:183
amrex_real Real
__host__ __device__ void ignore_unused(const Ts &...)
IntVectND< 3 > IntVect
RealVectND< 3 > RealVect
void Abort(const std::string &msg)
Companion class for ExternalFieldReader.
Definition ExternalField.H:84
Definition InjectorDensity.H:30
InjectorDensityConstant(amrex::Real a_rho) noexcept
Definition InjectorDensity.H:31
amrex::Real m_rho
Definition InjectorDensity.H:42
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition InjectorDensity.H:36
Definition InjectorDensity.H:228
void operator()(InjectorDensity *p) const
Definition InjectorDensity.H:229
Definition InjectorDensity.H:64
ExternalFieldReader * m_external_field_reader
Definition InjectorDensity.H:112
bool distributed() const
Definition InjectorDensity.cpp:144
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:94
InjectorDensityFromFile(std::string const &a_file_name, std::string const &a_F_name, amrex::Geometry const &a_geom, bool a_distributed)
Definition InjectorDensity.cpp:101
void prepare(amrex::BoxArray const &grids, amrex::DistributionMapping const &dmap, amrex::IntVect const &ngrow, std::function< amrex::Real(amrex::Real)> const &get_zlab)
Definition InjectorDensity.cpp:117
void clear()
Definition InjectorDensity.cpp:111
ExternalFieldView m_external_field_view
Definition InjectorDensity.H:111
Definition InjectorDensity.H:124
amrex::Vector< InjectorDensity * > inj_rho_omp
Definition InjectorDensity.H:222
~InjectorDensity()=default
Type type
Definition InjectorDensity.H:202
Type
Definition InjectorDensity.H:201
@ parser
Definition InjectorDensity.H:201
@ constant
Definition InjectorDensity.H:201
@ fromfile
Definition InjectorDensity.H:201
void operator=(InjectorDensity const &)=delete
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:176
InjectorDensity(InjectorDensityFromFile *t, std::string const &a_file_name, std::string const &a_F_name, amrex::Geometry const &a_geom, bool a_distributed)
Definition InjectorDensity.H:138
InjectorDensity(InjectorDensityConstant *t, amrex::Real a_rho)
Definition InjectorDensity.H:126
std::unique_ptr< void, amrex::DataDeleter > inj_rho_data
Definition InjectorDensity.H:221
Object object
Definition InjectorDensity.H:219
void prepare(amrex::BoxArray const &grids, amrex::DistributionMapping const &dmap, amrex::IntVect const &ngrow, std::function< amrex::Real(amrex::Real)> const &get_zlab)
Definition InjectorDensity.cpp:32
InjectorDensity(InjectorDensityParser *t, amrex::ParserExecutor< 3 > const &a_parser)
Definition InjectorDensity.H:132
bool needPreparation() const
Definition InjectorDensity.cpp:87
InjectorDensity(InjectorDensity const &)=delete
void clear()
Definition InjectorDensity.cpp:14
bool distributed() const
Definition InjectorDensity.cpp:92
InjectorDensity(InjectorDensity &&)=delete
Definition InjectorDensity.H:47
InjectorDensityParser(amrex::ParserExecutor< 3 > const &a_parser) noexcept
Definition InjectorDensity.H:48
amrex::ParserExecutor< 3 > m_parser
Definition InjectorDensity.H:59
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:54
Definition InjectorDensity.H:206
InjectorDensityConstant constant
Definition InjectorDensity.H:215
Object(InjectorDensityParser *, amrex::ParserExecutor< 3 > const &a_parser) noexcept
Definition InjectorDensity.H:209
InjectorDensityFromFile fromfile
Definition InjectorDensity.H:217
Object(InjectorDensityFromFile *, std::string const &a_file_name, std::string const &a_F_name, amrex::Geometry const &a_geom, bool a_distributed)
Definition InjectorDensity.H:211
InjectorDensityParser parser
Definition InjectorDensity.H:216
Object(InjectorDensityConstant *, amrex::Real a_rho) noexcept
Definition InjectorDensity.H:207