1 #ifndef ERF_ParFunctions_H
2 #define ERF_ParFunctions_H
7 #include <AMReX_MultiFab.H>
8 #include <AMReX_ParallelDescriptor.H>
9 #include <AMReX_Reduce.H>
26 std::unique_ptr<amrex::MultiFab>& mf,
27 const amrex::Vector<amrex::Real>& zlevels_stag)
29 const int nk =
static_cast<int>(v.size());
30 const bool nodal_z = mf->ixType().nodeCentered(2);
32 "reduce_to_max_per_height: zlevels_stag is shorter than the column");
35 constexpr
amrex::Real not_covered = std::numeric_limits<amrex::Real>::lowest();
37 for (
int k = 0; k < nk; k++) {
38 amrex::ReduceOps<amrex::ReduceOpMax> reduce_op;
39 amrex::ReduceData<amrex::Real> reduce_data(reduce_op);
40 using ReduceTuple =
typename decltype(reduce_data)::Type;
41 for (amrex::MFIter mfi(*mf); mfi.isValid(); ++mfi) {
42 amrex::Box bx = mfi.validbox();
43 if (k < bx.smallEnd(2) || k > bx.bigEnd(2)) {
continue; }
46 const amrex::Array4<amrex::Real const> a = mf->const_array(mfi);
47 reduce_op.eval(bx, reduce_data,
48 [=] AMREX_GPU_DEVICE (
int i,
int j,
int kk) noexcept -> ReduceTuple
53 v[k] = amrex::get<0>(reduce_data.value(reduce_op));
55 amrex::ParallelDescriptor::ReduceRealMax(v.data(), nk);
57 for (
int k = 0; k < nk; k++) {
58 if (v[k] == not_covered) {
59 v[k] = nodal_z ? zlevels_stag[k]
60 :
amrex::Real(0.5) * (zlevels_stag[k] + zlevels_stag[k+1]);
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
AMREX_FORCE_INLINE void reduce_to_max_per_height(amrex::Vector< amrex::Real > &v, std::unique_ptr< amrex::MultiFab > &mf, const amrex::Vector< amrex::Real > &zlevels_stag)
Definition: ERF_ParFunctions.H:25
amrex::Real Real
Definition: ERF_ShocInterface.H:19