244 if (elapsed_time < NOAH_time) {
return; }
246 Box domain =
m_geom.Domain();
248 Print () <<
"Noah-MP driver started at time step: " << nstep+1 << std::endl;
250 bool is_moist = (cons_in.nComp() >
RhoQ1_comp);
252 int klo = domain.smallEnd(2);
257 for (MFIter mfi(cons_in); mfi.isValid(); ++mfi, ++idb) {
259 Box bx = mfi.tilebox();
260 Box gbx = mfi.tilebox(IntVect(0,0,0),IntVect(1,1,0));
263 if (bx.smallEnd(2) != klo) {
continue; }
269 int i_lo = bx.smallEnd(0);
int i_hi = bx.bigEnd(0);
270 int j_lo = bx.smallEnd(1);
int j_hi = bx.bigEnd(1);
274 const Array4<const Real>& U_PHY = xvel_in.const_array(mfi);
275 const Array4<const Real>& V_PHY = yvel_in.const_array(mfi);
276 const Array4<const Real>& CONS = cons_in.const_array(mfi);
302 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
307 noah_input_arr(i,j,0,
NoahmpInputComp::t_phy) =
getTgivenRandRTh(CONS(i,j,k,
Rho_comp),CONS(i,j,k,
RhoTheta_comp),
qv);
316 Gpu::streamSynchronize();
319 LoopOnCpu(bx, [&] (
int i,
int j,
int ) noexcept
333 noahmpio->itimestep += 1;
334 noahmpio->DriverMain();
337 LoopOnCpu(bx, [&] (
int i,
int j,
int ) noexcept
352 ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
355 int ii = std::min(std::max(i,i_lo),i_hi);
356 int jj = std::min(std::max(j,j_lo),j_hi);
368 if (hfx_lsm >
Real(-9990.0)) {
369 t_flux_arr(i,j,k) = hfx_lsm/(CONS(ii,jj,k,
Rho_comp)*
Cp_d);
394 Print () <<
"Noah-MP driver completed" << std::endl;
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:31
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:11
constexpr amrex::Real lsm_flux_undefined
Definition: ERF_Constants.H:22
constexpr amrex::Real L_v
Definition: ERF_Constants.H:35
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getTgivenRandRTh(const amrex::Real rho, const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:46
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:81
#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(grown_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Array< FabPtr, LsmFlux_NOAHMP::NumVars > lsm_fab_flux
Definition: ERF_NOAHMP.H:241
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_output_tmp
Definition: ERF_NOAHMP.H:248
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_input_tmp
Definition: ERF_NOAHMP.H:247
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAHMP.H:244
amrex::Array< FabPtr, LsmData_NOAHMP::NumVars > lsm_fab_data
Definition: ERF_NOAHMP.H:238
amrex::Geometry m_geom
Definition: ERF_NOAHMP.H:220
@ 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:37
@ 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:45
@ tau13
Definition: ERF_NOAHMP.H:47
@ q_flux
Definition: ERF_NOAHMP.H:46
@ NumVars
Definition: ERF_NOAHMP.H:49
@ tau23
Definition: ERF_NOAHMP.H:48
@ qv
Definition: ERF_Kessler.H:29
@ hfx
Definition: ERF_NOAHMP.H:70
@ tau_ns
Definition: ERF_NOAHMP.H:73
@ tau_ew
Definition: ERF_NOAHMP.H:72
@ tsk
Definition: ERF_NOAHMP.H:74
@ albsfcdir_vis
Definition: ERF_NOAHMP.H:76
@ albsfcdif_nir
Definition: ERF_NOAHMP.H:79
@ emiss
Definition: ERF_NOAHMP.H:75
@ albsfcdif_vis
Definition: ERF_NOAHMP.H:78
@ albsfcdir_nir
Definition: ERF_NOAHMP.H:77
@ lh
Definition: ERF_NOAHMP.H:71