1 #ifndef ERF_PlaneAverage_H
2 #define ERF_PlaneAverage_H
5 #include "AMReX_iMultiFab.H"
6 #include "AMReX_MultiFab.H"
7 #include "AMReX_GpuContainers.H"
25 amrex::Geometry geom_in,
27 amrex::IntVect n_ghost_to_inc=amrex::IntVect{0});
35 [[nodiscard]] AMREX_FORCE_INLINE
50 [[nodiscard]]
const amrex::Vector<amrex::Real>&
line_average ()
const
61 void line_average (
int comp, amrex::Gpu::HostVector<amrex::Real>& l_vec);
68 [[nodiscard]]
const amrex::MultiFab&
field ()
const {
return *
m_field; }
95 template <
typename IndexSelector>
109 amrex::Geometry geom_in,
111 amrex::IntVect n_ghost_to_inc)
112 : m_field(field_in), m_geom(geom_in), m_axis(axis_in), m_ghost_to_inc(n_ghost_to_inc)
121 amrex::Box domain =
m_geom.Domain();
125 amrex::IntVect dom_lo(domain.loVect());
126 amrex::IntVect dom_hi(domain.hiVect());
133 auto period =
m_geom.periodicity();
134 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
135 int p_fac = (!period.isPeriodic(i)) ? 1 : 0;
211 amrex::Abort(
"axis must be equal to 0, 1, or 2");
222 template <
typename IndexSelector>
227 amrex::AsyncArray<amrex::Real> cnt_d(cnt_h.data(), cnt_h.size());
235 amrex::IntVect
ng = amrex::IntVect(0);
239 std::unique_ptr<amrex::iMultiFab> mask = OwnerMask(*
m_field,
m_geom.periodicity(),
ng);
242 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
244 for (amrex::MFIter mfi(mfab, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
245 amrex::Box tbx = mfi.tilebox();
248 amrex::Box pbx = PerpendicularBox<IndexSelector>(tbx, amrex::IntVect(0));
250 const amrex::Array4<const amrex::Real>& fab_arr = mfab.const_array(mfi);
251 const amrex::Array4<const int >& mask_arr = mask->const_array(mfi);
254 AMREX_GPU_DEVICE(
int p_i,
int p_j,
int p_k,
255 amrex::Gpu::Handler
const& handler) noexcept
259 amrex::Box lbx = ParallelBox<IndexSelector>(tbx, amrex::IntVect{p_i, p_j, p_k});
261 for (
int k = lbx.smallEnd(2); k <= lbx.bigEnd(2); ++k) {
262 for (
int j = lbx.smallEnd(1); j <= lbx.bigEnd(1); ++j) {
263 for (
int i = lbx.smallEnd(0); i <= lbx.bigEnd(0); ++i) {
264 int ind = idxOp.getIndx(i, j, k) +
offset;
269 amrex::Gpu::deviceReduceSum(&cnt_avg[ind], fac, handler);
270 for (
int n = 0; n <
ncomp; ++n) {
271 amrex::Gpu::deviceReduceSum(&line_avg[
ncomp * ind + n],
272 fab_arr(i, j, k, n) * fac, handler);
280 cnt_d.copyToHost(cnt_h.data(), cnt_h.size());
282 amrex::ParallelDescriptor::ReduceRealSum(cnt_h.data(), cnt_h.size());
296 int ncell_line_empty = 0;
298 plane_has_cells[ind] = (cnt_h[ind] >
zero);
299 if (plane_has_cells[ind]) {
300 for (
int n(0); n<
ncomp; ++n) {
309 amrex::Abort(
"PlaneAverage: no cells were found in any plane");
312 if (ncell_line_empty > 0) {
316 if (!plane_has_cells[ind] && plane_has_cells[ind-1]) {
317 for (
int n(0); n<
ncomp; ++n) {
320 plane_has_cells[ind] = 1;
324 if (!plane_has_cells[ind] && plane_has_cells[ind+1]) {
325 for (
int n(0); n<
ncomp; ++n) {
328 plane_has_cells[ind] = 1;
336 for (
int ind(0); ind<
m_ncell_line; ++ind) { cnt_max = amrex::max(cnt_max,cnt_h[ind]); }
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
DirectionSelector< 0 > XDir
Definition: ERF_DirectionSelector.H:53
DirectionSelector< 1 > YDir
Definition: ERF_DirectionSelector.H:54
DirectionSelector< 2 > ZDir
Definition: ERF_DirectionSelector.H:55
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
AMREX_FORCE_INLINE IntVect offset(const int face_dir, const int normal)
Definition: ERF_ReadBndryPlanes.cpp:31
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_PlaneAverage.H:14
const amrex::MultiFab & field() const
Definition: ERF_PlaneAverage.H:68
int m_ncell_line
Definition: ERF_PlaneAverage.H:82
AMREX_FORCE_INLINE amrex::Real line_average_interpolated(amrex::Real x, int comp) const
Definition: ERF_PlaneAverage.H:154
int m_precision
Definition: ERF_PlaneAverage.H:84
int ncomp() const
Definition: ERF_PlaneAverage.H:46
amrex::Real m_xlo
Definition: ERF_PlaneAverage.H:79
amrex::IntVect m_ixtype
Definition: ERF_PlaneAverage.H:91
amrex::Vector< amrex::Real > m_line_xcentroid
Definition: ERF_PlaneAverage.H:76
const amrex::Vector< amrex::Real > & line_centroids() const
Definition: ERF_PlaneAverage.H:63
AMREX_FORCE_INLINE void compute_averages(const IndexSelector &idxOp, const amrex::MultiFab &mfab)
void set_precision(int p)
Definition: ERF_PlaneAverage.H:39
const int m_level
Definition: ERF_PlaneAverage.H:85
const amrex::MultiFab * m_field
Definition: ERF_PlaneAverage.H:87
int level() const
Definition: ERF_PlaneAverage.H:45
int m_ncell_plane
Definition: ERF_PlaneAverage.H:81
amrex::Vector< amrex::Real > m_line_average
Definition: ERF_PlaneAverage.H:74
amrex::Real xlo() const
Definition: ERF_PlaneAverage.H:42
AMREX_FORCE_INLINE void operator()()
Definition: ERF_PlaneAverage.H:197
int ncell_plane() const
Definition: ERF_PlaneAverage.H:47
const int m_axis
Definition: ERF_PlaneAverage.H:89
int ncell_line() const
Definition: ERF_PlaneAverage.H:48
amrex::Real dx() const
Definition: ERF_PlaneAverage.H:41
amrex::Real m_dx
Definition: ERF_PlaneAverage.H:78
amrex::Geometry m_geom
Definition: ERF_PlaneAverage.H:88
int axis() const
Definition: ERF_PlaneAverage.H:44
int m_ncomp
Definition: ERF_PlaneAverage.H:71
const amrex::Vector< amrex::Real > & line_average() const
Definition: ERF_PlaneAverage.H:50
amrex::IntVect m_ghost_to_inc
Definition: ERF_PlaneAverage.H:90
@ ng
Definition: ERF_Morrison.H:49
@ p
Definition: ERF_WSM6.H:191
void fill(MultiFab &dst, int temperature_comp, int mixing_ratio_comp, int source_comp, const Sources &sources, Real missing_value)
Definition: ERF_NearSurfaceDiagnostics.cpp:41