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"
18 amrex::Geometry geom_in,
20 amrex::IntVect n_ghost_to_inc=amrex::IntVect{0});
28 [[nodiscard]] AMREX_FORCE_INLINE
43 [[nodiscard]]
const amrex::Vector<amrex::Real>&
line_average ()
const
49 void line_average (
int comp, amrex::Gpu::HostVector<amrex::Real>& l_vec);
56 [[nodiscard]]
const amrex::MultiFab&
field ()
const {
return *
m_field; }
83 template <
typename IndexSelector>
90 amrex::Geometry geom_in,
92 amrex::IntVect n_ghost_to_inc)
93 : m_field(field_in), m_geom(geom_in), m_axis(axis_in), m_ghost_to_inc(n_ghost_to_inc)
102 amrex::Box domain =
m_geom.Domain();
106 amrex::IntVect
dom_lo(domain.loVect());
107 amrex::IntVect
dom_hi(domain.hiVect());
114 auto period =
m_geom.periodicity();
115 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
116 int p_fac = (!period.isPeriodic(i)) ? 1 : 0;
137 ind =
static_cast<int>(floor((
x -
m_xlo) /
m_dx - 0.5));
178 amrex::Abort(
"axis must be equal to 0, 1, or 2");
183 template <
typename IndexSelector>
188 amrex::AsyncArray<amrex::Real> cnt_d(cnt_h.data(), cnt_h.size());
196 amrex::IntVect
ng = amrex::IntVect(0);
200 std::unique_ptr<amrex::iMultiFab> mask = OwnerMask(*
m_field,
m_geom.periodicity(),
ng);
203 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
205 for (amrex::MFIter mfi(mfab, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
206 amrex::Box tbx = mfi.tilebox();
209 amrex::Box pbx = PerpendicularBox<IndexSelector>(tbx, amrex::IntVect(0));
211 const amrex::Array4<const amrex::Real>& fab_arr = mfab.const_array(mfi);
212 const amrex::Array4<const int >& mask_arr = mask->const_array(mfi);
215 AMREX_GPU_DEVICE(
int p_i,
int p_j,
int p_k,
216 amrex::Gpu::Handler
const& handler) noexcept
220 amrex::Box lbx = ParallelBox<IndexSelector>(tbx, amrex::IntVect{p_i, p_j, p_k});
222 for (
int k = lbx.smallEnd(2); k <= lbx.bigEnd(2); ++k) {
223 for (
int j = lbx.smallEnd(1); j <= lbx.bigEnd(1); ++j) {
224 for (
int i = lbx.smallEnd(0); i <= lbx.bigEnd(0); ++i) {
225 int ind = idxOp.getIndx(i, j, k) +
offset;
230 amrex::Gpu::deviceReduceSum(&cnt_avg[ind], fac, handler);
231 for (
int n = 0; n <
ncomp; ++n) {
232 amrex::Gpu::deviceReduceSum(&line_avg[
ncomp * ind + n],
233 fab_arr(i, j, k, n) * fac, handler);
241 cnt_d.copyToHost(cnt_h.data(), cnt_h.size());
243 amrex::ParallelDescriptor::ReduceRealSum(cnt_h.data(), cnt_h.size());
246 for (
int n(0); n<
ncomp; ++n) {
DirectionSelector< 0 > XDir
Definition: ERF_DirectionSelector.H:36
DirectionSelector< 1 > YDir
Definition: ERF_DirectionSelector.H:37
DirectionSelector< 2 > ZDir
Definition: ERF_DirectionSelector.H:38
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { const auto prob_lo=geomdata.ProbLo();const auto dx=geomdata.CellSize();const Real x=(prob_lo[0]+(i+0.5) *dx[0])/mf_m(i, j, 0);const Real z=z_cc(i, j, k);Real L=std::sqrt(std::pow((x - x_c)/x_r, 2)+std::pow((z - z_c)/z_r, 2));if(L<=1.0) { Real dT=T_pert *(std::cos(PI *L)+1.0)/2.0;Real Tbar_hse=p_hse(i, j, k)/(R_d *r_hse(i, j, k));Real theta_perturbed=(Tbar_hse+dT) *std::pow(p_0/p_hse(i, j, k), rdOcp);Real theta_0=(Tbar_hse) *std::pow(p_0/p_hse(i, j, k), rdOcp);if(const_rho) { state_pert(i, j, k, RhoTheta_comp)=r_hse(i, j, k) *(theta_perturbed - theta_0);} else { state_pert(i, j, k, Rho_comp)=getRhoThetagivenP(p_hse(i, j, k))/theta_perturbed - r_hse(i, j, k);} } })
Real * p
Definition: ERF_InitCustomPert_SquallLine.H:61
AMREX_FORCE_INLINE IntVect offset(const int face_dir, const int normal)
Definition: ERF_ReadBndryPlanes.cpp:28
const auto & dom_hi
Definition: ERF_SetupVertDiff.H:2
const auto & dom_lo
Definition: ERF_SetupVertDiff.H:1
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_PlaneAverage.H:14
const amrex::MultiFab & field() const
Definition: ERF_PlaneAverage.H:56
int m_ncell_line
Definition: ERF_PlaneAverage.H:70
AMREX_FORCE_INLINE amrex::Real line_average_interpolated(amrex::Real x, int comp) const
Definition: ERF_PlaneAverage.H:129
int m_precision
Definition: ERF_PlaneAverage.H:72
int ncomp() const
Definition: ERF_PlaneAverage.H:39
amrex::Real m_xlo
Definition: ERF_PlaneAverage.H:67
amrex::IntVect m_ixtype
Definition: ERF_PlaneAverage.H:79
amrex::Vector< amrex::Real > m_line_xcentroid
Definition: ERF_PlaneAverage.H:64
const amrex::Vector< amrex::Real > & line_centroids() const
Definition: ERF_PlaneAverage.H:51
AMREX_FORCE_INLINE void compute_averages(const IndexSelector &idxOp, const amrex::MultiFab &mfab)
void set_precision(int p)
Definition: ERF_PlaneAverage.H:32
const int m_level
Definition: ERF_PlaneAverage.H:73
const amrex::MultiFab * m_field
Definition: ERF_PlaneAverage.H:75
int level() const
Definition: ERF_PlaneAverage.H:38
int m_ncell_plane
Definition: ERF_PlaneAverage.H:69
amrex::Vector< amrex::Real > m_line_average
Definition: ERF_PlaneAverage.H:62
amrex::Real xlo() const
Definition: ERF_PlaneAverage.H:35
AMREX_FORCE_INLINE void operator()()
Definition: ERF_PlaneAverage.H:164
int ncell_plane() const
Definition: ERF_PlaneAverage.H:40
const int m_axis
Definition: ERF_PlaneAverage.H:77
int ncell_line() const
Definition: ERF_PlaneAverage.H:41
amrex::Real dx() const
Definition: ERF_PlaneAverage.H:34
amrex::Real m_dx
Definition: ERF_PlaneAverage.H:66
amrex::Geometry m_geom
Definition: ERF_PlaneAverage.H:76
int axis() const
Definition: ERF_PlaneAverage.H:37
int m_ncomp
Definition: ERF_PlaneAverage.H:59
const amrex::Vector< amrex::Real > & line_average() const
Definition: ERF_PlaneAverage.H:43
amrex::IntVect m_ghost_to_inc
Definition: ERF_PlaneAverage.H:78
@ ng
Definition: ERF_Morrison.H:48