7 Vector<MultiFab>& S_slow_rhs,
8 const Vector<MultiFab>& S_old,
9 Vector<MultiFab>& S_stage,
10 Vector<MultiFab>& S_data,
14 const Real old_substep_time,
15 const Real new_substep_time)
17 BL_PROFILE(
"acoustic_substepping_fun");
18 if (verbose) amrex::Print() <<
"Fast time integration at level " << level
19 << std::setprecision(timeprecision)
20 <<
" from " << old_substep_time <<
" to " << new_substep_time
21 <<
" with dt = " << dtau << std::endl;
29 if (solverChoice.substepping_type[level] == SubsteppingType::Implicit) {
30 beta_s = solverChoice.beta_s;
35 const GpuArray<Real, AMREX_SPACEDIM>
dxInv = fine_geom.InvCellSizeArray();
38 MultiFab* forest_drag = (solverChoice.do_forest_drag) ?
39 m_forest_drag[level]->get_drag_field() :
nullptr;
42 MultiFab* terrain_blank = (solverChoice.terrain_type == TerrainType::ImmersedForcing ||
43 solverChoice.buildings_type == BuildingsType::ImmersedForcing ) ?
44 terrain_blanking[level].
get() :
nullptr;
46 Vector<MultiFab> Svec_to_use;
50 Svec_to_use.push_back(MultiFab(S_old[
IntVars::xmom],make_alias,0,1));
51 Svec_to_use.push_back(MultiFab(S_old[
IntVars::ymom],make_alias,0,1));
52 Svec_to_use.push_back(MultiFab(S_old[
IntVars::zmom],make_alias,0,1));
56 Svec_to_use.push_back(MultiFab(S_data[
IntVars::xmom],make_alias,0,1));
57 Svec_to_use.push_back(MultiFab(S_data[
IntVars::ymom],make_alias,0,1));
58 Svec_to_use.push_back(MultiFab(S_data[
IntVars::zmom],make_alias,0,1));
62 Svec_to_use, S_prim, cc_src, base_state[level], z_phys_cc[level].
get(),
64 qheating_rates[level].
get(),
65 terrain_blank, fine_geom, solverChoice,
67 rhotheta_src[level].
get(), rhoqt_src[level].
get(),
68 dptr_wbar_sub, d_rayleigh_ptrs_at_lev,
70 (solverChoice.hindcast_surface_bcs? &surface_state_interp[level] :
nullptr),
71 input_sounding_data, turbPert,
false);
76 const bool l_reflux = ( (solverChoice.coupling_type == CouplingType::TwoWay) && (nrk == 2) && (finest_level > 0) );
78 YAFluxRegister* fr_as_crse =
nullptr;
79 YAFluxRegister* fr_as_fine =
nullptr;
81 if (level < finest_level) {
82 fr_as_crse = getAdvFluxReg(level+1);
85 fr_as_fine = getAdvFluxReg(level);
90 if ( solverChoice.terrain_type == TerrainType::MovingFittedMesh ) {
97 z_phys_nd[level].
get(), z_phys_cc[level].
get(), stretched_dz_h[level],
98 xvel_new, yvel_new, zvel_new,
99 xmom_src, ymom_src, zmom_src,
100 base_to_use, forest_drag, terrain_blank,
101 cosPhi_m[level].
get(), sinPhi_m[level].
get(), fine_geom, solverChoice,
103 (solverChoice.have_geo_wind_profile) ? d_u_geos[level].data() :
nullptr,
104 (solverChoice.have_geo_wind_profile) ? d_v_geos[level].data() :
nullptr,
105 dptr_wbar_sub, d_rayleigh_ptrs_at_lev,
106 d_sinesq_at_lev, d_sinesq_stag_at_lev, d_sponge_ptrs_at_lev,
107 (solverChoice.hindcast_lateral_forcing? &forecast_state_interp[level] :
nullptr),
108 (solverChoice.hindcast_surface_bcs? &surface_state_interp[level] :
nullptr),
109 input_sounding_data, get_eb(level),
false);
112 std::unique_ptr<MultiFab> z_t_pert;
113 if ( solverChoice.terrain_type == TerrainType::MovingFittedMesh )
119 bool l_use_moisture = ( solverChoice.moisture_type != MoistureType::None );
121 if ( (fast_step == 0) || (solverChoice.terrain_type == TerrainType::MovingFittedMesh) )
125 detJ_cc[level],
r0, pi0, dtau, beta_s, phys_bc_type);
129 Real l_damp_coef = solverChoice.dampingChoice.rayleigh_dampcoef;
131 if ( solverChoice.terrain_type == TerrainType::MovingFittedMesh )
134 S_slow_rhs, Svec_to_use, S_stage, S_prim,
qt, pi_stage, fast_coeffs,
135 S_data, lagged_delta_rt[level], avg_xmom[level], avg_ymom[level], avg_zmom[level],
136 cc_src, xmom_src, ymom_src, zmom_src,
138 solverChoice.gravity, solverChoice.use_lagged_delta_rt,
139 z_t_rk[level], z_t_pert.get(),
140 z_phys_nd[level], z_phys_nd_new[level], z_phys_nd_src[level],
141 detJ_cc[level], detJ_cc_new[level], detJ_cc_src[level],
142 dtau, beta_s, inv_fac, mapfac[level],
143 fr_as_crse, fr_as_fine, l_use_moisture, l_reflux,
144 (l_rayleigh_implicit) ? d_sinesq_ptrs[level].data() :
nullptr, l_damp_coef);
146 }
else if (solverChoice.mesh_type == MeshType::VariableDz) {
149 S_slow_rhs, Svec_to_use, S_stage, S_prim,
qt, pi_stage, fast_coeffs,
150 S_data, lagged_delta_rt[level], avg_xmom[level], avg_ymom[level], avg_zmom[level],
151 cc_src, xmom_src, ymom_src, zmom_src,
152 fine_geom, solverChoice.gravity,
153 z_phys_nd[level], detJ_cc[level], dtau, beta_s, inv_fac,
155 fr_as_crse, fr_as_fine, l_use_moisture, l_reflux,
156 (l_rayleigh_implicit) ? d_sinesq_ptrs[level].data() :
nullptr, l_damp_coef);
161 S_slow_rhs, Svec_to_use, S_stage, S_prim,
qt, pi_stage, fast_coeffs,
162 S_data, lagged_delta_rt[level], avg_xmom[level], avg_ymom[level], avg_zmom[level],
163 cc_src, xmom_src, ymom_src, zmom_src,
164 fine_geom, solverChoice.gravity, stretched_dz_d[level],
165 dtau, beta_s, inv_fac, mapfac[level],
166 fr_as_crse, fr_as_fine, l_use_moisture, l_reflux,
167 (l_rayleigh_implicit) ? d_sinesq_ptrs[level].data() :
nullptr, l_damp_coef);
173 if ( (solverChoice.vert_implicit_fac[nrk] >
zero) && !solverChoice.implicit_before_substep &&
174 (fast_step == n_sub-1) )
177 MultiFab scratch_xmom(S_data[
IntVars::xmom], make_alias, 0, 1);
178 MultiFab scratch_ymom(S_data[
IntVars::ymom], make_alias, 0, 1);
179 #ifdef ERF_IMPLICIT_W
180 MultiFab scratch_zmom(S_data[
IntVars::zmom], make_alias, 0, 1);
186 if ( (solverChoice.dampingChoice.w_damping) &&
188 (fast_step == n_sub-1))
190 amrex::Real w_damping_const = solverChoice.dampingChoice.w_damping_const;
191 amrex::Real w_damping_coeff = solverChoice.dampingChoice.w_damping_coeff;
192 amrex::Real cflw_lim = solverChoice.dampingChoice.w_damping_cfl;
194 for ( MFIter mfi(S_data[
IntVars::cons]); mfi.isValid(); ++mfi)
196 Box tbz = mfi.nodaltilebox(2);
198 const Array4<const Real>& z_nd_arr = z_phys_nd[level]->const_array(mfi);
200 const Array4<const Real>& cell_data = S_data[
IntVars::cons].const_array(mfi);
201 const Array4< Real>& rho_w = S_data[
IntVars::zmom].array(mfi);
203 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
208 if (k == domain.smallEnd(2)) {
209 dzInv = amrex::Real(4.0) / (
210 z_nd_arr(i ,j ,k+1) - z_nd_arr(i ,j ,k)
211 + z_nd_arr(i+1,j ,k+1) - z_nd_arr(i+1,j ,k)
212 + z_nd_arr(i ,j+1,k+1) - z_nd_arr(i ,j+1,k)
213 + z_nd_arr(i+1,j+1,k+1) - z_nd_arr(i+1,j+1,k) );
214 }
else if (k == domain.bigEnd(2)+1) {
215 dzInv = amrex::Real(4.0) / (
216 z_nd_arr(i ,j ,k) - z_nd_arr(i ,j ,k-1)
217 + z_nd_arr(i+1,j ,k) - z_nd_arr(i+1,j ,k-1)
218 + z_nd_arr(i ,j+1,k) - z_nd_arr(i ,j+1,k-1)
219 + z_nd_arr(i+1,j+1,k) - z_nd_arr(i+1,j+1,k-1) );
223 dzInv = amrex::Real(8.0) / (
224 z_nd_arr(i ,j ,k+1) - z_nd_arr(i ,j ,k-1)
225 + z_nd_arr(i+1,j ,k+1) - z_nd_arr(i+1,j ,k-1)
226 + z_nd_arr(i ,j+1,k+1) - z_nd_arr(i ,j+1,k-1)
227 + z_nd_arr(i+1,j+1,k+1) - z_nd_arr(i+1,j+1,k-1) );
233 Real dampcoef = (w_damping_const > 0)
235 : w_damping_coeff / (dzInv * dt_advance * dt_advance);
238 Real wmag = std::abs(rho_w(i,j,k) / rho_on_w_face);
241 Real cflw = wmag * dt_advance * dzInv;
243 if (cflw > cflw_lim) {
245 rho_w(i, j, k) -= rho_on_w_face * sgn_w * dampcoef * (cflw - cflw_lim) * dt_advance;
248 AMREX_DEVICE_PRINTF(
"t=%f w-damping applied at (%d,%d,%d) for w-CFL = %f > %f : %f --> %f\n",
249 old_time+dt_advance, i,j,k, cflw, cflw_lim, sgn_w*wmag, rho_w(i,j,k)/rho_on_w_face);
251 printf(
"t=%f w-damping applied at (%d,%d,%d) for w-CFL = %f > %f : %f --> %f\n",
252 old_time+dt_advance, i,j,k, cflw, cflw_lim, sgn_w*wmag, rho_w(i,j,k)/rho_on_w_face);
265 if (!solverChoice.use_num_diff) {
269 apply_bcs(S_data, new_substep_time, ng_cons, ng_vel, fast_only=
true, vel_and_mom_synced=
false);
if(l_use_mynn &&start_comp<=RhoKE_comp &&end_comp >=RhoKE_comp)
Definition: ERF_AddQKESources.H:2
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:11
#define Rho_comp
Definition: ERF_IndexDefines.H:36
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
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+myhalf) *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<=one) { Real dT=T_pert *(std::cos(PI *L)+one)/two;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);} } })
pp get("wavelength", wavelength)
void make_fast_coeffs(int, MultiFab &fast_coeffs, Vector< MultiFab > &S_stage_data, const MultiFab &S_stage_prim, const MultiFab &pi_stage, const amrex::Geometry geom, bool l_use_moisture, MeshType mesh_type, Real gravity, Real c_p, std::unique_ptr< MultiFab > &detJ_cc, const MultiFab *r0, const MultiFab *pi0, Real dtau, Real beta_s, amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &phys_bc_type)
Definition: ERF_MakeFastCoeffs.cpp:26
void make_mom_sources(Real time, Real, const Vector< MultiFab > &S_data, const MultiFab *z_phys_nd, const MultiFab *z_phys_cc, Vector< Real > &stretched_dz_h, const MultiFab &xvel, const MultiFab &yvel, const MultiFab &wvel, MultiFab &xmom_src, MultiFab &ymom_src, MultiFab &zmom_src, const MultiFab &base_state, MultiFab *forest_drag, MultiFab *terrain_blank, MultiFab *cosPhi_mf, MultiFab *sinPhi_mf, const Geometry geom, const SolverChoice &solverChoice, Vector< std::unique_ptr< MultiFab >> &, const Real *dptr_u_geos, const Real *dptr_v_geos, const Real *dptr_wbar_sub, const Vector< Real * > d_rayleigh_ptrs_at_lev, const amrex::Real *d_sinesq_at_lev, const amrex::Real *d_sinesq_stag_at_lev, const Vector< Real * > d_sponge_ptrs_at_lev, const Vector< MultiFab > *forecast_state_at_lev, const MultiFab *surface_state_at_lev, InputSoundingData &input_sounding_data, const eb_ &ebfact, bool is_slow_step)
Definition: ERF_MakeMomSources.cpp:37
void make_sources(int level, int, Real dt, Real time, const Vector< MultiFab > &S_data, const MultiFab &S_prim, MultiFab &source, const MultiFab &base_state, const MultiFab *z_phys_cc, const MultiFab &xvel, const MultiFab &yvel, const MultiFab *qheating_rates, MultiFab *terrain_blank, const Geometry geom, const SolverChoice &solverChoice, Vector< std::unique_ptr< MultiFab >> &mapfac, const MultiFab *rhotheta_src, const MultiFab *rhoqt_src, const Real *dptr_wbar_sub, const Vector< Real * > d_rayleigh_ptrs_at_lev, const Real *d_sinesq_at_lev, const MultiFab *surface_state_at_lev, InputSoundingData &input_sounding_data, TurbulentPerturbation &turbPert, bool is_slow_step)
Definition: ERF_MakeSources.cpp:33
amrex::Real Real
Definition: ERF_ShocInterface.H:19
void erf_substep_MT(int step, int, int level, int finest_level, Vector< MultiFab > &S_slow_rhs, const Vector< MultiFab > &S_prev, Vector< MultiFab > &S_stg_data, const MultiFab &S_stg_prim, const MultiFab &qt, const MultiFab &pi_stage, const MultiFab &fast_coeffs, Vector< MultiFab > &S_data, MultiFab &lagged_delta_rt, MultiFab &avg_xmom, MultiFab &avg_ymom, MultiFab &avg_zmom, const MultiFab &cc_src, const MultiFab &xmom_src, const MultiFab &ymom_src, const MultiFab &zmom_src, const Geometry geom, const Real gravity, const bool use_lagged_delta_rt, std::unique_ptr< MultiFab > &z_t_rk, const MultiFab *z_t_pert, std::unique_ptr< MultiFab > &z_phys_nd_old, std::unique_ptr< MultiFab > &z_phys_nd_new, std::unique_ptr< MultiFab > &z_phys_nd_stg, std::unique_ptr< MultiFab > &detJ_cc_old, std::unique_ptr< MultiFab > &detJ_cc_new, std::unique_ptr< MultiFab > &detJ_cc_stg, const Real dtau, const Real beta_s, const Real facinv, Vector< std::unique_ptr< MultiFab >> &mapfac, YAFluxRegister *fr_as_crse, YAFluxRegister *fr_as_fine, bool l_use_moisture, bool l_reflux, const Real *sinesq_stag_d, const Real l_damp_coef)
Definition: ERF_Substep_MT.cpp:50
void erf_substep_NS(int step, int nrk, int level, int finest_level, Vector< MultiFab > &S_slow_rhs, const Vector< MultiFab > &S_prev, Vector< MultiFab > &S_stage_data, const MultiFab &S_stage_prim, const MultiFab &qt, const MultiFab &pi_stage, const MultiFab &fast_coeffs, Vector< MultiFab > &S_data, MultiFab &lagged_delta_rt, MultiFab &avg_xmom, MultiFab &avg_ymom, MultiFab &avg_zmom, const MultiFab &cc_src, const MultiFab &xmom_src, const MultiFab &ymom_src, const MultiFab &zmom_src, const Geometry geom, const Real gravity, amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const Real dtau, const Real beta_s, const Real facinv, Vector< std::unique_ptr< MultiFab >> &mapfac, YAFluxRegister *fr_as_crse, YAFluxRegister *fr_as_fine, bool l_use_moisture, bool l_reflux, const amrex::Real *sinesq_stag_d, const Real l_damp_coef)
Definition: ERF_Substep_NS.cpp:42
void erf_substep_T(int step, int, int level, int finest_level, Vector< MultiFab > &S_slow_rhs, const Vector< MultiFab > &S_prev, Vector< MultiFab > &S_stage_data, const MultiFab &S_stage_prim, const MultiFab &qt, const MultiFab &pi_stage, const MultiFab &fast_coeffs, Vector< MultiFab > &S_data, MultiFab &lagged_delta_rt, MultiFab &avg_xmom, MultiFab &avg_ymom, MultiFab &avg_zmom, const MultiFab &cc_src, const MultiFab &xmom_src, const MultiFab &ymom_src, const MultiFab &zmom_src, const Geometry geom, const Real gravity, std::unique_ptr< MultiFab > &z_phys_nd, std::unique_ptr< MultiFab > &detJ_cc, const Real dtau, const Real beta_s, const Real facinv, Vector< std::unique_ptr< MultiFab >> &mapfac, YAFluxRegister *fr_as_crse, YAFluxRegister *fr_as_fine, bool l_use_moisture, bool l_reflux, const Real *sinesq_stag_d, const Real l_damp_coef)
Definition: ERF_Substep_T.cpp:43
auto acoustic_substepping_fun
Definition: ERF_TI_substep_fun.H:6
auto apply_bcs
Definition: ERF_TI_utils.H:73
auto update_terrain_substep
Definition: ERF_TI_utils.H:238
@ num_comps
Definition: ERF_IndexDefines.H:68
@ ymom
Definition: ERF_IndexDefines.H:178
@ cons
Definition: ERF_IndexDefines.H:176
@ zmom
Definition: ERF_IndexDefines.H:179
@ xmom
Definition: ERF_IndexDefines.H:177
@ qt
Definition: ERF_Kessler.H:27
real(kind=kind_phys), parameter, private r0
Definition: ERF_module_mp_wsm6.F90:21
static MeshType mesh_type
Definition: ERF_DataStruct.H:1079