26 std::unique_ptr<amrex::MultiFab>& ,
27 std::unique_ptr<amrex::MultiFab>& z_phys_cc,
28 amrex::Geometry
const& geom,
29 const amrex::Vector<amrex::Real>& stretched_dz_h,
30 bool is_constant_dz,
bool is_stretched_dz)
override
36 if (!is_constant_dz && !is_stretched_dz) {
38 const int domlo_z = geom.Domain().smallEnd(2);
39 const int domhi_z = geom.Domain().bigEnd(2);
40 if (domhi_z > 255) amrex::Abort(
"1D Arrays are hard-wired to only 256 high");
50 const amrex::Vector<int> bands =
column_bands(rho_hse.boxArray());
52 for (
const int klo_band : bands)
54 if (klo_band != bands[0]) {
58 for ( amrex::MFIter mfi(rho_hse,
TileNoZ()); mfi.isValid(); ++mfi )
60 amrex::Array4<amrex::Real >
rho_arr = rho_hse.array(mfi);
61 amrex::Array4<amrex::Real const> z_cc_arr = z_phys_cc->const_array(mfi);
64 const amrex::Box& tbz = mfi.nodaltilebox(2);
66 b2d.grow(0,1); b2d.grow(1,1);
69 const int klo = tbz.smallEnd(2);
70 const int khi = tbz.bigEnd(2)-1;
72 if (
klo != klo_band) {
continue; }
91 amrex::Array1D<amrex::Real,0,255> r;
92 amrex::Array1D<amrex::Real,0,255>
p;
95 for (
int k =
klo; k <=
khi; k++) {
100 if (
klo == domlo_z) {
103 if (
khi == domhi_z) {
116 const int klo = geom.Domain().smallEnd(2);
117 const int khi = geom.Domain().bigEnd(2);
120 amrex::Vector<amrex::Real>
h_r(
khi+2);
121 amrex::Vector<amrex::Real>
h_p(
khi+2);
123 amrex::Gpu::DeviceVector<amrex::Real>
d_r(
khi+2);
124 amrex::Gpu::DeviceVector<amrex::Real>
d_p(
khi+2);
126 if (is_constant_dz) {
133 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice,
h_r.begin(),
h_r.end(),
d_r.begin());
134 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice,
h_p.begin(),
h_p.end(),
d_p.begin());
139 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
141 for ( amrex::MFIter mfi(rho_hse, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi )
143 const amrex::Box& bx = mfi.growntilebox(1);
144 const amrex::Array4<amrex::Real> rho_hse_arr = rho_hse[mfi].array();
147 int kk = std::max(k,0);
148 rho_hse_arr(i,j,k) = r[kk];
163 std::unique_ptr<amrex::MultiFab>& ,
164 amrex::Geometry
const& geom)
override
167 const int khi = geom.Domain().bigEnd()[2];
170 amrex::Vector<amrex::Real>
h_r(
khi+2);
171 amrex::Vector<amrex::Real>
h_p(
khi+2);
172 amrex::Vector<amrex::Real>
h_t(
khi+2);
173 amrex::Vector<amrex::Real>
h_q_v(
khi+2);
175 amrex::ParmParse
pp(
"prob");
177 pp.query(
"qt_init",
q_t);
187 pp.query(
"height", z_tr_1);
188 pp.query(
"z_tr", z_tr_2);
194 bool T_from_theta =
false;
195 pp.query(
"T_from_theta_in_moist_init", T_from_theta);
204 T_from_theta, z_tr_1, z_tr_2,
207 amrex::Gpu::DeviceVector<amrex::Real>
d_r(
khi+2);
208 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
h_r.begin(),
h_r.end(),
d_r.begin());
212 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
214 for ( amrex::MFIter mfi(rho_hse,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
216 const amrex::Box& bx = mfi.growntilebox(1);
217 const amrex::Array4<amrex::Real> rho_hse_arr = rho_hse[mfi].array();
220 int kk = std::max(k,0);
221 rho_hse_arr(i,j,k) = r[kk];
235 for ( amrex::MFIter mfi(rho_hse, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi )
237 amrex::Array4<amrex::Real> rho_hse_arr = rho_hse.array(mfi);
238 const amrex::Box& gbx = mfi.growntilebox(1);
239 ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
241 rho_hse_arr(i,j,k) =
rho_0;
257 amrex::MultiFab& pi_hse, amrex::MultiFab& th_hse,
258 amrex::MultiFab& qv_hse,
amrex::Real l_rdOcp)
override
263 amrex::ParmParse
pp_prob(
"prob");
266 rho_hse.setVal(
rho_0);
295 amrex::MultiFab& pi_hse, amrex::MultiFab& th_hse,
297 std::unique_ptr<amrex::MultiFab>& z_phys_cc)
override
302 amrex::ParmParse
pp_prob(
"prob");
305 rho_hse.setVal(
rho_0);
307 for ( amrex::MFIter mfi(th_hse, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi )
309 amrex::Array4<amrex::Real> th_hse_arr = th_hse.array(mfi);
310 amrex::Array4<amrex::Real> p_hse_arr = p_hse.array(mfi);
311 amrex::Array4<amrex::Real> pi_hse_arr = pi_hse.array(mfi);
312 amrex::Array4<amrex::Real const> z_arr = z_phys_cc->array(mfi);
313 const amrex::Box& gbx = mfi.growntilebox(1);
314 ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
316 th_hse_arr(i,j,k) =
T_0 + dtheta_dz * (z_arr(i,j,k)- z_arr(i,j,0));
Vector< int > column_bands(const BoxArray &ba)
Definition: ERF_ColumnBands.cpp:13
void fill_below_band(MultiFab &mf, int icomp, int ncomp, int klo_band, const IntVect &lateral_ng, const Geometry &geom)
Definition: ERF_ColumnBands.cpp:23
constexpr amrex::Real p_0
Definition: ERF_Constants.H:53
constexpr amrex::Real R_d
Definition: ERF_Constants.H:34
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getExnergivenRTh(const amrex::Real rhotheta, const amrex::Real rdOcp, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:156
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:81
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
Real rho_0
Definition: ERF_InitCustomPert_ABL.H:18
ParmParse pp_prob("prob")
Real T_0
Definition: ERF_InitCustomPert_ABL.H:19
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
Real eq_pot_temp
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:23
bool use_empirical
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:25
Vector< Real > h_t(khi+2)
Real T_tr
Definition: ERF_InitCustomPert_SquallLine.H:43
Real q_t
Definition: ERF_InitCustomPert_SquallLine.H:24
Vector< Real > h_q_v(khi+2)
Gpu::DeviceVector< Real > d_p(khi+2)
Vector< Real > h_r(khi+2)
Real theta_tr
Definition: ERF_InitCustomPert_SquallLine.H:47
Vector< Real > h_p(khi+2)
Gpu::DeviceVector< Real > d_r(khi+2)
Real theta_0
Definition: ERF_InitCustomPert_SquallLine.H:46
void erf_init_const_dens_hse(amrex::MultiFab &rho_hse) override
Initialize HSE density as a constant value.
Definition: ERF_InitDensityHSE.H:232
void erf_init_const_dens_and_linear_th_hse(amrex::MultiFab &rho_hse, amrex::MultiFab &p_hse, amrex::MultiFab &pi_hse, amrex::MultiFab &th_hse, amrex::MultiFab &qv_hse, amrex::Real l_rdOcp, std::unique_ptr< amrex::MultiFab > &z_phys_cc) override
Initialize constant density and linearly varying potential temperature in HSE.
Definition: ERF_InitDensityHSE.H:294
void erf_init_dens_hse_moist(amrex::MultiFab &rho_hse, std::unique_ptr< amrex::MultiFab > &, amrex::Geometry const &geom) override
Initialize density in hydrostatic equilibrium for moist cases.
Definition: ERF_InitDensityHSE.H:162
void erf_init_const_dens_and_th_hse(amrex::MultiFab &rho_hse, amrex::MultiFab &p_hse, amrex::MultiFab &pi_hse, amrex::MultiFab &th_hse, amrex::MultiFab &qv_hse, amrex::Real l_rdOcp) override
Initialize constant density and potential temperature in HSE.
Definition: ERF_InitDensityHSE.H:256
void erf_init_dens_hse_dry(amrex::MultiFab &rho_hse, std::unique_ptr< amrex::MultiFab > &, std::unique_ptr< amrex::MultiFab > &z_phys_cc, amrex::Geometry const &geom, const amrex::Vector< amrex::Real > &stretched_dz_h, bool is_constant_dz, bool is_stretched_dz) override
Initialize density in hydrostatic equilibrium for dry cases.
Definition: ERF_InitDensityHSE.H:25
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);})
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
auto rho_arr
Definition: ERF_UpdateWSubsidence_SineMassFlux.H:3
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void init_isentropic_hse_stretched_dz(const amrex::Real &r_sfc, const amrex::Real &theta, amrex::Real *r, amrex::Real *p, const amrex::Real *stretched_dz, const int klo, const int khi)
Definition: ERF_HSEUtils.H:221
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void init_isentropic_hse_constant_dz(const amrex::Real &r_sfc, const amrex::Real &theta, amrex::Real *r, amrex::Real *p, const amrex::Real &dz, const int klo, const int khi)
Definition: ERF_HSEUtils.H:111
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void init_isentropic_hse_no_terrain(Real *theta, Real *r, Real *p, Real *q_v, const Real &dz, const int &khi, const Real q_t, const Real eq_pot_temp, const bool use_empirical, const bool T_from_theta=false, const Real z_tr_1=-one, const Real z_tr_2=-one, const Real theta_0=amrex::Real(300), const Real theta_tr=amrex::Real(300), const Real T_tr=amrex::Real(300))
Definition: ERF_HSEUtils.H:677
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void init_isentropic_hse_terrain(int i, int j, const amrex::Real &r_sfc, const amrex::Real &theta, amrex::Real *r, amrex::Real *p, const amrex::Array4< amrex::Real const > z_cc, const int &klo, const int &khi)
Definition: ERF_HSEUtils.H:333
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
@ p
Definition: ERF_WSM6.H:280
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40