WarpX
Loading...
Searching...
No Matches
ExternalField.H
Go to the documentation of this file.
1/* Copyright 2023 Luca Fedeli
2 *
3 *
4 * This file is part of WarpX.
5 *
6 * License: BSD-3-Clause-LBNL
7 */
8#ifndef WARPX_EXTERNAL_FIELD_H_
9#define WARPX_EXTERNAL_FIELD_H_
10
11#include "ExternalField_fwd.H"
12
14
15#include <AMReX_Array.H>
16#include <AMReX_BaseFab.H>
17#include <AMReX_FabArray.H>
18#include <AMReX_Geometry.H>
19#include <AMReX_GpuContainers.H>
20#include <AMReX_ParmParse.H>
21#include <AMReX_Parser.H>
22#include <AMReX_RealVect.H>
23#include <AMReX_TableData.H>
24
25#include <functional>
26#include <memory>
27#include <string>
28
37
43{
44
50
55
60
62 std::unique_ptr<amrex::Parser> Bxfield_parser;
64 std::unique_ptr<amrex::Parser> Byfield_parser;
66 std::unique_ptr<amrex::Parser> Bzfield_parser;
68 std::unique_ptr<amrex::Parser> Exfield_parser;
70 std::unique_ptr<amrex::Parser> Eyfield_parser;
72 std::unique_ptr<amrex::Parser> Ezfield_parser;
73
76};
77
84{
89 {
90#if defined(AMREX_USE_GPU)
91 AMREX_IF_ON_HOST((amrex::Abort("For GPU builds, ExternalFieldView only works on device. We could make it work on host if necessary.");))
92#endif
93
94 // Get index of the external field array
95 AMREX_D_TERM(const auto i0 = static_cast<int>(std::floor( (pos[0]-offset[0])/dx[0] ));,
96 const auto i1 = static_cast<int>(std::floor( (pos[1]-offset[1])/dx[1] ));,
97 const auto i2 = static_cast<int>(std::floor( (pos[2]-offset[2])/dx[2] )));
98
99 // Get coordinates of external grid point
100 AMREX_D_TERM(amrex::Real const xx0 = offset[0] + i0 * dx[0];,
101 amrex::Real const xx1 = offset[1] + i1 * dx[1];,
102 amrex::Real const xx2 = offset[2] + i2 * dx[2]);
103
104#if (AMREX_SPACEDIM == 1)
105
106 if (i0 < table.begin || i0 >= table.end-1) // This covers empty Table.
107 {
108 AMREX_ALWAYS_ASSERT(i0 < 0 || i0 >= global_size[0]-1);
109 return 0;
110 } else {
111 return static_cast<amrex::Real>(
113 xx0, xx0+dx[0], table(i0), table(i0+1), pos[0]));
114 }
115
116#elif (AMREX_SPACEDIM == 2)
117
118 if (i0 < table.begin[0] || i0 >= table.end[0]-1 ||
119 i1 < table.begin[1] || i1 >= table.end[1]-1)
120 {
121 AMREX_ALWAYS_ASSERT(i0 < 0 || i0 >= global_size[0]-1 ||
122 i1 < 0 || i1 >= global_size[1]-1);
123 return 0;
124 } else {
125 return static_cast<amrex::Real>(
127 xx0, xx0+dx[0], xx1, xx1+dx[1],
128 table(i0 ,i1 ),
129 table(i0 ,i1+1),
130 table(i0+1,i1 ),
131 table(i0+1,i1+1),
132 pos[0], pos[1]));
133 }
134
135#elif (AMREX_SPACEDIM == 3)
136
137 if (i0 < table.begin[0] || i0 >= table.end[0]-1 ||
138 i1 < table.begin[1] || i1 >= table.end[1]-1 ||
139 i2 < table.begin[2] || i2 >= table.end[2]-1)
140 {
141 AMREX_ALWAYS_ASSERT(i0 < 0 || i0 >= global_size[0]-1 ||
142 i1 < 0 || i1 >= global_size[1]-1 ||
143 i2 < 0 || i2 >= global_size[2]-1);
144 return 0;
145 } else {
146 return static_cast<amrex::Real>(
148 xx0, xx0+dx[0], xx1, xx1+dx[1], xx2, xx2+dx[2],
149 table(i0 ,i1 ,i2 ),
150 table(i0 ,i1 ,i2+1),
151 table(i0 ,i1+1,i2 ),
152 table(i0 ,i1+1,i2+1),
153 table(i0+1,i1 ,i2 ),
154 table(i0+1,i1 ,i2+1),
155 table(i0+1,i1+1,i2 ),
156 table(i0+1,i1+1,i2+1),
157 pos[0], pos[1], pos[2]));
158 }
159#endif
160 }
161
164#if (AMREX_SPACEDIM == 1)
166#elif (AMREX_SPACEDIM == 2)
168#elif (AMREX_SPACEDIM == 3)
170#endif
172};
173
183{
184public:
196 ExternalFieldReader (std::string read_fields_from_path,
197 std::string F_name, std::string F_component,
200 amrex::Box const& dombox, bool distributed);
201
203 [[nodiscard]] ExternalFieldView getView (int li) const;
204
206 [[nodiscard]] ExternalFieldView getView () const;
207
218 void prepare (amrex::BoxArray const& grids,
219 amrex::DistributionMapping const& dmap,
220 amrex::IntVect const& ngrow,
221 std::function<amrex::Real(amrex::Real)> const& get_zlab = nullptr);
222
231 void prepare (amrex::RealBox const& pbox, int moving_dir, int moving_sign,
232 std::function<amrex::Real(amrex::Real)> const& get_zlab = nullptr);
233
235 [[nodiscard]] bool distributed () const { return m_distributed; }
236
237private:
238
240 void load_data (amrex::RealBox const& pbox);
242 [[nodiscard]] ExternalFieldView make_view (amrex::BaseFab<double> const& fab) const;
245 void make_cache_box (amrex::RealBox const& pbox, int moving_dir, int moving_sign);
246
247 std::string m_file;
248 std::string m_name;
249 std::string m_component;
253 bool m_distributed = false;
254 bool m_moving_window = false;
255 amrex::RealVect m_dx; // Field data's dx
256 amrex::RealVect m_offset; // Field data's physical location at (0,0,0)
257 amrex::IntVect m_size; // Field data's size (i.e., number of elements)
258 amrex::RealBox m_domain; // Field data's total physical domain
259 amrex::RealBox m_cache_domain; // Current cache's domain
260 std::shared_ptr<double> m_FC_data_cpu;
263};
264
265#endif //WARPX_EXTERNAL_FIELD_H_
#define AMREX_ALWAYS_ASSERT(EX)
#define AMREX_FORCE_INLINE
#define AMREX_IF_ON_HOST(CODE)
#define AMREX_GPU_HOST_DEVICE
#define AMREX_D_TERM(a, b, c)
ExternalFieldType
Definition ExternalField.H:30
@ default_zero
Definition ExternalField.H:31
@ read_from_file
Definition ExternalField.H:34
@ constant
Definition ExternalField.H:32
@ parse_ext_grid_function
Definition ExternalField.H:33
@ load_from_python
Definition ExternalField.H:35
amrex::IntVect m_size
Definition ExternalField.H:257
std::string m_file
Definition ExternalField.H:247
amrex::GpuArray< amrex::Real, 3 > m_probdx
WarpX's initial prob lo.
Definition ExternalField.H:251
std::string m_name
OpenMPD file name.
Definition ExternalField.H:248
amrex::Box m_dombox
WarpX's cell size.
Definition ExternalField.H:252
void make_cache_box(amrex::RealBox const &pbox, int moving_dir, int moving_sign)
Definition ExternalField.cpp:494
bool m_distributed
WarpX's initial domain.
Definition ExternalField.H:253
bool m_moving_window
Is the data loaded distributedly?
Definition ExternalField.H:254
ExternalFieldReader(std::string read_fields_from_path, std::string F_name, std::string F_component, amrex::GpuArray< amrex::Real, 3 > const &problo, amrex::GpuArray< amrex::Real, 3 > const &pdx, amrex::Box const &dombox, bool distributed)
Constructor.
Definition ExternalField.cpp:193
bool distributed() const
Is the data loaded distributedly?
Definition ExternalField.H:235
ExternalFieldView make_view(amrex::BaseFab< double > const &fab) const
Used by getView to make ExternalFieldView.
Definition ExternalField.cpp:555
void load_data(amrex::RealBox const &pbox)
Read data within this box.
Definition ExternalField.cpp:208
void prepare(amrex::BoxArray const &grids, amrex::DistributionMapping const &dmap, amrex::IntVect const &ngrow, std::function< amrex::Real(amrex::Real)> const &get_zlab=nullptr)
This must be called before calling getView to prepare for loading distributed data....
Definition ExternalField.cpp:436
amrex::RealVect m_offset
Definition ExternalField.H:256
std::string m_component
Field name.
Definition ExternalField.H:249
amrex::BaseFab< double > m_fab
buffer in cpu memory for loading data
Definition ExternalField.H:261
amrex::RealVect m_dx
In moving window stage?
Definition ExternalField.H:255
amrex::RealBox m_domain
Definition ExternalField.H:258
std::shared_ptr< double > m_FC_data_cpu
Definition ExternalField.H:260
amrex::RealBox m_cache_domain
Definition ExternalField.H:259
amrex::FabArray< amrex::BaseFab< double > > m_mf
data container for loaded data
Definition ExternalField.H:262
amrex::GpuArray< amrex::Real, 3 > m_problo
Component name.
Definition ExternalField.H:250
ExternalFieldView getView() const
Return lightweight view that can be used in kernels.
Definition ExternalField.cpp:550
amrex_real Real
AMREX_GPU_DEVICE AMREX_FORCE_INLINE constexpr auto linear_interp(TCoord x0, TCoord x1, TVal f0, TVal f1, TCoord x)
Performs a linear interpolation.
Definition LinearInterpolation.H:23
AMREX_GPU_DEVICE AMREX_FORCE_INLINE constexpr auto bilinear_interp(TCoord x0, TCoord x1, TCoord y0, TCoord y1, TVal f00, TVal f01, TVal f10, TVal f11, TCoord x, TCoord y)
Performs a bilinear interpolation.
Definition LinearInterpolation.H:38
AMREX_GPU_DEVICE AMREX_FORCE_INLINE constexpr auto trilinear_interp(TCoord x0, TCoord x1, TCoord y0, TCoord y1, TCoord z0, TCoord z1, TVal f000, TVal f001, TVal f010, TVal f011, TVal f100, TVal f101, TVal f110, TVal f111, TCoord x, TCoord y, TCoord z)
Performs a trilinear interpolation.
Definition LinearInterpolation.H:56
BoxND< 3 > Box
IntVectND< 3 > IntVect
RealVectND< 3 > RealVect
void Abort(const std::string &msg)
ExternalFieldType E_ext_grid_type
Initialization type for external electric field on the grid.
Definition ExternalField.H:59
std::unique_ptr< amrex::Parser > Eyfield_parser
User-defined parser to initialize y-component of the electric field on the grid.
Definition ExternalField.H:70
ExternalFieldParams(const amrex::ParmParse &pp_warpx)
The constructor reads and stores the parameters related to the external fields. "pp_warpx" must point...
Definition ExternalField.cpp:69
std::unique_ptr< amrex::Parser > Bzfield_parser
User-defined parser to initialize z-component of the magnetic field on the grid.
Definition ExternalField.H:66
std::unique_ptr< amrex::Parser > Bxfield_parser
User-defined parser to initialize x-component of the magnetic field on the grid.
Definition ExternalField.H:62
amrex::GpuArray< amrex::Real, 3 > E_external_grid
Initial electric field on the grid.
Definition ExternalField.H:52
ExternalFieldType B_ext_grid_type
Initialization type for external magnetic field on the grid.
Definition ExternalField.H:57
std::unique_ptr< amrex::Parser > Byfield_parser
User-defined parser to initialize y-component of the magnetic field on the grid.
Definition ExternalField.H:64
std::string external_fields_path
Path of the file where external fields are stored.
Definition ExternalField.H:75
std::unique_ptr< amrex::Parser > Ezfield_parser
User-defined parser to initialize z-component of the electric field on the grid.
Definition ExternalField.H:72
amrex::GpuArray< amrex::Real, 3 > B_external_grid
Initial magnetic field on the grid.
Definition ExternalField.H:54
std::unique_ptr< amrex::Parser > Exfield_parser
User-defined parser to initialize x-component of the electric field on the grid.
Definition ExternalField.H:68
Companion class for ExternalFieldReader.
Definition ExternalField.H:84
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real operator()(amrex::RealVect const &pos) const
Definition ExternalField.H:88
amrex::IntVect global_size
data
Definition ExternalField.H:171
amrex::RealVect dx
Definition ExternalField.H:162
amrex::Table3D< double > table
data's physical location at (0,0,0)
Definition ExternalField.H:169
amrex::RealVect offset
mesh spacing of the data
Definition ExternalField.H:163