1 #ifndef ERF_CANOPY_BIOPHYSICS_H_
2 #define ERF_CANOPY_BIOPHYSICS_H_
6 #include <AMReX_MultiFab.H>
29 const amrex::MultiFab& S_data,
30 const amrex::MultiFab&
xvel,
31 const amrex::MultiFab&
yvel,
32 const amrex::MultiFab&
zvel,
33 const amrex::MultiFab* frontal_area,
34 const amrex::MultiFab& base_state,
37 BL_PROFILE(
"AddCanopyBiophysicsHeatSources");
43 const bool has_moisture = solver_choice.
moisture_type != MoistureType::None;
66 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
68 for (amrex::MFIter mfi(cell_source, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
69 const amrex::Box& box = mfi.tilebox();
71 const auto& source = cell_source.array(mfi);
72 const auto& state = S_data.const_array(mfi);
73 const auto& u =
xvel.const_array(mfi);
74 const auto& v =
yvel.const_array(mfi);
75 const auto&
w =
zvel.const_array(mfi);
76 const auto& leaf_area_density = frontal_area->const_array(mfi);
77 const auto& base = base_state.const_array(mfi);
93 const amrex::Real u_cc = myhalf_d * (u(i, j, k) + u(i+1, j, k));
94 const amrex::Real v_cc = myhalf_d * (v(i, j, k) + v(i, j+1, k));
95 const amrex::Real w_cc = myhalf_d * (
w(i, j, k) +
w(i, j, k+1));
96 const amrex::Real wind = std::sqrt(u_cc*u_cc + v_cc*v_cc + w_cc*w_cc);
98 boundary_coeff * std::sqrt(leaf_width / amrex::max(wind, min_wind));
101 two_d *
rho * cp_d * (temp_leaf - temp_air) / resistance_boundary;
103 sensible_heat * lad / (cp_d * exner);
112 rdo_rv_d * saturation_pressure /
113 amrex::max(pressure - (one_d - rdo_rv_d) * saturation_pressure, one_d);
116 amrex::max(min_stomatal_conductance * gas_constant * temp_air,
119 rho * lv_d * amrex::max(qv_saturation -
qv, zero_d) /
120 (
amrex::Real(1.075) * resistance_boundary + resistance_stomatal);
122 source(i, j, k,
RhoQ1_comp) += latent_flux * lad / lv_d;
AMREX_INLINE void AddCanopyBiophysicsHeatSources(amrex::MultiFab &cell_source, const amrex::MultiFab &S_data, const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, const amrex::MultiFab &zvel, const amrex::MultiFab *frontal_area, const amrex::MultiFab &base_state, const SolverChoice &solver_choice)
Definition: ERF_CanopyBiophysics.H:28
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:49
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
constexpr amrex::Real L_v
Definition: ERF_Constants.H:59
constexpr amrex::Real RdoRv
Definition: ERF_Constants.H:57
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
ParallelFor(fab_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);})
Real w
Definition: ERF_Plotfile2DInterpolator.cpp:22
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ pi0_comp
Definition: ERF_IndexDefines.H:78
@ p0_comp
Definition: ERF_IndexDefines.H:77
@ rho
Definition: ERF_Kessler.H:24
@ qv
Definition: ERF_Kessler.H:30
@ xvel
Definition: ERF_IndexDefines.H:215
@ zvel
Definition: ERF_IndexDefines.H:217
@ yvel
Definition: ERF_IndexDefines.H:216
Definition: ERF_DataStruct.H:634
amrex::Real forest_leaf_theta_fixed
Definition: ERF_DataStruct.H:2179
MoistureType moisture_type
Moisture or microphysics model.
Definition: ERF_DataStruct.H:2124
bool forest_biophysics_heat
Definition: ERF_DataStruct.H:2178