Function for computing the slow RHS for the evolution equations for the density, potential temperature and momentum.
54 BL_PROFILE_REGION(
"erf_make_sources()");
64 const bool l_use_KE = ( (tc.
les_type == LESType::Deardorff) ||
67 (tc.
pbl_type == PBLType::MYNNEDMF) );
70 const Box& domain = geom.Domain();
72 const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
79 Table1D<Real> dptr_r_plane, dptr_t_plane, dptr_qv_plane, dptr_qc_plane;
80 TableData<Real, 1> r_plane_tab, t_plane_tab, qv_plane_tab, qc_plane_tab;
85 r_ave.compute_averages(
ZDir(), r_ave.field());
87 int ncell = r_ave.ncell_line();
88 Gpu::HostVector< Real> r_plane_h(ncell);
89 Gpu::DeviceVector< Real> r_plane_d(ncell);
91 r_ave.line_average(
Rho_comp, r_plane_h);
93 Gpu::copyAsync(Gpu::hostToDevice, r_plane_h.begin(), r_plane_h.end(), r_plane_d.begin());
95 Real* dptr_r = r_plane_d.data();
98 Box tdomain = domain; tdomain.grow(2,ng_c[2]);
99 r_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
102 dptr_r_plane = r_plane_tab.table();
103 ParallelFor(ncell, [=] AMREX_GPU_DEVICE (
int k) noexcept
105 dptr_r_plane(k-
offset) = dptr_r[k];
110 t_ave.compute_averages(
ZDir(), t_ave.field());
112 Gpu::HostVector< Real> t_plane_h(ncell);
113 Gpu::DeviceVector< Real> t_plane_d(ncell);
117 Gpu::copyAsync(Gpu::hostToDevice, t_plane_h.begin(), t_plane_h.end(), t_plane_d.begin());
119 Real* dptr_t = t_plane_d.data();
121 t_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
123 dptr_t_plane = t_plane_tab.table();
124 ParallelFor(ncell, [=] AMREX_GPU_DEVICE (
int k) noexcept
126 dptr_t_plane(k-
offset) = dptr_t[k];
131 Gpu::HostVector< Real> qv_plane_h(ncell), qc_plane_h(ncell);
132 Gpu::DeviceVector<Real> qv_plane_d(ncell), qc_plane_d(ncell);
136 qv_ave.compute_averages(
ZDir(), qv_ave.field());
138 Gpu::copyAsync(Gpu::hostToDevice, qv_plane_h.begin(), qv_plane_h.end(), qv_plane_d.begin());
142 qc_ave.compute_averages(
ZDir(), qc_ave.field());
144 Gpu::copyAsync(Gpu::hostToDevice, qc_plane_h.begin(), qc_plane_h.end(), qc_plane_d.begin());
146 Real* dptr_qv = qv_plane_d.data();
147 Real* dptr_qc = qc_plane_d.data();
149 qv_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
150 qc_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
152 dptr_qv_plane = qv_plane_tab.table();
153 dptr_qc_plane = qc_plane_tab.table();
154 ParallelFor(ncell, [=] AMREX_GPU_DEVICE (
int k) noexcept
156 dptr_qv_plane(k-
offset) = dptr_qv[k];
157 dptr_qc_plane(k-
offset) = dptr_qc[k];
180 #pragma omp parallel if (Gpu::notInLaunchRegion())
185 Box bx = mfi.tilebox();
187 const Array4<const Real> & cell_data = S_data[
IntVars::cons].array(mfi);
188 const Array4<const Real> & cell_prim = S_prim.array(mfi);
189 const Array4<Real> & cell_src = source.array(mfi);
191 const Array4<const Real>& z_cc_arr = z_phys_cc->const_array(mfi);
193 const Array4<const Real>& t_blank_arr = (terrain_blank) ? terrain_blank->const_array(mfi) :
194 Array4<const Real>{};
196 #ifdef ERF_USE_RRTMGP
201 auto const& qheating_arr = qheating_rates->const_array(mfi);
202 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
205 cell_src(i,j,k,
RhoTheta_comp) += cell_data(i,j,k,
Rho_comp) * ( qheating_arr(i,j,k,0) + qheating_arr(i,j,k,1) );
222 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
224 Real zcc = z_cc_arr(i,j,k);
225 Real zfrac = 1 - (ztop - zcc) / zdamp;
227 Real
theta = cell_prim(i,j,k,np);
228 Real sinefac = std::sin(
PIoTwo*zfrac);
229 cell_src(i, j, k, n) -= dampcoef*sinefac*sinefac * (
theta -
thetabar[k]) * cell_data(i,j,k,nr);
241 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
243 cell_src(i, j, k, n) += cell_data(i,j,k,nr) * dptr_rhotheta_src[k];
246 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
248 cell_src(i, j, k, n) += dptr_rhotheta_src[k];
260 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
262 cell_src(i, j, k, n) += cell_data(i,j,k,nr) * dptr_rhoqt_src[k];
265 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
267 cell_src(i, j, k, n) += dptr_rhoqt_src[k];
279 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
281 Real dzInv = (z_cc_arr) ? 1.0/ (z_cc_arr(i,j,k+1) - z_cc_arr(i,j,k-1)) : 0.5*dxInv[2];
282 Real T_hi = dptr_t_plane(k+1) / dptr_r_plane(k+1);
283 Real T_lo = dptr_t_plane(k-1) / dptr_r_plane(k-1);
284 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
285 cell_src(i, j, k, n) -= cell_data(i,j,k,nr) * wbar_cc * (T_hi - T_lo) * dzInv;
288 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
290 Real dzInv = (z_cc_arr) ? 1.0/ (z_cc_arr(i,j,k+1) - z_cc_arr(i,j,k-1)) : 0.5*dxInv[2];
291 Real T_hi = dptr_t_plane(k+1) / dptr_r_plane(k+1);
292 Real T_lo = dptr_t_plane(k-1) / dptr_r_plane(k-1);
293 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
294 cell_src(i, j, k, n) -= wbar_cc * (T_hi - T_lo) * dzInv;
306 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
308 Real dzInv = (z_cc_arr) ? 1.0/ (z_cc_arr(i,j,k+1) - z_cc_arr(i,j,k-1)) : 0.5*dxInv[2];
309 Real Qv_hi = dptr_qv_plane(k+1) / dptr_r_plane(k+1);
310 Real Qv_lo = dptr_qv_plane(k-1) / dptr_r_plane(k-1);
311 Real Qc_hi = dptr_qc_plane(k+1) / dptr_r_plane(k+1);
312 Real Qc_lo = dptr_qc_plane(k-1) / dptr_r_plane(k-1);
313 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
314 cell_src(i, j, k, nv ) -= cell_data(i,j,k,nr) * wbar_cc * (Qv_hi - Qv_lo) * dzInv;
315 cell_src(i, j, k, nv+1) -= cell_data(i,j,k,nr) * wbar_cc * (Qc_hi - Qc_lo) * dzInv;
318 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
320 Real dzInv = (z_cc_arr) ? 1.0/ (z_cc_arr(i,j,k+1) - z_cc_arr(i,j,k-1)) : 0.5*dxInv[2];
321 Real Qv_hi = dptr_qv_plane(k+1) / dptr_r_plane(k+1);
322 Real Qv_lo = dptr_qv_plane(k-1) / dptr_r_plane(k-1);
323 Real Qc_hi = dptr_qc_plane(k+1) / dptr_r_plane(k+1);
324 Real Qc_lo = dptr_qc_plane(k-1) / dptr_r_plane(k-1);
325 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
326 cell_src(i, j, k, nv ) -= wbar_cc * (Qv_hi - Qv_lo) * dzInv;
327 cell_src(i, j, k, nv+1) -= wbar_cc * (Qc_hi - Qc_lo) * dzInv;
339 const Array4<const Real>& mf_m = mapfac_m->const_array(mfi);
343 cell_data, cell_data, cell_src, mf_m);
347 cell_prim, cell_data, cell_src, mf_m);
350 if (l_use_KE && l_diff_KE) {
352 cell_prim, cell_data, cell_src, mf_m);
356 cell_prim, cell_data, cell_src, mf_m);
369 if (solverChoice.
pert_type == PerturbationType::Source) {
371 const amrex::Array4<const amrex::Real>& pert_cell = turbPert.
pb_cell[level].const_array(mfi);
382 Real coeff_n = Real(1.0);
383 Real coeff_np1 = Real(0.0);
385 Real tau_inv = Real(1.0) / input_sounding_data.
tau_nudging;
389 for (
int nt = 1; nt < n_sounding_times; nt++) {
392 if (itime_n == n_sounding_times-1) {
395 itime_np1 = itime_n+1;
398 coeff_n = Real(1.0) - coeff_np1;
401 const Real* theta_inp_sound_n = input_sounding_data.
theta_inp_sound_d[itime_n].dataPtr();
402 const Real* theta_inp_sound_np1 = input_sounding_data.
theta_inp_sound_d[itime_np1].dataPtr();
407 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
409 Real nudge = (coeff_n*theta_inp_sound_n[k] + coeff_np1*theta_inp_sound_np1[k]) - (dptr_t_plane(k)/dptr_r_plane(k));
411 cell_src(i, j, k, n) += cell_data(i, j, k, nr) * nudge;
418 if (solverChoice.
terrain_type == TerrainType::ImmersedForcing)
420 Real dz = geom.CellSize(2);
421 const Real drag_coefficient = 10.0/dz;
422 const Real CdT = drag_coefficient;
423 const Real U_s = 1.0;
424 ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
426 const Real t_blank = t_blank_arr(i, j, k);
428 cell_src(i, j, k,
Rho_comp) -= t_blank * CdT * U_s * (cell_data(i,j,k,
Rho_comp) - dptr_r_plane(k));
void ApplySpongeZoneBCsForCC(const SpongeChoice &spongeChoice, const Geometry geom, const Box &bx, const Array4< Real > &cell_rhs, const Array4< const Real > &cell_data, const Array4< const Real > &z_phys_cc)
Definition: ERF_ApplySpongeZoneBCs.cpp:7
constexpr amrex::Real PIoTwo
Definition: ERF_Constants.H:7
@ thetabar
Definition: ERF_DataStruct.H:74
DirectionSelector< 2 > ZDir
Definition: ERF_DirectionSelector.H:38
#define RhoScalar_comp
Definition: ERF_IndexDefines.H:40
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:43
#define NSCALARS
Definition: ERF_IndexDefines.H:16
#define PrimTheta_comp
Definition: ERF_IndexDefines.H:50
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
#define RhoKE_comp
Definition: ERF_IndexDefines.H:38
void NumericalDiffusion_Scal(const Box &bx, const int start_comp, const int num_comp, const Real dt, const Real num_diff_coeff, const Array4< const Real > &prim_data, const Array4< const Real > &cell_data, const Array4< Real > &rhs, const Array4< const Real > &mf_arr)
Definition: ERF_NumericalDiffusion.cpp:18
AMREX_FORCE_INLINE IntVect offset(const int face_dir, const int normal)
Definition: ERF_ReadBndryPlanes.cpp:28
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
Definition: ERF_PlaneAverage.H:14
@ cons
Definition: ERF_IndexDefines.H:150
@ theta
Definition: ERF_MM5.H:20
bool rayleigh_damp_T
Definition: ERF_DataStruct.H:700
amrex::Real rayleigh_zdamp
Definition: ERF_DataStruct.H:702
bool custom_rhotheta_forcing
Definition: ERF_DataStruct.H:726
bool custom_w_subsidence
Definition: ERF_DataStruct.H:728
bool nudging_from_input_sounding
Definition: ERF_DataStruct.H:734
amrex::Real rayleigh_ztop
Definition: ERF_DataStruct.H:703
bool use_num_diff
Definition: ERF_DataStruct.H:749
bool custom_moisture_forcing
Definition: ERF_DataStruct.H:727
amrex::Real num_diff_coeff
Definition: ERF_DataStruct.H:750
amrex::Vector< TurbChoice > turbChoice
Definition: ERF_DataStruct.H:676
MoistureType moisture_type
Definition: ERF_DataStruct.H:759
bool custom_forcing_prim_vars
Definition: ERF_DataStruct.H:730
static TerrainType terrain_type
Definition: ERF_DataStruct.H:659
PerturbationType pert_type
Definition: ERF_DataStruct.H:746
SpongeChoice spongeChoice
Definition: ERF_DataStruct.H:675
amrex::Real rayleigh_dampcoef
Definition: ERF_DataStruct.H:701
int ave_plane
Definition: ERF_DataStruct.H:773
std::string sponge_type
Definition: ERF_SpongeStruct.H:58
Definition: ERF_TurbStruct.H:31
PBLType pbl_type
Definition: ERF_TurbStruct.H:240
RANSType rans_type
Definition: ERF_TurbStruct.H:237
bool diffuse_KE_3D
Definition: ERF_TurbStruct.H:255
LESType les_type
Definition: ERF_TurbStruct.H:204
amrex::Vector< amrex::MultiFab > pb_cell
Definition: ERF_TurbPertStruct.H:554
void apply_tpi(const int &lev, const amrex::Box &vbx, const int &comp, const amrex::IndexType &m_ixtype, const amrex::Array4< amrex::Real > &src_arr, const amrex::Array4< amrex::Real const > &pert_cell)
Definition: ERF_TurbPertStruct.H:262