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, amrex::Geometry const& a_geom, bool a_distributed);
66
67 void clear ();
68
69 // This function needs to be called before intializing the density
70 // profile, if the openPMD data are distributed. When the openPMD data
71 // are loaded in the constructor of this class, we do not know the
72 // paricle containers' BoxArray and DistributionMapping yet.
73 void prepare (amrex::BoxArray const& grids,
75 amrex::IntVect const& ngrow,
76 std::function<amrex::Real(amrex::Real)> const& get_zlab);
77
78 // This function needs to be called before we do continuous injection of
79 // particles to inform the injector to load the data we need.
80 void prepare (amrex::RealBox const& pbox, int moving_dir, int moving_sign,
81 std::function<amrex::Real(amrex::Real)> const& get_zlab);
82
83 // For distributed data, this function prepares the injector for loading
84 // data in this Box. Here `li` is the local index for the Box in a
85 // particle container.
86 void prepare (int li);
87
88 [[nodiscard]] bool distributed () const;
89
90 [[nodiscard]]
94 {
95#if (AMREX_SPACEDIM < 3)
97#endif
98#if (AMREX_SPACEDIM == 1)
100#elif defined(WARPX_DIM_RZ)
101 return m_external_field_view(amrex::RealVect{std::sqrt(x*x+y*y),z});
102#elif defined(WARPX_DIM_XZ)
104#else
106#endif
107 }
108
109private:
112};
113
114// Base struct for density injector.
115// InjectorDensity contains a union (called Object) that holds any one
116// instance of:
117// - InjectorDensityConstant : to generate constant density;
118// - InjectorDensityParser : to generate density from parser;
119// - InjectorDensityFromFile : to generate density from file;
120// The choice is made at runtime, depending in the constructor called.
121// This mimics virtual functions.
123{
124 // This constructor stores a InjectorDensityConstant in union object.
126 : type(Type::constant),
127 object(t,a_rho)
128 { }
129
130 // This constructor stores a InjectorDensityParser in union object.
132 : type(Type::parser),
133 object(t,a_parser)
134 { }
135
136 // This constructor stores a InjectorDensityFromFile in union object.
137 InjectorDensity (InjectorDensityFromFile* t, std::string const& a_file_name,
138 amrex::Geometry const& a_geom, bool a_distributed)
139 : type(Type::fromfile),
140 object(t,a_file_name,a_geom,a_distributed)
141 { }
142
143 // Explicitly prevent the compiler from generating copy constructors
144 // and copy assignment operators.
147 void operator= (InjectorDensity const&) = delete;
148 void operator= (InjectorDensity &&) = delete;
149
150 // Default destructor
151 ~InjectorDensity () = default;
152
153 void clear ();
154
155 void prepare (amrex::BoxArray const& grids,
156 amrex::DistributionMapping const& dmap,
157 amrex::IntVect const& ngrow,
158 std::function<amrex::Real(amrex::Real)> const& get_zlab);
159
160 void prepare (amrex::RealBox const& pbox, int moving_dir, int moving_sign,
161 std::function<amrex::Real(amrex::Real)> const& get_zlab);
162
163 void prepare (int li, InjectorDensity** inj_rho);
164
165 [[nodiscard]] bool needPreparation () const;
166
167 [[nodiscard]] bool distributed () const;
168
169 // call getDensity from the object stored in the union
170 // (the union is called Object, and the instance is called object).
171 [[nodiscard]]
175 {
176 switch (type)
177 {
178 case Type::parser:
179 {
180 return object.parser.getDensity(x,y,z);
181 }
182 case Type::constant:
183 {
184 return object.constant.getDensity(x,y,z);
185 }
186 case Type::fromfile:
187 {
188 return object.fromfile.getDensity(x,y,z);
189 }
190 default:
191 {
192 amrex::Abort("InjectorDensity: unknown type");
193 return 0.0;
194 }
195 }
196 }
197
198private:
199 enum struct Type { constant, parser, fromfile };
201
202 // An instance of union Object constructs and stores any one of
203 // the objects declared (constant or parser or predefined).
204 union Object {
206 : constant(a_rho) {}
208 : parser(a_parser) {}
209 Object (InjectorDensityFromFile*, std::string const& a_file_name,
210 amrex::Geometry const& a_geom, bool a_distributed)
211 : fromfile(a_file_name, a_geom, a_distributed) {}
215 };
217#if defined(AMREX_USE_OMP) && !defined(AMREX_USE_GPU)
218 std::unique_ptr<void,amrex::DataDeleter> inj_rho_data;
220#endif
221};
222
223// In order for InjectorDensity to be trivially copyable, its destructor
224// must be trivial. So we have to rely on a custom deleter for unique_ptr.
227 if (p) {
228 p->clear();
229 delete p;
230 }
231 }
232};
233
234#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:225
void operator()(InjectorDensity *p) const
Definition InjectorDensity.H:226
Definition InjectorDensity.H:64
ExternalFieldReader * m_external_field_reader
Definition InjectorDensity.H:111
bool distributed() const
Definition InjectorDensity.cpp:143
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:93
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:116
void clear()
Definition InjectorDensity.cpp:110
InjectorDensityFromFile(std::string const &a_file_name, amrex::Geometry const &a_geom, bool a_distributed)
Definition InjectorDensity.cpp:101
ExternalFieldView m_external_field_view
Definition InjectorDensity.H:110
Definition InjectorDensity.H:123
amrex::Vector< InjectorDensity * > inj_rho_omp
Definition InjectorDensity.H:219
~InjectorDensity()=default
Type type
Definition InjectorDensity.H:200
InjectorDensity(InjectorDensityFromFile *t, std::string const &a_file_name, amrex::Geometry const &a_geom, bool a_distributed)
Definition InjectorDensity.H:137
Type
Definition InjectorDensity.H:199
@ parser
Definition InjectorDensity.H:199
@ constant
Definition InjectorDensity.H:199
@ fromfile
Definition InjectorDensity.H:199
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:174
InjectorDensity(InjectorDensityConstant *t, amrex::Real a_rho)
Definition InjectorDensity.H:125
std::unique_ptr< void, amrex::DataDeleter > inj_rho_data
Definition InjectorDensity.H:218
Object object
Definition InjectorDensity.H:216
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:131
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:204
InjectorDensityConstant constant
Definition InjectorDensity.H:212
Object(InjectorDensityParser *, amrex::ParserExecutor< 3 > const &a_parser) noexcept
Definition InjectorDensity.H:207
InjectorDensityFromFile fromfile
Definition InjectorDensity.H:214
Object(InjectorDensityFromFile *, std::string const &a_file_name, amrex::Geometry const &a_geom, bool a_distributed)
Definition InjectorDensity.H:209
InjectorDensityParser parser
Definition InjectorDensity.H:213
Object(InjectorDensityConstant *, amrex::Real a_rho) noexcept
Definition InjectorDensity.H:205