278 if (elapsed_time < NOAH_time) {
return; }
283 Box domain =
m_geom.Domain();
285 Print () <<
"Noah-MP driver started at time step: " << nstep+1 << std::endl;
287 bool is_moist = (cons_in.nComp() >
RhoQ1_comp);
289 int klo = domain.smallEnd(2);
294 for (MFIter mfi(cons_in); mfi.isValid(); ++mfi, ++idb) {
296 Box bx = mfi.tilebox();
297 Box gbx = mfi.tilebox(IntVect(0,0,0),IntVect(1,1,0));
300 if (bx.smallEnd(2) != klo) {
continue; }
306 int i_lo = bx.smallEnd(0);
int i_hi = bx.bigEnd(0);
307 int j_lo = bx.smallEnd(1);
int j_hi = bx.bigEnd(1);
311 const Array4<const Real>& U_PHY = xvel_in.const_array(mfi);
312 const Array4<const Real>& V_PHY = yvel_in.const_array(mfi);
313 const Array4<const Real>& CONS = cons_in.const_array(mfi);
339 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
344 noah_input_arr(i,j,0,
NoahmpInputComp::t_phy) =
getTgivenRandRTh(CONS(i,j,k,
Rho_comp),CONS(i,j,k,
RhoTheta_comp),
qv);
353 Gpu::streamSynchronize();
356 LoopOnCpu(bx, [&] (
int i,
int j,
int ) noexcept
372 noahmpio->DriverMain();
375 LoopOnCpu(bx, [&] (
int i,
int j,
int ) noexcept
390 ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
393 int ii = std::min(std::max(i,i_lo),i_hi);
394 int jj = std::min(std::max(j,j_lo),j_hi);
406 if (hfx_lsm >
Real(-9990.0)) {
407 t_flux_arr(i,j,k) = hfx_lsm/(CONS(ii,jj,k,
Rho_comp)*
Cp_d);
432 Print () <<
"Noah-MP driver completed" << std::endl;
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:44
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
constexpr amrex::Real lsm_flux_undefined
Definition: ERF_Constants.H:35
constexpr amrex::Real L_v
Definition: ERF_Constants.H:48
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:289
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_output_tmp
Definition: ERF_NOAHMP.H:296
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_input_tmp
Definition: ERF_NOAHMP.H:295
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAHMP.H:292
int m_itimestep
Definition: ERF_NOAHMP.H:270
amrex::Array< FabPtr, LsmData_NOAHMP::NumVars > lsm_fab_data
Definition: ERF_NOAHMP.H:286
amrex::Real m_dtbl
Definition: ERF_NOAHMP.H:274
amrex::Geometry m_geom
Definition: ERF_NOAHMP.H:259
@ sw_flux_dn
Definition: ERF_NOAHMP.H:33
@ sfc_emis
Definition: ERF_NOAHMP.H:27
@ sfc_alb_dir_vis
Definition: ERF_NOAHMP.H:28
@ sfc_alb_dif_nir
Definition: ERF_NOAHMP.H:31
@ lw_flux_dn
Definition: ERF_NOAHMP.H:38
@ cos_zenith_angle
Definition: ERF_NOAHMP.H:32
@ t_sfc
Definition: ERF_NOAHMP.H:26
@ sfc_alb_dir_nir
Definition: ERF_NOAHMP.H:29
@ sfc_alb_dif_vis
Definition: ERF_NOAHMP.H:30
@ t_flux
Definition: ERF_NOAHMP.H:46
@ tau13
Definition: ERF_NOAHMP.H:48
@ q_flux
Definition: ERF_NOAHMP.H:47
@ NumVars
Definition: ERF_NOAHMP.H:50
@ tau23
Definition: ERF_NOAHMP.H:49
@ qv
Definition: ERF_Kessler.H:29
@ hfx
Definition: ERF_NOAHMP.H:71
@ tau_ns
Definition: ERF_NOAHMP.H:74
@ tau_ew
Definition: ERF_NOAHMP.H:73
@ tsk
Definition: ERF_NOAHMP.H:75
@ albsfcdir_vis
Definition: ERF_NOAHMP.H:77
@ albsfcdif_nir
Definition: ERF_NOAHMP.H:80
@ emiss
Definition: ERF_NOAHMP.H:76
@ albsfcdif_vis
Definition: ERF_NOAHMP.H:79
@ albsfcdir_nir
Definition: ERF_NOAHMP.H:78
@ lh
Definition: ERF_NOAHMP.H:72