From 075bdd7eaef8d373dcd9c672b2058a665e64163f Mon Sep 17 00:00:00 2001 From: ilopezgp Date: Wed, 3 Nov 2021 08:32:47 -0700 Subject: [PATCH] Clean up, document LES driven forcing. --- integration_tests/utils/Cases.jl | 10 -------- src/Forcing.jl | 6 ++--- src/Turbulence_PrognosticTKE.jl | 6 ++--- src/types.jl | 39 ++++++++++++++++++++++++++------ 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/integration_tests/utils/Cases.jl b/integration_tests/utils/Cases.jl index b998139490..7bdf0877fa 100644 --- a/integration_tests/utils/Cases.jl +++ b/integration_tests/utils/Cases.jl @@ -1592,8 +1592,6 @@ function CasesBase(case::LES_driven_SCM, namelist, grid::Grid, param_set, Sur, F Fo.apply_coriolis = false Fo.coriolis_param = 0.376e-4 # s^{-1} Fo.apply_subsidence = true - Fo.apply_coriolis = false - Fo.apply_subsidence = true Fo.nudge_tau = namelist["forcing"]["nudging_timescale"] return TC.CasesBase(case; inversion_option, Sur, Fo, Rad, LESDat) end @@ -1620,14 +1618,6 @@ function initialize_profiles(self::CasesBase{LES_driven_SCM}, grid::Grid, gm, st NC.Dataset(self.LESDat.les_filename, "r") do data imin = self.LESDat.imin imax = self.LESDat.imax - t = data.group["profiles"]["t"][:] - # define time interval - t_interval_from_end_s = 6 * 3600 - t_from_end_s = Array(t) .- t[end] - # find inds within time interval - time_interval_bool = findall(>(-t_interval_from_end_s), t_from_end_s) - imin = time_interval_bool[1] - imax = time_interval_bool[end] zc_les = Array(TC.get_nc_data(data, "zc")) parent(prog_gm.θ_liq_ice) .= diff --git a/src/Forcing.jl b/src/Forcing.jl index 2beab9437c..a6c828645e 100644 --- a/src/Forcing.jl +++ b/src/Forcing.jl @@ -19,9 +19,9 @@ function initialize(self::ForcingBase{ForcingLES}, grid, LESDat::LESData) zc_les = Array(get_nc_data(data, "zc")) - self.dtdt_hadv = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dtdt_hadv", imin, imax)) - self.dtdt_nudge = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dtdt_nudge", imin, imax)) - self.dtdt_fluc = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dtdt_fluc", imin, imax)) + self.dTdt_hadv = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dtdt_hadv", imin, imax)) + self.dTdt_nudge = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dtdt_nudge", imin, imax)) + self.dTdt_fluc = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dtdt_fluc", imin, imax)) self.dqtdt_hadv = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dqtdt_hadv", imin, imax)) self.dqtdt_nudge = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dqtdt_nudge", imin, imax)) self.dqtdt_fluc = pyinterp(grid.zc, zc_les, mean_nc_data(data, "profiles", "dqtdt_fluc", imin, imax)) diff --git a/src/Turbulence_PrognosticTKE.jl b/src/Turbulence_PrognosticTKE.jl index 4baa9b25c9..67b7f80602 100755 --- a/src/Turbulence_PrognosticTKE.jl +++ b/src/Turbulence_PrognosticTKE.jl @@ -71,9 +71,9 @@ function compute_gm_tendencies!(edmf::EDMF_PrognosticTKE, grid, state, Case, gm, end if force_type(Case.Fo) <: ForcingLES - H_horz_adv = Case.Fo.dtdt_hadv[k] / Π - H_nudge = Case.Fo.dtdt_nudge[k] / Π - H_fluc = Case.Fo.dtdt_fluc[k] / Π + H_horz_adv = Case.Fo.dTdt_hadv[k] / Π + H_nudge = Case.Fo.dTdt_nudge[k] / Π + H_fluc = Case.Fo.dTdt_fluc[k] / Π gm_U_nudge_k = (Case.Fo.u_nudge[k] - prog_gm.u[k]) / Case.Fo.nudge_tau gm_V_nudge_k = (Case.Fo.v_nudge[k] - prog_gm.v[k]) / Case.Fo.nudge_tau diff --git a/src/types.jl b/src/types.jl index 75ed8f9eb3..cb0aea3d49 100644 --- a/src/types.jl +++ b/src/types.jl @@ -30,7 +30,7 @@ end """ MoistureDeficitEntr -My entrainment detrainment model +Entrainment detrainment model from Cohen et al (2020) $(DocStringExtensions.FIELDS) """ @@ -417,24 +417,49 @@ Base.@kwdef mutable struct LESData les_filename::String = nothing end +""" + ForcingBase + +LES-driven forcing + +$(DocStringExtensions.FIELDS) +""" Base.@kwdef mutable struct ForcingBase{T} + "Large-scale subsidence" subsidence::AbstractArray{Float64, 1} = zeros(1) - dTdt::AbstractArray{Float64, 1} = zeros(1) # horizontal advection temperature tendency - dqtdt::AbstractArray{Float64, 1} = zeros(1) # horizontal advection moisture tendency - dtdt_hadv::AbstractArray{Float64, 1} = zeros(1) - dtdt_nudge::AbstractArray{Float64, 1} = zeros(1) - dtdt_fluc::AbstractArray{Float64, 1} = zeros(1) + "Large-scale temperature tendency" + dTdt::AbstractArray{Float64, 1} = zeros(1) + "Large-scale moisture tendency" + dqtdt::AbstractArray{Float64, 1} = zeros(1) + "Horizontal advection of temperature" + dTdt_hadv::AbstractArray{Float64, 1} = zeros(1) + "Temperature tendency due to relaxation to large-scale" + dTdt_nudge::AbstractArray{Float64, 1} = zeros(1) + "Vertical turbulent advection of temperature" + dTdt_fluc::AbstractArray{Float64, 1} = zeros(1) + "Horizontal advection of moisture" dqtdt_hadv::AbstractArray{Float64, 1} = zeros(1) + "Moisture tendency due to relaxation to large-scale" dqtdt_nudge::AbstractArray{Float64, 1} = zeros(1) + "Vertical turbulent advection of moisture" dqtdt_fluc::AbstractArray{Float64, 1} = zeros(1) + "Reference u profile for relaxation tendency" u_nudge::AbstractArray{Float64, 1} = zeros(1) + "Reference v profile for relaxation tendency" v_nudge::AbstractArray{Float64, 1} = zeros(1) + "Boolean specifying whether Coriolis forcing is applied" apply_coriolis::Bool = false + "Boolean specifying whether subsidence forcing is applied" apply_subsidence::Bool = false + "Coriolis parameter" coriolis_param::Float64 = 0 + "Geostrophic u velocity" ug::AbstractArray{Float64, 1} = zeros(1) + "Geostrophic v velocity" vg::AbstractArray{Float64, 1} = zeros(1) - nudge_tau::Float64 = 0.0 # default is set to a value that will break + "Momentum relaxation timescale" + nudge_tau::Float64 = 0.0 + "Conversion function from forcing to prognostic" convert_forcing_prog_fp::Function = x -> x end