6 BL_PROFILE(
"cons_to_prim()");
8 int ncomp_prim = S_prim.nComp();
11 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
13 for (MFIter mfi(cons_state,TilingIfNotGPU()); mfi.isValid(); ++mfi)
15 const Box& gbx = mfi.growntilebox(
ng);
16 const Array4<const Real>& cons_arr = cons_state.array(mfi);
17 const Array4< Real>& prim_arr = S_prim.array(mfi);
22 amrex::ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
27 for (
int n = 1; n < ncomp_prim; ++n) {
35 const Box& gbx1 = mfi.growntilebox(1);
37 const Array4< Real>& pi_stage_arr = pi_stage.array(mfi);
38 const Real rdOcp = solverChoice.rdOcp;
39 const bool l_use_moisture = (solverChoice.moisture_type != MoistureType::None);
41 amrex::ParallelFor(gbx1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
43 auto qv_for_p = (l_use_moisture) ? cons_arr(i,j,k,
RhoQ1_comp)/cons_arr(i,j,k,
Rho_comp) : 0.0;
52 auto make_qt = [&](
const MultiFab& cons_state, MultiFab&
qt)
54 BL_PROFILE(
"make_qt()");
56 int n_qstate_moist = micro->Get_Qstate_Moist_Size();
62 for (
int n(1); n<n_qstate_moist; ++n) {
67 MultiFab::Divide(
qt, cons_state,
Rho_comp, 0, 1, 1);
74 const Real time_for_fp,
int ng_cons,
int ng_vel,
75 bool fast_only,
bool vel_and_mom_synced)
77 BL_PROFILE(
"apply_bcs()");
90 if (!vel_and_mom_synced) {
103 AMREX_ALWAYS_ASSERT (ng_cons >= 1);
107 ng_cons_to_use = std::max(ng_cons, ng_vel+1);
115 FillIntermediatePatch(level, time_for_fp,
119 ng_cons_to_use, 0, cons_only, scomp_cons, ncomp_cons);
129 if (vel_and_mom_synced) {
139 ng_cons_to_use = std::max(ng_cons, ng_vel+1);
149 ng_cons_to_use = ng_cons;
157 FillIntermediatePatch(level, time_for_fp,
161 ng_cons_to_use, ng_vel, cons_only, scomp_cons, ncomp_cons);
173 if (verbose) Print() <<
"Re-making old geometry at old time : " << old_step_time << std::endl;
178 Box terrain_bx(surroundingNodes(Geom(0).Domain())); terrain_bx.grow(z_phys_nd[lev]->nGrow());
179 FArrayBox terrain_fab_old(makeSlab(terrain_bx,2,0),1);
180 FArrayBox terrain_fab_src(makeSlab(terrain_bx,2,0),1);
181 FArrayBox terrain_fab_new(makeSlab(terrain_bx,2,0),1);
183 prob->init_terrain_surface(fine_geom,terrain_fab_old,old_step_time);
184 prob->init_terrain_surface(fine_geom,terrain_fab_src,old_stage_time);
185 prob->init_terrain_surface(fine_geom,terrain_fab_new,new_stage_time);
188 for (MFIter mfi(*z_phys_nd[lev],
false); mfi.isValid(); ++mfi)
190 Box isect = terrain_fab_old.box() & (*z_phys_nd[lev])[mfi].box();
191 ( *z_phys_nd[lev])[mfi].
template copy<RunOn::Device>(terrain_fab_old,isect,0,isect,0,1);
192 (*z_phys_nd_src[lev])[mfi].
template copy<RunOn::Device>(terrain_fab_src,isect,0,isect,0,1);
193 (*z_phys_nd_new[lev])[mfi].
template copy<RunOn::Device>(terrain_fab_new,isect,0,isect,0,1);
197 make_J (fine_geom, *z_phys_nd[lev], *detJ_cc[lev]);
198 make_areas (fine_geom, *z_phys_nd[lev], *ax[lev], *ay[lev], *az[lev]);
200 if (verbose) Print() <<
"Making src geometry at old_stage_time: "
201 << std::setprecision(timeprecision) << old_stage_time << std::endl;
203 make_J (fine_geom, *z_phys_nd_src[lev], *detJ_cc_src[lev]);
204 make_areas (fine_geom, *z_phys_nd_src[lev], *ax_src[lev], *ay_src[lev], *az_src[lev]);
205 make_zcc (fine_geom, *z_phys_nd_src[lev], *z_phys_cc_src[lev]);
207 if (verbose) Print() <<
"Making new geometry at new_stage_time: "
208 << std::setprecision(timeprecision) << new_stage_time << std::endl;
210 make_J (fine_geom, *z_phys_nd_new[lev], *detJ_cc_new[lev]);
212 Real inv_dt = 1./slow_dt;
215 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
217 for (MFIter mfi(*z_t_rk[lev],TilingIfNotGPU()); mfi.isValid(); ++mfi)
219 Box gbx = mfi.growntilebox(IntVect(1,1,0));
221 const Array4<Real >& z_t_arr = z_t_rk[lev]->array(mfi);
222 const Array4<Real const>& z_nd_new_arr = z_phys_nd_new[lev]->const_array(mfi);
223 const Array4<Real const>& z_nd_old_arr = z_phys_nd[lev]->const_array(mfi);
226 amrex::ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
229 z_t_arr(i,j,k) = 0.25 * inv_dt * (z_nd_new_arr(i+1,j+1,k) - z_nd_old_arr(i+1,j+1,k)
230 +z_nd_new_arr(i ,j+1,k) - z_nd_old_arr( i,j+1,k)
231 +z_nd_new_arr(i+1,j ,k) - z_nd_old_arr(i+1,j ,k)
232 +z_nd_new_arr(i ,j ,k) - z_nd_old_arr(i ,j ,k));
239 Vector<MultiFab>& S_data, std::unique_ptr<MultiFab>& z_t_pert)
242 Box terrain_bx(surroundingNodes(Geom(0).Domain())); terrain_bx.grow(z_phys_nd[lev]->nGrow());
244 if (verbose) Print() <<
"Making geometry at start of substep time: "
245 << std::setprecision(timeprecision) << old_substep_time << std::endl;
246 FArrayBox terrain_fab_old(makeSlab(terrain_bx,2,0),1);
247 prob->init_terrain_surface(fine_geom,terrain_fab_old,old_substep_time);
250 if (verbose) Print() <<
"Making geometry for end of substep time :"
251 << std::setprecision(timeprecision) << new_substep_time << std::endl;
252 FArrayBox terrain_fab_new(makeSlab(terrain_bx,2,0),1);
253 prob->init_terrain_surface(fine_geom,terrain_fab_new,new_substep_time);
256 for (MFIter mfi(*z_phys_nd[lev],
false); mfi.isValid(); ++mfi)
258 Box isect = terrain_fab_old.box() & (*z_phys_nd[lev])[mfi].box();
259 ( *z_phys_nd[lev])[mfi].
template copy<RunOn::Device>(terrain_fab_old,isect,0,isect,0,1);
260 (*z_phys_nd_new[lev])[mfi].
template copy<RunOn::Device>(terrain_fab_new,isect,0,isect,0,1);
264 make_J (fine_geom,*z_phys_nd[lev], *detJ_cc[lev]);
267 make_J (fine_geom,*z_phys_nd_new[lev], *detJ_cc_new[lev]);
269 Real inv_dt = 1./dtau;
273 for (MFIter mfi(*z_t_rk[lev],TilingIfNotGPU()); mfi.isValid(); ++mfi)
275 Box gbx = mfi.growntilebox(IntVect(1,1,0));
277 const Array4<Real >& z_t_arr = z_t_rk[lev]->array(mfi);
278 const Array4<Real >& zp_t_arr = z_t_pert->array(mfi);
280 const Array4<Real const>& z_nd_new_arr = z_phys_nd_new[lev]->const_array(mfi);
281 const Array4<Real const>& z_nd_old_arr = z_phys_nd[lev]->const_array(mfi);
284 amrex::ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
287 zp_t_arr(i,j,k) = 0.25 * inv_dt * (z_nd_new_arr(i+1,j+1,k) - z_nd_old_arr(i+1,j+1,k)
288 +z_nd_new_arr(i ,j+1,k) - z_nd_old_arr( i,j+1,k)
289 +z_nd_new_arr(i+1,j ,k) - z_nd_old_arr(i+1,j ,k)
290 +z_nd_new_arr(i ,j ,k) - z_nd_old_arr(i ,j ,k));
292 zp_t_arr(i,j,k) -= z_t_arr(i,j,k);
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getExnergivenRTh(const amrex::Real rhotheta, const amrex::Real rdOcp, const amrex::Real qv=0.0)
Definition: ERF_EOS.H:156
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define PrimTheta_comp
Definition: ERF_IndexDefines.H:50
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
amrex::Real Real
Definition: ERF_ShocInterface.H:19
auto apply_bcs
Definition: ERF_TI_utils.H:73
auto cons_to_prim
Definition: ERF_TI_utils.H:4
auto update_terrain_substep
Definition: ERF_TI_utils.H:238
auto make_qt
Definition: ERF_TI_utils.H:52
auto update_terrain_stage
Definition: ERF_TI_utils.H:164
void make_areas(const Geometry &geom, MultiFab &z_phys_nd, MultiFab &ax, MultiFab &ay, MultiFab &az)
Definition: ERF_TerrainMetrics.cpp:558
void make_terrain_fitted_coords(int lev, const Geometry &geom, MultiFab &z_phys_nd, Vector< Real > const &z_levels_h, GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &phys_bc_type)
Definition: ERF_TerrainMetrics.cpp:46
void make_J(const Geometry &geom, MultiFab &z_phys_nd, MultiFab &detJ_cc)
Definition: ERF_TerrainMetrics.cpp:520
void make_zcc(const Geometry &geom, MultiFab &z_phys_nd, MultiFab &z_phys_cc)
Definition: ERF_TerrainMetrics.cpp:623
@ ymom
Definition: ERF_IndexDefines.H:160
@ cons
Definition: ERF_IndexDefines.H:158
@ zmom
Definition: ERF_IndexDefines.H:161
@ xmom
Definition: ERF_IndexDefines.H:159
@ rho
Definition: ERF_Kessler.H:22
@ qt
Definition: ERF_Kessler.H:27
@ ng
Definition: ERF_Morrison.H:48