441 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))});
442 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))});
443 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))});
444 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))});
445 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))});
446 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))});
447 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))});
448 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))});
450 Table2D<Real,Order::C> lwp_tab(
lwp.data(), {0,0}, {static_cast<int>(lwp.extent(0)),static_cast<int>(lwp.extent(1))});
451 Table2D<Real,Order::C> iwp_tab(
iwp.data(), {0,0}, {static_cast<int>(iwp.extent(0)),static_cast<int>(iwp.extent(1))});
452 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))});
453 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))});
455 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))});
456 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))});
458 Table1D<Real> lat_tab(
lat.data(), {0}, {static_cast<int>(lat.extent(0))});
459 Table1D<Real> lon_tab(
lon.data(), {0}, {static_cast<int>(lon.extent(0))});
460 Table1D<Real> t_sfc_tab(
t_sfc.data(), {0}, {static_cast<int>(t_sfc.extent(0))});
464 const bool has_lsm =
m_lsm;
465 const bool has_lat =
m_lat;
466 const bool has_lon =
m_lon;
467 const bool has_surflayer = (t_surf);
475 for (MFIter mfi(*
m_cons_in); mfi.isValid(); ++mfi) {
476 const auto& vbx = mfi.validbox();
477 const int nx = vbx.length(0);
478 const int imin = vbx.smallEnd(0);
479 const int jmin = vbx.smallEnd(1);
481 const Array4<const Real>& cons_arr =
m_cons_in->const_array(mfi);
483 Array4<const Real>{};
484 const Array4<const Real>& lat_arr = (
m_lat) ?
m_lat->const_array(mfi) :
485 Array4<const Real>{};
486 const Array4<const Real>& lon_arr = (
m_lon) ?
m_lon->const_array(mfi) :
487 Array4<const Real>{};
488 ParallelFor(vbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
491 const int icol = (j-jmin)*nx + (i-imin) +
offset;
499 Real qi = (ice) ? std::max(cons_arr(i,j,k,
RhoQ3_comp)/r,0.0) : 0.0;
505 Real dz_k = (z_arr) ? 0.125 * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
506 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
507 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
508 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : 0.5*
dz;
509 Real dz_km1 = (z_arr) ? 0.125 * ( (z_arr(i ,j ,k ) - z_arr(i ,j ,k-1))
510 + (z_arr(i+1,j ,k ) - z_arr(i+1,j ,k-1))
511 + (z_arr(i ,j+1,k ) - z_arr(i ,j+1,k-1))
512 + (z_arr(i+1,j+1,k ) - z_arr(i+1,j+1,k-1)) ) : 0.5*
dz;
513 Real r_avg = (dz_k*r + dz_km1*r_lo ) / (dz_k + dz_km1);
514 Real rt_avg = (dz_k*rt + dz_km1*rt_lo) / (dz_k + dz_km1);
515 Real qv_avg = (dz_k*
qv + dz_km1*qv_lo) / (dz_k + dz_km1);
518 r_lay_tab(icol,ilay) = r;
522 z_del_tab(icol,ilay) = (z_arr) ? 0.25 * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
523 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
524 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
525 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) :
dz;
526 qv_lay_tab(icol,ilay) =
qv;
527 qc_lay_tab(icol,ilay) =
qc;
528 qi_lay_tab(icol,ilay) = qi;
529 cldfrac_tot_tab(icol,ilay) = ((
qc+qi)>0.0) ? 1. : 0.;
532 lwp_tab(icol,ilay) = 0.0;
533 iwp_tab(icol,ilay) = 0.0;
537 eff_radius_qc_tab(icol,ilay) = (
qc>0.0) ? 10.0 : 0.0;
538 eff_radius_qi_tab(icol,ilay) = (qi>0.0) ? 25.0 : 0.0;
543 if (ilay==(nlay-1)) {
546 Real qv_hi = (moist) ? std::max(cons_arr(i,j,k+1,
RhoQ1_comp)/r_hi,0.0) : 0.0;
547 Real dz_kp1 = (z_arr) ? 0.125 * ( (z_arr(i ,j ,k+2) - z_arr(i ,j ,k+1))
548 + (z_arr(i+1,j ,k+2) - z_arr(i+1,j ,k+1))
549 + (z_arr(i ,j+1,k+2) - z_arr(i ,j+1,k+1))
550 + (z_arr(i+1,j+1,k+2) - z_arr(i+1,j+1,k+1)) ) : 0.5*
dz;
551 r_avg = (dz_k*r + dz_kp1*r_hi ) / (dz_k + dz_kp1);
552 rt_avg = (dz_k*rt + dz_kp1*rt_hi) / (dz_k + dz_kp1);
553 qv_avg = (dz_k*
qv + dz_kp1*qv_hi) / (dz_k + dz_kp1);
560 lat_tab(icol) = (has_lat) ? lat_arr(i,j,0) : cons_lat;
561 lon_tab(icol) = (has_lon) ? lon_arr(i,j,0) : cons_lon;
568 if (!has_lsm && !has_surflayer) {
570 Kokkos::deep_copy(
t_sfc, rad_t_sfc);
583 Kokkos::deep_copy(
lw_src , 0.0 );
588 Vector<Real> rrtmgp_default_vals = {rad_t_sfc, 0.98,
591 for (
int ivar(0); ivar<lsm_input_ptrs.size(); ivar++) {
592 auto rrtmgp_default_val = rrtmgp_default_vals[ivar];
593 auto rrtmgp_to_fill_k = rrtmgp_in_vars[ivar];
594 amrex::Table1D<amrex::Real> rrtmgp_to_fill(rrtmgp_to_fill_k.data(),
595 0, rrtmgp_to_fill_k.extent(0));
596 for (MFIter mfi(*
m_cons_in); mfi.isValid(); ++mfi) {
597 const auto& vbx = mfi.validbox();
598 const auto& sbx = makeSlab(vbx,2,vbx.smallEnd(2));
599 const int nx = vbx.length(0);
600 const int imin = vbx.smallEnd(0);
601 const int jmin = vbx.smallEnd(1);
603 const Array4<const int>& lmask_arr = (lmask) ? lmask->const_array(mfi) :
604 Array4<const int> {};
605 const Array4<const Real>& tsurf_arr = (t_surf) ? t_surf->const_array(mfi) :
606 Array4<const Real> {};
607 const Array4<const Real>& lsm_in_arr = (lsm_input_ptrs[ivar]) ? lsm_input_ptrs[ivar]->const_array(mfi) :
608 Array4<const Real> {};
609 ParallelFor(sbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
612 const int icol = (j-jmin)*nx + (i-imin) +
offset;
615 bool is_land = (lmask_arr) ? lmask_arr(i,j,k) : 1;
618 bool valid_lsm_data{
false};
619 if (lsm_in_arr) { valid_lsm_data = (lsm_in_arr(i,j,k) >= 0.); }
622 if (is_land && valid_lsm_data) {
623 rrtmgp_to_fill(icol) = lsm_in_arr(i,j,k);
626 else if (tsurf_arr && (ivar==0)) {
627 rrtmgp_to_fill(icol) = tsurf_arr(i,j,k);
631 rrtmgp_to_fill(icol) = rrtmgp_default_val;
636 Kokkos::deep_copy(
lw_src, 0.0 );
640 Kokkos::parallel_for(Kokkos::RangePolicy(0, ncol),
641 KOKKOS_LAMBDA (
int icol)
643 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
const Real dz
Definition: ERF_InitCustomPert_Bubble.H:25
amrex::MultiFab * m_lon
Definition: ERF_Radiation.H:271
amrex::MultiFab * m_z_phys
Definition: ERF_Radiation.H:267
amrex::Geometry m_geom
Definition: ERF_Radiation.H:223
amrex::MultiFab * m_lat
Definition: ERF_Radiation.H:270
@ qv
Definition: ERF_Kessler.H:28
@ qc
Definition: ERF_SatAdj.H:36