8 #ifndef WARPX_DIAGNOSTICS_REDUCEDDIAGS_RAWEFIELDREDUCTION_H_
9 #define WARPX_DIAGNOSTICS_REDUCEDDIAGS_RAWEFIELDREDUCTION_H_
16 #include <AMReX_Config.H>
34 #include <type_traits>
65 #if (AMREX_SPACEDIM==1)
70 #elif (AMREX_SPACEDIM==2)
91 template<
typename ReduceOp>
94 using namespace amrex::literals;
97 const auto nLevel = 1;
102 for (
int lev = 0; lev < nLevel; ++lev) {
107 constexpr
int index_Ex = 0;
108 constexpr
int index_Ey = 1;
109 constexpr
int index_Ez = 2;
121 using ReduceTuple =
typename decltype(reduceEx_data)::Type;
128 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
132 const amrex::Box& tx = mfi.tilebox(Ex_nodalType);
133 const amrex::Box& ty = mfi.tilebox(Ey_nodalType);
134 const amrex::Box& tz = mfi.tilebox(Ez_nodalType);
145 const auto& Ex_arr = Ex[mfi].
array();
146 const auto& Ey_arr = Ey[mfi].
array();
147 const auto& Ez_arr = Ez[mfi].
array();
149 reduceEx_op.
eval(tx, reduceEx_data,
153 amrex::Real fac_x = (1._rt - Ex_nodalType[0]) *
dx[0] * 0.5_rt;
154 amrex::Real
x =
i *
dx[0] + real_box.
lo(0) + fac_x;
155 #if (AMREX_SPACEDIM==1)
156 amrex::Real
y = 0._rt;
157 amrex::Real
z = 0._rt;
158 #elif (AMREX_SPACEDIM==2)
159 amrex::Real
y = 0._rt;
160 amrex::Real fac_z = (1._rt - Ex_nodalType[1]) *
dx[1] * 0.5_rt;
161 amrex::Real
z = j *
dx[1] + real_box.
lo(1) + fac_z;
163 amrex::Real fac_y = (1._rt - Ex_nodalType[1]) *
dx[1] * 0.5_rt;
164 amrex::Real
y = j *
dx[1] + real_box.
lo(1) + fac_y;
165 amrex::Real fac_z = (1._rt - Ex_nodalType[2]) *
dx[2] * 0.5_rt;
166 amrex::Real
z = k *
dx[2] + real_box.
lo(2) + fac_z;
171 amrex::Real weight = 1.0;
172 if (k == lx[2] || k == hx[2]) {
175 if (j == lx[1] || j == hx[1]) {
178 return weight*reduction_function_parser(
x,
y,
z)*Ex_arr(
i,j,k);
180 reduceEy_op.
eval(ty, reduceEy_data,
184 amrex::Real fac_x = (1._rt - Ey_nodalType[0]) *
dx[0] * 0.5_rt;
185 amrex::Real
x =
i *
dx[0] + real_box.
lo(0) + fac_x;
186 #if (AMREX_SPACEDIM==1)
187 amrex::Real
y = 0._rt;
188 amrex::Real
z = 0._rt;
189 #elif (AMREX_SPACEDIM==2)
190 amrex::Real
y = 0._rt;
191 amrex::Real fac_z = (1._rt - Ey_nodalType[1]) *
dx[1] * 0.5_rt;
192 amrex::Real
z = j *
dx[1] + real_box.
lo(1) + fac_z;
194 amrex::Real fac_y = (1._rt - Ey_nodalType[1]) *
dx[1] * 0.5_rt;
195 amrex::Real
y = j *
dx[1] + real_box.
lo(1) + fac_y;
196 amrex::Real fac_z = (1._rt - Ey_nodalType[2]) *
dx[2] * 0.5_rt;
197 amrex::Real
z = k *
dx[2] + real_box.
lo(2) + fac_z;
202 amrex::Real weight = 1.0;
203 if (
i == ly[0] ||
i == hy[0]) {
206 if (k == ly[2] || k == hy[2]) {
209 return weight*reduction_function_parser(
x,
y,
z)*Ey_arr(
i,j,k);
211 reduceEz_op.
eval(tz, reduceEz_data,
215 amrex::Real fac_x = (1._rt - Ez_nodalType[0]) *
dx[0] * 0.5_rt;
216 amrex::Real
x =
i *
dx[0] + real_box.
lo(0) + fac_x;
217 #if (AMREX_SPACEDIM==1)
218 amrex::Real
y = 0._rt;
219 amrex::Real
z = 0._rt;
220 #elif (AMREX_SPACEDIM==2)
221 amrex::Real
y = 0._rt;
222 amrex::Real fac_z = (1._rt - Ez_nodalType[1]) *
dx[1] * 0.5_rt;
223 amrex::Real
z = j *
dx[1] + real_box.
lo(1) + fac_z;
225 amrex::Real fac_y = (1._rt - Ez_nodalType[1]) *
dx[1] * 0.5_rt;
226 amrex::Real
y = j *
dx[1] + real_box.
lo(1) + fac_y;
227 amrex::Real fac_z = (1._rt - Ez_nodalType[2]) *
dx[2] * 0.5_rt;
228 amrex::Real
z = k *
dx[2] + real_box.
lo(2) + fac_z;
233 amrex::Real weight = 1.0;
234 if (
i == lz[0] ||
i == hz[0]) {
237 if (j == lz[1] || j == hz[1]) {
240 return weight*reduction_function_parser(
x,
y,
z)*Ez_arr(
i,j,k);
244 amrex::Real reducedEx_value = amrex::get<0>(reduceEx_data.
value());
245 amrex::Real reducedEy_value = amrex::get<0>(reduceEy_data.
value());
246 amrex::Real reducedEz_value = amrex::get<0>(reduceEz_data.
value());
269 if (integral_type == 0) {
271 #if (AMREX_SPACEDIM==1)
272 reducedEx_value *=
dx[0];
273 reducedEy_value *=
dx[0];
274 reducedEz_value *=
dx[0];
275 #elif (AMREX_SPACEDIM==2)
276 reducedEx_value *=
dx[0]*
dx[1];
277 reducedEy_value *=
dx[0]*
dx[1];
278 reducedEz_value *=
dx[0]*
dx[1];
280 reducedEx_value *=
dx[0]*
dx[1]*
dx[2];
281 reducedEy_value *=
dx[0]*
dx[1]*
dx[2];
282 reducedEz_value *=
dx[0]*
dx[1]*
dx[2];
285 #if (AMREX_SPACEDIM==1)
286 amrex::Real point = surface_normal[0]*1.0;
288 reducedEy_value *= point;
289 reducedEz_value *= point;
290 #elif (AMREX_SPACEDIM==2)
291 amrex::Real length = surface_normal[0]*
dx[1] + surface_normal[1]*
dx[0];
293 reducedEy_value *= length;
296 amrex::Real area = surface_normal[0]*
dx[1]*
dx[2] + surface_normal[1]*
dx[2]*
dx[0] + surface_normal[2]*
dx[0]*
dx[1];
303 m_data[index_Ex] = reducedEx_value;
304 m_data[index_Ey] = reducedEy_value;
305 m_data[index_Ez] = reducedEz_value;
Definition: RawEFieldReduction.H:38
virtual void ComputeDiags(int step) override final
Definition: RawEFieldReduction.cpp:122
void ComputeRawEFieldReduction()
Definition: RawEFieldReduction.H:92
int m_integral_type
Definition: RawEFieldReduction.H:64
std::vector< amrex::Real > m_scaling_factor
Definition: RawEFieldReduction.H:79
RawEFieldReduction(std::string rd_name)
Definition: RawEFieldReduction.cpp:26
static constexpr int m_nvars
Definition: RawEFieldReduction.H:58
std::unique_ptr< amrex::Parser > m_parser
Definition: RawEFieldReduction.H:59
int m_reduction_type
Definition: RawEFieldReduction.H:62
int m_surface_normal[3]
Definition: RawEFieldReduction.H:77
Definition: ReducedDiags.H:24
std::vector< amrex::Real > m_data
output data
Definition: ReducedDiags.H:46
static WarpX & GetInstance()
Definition: WarpX.cpp:309
AMREX_GPU_HOST_DEVICE const IntVectND< dim > & smallEnd() const &noexcept
AMREX_GPU_HOST_DEVICE const IntVectND< dim > & bigEnd() const &noexcept
GpuArray< Real, AMREX_SPACEDIM > CellSizeArray() const noexcept
IndexType ixType() const noexcept
Array4< typename FabArray< FAB >::value_type const > array(const MFIter &mfi) const noexcept
const RealBox & ProbDomain() const noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE IntVectND< dim > toIntVect() const noexcept
AMREX_GPU_HOST_DEVICE const Real * lo() const &noexcept
std::enable_if_t< IsFabArray< MF >::value > eval(MF const &mf, IntVect const &nghost, D &reduce_data, F &&f)
def y
Definition: Excitation_Flag_Generator.py:76
def x
Formats datastring to remove "+" at the end of the string #####.
Definition: Excitation_Flag_Generator.py:75
def z
Definition: Excitation_Flag_Generator.py:77
void ReduceRealMin(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealSum(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealMax(Vector< std::reference_wrapper< Real > > const &)
i
Definition: check_interp_points_and_weights.py:174
int dx
Definition: stencil.py:436
value
Definition: updateAMReX.py:141
Definition: NCIGodfreyTables.H:14