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) ||
69 const Box& domain = geom.Domain();
71 const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
78 Table1D<Real> dptr_r_plane, dptr_t_plane, dptr_qv_plane, dptr_qc_plane;
79 TableData<Real, 1> r_plane_tab, t_plane_tab, qv_plane_tab, qc_plane_tab;
84 r_ave.compute_averages(
ZDir(), r_ave.field());
86 int ncell = r_ave.ncell_line();
87 Gpu::HostVector< Real> r_plane_h(ncell);
88 Gpu::DeviceVector< Real> r_plane_d(ncell);
90 r_ave.line_average(
Rho_comp, r_plane_h);
92 Gpu::copyAsync(Gpu::hostToDevice, r_plane_h.begin(), r_plane_h.end(), r_plane_d.begin());
94 Real* dptr_r = r_plane_d.data();
97 Box tdomain = domain; tdomain.grow(2,ng_c[2]);
98 r_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
101 dptr_r_plane = r_plane_tab.table();
102 ParallelFor(ncell, [=] AMREX_GPU_DEVICE (
int k) noexcept
104 dptr_r_plane(k-
offset) = dptr_r[k];
109 t_ave.compute_averages(
ZDir(), t_ave.field());
111 Gpu::HostVector< Real> t_plane_h(ncell);
112 Gpu::DeviceVector< Real> t_plane_d(ncell);
116 Gpu::copyAsync(Gpu::hostToDevice, t_plane_h.begin(), t_plane_h.end(), t_plane_d.begin());
118 Real* dptr_t = t_plane_d.data();
120 t_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
122 dptr_t_plane = t_plane_tab.table();
123 ParallelFor(ncell, [=] AMREX_GPU_DEVICE (
int k) noexcept
125 dptr_t_plane(k-
offset) = dptr_t[k];
130 Gpu::HostVector< Real> qv_plane_h(ncell), qc_plane_h(ncell);
131 Gpu::DeviceVector<Real> qv_plane_d(ncell), qc_plane_d(ncell);
135 qv_ave.compute_averages(
ZDir(), qv_ave.field());
137 Gpu::copyAsync(Gpu::hostToDevice, qv_plane_h.begin(), qv_plane_h.end(), qv_plane_d.begin());
141 qc_ave.compute_averages(
ZDir(), qc_ave.field());
143 Gpu::copyAsync(Gpu::hostToDevice, qc_plane_h.begin(), qc_plane_h.end(), qc_plane_d.begin());
145 Real* dptr_qv = qv_plane_d.data();
146 Real* dptr_qc = qc_plane_d.data();
148 qv_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
149 qc_plane_tab.resize({tdomain.smallEnd(2)}, {tdomain.bigEnd(2)});
151 dptr_qv_plane = qv_plane_tab.table();
152 dptr_qc_plane = qc_plane_tab.table();
153 ParallelFor(ncell, [=] AMREX_GPU_DEVICE (
int k) noexcept
155 dptr_qv_plane(k-
offset) = dptr_qv[k];
156 dptr_qc_plane(k-
offset) = dptr_qc[k];
179 #pragma omp parallel if (Gpu::notInLaunchRegion())
184 Box bx = mfi.tilebox();
186 const Array4<const Real> & cell_data = S_data[
IntVars::cons].array(mfi);
187 const Array4<const Real> & cell_prim = S_prim.array(mfi);
188 const Array4<Real> & cell_src = source.array(mfi);
190 const Array4<const Real>& z_cc_arr = (z_phys_cc) ? z_phys_cc->const_array(mfi) : Array4<Real>{};
192 const Array4<const Real>& t_blank_arr = (terrain_blank) ? terrain_blank->const_array(mfi) :
193 Array4<const Real>{};
195 #ifdef ERF_USE_RRTMGP
200 auto const& qheating_arr = qheating_rates->const_array(mfi);
201 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
204 cell_src(i,j,k,
RhoTheta_comp) += qheating_arr(i,j,k,0) + qheating_arr(i,j,k,1);
213 Real zlo = geom.ProbLo(2);
214 Real dz = geom.CellSize(2);
223 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
225 Real zcc = (z_cc_arr) ? z_cc_arr(i,j,k) : zlo + (k+0.5)*dz;
226 Real zfrac = 1 - (ztop - zcc) / zdamp;
228 Real
theta = cell_prim(i,j,k,np);
229 Real sinefac = std::sin(
PIoTwo*zfrac);
230 cell_src(i, j, k, n) -= dampcoef*sinefac*sinefac * (
theta -
thetabar[k]) * cell_data(i,j,k,nr);
242 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
244 cell_src(i, j, k, n) += cell_data(i,j,k,nr) * dptr_rhotheta_src[k];
247 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
249 cell_src(i, j, k, n) += dptr_rhotheta_src[k];
261 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
263 cell_src(i, j, k, n) += cell_data(i,j,k,nr) * dptr_rhoqt_src[k];
266 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
268 cell_src(i, j, k, n) += dptr_rhoqt_src[k];
280 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
282 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];
283 Real T_hi = dptr_t_plane(k+1) / dptr_r_plane(k+1);
284 Real T_lo = dptr_t_plane(k-1) / dptr_r_plane(k-1);
285 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
286 cell_src(i, j, k, n) -= cell_data(i,j,k,nr) * wbar_cc * (T_hi - T_lo) * dzInv;
289 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
291 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];
292 Real T_hi = dptr_t_plane(k+1) / dptr_r_plane(k+1);
293 Real T_lo = dptr_t_plane(k-1) / dptr_r_plane(k-1);
294 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
295 cell_src(i, j, k, n) -= wbar_cc * (T_hi - T_lo) * dzInv;
307 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
309 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];
310 Real Qv_hi = dptr_qv_plane(k+1) / dptr_r_plane(k+1);
311 Real Qv_lo = dptr_qv_plane(k-1) / dptr_r_plane(k-1);
312 Real Qc_hi = dptr_qc_plane(k+1) / dptr_r_plane(k+1);
313 Real Qc_lo = dptr_qc_plane(k-1) / dptr_r_plane(k-1);
314 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
315 cell_src(i, j, k, nv ) -= cell_data(i,j,k,nr) * wbar_cc * (Qv_hi - Qv_lo) * dzInv;
316 cell_src(i, j, k, nv+1) -= cell_data(i,j,k,nr) * wbar_cc * (Qc_hi - Qc_lo) * dzInv;
319 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
321 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];
322 Real Qv_hi = dptr_qv_plane(k+1) / dptr_r_plane(k+1);
323 Real Qv_lo = dptr_qv_plane(k-1) / dptr_r_plane(k-1);
324 Real Qc_hi = dptr_qc_plane(k+1) / dptr_r_plane(k+1);
325 Real Qc_lo = dptr_qc_plane(k-1) / dptr_r_plane(k-1);
326 Real wbar_cc = 0.5 * (dptr_wbar_sub[k] + dptr_wbar_sub[k+1]);
327 cell_src(i, j, k, nv ) -= wbar_cc * (Qv_hi - Qv_lo) * dzInv;
328 cell_src(i, j, k, nv+1) -= wbar_cc * (Qc_hi - Qc_lo) * dzInv;
340 const Array4<const Real>& mf_m = mapfac_m->const_array(mfi);
344 cell_data, cell_data, cell_src, mf_m);
348 cell_prim, cell_data, cell_src, mf_m);
351 if (l_use_KE && l_diff_KE) {
353 cell_prim, cell_data, cell_src, mf_m);
357 cell_prim, cell_data, cell_src, mf_m);
370 if (solverChoice.
pert_type == PerturbationType::Source) {
372 const amrex::Array4<const amrex::Real>& pert_cell = turbPert.
pb_cell.const_array(mfi);
383 Real coeff_n = Real(1.0);
384 Real coeff_np1 = Real(0.0);
386 Real tau_inv = Real(1.0) / input_sounding_data.
tau_nudging;
390 for (
int nt = 1; nt < n_sounding_times; nt++) {
393 if (itime_n == n_sounding_times-1) {
396 itime_np1 = itime_n+1;
399 coeff_n = Real(1.0) - coeff_np1;
402 const Real* theta_inp_sound_n = input_sounding_data.
theta_inp_sound_d[itime_n].dataPtr();
403 const Real* theta_inp_sound_np1 = input_sounding_data.
theta_inp_sound_d[itime_np1].dataPtr();
408 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
410 Real nudge = (coeff_n*theta_inp_sound_n[k] + coeff_np1*theta_inp_sound_np1[k]) - (dptr_t_plane(k)/dptr_r_plane(k));
412 cell_src(i, j, k, n) += cell_data(i, j, k, nr) * nudge;
419 if (solverChoice.
terrain_type == TerrainType::ImmersedForcing) {
420 const Real drag_coefficient = 10.0/dz;
421 const Real CdT = drag_coefficient;
422 const Real U_s = 1.0;
423 ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
425 const Real t_blank = t_blank_arr(i, j, k);
427 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)
Definition: ERF_ApplySpongeZoneBCs.cpp:7
constexpr amrex::Real PIoTwo
Definition: ERF_Constants.H:7
@ thetabar
Definition: ERF_DataStruct.H:70
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:139
@ theta
Definition: ERF_MM5.H:20
bool rayleigh_damp_T
Definition: ERF_DataStruct.H:621
amrex::Real rayleigh_zdamp
Definition: ERF_DataStruct.H:623
bool custom_rhotheta_forcing
Definition: ERF_DataStruct.H:647
bool custom_w_subsidence
Definition: ERF_DataStruct.H:649
bool nudging_from_input_sounding
Definition: ERF_DataStruct.H:655
amrex::Real rayleigh_ztop
Definition: ERF_DataStruct.H:624
bool use_num_diff
Definition: ERF_DataStruct.H:670
bool custom_moisture_forcing
Definition: ERF_DataStruct.H:648
amrex::Real num_diff_coeff
Definition: ERF_DataStruct.H:671
amrex::Vector< TurbChoice > turbChoice
Definition: ERF_DataStruct.H:594
MoistureType moisture_type
Definition: ERF_DataStruct.H:677
bool custom_forcing_prim_vars
Definition: ERF_DataStruct.H:651
static TerrainType terrain_type
Definition: ERF_DataStruct.H:580
PerturbationType pert_type
Definition: ERF_DataStruct.H:667
SpongeChoice spongeChoice
Definition: ERF_DataStruct.H:593
amrex::Real rayleigh_dampcoef
Definition: ERF_DataStruct.H:622
int ave_plane
Definition: ERF_DataStruct.H:688
std::string sponge_type
Definition: ERF_SpongeStruct.H:61
Definition: ERF_TurbStruct.H:31
PBLType pbl_type
Definition: ERF_TurbStruct.H:241
RANSType rans_type
Definition: ERF_TurbStruct.H:238
bool diffuse_KE_3D
Definition: ERF_TurbStruct.H:256
LESType les_type
Definition: ERF_TurbStruct.H:205
amrex::MultiFab pb_cell
Definition: ERF_TurbPertStruct.H:536
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:245