From 649d4e7b428917a561d2777db8d2f5b846885fc6 Mon Sep 17 00:00:00 2001 From: "Aaron M. Lattanzi" <103702284+AMLattanzi@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:45:43 -0700 Subject: [PATCH 1/9] This passed a simple unit test. (#1639) --- Docs/sphinx_doc/MOST.rst | 6 +- Source/BoundaryConditions/ABLMost.H | 25 +- Source/BoundaryConditions/ABLMost.cpp | 30 ++- Source/BoundaryConditions/ERF_FillPatch.cpp | 1 - Source/BoundaryConditions/MOSTStress.H | 246 +++++++++++++++++++- Source/ERF.H | 4 + Source/ERF.cpp | 20 +- 7 files changed, 304 insertions(+), 28 deletions(-) diff --git a/Docs/sphinx_doc/MOST.rst b/Docs/sphinx_doc/MOST.rst index e644529a1..cbd33578d 100644 --- a/Docs/sphinx_doc/MOST.rst +++ b/Docs/sphinx_doc/MOST.rst @@ -149,13 +149,13 @@ In ERF, when the MOST boundary condition is applied, velocity and temperature in MOST Inputs ~~~~~~~~~~~~~~~~~~~ -To evaluate the fluxes with MOST, the surface rougness parameter :math:`z_{0}` must be specified. This quantity may be considered a constant or may be parameterized through the friction velocity :math:`u_{\star}`. ERF supports three methods for parameterizing the surface roughness: ``constant``, ``charnock``, and ``modified_charnock``. The latter two methods parameterize :math:`z_{0} = f(u_{\star})` and are described in `Jimenez & Dudhia, American Meteorological Society, 2018 `_. The rougness calculation method may be specified with +To evaluate the fluxes with MOST, the surface rougness parameter :math:`z_{0}` must be specified. This quantity may be considered a constant or may be parameterized through the friction velocity :math:`u_{\star}`. ERF supports four methods for parameterizing the surface roughness: ``constant``, ``charnock``, ``modified_charnock``, and ``wave_coupled``. The latter three methods parameterize :math:`z_{0} = f(u_{\star})` and are described in `Jimenez & Dudhia, American Meteorological Society, 2018 `_ and `Warner et. al, Ocean Modelling, 2010 `_. The rougness calculation method may be specified with :: - erf.most.roughness_type = STRING #Z_0 type (constant, charnock, modified_charnock) + erf.most.roughness_type = STRING #Z_0 type (constant, charnock, modified_charnock, wave_couples) -If the ``charnock`` method is employed, the :math:`a` constant may be specified with ``erf.most.charnock_constant`` (defaults to 0.0185). If the ``modified_charnock`` method is employed, the depth :math:`d` may be specified with ``erf.most.modified_charnock_depth`` (defaults to 30 m). +If the ``charnock`` method is employed, the :math:`a` constant may be specified with ``erf.most.charnock_constant`` (defaults to 0.0185). If the ``modified_charnock`` method is employed, the depth :math:`d` may be specified with ``erf.most.modified_charnock_depth`` (defaults to 30 m). If the ``wave_coupled`` method is employed, the user must provide wave height and mean wavelength data. When computing an average :math:`\overline{\phi}` for the MOST boundary, where :math:`\phi` denotes a generic variable, ERF supports a variety of approaches. Specifically, ``planar averages`` and ``local region averages`` may be computed with or without ``time averaging``. With each averaging methodology, the query point :math:`z` may be determined from the following procedures: specified vertical distance :math:`z_{ref}` from the bottom surface, specified :math:`k_{index}`, or (when employing terrain-fit coordinates) specified normal vector length :math:`z_{ref}`. The available inputs to the MOST boundary and their associated data types are diff --git a/Source/BoundaryConditions/ABLMost.H b/Source/BoundaryConditions/ABLMost.H index 1e57be63f..855377953 100644 --- a/Source/BoundaryConditions/ABLMost.H +++ b/Source/BoundaryConditions/ABLMost.H @@ -39,6 +39,9 @@ public: amrex::Vector>>& lmask_lev, amrex::Vector> lsm_data, amrex::Vector> lsm_flux, + amrex::Vector>& Hwave, + amrex::Vector>& Lwave, + amrex::Vector>& eddyDiffs, amrex::Real start_bdy_time = 0.0, amrex::Real bdy_time_interval = 0.0) : m_exp_most(use_exp_most), @@ -117,6 +120,8 @@ public: } else if (rough_string == "modified_charnock") { rough_type = RoughCalcType::MODIFIED_CHARNOCK; pp.query("most.modified_charnock_depth",depth); + } else if (rough_string == "wave_coupled") { + rough_type = RoughCalcType::WAVE_COUPLED; } else { amrex::Abort("Undefined MOST roughness type!"); } @@ -156,6 +161,16 @@ public: } } + // Get pointers to wave data + m_Hwave_lev.resize(nlevs); + m_Lwave_lev.resize(nlevs); + m_eddyDiffs_lev.resize(nlevs); + for (int lev(0); lev @@ -235,7 +249,6 @@ public: amrex::MultiFab* xzmom_flux, amrex::MultiFab* zxmom_flux, amrex::MultiFab* yzmom_flux, amrex::MultiFab* zymom_flux, amrex::MultiFab* heat_flux, - amrex::MultiFab* eddyDiffs, amrex::MultiFab* z_phys, const amrex::Real& dz_no_terrain, const FluxCalc& flux_comp); @@ -306,7 +319,8 @@ public: enum struct RoughCalcType { CONSTANT = 0, ///< Constant z0 CHARNOCK, - MODIFIED_CHARNOCK + MODIFIED_CHARNOCK, + WAVE_COUPLED }; FluxCalcType flux_type{FluxCalcType::MOENG}; @@ -316,7 +330,7 @@ public: private: bool use_moisture; bool m_exp_most = false; - amrex::Real z0_const; + amrex::Real z0_const{0.1}; amrex::Real surf_temp; amrex::Real surf_heating_rate{0}; amrex::Real surf_temp_flux{0}; @@ -341,6 +355,9 @@ private: amrex::Vector> m_lmask_lev; amrex::Vector> m_lsm_data_lev; amrex::Vector> m_lsm_flux_lev; + amrex::Vector m_Hwave_lev; + amrex::Vector m_Lwave_lev; + amrex::Vector m_eddyDiffs_lev; }; #endif /* ABLMOST_H */ diff --git a/Source/BoundaryConditions/ABLMost.cpp b/Source/BoundaryConditions/ABLMost.cpp index a9ebbcb7f..0f57c60c2 100644 --- a/Source/BoundaryConditions/ABLMost.cpp +++ b/Source/BoundaryConditions/ABLMost.cpp @@ -36,9 +36,12 @@ ABLMost::update_fluxes (const int& lev, } else if (rough_type == RoughCalcType::CHARNOCK) { surface_flux_charnock most_flux(m_ma.get_zref(), surf_temp_flux, cnk_a); compute_fluxes(lev, max_iters, most_flux); - } else { + } else if (rough_type == RoughCalcType::MODIFIED_CHARNOCK) { surface_flux_mod_charnock most_flux(m_ma.get_zref(), surf_temp_flux, depth); compute_fluxes(lev, max_iters, most_flux); + } else { + surface_flux_wave_coupled most_flux(m_ma.get_zref(), surf_temp_flux); + compute_fluxes(lev, max_iters, most_flux); } } else if (theta_type == ThetaCalcType::SURFACE_TEMPERATURE) { update_surf_temp(time); @@ -48,9 +51,12 @@ ABLMost::update_fluxes (const int& lev, } else if (rough_type == RoughCalcType::CHARNOCK) { surface_temp_charnock most_flux(m_ma.get_zref(), surf_temp_flux, cnk_a); compute_fluxes(lev, max_iters, most_flux); - } else { + } else if (rough_type == RoughCalcType::MODIFIED_CHARNOCK) { surface_temp_mod_charnock most_flux(m_ma.get_zref(), surf_temp_flux, depth); compute_fluxes(lev, max_iters, most_flux); + } else { + surface_temp_wave_coupled most_flux(m_ma.get_zref(), surf_temp_flux); + compute_fluxes(lev, max_iters, most_flux); } } else { if (rough_type == RoughCalcType::CONSTANT) { @@ -59,9 +65,12 @@ ABLMost::update_fluxes (const int& lev, } else if (rough_type == RoughCalcType::CHARNOCK) { adiabatic_charnock most_flux(m_ma.get_zref(), surf_temp_flux, cnk_a); compute_fluxes(lev, max_iters, most_flux); - } else { + } else if (rough_type == RoughCalcType::MODIFIED_CHARNOCK) { adiabatic_mod_charnock most_flux(m_ma.get_zref(), surf_temp_flux, depth); compute_fluxes(lev, max_iters, most_flux); + } else { + adiabatic_wave_coupled most_flux(m_ma.get_zref(), surf_temp_flux); + compute_fluxes(lev, max_iters, most_flux); } } // theta flux } else if (flux_type == FluxCalcType::CUSTOM) { @@ -102,10 +111,16 @@ ABLMost::compute_fluxes (const int& lev, const auto umm_arr = umm_ptr->array(mfi); const auto z0_arr = z_0[lev].array(); + // Wave properties if they exist + const auto Hwave_arr = (m_Hwave_lev[lev]) ? m_Hwave_lev[lev]->array(mfi) : Array4 {}; + const auto Lwave_arr = (m_Lwave_lev[lev]) ? m_Lwave_lev[lev]->array(mfi) : Array4 {}; + const auto eta_arr = m_eddyDiffs_lev[lev]->array(mfi); + ParallelFor(gtbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { most_flux.iterate_flux(i, j, k, max_iters, z0_arr, umm_arr, tm_arr, - u_star_arr, t_star_arr, t_surf_arr, olen_arr); + u_star_arr, t_star_arr, t_surf_arr, olen_arr, + Hwave_arr, Lwave_arr, eta_arr); }); } } @@ -124,7 +139,6 @@ ABLMost::impose_most_bcs (const int& lev, MultiFab* xzmom_flux, MultiFab* zxmom_flux, MultiFab* yzmom_flux, MultiFab* zymom_flux, MultiFab* heat_flux, - MultiFab* eddyDiffs, MultiFab* z_phys) { const int klo = 0; @@ -134,7 +148,6 @@ ABLMost::impose_most_bcs (const int& lev, xzmom_flux, zxmom_flux, yzmom_flux, zymom_flux, heat_flux, - eddyDiffs, z_phys, m_geom[lev].CellSize(2), flux_comp); } else if (flux_type == FluxCalcType::DONELAN) { donelan_flux flux_comp(klo); @@ -142,7 +155,6 @@ ABLMost::impose_most_bcs (const int& lev, xzmom_flux, zxmom_flux, yzmom_flux, zymom_flux, heat_flux, - eddyDiffs, z_phys, m_geom[lev].CellSize(2), flux_comp); } else { custom_flux flux_comp(klo); @@ -150,7 +162,6 @@ ABLMost::impose_most_bcs (const int& lev, xzmom_flux, zxmom_flux, yzmom_flux, zymom_flux, heat_flux, - eddyDiffs, z_phys, m_geom[lev].CellSize(2), flux_comp); } } @@ -171,7 +182,6 @@ ABLMost::compute_most_bcs (const int& lev, MultiFab* xzmom_flux, MultiFab* zxmom_flux, MultiFab* yzmom_flux, MultiFab* zymom_flux, MultiFab* heat_flux, - MultiFab* eddyDiffs, MultiFab* z_phys, const Real& dz_no_terrain, const FluxCalc& flux_comp) @@ -201,7 +211,7 @@ ABLMost::compute_most_bcs (const int& lev, auto t32_arr = (zymom_flux && m_exp_most) ? zymom_flux->array(mfi) : Array4{}; auto hfx_arr = (m_exp_most) ? heat_flux->array(mfi) : Array4{}; - const auto eta_arr = eddyDiffs->array(mfi); + const auto eta_arr = m_eddyDiffs_lev[lev]->array(mfi); const auto zphys_arr = (z_phys) ? z_phys->const_array(mfi) : Array4{}; diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index a63253297..dc630079b 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -386,7 +386,6 @@ ERF::FillIntermediatePatch (int lev, Real time, Tau13_lev[lev].get(), Tau31_lev[lev].get(), Tau23_lev[lev].get(), Tau32_lev[lev].get(), SFS_hfx3_lev[lev].get(), - eddyDiffs_lev[lev].get(), z_phys_nd[lev].get()); } diff --git a/Source/BoundaryConditions/MOSTStress.H b/Source/BoundaryConditions/MOSTStress.H index 2e4a45649..7f4931718 100644 --- a/Source/BoundaryConditions/MOSTStress.H +++ b/Source/BoundaryConditions/MOSTStress.H @@ -88,7 +88,10 @@ struct adiabatic const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& /*t_surf_arr*/, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { u_star_arr(i,j,k) = mdata.kappa * umm_arr(i,j,k) / std::log(mdata.zref / z0_arr(i,j,k)); t_star_arr(i,j,k) = 0.0; @@ -128,7 +131,10 @@ struct adiabatic_charnock const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& /*t_surf_arr*/, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -181,7 +187,10 @@ struct adiabatic_mod_charnock const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& /*t_surf_arr*/, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -206,6 +215,65 @@ private: }; +/** + * Adiabatic with wave-coupled roughness + */ +struct adiabatic_wave_coupled +{ + adiabatic_wave_coupled (amrex::Real zref, + amrex::Real flux) + { + mdata.zref = zref; + mdata.surf_temp_flux = flux; + } + + AMREX_GPU_DEVICE + AMREX_FORCE_INLINE + void + iterate_flux (const int& i, + const int& j, + const int& k, + const int& max_iters, + const amrex::Array4& z0_arr, + const amrex::Array4& umm_arr, + const amrex::Array4& /*tm_arr*/, + const amrex::Array4& u_star_arr, + const amrex::Array4& t_star_arr, + const amrex::Array4& /*t_surf_arr*/, + const amrex::Array4& olen_arr, + const amrex::Array4& Hwave_arr, + const amrex::Array4& Lwave_arr, + const amrex::Array4& eta_arr) const + { + int iter = 0; + amrex::Real ustar = 0.0; + amrex::Real z0 = 0.0; + int ie, je; + ie = i < lbound(eta_arr).x ? lbound(eta_arr).x : i; + je = j < lbound(eta_arr).y ? lbound(eta_arr).y : j; + ie = ie > ubound(eta_arr).x ? ubound(eta_arr).x : ie; + je = je > ubound(eta_arr).y ? ubound(eta_arr).y : je; + u_star_arr(i,j,k) = mdata.kappa * umm_arr(i,j,k) / std::log(mdata.zref / z0_arr(i,j,k)); + do { + ustar = u_star_arr(i,j,k); + z0 = 1200.0 * Hwave_arr(i,j,k) * std::pow( Hwave_arr(i,j,k)/Lwave_arr(i,j,k), 4.5 ) + + 0.11 * eta_arr(ie,je,k,EddyDiff::Mom_v) / ustar; + u_star_arr(i,j,k) = mdata.kappa * umm_arr(i,j,k) / std::log(mdata.zref / z0); + ++iter; + } while ((std::abs(u_star_arr(i,j,k) - ustar) > tol) && iter <= max_iters); + + t_star_arr(i,j,k) = 0.0; + olen_arr(i,j,k) = 1.0e16; + z0_arr(i,j,k) = z0; + } + +private: + most_data mdata; + similarity_funs sfuns; + const amrex::Real tol = 1.0e-5; +}; + + /** * Surface flux with constant roughness */ @@ -231,7 +299,10 @@ struct surface_flux const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& t_surf_arr, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -291,7 +362,10 @@ struct surface_flux_charnock const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& t_surf_arr, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -355,7 +429,10 @@ struct surface_flux_mod_charnock const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& t_surf_arr, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -391,6 +468,76 @@ private: }; +/** + * Surface flux with wave-coupled roughness + */ +struct surface_flux_wave_coupled +{ + surface_flux_wave_coupled (amrex::Real zref, + amrex::Real flux) + { + mdata.zref = zref; + mdata.surf_temp_flux = flux; + } + + AMREX_GPU_DEVICE + AMREX_FORCE_INLINE + void + iterate_flux (const int& i, + const int& j, + const int& k, + const int& max_iters, + const amrex::Array4& z0_arr, + const amrex::Array4& umm_arr, + const amrex::Array4& tm_arr, + const amrex::Array4& u_star_arr, + const amrex::Array4& t_star_arr, + const amrex::Array4& t_surf_arr, + const amrex::Array4& olen_arr, + const amrex::Array4& Hwave_arr, + const amrex::Array4& Lwave_arr, + const amrex::Array4& eta_arr) const + { + int iter = 0; + amrex::Real ustar = 0.0; + amrex::Real z0 = 0.0; + amrex::Real zeta = 0.0; + amrex::Real psi_m = 0.0; + amrex::Real psi_h = 0.0; + amrex::Real Olen = 0.0; + int ie, je; + ie = i < lbound(eta_arr).x ? lbound(eta_arr).x : i; + je = j < lbound(eta_arr).y ? lbound(eta_arr).y : j; + ie = ie > ubound(eta_arr).x ? ubound(eta_arr).x : ie; + je = je > ubound(eta_arr).y ? ubound(eta_arr).y : je; + u_star_arr(i,j,k) = mdata.kappa * umm_arr(i,j,k) / std::log(mdata.zref / z0_arr(i,j,k)); + do { + ustar = u_star_arr(i,j,k); + z0 = 1200.0 * Hwave_arr(i,j,k) * std::pow( Hwave_arr(i,j,k)/Lwave_arr(i,j,k), 4.5 ) + + 0.11 * eta_arr(ie,je,k,EddyDiff::Mom_v) / ustar; + Olen = -ustar * ustar * ustar * tm_arr(i,j,k) / + (mdata.kappa * mdata.gravity * mdata.surf_temp_flux); + zeta = mdata.zref / Olen; + psi_m = sfuns.calc_psi_m(zeta); + psi_h = sfuns.calc_psi_h(zeta); + u_star_arr(i,j,k) = mdata.kappa * umm_arr(i,j,k) / (std::log(mdata.zref / z0) - psi_m); + ++iter; + } while ((std::abs(u_star_arr(i,j,k) - ustar) > tol) && iter <= max_iters); + + t_surf_arr(i,j,k) = mdata.surf_temp_flux * (std::log(mdata.zref / z0) - psi_h) / + (u_star_arr(i,j,k) * mdata.kappa) + tm_arr(i,j,k); + t_star_arr(i,j,k) = -mdata.surf_temp_flux / u_star_arr(i,j,k); + olen_arr(i,j,k) = Olen; + z0_arr(i,j,k) = z0; + } + +private: + most_data mdata; + similarity_funs sfuns; + const amrex::Real tol = 1.0e-5; +}; + + /** * Surface temperature with constant roughness */ @@ -416,7 +563,10 @@ struct surface_temp const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& t_surf_arr, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -478,7 +628,10 @@ struct surface_temp_charnock const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& t_surf_arr, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -544,7 +697,10 @@ struct surface_temp_mod_charnock const amrex::Array4& u_star_arr, const amrex::Array4& t_star_arr, const amrex::Array4& t_surf_arr, - const amrex::Array4& olen_arr) const + const amrex::Array4& olen_arr, + const amrex::Array4& /*Hwave_arr*/, + const amrex::Array4& /*Lwave_arr*/, + const amrex::Array4& /*eta_arr*/) const { int iter = 0; amrex::Real ustar = 0.0; @@ -582,6 +738,78 @@ private: }; +/** + * Surface temperature with wave-coupled roughness + */ +struct surface_temp_wave_coupled +{ + surface_temp_wave_coupled (amrex::Real zref, + amrex::Real flux) + { + mdata.zref = zref; + mdata.surf_temp_flux = flux; + } + + AMREX_GPU_DEVICE + AMREX_FORCE_INLINE + void + iterate_flux (const int& i, + const int& j, + const int& k, + const int& max_iters, + const amrex::Array4& z0_arr, + const amrex::Array4& umm_arr, + const amrex::Array4& tm_arr, + const amrex::Array4& u_star_arr, + const amrex::Array4& t_star_arr, + const amrex::Array4& t_surf_arr, + const amrex::Array4& olen_arr, + const amrex::Array4& Hwave_arr, + const amrex::Array4& Lwave_arr, + const amrex::Array4& eta_arr) const + { + int iter = 0; + amrex::Real ustar = 0.0; + amrex::Real z0 = 0.0; + amrex::Real tflux = 0.0; + amrex::Real zeta = 0.0; + amrex::Real psi_m = 0.0; + amrex::Real psi_h = 0.0; + amrex::Real Olen = 0.0; + int ie, je; + ie = i < lbound(eta_arr).x ? lbound(eta_arr).x : i; + je = j < lbound(eta_arr).y ? lbound(eta_arr).y : j; + ie = ie > ubound(eta_arr).x ? ubound(eta_arr).x : ie; + je = je > ubound(eta_arr).y ? ubound(eta_arr).y : je; + u_star_arr(i,j,k) = mdata.kappa * umm_arr(i,j,k) / std::log(mdata.zref / z0_arr(i,j,k)); + do { + ustar = u_star_arr(i,j,k); + z0 = 1200.0 * Hwave_arr(i,j,k) * std::pow( Hwave_arr(i,j,k)/Lwave_arr(i,j,k), 4.5 ) + + 0.11 * eta_arr(ie,je,k,EddyDiff::Mom_v) / ustar; + tflux = -(tm_arr(i,j,k) - t_surf_arr(i,j,k)) * ustar * mdata.kappa / + (std::log(mdata.zref / z0) - psi_h); + Olen = -ustar * ustar * ustar * tm_arr(i,j,k) / + (mdata.kappa * mdata.gravity * tflux); + zeta = mdata.zref / Olen; + psi_m = sfuns.calc_psi_m(zeta); + psi_h = sfuns.calc_psi_h(zeta); + u_star_arr(i,j,k) = mdata.kappa * umm_arr(i,j,k) / (std::log(mdata.zref / z0) - psi_m); + ++iter; + } while ((std::abs(u_star_arr(i,j,k) - ustar) > tol) && iter <= max_iters); + + t_star_arr(i,j,k) = mdata.kappa * (tm_arr(i,j,k) - t_surf_arr(i,j,k)) / + (std::log(mdata.zref / z0) - psi_h); + olen_arr(i,j,k) = Olen; + z0_arr(i,j,k) = z0; + } + +private: + most_data mdata; + similarity_funs sfuns; + const amrex::Real tol = 1.0e-5; +}; + + /** * Moeng flux formulation */ diff --git a/Source/ERF.H b/Source/ERF.H index d3712f66d..be20e0c2a 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -705,6 +705,10 @@ private: amrex::Vector base_state; amrex::Vector base_state_new; + // Wave coupling data + amrex::Vector> Hwave; + amrex::Vector> Lwave; + // array of flux registers amrex::Vector advflux_reg; diff --git a/Source/ERF.cpp b/Source/ERF.cpp index 68c267430..8a4b04d92 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -268,6 +268,15 @@ ERF::ERF () base_state.resize(nlevs_max); base_state_new.resize(nlevs_max); + // Wave coupling data + Hwave.resize(nlevs_max); + Lwave.resize(nlevs_max); + for (int lev = 0; lev < max_level; ++lev) + { + Hwave[lev] = nullptr; + Lwave[lev] = nullptr; + } + // Theta prim for MOST Theta_prim.resize(nlevs_max); @@ -910,7 +919,7 @@ ERF::InitData () } m_most = std::make_unique(geom, use_exp_most, vars_old, Theta_prim, Qv_prim, z_phys_nd, - sst_lev, lmask_lev, lsm_data, lsm_flux + sst_lev, lmask_lev, lsm_data, lsm_flux, Hwave, Lwave, eddyDiffs_lev #ifdef ERF_USE_NETCDF ,start_bdy_time, bdy_time_interval #endif @@ -1904,6 +1913,15 @@ ERF::ERF (const RealBox& rb, int max_level_in, base_state.resize(nlevs_max); base_state_new.resize(nlevs_max); + // Wave coupling data + Hwave.resize(nlevs_max); + Lwave.resize(nlevs_max); + for (int lev = 0; lev < max_level; ++lev) + { + Hwave[lev] = nullptr; + Lwave[lev] = nullptr; + } + // Theta prim for MOST Theta_prim.resize(nlevs_max); From 9432e22dfbf9937f648f03ead0e08d962d4be573 Mon Sep 17 00:00:00 2001 From: Bruce Perry Date: Mon, 10 Jun 2024 17:24:43 -0600 Subject: [PATCH 2/9] update amrex submod to get kestrel gnumake stuff --- Submodules/AMReX | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Submodules/AMReX b/Submodules/AMReX index f141191fc..8255d7593 160000 --- a/Submodules/AMReX +++ b/Submodules/AMReX @@ -1 +1 @@ -Subproject commit f141191fc73cb22ee649f89569c1778fc910d1fb +Subproject commit 8255d75931e669766ac3748fd596daef76fb9d5e From baa2e012c69744e52221fcd3ae9bd05533189d75 Mon Sep 17 00:00:00 2001 From: Bruce Perry Date: Mon, 10 Jun 2024 17:25:23 -0600 Subject: [PATCH 3/9] add some kestrel build instructions --- Docs/sphinx_doc/building.rst | 46 ++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/Docs/sphinx_doc/building.rst b/Docs/sphinx_doc/building.rst index 481d8d4cd..6489f4374 100644 --- a/Docs/sphinx_doc/building.rst +++ b/Docs/sphinx_doc/building.rst @@ -263,7 +263,7 @@ For Perlmutter at NERSC, look at the general instructions for building ERF using module load PrgEnv-gnu module load cudatoolkit -Then build ERF as, for example (specify your own path to the AMReX submodule in `ERF/Submodules/AMReX`): +Then build ERF as, for example (specify your own path to the AMReX submodule in ``ERF/Submodules/AMReX``): :: @@ -308,5 +308,47 @@ Finally, you can prepare your SLURM job script, using the following as a guide: ./ERF3d.gnu.MPI.CUDA.ex inputs_wrf_baseline max_step=100 ${GPU_AWARE_MPI}" \ > test.out -To submit your job script, do `sbatch [your job script]` and you can check its status by doing `squeue -u [your username]`. +To submit your job script, do ``sbatch [your job script]`` and you can check its status by doing ``squeue -u [your username]``. + +Kestrel (NREL) +~~~~~~~~~~~~~~ + +The `Kestrel `_ cluster is an HPE Cray machine +composed primarily of CPU compute nodes with 104 core +Intel Xeon Sapphire Rapids nodes. It also contains a GPU partition with 4 Nvidia H100 GPUs per node. + +As with Perlmutter, the GNU Make build system is preferred. To compile and run on CPUs, the default modules +loaded when logging into Kestrel can be used. If you are unsure about your environment, you can reset to +the default modules: :: + + module restore + +Then, build ERF using the cray compilers (if wishing to use other compilers, you can swap the ``PrgEnv-cray`` module +for another module as appropriate, see Kestrel user documentation for more details): :: + + make realclean; make -j COMP=cray + +For compiling and running on GPUs, the following commands can be used to set up your environment: :: + + module restore; module load PrgEnv-gnu/8.5.0; module load cray-libsci/23.05.1.4; module load cmake; module load cuda/12.3; module load cray-mpich/8.1.28; module load craype/2.7.30; + +And then compile: :: + + make realclean; make -j COMP=gnu USE_CUDA=TRUE + +When running on Kestrel, GPU node hours are charged allocation units (AUs) at 10 times the rate of CPU node hours. +For ERF, the performance running on a Kestrel GPU node with 4 GPUs is typically 10-20x running on a CPU node +with 96-104 MPI ranks per node, so the performance gain from on on GPUs is likely worth the higher charge +rate for node hours, in addition to providing faster time to solution. However, for smaller problem sizes, +or problems distributed across too many nodes (resulting in fewer than around 1 million cells/GPU), +the compute capability of the GPUs may be unsaturated and the performance gain from running on GPUs +may not justify the higher AU charge. The trade-off is problem dependent, so users may wish to assess +performance for their particular case and objectives in terms of wall time, AUs used, etc to determine the +optimal strategy if running large jobs. + +Another note about using Kestrel is that partial node allocations are possible, which means the full memory +available on each node may not be assigned by default. In general, using the ``--exclusive`` flag when +requesting nodes through the slurm scheduler, which will allocate entire nodes exlcusively for your request, +is recommended. Otherwise, memory intensive operations such as CUDA compilation may fail. You can alternatively +request a particular amount of memory with the ``--mem=XXX`` or ``--mem-per-cpu=XXX`` slurm inputs. From 0f2951d6f10f9365745efd9b3614902a673ade8b Mon Sep 17 00:00:00 2001 From: Bruce Perry Date: Mon, 10 Jun 2024 17:49:01 -0600 Subject: [PATCH 4/9] formatting --- Docs/sphinx_doc/building.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Docs/sphinx_doc/building.rst b/Docs/sphinx_doc/building.rst index 6489f4374..1c709cb21 100644 --- a/Docs/sphinx_doc/building.rst +++ b/Docs/sphinx_doc/building.rst @@ -326,7 +326,7 @@ the default modules: :: Then, build ERF using the cray compilers (if wishing to use other compilers, you can swap the ``PrgEnv-cray`` module for another module as appropriate, see Kestrel user documentation for more details): :: - + make realclean; make -j COMP=cray For compiling and running on GPUs, the following commands can be used to set up your environment: :: @@ -345,10 +345,10 @@ or problems distributed across too many nodes (resulting in fewer than around 1 the compute capability of the GPUs may be unsaturated and the performance gain from running on GPUs may not justify the higher AU charge. The trade-off is problem dependent, so users may wish to assess performance for their particular case and objectives in terms of wall time, AUs used, etc to determine the -optimal strategy if running large jobs. +optimal strategy if running large jobs. Another note about using Kestrel is that partial node allocations are possible, which means the full memory available on each node may not be assigned by default. In general, using the ``--exclusive`` flag when requesting nodes through the slurm scheduler, which will allocate entire nodes exlcusively for your request, is recommended. Otherwise, memory intensive operations such as CUDA compilation may fail. You can alternatively -request a particular amount of memory with the ``--mem=XXX`` or ``--mem-per-cpu=XXX`` slurm inputs. +request a particular amount of memory with the ``--mem=XXX`` or ``--mem-per-cpu=XXX`` slurm inputs. From 33417f70e5c975a81b729e7899b5b8375daf4b3c Mon Sep 17 00:00:00 2001 From: "Aaron M. Lattanzi" <103702284+AMLattanzi@users.noreply.github.com> Date: Tue, 11 Jun 2024 15:22:10 -0700 Subject: [PATCH 5/9] Fix Deardorff overwrite of theta_v component. (#1641) * Fix Deardorff overwrite of theta_v component. * fix indentation. * fix logic error. --- Exec/DevTests/Bomex/input_Kessler | 100 +++++++ Exec/DevTests/Bomex/input_SAM | 32 ++- .../Diffusion/ComputeTurbulentViscosity.cpp | 263 ++++++++++-------- 3 files changed, 266 insertions(+), 129 deletions(-) create mode 100644 Exec/DevTests/Bomex/input_Kessler diff --git a/Exec/DevTests/Bomex/input_Kessler b/Exec/DevTests/Bomex/input_Kessler new file mode 100644 index 000000000..00ec1ee2f --- /dev/null +++ b/Exec/DevTests/Bomex/input_Kessler @@ -0,0 +1,100 @@ +# ------------------ INPUTS TO MAIN PROGRAM ------------------- +stop_time = 43200 + +amrex.fpe_trap_invalid = 1 + +fabarray.mfiter_tile_size = 1024 1024 1024 + +# PROBLEM SIZE & GEOMETRY +geometry.prob_extent = 3200 3200 4000 +amr.n_cell = 32 32 100 + +geometry.is_periodic = 1 1 0 + +# MOST BOUNDARY (DEFAULT IS ADIABATIC FOR THETA) +zlo.type = "Most" +erf.most.flux_type = "custom" +erf.most.ustar = 0.28 # ustar +erf.most.tstar = 8.0e-3 # theta flux +erf.most.qstar = 5.2e-5 # qv flux +erf.most.z0 = 0.1 +erf.most.zref = 20.0 + +// NOTE: This should have a qv grad too (use hoextrapcc?!) +zhi.type = "SlipWall" +zhi.theta_grad = 0.00365 + +# TIME STEP CONTROL +erf.fixed_dt = 0.5 # fixed time step depending on grid resolution + +# DIAGNOSTICS & VERBOSITY +erf.sum_interval = 1 # timesteps between computing mass +erf.v = 1 # verbosity in ERF.cpp +amr.v = 1 # verbosity in Amr.cpp +erf.data_log = "surf" "mean" "flux" "subgrid" +erf.profile_int = 120 + +# REFINEMENT / REGRIDDING +amr.max_level = 0 # maximum level number allowed + +# CHECKPOINT FILES +erf.check_file = chk # root name of checkpoint file +erf.check_int = 600 # number of timesteps between checkpoints + +# PLOTFILES +erf.plot_file_1 = plt # prefix of plotfile name +erf.plot_int_1 = 120 # number of timesteps between plotfiles +erf.plot_vars_1 = density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qi + +# SOLVER CHOICE +erf.alpha_T = 0.0 +erf.alpha_C = 0.0 +erf.use_gravity = true + +erf.dycore_horiz_adv_type = Upwind_5th +erf.dycore_vert_adv_type = Upwind_5th +erf.dryscal_horiz_adv_type = WENOZ5 +erf.dryscal_vert_adv_type = WENOZ5 +erf.moistscal_horiz_adv_type = WENOZ5 +erf.moistscal_vert_adv_type = WENOZ5 + +erf.moisture_model = "Kessler" + +erf.molec_diff_type = "None" +erf.les_type = "Smagorinsky" +erf.Cs = 0.17 +erf.Pr_t = 0.333333 +erf.Sc_t = 0.333333 + +erf.init_type = "input_sounding" +erf.init_sounding_ideal = true + +erf.add_custom_rhotheta_forcing = true +erf.add_custom_moisture_forcing = true +erf.add_custom_geostrophic_profile = true +erf.add_custom_w_subsidence = true +erf.custom_forcing_uses_primitive_vars = false + +# Higher values of perturbations lead to instability +# Instability seems to be coming from BC +prob.U_0_Pert_Mag = 0.01 +prob.V_0_Pert_Mag = 0.01 +prob.W_0_Pert_Mag = 0.0 + +prob.pert_ref_height = 1600.0 +prob.T_0_Pert_Mag = 0.1 +prob.qv_0_Pert_Mag = 0.000025 + +prob.advection_heating_rate = -2.3148E-5 +prob.source_cutoff = 1500.0 +prob.source_cutoff_transition = 1500.0 + +prob.advection_moisture_rate = -1.2E-8 +prob.moisture_source_cutoff = 300.0 +prob.moisture_source_cutoff_transition = 200.0 + +prob.wbar_sub_max = -0.0065 +prob.wbar_cutoff_max = 1500.0 +prob.wbar_cutoff_min = 2100.0 + +prob.custom_TKE = true diff --git a/Exec/DevTests/Bomex/input_SAM b/Exec/DevTests/Bomex/input_SAM index a108e3de5..9d30122eb 100644 --- a/Exec/DevTests/Bomex/input_SAM +++ b/Exec/DevTests/Bomex/input_SAM @@ -1,13 +1,13 @@ # ------------------ INPUTS TO MAIN PROGRAM ------------------- -stop_time = 21600 +stop_time = 43200 amrex.fpe_trap_invalid = 1 fabarray.mfiter_tile_size = 1024 1024 1024 # PROBLEM SIZE & GEOMETRY -geometry.prob_extent = 6400 6400 4000 -amr.n_cell = 64 64 100 +geometry.prob_extent = 3200 3200 4000 +amr.n_cell = 32 32 100 geometry.is_periodic = 1 1 0 @@ -17,20 +17,22 @@ erf.most.flux_type = "custom" erf.most.ustar = 0.28 # ustar erf.most.tstar = 8.0e-3 # theta flux erf.most.qstar = 5.2e-5 # qv flux -erf.most.z0 = 0.1 +erf.most.z0 = 0.1 erf.most.zref = 20.0 +// NOTE: This should have a qv grad too (use hoextrapcc?!) zhi.type = "SlipWall" - +zhi.theta_grad = 0.00365 + # TIME STEP CONTROL -erf.fixed_dt = 1.0 # fixed time step depending on grid resolution +erf.fixed_dt = 0.5 # fixed time step depending on grid resolution # DIAGNOSTICS & VERBOSITY erf.sum_interval = 1 # timesteps between computing mass erf.v = 1 # verbosity in ERF.cpp amr.v = 1 # verbosity in Amr.cpp erf.data_log = "surf" "mean" "flux" "subgrid" -erf.profile_int = 60 +erf.profile_int = 120 # REFINEMENT / REGRIDDING amr.max_level = 0 # maximum level number allowed @@ -41,12 +43,12 @@ erf.check_int = 600 # number of timesteps between checkpoints # PLOTFILES erf.plot_file_1 = plt # prefix of plotfile name -erf.plot_int_1 = 60 # number of timesteps between plotfiles +erf.plot_int_1 = 120 # number of timesteps between plotfiles erf.plot_vars_1 = density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qi # SOLVER CHOICE erf.alpha_T = 0.0 -erf.alpha_C = 1.0 +erf.alpha_C = 0.0 erf.use_gravity = true erf.dycore_horiz_adv_type = Upwind_5th @@ -60,15 +62,17 @@ erf.moisture_model = "SAM" erf.molec_diff_type = "None" erf.les_type = "Smagorinsky" -erf.Cs = 0.1 +erf.Cs = 0.17 +erf.Pr_t = 0.333333 +erf.Sc_t = 0.333333 erf.init_type = "input_sounding" erf.init_sounding_ideal = true -erf.add_custom_rhotheta_forcing = true -erf.add_custom_moisture_forcing = true -erf.add_custom_geostrophic_profile = true -erf.add_custom_w_subsidence = true +erf.add_custom_rhotheta_forcing = true +erf.add_custom_moisture_forcing = true +erf.add_custom_geostrophic_profile = true +erf.add_custom_w_subsidence = true erf.custom_forcing_uses_primitive_vars = false # Higher values of perturbations lead to instability diff --git a/Source/Diffusion/ComputeTurbulentViscosity.cpp b/Source/Diffusion/ComputeTurbulentViscosity.cpp index db7742162..cf681c12a 100644 --- a/Source/Diffusion/ComputeTurbulentViscosity.cpp +++ b/Source/Diffusion/ComputeTurbulentViscosity.cpp @@ -110,101 +110,101 @@ void ComputeTurbulentViscosityLES (const MultiFab& Tau11, const MultiFab& Tau22, //*********************************************************************************** else if (turbChoice.les_type == LESType::Deardorff) { - const Real l_C_k = turbChoice.Ck; - const Real l_C_e = turbChoice.Ce; - const Real l_C_e_wall = turbChoice.Ce_wall; - const Real Ce_lcoeff = amrex::max(0.0, l_C_e - 1.9*l_C_k); - const Real l_abs_g = const_grav; - const Real l_inv_theta0 = 1.0 / turbChoice.theta_ref; + const Real l_C_k = turbChoice.Ck; + const Real l_C_e = turbChoice.Ce; + const Real l_C_e_wall = turbChoice.Ce_wall; + const Real Ce_lcoeff = amrex::max(0.0, l_C_e - 1.9*l_C_k); + const Real l_abs_g = const_grav; + const Real l_inv_theta0 = 1.0 / turbChoice.theta_ref; #ifdef _OPENMP #pragma omp parallel if (Gpu::notInLaunchRegion()) #endif - for ( MFIter mfi(eddyViscosity,TilingIfNotGPU()); mfi.isValid(); ++mfi) - { - Box bxcc = mfi.tilebox(); + for ( MFIter mfi(eddyViscosity,TilingIfNotGPU()); mfi.isValid(); ++mfi) + { + Box bxcc = mfi.tilebox(); - const Array4& mu_turb = eddyViscosity.array(mfi); - const Array4& hfx_x = Hfx1.array(mfi); - const Array4& hfx_y = Hfx2.array(mfi); - const Array4& hfx_z = Hfx3.array(mfi); - const Array4& diss = Diss.array(mfi); + const Array4& mu_turb = eddyViscosity.array(mfi); + const Array4& hfx_x = Hfx1.array(mfi); + const Array4& hfx_y = Hfx2.array(mfi); + const Array4& hfx_z = Hfx3.array(mfi); + const Array4& diss = Diss.array(mfi); - const Array4 &cell_data = cons_in.array(mfi); + const Array4 &cell_data = cons_in.array(mfi); - Array4 mf_u = mapfac_u.array(mfi); - Array4 mf_v = mapfac_v.array(mfi); + Array4 mf_u = mapfac_u.array(mfi); + Array4 mf_v = mapfac_v.array(mfi); - Array4 z_nd_arr = (use_terrain) ? z_phys_nd->const_array(mfi) : Array4{}; + Array4 z_nd_arr = (use_terrain) ? z_phys_nd->const_array(mfi) : Array4{}; - ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept - { - Real dxInv = cellSizeInv[0]; - Real dyInv = cellSizeInv[1]; - Real dzInv = cellSizeInv[2]; - if (use_terrain) { - // the terrain grid is only deformed in z for now - dzInv /= Compute_h_zeta_AtCellCenter(i,j,k, cellSizeInv, z_nd_arr); - } - Real cellVolMsf = 1.0 / (dxInv * mf_u(i,j,0) * dyInv * mf_v(i,j,0) * dzInv); - Real DeltaMsf = std::pow(cellVolMsf,1.0/3.0); - - // Calculate stratification-dependent mixing length (Deardorff 1980) - Real eps = std::numeric_limits::epsilon(); - Real dtheta_dz; - if (use_most && k==klo) { - if (exp_most) { - dtheta_dz = ( cell_data(i,j,k+1,RhoTheta_comp)/cell_data(i,j,k+1,Rho_comp) - - cell_data(i,j,k ,RhoTheta_comp)/cell_data(i,j,k ,Rho_comp) )*dzInv; - } else { - dtheta_dz = 0.5 * (-3 * cell_data(i,j,k ,RhoTheta_comp) - / cell_data(i,j,k ,Rho_comp) - + 4 * cell_data(i,j,k+1,RhoTheta_comp) - / cell_data(i,j,k+1,Rho_comp) - - cell_data(i,j,k+2,RhoTheta_comp) - / cell_data(i,j,k+2,Rho_comp) ) * dzInv; - } - } else { - dtheta_dz = 0.5 * ( cell_data(i,j,k+1,RhoTheta_comp)/cell_data(i,j,k+1,Rho_comp) - - cell_data(i,j,k-1,RhoTheta_comp)/cell_data(i,j,k-1,Rho_comp) )*dzInv; - } - Real E = cell_data(i,j,k,RhoKE_comp) / cell_data(i,j,k,Rho_comp); - Real strat = l_abs_g * dtheta_dz * l_inv_theta0; // stratification - Real length; - if (strat <= eps) { - length = DeltaMsf; - } else { - length = 0.76 * std::sqrt(E / strat); - // mixing length should be _reduced_ for stable stratification - length = amrex::min(length, DeltaMsf); - // following WRF, make sure the mixing length isn't too small - length = amrex::max(length, 0.001 * DeltaMsf); - } + ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + Real dxInv = cellSizeInv[0]; + Real dyInv = cellSizeInv[1]; + Real dzInv = cellSizeInv[2]; + if (use_terrain) { + // the terrain grid is only deformed in z for now + dzInv /= Compute_h_zeta_AtCellCenter(i,j,k, cellSizeInv, z_nd_arr); + } + Real cellVolMsf = 1.0 / (dxInv * mf_u(i,j,0) * dyInv * mf_v(i,j,0) * dzInv); + Real DeltaMsf = std::pow(cellVolMsf,1.0/3.0); + + // Calculate stratification-dependent mixing length (Deardorff 1980) + Real eps = std::numeric_limits::epsilon(); + Real dtheta_dz; + if (use_most && k==klo) { + if (exp_most) { + dtheta_dz = ( cell_data(i,j,k+1,RhoTheta_comp)/cell_data(i,j,k+1,Rho_comp) + - cell_data(i,j,k ,RhoTheta_comp)/cell_data(i,j,k ,Rho_comp) )*dzInv; + } else { + dtheta_dz = 0.5 * (-3 * cell_data(i,j,k ,RhoTheta_comp) + / cell_data(i,j,k ,Rho_comp) + + 4 * cell_data(i,j,k+1,RhoTheta_comp) + / cell_data(i,j,k+1,Rho_comp) + - cell_data(i,j,k+2,RhoTheta_comp) + / cell_data(i,j,k+2,Rho_comp) ) * dzInv; + } + } else { + dtheta_dz = 0.5 * ( cell_data(i,j,k+1,RhoTheta_comp)/cell_data(i,j,k+1,Rho_comp) + - cell_data(i,j,k-1,RhoTheta_comp)/cell_data(i,j,k-1,Rho_comp) )*dzInv; + } + Real E = cell_data(i,j,k,RhoKE_comp) / cell_data(i,j,k,Rho_comp); + Real strat = l_abs_g * dtheta_dz * l_inv_theta0; // stratification + Real length; + if (strat <= eps) { + length = DeltaMsf; + } else { + length = 0.76 * std::sqrt(E / strat); + // mixing length should be _reduced_ for stable stratification + length = amrex::min(length, DeltaMsf); + // following WRF, make sure the mixing length isn't too small + length = amrex::max(length, 0.001 * DeltaMsf); + } - // Calculate eddy diffusivities - // K = rho * C_k * l * KE^(1/2) - mu_turb(i,j,k,EddyDiff::Mom_h) = cell_data(i,j,k,Rho_comp) * l_C_k * length * std::sqrt(E); - mu_turb(i,j,k,EddyDiff::Mom_v) = mu_turb(i,j,k,EddyDiff::Mom_h); - // KH = (1 + 2*l/delta) * mu_turb - mu_turb(i,j,k,EddyDiff::Theta_v) = (1.+2.*length/DeltaMsf) * mu_turb(i,j,k,EddyDiff::Mom_v); - - // Calculate SFS quantities - // - dissipation - Real Ce; - if ((l_C_e_wall > 0) && (k==0)) { - Ce = l_C_e_wall; - } else { - Ce = 1.9*l_C_k + Ce_lcoeff*length / DeltaMsf; - } - diss(i,j,k) = cell_data(i,j,k,Rho_comp) * Ce * std::pow(E,1.5) / length; - // - heat flux - // (Note: If using ERF_EXPLICIT_MOST_STRESS, the value at k=0 will - // be overwritten when BCs are applied) - hfx_x(i,j,k) = 0.0; - hfx_y(i,j,k) = 0.0; - hfx_z(i,j,k) = -mu_turb(i,j,k,EddyDiff::Theta_v) * dtheta_dz; // (rho*w)' theta' [kg m^-2 s^-1 K] - }); - } + // Calculate eddy diffusivities + // K = rho * C_k * l * KE^(1/2) + mu_turb(i,j,k,EddyDiff::Mom_h) = cell_data(i,j,k,Rho_comp) * l_C_k * length * std::sqrt(E); + mu_turb(i,j,k,EddyDiff::Mom_v) = mu_turb(i,j,k,EddyDiff::Mom_h); + // KH = (1 + 2*l/delta) * mu_turb + mu_turb(i,j,k,EddyDiff::Theta_v) = (1.+2.*length/DeltaMsf) * mu_turb(i,j,k,EddyDiff::Mom_v); + + // Calculate SFS quantities + // - dissipation + Real Ce; + if ((l_C_e_wall > 0) && (k==0)) { + Ce = l_C_e_wall; + } else { + Ce = 1.9*l_C_k + Ce_lcoeff*length / DeltaMsf; + } + diss(i,j,k) = cell_data(i,j,k,Rho_comp) * Ce * std::pow(E,1.5) / length; + // - heat flux + // (Note: If using ERF_EXPLICIT_MOST_STRESS, the value at k=0 will + // be overwritten when BCs are applied) + hfx_x(i,j,k) = 0.0; + hfx_y(i,j,k) = 0.0; + hfx_z(i,j,k) = -mu_turb(i,j,k,EddyDiff::Theta_v) * dtheta_dz; // (rho*w)' theta' [kg m^-2 s^-1 K] + }); + } } // Extrapolate Kturb in x/y, fill remaining elements (relevent to lev==0) @@ -271,6 +271,38 @@ void ComputeTurbulentViscosityLES (const MultiFab& Tau11, const MultiFab& Tau22, }); } + // Copy Theta_v component into lateral ghost cells if using Deardorff (populated above) + if (use_KE) { + if (i_lo == domain.smallEnd(0)) { + ParallelFor(planex, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + int lj = amrex::min(amrex::max(j, domain.smallEnd(1)), domain.bigEnd(1)); + mu_turb(i_lo-i, j, k, EddyDiff::Theta_v) = mu_turb(i_lo, lj, k, EddyDiff::Theta_v); + }); + } + if (i_hi == domain.bigEnd(0)) { + ParallelFor(planex, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + int lj = amrex::min(amrex::max(j, domain.smallEnd(1)), domain.bigEnd(1)); + mu_turb(i_hi+i, j, k, EddyDiff::Theta_v) = mu_turb(i_hi, lj, k, EddyDiff::Theta_v); + }); + } + if (j_lo == domain.smallEnd(1)) { + ParallelFor(planey, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + int li = amrex::min(amrex::max(i, domain.smallEnd(0)), domain.bigEnd(0)); + mu_turb(i, j_lo-j, k, EddyDiff::Theta_v) = mu_turb(li, j_lo, k, EddyDiff::Theta_v); + }); + } + if (j_hi == domain.bigEnd(1)) { + ParallelFor(planey, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + int li = amrex::min(amrex::max(i, domain.smallEnd(0)), domain.bigEnd(0)); + mu_turb(i, j_hi+j, k, EddyDiff::Theta_v) = mu_turb(li, j_hi, k, EddyDiff::Theta_v); + }); + } + } + // refactor the code to eliminate the need for ifdef's for (auto n = 1; n < (EddyDiff::NumDiffs-1)/2; ++n) { int offset = (EddyDiff::NumDiffs-1)/2; @@ -281,10 +313,10 @@ void ComputeTurbulentViscosityLES (const MultiFab& Tau11, const MultiFab& Tau22, if(use_QKE) { ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - int indx = n; - int indx_v = indx + offset; - mu_turb(i,j,k,indx) = mu_turb(i,j,k,EddyDiff::Mom_h) * fac_ptr[indx-1]; - mu_turb(i,j,k,indx_v) = mu_turb(i,j,k,indx); + int indx = n; + int indx_v = indx + offset; + mu_turb(i,j,k,indx) = mu_turb(i,j,k,EddyDiff::Mom_h) * fac_ptr[indx-1]; + mu_turb(i,j,k,indx_v) = mu_turb(i,j,k,indx); }); } break; @@ -292,20 +324,21 @@ void ComputeTurbulentViscosityLES (const MultiFab& Tau11, const MultiFab& Tau22, if (use_KE) { ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - int indx = n; - int indx_v = indx + offset; - mu_turb(i,j,k,indx) = mu_turb(i,j,k,EddyDiff::Mom_h) * fac_ptr[indx-1]; - mu_turb(i,j,k,indx_v) = mu_turb(i,j,k,indx); + int indx = n; + int indx_v = indx + offset; + mu_turb(i,j,k,indx) = mu_turb(i,j,k,EddyDiff::Mom_h) * fac_ptr[indx-1]; + mu_turb(i,j,k,indx_v) = mu_turb(i,j,k,indx); }); } break; default: ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - int indx = n; - int indx_v = indx + offset; - mu_turb(i,j,k,indx) = mu_turb(i,j,k,EddyDiff::Mom_h) * fac_ptr[indx-1]; - mu_turb(i,j,k,indx_v) = mu_turb(i,j,k,indx); + int indx = n; + int indx_v = indx + offset; + mu_turb(i,j,k,indx) = mu_turb(i,j,k,EddyDiff::Mom_h) * fac_ptr[indx-1]; + // NOTE: Theta_v has already been set for Deardorff + if (!(indx_v == EddyDiff::Theta_v && use_KE)) mu_turb(i,j,k,indx_v) = mu_turb(i,j,k,indx); }); break; } @@ -342,12 +375,12 @@ void ComputeTurbulentViscosityLES (const MultiFab& Tau11, const MultiFab& Tau22, if(use_QKE) { ParallelFor(planez, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - int indx = n; - int indx_v = indx + offset; - mu_turb(i, j, k_lo-k, indx ) = mu_turb(i, j, k_lo, indx ); - mu_turb(i, j, k_hi+k, indx ) = mu_turb(i, j, k_hi, indx ); - mu_turb(i, j, k_lo-k, indx_v) = mu_turb(i, j, k_lo, indx_v); - mu_turb(i, j, k_hi+k, indx_v) = mu_turb(i, j, k_hi, indx_v); + int indx = n; + int indx_v = indx + offset; + mu_turb(i, j, k_lo-k, indx ) = mu_turb(i, j, k_lo, indx ); + mu_turb(i, j, k_hi+k, indx ) = mu_turb(i, j, k_hi, indx ); + mu_turb(i, j, k_lo-k, indx_v) = mu_turb(i, j, k_lo, indx_v); + mu_turb(i, j, k_hi+k, indx_v) = mu_turb(i, j, k_hi, indx_v); }); } break; @@ -355,24 +388,24 @@ void ComputeTurbulentViscosityLES (const MultiFab& Tau11, const MultiFab& Tau22, if (use_KE) { ParallelFor(planez, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - int indx = n; - int indx_v = indx + offset; - mu_turb(i, j, k_lo-k, indx ) = mu_turb(i, j, k_lo, indx ); - mu_turb(i, j, k_hi+k, indx ) = mu_turb(i, j, k_hi, indx ); - mu_turb(i, j, k_lo-k, indx_v) = mu_turb(i, j, k_lo, indx_v); - mu_turb(i, j, k_hi+k, indx_v) = mu_turb(i, j, k_hi, indx_v); + int indx = n; + int indx_v = indx + offset; + mu_turb(i, j, k_lo-k, indx ) = mu_turb(i, j, k_lo, indx ); + mu_turb(i, j, k_hi+k, indx ) = mu_turb(i, j, k_hi, indx ); + mu_turb(i, j, k_lo-k, indx_v) = mu_turb(i, j, k_lo, indx_v); + mu_turb(i, j, k_hi+k, indx_v) = mu_turb(i, j, k_hi, indx_v); }); } break; default: ParallelFor(planez, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - int indx = n ; - int indx_v = indx + offset; - mu_turb(i, j, k_lo-k, indx ) = mu_turb(i, j, k_lo, indx ); - mu_turb(i, j, k_hi+k, indx ) = mu_turb(i, j, k_hi, indx ); - mu_turb(i, j, k_lo-k, indx_v) = mu_turb(i, j, k_lo, indx_v); - mu_turb(i, j, k_hi+k, indx_v) = mu_turb(i, j, k_hi, indx_v); + int indx = n; + int indx_v = indx + offset; + mu_turb(i, j, k_lo-k, indx ) = mu_turb(i, j, k_lo, indx ); + mu_turb(i, j, k_hi+k, indx ) = mu_turb(i, j, k_hi, indx ); + mu_turb(i, j, k_lo-k, indx_v) = mu_turb(i, j, k_lo, indx_v); + mu_turb(i, j, k_hi+k, indx_v) = mu_turb(i, j, k_hi, indx_v); }); break; } From d6a033e6556b315961344d8faaad718de762f0be Mon Sep 17 00:00:00 2001 From: "Aaron M. Lattanzi" <103702284+AMLattanzi@users.noreply.github.com> Date: Tue, 11 Jun 2024 17:45:40 -0700 Subject: [PATCH 6/9] Fix botched comment. (#1642) --- Exec/DevTests/Bomex/input_Kessler | 2 +- Exec/DevTests/Bomex/input_SAM | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Exec/DevTests/Bomex/input_Kessler b/Exec/DevTests/Bomex/input_Kessler index 00ec1ee2f..2791a492f 100644 --- a/Exec/DevTests/Bomex/input_Kessler +++ b/Exec/DevTests/Bomex/input_Kessler @@ -20,7 +20,7 @@ erf.most.qstar = 5.2e-5 # qv flux erf.most.z0 = 0.1 erf.most.zref = 20.0 -// NOTE: This should have a qv grad too (use hoextrapcc?!) +# NOTE: This should have a qv grad too (use hoextrapcc?!) zhi.type = "SlipWall" zhi.theta_grad = 0.00365 diff --git a/Exec/DevTests/Bomex/input_SAM b/Exec/DevTests/Bomex/input_SAM index 9d30122eb..f54a266c3 100644 --- a/Exec/DevTests/Bomex/input_SAM +++ b/Exec/DevTests/Bomex/input_SAM @@ -20,7 +20,7 @@ erf.most.qstar = 5.2e-5 # qv flux erf.most.z0 = 0.1 erf.most.zref = 20.0 -// NOTE: This should have a qv grad too (use hoextrapcc?!) +# NOTE: This should have a qv grad too (use hoextrapcc?!) zhi.type = "SlipWall" zhi.theta_grad = 0.00365 From 84c7b2b3c985aeddbf8d12e3153fb10fbc67af45 Mon Sep 17 00:00:00 2001 From: "Aaron M. Lattanzi" <103702284+AMLattanzi@users.noreply.github.com> Date: Fri, 14 Jun 2024 11:39:12 -0700 Subject: [PATCH 7/9] Fix Deardorff for BOMEX. (#1645) --- Exec/DevTests/Bomex/input_Kessler | 13 ++++++++++--- Exec/DevTests/Bomex/input_SAM | 13 ++++++++++--- Exec/DevTests/Bomex/prob.H | 2 +- Exec/DevTests/Bomex/prob.cpp | 9 +++++---- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Exec/DevTests/Bomex/input_Kessler b/Exec/DevTests/Bomex/input_Kessler index 2791a492f..8e5af436f 100644 --- a/Exec/DevTests/Bomex/input_Kessler +++ b/Exec/DevTests/Bomex/input_Kessler @@ -22,7 +22,7 @@ erf.most.zref = 20.0 # NOTE: This should have a qv grad too (use hoextrapcc?!) zhi.type = "SlipWall" -zhi.theta_grad = 0.00365 +#zhi.theta_grad = 0.00365 # TIME STEP CONTROL erf.fixed_dt = 0.5 # fixed time step depending on grid resolution @@ -51,8 +51,8 @@ erf.alpha_T = 0.0 erf.alpha_C = 0.0 erf.use_gravity = true -erf.dycore_horiz_adv_type = Upwind_5th -erf.dycore_vert_adv_type = Upwind_5th +erf.dycore_horiz_adv_type = Upwind_3rd +erf.dycore_vert_adv_type = Upwind_3rd erf.dryscal_horiz_adv_type = WENOZ5 erf.dryscal_vert_adv_type = WENOZ5 erf.moistscal_horiz_adv_type = WENOZ5 @@ -61,8 +61,15 @@ erf.moistscal_vert_adv_type = WENOZ5 erf.moisture_model = "Kessler" erf.molec_diff_type = "None" + erf.les_type = "Smagorinsky" erf.Cs = 0.17 + +#erf.les_type = "Deardorff" +#erf.Ck = 0.1 +#erf.sigma_k = 1.0 +#erf.Ce = 0.1 + erf.Pr_t = 0.333333 erf.Sc_t = 0.333333 diff --git a/Exec/DevTests/Bomex/input_SAM b/Exec/DevTests/Bomex/input_SAM index f54a266c3..5e70cf9fb 100644 --- a/Exec/DevTests/Bomex/input_SAM +++ b/Exec/DevTests/Bomex/input_SAM @@ -22,7 +22,7 @@ erf.most.zref = 20.0 # NOTE: This should have a qv grad too (use hoextrapcc?!) zhi.type = "SlipWall" -zhi.theta_grad = 0.00365 +#zhi.theta_grad = 0.00365 # TIME STEP CONTROL erf.fixed_dt = 0.5 # fixed time step depending on grid resolution @@ -51,8 +51,8 @@ erf.alpha_T = 0.0 erf.alpha_C = 0.0 erf.use_gravity = true -erf.dycore_horiz_adv_type = Upwind_5th -erf.dycore_vert_adv_type = Upwind_5th +erf.dycore_horiz_adv_type = Upwind_3rd +erf.dycore_vert_adv_type = Upwind_3rd erf.dryscal_horiz_adv_type = WENOZ5 erf.dryscal_vert_adv_type = WENOZ5 erf.moistscal_horiz_adv_type = WENOZ5 @@ -61,8 +61,15 @@ erf.moistscal_vert_adv_type = WENOZ5 erf.moisture_model = "SAM" erf.molec_diff_type = "None" + erf.les_type = "Smagorinsky" erf.Cs = 0.17 + +#erf.les_type = "Deardorff" +#erf.Ck = 0.1 +#erf.sigma_k = 1.0 +#erf.Ce = 0.1 + erf.Pr_t = 0.333333 erf.Sc_t = 0.333333 diff --git a/Exec/DevTests/Bomex/prob.H b/Exec/DevTests/Bomex/prob.H index ec14f6f0d..44ee89000 100644 --- a/Exec/DevTests/Bomex/prob.H +++ b/Exec/DevTests/Bomex/prob.H @@ -11,7 +11,7 @@ struct ProbParm : ProbParmDefaults { amrex::Real rho_0 = 0.0; amrex::Real T_0 = 0.0; amrex::Real A_0 = 1.0; - amrex::Real QKE_0 = 0.1; + amrex::Real KE_0 = 0.1; amrex::Real U_0 = 0.0; amrex::Real V_0 = 0.0; diff --git a/Exec/DevTests/Bomex/prob.cpp b/Exec/DevTests/Bomex/prob.cpp index 4090dba3f..2908afba5 100644 --- a/Exec/DevTests/Bomex/prob.cpp +++ b/Exec/DevTests/Bomex/prob.cpp @@ -17,7 +17,7 @@ Problem::Problem (const Real* problo, const Real* probhi) pp.query("rho_0", parms.rho_0); pp.query("T_0", parms.T_0); pp.query("A_0", parms.A_0); - pp.query("QKE_0", parms.QKE_0); + pp.query("QKE_0", parms.KE_0); pp.query("U_0", parms.U_0); pp.query("V_0", parms.V_0); @@ -71,7 +71,7 @@ Problem::init_custom_pert ( Array4 const& x_vel_pert, Array4 const& y_vel_pert, Array4 const& z_vel_pert, - Array4 const& /*r_hse*/, + Array4 const& r_hse, Array4 const& /*p_hse*/, Array4 const& /*z_nd*/, Array4 const& /*z_cc*/, @@ -111,9 +111,10 @@ Problem::init_custom_pert ( // Set an initial value for QKE if (parms.custom_TKE) { - state_pert(i, j, k, RhoQKE_comp) = 1.0 - zc/3000.0; //*state_pert(i, j, k, Rho_comp); + state_pert(i, j, k, RhoKE_comp) = (1.0 - z/prob_hi[2]) * r_hse(i,j,k); + } else { + state_pert(i, j, k, RhoKE_comp) = parms.KE_0; } - else state_pert(i, j, k, RhoQKE_comp) = parms.QKE_0; if (use_moisture) { state_pert(i, j, k, RhoQ1_comp) = 0.0; From c11954fb0b7b7b4c499c5bcaa962d93deebf6bff Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Mon, 17 Jun 2024 13:13:41 -0700 Subject: [PATCH 8/9] Update docs for wind farm parametrization (#1644) * Update docs for sponge bcs * Adding docs for EWP wind farm model * Removing trailing whitespaces and tabs * Update wind farm parametrization docs * Updating wind farm parametrization docs * Removing unwanted whitespaces * Some clean up of docs * Removing tabs and trailing whitespaces * Some updates to wind farm docs * Remove trailing whitespaces and tabs --------- Co-authored-by: Mahesh Natarajan Co-authored-by: Mahesh Natarajan --- Docs/sphinx_doc/figures/WindTurbine_EWP.png | Bin 0 -> 71938 bytes Docs/sphinx_doc/figures/WindTurbine_Fitch.png | Bin 37909 -> 62570 bytes Docs/sphinx_doc/theory/WindFarmModels.rst | 161 ++++++++++++++++-- 3 files changed, 148 insertions(+), 13 deletions(-) create mode 100644 Docs/sphinx_doc/figures/WindTurbine_EWP.png diff --git a/Docs/sphinx_doc/figures/WindTurbine_EWP.png b/Docs/sphinx_doc/figures/WindTurbine_EWP.png new file mode 100644 index 0000000000000000000000000000000000000000..15c006b4a296d3479fe40073e1031c76858b1a81 GIT binary patch literal 71938 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 literal 0 HcmV?d00001 diff --git a/Docs/sphinx_doc/figures/WindTurbine_Fitch.png b/Docs/sphinx_doc/figures/WindTurbine_Fitch.png index 226ceb1cb71e634ad0444bb7fe310a6f30042bef..f66d661ddfd1c26acbe115b111c927c87fb6348c 100644 GIT binary patch literal 62570 zcmb^ZWmuKl_dO27mPQbekVaZM1f)S4B}D0#ZlpUzMWkE0L8QA&k?w9#DJ7+w|GELs zIiKJ2efe-*$Y!(e6?2X`=9qJ>a{?6Qr7+Nl(BR>Ph3NVPe#1>SW%_m+JAC z%*U=>X^KWAlKav~JYtHB3y;3K z*vkiXQn}+!z-vo1-ly>dcMAqhjAg#KgnhRbHIYVh4T!G^l=v`!5ZsTkWA>*+ERkl# z?xFqK@lK1Q@_|*?40TA`B}U16p2bV$l1J=_9C&a+8q_i&zWErFBH;;GS(PpMAHL0e zyiZ)ip@Y|iVOS|mM3#RLnq|`Y^#|8MsmC|PMzvhEFM)%$Mrn`OA8V6aR{03uYrxG0tR@t$B*pdv2L=RQ&k0-4B%$1k0Y-nRUSuW2Z)e-tbzkH7RbZ%-vm4p#y- zzUHXyYaa>AStWLDUq5Bg&`bb9@6gkcfPu=2x)2hF;_!`YgV z?ZPm`nzJlA`)hz#Bg*n(LUs7 z6n8FEF#94fi(+n*Jq}*X8%1Or6PS2mpu6@+5txtO|E$#E9aBJBE7nT{_Mp}G2@CMm zBmbp0Hv;FFpd<)6X~6p(3P}rvqRFiP!?~oPG5){#qkPc^lLr;cqG=oT+<@MW3I4AV;v5Sih)b2Ww@u&az zF1TlFdk3QcU-+H^%O2ISxnQHQoH7kwp=04}A^AgtRKXeNI=#z$^M z6lY3)!RChB-8&_5;7J^(IFT3ph+cn9rXRo1}eo z7x!k9^YB1eR=sq=S7id22hnOXf7iW_w=5RmIPGrfG~Yq+Rm4JlDM~4g_*^gPo2_tn zivt@m6I@m*Nj{u~DBi^FN?&a~)`>erE&8@3XRtoszy*eC#6txF7c{pPi-AxI6x1}T z+pYIXL@cpQS~2vg;HBwtf?KI_rI8|nrLk!^h>wvTNU7Xc?oi3ZKgQ;LLn75jLE0g= zNH!E)FEW>LPgV>=k#hu-)UWgzCed5k^vFTWayVv5g7oeI*>a>=Kkn4_LHkwZ^1GfN z4)o!MzkK{iv;4Y*odrKIOJDsXNkU+>KAsweN+{P??-P!(fPK9!Tgtv>^=kB)uh=d) zEY0ZKHAhPIX!CD*7Oakp&dBBhy(tG!vk^>Qv-(PXlxH1R%>vpXDj|oy+w@?Fj8W$JPG8{4Eye3AU24Qq1$p=kX5+=(VG~ zK9h|m|5lL8TvjAdWX#{&Q%^ zOm>Q6N?rqfgLZ=^Nxmurd2o33?Viz|#tG_)_KBv|y8~0JNWTy%zzXO^L6Fyv0 zP12A)+@zODXi2yD2prrT9@IM3YH2raYR#I@iq(!gp6=aqGuVH*zq23ndt;10<4`;$ z(B31MwKK^sAlK`gh@eH-BWDcVzK^om65M2pfI)BN>I zzu*39{*~%o($gTb_C@yHkKJ*napNDiq&@~O1YrfMain{-W?|a|NfIFv1_X5l9S~}B zx!Lq^U~=_w>6p!!dbA_(yyA${?{ zp%IQRN@g{qrL(2;U2_bbpIgmSMoBF`b4~Mgy9GPuITi)K?R80*|8V#!5d~E-{8n!#dhzhI)EI9Y;#wF`$p zyF1H{<^I{~(gw}p=fmFzm4EuS=N3GZteQg%SdCH+?jIqX_U!Vm@Ai#%R}DBfZRvWk zc-45-ohJvCk<$@XdCuJOX7p~nRJrVfQxTDDj`8Ue=@#+QlUq2aSfkJ%2uW=xk&?$W zxwE2PY*8$5q_<66$m)z)MT3BjdglSU*`3ila%cr;4aCNHF{CO4W5k<;LX7n^ud%T4 zN;rP-^#{={jPAHmHBhaHS4s?~JJ6`L#fbXOG){pn!Nc}PRY0{n|t4IA*ZX#)$kNwdr*B=Gc{?tZF7NzobZgy5X z2~lBD$`6w6wm(he{G;_*<}-E0gW#x`#7e3H8>Q9Eipbg_!Qm&vMRJuX0tP#A4``q7 zWRt{w=8P8J7eTsDMPuOHhU~@E^lm=3vwJ3Nl5qiT3^f_e?~TQqSxWCghQXgqm-))- z3Z>^|swU2Xx4z;1AVXDEqH#^W8(zk{B4=&6**D``A64&pym%ILCZ^Ytu6ITE{iY!yoqSsmen*6YsE^B7Fs8e@$!7RT9mt$0It<0?pnGZnHn%6~p1=d~AEt9{jYUb#Fv zm21)e!sUgfj+Aze*0?&M_GI~-@%e{+^3Scxs(F5ShgNK}#fD!Kg1-dEawA%Op0}*5 z@z_0Oj$r1gd}m|zsU$CVLUKl>d}HunaU-YE#9O!StD)3!NGN|6Kfm+0E%Utn!h%_= zT6b4cjhy_oxyZ(qA9G<1a{Da%nuqL%(U)*uiWl4Mp@hOZ)8rLR`*5cs=L(g=R*yO! zsg3zO?6F+6!sT(|&f<0?`5-VdwLb2#y)r1gC1B}Vee(W$_>xqv6ag9OBNdPQB8jmf zdx6sncD*2}Zud=KjYo2y~ip=pwJzZ*j(3fkFbFM%x^wWKLK>c8{&0c4PsLwrF z_$Y6s2zk0;ikQVk*R*!kzNE%Lt9|f^Z)}JzX3beQ-dwc3szITX){|PNpKd4neZ*gg z6|9$MJuWl{ZO*Hf=V@nH>N4DOeiZ(ijh`p=o*(};>bj`Y(Xe}XcXQs2!ex6e?ZT>$LrRSU61Rg_pzG#My)2!yCS5 zzVL*)edK4j&3a;GrEo4Kcj4R^&YY@ILQx|}Od3T+M^;8eVV41;D_=za!1PS8;AD2; z-@luuPtYrS`_!-D_j5sZl+?}5uX0o$n4EbkScwGwV9jCPu77yTXXJLX)N!-OWt*>W z=yuSDS%lOq5zny~sMyIEm8+jtpPmjKFQ7k55fkqI(@pk?avM(f;1Xu1^SC~yeyL~w}U6+HMBf+zmxwIn<}+^wtkVQ_H%W^f2MpOFVYp|3FT z4Lx)H^H#(=IArh}4)}ISh5h~Xt@6}c|GcIEe}fZ!E+!)bem*y_GcvNaH??udO)a?x z-axgLR=0571;boMlx54;hW-rtn)a0J>8Q55{=o{L+G-7eFvW3Qh6L8@JFRhFm z^eJ4dEUoSNTm&hvKEVfGLvOQEQe1t+!9tKyO-_+Q%*M`$f{W!L3mc^n8U+P~fSsW+ zpOU!b&Ew!VK}u5x2U|W?R%d5t7H3Wt8#@zLc3xgyRyGb+4i0AU31)j&YX^N7W@~$@ z>p}jGBW`4GU}t9QU}j@Y0gbEw(#Fw2kdhLb=%26absD*t{X3Jj{mr((23euMu(GqT zvHmkQcvJv-mrv2m#mG`k+{_Bt49p?K`|y##)#v|z{_^jP*H0?j8`+83Sb+x}g#I=9 z&BOowwo zMNTAsNE{1MBA%X}UZNH4!w0kpMNx5F1ko(|C13i6Pd>183VMlOq?ux?sGSL%otWwo zvm+aq^;Mfmadn)|jgw672bHP!46yMLutebC|MQQ>Q;PRKW9^&wzDfMg`&evXf22Bprn7j3#A)&#A z9*BsnMOFnrruyIMum*O>{&%@p+cIE)lzJ;%qW|s!OT@<~=J0>l! z=mbTwZ#G{2`m9w$WG0Zl*v0izKeI?eCw6Uc5Qmi1Kq$RXD!~K=12tx0fnpaMhlGjn z%VX;2ZET%U_eWgDq&^yUM?5Q?#X0RT7g*_tm)TjYmatpupmen(y7QCQ)vOz;EYp`M`E$!ih;Hx*1Wen$Tbe!6z~WbMLZ!UtI{OXXzzdDpA;QKlsQ~H={w}|AwIF!S}azvKKSzs4fi~+0V$Xuoa7f zHBkE|+K&?QluMuwQWkPZVz{8ceCMWLPS1*9TNzS`M&$3%z_BxPTTKpu(5QN@(5MgY zEE8<8zO0KTyt*%+{X$*h* zWYnB|I!`i1)6?{Fy4zTIM!K%CW=dgvEcCE^(Eo66GSE0hXEs^qiK%HZ;eyJ8=hB~} zn5jp*3E1P=Or8{dwI{g_LM;XmXi7SmA<&k?l3`O%UA~TqmA*Q?zk9qIuxrNW;bhQE zQ#PM_Ajn1bcE^avj~8RL+~zYK4jCpJcL)Ta&5{#wP+&YO|FIG)-BY`j2avn8;gB$ z8XZ&3Rb?u&78+Q)A?UzY*<`CV|9w_+cQSITYt8_HNVc@Hcx7%L^z|9<$0{}xRCz)E+%()sRPuvL9iP+-3?HU&o%$1vf>Hj>~fntdJc zC{pEA+Z9*Y2PMn@2}vJ9c+i;eC)s$)KkrPf5Jm zhZ#PYj`Ke96=6u{`e26a)eT0u)L^$>lzYYUZa=dNNz2$%VbxVLSGgTaBuU=im4zOE zi;ZTbVo@g92UDrSXqy#bI0cTaYpZXW&#!(L1F6x+3!OKg|fyenl?%J zo%{|D5TTWe*dd^pMrMd#(TlGk>NEJ8K;h^WVOc$ch_F976f@kV^}lZ*KeaxV7j2gB6QXEI<_xj;y8I?F>FX` z+BK<^@uOhq&*pEt@r^7(nn^<3)2j(^0DsX^=-;~80E>1b?XK4h+(tsI}=;fRSvGvp$9l^ zNAens;mrZV1d9o8z2oHqleicgzM)8$)2iH>M595^TqQ9)Q1IPwzu>&3iDAo1B>eu7 z#-7w2s}D2B$k-3Glfr1Ogah85l$KTW>Fie$zh+LjAK)dA>kBzi*p@YK z`q3>VAbNM5MNcor4<3#UDmA&ia@|RDQ_8ZuFQqh35Lu}_ zZ~1s2lTbx2;57EVdn^C>)NRWr1X&V3V$@EMf`A7qj2Mn5?gH)pk<}#mMaK z0JIV)`nQFFB)qK4(ZU8}hh_S3Gm;4!MU(IohMUgW(d@`9m$Qw}QO_9Vz5Iap9nk;EZF$ZT!`iuL^T!p;#|RZ?^1>}4l%q_^FKLz$rq8C6&T zotzCTm8j@mc*R$PZ+QqWU%oW_X2WkZ6I4;UvXCp@oh`SdyZS2U1(Pzx;JM`$>1}(0 zwaqvAYr$Wwt+|tvz-XPPspC-C3Xcj?x_GfGS^b3Y{LYq*#@m);oYmr%1jO?BLubYd z?z#CUh=A|nDtpJ8xtq}ZJf9WWS+1pN@#4M~jFmu(+sq5gh63)aGJ`~;v7xnM{gjx#M-?>k48^6pK1(6dfA4d@Z)ORS5xC%UcnAB4U3 zq_{wyxN{3u-GHDfI&O8q8fBF#IXN#y!B|+^a?oz;ZK9x>qWJCruaPhp(ziJ4J@OGz zJ8PZa^D0_8uIX{OU9soO+WAxqhcGFH#Mmk!T^5Urnb-vlKR>_Bz`@Y^B6fO>>>z#A zgEGj5BF%LGPYtIRihK}l$oP66lEt==GeCr#`wY=_4#n8sxSOQosTM!X31&jY((Ny)Sf@AYRJT!^p5b-4H6%jTSVc>9pKjnP zO)MmV0q0zG>G7b^Uo5o#Lf@JCC{cQ`<%hasR`x?R*^+iYk3gX~6a%m;W3lnDkgLU+ z-QaQu4=c#r-NhFL5VP}ay}V-f=5CNR8`j?`LSmERfiJoDv>E1^!^M|q1obVDS8jW( z%MZe*f^^tiRpoW2>DRm17xH5jvdNhc#;l9FQ%pjOPvwwxXkm16eZH$LrY3 zdq-hs_QM<9#(^3=kgiFI;epCVeJYM9bpRi zbW=f1tpznki_NE*YTvamb^9^FLg3*0q0!os%Ai`K6aUEUoQ06XxJ0Yoqj!^w&!_i! z60vkuTajk$wm=}S>FkQl);B^1ZqnWidlq2xwrdjr+h=1ClQDbu}frX6A1yiH%J^8^^p+vF3 z;)^ONq8a5grahC03?GUPc6NrZ2nQ#8+9C)uP*I^`E&tA^9ROa?3!NS;0-;vKaKsTJ4fSF>P1uLN!x`Fsp((Y;Vz2M6 z8vv0~txECRtvu+&Jj*uQ8mYb`!So1Ri{JQ!|B!mEAfYla{cz<1vX-&Exm1{R9PI7d95dNm`kbs;t|L@=Wi)H_K;vz&E&id4Uwlqlrf z$)Y>>nAfO>af7B_PyT9tpF>m<0VkDYA|a_g-iru+DSX27opYsJhnAxRnJZ0OEdrK@ z_=yAuS|088T3f@;4`ktvXp3h~lb?yXN;8mV>3Bn4EQ@>W*Ly2e13M1pcsm4-f`qN+?GP8VPKeI(d_2$>P%3mh`Ozx z<}|GicyNoL8lRA+$h%ZL=Io?MTVG7fZ)wA1Gu+s*d&DnnA71BVRvM^Hi9P#$ra zIOARuyHfy=5fe*mgM}diqf3~mXlSKZ3p@%DdHOWSgX3H^PQbZAI}NbpVz3u;Rxmpn z$5nkGasu#_-Sj{T%9J=LJvz1Oa~B>GuQyl^%^65FRGt(k0p3|ifR)8q#yHbbpJ|ex zi9dHOM)Y25bX9%81#AHJSHLq*+68JeulsCEr^1FK<9X|a5*Ai-56!I{Hf2Fgy3Goo z^!#LBT*E-%RGRA7SY?d2Hj}C!z^IEFu=iIUpJ6H=A8+)alp2*iZ0|uY$1QR$6-WzWKyH}S@@?n$P@cZT2ts-Ux;h6zl)`T^vI{qhe;9$O#VQRgW%TM(= zPO?t3RF<|y^cVQBQCxh5D@mf@x4h_Li^QkY6`xzQw_HtV4yvCQ!+#zF&r-bdZ9VBR z?u~fX);OgD3je61z=;pQB8=OIAsIt9MYG-(9eZ?*2?W-!e{~YW8?yI|_`1 z37-Dt({UfFGndw!I-XDwNIN(Ly-m9%5==M~B2*TGf{K7OAXITapKQUS7$yI6f78Ao zOMSK!?y4BcR0I}(t7j+$OlOTh5dJiUl)c~D4Kpd;WTg3YF@%W5y04E9a8ET{3L*Rj z(!vh52!%G_q~YjDzxzHSsi;tdx?#jUQ2im-omRoTB{=@h)%ey%Z}UE77z{os$7!JB z*r|YzgRp>)_O_=qLp00B*HqznARbYmadY=F74DOk$EFusxiwIEbOUqWX6s*hGo6 zeq$W++^#AGYP~N12KZ&uZIF)_r1i!kdUyKX;5pSj!R=($ZJd=UosH=HOFpPzXLsX^ zp~$plz#??iKEX(!x+2G|k^{%ZTo#P=$`YtGMNPBaxuK7*4qtL;Vfv2dQ!h6}ft6Sxcl#i%|5Zrl#Joi40n6Yiq|sD1KLj?qx-Ho;E=_ z`mL)#_AvnZshxWr5>q%RH*o}296|2qqMcayL|1_%LNN&&r_9JaOeixN7M5Dq*YT5jv0-@8l*&{>6sYC8oH7;}1@ao!_x}9-%B84z9WW6Yq#NcYnz1~Yn zOcFth!_qWKW-DT(_%bNifOrFS#T2#6mC!`7oZn5^b6L`?!FQeQiUxJs@$V!S938ft zieLoD`1rnl?R{MttO~JZ*sA$o4N=g;J8c{zKsBp2Eq#?QTA|`s9@3i;SOXf7g{<kU288~nYo)3qw$g1T|t(uKoCI%S@rU4=-)kc^A)C_$HUK&kLlF9!xXva)5;IbzW`M*P$ zzGix98{bcBgFB1FWsChA{u`L*--W^NC=Zu0v3p7q2F2D3 z5L+S*yIMS;kio6?piv_8GK*gqbeQVO;3~a4=OO)>(7x|V_H5z~h^D(W2t6-v8>@^0 zjl-v&Re6SexW?11oM7u%VSr-bU8ifnp@S_g+g@1~P>jq@>PUiKu@08Xv)05wDfsx* zAs91FQEz$v$(a4MX``Y3ZqH1=D)@>T2Y|0`ZG_l2Tq)xAd8aP)txLVw9LEeaj`d$E zHwKtt-kxd?G;I02;goZ}@XdXxaJqZK$^e2O3N^Hu+G#CDs49E(>g2V9%ccdd_xBIc zMdINz99H70ol)V&p7>~}Ai2D6j?N1oa!eg0{jnXqiN#xL91%xF9_~?7=9c+15f_ZN zT@G?w&KBGXV7(%&_W=RnLSiP}Crx)WmQXP;VjgTcgo7ei^BS?qxJS-guYMiuI0SsC z9Zac|kG4Iw?C`_EZ9OYbuIEW4hDQ*f0&0!Wxep`=9om0VrtJRHDoLowx}gjgjfFK= z?+&Tw>%v9Jo|)ke7Tqh+Ia?UeDh>e(Yv&U=L7Ip~Rs8wgi091@VASXE8c~my^yvWq zegv|^XV#VlbWqn3an>SZv`;fVC**+4HcpA-0x{nF1R*5lLzsVZ%HtGo)*5o$TVP>y zU}3!OeL-Mh6l^=)DMr7~f}LnwFWxoBfOMclMbr5TEHnoJIu04u1Nh^}LNNo&6s-c&gXd>&^Du8QJD_`sVSun{-F*bb8~OypJ*<{XM5#hzd!} zbzwV6KB3DBt-yNgC5zcluW!58Mpwu~QM66tJ1(R{jjm!<^&#;-lelq+hxiBlE+Z={ zs5|!GVMx$c9S9n9QfP>)NK1DXdy>_cgEm=s%Zw^3!y&TskXf*7H8K-kc*5&`QL4O7 zgl7|tYU31^no40o3{Wf5JP$G2Mu?pt6eW6nrA>xMM@vqwb3_BO8eI8$*Rj+*j(}e< z$5IreW2m~Wnqo=2k)T>}liC!3g)baBY(|3ung*At3&Ud?Nl?T zI^ESl@!Imj8%}5*N6coOpeKKNF>(W`aCH_=7UdLwoQyAL(juHlI5vYfPKIQmX-EDNtEp*Jy|37qWRY-Jn>3eR&) zB`?S++sFA89M)|bj0)gPi5Kg|;NzP78%X0mvfT^f6?yUEMY*G^C*N4C4(V@=>+y97 z0NnTarH_GFOl$rFPV~GlJMESJ&eIDF5_t zkg;1nGg{-&n zA(4d;;d4=ZIIycbE%$Rc-Amo|u!h^WwYdVYWD0aH_$zp+6br==>Uc}HujEW%*I#~V z7%I0Wyitw5l*KP+3+^(|>&f9Y%kvlZ?Ca&4J*h z%((CH`hoY}(D~3O6`8;5pe_C#D!9{AH$SO;P>v05uy?}#u0sYg=O(_<^*X%V3(rbl z6-5^*{d&!@G|O_0Wr{Gw+J=YPm79FV*bhHFdn`mY)2BgqMM3c(Sc_)ay8_{0n1~ls zuf%KbT#Q*?PN+^lY54u^hVKwQH&4l(X3hgDjJ+J4PRf#l^r-5 zGYi-o^Cx3|FQIp5eowN@6Syj)@4-SFP6{kfR^A&un?D-dy8E+T7&@D5CV=q$r|_9^ z(OuKy9}Go|cM-47C`Bl+5NR9Lo_yIgL2Z4q5|51{4RW|o{f3r<8_0FpRrKvp>l;W@ zN7&sUpGtaotKZu$crYP)kg@!Df+^ioz|Ib5@5)}Cd4m!NoI|+I*ZghYt?~l#_ zByPp`(vBVs0?9nks!u=?(D~qV2ZF|eTt){9g{|1a(2|ASVdUM#FIjnGZL#iL(U{D6 z>eqpVfP>bfQK~){SNvrvoa>3CxRA=C6kpyXHA0GqXSDa%VD`jKqglJ3MEc4zwAK$z|xRD`qOu#U` z&iRo!{2u0MoA&CKR8!x2|@X2WO@{GqC=HSNxg&1@hR zS*{bC1inveP8Q2qY%yspofftjp;BTHD4OL~x$;IL`nr&d5}&|ng?9ENxgZ0LO|QXC z1|x>-@uyIc76D6INv}0CWpVngx5n}37)EN{#?i@ZTvLR3_-+ax0e9W{9&=d;k=p$Co|TclX*@mqAHzL?2d@84sTE%;eR~*iSG(z zi3(EE7n9C6bkv+wZJM;eO3nPxDs~$c8Gu(P*}Rvyp_XIxPke*E)~vfJi-EB;Q1D|( z$N5|+PNc86)R^{cSZTgHXwsZ|SZJ!b1hu=iWdTBp>X~uT076g&{+uu!8?1>kcKb1Z z?pmOW|BEsumhFR;Zli;trhJ02&$uipO_MFxyL5qc2+tf|7r;0sB6O6yxpDY*_QH&+ zR`zWK;*D;k2;+bb0V4}<=035W6i)s#@O=9$Il0(2>Z=5eq=6vyVC6kX&I zaK>?d?th&a;9$7~t2;kl9Gh&tT7zpK%V+fD8@+M$94&yAmGhe&fWPOy+@5q@;XhXj z1pZddH+aa@`CB%R!J~o81G~Z-f1LsG==3Ja5-7F&VF{Oll!7|PV^b;YVxO2ek^F`R zAE{r5CyVX(A!Re`+nA2~8c~kLP*rHYgm#lcZGg($&#n^%p9Q(8?yhP_&$omE0RY=* z0AGV^zhg<)H3Q5WO~#Xs`SQ(aYa{K~ci$NDKW4y01nQF5zCR?EbA?sYRT9&ZQSNtC z<=>rXFRbj>E!JSqYa(|=3zo6dZA9V_;aFa4AD2L2&Z-&IF2Jqwh-21Mbm#B-OLh$F zXfl{mCN#f%d3=*h5r$ZxQ{?!45;|;xA`N8XQ*-xR)rRUD*@zEON6pEH{YkpnIrU!npgC_!OXZ*z!;_)FCz^YDSAt0Z#;JeuT2<0&NL%YUQK&%?2f4=pPQJenJ6Sp|0N+d)<=+sLC zU<6ttNr=MvwjydACR0c$NUHHmVb&_dkFXg1b*Z;+3b;7X-@wz)XPZ_(Y1mS&bHkg& zKm;~?XHi6gc(d6467|>78LowQ+wHWS;YFc{2L>OnYhfSI^917Tf%C!9(?XrVQcR(r zU#+1t>}xYGm;qlX%)|GA@?0K~w)a?0DDEOJI!C`3hvQ_)>3T9a_;J+RE+&QfbH(F) zEzh+#!`i3jt*_T8zzlrxi@zC?U%4WOs*T}I7lP(Xgjao239i57y@p`SI?H6^-S~x1 z6kJ+a?5^Uw0k;CkcWx(`wvYs*x4rm+mr*mFgLBuOs{6;E25RqQOCIj9tDI>Ycctz? zw#xsBj2JMukx^vWAK!VCjxqr>>GpY{dLB=$(aHbznQddV)Tx!(B{P(XK@ExO;BjFw zS#z1`_yxPaD%^O#>qezOm-gJ0QtUxb_POu(pD~?@OWvBUwG{;q`h|ujZWwpL&G(sZ zQPhKZn_~HqMs+;b3TOKp6GHa`6@J@WgAFhYWN(S{+MU%$|1G!vu^@W>Y`MY-Mv6hw zC)6F^?*>e^DI!}uCY?|n zPe(G8^LA#wy!0j@qk!>p7J0#u-y^(xJDo4VtrKoWg_Mx}ELH#7zdJZYefqINUMQiY zjZZ&;7SCw)x$|Ea{&)H@Pui}*yF4fT^7l@{M)FY?$*jRU8*M%jCQTd2)fS`!<6^BZ^qGsqy(ZV2lLFCvcMR8ip zHPgR#XcFlkH|}WL@GrRAB)C9UQ>X8G<4IJ=lb`J6Ax~~!fZPjio@lt%&g*I>dsU}h z8%w1597e97&8+KnSm*cyI%HxMa>}_e*Y-_-3P&h>ev?mCA>ljNf|%u6lqZNM4SA2Lq}s% zsCiwY!ofBP9=R^3m#=co@x21Y(iz9ngEpRGacMw^bif9JX??s`k{h}QnBmt{azMa= zM53;DTi^>+I6x;?V{Ja3Qo+8bmfcV*g24!VQpFW&V$J|cTXV9Le-E|mjF~5yww|i# z8=2`e<<}o-5&sS66$B)&N4haZv-)@oOFD8{V%_F9Xr2XV-o#(=fNE2{iE1Mb=i_;m zdfI@0i>4$1GkCrJSSob zt;{=iXA>r_eT20Q^S#q_rk>q9ZyLS$?*WklbW;2{$)3_jBpv1_*%xbMVf_?2jmqRV zO8j-xdyXoVYH;oSUgg_gqn0?Jc=-=pD4zLZN?uORN(yUCbGW+D<*GCm|GV0WvwrMf ze|}e~$jB0&o0t%un_elG|4a$<{rK@-?)Z{H9d?NKMJYti4@7mYZ;rUgFPyz)90K&E z0`HLdvtl?U=HJ$iHUyc7Wr3@9M$>cbq2HaTDr6XjT&YG-hZ<{J2p+?ftGI$Wuwii^aK?zedNAZL30iZ?sr~b-6cr5qf1w6g ztM*C!?v=DlKqjoI0~fqb0DNyP8i*7;K8uwOgRJ`R&>mCVIj{rGKTn-t2%M+Cf?m?^SHuc$0>K=C-D*`HOmG zT1?N5zXtS#3HtX$1y5tDBc6hGww?QE`VGO6LTFW7Cb=TGo1+tzWN$;bd({ke4TIZ59G_OS|E7qoyMNVWo?gGR4U_it zNcsP<{S>d$yr+rh3DGP6k^n-zs@_>oMf#oTq1~40ESntuzpMn^96;x!12JU+qiQ^Q z)~N09Q}u$t?O`}efyE_1xd=n5Tzf5fe7ZT2=OcY(2DzTkK-SYod$udoQL^nbJ*d zA<}$`z-=i=4|>f;cf&@C$xs3p{Qm;~6ajQwX`t@BaxspCUH7G= z^Gz-JKfo<;R|ta+_5^l?J+(m1sDC{N;5uKb_I{a!MqM>T#w(GOf1@pI{eiaNkK#p! zw1w%(gbCDsWbEHzb$hZ&qW-V-|Atha9@M+Ui#++uJkYftu{irHx_dV(6do8`r0%NX zIjaDg+<&zZm>xa0P&PxVO#`ux#vVysaOuV|3z)tRsHTVOlT<~GC!c#hvWul>Wc1qc zm=1{0$|uqdz0RIo$S4T~B`HL^@O2-Cv;eJ<%49VN}h?&$#5PXo61L z{(X3feD&%;?d4Y4)TT$O@&kKJA# zrL@P0oZW*NQcK_c$z#a9&z>P+5K(V6o)%`rmI|W6gL~y8xshjw^WK>D+~yqPvv^_^ZD=)nz&-C_mKjd8vBixj30Cir=CW#5{hB7AM!J zkSy>3`3_lmp=g5loqKE|4yXR)Ui5WN8xfncbqN(!gdB#&JK-YD&tY6-BxcUPG0Kvo zfu6YOC!@H;Lid11*4erW6^TuRO{)52PtZ-V+*gvE0Z<)pOY&tzZ5J)(p)-Vgij zqjIX#c=RI>hlt4hpk;j^&2O???beh*dq^CYPo8QKK8A~pHD+E#MRyEynK{O=pRDkU zdG{^BGS(vQto_9ZW=-xmUi<7B;7=CDcL(ZYjqSYl%MZ82rYo(o3_Bx?Ie&chzmssG zf!^ry=OwT0f{!*Y5w|7%yyu~I?ZrnuXP63>bQWuL zz8cF{S8DP)7uSu93EryT4dESl_F^Qs#c0T`exzQ-BD#F+dBXAMa7O$B(s2z{EAIS* zldq3o2J(>zdubhP&9j2_#sY81X30j2pIgZ_-*rzKyZG(N?|D+5_~_Lak3?bbx%D-z z8oQ-doiE%7L)58qW97f%tYuVI zWVT5@LCEsQBsCwa_qsSAW2y zGd1>i7YB)KN#!Qz@kwb;wwf+u03XPsY{oc>Q|*+=Wc`8 z`Il$A3Y^}yw#AcA)lY@$3`*oKGgll((}iz)988+*v>=mz>|NY%$0scg`gRU`I{nkj zz7LdTD4EJWX6{1_A4|vSRQN6UVHM@vsL8jUQH;V{DXC2{spkX@w!C*(pd*FrQsyd? ziKf9iw9xzPY3YwaYfz?h(kO6S}b@)F#xSsFY{}ULuO6y1OX8(yJ+EQ8dZ3DNoPO8UITvm9fP^O zh1InZGXud6Y5(~C!M0sTgOrkawNOt}A@(Xn!qeB(ZE8GT6I|qN7Qrie2Ab=&e=IZi zFKc^`5GSyLW^~->K~Gq*%?7i`)h5D^gqiey6(kNaYzfJzZ6DxNU35yx#+^edq7wuB|EWi5z*oi z5~28$_u=Mw_7;CagT^nD_&L`7_e#h=cNK(pd-{ccP8AX2s|NRrap}uw==}(+pce3s z$>cmy3u!esv5FO8E|7b@B7)0yVO94__mhKSwcXMOD2;L$_uPB%Ed32H!Nx|_d@`og zGFB({fX_ypNpg5m(}hO4E-9QH@54{sw7U>q3TAiBLqFz<3&zs*S(Pg`1q{9?`S+jVw;HSfd8?`PQ7ijw$aLDjhk^HcQUwr0=|B zVrMTAO|f!cAFIyzC|XEp7w@ZJ$(Ac>ITPM{9xq?riWKWcqN)C{XJmAOVn&Oz`(Blx zj?gr=!4rM5$GT=L8rEe!l^B0gf(d5m1CcC^kMQf{4helV%S+^LJ(@K^tdyk4Ysp8d zG4`=QsyuPF5!mCTU>V@Lyy$JR$8fN^bFMYek3faOEzCM3d^CKT_}wk)jf7dMxj;|z ze!StsWJke_5<#XZ6s-b^gW3|WUNxS%x|j8Lg2@B-8?xF1Jm){Xow|3)DQ7uON<0xi zZh87lp=h|;7{hY^6*E(Y7HTKG>enDgPi~>pA*uz8;IReGZgYgi6K6fGqT`>Tf1FbT zFR-x9Jn(fKk|I}4(lKfNA9Db*(c?p`SOHWa`P3HHS$S(#u^Ftrk9`5rdCkxcF1m=d&_1S zTy}M8+9inkdX;eaVRL?DZ#4WBD`Jq~g%NuGI#1W5LQ*wlAHC?$Tb51rrV+r{%LFxUE4e}osa4AZNNnb>$W-BZ*d>GRS{J)~i1qPY#y{CL%OjQeLrg(U0nJNn1P)X6;^f z)3P-m4Kc_1?5wq$z?DsO+f*(W35nfU?lTfHQ4bRF|3}nWMn&0v;hyeBL68oS1}W*1 z7LYFK1_|j-6_oDojv)t-#-OAdhL#5D?sL!kKWCkfuH^@2o_qGa_jUcQ{kW241eZ2b zrSP9F_JM_49Ah6FLb!Ww-*gtwhkU(~OlIGHmE+*e`y>*(i`O=B2}k}cReO}=a;Xlo zC+4cq@5?d#?ohkZv$ACW-3`U_m(NFP4>9QXqS}s67c(0JbABfa2V_4#B%V(@w>Ta@ z<`GuvH4KILX?qX3kXue|eGgj_SKhnF9=nBHDhGCPWjl!LZf^w}6Vs9J!=(D#nn6S6J-#+~c)b|N#B z{5)=1gbK+@G%s1Q!E|l<6`m%tALV2#>9Zx?`)F)3t=?~i5n49@WR zUE?Xaj*W9qr$KpzN^!7J(=}BzF5CIdc^hpHeV!f4sCbv~;T8Fb_F zh0TT6UhJAvE}(Vqt7yX3!(I%cL&6IIS$+=&C3XlsS>tVM&~dYsUtQ5eegWC#?$khL zx!hwZl+)_^WMg7yo8kpCA}%c3??geb)dONsW7%CqS-FAy#Jll+m3Y0yYyOVOH(0kOvoGzVM zs4^apa$gJBRxs~`?vbv~Iy558RDR|=Nj2U+cmHU->n_^US9z&cP0x=pX1yj)p1DmJ z8nszYp7~ppw{Oyq9J*_7cG>N~(^zuRlCUQ&MvC?95dGB22$}no@VP{~vbO_b&2^L0 z-7_nc0`l*6u@#4?r-w$N#;5+KA0m8v$yGORfBPBl`D!hf`rw?t{um7T_^;+WOpC{4 z`Z60W%IE#s-1N6Mp~|8q6(sZ4#viyGu&W9fq~GU4WMUv${9;>?b*Yl=V?P;T0D-&T zi@0|R2lWb8X1!otLO5Gq_Tc|}I=Xk7BqLC1b6NSH*3NQ$z_1mUUBUVL-l(7pn`opH zrw8>f5Kmsr%cdZH!G`+AON#&XHVR!=cl=^QgDruDOJKmu-0O?h|sx;O#Z`#vyRM~61s;=D_v!4Ik_gg#E zej`F@)-I6Pmmk~2kDEWV_q#Pu4ga{Ll|)`^Q8mpUVf;-Z5I+%h7uWe{Ne7qeN_n*=U}jU#$!MI z+?(_!L&tnto`|Ne{t0;Axo7l9*aJLwcFg|7)^2#hi}3TFy2!Pp)JUTW&5>~ z13BK|SrH0U#rw`>Ypr@H7M^EMFTq#DUHj;{Rjl5oY1-MQ%>hsWcp9%AEK(q?pH}>e zU1Fg#E#gvSWO%(D+Izoo()L$qI9rsJ+W$-~q^|9HGh?%H#yC*)hZv=t3@g1Z0mhSH zUUVo7DjAxy)*CbM+^NlUSfgB7GmBkFr*djhyM98(mBYssGmqeUR0PvTCY6%?`@riB(*6vAYRyVr?y)wZm_tKZjfJS^ z0_nF?nuq&C5f4GRLne3>uT3tLre+G|AR>tSL*oyf4}-$X{pGm6>-+^C+M%%41E-f8 zEKg4#vA3|`t0|~SW*cwC({6sD^}Fw@e{i^@Y#Qi_xw$=hdaW|%kc1PhKYcZv^iCbv z%(2Bm9uIfdRy^joK|Rrw_QL}9x5%!VybhaXd;tJ7R7r@Z(x{sqE((3v=H(RHh-4zA z#MCY6x1FmiQi{k6xW741h$Q1lPX_8iVEoqY{pIqIi|Ex#s1*VQxg9TOi!D%0Leu2z z{oM6h+{)&7XOflW(57GX-$dl$Atf_wy!aX(&UL%6OJgDvLDFEUJjH|PP(JH-BUA0) zCQnic9Yf_ufA6~j z>-+n<_P;kDmYXnb+W&gI!@$Qb6v~|7-AdZ|BMgoj5)|+{@g0 zztGCam^}V_I8(Qc(M)bK|1i3C=&94Z8d26T3%cIz zp7G*~90dv5%p9%$8frEob{)UAcHnEjKHW;;v!9kPQ!g519U}}z2U<(L^$35-^bV|{ z;=^2BH#y>U!;Dcvo^)98PC2H{#P6*HPO9VX7vVsIb6DWjD!MHUT9(3frOj4Wx5qp_V3x3SB;iSI0z)hdacQZE4!GxRf!Y}Y37~k1C1(E44)!GQWgomt*He+L5B( z>XFXh)!!h0iZ+9UD(_JI5@L_#&=suG{j)&M~hqGHk)2uYH-aoObloTRy=n5!WEaZjoT(B zFi$=7*zq8JxoIW)PMa(``Iw^9(cN5gpw882aTw;D-w#4XcNEiiL)rD)4UNd!#NG<=DxM#E(f(&W?E&=oN~7_gh~4m8kWys zj}Q-y$soVg9W8@Bl|F8?&-t$9bf0aYqC>oXwUMZ+n<0d6QeTkre0nY)@vu-K;h)`E z=7#k$E+S=anQ{jIrbs7wpPh243T~lf&V{%CPEpDr?C^QDeCl{{4~#sS`6tA`#q@Bg-Rd30`$Ol;7wKcO zrQ(S;5*5MqcvVGwzv045^~9LHTWd#DLmOOV9Qemp?LdtPQT};4(s}PLaf6e^-p!f) zYBOJyrW<=bHadp?((lJhcyb<27L8a#68ytdmA-7hWcJ&shSUfr-fZMBW3;T8Y!+;Mt+Q6Hsj~2#!aiZjAfr)S(S&@ZCt#8ASZ-xYXO? zig;f$e%*7X*5qh-D))K3NNK)ZK7(M-MET~Iv{}S-pIz*1NBe1@jhizkWuD+e{=K!k zV&NCu=josw!XLZx&Maz(X?TcTjg|>?8z=B)E4rO#ES zrI@={rMU*>v&|ZK1t@XB_%RKzi7%S zPwzOpEzSMjjG4mc-Dj$B?b&@f(kNpu*dVLjWFKg49T80g8R~Nw`gOW7U_I?;H`F?8 zT*23-&svEry|eJE-;jh&mq!1zV&a~m!G_u}3(E#vS43oFwhzwgH6}kSl)DT0ps*1g z`?`ex_i0sfS{a6@sF`FqvUreTZ9is;E?x0kw$?M@c^G)wP+Hu8MW;$uVY-hso_)96 z?a?{N!bzP|tM{)AGcj0qlSbNnZvg+GD)j}fy)T~j*|@6V`ZPEd@vBbJDB52@N0^j$ zQFtY$U~`QQ^XdLdS(GwcX;X-qXMC%xtDB+|)K7>qoGv!kz;7QW(hGW`A;Sn#PX541 zU8qf5@+cn>n)+T9_^sIMxQ#4oQXNzi`bc`)^!V6r;co<{=iyVsJP` z8k!kNT-c{DM!ZjX$mwMGF;#JOAanh$-(k5k{`9^tj3XkSE|w+O0v%c=B*b~b9Ne@V zVBkij2Z@@}SHopHUGFzH3PtPNhc)n^+m7SnlJjzvJk;L5%TvyBuc`ShtEa*&b*C1s zQ>h!beI~^$YGrnfX+x}WywC^-A*Vv+in0kuH(Pxqg)SUfuU)Lq-v_@283zUf33Q^# zFcqe)KZ3IfhBU8Q-otbLuXgveHoaYBjglAieim*qamv3d!r~AYVB$ji!5#2>=5tW8 zCo&TAvnN<=k0hh`zr(0}!H|+6@l+9CUgp+!Nmx_HERU->tS5xz)C1 zb3S8)=OR(vy2S4Vq+2Uyk@OuD3L$lE-hw`7rPod=9vY?!?Oj#(OqSyd=bMNwhOG>% z*Y!#zmjGPA+E5RCXO#ATw*he@pp@p}24!SsDowul3!Cvc-5j#Iz!$sfqCjDLus064 zwgkHf7mFo}ReB4NWo@IXqFo^VUV*p!0bE~iawF>GZD}r*Ln7+MB~_N#L$gp>UbD!MaMX_7<;|NwAC!Q#FdXzN;M66IpdpqIPabO8{d#;F0f7wQzQ>II3+|w%IQG@+=$}{ z_@e#r3*Gj9$!jgjjUDpPT5mtY;SJm=2J7KWW}(LD`=frQoYb6KxFZHkjDeq@v4>ua zqd=MS-}0VD%4AracGlMGuk-bY+Dzw$XztJJh5SiW-beGA7y_9@@bgFnXNL_xcea32woMcy;A8mm7JtKM zR~dux%@4oG(vHRn%528cI#cvSTj3)LiY#|&q zV%E^V@o-$ZA$A2!s(eFG^tb9oHD0gDhx!|HYab3Uvc(A|Wugr+gwyKHyP+9I8jxsHmBwj@8wQ_uj=#&Y!)6#SLguPByq4c)t z*xgQ6SQ32^Hll-K_d$&&uuir}SDH=xa+k+oa zhet0`ZX1ZYIww%RHw&}wjK?u(RAi^mZKsHrY;kMX`1W*ogGM03kTzHOxa4gb9k3mW zn%h}}+Rsvf)%U7bYP9)xg7A6z14fZ@aFfHl)k96$M9WUf2ZzlHdQ9-sn#D0|_*#ty z6{^W?j8*8DlE@%pzuZ_1T#p3#?r9;@4V<{~jj>I-p$z$Vt5VY*z*`4EOBTD_g(zT} zmRqd@jLmRufZeI$T8?(FzFzKab5Avn&gl#i_I1`f&jah(}Kknnq_pH?Pu}c)C<}OD(i%ZxDs%KcdpJd!bakDx1u`TkUO4buuP+5@G=~) z4qyesJOtBKFNt5g`&!np_;+BHa(5A%TL^W@fZ3qwZNWI6~cZC-y&w;znE+OYIm6BXn{N3JaiRKW@X~c(2b`ZiP(3Q-c^v8;rN+2 zFs%w9&M(J5P}b5AY=g%V{D8M|LwH0NEQ+q$U!dyGajv?b6i=!;uygl$qsXX-^MQ?n z^qH_n<=xF*^|Uwii;5hlsy!stU4qDnId`G~qFeiuB?E7v(6zINdZ8ai#+esfiuO}T zt`aRl=+8$`V~c>C*}uzFA)aY7Vd3BC&mH6G#ZzWH>2Bd8+Bi)AoSfXpm4r3tU?MJJ zAdxx2hH6n>VlVbZxA4-n-{&{)TkP5ox?$IhI$+}{9~AE(At~)m3&!k&BiKRlIU)4w zJAesdmLy^v=+kB=!75N<3HzrtC+;HamJuuAZ#;A;8{4DZZe3$88mu< zZ)S7^FOlFY0OqEvQ|2R^ZSXDonGLB+nJgnVfY{=B>%JQ#*4R-8rs`L>5PMqav@-f< zuz$90e&9EzA!qLC2YX^y|LNd#AQhwU750<0DcGMjXd9F6KQ}0SN9(%V1TOTn-b#a} zsW=6ryIOJzeBxrM!}jdjF6c1M8-3N+e6z0tq-f%s%&VHraDbRYW7+sa zY`E!~Nj(i&GbF(&KEZ(eQLzI30Q^z|t?oc7w|Ql#t;Be)B(izKAYY9Vm86oK z09fVq-AX8aWrQ!Fe~N51wv_MP*Z%_FUMX9|doZrH-g3aIV`;ityJTw&W{fLEPe->7 zn4uJKe}zwP7F*Otxl|T7m7FyQ(SV)o~uS={Dd1~UXka4Z}ow}BQtxYWooDjt=5nDd_ebN?=iP8||LIJ#sR z>GFQ~Bem5YD#JJkeDWJU6AaG*xZF*D)cPx+M%n-soV! zTA^}VI3b?IZlJxyCHq2K*dhLXo7cyksfv^&&gQRYI5zG<%nn9@JL8OFf-V4ac~~b2 z^*ct9^*b&A%S+50yj#>TnRTaaToxvubqi&RU6Mpb5dUwnju<02j~Y!8Kj~H;k>cWJ zieyUg3oim&i_Shz)Ct&AdCxuDc|FgLgOil)83-`HR{?ikU#Vkla`S(L1+31<$I6OV_{I+1e;UKtOEu6`@qM0&(plaipjUXl9Pk9k8Nu$*W>Hl7 z+&Ixf+M_vj?7%@c+vXSRW*%m9dl(g$q9WqMNi|bxa0EJL8Rw@QsQ! z1n<2XKu6APZ`KgFR#Dwycab+avEu>JsvlC&hv@UwJ3;m%60jrIlftH7%o;Q~D!Wuo zLZ29w^q1*3l*7#e_ArHM`v%U6C1cSNe!<2e?#lUwMs0gL_p*0+A!I9d`yb6BTDIN9 zg~C%Wn%cb|W`NQ;mWd^gP64m=A~)Lwo7}|0+UoP;M5DWXL;5QBd9renjiP7wl@oY7 zrGqz>4ShnMj$U3~>fM-E_wyc)Od5f+CW2sXHLX7jx#WjM{aTF+25!=tb15QQk{W*w zo|l^G%z{DG@Z7HS}cqoOuN50pZ$0APOeP95DCU560eg65pP|f~; zMnOK9%o+Gg3;px>n8hUk|B@kYJL4XR)xB7QUngW%GMqZN<#?vYD)_=1+2i8ktm;oG zg+0JzMdorBG?UEvP(Msv5z0H)q1n4!Vv9@Uu1GahfaqqI0tMWOC{wj7Tg_EUpv4rm zZzWC?%ag?9A{X+4=gS z`A~*{Q~GcQ73Z{xK}L_!cjq5|)0>q-sYLfw3DZ*@h2#WOLT-I+hhG;*M#OI4YF8UM zP`%B-+`BCRhKK_7Lbu@NaF#uu_B6mjD{R{$RQp#cG2X};rhsr54;p?1C9g_-`vSDk zf?Y!@B!i!bS#$IU>)byqP}OxxUEcox6$D4F!ME8IoQ#c5$t>0}e-8d#7nZ0=8{~)k z%7&cl=+7?{3~#1PZT10%ga;Ffzu|k>&h%(~D6&%U62|rL0tJJSz^8iL7hN*;1*Ppb zjQrf3pzx@CGg4Gx{+hhAX!R$WEp+V)oa%I+sE~r+A=xgA5MK;3diFCmw=OJ+p59V6 z3AYLhpXLmF92qtM?E;$%Gs+f_M4<>(#+@C8u9^mZrUyP(N2Zjez0>#36cz3mx~Q(& zZBzkQrf@R{vZ+RaWCAOfy!VC7<50bIsFW<@Xvakf;?tL>Be)`qunz{aa3<4_TR`*mTTQw+T`gAK? zlmRh^;i%`+^2S;IQx>i#cQ&pH6PtX6?rT_L{XfYv<=8=<^94{)PytG+FNpIptMa0tAcuOp- zfYc#pa=h#RYJaVH{AgUEpYS=mZtFhZ*b`p@o*w_#SW50S1lB7WLKN&1^QU{0^i@HM!#k zK9Vy;S7!io3_u9mpWU0mKOnxiL!5cuYEPAjdPR+!hxOL4pIn8Xg z5Y*}7esYHDtXSI@?*9;s5jhEW+nwxR+R;7_xAQ$&S70{oXalNS@2;+*Fu^a-%TL{x zYnH_uo~mbFCMycNuJ;j^folqW@iFsdteOLqdi3EpL2yq@FOEQZDPknLS)J`f@p!xM z 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

b?kl;DXp8$W 0 \\ - |A_k + A_{k+1}| & \text{if } (z_k - z_c)(z_{k+1}-z_c) \le 0 \\ + |A_k - A_{k+1}| & \text{if } (z_k - h)(z_{k+1}-h) > 0 \\ + |A_k + A_{k+1}| & \text{if } (z_k - h)(z_{k+1}-h) \le 0 \\ \end{cases} An example of the Fitch model is in ``Exec/Fitch`` -.. 1: +.. _fig:WindFarm: .. figure:: ../figures/WindFarm_Fitch.png :width: 300 @@ -64,18 +67,150 @@ An example of the Fitch model is in ``Exec/Fitch`` Horizontal view of the wind farm in the Fitch model -- shows a wind farm in cell `(i,j)` with 5 wind turbines. The turbines are discretized only in the vertical direction. -.. 2: +.. _fig:WindTurbine_Fitch: .. figure:: ../figures/WindTurbine_Fitch.png - :width: 300 + :width: 400 :align: center The vertical discretization of the wind turbine in the Fitch model. -.. 3: +.. _fig:Fitch_Aijk: .. figure:: ../figures/FitchModel_A_ijk.png :width: 400 :align: center The area terminology in the Fitch model. The circle represents the area swept by the turbine blades. + + +.. _explicit-wake-parametrization-ewp-model: + +Explicit Wake Parametrization (EWP) model +----------------------------------------- + +The Explicit Wake Parametrization (EWP) model [`Volker et al. 2015`_] is very similar to the Fitch model, and models the effect of wind farms as source terms in the governing equations for the horizontal components of momentum (i.e., :math:`x` and :math:`y` momentum) and the turbulent kinetic energy (TKE). At a given cell :math:`(i,j,k)`, the source terms in the governing equations are: + +.. math:: + \frac{\partial u_{ijk}}{\partial t} = -\sqrt{\frac{\pi}{8}}\frac{N_{ij}c_tr_0^2\overline{u}_0^2}{\Delta x \Delta y \sigma_e} + \exp\left\{-\frac{1}{2}\left(\frac{z-h}{\sigma_e}\right)^2\right\}\cos(\phi(k)) + +.. math:: + \frac{\partial v_{ijk}}{\partial t} = -\sqrt{\frac{\pi}{8}}\frac{N_{ij}c_tr_0^2\overline{u}_0^2}{\Delta x \Delta y \sigma_e} + \exp\left\{-\frac{1}{2}\left(\frac{z-h}{\sigma_e}\right)^2\right\}\sin(\phi(k)) + +.. math:: + \frac{\partial \text{TKE}_{ijk}}{\partial t} = -N_{ij}\rho A_rc_t\langle \overline{u}_{i,h}\overline{u'^2}_{i,h}\rangle + +with + +.. math:: + \sigma_e = \frac{\overline{u}_0}{3KL}\left[\left(\frac{2KL}{\overline{u}_0} + \sigma_0^2\right)^{\frac{3}{2}} - \sigma_0^3\right] + +where :math:`N_{ij}` is the number of turbines in cell :math:`(i,j)`, :math:`c_t` is the thrust coefficient, :math:`r_0` is the rotor radius, :math:`\overline{u}_0` is the mean advection velocity at hub height, :math:`h` is the hub height, :math:`\sigma_0 \approx 1.7 r_0` [`Volker et al. 2017`_] is a length scale that accounts for near-wake expansion, :math:`L` is the downstream distance that the wake travels within the cell approximated as a fraction of the cell size, :math:`K` is the turbulence eddy diffusivity (:math:`m^2/s`), :math:`\Delta x` and :math:`\Delta y` are the mesh sizes in the horizontal directions, and :math:`\phi(k)` is the wind direction with respect to the x-axis. :math:`\overline{u}_{i,h}` and :math:`\overline{u'}_{i,h}` are the mean and the fluctuating values of the velocity components (subscript :math:`i` is the direction index) at the hub height :math:`h`, :math:`A_r = \pi r^2` is the swept area of the rotor and :math:`\rho` is the density of air. + +The EWP model does not have a concept of intersected area by the turbine rotor like the Fitch model (see :ref:`Fitch model`). The exponential factor in the source terms for the velocities models the effect of the rotor for the momentum sinks (see Fig. :numref:`fig:WindTurbine_EWP`), and the turbulent kinetic energy source term only depends on the density, hub-height mean velocities and fluctuations, and the total swept area of the rotor :math:`A_r`. + +.. _fig:WindTurbine_EWP: + +.. figure:: ../figures/WindTurbine_EWP.png + :width: 400 + :align: center + + In the EWP model, the exponential factor in the source terms for the velocities models the effect of the rotor for the momentum sinks unlike the Fitch model which computes the + intersected area (see Fig. :numref:`fig:WindTurbine_Fitch`). + +.. _`Volker et al. 2015`: https://gmd.copernicus.org/articles/8/3715/2015/ +.. _`Volker et al. 2017`: https://iopscience.iop.org/article/10.1088/1748-9326/aa5d86 + + +.. _Inputs: + +Inputs for wind farm parametrization models +------------------------------------------------------------ + +Fitch, EWP +~~~~~~~~~~~ + +The following are the inputs required for simulations with Fitch, EWP models. + +.. code-block:: cpp + + // The parametrization model - Fitch, EWP + erf.windfarm_type = "Fitch" + + // How are the turbine locations specified? - using latitude-longitude + // format or x-y format? lat_lon or x_y + erf.windfarm_loc_type = "lat_lon" + + // If using lat_lon, then the latitude and longitude of + // the lower bottom corner of the domain has to be specified + // The following means 35 deg N, 100 deg W (note the negative sign) + erf.latitude_lo = 35.0 + erf.longitude_lo = -100.0 + + // Table having the wind turbine locations + erf.windfarm_loc_table = "windturbines_1WT.txt" + + // Table having the specifications of the wind turbines. All turbines are assumed to + // have the same specifications + erf.windfarm_spec_table = "wind-turbine_1WT.tbl" + +1. ``erf.windfarm_type`` has to be one of the supported models - ``Fitch``, ``EWP``. +2. ``erf.windfarm_loc_type`` is a variable to specify how the wind turbine locations in the wind farm is specified. If using the latitude and longitude of the turbine location, this has to be ``lat_lon`` or if using x and y co-ordinates to specify the turbine locations, this input is ``x_y``. + + - If using ``lat_lon`` format, ``erf.latitude_lo`` and ``erf.longitude_lo`` specifies the latitude and longitude of the lower bottom corner of the domain box. ie. if the domain box is specified as + + .. code-block:: cpp + + geometry.prob_lo = -25000. 0. -10000 + geometry.prob_hi = 25000. 10000. 10000. + + then ``(erf.latitude_lo, erf.longitude_lo)`` corresponds to ``(-25000, 0, -10000)``. + + - If using ``x_y`` format, there is no need to specify the ``erf.latitude_lo`` and ``erf.longitude_lo``. + +3. The ``erf.windfarm_loc_table`` specifies the locations of the wind turbines in the wind farm. + + - For the latitude-longitude format, an example is as below. Each line specifies the latitude and longitude of the wind turbine location. The third entry simply has to be always 1 (WRF requires the third entry to be always 1, so maintaining same format here). The first entry means that the turbine is located at ``35.7828 deg N, 99.0168 deg W`` (note the negative sign in the entry corresponding to West). + + .. code-block:: cpp + + 35.7828828829 -99.0168 1 + 35.8219219219 -99.0168 1 + 35.860960961 -99.0168 1 + 35.9 -99.0168 1 + 35.939039039 -99.0168 1 + 35.9780780781 -99.0168 1 + 36.0171171171 -99.0168 1 + 35.7828828829 -98.9705333333 1 + + - For the x-y format, an example is as below. Each line specifies the x and y co-ordinates of the wind turbine location in metres + + .. code-block:: cpp + + 89264.99080053 91233.3333309002 + 89259.1966417755 95566.6666710007 + 89254.1277665419 99900.0000000001 + 89249.7842982733 104233.333329 + 89246.1663427532 108566.6666691 + 89243.2739881117 112899.9999981 + 93458.6633652711 86900.0000019001 + 93450.4377452458 91233.3333309002 + 93442.9032518779 95566.6666710007 + +4. The ``erf.windfarm_spec_table`` gives the specifications of the wind turbines in the wind farm. All wind turbines are assumed to have the same specifications. Here is a sample specifications table. + +.. code-block:: cpp + + 4 + 119.0 178.0 0.130 2.0 + 9 0.805 50.0 + 10 0.805 50.0 + 11 0.805 50.0 + 12 0.805 50.0 + +The first line is the number of pairs of entries for the power curve and thrust coefficient (there are 4 entries in this table which are in the last four lines of the table). +The second line gives the height in meters of the turbine hub, the diameter in +meters of the rotor, the standing thrust coefficient, and the nominal power of the turbine in MW. +The remaining lines (four in this case) contain the three values of: wind speed (m/s), thrust coefficient, and power production in kW. From 5070ed8dc7635cd890dea6b5496bfb52b432c0d1 Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Mon, 17 Jun 2024 13:14:01 -0700 Subject: [PATCH 9/9] Refactor windfarm parametrization (#1643) * Correction to Fitch source terms * Some changes to the test case * Adding new test case PBL-1WT * Some changes to inputs * Include sponge zones * Updating EWP test case * Some changes to EWP * Removing unwanted file * Refactor of windfarm routines * Removing unwanted lines * Generalizing read-in of wind farm specifications and locations * Removing unwanted dir * Correcting input reading hooks * Updating inputs * Updating inputs * Updating inputs * Renaming some input files * Some more warning hooks --------- Co-authored-by: Mahesh Natarajan --- Exec/EWP/inputs_1WT_lat_lon | 106 ++++++++++++ Exec/EWP/inputs_1WT_x_y | 104 ++++++++++++ Exec/EWP/inputs_WindFarm_lat_lon | 85 ++++++++++ ...nputs_EWP_WindFarm => inputs_WindFarm_x_y} | 9 +- Exec/EWP/windturbines.txt_LargeDomain | 30 ---- Exec/EWP/windturbines_WindFarm.txt | 97 ----------- Exec/EWP/windturbines_loc_lat_lon_1WT.txt | 2 + ... => windturbines_loc_lat_lon_WindFarm.txt} | 0 Exec/EWP/windturbines_loc_x_y_1WT.txt | 1 + Exec/EWP/windturbines_loc_x_y_WindFarm.txt | 96 +++++++++++ Exec/EWP/windturbines_spec_1WT.tbl | 6 + ...e-1.tbl => windturbines_spec_WindFarm.tbl} | 0 Source/DataStructs/DataStruct.H | 28 +++- Source/ERF.H | 13 +- Source/Initialization/ERF_init_windfarm.cpp | 151 ++++++++++++------ .../EWP/AdvanceEWP.cpp | 17 +- .../Fitch/AdvanceFitch.cpp | 37 +++-- Source/WindFarmParametrization/WindFarm.H | 5 + Source/WindFarmParametrization/WindFarm.cpp | 47 ++++++ 19 files changed, 626 insertions(+), 208 deletions(-) create mode 100644 Exec/EWP/inputs_1WT_lat_lon create mode 100644 Exec/EWP/inputs_1WT_x_y create mode 100644 Exec/EWP/inputs_WindFarm_lat_lon rename Exec/EWP/{inputs_EWP_WindFarm => inputs_WindFarm_x_y} (89%) delete mode 100644 Exec/EWP/windturbines.txt_LargeDomain delete mode 100644 Exec/EWP/windturbines_WindFarm.txt create mode 100644 Exec/EWP/windturbines_loc_lat_lon_1WT.txt rename Exec/EWP/{windturbines.txt => windturbines_loc_lat_lon_WindFarm.txt} (100%) create mode 100644 Exec/EWP/windturbines_loc_x_y_1WT.txt create mode 100644 Exec/EWP/windturbines_loc_x_y_WindFarm.txt create mode 100644 Exec/EWP/windturbines_spec_1WT.tbl rename Exec/EWP/{wind-turbine-1.tbl => windturbines_spec_WindFarm.tbl} (100%) diff --git a/Exec/EWP/inputs_1WT_lat_lon b/Exec/EWP/inputs_1WT_lat_lon new file mode 100644 index 000000000..fe77134fb --- /dev/null +++ b/Exec/EWP/inputs_1WT_lat_lon @@ -0,0 +1,106 @@ +# ------------------ INPUTS TO MAIN PROGRAM ------------------- +max_step = 3000 + +amrex.fpe_trap_invalid = 1 + +fabarray.mfiter_tile_size = 1024 1024 1024 + +# PROBLEM SIZE & GEOMETRY +geometry.prob_extent = 100000.0 100000.0 1000 +amr.n_cell = 50 50 80 + +# WINDFARM PARAMETRIZATION PARAMETERS +erf.windfarm_type = "Fitch" +erf.windfarm_loc_type = "lat_lon" +erf.latitude_lo = 35.0 +erf.longitude_lo = -100.0 +erf.windfarm_loc_table = "windturbines_loc_lat_lon_1WT.txt" +erf.windfarm_spec_table = "windturbines_spec_1WT.tbl" + +#erf.grid_stretching_ratio = 1.025 +#erf.initial_dz = 16.0 + +geometry.is_periodic = 0 0 0 + +# MOST BOUNDARY (DEFAULT IS ADIABATIC FOR THETA) +#zlo.type = "MOST" +#erf.most.z0 = 0.1 +#erf.most.zref = 8.0 + +zlo.type = "SlipWall" +zhi.type = "SlipWall" +xlo.type = "Inflow" +xhi.type = "Outflow" +ylo.type = "Outflow" +yhi.type = "Outflow" + +xlo.velocity = 10. 0. 0. +xlo.density = 1.226 +xlo.theta = 300. + +#erf.sponge_strength = 0.1 +#erf.use_xlo_sponge_damping = true +#erf.xlo_sponge_end = 10000.0 +#erf.use_xhi_sponge_damping = true +#erf.xhi_sponge_start = 90000.0 + +#erf.sponge_density = 1.226 +#erf.sponge_x_velocity = 10.0 +#erf.sponge_y_velocity = 0.0 +#erf.sponge_z_velocity = 0.0 + + +# TIME STEP CONTROL +erf.use_native_mri = 1 +erf.fixed_dt = 3.0 # fixed time step depending on grid resolution +#erf.fixed_fast_dt = 0.0025 + +# DIAGNOSTICS & VERBOSITY +erf.sum_interval = 1 # timesteps between computing mass +erf.v = 1 # verbosity in ERF.cpp +amr.v = 1 # verbosity in Amr.cpp + +# REFINEMENT / REGRIDDING +amr.max_level = 0 # maximum level number allowed + +# CHECKPOINT FILES +erf.check_file = chk # root name of checkpoint file +erf.check_int = 1000 # number of timesteps between checkpoints +#erf.restart = chk02000 + +# PLOTFILES +erf.plot_file_1 = plt # prefix of plotfile name +erf.plot_int_1 = 100 # number of timesteps between plotfiles +erf.plot_vars_1 = density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb vorticity + +# ADVECTION SCHEMES +erf.dycore_horiz_adv_type = "Centered_2nd" +erf.dycore_vert_adv_type = "Centered_2nd" +erf.dryscal_horiz_adv_type = "Centered_2nd" +erf.dryscal_vert_adv_type = "Centered_2nd" +erf.moistscal_horiz_adv_type = "Centered_2nd" +erf.moistscal_vert_adv_type = "Centered_2nd" + +# SOLVER CHOICE +erf.alpha_T = 0.0 +erf.alpha_C = 1.0 +erf.use_gravity = false + +erf.molec_diff_type = "ConstantAlpha" +erf.les_type = "None" +erf.Cs = 1.5 +erf.dynamicViscosity = 10.0 + +erf.pbl_type = "None" + +erf.init_type = "uniform" + + +# PROBLEM PARAMETERS +prob.rho_0 = 1.226 +prob.A_0 = 1.0 + +prob.U_0 = 10.0 +prob.V_0 = 0.0 +prob.W_0 = 0.0 +prob.T_0 = 300.0 diff --git a/Exec/EWP/inputs_1WT_x_y b/Exec/EWP/inputs_1WT_x_y new file mode 100644 index 000000000..ee14f42cf --- /dev/null +++ b/Exec/EWP/inputs_1WT_x_y @@ -0,0 +1,104 @@ +# ------------------ INPUTS TO MAIN PROGRAM ------------------- +max_step = 3000 + +amrex.fpe_trap_invalid = 1 + +fabarray.mfiter_tile_size = 1024 1024 1024 + +# PROBLEM SIZE & GEOMETRY +geometry.prob_extent = 100000.0 100000.0 1000 +amr.n_cell = 50 50 80 + +# WINDFARM PARAMETRIZATION PARAMETERS +erf.windfarm_type = "EWP" +erf.windfarm_loc_type = "x_y" +erf.windfarm_loc_table = "windturbines_loc_x_y_1WT.txt" +erf.windfarm_spec_table = "windturbines_spec_1WT.tbl" + +#erf.grid_stretching_ratio = 1.025 +#erf.initial_dz = 16.0 + +geometry.is_periodic = 0 0 0 + +# MOST BOUNDARY (DEFAULT IS ADIABATIC FOR THETA) +#zlo.type = "MOST" +#erf.most.z0 = 0.1 +#erf.most.zref = 8.0 + +zlo.type = "SlipWall" +zhi.type = "SlipWall" +xlo.type = "Inflow" +xhi.type = "Outflow" +ylo.type = "Outflow" +yhi.type = "Outflow" + +xlo.velocity = 10. 0. 0. +xlo.density = 1.226 +xlo.theta = 300. + +#erf.sponge_strength = 0.1 +#erf.use_xlo_sponge_damping = true +#erf.xlo_sponge_end = 10000.0 +#erf.use_xhi_sponge_damping = true +#erf.xhi_sponge_start = 90000.0 + +#erf.sponge_density = 1.226 +#erf.sponge_x_velocity = 10.0 +#erf.sponge_y_velocity = 0.0 +#erf.sponge_z_velocity = 0.0 + + +# TIME STEP CONTROL +erf.use_native_mri = 1 +erf.fixed_dt = 3.0 # fixed time step depending on grid resolution +#erf.fixed_fast_dt = 0.0025 + +# DIAGNOSTICS & VERBOSITY +erf.sum_interval = 1 # timesteps between computing mass +erf.v = 1 # verbosity in ERF.cpp +amr.v = 1 # verbosity in Amr.cpp + +# REFINEMENT / REGRIDDING +amr.max_level = 0 # maximum level number allowed + +# CHECKPOINT FILES +erf.check_file = chk # root name of checkpoint file +erf.check_int = 1000 # number of timesteps between checkpoints +#erf.restart = chk02000 + +# PLOTFILES +erf.plot_file_1 = plt # prefix of plotfile name +erf.plot_int_1 = 100 # number of timesteps between plotfiles +erf.plot_vars_1 = density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb vorticity + +# ADVECTION SCHEMES +erf.dycore_horiz_adv_type = "Centered_2nd" +erf.dycore_vert_adv_type = "Centered_2nd" +erf.dryscal_horiz_adv_type = "Centered_2nd" +erf.dryscal_vert_adv_type = "Centered_2nd" +erf.moistscal_horiz_adv_type = "Centered_2nd" +erf.moistscal_vert_adv_type = "Centered_2nd" + +# SOLVER CHOICE +erf.alpha_T = 0.0 +erf.alpha_C = 1.0 +erf.use_gravity = false + +erf.molec_diff_type = "ConstantAlpha" +erf.les_type = "None" +erf.Cs = 1.5 +erf.dynamicViscosity = 10.0 + +erf.pbl_type = "None" + +erf.init_type = "uniform" + + +# PROBLEM PARAMETERS +prob.rho_0 = 1.226 +prob.A_0 = 1.0 + +prob.U_0 = 10.0 +prob.V_0 = 0.0 +prob.W_0 = 0.0 +prob.T_0 = 300.0 diff --git a/Exec/EWP/inputs_WindFarm_lat_lon b/Exec/EWP/inputs_WindFarm_lat_lon new file mode 100644 index 000000000..e6ebae87b --- /dev/null +++ b/Exec/EWP/inputs_WindFarm_lat_lon @@ -0,0 +1,85 @@ +# ------------------ INPUTS TO MAIN PROGRAM ------------------- +max_step = 100000 + +amrex.fpe_trap_invalid = 1 + +fabarray.mfiter_tile_size = 1024 1024 1024 + +# PROBLEM SIZE & GEOMETRY +geometry.prob_extent = 200150 202637 1000 +amr.n_cell = 50 50 40 + +# WINDFARM PARAMETRIZATION PARAMETERS +erf.windfarm_type = "Fitch" +erf.windfarm_loc_type = "lat_lon" +erf.latitude_lo = 35.0 +erf.longitude_lo = -100.0 +erf.windfarm_loc_table = "windturbines_loc_lat_lon_WindFarm.txt" +erf.windfarm_spec_table = "windturbines_spec_WindFarm.tbl" + + +#erf.grid_stretching_ratio = 1.025 +#erf.initial_dz = 16.0 + +geometry.is_periodic = 0 0 0 + +# MOST BOUNDARY (DEFAULT IS ADIABATIC FOR THETA) +#zlo.type = "MOST" +#erf.most.z0 = 0.1 +#erf.most.zref = 8.0 + +zlo.type = "SlipWall" +zhi.type = "SlipWall" +xlo.type = "Outflow" +xhi.type = "Outflow" +ylo.type = "Outflow" +yhi.type = "Outflow" + +# TIME STEP CONTROL +erf.use_native_mri = 1 +erf.fixed_dt = 0.25 # fixed time step depending on grid resolution +#erf.fixed_fast_dt = 0.0025 + +# DIAGNOSTICS & VERBOSITY +erf.sum_interval = 1 # timesteps between computing mass +erf.v = 1 # verbosity in ERF.cpp +amr.v = 1 # verbosity in Amr.cpp + +# REFINEMENT / REGRIDDING +amr.max_level = 0 # maximum level number allowed + +# CHECKPOINT FILES +erf.check_file = chk # root name of checkpoint file +erf.check_int = 10000 # number of timesteps between checkpoints +#erf.restart = chk02000 + +# PLOTFILES +erf.plot_file_1 = plt # prefix of plotfile name +erf.plot_int_1 = 1000 # number of timesteps between plotfiles +erf.plot_vars_1 = density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb vorticity + +# SOLVER CHOICE +erf.alpha_T = 0.0 +erf.alpha_C = 1.0 +erf.use_gravity = false + +erf.molec_diff_type = "ConstantAlpha" +erf.les_type = "None" +erf.Cs = 1.5 +erf.dynamicViscosity = 100.0 + +erf.pbl_type = "None" + +erf.init_type = "uniform" + +erf.windfarm_type = "EWP" + +# PROBLEM PARAMETERS +prob.rho_0 = 1.0 +prob.A_0 = 1.0 + +prob.U_0 = 10.0 +prob.V_0 = 10.0 +prob.W_0 = 0.0 +prob.T_0 = 300.0 + diff --git a/Exec/EWP/inputs_EWP_WindFarm b/Exec/EWP/inputs_WindFarm_x_y similarity index 89% rename from Exec/EWP/inputs_EWP_WindFarm rename to Exec/EWP/inputs_WindFarm_x_y index b7284ee28..7fbed1830 100644 --- a/Exec/EWP/inputs_EWP_WindFarm +++ b/Exec/EWP/inputs_WindFarm_x_y @@ -6,11 +6,16 @@ amrex.fpe_trap_invalid = 1 fabarray.mfiter_tile_size = 1024 1024 1024 # PROBLEM SIZE & GEOMETRY -erf.latitude_lo = 35.0 -erf.longitude_lo = -100.0 geometry.prob_extent = 200150 202637 1000 amr.n_cell = 50 50 40 +# WINDFARM PARAMETRIZATION PARAMETERS +erf.windfarm_type = "Fitch" +erf.windfarm_loc_type = "x_y" +erf.windfarm_loc_table = "windturbines_loc_x_y_WindFarm.txt" +erf.windfarm_spec_table = "windturbines_spec_WindFarm.tbl" + + #erf.grid_stretching_ratio = 1.025 #erf.initial_dz = 16.0 diff --git a/Exec/EWP/windturbines.txt_LargeDomain b/Exec/EWP/windturbines.txt_LargeDomain deleted file mode 100644 index 586e94b81..000000000 --- a/Exec/EWP/windturbines.txt_LargeDomain +++ /dev/null @@ -1,30 +0,0 @@ -36.732 -97.128 1 -36.824 -97.367 1 -36.967 -96.754 1 -36.607 -96.846 1 -36.719 -97.249 1 -36.889 -97.031 1 -36.621 -96.932 1 -36.752 -96.788 1 -36.855 -97.421 1 -36.694 -96.656 1 -36.579 -97.223 1 -36.912 -97.379 1 -36.721 -96.815 1 -36.685 -97.437 1 -36.781 -97.049 1 -36.936 -97.203 1 -36.541 -96.791 1 -36.655 -97.284 1 -36.798 -96.695 1 -36.887 -96.956 1 -36.633 -96.716 1 -36.912 -96.813 1 -36.725 -96.579 1 -36.594 -97.184 1 -36.902 -97.354 1 -36.628 -96.871 1 -36.762 -97.428 1 -36.811 -97.285 1 -36.549 -97.492 1 -36.642 -96.673 1 diff --git a/Exec/EWP/windturbines_WindFarm.txt b/Exec/EWP/windturbines_WindFarm.txt deleted file mode 100644 index 4c68601f6..000000000 --- a/Exec/EWP/windturbines_WindFarm.txt +++ /dev/null @@ -1,97 +0,0 @@ -35.7828828829 -99.0168 1 -35.8219219219 -99.0168 1 -35.860960961 -99.0168 1 -35.9 -99.0168 1 -35.939039039 -99.0168 1 -35.9780780781 -99.0168 1 -36.0171171171 -99.0168 1 -35.7828828829 -98.9705333333 1 -35.8219219219 -98.9705333333 1 -35.860960961 -98.9705333333 1 -35.9 -98.9705333333 1 -35.939039039 -98.9705333333 1 -35.9780780781 -98.9705333333 1 -36.0171171171 -98.9705333333 1 -35.7828828829 -98.9242666667 1 -35.8219219219 -98.9242666667 1 -35.860960961 -98.9242666667 1 -35.9 -98.9242666667 1 -35.939039039 -98.9242666667 1 -35.9780780781 -98.9242666667 1 -36.0171171171 -98.9242666667 1 -35.7828828829 -98.878 1 -35.8219219219 -98.878 1 -35.860960961 -98.878 1 -35.9 -98.878 1 -35.939039039 -98.878 1 -35.9780780781 -98.878 1 -36.0171171171 -98.878 1 -35.7828828829 -98.8317333333 1 -35.8219219219 -98.8317333333 1 -35.860960961 -98.8317333333 1 -35.9 -98.8317333333 1 -35.939039039 -98.8317333333 1 -35.9780780781 -98.8317333333 1 -36.0171171171 -98.8317333333 1 -35.7828828829 -98.7854666667 1 -35.8219219219 -98.7854666667 1 -35.860960961 -98.7854666667 1 -35.9 -98.7854666667 1 -35.939039039 -98.7854666667 1 -35.9780780781 -98.7854666667 1 -36.0171171171 -98.7854666667 1 -35.7828828829 -98.7392 1 -35.8219219219 -98.7392 1 -35.860960961 -98.7392 1 -35.9 -98.7392 1 -35.939039039 -98.7392 1 -35.9780780781 -98.7392 1 -36.0171171171 -98.7392 1 -35.463963964 -98.2228 1 -35.487987988 -98.2228 1 -35.512012012 -98.2228 1 -35.536036036 -98.2228 1 -35.463963964 -98.1929333333 1 -35.487987988 -98.1929333333 1 -35.512012012 -98.1929333333 1 -35.536036036 -98.1929333333 1 -35.463963964 -98.1630666667 1 -35.487987988 -98.1630666667 1 -35.512012012 -98.1630666667 1 -35.536036036 -98.1630666667 1 -35.463963964 -98.1332 1 -35.487987988 -98.1332 1 -35.512012012 -98.1332 1 -35.536036036 -98.1332 1 -36.363963964 -99.4228 1 -36.387987988 -99.4228 1 -36.412012012 -99.4228 1 -36.436036036 -99.4228 1 -36.363963964 -99.3929333333 1 -36.387987988 -99.3929333333 1 -36.412012012 -99.3929333333 1 -36.436036036 -99.3929333333 1 -36.363963964 -99.3630666667 1 -36.387987988 -99.3630666667 1 -36.412012012 -99.3630666667 1 -36.436036036 -99.3630666667 1 -36.363963964 -99.3332 1 -36.387987988 -99.3332 1 -36.412012012 -99.3332 1 -36.436036036 -99.3332 1 -35.263963964 -99.5228 1 -35.287987988 -99.5228 1 -35.312012012 -99.5228 1 -35.336036036 -99.5228 1 -35.263963964 -99.4929333333 1 -35.287987988 -99.4929333333 1 -35.312012012 -99.4929333333 1 -35.336036036 -99.4929333333 1 -35.263963964 -99.4630666667 1 -35.287987988 -99.4630666667 1 -35.312012012 -99.4630666667 1 -35.336036036 -99.4630666667 1 -35.263963964 -99.4332 1 -35.287987988 -99.4332 1 -35.312012012 -99.4332 1 -35.336036036 -99.4332 1 diff --git a/Exec/EWP/windturbines_loc_lat_lon_1WT.txt b/Exec/EWP/windturbines_loc_lat_lon_1WT.txt new file mode 100644 index 000000000..b78b36903 --- /dev/null +++ b/Exec/EWP/windturbines_loc_lat_lon_1WT.txt @@ -0,0 +1,2 @@ +35.45 -99.5 1 + diff --git a/Exec/EWP/windturbines.txt b/Exec/EWP/windturbines_loc_lat_lon_WindFarm.txt similarity index 100% rename from Exec/EWP/windturbines.txt rename to Exec/EWP/windturbines_loc_lat_lon_WindFarm.txt diff --git a/Exec/EWP/windturbines_loc_x_y_1WT.txt b/Exec/EWP/windturbines_loc_x_y_1WT.txt new file mode 100644 index 000000000..e58d4be2e --- /dev/null +++ b/Exec/EWP/windturbines_loc_x_y_1WT.txt @@ -0,0 +1 @@ +45513.3107451298 49950.0000000004 diff --git a/Exec/EWP/windturbines_loc_x_y_WindFarm.txt b/Exec/EWP/windturbines_loc_x_y_WindFarm.txt new file mode 100644 index 000000000..19fe95746 --- /dev/null +++ b/Exec/EWP/windturbines_loc_x_y_WindFarm.txt @@ -0,0 +1,96 @@ +89264.99080053 91233.3333309002 +89259.1966417755 95566.6666710007 +89254.1277665419 99900.0000000001 +89249.7842982733 104233.333329 +89246.1663427532 108566.6666691 +89243.2739881117 112899.9999981 +93458.6633652711 86900.0000019001 +93450.4377452458 91233.3333309002 +93442.9032518779 95566.6666710007 +93436.0600522829 99900.0000000001 +93429.9082982192 104233.333329 +93424.4481261366 108566.6666691 +93419.6796571948 112899.9999981 +97646.3846285663 86900.0000019001 +97636.5111258549 91233.3333309002 +97627.2975408011 95566.6666710007 +97618.7440601867 99900.0000000001 +97610.850857392 104233.333329 +97603.6180924568 108566.6666691 +97597.045912112 112899.9999981 +101834.602975817 86900.0000019001 +101823.132838651 91233.3333309002 +101812.293876018 95566.6666710007 +101802.086289453 99900.0000000001 +101792.510268736 104233.333329 +101783.565991962 108566.6666691 +101775.253625592 112899.9999981 +106023.258628483 86900.0000019001 +106010.237048028 91233.3333309002 +105997.820076828 95566.6666710007 +105986.007927316 99900.0000000001 +105974.800801568 104233.333329 +105964.198891379 108566.6666691 +105954.202378331 112899.9999981 +110212.300853635 86900.0000019001 +110197.767881144 91233.3333309002 +110183.814885453 95566.6666710007 +110170.442086857 99900.0000000001 +110157.64969648 104233.333329 +110145.437916369 108566.6666691 +110133.806939566 112899.9999981 +114401.686336999 86900.0000019001 +114385.677633874 91233.3333309002 +114370.225998194 95566.6666710007 +114355.331655708 99900.0000000001 +114340.994824013 104233.333329 +114327.215712655 108566.6666691 +114313.994523223 112899.9999981 +161442.612044564 51500.0000039998 +161421.662101279 54166.666668 +161400.854802928 56833.3333320002 +161380.190204659 59499.9999960004 +164154.692973227 51500.0000039998 +164133.28852851 54166.666668 +164112.023937775 56833.3333320002 +164090.899255367 59499.9999960004 +166866.785694878 51500.0000039998 +166844.928396839 54166.666668 +166823.208245294 56833.3333320002 +166801.625293788 59499.9999960004 +169578.889421966 51500.0000039998 +169556.58083956 54166.666668 +169534.406775621 56833.3333320002 +169512.367282909 59499.9999960004 +52896.6844501924 151400.000004 +52915.9012759738 154066.666668 +52935.5802920911 156733.333332 +52955.7209832526 159399.999996 +55556.8294903758 151400.000004 +55574.333630956 154066.666668 +55592.2786959773 156733.333332 +55610.6642585664 159399.999996 +58220.3999614163 151400.000004 +58236.3087392296 154066.666668 +58252.6389095071 156733.333332 +58269.390117932 159399.999996 +60886.9461031228 151400.000004 +60901.3618319475 154066.666668 +60916.1809602466 156733.333332 +60931.4031936588 159399.999996 +43430.4219718844 29300.0000039997 +43430.6186514159 31966.666668 +43431.3883478816 34633.3333320001 +43432.7310308126 37299.9999960003 +46144.3886884569 29300.0000039997 +46143.7943466196 31966.666668 +46143.7390225352 34633.3333320001 +46144.2227181378 37299.9999960003 +48858.5817150023 29300.0000039997 +48857.2395489498 31966.666668 +48856.4061323542 34633.3333320001 +48856.0814912463 37299.9999960003 +51572.9651124459 29300.0000039997 +51570.9115091189 31966.666668 +51569.3395333094 34633.3333320001 +51568.2492290571 37299.9999960003 diff --git a/Exec/EWP/windturbines_spec_1WT.tbl b/Exec/EWP/windturbines_spec_1WT.tbl new file mode 100644 index 000000000..e1abbf4cf --- /dev/null +++ b/Exec/EWP/windturbines_spec_1WT.tbl @@ -0,0 +1,6 @@ +4 +119.0 178.0 0.130 2.0 +9 0.805 50.0 +10 0.805 50.0 +11 0.805 50.0 +12 0.805 50.0 diff --git a/Exec/EWP/wind-turbine-1.tbl b/Exec/EWP/windturbines_spec_WindFarm.tbl similarity index 100% rename from Exec/EWP/wind-turbine-1.tbl rename to Exec/EWP/windturbines_spec_WindFarm.tbl diff --git a/Source/DataStructs/DataStruct.H b/Source/DataStructs/DataStruct.H index a3351c756..f3ebcb0b4 100644 --- a/Source/DataStructs/DataStruct.H +++ b/Source/DataStructs/DataStruct.H @@ -40,6 +40,10 @@ enum struct WindFarmType { Fitch, EWP, None }; +enum struct WindFarmLocType{ + lat_lon, x_y, None +}; + enum struct LandSurfaceType { SLM, MM5, None }; @@ -306,8 +310,26 @@ struct SolverChoice { windfarm_type = WindFarmType::EWP; } else if (windfarm_type_string != "None") { - amrex::Abort("Dont know this windfarm_type. Currently only Fitch and EWP models are supported."); + amrex::Abort("Are you using windfarms? Dont know this windfarm_type. windfarm_type" + " has to be Fitch or EWP or None."); + } + + static std::string windfarm_loc_type_string = "None"; + windfarm_loc_type = WindFarmLocType::None; + pp.query("windfarm_loc_type", windfarm_loc_type_string); + if (windfarm_loc_type_string == "lat_lon") { + windfarm_loc_type = WindFarmLocType::lat_lon; } + else if (windfarm_loc_type_string == "x_y") { + windfarm_loc_type = WindFarmLocType::x_y; + } + else if (windfarm_loc_type_string != "None") { + amrex::Abort("Are you using windfarms? Dont know this windfarm_loc_type." + " windfarm_loc_type has to be specified as lat_lon or x_y."); + } + + pp.query("windfarm_loc_table", windfarm_loc_table); + pp.query("windfarm_spec_table", windfarm_spec_table); // Test if time averaged data is to be output pp.query("time_avg_vel",time_avg_vel); @@ -473,6 +495,7 @@ struct SolverChoice { TerrainType terrain_type; MoistureType moisture_type; WindFarmType windfarm_type; + WindFarmLocType windfarm_loc_type; LandSurfaceType lsm_type; ABLDriverType abl_driver_type; @@ -485,6 +508,7 @@ struct SolverChoice { bool do_precip {true}; bool use_moist_background {false}; - amrex::Real latitude_lo, longitude_lo; + amrex::Real latitude_lo=-1e10, longitude_lo=-1e10; + std::string windfarm_loc_table, windfarm_spec_table; }; #endif diff --git a/Source/ERF.H b/Source/ERF.H index be20e0c2a..e7122ed5a 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -366,6 +366,14 @@ public: #ifdef ERF_USE_WINDFARM void init_windfarm(int lev); + void init_windfarm_lat_lon(const int lev, + const std::string windfarm_loc_table, + amrex::Vector& xloc, + amrex::Vector& yloc); + void init_windfarm_x_y(const int lev, + const std::string windfarm_loc_table, + amrex::Vector& xloc, + amrex::Vector& yloc); #endif #ifdef ERF_USE_EB @@ -630,12 +638,11 @@ private: std::unique_ptr micro; amrex::Vector> qmoist; // (lev,ncomp) This has up to 8 components: qt, qv, qc, qi, qp, qr, qs, qg + // Variables for wind farm parametrization models + amrex::Vector Nturb; amrex::Vector vars_windfarm; // Fitch: Vabs, Vabsdt, dudt, dvdt, dTKEdt // EWP: dudt, dvdt, dTKEdt - amrex::Real hub_height, rotor_dia, thrust_coeff_standing, nominal_power; - amrex::Vector wind_speed, thrust_coeff, power; - LandSurface lsm; amrex::Vector> lsm_data; // (lev,ncomp) Components: theta, q1, q2 diff --git a/Source/Initialization/ERF_init_windfarm.cpp b/Source/Initialization/ERF_init_windfarm.cpp index 7963ac01d..fdaf02765 100644 --- a/Source/Initialization/ERF_init_windfarm.cpp +++ b/Source/Initialization/ERF_init_windfarm.cpp @@ -3,6 +3,7 @@ */ #include +#include using namespace amrex; @@ -15,39 +16,17 @@ using namespace amrex; void ERF::init_windfarm (int lev) { - // Read turbine locations from windturbines.txt - std::ifstream file("windturbines.txt"); - if (!file.is_open()) { - amrex::Error("Wind turbines location file windturbines.txt not found"); + Vector xloc, yloc; + if(solverChoice.windfarm_loc_type == WindFarmLocType::lat_lon) { + init_windfarm_lat_lon(lev, solverChoice.windfarm_loc_table, xloc, yloc); } - // Vector of vectors to store the matrix - std::vector lat, lon, xloc, yloc; - Real value1, value2, value3; - while (file >> value1 >> value2 >> value3) { - lat.push_back(value1); - lon.push_back(value2); + else if(solverChoice.windfarm_loc_type == WindFarmLocType::x_y) { + init_windfarm_x_y(lev, solverChoice.windfarm_loc_table, xloc, yloc); } - file.close(); - - Real rad_earth = 6371.0e3; // Radius of the earth - Real lat_lo = solverChoice.latitude_lo*M_PI/180.0; - Real lon_lo = solverChoice.longitude_lo*M_PI/180.0; - - // (lat_lo, lon_lo) is mapped to (0,0) - - for(int it=0;it& xloc, + Vector& yloc) +{ - //The first line is the number of pairs entries for the power curve and thrust coefficient. - //The second line gives first the height in meters of the turbine hub, second, the diameter in - //meters of the rotor, third the standing thrust coefficient, and fourth the nominal power of - //the turbine in MW. - //The remaining lines contain the three values of: wind speed, thrust coefficient, and power production in kW. + if(solverChoice.latitude_lo == -1e10) { + amrex::Error("Are you using latitude-longitude for wind turbine locations? There needs to be" + " entry for erf.latitude_lo in the inputs for" + " the lower bottom corner of the domain"); + } - // Read turbine data from wind-turbine-1.tbl - std::ifstream file_turb_table("wind-turbine-1.tbl"); - if (!file_turb_table.is_open()) { - amrex::Error("Wind turbines location file wind-turbine-1.tbl not found"); + if(solverChoice.longitude_lo == -1e10) { + amrex::Error("Are you using latitude-longitude for wind turbine locations? There needs to be" + " entry erf.longitude_lo in the inputs for" + " the lower bottom corner of the domain"); } - int nlines; - file_turb_table >> nlines; - wind_speed.resize(nlines); - thrust_coeff.resize(nlines); - power.resize(nlines); + if(std::fabs(solverChoice.latitude_lo) > 90.0) { + amrex::Error("The value of erf.latitude_lo in the input file should be within -90 and 90"); + } - file_turb_table >> hub_height >> rotor_dia >> thrust_coeff_standing >> nominal_power; - if(rotor_dia/2.0 > hub_height) - { - amrex::Abort("The blade length is more than the hub height. Check the second line in wind-turbine-1.tbl. Aborting....."); + if(std::fabs(solverChoice.longitude_lo) > 180.0) { + amrex::Error("The value of erf.longitude_lo in the input file should be within -180 and 180"); } - for(int iline=0;iline> wind_speed[iline] >> thrust_coeff[iline] >> power[iline]; + // Read turbine locations from windturbines.txt + std::ifstream file(windfarm_loc_table); + if (!file.is_open()) { + amrex::Error("Wind turbines location table not found. Either the inputs is missing the" + " erf.windfarm_loc_table entry or the file specified in the entry " + windfarm_loc_table + " is missing."); + } + // Vector of vectors to store the matrix + Vector lat, lon; + Real value1, value2, value3; + + while (file >> value1 >> value2 >> value3) { + + if(std::fabs(value1) > 90.0) { + amrex::Error("The value of latitude for entry " + std::to_string(lat.size() + 1) + + " in " + windfarm_loc_table + " should be within -90 and 90"); + } + + if(std::fabs(value2) > 180.0) { + amrex::Error("The value of longitude for entry " + std::to_string(lat.size() + 1) + + " in " + windfarm_loc_table + " should be within -180 and 180"); + } + + if(std::fabs(solverChoice.longitude_lo) > 180.0) { + amrex::Error("The values of erf.longitude_lo should be within -180 and 180"); + } + lat.push_back(value1); + lon.push_back(value2); } file.close(); + + Real rad_earth = 6371.0e3; // Radius of the earth + + Real lat_lo = solverChoice.latitude_lo*M_PI/180.0; + Real lon_lo = solverChoice.longitude_lo*M_PI/180.0; + + // (lat_lo, lon_lo) is mapped to (0,0) + + for(int it=0;it& xloc, + Vector& yloc) +{ + // Read turbine locations from windturbines.txt + std::ifstream file(windfarm_loc_table); + if (!file.is_open()) { + amrex::Error("Wind turbines location table not found. Either the inputs is missing the" + " erf.windfarm_loc_table entry or the file specified in the entry " + windfarm_loc_table + " is missing."); + } + // Vector of vectors to store the matrix + Real value1, value2; + while (file >> value1 >> value2) { + xloc.push_back(value1); + yloc.push_back(value2); + } + file.close(); +} diff --git a/Source/WindFarmParametrization/EWP/AdvanceEWP.cpp b/Source/WindFarmParametrization/EWP/AdvanceEWP.cpp index fbe9f506e..d92f3ded9 100644 --- a/Source/WindFarmParametrization/EWP/AdvanceEWP.cpp +++ b/Source/WindFarmParametrization/EWP/AdvanceEWP.cpp @@ -1,10 +1,12 @@ +#include +#include #include #include + using namespace amrex; -Real R_ewp = 30.0; -Real z_c_ewp = 100.0; -Real C_T_ewp = 0.8, C_TKE_ewp = 0.0; +Real C_TKE_ewp = 0.0; +Real K_turb = 1.0; void ewp_advance (int lev, const Geometry& geom, @@ -60,6 +62,7 @@ void ewp_source_terms_cellcentered (const Geometry& geom, auto dx = geom.CellSizeArray(); auto ProbHiArr = geom.ProbHiArray(); auto ProbLoArr = geom.ProbLoArray(); + Real sigma_0 = 1.7*rotor_rad; // Domain valid box const amrex::Box& domain = geom.Domain(); @@ -102,13 +105,13 @@ void ewp_source_terms_cellcentered (const Geometry& geom, v_vel(i,j,k)*v_vel(i,j,k) + w_vel(i,j,kk)*w_vel(i,j,kk), 0.5); - Real L_wake = std::pow(dx[0]*dx[1],0.5); - Real K_turb = 100.0; - Real sigma_0 = 60.0; + Real C_T_ewp = interpolate_1d(wind_speed.dataPtr(), thrust_coeff.dataPtr(), z, wind_speed.size()); + + Real L_wake = std::pow(dx[0]*dx[1],0.5)/2.0; Real sigma_e = Vabs/(3.0*K_turb*L_wake)*(std::pow(2.0*K_turb*L_wake/Vabs + std::pow(sigma_0,2),3.0/2.0) - std::pow(sigma_0,3)); Real phi = std::atan2(v_vel(i,j,k),u_vel(i,j,k)); // Wind direction w.r.t the x-dreiction - Real fac = -std::pow(M_PI/8.0,0.5)*C_T_ewp*std::pow(R_ewp,2)*std::pow(Vabs,2)/(dx[0]*dx[1]*sigma_e)*std::exp(-0.5*std::pow((z - z_c_ewp)/sigma_e,2)); + Real fac = -std::pow(M_PI/8.0,0.5)*C_T_ewp*std::pow(rotor_rad,2)*std::pow(Vabs,2)/(dx[0]*dx[1]*sigma_e)*std::exp(-0.5*std::pow((z - hub_height)/sigma_e,2)); ewp_array(i,j,k,0) = fac*std::cos(phi)*Nturb_array(i,j,k); ewp_array(i,j,k,1) = fac*std::sin(phi)*Nturb_array(i,j,k); ewp_array(i,j,k,2) = 0.0; diff --git a/Source/WindFarmParametrization/Fitch/AdvanceFitch.cpp b/Source/WindFarmParametrization/Fitch/AdvanceFitch.cpp index 238c2de9f..1526a24f6 100644 --- a/Source/WindFarmParametrization/Fitch/AdvanceFitch.cpp +++ b/Source/WindFarmParametrization/Fitch/AdvanceFitch.cpp @@ -1,18 +1,19 @@ +#include +#include #include #include + using namespace amrex; -Real R = 30.0; -Real z_c = 100.0; -Real C_T = 0.8, C_TKE = 0.0; +Real C_TKE = 0.0; Real compute_A(Real z) { - Real d = std::min(std::fabs(z - z_c), R); - Real theta = std::acos(d/R); - Real A_s = R*R*theta - d*std::pow(R*R - d*d, 0.5); - Real A = M_PI*R*R/2.0 - A_s; + Real d = std::min(std::fabs(z - hub_height), rotor_rad); + Real theta = std::acos(d/rotor_rad); + Real A_s = rotor_rad*rotor_rad*theta - d*std::pow(rotor_rad*rotor_rad - d*d, 0.5); + Real A = M_PI*rotor_rad*rotor_rad/2.0 - A_s; return A; } @@ -23,7 +24,7 @@ Real compute_Aijk(Real z_k, Real z_kp1) Real A_k = compute_A(z_k); Real A_kp1 = compute_A(z_kp1); - Real check = (z_k - z_c)*(z_kp1 - z_c); + Real check = (z_k - hub_height)*(z_kp1 - hub_height); Real A_ijk; if(check > 0){ A_ijk = std::fabs(A_k -A_kp1); @@ -137,18 +138,20 @@ void fitch_source_terms_cellcentered (const Geometry& geom, // Compute Fitch source terms - Real Vabs = std::pow(u_vel(i,j,k)*u_vel(i,j,k) + - v_vel(i,j,k)*v_vel(i,j,k) + - w_vel(i,j,kk)*w_vel(i,j,kk), 0.5); + Real Vabs = std::pow(u_vel(i,j,k)*u_vel(i,j,k) + + v_vel(i,j,k)*v_vel(i,j,k) + + w_vel(i,j,kk)*w_vel(i,j,kk), 0.5); + + Real C_T = interpolate_1d(wind_speed.dataPtr(), thrust_coeff.dataPtr(), z, wind_speed.size()); - fitch_array(i,j,k,0) = Vabs; - fitch_array(i,j,k,1) = -0.5*Nturb_array(i,j,k)/(dx[0]*dx[1])*C_T*Vabs*Vabs*A_ijk/(z_kp1 - z_k); - fitch_array(i,j,k,2) = u_vel(i,j,k)/Vabs*fitch_array(i,j,k,1); - fitch_array(i,j,k,3) = v_vel(i,j,k)/Vabs*fitch_array(i,j,k,1); - fitch_array(i,j,k,4) = 0.5*Nturb_array(i,j,k)/(dx[0]*dx[1])*C_TKE*std::pow(Vabs,3)*A_ijk/(z_kp1 - z_k); + fitch_array(i,j,k,0) = Vabs; + fitch_array(i,j,k,1) = -0.5*Nturb_array(i,j,k)/(dx[0]*dx[1])*C_T*Vabs*Vabs*A_ijk/(z_kp1 - z_k); + fitch_array(i,j,k,2) = u_vel(i,j,k)/Vabs*fitch_array(i,j,k,1); + fitch_array(i,j,k,3) = v_vel(i,j,k)/Vabs*fitch_array(i,j,k,1); + fitch_array(i,j,k,4) = 0.5*Nturb_array(i,j,k)/(dx[0]*dx[1])*C_TKE*std::pow(Vabs,3)*A_ijk/(z_kp1 - z_k); //amrex::Gpu::Atomic::Add(sum_area, A_ijk); - }); + }); } //std::cout << "Checking sum here...." <<"\n"; //printf("%0.15g, %0.15g\n", *sum_area , M_PI*R*R); diff --git a/Source/WindFarmParametrization/WindFarm.H b/Source/WindFarmParametrization/WindFarm.H index 132e8706c..a0376ae52 100644 --- a/Source/WindFarmParametrization/WindFarm.H +++ b/Source/WindFarmParametrization/WindFarm.H @@ -5,6 +5,11 @@ #include #include +extern amrex::Real hub_height, rotor_rad, thrust_coeff_standing, nominal_power; +extern amrex::Vector wind_speed, thrust_coeff, power; + +void read_in_table(std::string windfarm_spec_table); + void advance_windfarm (int lev, const amrex::Geometry& geom, const amrex::Real& dt_advance, diff --git a/Source/WindFarmParametrization/WindFarm.cpp b/Source/WindFarmParametrization/WindFarm.cpp index 4162e7b73..3e54d02c3 100644 --- a/Source/WindFarmParametrization/WindFarm.cpp +++ b/Source/WindFarmParametrization/WindFarm.cpp @@ -3,6 +3,53 @@ #include using namespace amrex; +amrex::Real hub_height, rotor_rad, thrust_coeff_standing, nominal_power; +amrex::Vector wind_speed, thrust_coeff, power; + +void read_in_table(std::string windfarm_spec_table) +{ + + //The first line is the number of pairs entries for the power curve and thrust coefficient. + //The second line gives first the height in meters of the turbine hub, second, the diameter in + //meters of the rotor, third the standing thrust coefficient, and fourth the nominal power of + //the turbine in MW. + //The remaining lines contain the three values of: wind speed, thrust coefficient, and power production in kW. + + // Read turbine data from wind-turbine-1.tbl + std::ifstream file_turb_table(windfarm_spec_table); + if (!file_turb_table.is_open()) { + amrex::Error("Wind farm specifications table not found. Either the inputs is missing the " + "erf.windfarm_spec_table entry or the file specified in the entry - " + windfarm_spec_table + " is missing."); + } + else { + amrex::Print() << "Reading in wind farm specifications table: " << windfarm_spec_table << "\n"; + } + + int nlines; + file_turb_table >> nlines; + wind_speed.resize(nlines); + thrust_coeff.resize(nlines); + power.resize(nlines); + + Real rotor_dia; + file_turb_table >> hub_height >> rotor_dia >> thrust_coeff_standing >> nominal_power; + rotor_rad = rotor_dia*0.5; + if(rotor_rad > hub_height) { + amrex::Abort("The blade length is more than the hub height. Check the second line in wind-turbine-1.tbl. Aborting....."); + } + if(thrust_coeff_standing > 1.0) { + amrex::Abort("The standing thrust coefficient is greater than 1. Check the second line in wind-turbine-1.tbl. Aborting....."); + } + + for(int iline=0;iline> wind_speed[iline] >> thrust_coeff[iline] >> power[iline]; + if(thrust_coeff[iline] > 1.0) { + amrex::Abort("The thrust coefficient is greater than 1. Check wind-turbine-1.tbl. Aborting....."); + } + } + file_turb_table.close(); +} + void advance_windfarm (int lev, const Geometry& geom,