445 Table2D<Real,Order::C> r_lay_tab(
r_lay.data(), {0,0}, {static_cast<int>(r_lay.extent(0)),static_cast<int>(r_lay.extent(1))});
446 Table2D<Real,Order::C> p_lay_tab(
p_lay.data(), {0,0}, {static_cast<int>(p_lay.extent(0)),static_cast<int>(p_lay.extent(1))});
447 Table2D<Real,Order::C> t_lay_tab(
t_lay.data(), {0,0}, {static_cast<int>(t_lay.extent(0)),static_cast<int>(t_lay.extent(1))});
448 Table2D<Real,Order::C> z_del_tab(
z_del.data(), {0,0}, {static_cast<int>(z_del.extent(0)),static_cast<int>(z_del.extent(1))});
449 Table2D<Real,Order::C> qv_lay_tab(
qv_lay.data(), {0,0}, {static_cast<int>(qv_lay.extent(0)),static_cast<int>(qv_lay.extent(1))});
450 Table2D<Real,Order::C> qc_lay_tab(
qc_lay.data(), {0,0}, {static_cast<int>(qc_lay.extent(0)),static_cast<int>(qc_lay.extent(1))});
451 Table2D<Real,Order::C> qi_lay_tab(
qi_lay.data(), {0,0}, {static_cast<int>(qi_lay.extent(0)),static_cast<int>(qi_lay.extent(1))});
452 Table2D<Real,Order::C> cldfrac_tot_tab(
cldfrac_tot.data(), {0,0}, {static_cast<int>(cldfrac_tot.extent(0)),static_cast<int>(cldfrac_tot.extent(1))});
454 Table2D<Real,Order::C> lwp_tab(
lwp.data(), {0,0}, {static_cast<int>(lwp.extent(0)),static_cast<int>(lwp.extent(1))});
455 Table2D<Real,Order::C> iwp_tab(
iwp.data(), {0,0}, {static_cast<int>(iwp.extent(0)),static_cast<int>(iwp.extent(1))});
456 Table2D<Real,Order::C> eff_radius_qc_tab(
eff_radius_qc.data(), {0,0}, {static_cast<int>(eff_radius_qc.extent(0)),static_cast<int>(eff_radius_qc.extent(1))});
457 Table2D<Real,Order::C> eff_radius_qi_tab(
eff_radius_qi.data(), {0,0}, {static_cast<int>(eff_radius_qi.extent(0)),static_cast<int>(eff_radius_qi.extent(1))});
459 Table2D<Real,Order::C> p_lev_tab(
p_lev.data(), {0,0}, {static_cast<int>(p_lev.extent(0)),static_cast<int>(p_lev.extent(1))});
460 Table2D<Real,Order::C> t_lev_tab(
t_lev.data(), {0,0}, {static_cast<int>(t_lev.extent(0)),static_cast<int>(t_lev.extent(1))});
462 Table1D<Real> lat_tab(
lat.data(), {0}, {static_cast<int>(lat.extent(0))});
463 Table1D<Real> lon_tab(
lon.data(), {0}, {static_cast<int>(lon.extent(0))});
464 Table1D<Real> t_sfc_tab(
t_sfc.data(), {0}, {static_cast<int>(t_sfc.extent(0))});
468 const bool has_lsm =
m_lsm;
469 const bool has_lat =
m_lat;
470 const bool has_lon =
m_lon;
471 const bool has_surflayer = (t_surf);
479 for (MFIter mfi(*
m_cons_in); mfi.isValid(); ++mfi) {
480 const auto& vbx = mfi.validbox();
481 const int nx = vbx.length(0);
482 const int imin = vbx.smallEnd(0);
483 const int jmin = vbx.smallEnd(1);
485 const Array4<const Real>& cons_arr =
m_cons_in->const_array(mfi);
487 Array4<const Real>{};
488 const Array4<const Real>& lat_arr = (
m_lat) ?
m_lat->const_array(mfi) :
489 Array4<const Real>{};
490 const Array4<const Real>& lon_arr = (
m_lon) ?
m_lon->const_array(mfi) :
491 Array4<const Real>{};
492 ParallelFor(vbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
495 const int icol = (j-jmin)*nx + (i-imin) +
offset;
503 Real qi = (ice) ? std::max(cons_arr(i,j,k,
RhoQ3_comp)/r,0.0) : 0.0;
509 Real r_avg = 0.5 * (r + r_lo);
510 Real rt_avg = 0.5 * (rt + rt_lo);
511 Real qv_avg = 0.5 * (
qv + qv_lo);
514 r_lay_tab(icol,ilay) = r;
518 z_del_tab(icol,ilay) = (z_arr) ? 0.25 * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
519 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
520 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
521 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz;
522 qv_lay_tab(icol,ilay) =
qv;
523 qc_lay_tab(icol,ilay) =
qc;
524 qi_lay_tab(icol,ilay) = qi;
525 cldfrac_tot_tab(icol,ilay) = ((
qc+qi)>0.0) ? 1. : 0.;
528 lwp_tab(icol,ilay) = 0.0;
529 iwp_tab(icol,ilay) = 0.0;
532 eff_radius_qc_tab(icol,ilay) = (
qc>0.0) ? 10.0e-6 : 0.0;
533 eff_radius_qi_tab(icol,ilay) = (qi>0.0) ? 25.0e-6 : 0.0;
538 if (ilay==(nlay-1)) {
541 Real qv_hi = (moist) ? std::max(cons_arr(i,j,k+1,
RhoQ1_comp)/r_hi,0.0) : 0.0;
542 r_avg = 0.5 * (r + r_hi);
543 rt_avg = 0.5 * (rt + rt_hi);
544 qv_avg = 0.5 * (
qv + qv_hi);
551 lat_tab(icol) = (has_lat) ? lat_arr(i,j,0) : cons_lat;
552 lon_tab(icol) = (has_lon) ? lon_arr(i,j,0) : cons_lon;
559 if (!has_lsm && !has_surflayer) {
561 Kokkos::deep_copy(
t_sfc, rad_t_sfc);
574 Kokkos::deep_copy(
lw_src , 0.0 );
579 Vector<Real> rrtmgp_default_vals = {rad_t_sfc, 0.98,
582 for (
int ivar(0); ivar<lsm_input_ptrs.size(); ivar++) {
583 auto rrtmgp_default_val = rrtmgp_default_vals[ivar];
584 auto rrtmgp_to_fill = rrtmgp_in_vars[ivar];
585 for (MFIter mfi(*
m_cons_in); mfi.isValid(); ++mfi) {
586 const auto& vbx = mfi.validbox();
587 const auto& sbx = makeSlab(vbx,2,vbx.smallEnd(2));
588 const int nx = vbx.length(0);
589 const int imin = vbx.smallEnd(0);
590 const int jmin = vbx.smallEnd(1);
592 const Array4<const int>& lmask_arr = (lmask) ? lmask->const_array(mfi) :
593 Array4<const int> {};
594 const Array4<const Real>& tsurf_arr = (t_surf) ? t_surf->const_array(mfi) :
595 Array4<const Real> {};
596 const Array4<const Real>& lsm_in_arr = (lsm_input_ptrs[ivar]) ? lsm_input_ptrs[ivar]->const_array(mfi) :
597 Array4<const Real> {};
598 ParallelFor(sbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
601 const int icol = (j-jmin)*nx + (i-imin) +
offset;
604 bool is_land = (lmask_arr) ? lmask_arr(i,j,k) : 1;
607 bool valid_lsm_data{
false};
608 if (lsm_in_arr) { valid_lsm_data = (lsm_in_arr(i,j,k) > 0.); }
611 if (is_land && valid_lsm_data) {
612 rrtmgp_to_fill(icol) = lsm_in_arr(i,j,k);
615 else if (tsurf_arr && (ivar==0)) {
616 rrtmgp_to_fill(icol) = tsurf_arr(i,j,k);
620 rrtmgp_to_fill(icol) = rrtmgp_default_val;
625 Kokkos::deep_copy(
lw_src, 0.0 );
629 Kokkos::parallel_for(Kokkos::RangePolicy(0, ncol),
630 KOKKOS_LAMBDA (
int icol)
632 t_lev_tab(icol,0) = t_sfc_tab(icol);
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 RhoQ2_comp
Definition: ERF_IndexDefines.H:43
#define RhoQ3_comp
Definition: ERF_IndexDefines.H:44
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
amrex::MultiFab * m_lon
Definition: ERF_Radiation.H:272
amrex::MultiFab * m_z_phys
Definition: ERF_Radiation.H:268
amrex::Geometry m_geom
Definition: ERF_Radiation.H:227
amrex::MultiFab * m_lat
Definition: ERF_Radiation.H:271
@ qv
Definition: ERF_Kessler.H:28
@ qc
Definition: ERF_SatAdj.H:36