8 #ifndef WARPX_DIAGNOSTICS_REDUCEDDIAGS_FIELDREDUCTION_H_ 9 #define WARPX_DIAGNOSTICS_REDUCEDDIAGS_FIELDREDUCTION_H_ 15 #include <AMReX_Array.H> 16 #include <AMReX_Box.H> 17 #include <AMReX_Config.H> 18 #include <AMReX_FArrayBox.H> 19 #include <AMReX_FabArray.H> 20 #include <AMReX_Geometry.H> 21 #include <AMReX_GpuControl.H> 22 #include <AMReX_GpuQualifiers.H> 23 #include <AMReX_IndexType.H> 24 #include <AMReX_MFIter.H> 25 #include <AMReX_MultiFab.H> 26 #include <AMReX_ParallelDescriptor.H> 27 #include <AMReX_Parser.H> 28 #include <AMReX_REAL.H> 29 #include <AMReX_RealBox.H> 30 #include <AMReX_Reduce.H> 31 #include <AMReX_Tuple.H> 35 #include <type_traits> 80 template<
typename ReduceOp>
88 constexpr
int lev = 0;
90 amrex::Geometry
const & geom =
warpx.Geom(lev);
91 const amrex::RealBox& real_box = geom.ProbDomain();
92 const auto dx = geom.CellSizeArray();
95 const amrex::MultiFab & Ex =
warpx.getEfield(lev,0);
96 const amrex::MultiFab & Ey =
warpx.getEfield(lev,1);
97 const amrex::MultiFab & Ez =
warpx.getEfield(lev,2);
98 const amrex::MultiFab & Bx =
warpx.getBfield(lev,0);
99 const amrex::MultiFab & By =
warpx.getBfield(lev,1);
100 const amrex::MultiFab & Bz =
warpx.getBfield(lev,2);
103 const amrex::GpuArray<int,3> cellCenteredtype{0,0,0};
104 const amrex::GpuArray<int,3> reduction_coarsening_ratio{1,1,1};
105 constexpr
int reduction_comp = 0;
107 amrex::ReduceOps<ReduceOp> reduce_op;
108 amrex::ReduceData<amrex::Real> reduce_data(reduce_op);
109 using ReduceTuple =
typename decltype(reduce_data)::Type;
114 auto Extype = amrex::GpuArray<int,3>{0,0,0};
115 auto Eytype = amrex::GpuArray<int,3>{0,0,0};
116 auto Eztype = amrex::GpuArray<int,3>{0,0,0};
117 auto Bxtype = amrex::GpuArray<int,3>{0,0,0};
118 auto Bytype = amrex::GpuArray<int,3>{0,0,0};
119 auto Bztype = amrex::GpuArray<int,3>{0,0,0};
120 for (
int i = 0;
i < AMREX_SPACEDIM; ++
i){
121 Extype[
i] = Ex.ixType()[
i];
122 Eytype[
i] = Ey.ixType()[
i];
123 Eztype[
i] = Ez.ixType()[
i];
124 Bxtype[
i] = Bx.ixType()[
i];
125 Bytype[
i] = By.ixType()[
i];
126 Bztype[
i] = Bz.ixType()[
i];
130 auto reduction_function_parser = m_parser->compile<m_nvars>();
134 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) 136 for ( amrex::MFIter mfi(Ex, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi )
140 const amrex::Box& box = enclosedCells(mfi.nodaltilebox());
141 const auto& arrEx = Ex[mfi].array();
142 const auto& arrEy = Ey[mfi].array();
143 const auto& arrEz = Ez[mfi].array();
144 const auto& arrBx = Bx[mfi].array();
145 const auto& arrBy = By[mfi].array();
146 const auto& arrBz = Bz[mfi].array();
148 reduce_op.eval(box, reduce_data,
149 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) -> ReduceTuple
152 const amrex::Real
x = (i + 0.5_rt)*
dx[0] + real_box.lo(0);
153 #if (AMREX_SPACEDIM==2) 154 const amrex::Real y = 0._rt;
155 const amrex::Real
z = (j + 0.5_rt)*
dx[1] + real_box.lo(1);
157 const amrex::Real y = (j + 0.5_rt)*
dx[1] + real_box.lo(1);
158 const amrex::Real z = (k + 0.5_rt)*
dx[2] + real_box.lo(2);
161 reduction_coarsening_ratio, i, j, k, reduction_comp);
163 reduction_coarsening_ratio, i, j, k, reduction_comp);
165 reduction_coarsening_ratio, i, j, k, reduction_comp);
167 reduction_coarsening_ratio, i, j, k, reduction_comp);
169 reduction_coarsening_ratio, i, j, k, reduction_comp);
171 reduction_coarsening_ratio, i, j, k, reduction_comp);
172 return reduction_function_parser(x, y, z, Ex_interp, Ey_interp, Ez_interp,
173 Bx_interp, By_interp, Bz_interp);
177 amrex::Real reduce_value = amrex::get<0>(reduce_data.value());
182 amrex::ParallelDescriptor::ReduceRealMax(reduce_value);
186 amrex::ParallelDescriptor::ReduceRealMin(reduce_value);
190 amrex::ParallelDescriptor::ReduceRealSum(reduce_value);
193 #if (AMREX_SPACEDIM==2) 194 reduce_value *=
dx[0]*
dx[1];
196 reduce_value *= dx[0]*dx[1]*dx[2];
208 #endif // WARPX_DIAGNOSTICS_REDUCEDDIAGS_FIELDREDUCTION_H_
std::vector< amrex::Real > m_data
output data
Definition: ReducedDiags.H:46
def x
Definition: read_lab_particles.py:25
Definition: ReducedDiags.H:23
int dx
Definition: compute_domain.py:35
static constexpr int m_nvars
Definition: FieldReduction.H:65
int m_reduction_type
Definition: FieldReduction.H:69
def z
Definition: read_lab_particles.py:26
Definition: FieldReduction.H:44
void ComputeFieldReduction()
Definition: FieldReduction.H:81
i
Definition: check_interp_points_and_weights.py:171
FieldReduction(std::string rd_name)
Definition: FieldReduction.cpp:25
static WarpX & GetInstance()
Definition: WarpX.cpp:200
AMREX_GPU_DEVICE AMREX_FORCE_INLINE Real Interp(Array4< Real const > const &arr_src, GpuArray< int, 3 > const &sf, GpuArray< int, 3 > const &sc, GpuArray< int, 3 > const &cr, const int i, const int j, const int k, const int comp)
Interpolates the floating point data contained in the source Array4 arr_src, extracted from a fine Mu...
Definition: CoarsenIO.H:38
virtual void ComputeDiags(int step) override final
Definition: FieldReduction.cpp:89
Definition: NCIGodfreyTables.H:13
value
Definition: updateAMReX.py:125
std::unique_ptr< amrex::Parser > m_parser
Definition: FieldReduction.H:66