226 Box domain =
m_geom.Domain();
228 Print () <<
"Noah-MP driver started at time step: " << nstep+1 << std::endl;
230 bool is_moist = (cons_in.nComp() >
RhoQ1_comp);
235 for (MFIter mfi(cons_in,
false); mfi.isValid(); ++mfi, ++idb) {
237 Box bx = mfi.tilebox();
238 Box gbx = mfi.tilebox(IntVect(0,0,0),IntVect(1,1,0));
241 if (bx.smallEnd(2) != domain.smallEnd(2)) {
continue; }
243 bx.makeSlab(2,domain.smallEnd(2));
244 gbx.makeSlab(2,domain.smallEnd(2));
247 int i_lo = bx.smallEnd(0);
int i_hi = bx.bigEnd(0);
248 int j_lo = bx.smallEnd(1);
int j_hi = bx.bigEnd(1);
252 const Array4<const Real>& U_PHY = xvel_in.const_array(mfi);
253 const Array4<const Real>& V_PHY = yvel_in.const_array(mfi);
254 const Array4<const Real>& CONS = cons_in.const_array(mfi);
277 FArrayBox tmp_u_phy(bx, 1, The_Pinned_Arena());
278 FArrayBox tmp_v_phy(bx, 1, The_Pinned_Arena());
279 FArrayBox tmp_t_phy(bx, 1, The_Pinned_Arena());
280 FArrayBox tmp_qv_curr(bx, 1, The_Pinned_Arena());
281 FArrayBox tmp_p8w(bx, 1, The_Pinned_Arena());
282 FArrayBox tmp_swdown(bx, 1, The_Pinned_Arena());
283 FArrayBox tmp_glw(bx, 1, The_Pinned_Arena());
284 FArrayBox tmp_coszen(bx, 1, The_Pinned_Arena());
285 FArrayBox tmp_hfx(bx, 1, The_Pinned_Arena());
286 FArrayBox tmp_lh(bx, 1, The_Pinned_Arena());
287 FArrayBox tmp_tau_ew(bx, 1, The_Pinned_Arena());
288 FArrayBox tmp_tau_ns(bx, 1, The_Pinned_Arena());
289 FArrayBox tmp_tsk(bx, 1, The_Pinned_Arena());
290 FArrayBox tmp_emiss(bx, 1, The_Pinned_Arena());
291 FArrayBox tmp_albsfcdir_vis(bx, 1, The_Pinned_Arena());
292 FArrayBox tmp_albsfcdir_nir(bx, 1, The_Pinned_Arena());
293 FArrayBox tmp_albsfcdif_vis(bx, 1, The_Pinned_Arena());
294 FArrayBox tmp_albsfcdif_nir(bx, 1, The_Pinned_Arena());
297 auto const& tmp_u_phy_arr = tmp_u_phy.array();
298 auto const& tmp_v_phy_arr = tmp_v_phy.array();
299 auto const& tmp_t_phy_arr = tmp_t_phy.array();
300 auto const& tmp_qv_curr_arr = tmp_qv_curr.array();
301 auto const& tmp_p8w_arr = tmp_p8w.array();
302 auto const& tmp_swdown_arr = tmp_swdown.array();
303 auto const& tmp_glw_arr = tmp_glw.array();
304 auto const& tmp_coszen_arr = tmp_coszen.array();
307 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int ) noexcept
310 tmp_u_phy_arr(i,j,0) = 0.5*(U_PHY(i,j,0)+U_PHY(i+1,j ,0));
311 tmp_v_phy_arr(i,j,0) = 0.5*(V_PHY(i,j,0)+V_PHY(i ,j+1,0));
312 tmp_t_phy_arr(i,j,0) =
getTgivenRandRTh(CONS(i,j,0,
Rho_comp),CONS(i,j,0,
RhoTheta_comp),
qv);
313 tmp_qv_curr_arr(i,j,0) =
qv;
315 tmp_swdown_arr(i,j,0) = SWDOWN(i,j,0);
316 tmp_glw_arr(i,j,0) = GLW(i,j,0);
317 tmp_coszen_arr(i,j,0) = COSZEN(i,j,0);
321 Gpu::streamSynchronize();
325 const auto& h_u_arr = tmp_u_phy.const_array();
326 const auto& h_v_arr = tmp_v_phy.const_array();
327 const auto& h_t_arr = tmp_t_phy.const_array();
328 const auto& h_qv_arr = tmp_qv_curr.const_array();
329 const auto& h_p8w_arr = tmp_p8w.const_array();
330 const auto& h_swdown_arr = tmp_swdown.const_array();
331 const auto& h_glw_arr = tmp_glw.const_array();
332 const auto& h_coszen_arr = tmp_coszen.const_array();
334 LoopOnCpu(bx, [&] (
int i,
int j,
int ) noexcept
336 noahmpio->U_PHY(i,1,j) = h_u_arr(i,j,0);
337 noahmpio->V_PHY(i,1,j) = h_v_arr(i,j,0);
338 noahmpio->T_PHY(i,1,j) = h_t_arr(i,j,0);
339 noahmpio->QV_CURR(i,1,j) = h_qv_arr(i,j,0);
340 noahmpio->P8W(i,1,j) = h_p8w_arr(i,j,0);
341 noahmpio->SWDOWN(i,j) = h_swdown_arr(i,j,0);
342 noahmpio->GLW(i,j) = h_glw_arr(i,j,0);
343 noahmpio->COSZEN(i,j) = h_coszen_arr(i,j,0);
348 noahmpio->itimestep = nstep+1;
349 noahmpio->DriverMain();
352 auto h_hfx_arr = tmp_hfx.array();
353 auto h_lh_arr = tmp_lh.array();
354 auto h_tau_ew_arr = tmp_tau_ew.array();
355 auto h_tau_ns_arr = tmp_tau_ns.array();
356 auto h_tsk_arr = tmp_tsk.array();
357 auto h_emiss_arr = tmp_emiss.array();
358 auto h_albsfcdir_vis_arr = tmp_albsfcdir_vis.array();
359 auto h_albsfcdir_nir_arr = tmp_albsfcdir_nir.array();
360 auto h_albsfcdif_vis_arr = tmp_albsfcdif_vis.array();
361 auto h_albsfcdif_nir_arr = tmp_albsfcdif_nir.array();
363 LoopOnCpu(bx, [&] (
int i,
int j,
int ) noexcept
365 h_hfx_arr(i,j,0) = noahmpio->HFX(i,j);
366 h_lh_arr(i,j,0) = noahmpio->LH(i,j);
367 h_tau_ew_arr(i,j,0) = noahmpio->TAU_EW(i,j);
368 h_tau_ns_arr(i,j,0) = noahmpio->TAU_NS(i,j);
369 h_tsk_arr(i,j,0) = noahmpio->TSK(i,j);
370 h_emiss_arr(i,j,0) = noahmpio->EMISS(i,j);
371 h_albsfcdir_vis_arr(i,j,0) = noahmpio->ALBSFCDIRXY(i,1,j);
372 h_albsfcdir_nir_arr(i,j,0) = noahmpio->ALBSFCDIRXY(i,2,j);
373 h_albsfcdif_vis_arr(i,j,0) = noahmpio->ALBSFCDIFXY(i,1,j);
374 h_albsfcdif_nir_arr(i,j,0) = noahmpio->ALBSFCDIFXY(i,2,j);
378 auto const& tmp_hfx_arr = tmp_hfx.array();
379 auto const& tmp_lh_arr = tmp_lh.array();
380 auto const& tmp_tau_ew_arr = tmp_tau_ew.array();
381 auto const& tmp_tau_ns_arr = tmp_tau_ns.array();
382 auto const& tmp_tsk_arr = tmp_tsk.array();
383 auto const& tmp_emiss_arr = tmp_emiss.array();
384 auto const& tmp_albsfcdir_vis_arr = tmp_albsfcdir_vis.array();
385 auto const& tmp_albsfcdir_nir_arr = tmp_albsfcdir_nir.array();
386 auto const& tmp_albsfcdif_vis_arr = tmp_albsfcdif_vis.array();
387 auto const& tmp_albsfcdif_nir_arr = tmp_albsfcdif_nir.array();
391 ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int ) noexcept
394 int ii = std::min(std::max(i,i_lo),i_hi);
395 int jj = std::min(std::max(j,j_lo),j_hi);
398 t_flux_arr(i,j,0) = tmp_hfx_arr(ii,jj,0)/(CONS(ii,jj,0,
Rho_comp)*
Cp_d);
399 q_flux_arr(i,j,0) = tmp_lh_arr(ii,jj,0)/(CONS(ii,jj,0,
Rho_comp)*
L_v);
404 tau13_arr(i,j,0) = tmp_tau_ew_arr(ii,jj,0)/CONS(ii,jj,0,
Rho_comp);
405 tau23_arr(i,j,0) = tmp_tau_ns_arr(ii,jj,0)/CONS(ii,jj,0,
Rho_comp);
408 TSK(i,j,0) = tmp_tsk_arr(ii,jj,0);
409 EMISS(i,j,0) = tmp_emiss_arr(ii,jj,0);
410 ALBSFCDIR_VIS(i,j,0) = tmp_albsfcdir_vis_arr(ii,jj,0);
411 ALBSFCDIR_NIR(i,j,0) = tmp_albsfcdir_nir_arr(ii,jj,0);
412 ALBSFCDIF_VIS(i,j,0) = tmp_albsfcdif_vis_arr(ii,jj,0);
413 ALBSFCDIF_NIR(i,j,0) = tmp_albsfcdif_nir_arr(ii,jj,0);
421 Print () <<
"Noah-MP driver completed" << std::endl;
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:12
constexpr amrex::Real L_v
Definition: ERF_Constants.H:16
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=0.)
Definition: ERF_EOS.H:81
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getTgivenRandRTh(const amrex::Real rho, const amrex::Real rhotheta, const amrex::Real qv=0.0)
Definition: ERF_EOS.H:46
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
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+0.5) *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<=1.0) { Real dT=T_pert *(std::cos(PI *L)+1.0)/2.0;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);} } })
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Array< FabPtr, LsmFlux_NOAHMP::NumVars > lsm_fab_flux
Definition: ERF_NOAHMP.H:205
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAHMP.H:208
amrex::Array< FabPtr, LsmData_NOAHMP::NumVars > lsm_fab_data
Definition: ERF_NOAHMP.H:202
amrex::Geometry m_geom
Definition: ERF_NOAHMP.H:184
@ sw_flux_dn
Definition: ERF_NOAHMP.H:32
@ sfc_emis
Definition: ERF_NOAHMP.H:26
@ sfc_alb_dir_vis
Definition: ERF_NOAHMP.H:27
@ sfc_alb_dif_nir
Definition: ERF_NOAHMP.H:30
@ lw_flux_dn
Definition: ERF_NOAHMP.H:33
@ cos_zenith_angle
Definition: ERF_NOAHMP.H:31
@ t_sfc
Definition: ERF_NOAHMP.H:25
@ sfc_alb_dir_nir
Definition: ERF_NOAHMP.H:28
@ sfc_alb_dif_vis
Definition: ERF_NOAHMP.H:29
@ t_flux
Definition: ERF_NOAHMP.H:41
@ tau13
Definition: ERF_NOAHMP.H:43
@ q_flux
Definition: ERF_NOAHMP.H:42
@ NumVars
Definition: ERF_NOAHMP.H:45
@ tau23
Definition: ERF_NOAHMP.H:44
@ qv
Definition: ERF_Kessler.H:28