1 #ifndef ERF_MOSTAverage_H
2 #define ERF_MOSTAverage_H
5 #include "AMReX_FArrayBox.H"
6 #include "AMReX_MultiFab.H"
7 #include "AMReX_iMultiFab.H"
8 #include "AMReX_ParmParse.H"
31 amrex::Vector<amrex::Geometry> geom,
32 const bool& has_zphys,
33 std::string a_pp_prefix,
36 const amrex::Vector<amrex::Vector<amrex::Real>>& zlevels_stag,
37 const amrex::Vector<const eb_*>& eb_vec = {});
84 const
amrex::Vector<
amrex::MultiFab*>& vars_old,
85 std::unique_ptr<
amrex::MultiFab>& Theta_prim,
86 std::unique_ptr<
amrex::MultiFab>& Qv_prim,
87 std::unique_ptr<
amrex::MultiFab>& Qr_prim,
88 std::unique_ptr<
amrex::MultiFab>& z_phys_nd);
101 amrex::Vector<std::unique_ptr<
amrex::MultiFab>>& Theta_prim,
102 amrex::Vector<std::unique_ptr<
amrex::MultiFab>>& Qv_prim,
103 amrex::Vector<std::unique_ptr<
amrex::MultiFab>>& Qr_prim);
251 [[nodiscard]]
const amrex::MultiFab*
get_average (
const int& lev,
const int& comp)
const {
return m_averages[lev][comp].get(); }
260 [[nodiscard]] amrex::MultiFab*
get_average (
const int& lev,
const int& comp) {
return m_averages[lev][comp].get(); }
304 return amrex::Vector<amrex::Real>{};
319 if (n_have !=
static_cast<int>(pavg.size())) {
return false; }
329 [[nodiscard]] amrex::MultiFab*
get_zref (
const int& lev)
const {
return m_zref[lev].get(); }
349 AMREX_GPU_HOST_DEVICE AMREX_INLINE
354 return ( (
z >= z_lo) && (
z < z_hi) );
369 const int nz =
static_cast<int>(zlevels.size()) - 1;
371 for (
int k(0); k < nz; ++k) {
387 return myhalf * (zlevels[k] + zlevels[k+1]) - zlevels[0];
403 AMREX_GPU_HOST_DEVICE AMREX_INLINE
408 amrex::Array4<amrex::Real const>
const& interp_array,
409 amrex::Array4<amrex::Real const>
const& z_arr,
410 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& plo,
411 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxi,
412 const int interp_comp)
416 int kmax = ubound(z_arr).z;
423 int i_new = (int) (ireal -
myhalf);
424 int j_new = (int) (jreal -
myhalf);
426 for (
int lk(0); lk<kmax; ++lk) {
427 amrex::Real z_lo =
fourth * ( z_arr(i_new,j_new ,lk ) + z_arr(i_new+1,j_new ,lk )
428 + z_arr(i_new,j_new+1,lk ) + z_arr(i_new+1,j_new+1,lk ) );
429 amrex::Real z_hi =
fourth * ( z_arr(i_new,j_new ,lk+1) + z_arr(i_new+1,j_new ,lk+1)
430 + z_arr(i_new,j_new+1,lk+1) + z_arr(i_new+1,j_new+1,lk+1) );
442 if (z_target >=
zc) {
444 if (lk + 2 <= kmax) {
445 amrex::Real z_up =
fourth * ( z_arr(i_new,j_new ,lk+2) + z_arr(i_new+1,j_new ,lk+2)
446 + z_arr(i_new,j_new+1,lk+2) + z_arr(i_new+1,j_new+1,lk+2) );
447 zc_up =
myhalf * (z_hi + z_up);
453 amrex::Real z_dn =
fourth * ( z_arr(i_new,j_new ,lk-1) + z_arr(i_new+1,j_new ,lk-1)
454 + z_arr(i_new,j_new+1,lk-1) + z_arr(i_new+1,j_new+1,lk-1) );
455 zc_dn =
myhalf * (z_dn + z_lo);
463 amrex::ignore_unused(found);
470 const amrex::IntVect ijk =
lx.floor();
472 int i = ijk[0];
int j = ijk[1];
int k = ijk[2];
475 amrex::RealVect ijk_r(
static_cast<amrex::Real>(ijk[0]),
480 const amrex::RealVect sx_hi =
lx - ijk_r;
481 const amrex::RealVect sx_lo =
one - sx_hi;
483 for (
int n = 0; n < interp_comp; n++) {
484 interp_vals[n] = sx_lo[0]*sx_lo[1]*sx_lo[2]*interp_array(i-1, j-1, k-1,n) +
485 sx_lo[0]*sx_lo[1]*sx_hi[2]*interp_array(i-1, j-1, k ,n) +
486 sx_lo[0]*sx_hi[1]*sx_lo[2]*interp_array(i-1, j , k-1,n) +
487 sx_lo[0]*sx_hi[1]*sx_hi[2]*interp_array(i-1, j , k ,n) +
488 sx_hi[0]*sx_lo[1]*sx_lo[2]*interp_array(i , j-1, k-1,n) +
489 sx_hi[0]*sx_lo[1]*sx_hi[2]*interp_array(i , j-1, k ,n) +
490 sx_hi[0]*sx_hi[1]*sx_lo[2]*interp_array(i , j , k-1,n) +
491 sx_hi[0]*sx_hi[1]*sx_hi[2]*interp_array(i , j , k ,n);
511 [[nodiscard]] amrex::IntVect
get_ng_fill (
const int& lev)
const;
537 const amrex::IntVect& ng_fill);
544 const amrex::Vector<amrex::Geometry>
m_geom;
545 amrex::Vector<amrex::Vector<amrex::MultiFab*>>
m_fields;
559 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_zref;
560 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_x_pos;
561 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_y_pos;
562 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_z_pos;
563 amrex::Vector<std::unique_ptr<amrex::iMultiFab>>
m_i_indx;
564 amrex::Vector<std::unique_ptr<amrex::iMultiFab>>
m_j_indx;
565 amrex::Vector<std::unique_ptr<amrex::iMultiFab>>
m_k_indx;
566 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>
m_averages;
568 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>
m_rot_fields;
Declares the embedded-boundary factory manager used by ERF levels.
const Real lx
Definition: ERF_InitCustomPertVels_CloudChamber.H:10
const Real zc
Definition: ERF_InitCustomPert_ABL.H:56
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:31
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:35
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_MOSTAverage.H:16
int m_navg
Definition: ERF_MOSTAverage.H:555
bool m_t_avg
Definition: ERF_MOSTAverage.H:593
void write_xz_positions(const int &lev, const int &j)
Definition: ERF_MOSTAverage.cpp:3148
void compute_plane_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:1457
int m_policy
Definition: ERF_MOSTAverage.H:557
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > m_averages
Definition: ERF_MOSTAverage.H:566
bool set_plane_average(const int &lev, const amrex::Vector< amrex::Real > &pavg)
Definition: ERF_MOSTAverage.H:315
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_y_pos
Definition: ERF_MOSTAverage.H:561
MOSTAverage(amrex::Orientation face, amrex::Vector< amrex::Geometry > geom, const bool &has_zphys, std::string a_pp_prefix, const MeshType &m_mesh_type, const TerrainType &m_terrain_type, const amrex::Vector< amrex::Vector< amrex::Real >> &zlevels_stag, const amrex::Vector< const eb_ * > &eb_vec={})
static int k_index_below(const amrex::Vector< amrex::Real > &zlevels, const amrex::Real &zref)
Definition: ERF_MOSTAverage.H:366
const amrex::Real zref_sentinel
Definition: ERF_MOSTAverage.H:615
double m_time_window
Definition: ERF_MOSTAverage.H:595
amrex::MultiFab * get_average(const int &lev, const int &comp)
Definition: ERF_MOSTAverage.H:260
int m_radius
Definition: ERF_MOSTAverage.H:577
void set_z_positions_EB(const int &lev)
Definition: ERF_MOSTAverage.cpp:958
void write_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:3190
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_i_indx
Definition: ERF_MOSTAverage.H:563
void compute_region_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:2056
amrex::Vector< amrex::MultiFab * > m_z_phys_nd
Definition: ERF_MOSTAverage.H:546
amrex::Vector< int > m_t_init
Definition: ERF_MOSTAverage.H:594
void compute_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:1428
void validate_lateral_reference_stencil(const int &lev)
Definition: ERF_MOSTAverage.cpp:919
void set_rotated_fields(const int &lev)
Definition: ERF_MOSTAverage.cpp:512
amrex::Vector< amrex::Vector< amrex::Real > > m_total_bndry_area
Definition: ERF_MOSTAverage.H:589
void set_region_normalization(const int &)
Definition: ERF_MOSTAverage.H:131
void set_z_positions_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:1244
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_x_pos
Definition: ERF_MOSTAverage.H:560
amrex::Orientation m_face
Definition: ERF_MOSTAverage.H:543
amrex::Vector< amrex::Real > get_plane_average(const int &lev) const
Definition: ERF_MOSTAverage.H:301
void set_norm_positions_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:1324
amrex::Vector< amrex::Real > m_Vsg
Definition: ERF_MOSTAverage.H:601
bool do_time_averaging() const
Definition: ERF_MOSTAverage.H:265
void set_k_indices_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:986
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > m_rot_fields
Definition: ERF_MOSTAverage.H:568
bool m_rotate
Definition: ERF_MOSTAverage.H:558
amrex::MultiFab * get_zref(const int &lev) const
Definition: ERF_MOSTAverage.H:329
amrex::Vector< amrex::Vector< amrex::Real > > m_plane_average
Definition: ERF_MOSTAverage.H:573
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_z_pos
Definition: ERF_MOSTAverage.H:562
amrex::Vector< amrex::Vector< int > > m_ncell_plane
Definition: ERF_MOSTAverage.H:572
void set_plane_normalization(const int &lev)
Definition: ERF_MOSTAverage.cpp:580
void write_k_indices(const int &lev)
Definition: ERF_MOSTAverage.cpp:2992
TerrainType m_terrain_type
Definition: ERF_MOSTAverage.H:549
std::string m_pp_prefix
Definition: ERF_MOSTAverage.H:547
void set_time_avg_initialized(const int &lev)
Definition: ERF_MOSTAverage.H:289
bool m_norm_vec
Definition: ERF_MOSTAverage.H:584
int m_nvar
Definition: ERF_MOSTAverage.H:554
int get_navg() const
Definition: ERF_MOSTAverage.H:270
void fill_planar_boundary(const int &lev, amrex::MultiFab &mf)
Definition: ERF_MOSTAverage.cpp:2038
amrex::Real m_fact_new
Definition: ERF_MOSTAverage.H:596
const amrex::iMultiFab * get_k_indices(const int &lev) const
Definition: ERF_MOSTAverage.H:336
AMREX_GPU_HOST_DEVICE static AMREX_INLINE bool in_cell_z(const amrex::Real &z, const amrex::Real &z_lo, const amrex::Real &z_hi)
Definition: ERF_MOSTAverage.H:350
int m_ncell_region
Definition: ERF_MOSTAverage.H:578
void set_norm_indices_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:1141
amrex::Vector< PlanarBoundary > m_planar_bndry
Definition: ERF_MOSTAverage.H:567
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_zref
Definition: ERF_MOSTAverage.H:559
int m_maxlev
Definition: ERF_MOSTAverage.H:556
const amrex::MultiFab * get_average(const int &lev, const int &comp) const
Definition: ERF_MOSTAverage.H:251
void extrap_ghost_cells(const int &lev, const int &iavg, const amrex::IntVect &ng_fill)
Definition: ERF_MOSTAverage.cpp:1965
void set_eb_normalization(const int &lev)
Definition: ERF_MOSTAverage.cpp:638
bool include_subgrid_vel
Definition: ERF_MOSTAverage.H:600
void update_field_ptrs(const int &lev, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_old, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Theta_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qv_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qr_prim)
Definition: ERF_MOSTAverage.cpp:441
static amrex::Real cell_center_height(const amrex::Vector< amrex::Real > &zlevels, const int &k)
Definition: ERF_MOSTAverage.H:384
~MOSTAverage()
Definition: ERF_MOSTAverage.H:44
MeshType m_mesh_type
Definition: ERF_MOSTAverage.H:548
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_j_indx
Definition: ERF_MOSTAverage.H:564
amrex::Vector< amrex::Vector< amrex::Real > > m_zlevels_stag
Definition: ERF_MOSTAverage.H:550
void set_k_indices_N(const int &lev)
Definition: ERF_MOSTAverage.cpp:732
void make_MOSTAverage_at_level(const int &lev, const amrex::Vector< amrex::MultiFab * > &vars_old, std::unique_ptr< amrex::MultiFab > &Theta_prim, std::unique_ptr< amrex::MultiFab > &Qv_prim, std::unique_ptr< amrex::MultiFab > &Qr_prim, std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_MOSTAverage.cpp:171
MOSTAverage(MOSTAverage &&) noexcept=default
void write_norm_indices(const int &lev)
Definition: ERF_MOSTAverage.cpp:3062
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_fields
Definition: ERF_MOSTAverage.H:545
amrex::Vector< int > m_k_in
Definition: ERF_MOSTAverage.H:579
amrex::Vector< const eb_ * > m_eb_vec
Definition: ERF_MOSTAverage.H:588
const amrex::Real zref_default
Definition: ERF_MOSTAverage.H:605
amrex::Real m_fact_old
Definition: ERF_MOSTAverage.H:596
bool time_avg_is_initialized(const int &lev) const
Definition: ERF_MOSTAverage.H:278
bool m_interp
Definition: ERF_MOSTAverage.H:583
const amrex::Vector< amrex::Geometry > m_geom
Definition: ERF_MOSTAverage.H:544
AMREX_GPU_HOST_DEVICE static AMREX_INLINE void trilinear_interp_T(const amrex::Real &xp, const amrex::Real &yp, const amrex::Real &zp, amrex::Real *interp_vals, amrex::Array4< amrex::Real const > const &interp_array, amrex::Array4< amrex::Real const > const &z_arr, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &plo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxi, const int interp_comp)
Definition: ERF_MOSTAverage.H:404
void compute_eb_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:2689
amrex::IntVect get_ng_fill(const int &lev) const
Definition: ERF_MOSTAverage.cpp:472
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_k_indx
Definition: ERF_MOSTAverage.H:565
Definition: ERF_ConsoleIO.cpp:15