From dd1fa5d613e7f8865ec0f10e77d92af791943f85 Mon Sep 17 00:00:00 2001 From: Charles Kawczynski Date: Fri, 19 Nov 2021 12:43:30 -0800 Subject: [PATCH] Use ClimaCore operators --- integration_tests/utils/main.jl | 2 + integration_tests/utils/mse_tables.jl | 108 +++++++++++++------------- src/Turbulence_PrognosticTKE.jl | 29 ++++--- 3 files changed, 75 insertions(+), 64 deletions(-) diff --git a/integration_tests/utils/main.jl b/integration_tests/utils/main.jl index 3748b3464..9c42c5716 100644 --- a/integration_tests/utils/main.jl +++ b/integration_tests/utils/main.jl @@ -76,6 +76,8 @@ cent_aux_vars_gm(FT) = (; v_nudge = FT(0), #Reference v profile for relaxation tendency ug = FT(0), #Geostrophic u velocity vg = FT(0), #Geostrophic v velocity + ∇θ_liq_ice_gm = FT(0), + ∇q_tot_gm = FT(0), ) cent_aux_vars_en_2m(FT) = (; dissipation = FT(0), diff --git a/integration_tests/utils/mse_tables.jl b/integration_tests/utils/mse_tables.jl index 03ec48a89..8ff2426f1 100644 --- a/integration_tests/utils/mse_tables.jl +++ b/integration_tests/utils/mse_tables.jl @@ -20,30 +20,30 @@ all_best_mse["ARM_SGP"]["Hvar_mean"] = 10050.287844276096 all_best_mse["ARM_SGP"]["QTvar_mean"] = 6409.072907454158 # all_best_mse["Bomex"] = OrderedCollections.OrderedDict() -all_best_mse["Bomex"]["qt_mean"] = 0.11386593804223395 -all_best_mse["Bomex"]["updraft_area"] = 129.6036478299415 -all_best_mse["Bomex"]["updraft_w"] = 18.269073825654836 -all_best_mse["Bomex"]["updraft_qt"] = 7.172813510835134 -all_best_mse["Bomex"]["updraft_thetal"] = 69.79574099595605 -all_best_mse["Bomex"]["v_mean"] = 66.93611979214278 -all_best_mse["Bomex"]["u_mean"] = 0.31831686414232385 -all_best_mse["Bomex"]["tke_mean"] = 74.04439277772684 -all_best_mse["Bomex"]["temperature_mean"] = 4.534964149172667e-5 -all_best_mse["Bomex"]["ql_mean"] = 9.06220414748308 +all_best_mse["Bomex"]["qt_mean"] = 0.1106923137150576 +all_best_mse["Bomex"]["updraft_area"] = 129.60272062634158 +all_best_mse["Bomex"]["updraft_w"] = 17.690466168067342 +all_best_mse["Bomex"]["updraft_qt"] = 6.929092109626689 +all_best_mse["Bomex"]["updraft_thetal"] = 69.79095024237947 +all_best_mse["Bomex"]["v_mean"] = 66.98297659096178 +all_best_mse["Bomex"]["u_mean"] = 0.31859092657788696 +all_best_mse["Bomex"]["tke_mean"] = 74.05740862876598 +all_best_mse["Bomex"]["temperature_mean"] = 4.387214792883629e-5 +all_best_mse["Bomex"]["ql_mean"] = 7.898741934670023 all_best_mse["Bomex"]["qi_mean"] = "NA" -all_best_mse["Bomex"]["thetal_mean"] = 4.6114572394924826e-5 -all_best_mse["Bomex"]["Hvar_mean"] = 3929.5862955085718 -all_best_mse["Bomex"]["QTvar_mean"] = 1471.025865172192 +all_best_mse["Bomex"]["thetal_mean"] = 4.454314249470174e-5 +all_best_mse["Bomex"]["Hvar_mean"] = 4228.589789854231 +all_best_mse["Bomex"]["QTvar_mean"] = 1570.7718722475322 # all_best_mse["DryBubble"] = OrderedCollections.OrderedDict() -all_best_mse["DryBubble"]["updraft_area"] = 1.0468607169176005e-21 -all_best_mse["DryBubble"]["updraft_w"] = 7.731625286715597e-22 -all_best_mse["DryBubble"]["updraft_thetal"] = 1.6249094098122142e-28 +all_best_mse["DryBubble"]["updraft_area"] = 0.0 +all_best_mse["DryBubble"]["updraft_w"] = 0.0 +all_best_mse["DryBubble"]["updraft_thetal"] = 0.0 all_best_mse["DryBubble"]["u_mean"] = 0.0 -all_best_mse["DryBubble"]["tke_mean"] = 5.049479188006379e-21 -all_best_mse["DryBubble"]["temperature_mean"] = 4.077972346806205e-29 -all_best_mse["DryBubble"]["thetal_mean"] = 3.5394053402535673e-29 -all_best_mse["DryBubble"]["Hvar_mean"] = 2.9924679420898647e-21 +all_best_mse["DryBubble"]["tke_mean"] = 0.0 +all_best_mse["DryBubble"]["temperature_mean"] = 0.0 +all_best_mse["DryBubble"]["thetal_mean"] = 0.0 +all_best_mse["DryBubble"]["Hvar_mean"] = 0.0 # all_best_mse["DYCOMS_RF01"] = OrderedCollections.OrderedDict() all_best_mse["DYCOMS_RF01"]["qt_mean"] = 0.023204890213439345 @@ -55,7 +55,7 @@ all_best_mse["DYCOMS_RF01"]["updraft_thetal"] = 46.1881703698088 all_best_mse["DYCOMS_RF01"]["v_mean"] = 0.002984566999515788 all_best_mse["DYCOMS_RF01"]["u_mean"] = 0.07894318758971025 all_best_mse["DYCOMS_RF01"]["tke_mean"] = 21.331159027170038 -all_best_mse["DYCOMS_RF01"]["temperature_mean"] = 7.604096303774697e-5 +all_best_mse["DYCOMS_RF01"]["temperature_mean"] = 7.604096303774715e-5 all_best_mse["DYCOMS_RF01"]["thetal_mean"] = 7.642464404652118e-5 all_best_mse["DYCOMS_RF01"]["Hvar_mean"] = 1288.1706746716493 all_best_mse["DYCOMS_RF01"]["QTvar_mean"] = 518.9390189083833 @@ -72,19 +72,19 @@ all_best_mse["GABLS"]["QTvar_mean"] = 0.0 all_best_mse["GABLS"]["qt_mean"] = 0.0 # all_best_mse["life_cycle_Tan2018"] = OrderedCollections.OrderedDict() -all_best_mse["life_cycle_Tan2018"]["qt_mean"] = 1.1301395729117972e-10 -all_best_mse["life_cycle_Tan2018"]["ql_mean"] = 6.885610456230736e-8 -all_best_mse["life_cycle_Tan2018"]["updraft_area"] = 1.0650639202780091e-9 -all_best_mse["life_cycle_Tan2018"]["updraft_w"] = 4.412853249807393e-9 -all_best_mse["life_cycle_Tan2018"]["updraft_qt"] = 2.0834237326020182e-11 -all_best_mse["life_cycle_Tan2018"]["updraft_thetal"] = 1.2290664718154136e-14 -all_best_mse["life_cycle_Tan2018"]["v_mean"] = 3.5370643087557025e-10 -all_best_mse["life_cycle_Tan2018"]["u_mean"] = 1.333755913538528e-12 -all_best_mse["life_cycle_Tan2018"]["tke_mean"] = 4.0026919871474993e-10 -all_best_mse["life_cycle_Tan2018"]["temperature_mean"] = 5.49702103791042e-14 -all_best_mse["life_cycle_Tan2018"]["thetal_mean"] = 5.403807380431132e-14 -all_best_mse["life_cycle_Tan2018"]["Hvar_mean"] = 0.0006520458481563525 -all_best_mse["life_cycle_Tan2018"]["QTvar_mean"] = 0.0005521351618329725 +all_best_mse["life_cycle_Tan2018"]["qt_mean"] = 1.040201456183157e-10 +all_best_mse["life_cycle_Tan2018"]["ql_mean"] = 6.339124373524877e-8 +all_best_mse["life_cycle_Tan2018"]["updraft_area"] = 9.806718601088474e-10 +all_best_mse["life_cycle_Tan2018"]["updraft_w"] = 4.061214002736451e-9 +all_best_mse["life_cycle_Tan2018"]["updraft_qt"] = 1.9178005490897857e-11 +all_best_mse["life_cycle_Tan2018"]["updraft_thetal"] = 1.1313447584072501e-14 +all_best_mse["life_cycle_Tan2018"]["v_mean"] = 3.258535553669558e-10 +all_best_mse["life_cycle_Tan2018"]["u_mean"] = 1.2289273222328453e-12 +all_best_mse["life_cycle_Tan2018"]["tke_mean"] = 3.685000196344194e-10 +all_best_mse["life_cycle_Tan2018"]["temperature_mean"] = 5.059639034227088e-14 +all_best_mse["life_cycle_Tan2018"]["thetal_mean"] = 4.9738328807256563e-14 +all_best_mse["life_cycle_Tan2018"]["Hvar_mean"] = 0.0005984844754654284 +all_best_mse["life_cycle_Tan2018"]["QTvar_mean"] = 0.0005067724620515855 # all_best_mse["Nieuwstadt"] = OrderedCollections.OrderedDict() all_best_mse["Nieuwstadt"]["updraft_area"] = 98.58868568320953 @@ -97,21 +97,21 @@ all_best_mse["Nieuwstadt"]["thetal_mean"] = 9.917616755053735e-6 all_best_mse["Nieuwstadt"]["Hvar_mean"] = 1280.8007043658781 # all_best_mse["Rico"] = OrderedCollections.OrderedDict() -all_best_mse["Rico"]["qt_mean"] = 1.2374332817585152 -all_best_mse["Rico"]["updraft_area"] = 476.42828102112094 -all_best_mse["Rico"]["updraft_w"] = 107.63994685627974 -all_best_mse["Rico"]["updraft_qt"] = 13.561257420867225 -all_best_mse["Rico"]["updraft_thetal"] = 133.82585090829056 -all_best_mse["Rico"]["v_mean"] = 0.6139821705021405 -all_best_mse["Rico"]["u_mean"] = 0.6873796298887406 -all_best_mse["Rico"]["tke_mean"] = 81.73582834680109 -all_best_mse["Rico"]["temperature_mean"] = 0.000572523750928536 -all_best_mse["Rico"]["ql_mean"] = 62.68774587854839 +all_best_mse["Rico"]["qt_mean"] = 1.2379817678813374 +all_best_mse["Rico"]["updraft_area"] = 476.4332441804219 +all_best_mse["Rico"]["updraft_w"] = 107.5565016731201 +all_best_mse["Rico"]["updraft_qt"] = 13.571714766962765 +all_best_mse["Rico"]["updraft_thetal"] = 133.82434969427942 +all_best_mse["Rico"]["v_mean"] = 0.6143413555117644 +all_best_mse["Rico"]["u_mean"] = 0.68705319628077 +all_best_mse["Rico"]["tke_mean"] = 81.70739554010115 +all_best_mse["Rico"]["temperature_mean"] = 0.0005733219123889063 +all_best_mse["Rico"]["ql_mean"] = 62.75505390677565 all_best_mse["Rico"]["qi_mean"] = "NA" -all_best_mse["Rico"]["qr_mean"] = 761.0071192508036 -all_best_mse["Rico"]["thetal_mean"] = 0.000564880580847811 -all_best_mse["Rico"]["Hvar_mean"] = 172497.32482685937 -all_best_mse["Rico"]["QTvar_mean"] = 38768.421549556835 +all_best_mse["Rico"]["qr_mean"] = 761.0167618473477 +all_best_mse["Rico"]["thetal_mean"] = 0.0005656864371822172 +all_best_mse["Rico"]["Hvar_mean"] = 173280.11274300521 +all_best_mse["Rico"]["QTvar_mean"] = 38946.4291539475 # all_best_mse["Soares"] = OrderedCollections.OrderedDict() all_best_mse["Soares"]["qt_mean"] = 0.1254170125375242 @@ -144,12 +144,12 @@ all_best_mse["TRMM_LBA"]["Hvar_mean"] = 4347.857247874721 all_best_mse["TRMM_LBA"]["QTvar_mean"] = 2834.5221950389873 # all_best_mse["LES_driven_SCM"] = OrderedCollections.OrderedDict() -all_best_mse["LES_driven_SCM"]["qt_mean"] = 3.6787564218423423 -all_best_mse["LES_driven_SCM"]["v_mean"] = 1.3104599245585289 -all_best_mse["LES_driven_SCM"]["u_mean"] = 0.4499328257766739 -all_best_mse["LES_driven_SCM"]["temperature_mean"] = 0.0012871391706061209 -all_best_mse["LES_driven_SCM"]["ql_mean"] = 82323.24310668586 -all_best_mse["LES_driven_SCM"]["thetal_mean"] = 0.0015567358670710684 +all_best_mse["LES_driven_SCM"]["qt_mean"] = 3.678756609605833 +all_best_mse["LES_driven_SCM"]["v_mean"] = 1.3104598555707683 +all_best_mse["LES_driven_SCM"]["u_mean"] = 0.4499328324090225 +all_best_mse["LES_driven_SCM"]["temperature_mean"] = 0.0012871512844187208 +all_best_mse["LES_driven_SCM"]["ql_mean"] = 82322.65889490423 +all_best_mse["LES_driven_SCM"]["thetal_mean"] = 0.0015567358822997865 # ################################# ################################# diff --git a/src/Turbulence_PrognosticTKE.jl b/src/Turbulence_PrognosticTKE.jl index 79f82cffc..07af318f6 100755 --- a/src/Turbulence_PrognosticTKE.jl +++ b/src/Turbulence_PrognosticTKE.jl @@ -30,9 +30,13 @@ end function compute_gm_tendencies!(edmf::EDMF_PrognosticTKE, grid, state, Case, gm, TS) tendencies_gm = center_tendencies_grid_mean(state) + kc_toa = kc_top_of_atmos(grid) + FT = eltype(grid) param_set = parameter_set(gm) prog_gm = center_prog_grid_mean(state) aux_gm = center_aux_grid_mean(state) + ∇θ_liq_ice_gm = center_aux_grid_mean(state).∇θ_liq_ice_gm + ∇q_tot_gm = center_aux_grid_mean(state).∇q_tot_gm aux_en = center_aux_environment(state) aux_en_f = face_aux_environment(state) aux_up = center_aux_updrafts(state) @@ -48,6 +52,15 @@ function compute_gm_tendencies!(edmf::EDMF_PrognosticTKE, grid, state, Case, gm, en = edmf.EnvVar aux_tc = center_aux_turbconv(state) + θ_liq_ice_gm_toa = prog_gm.θ_liq_ice[kc_toa] + q_tot_gm_toa = prog_gm.q_tot[kc_toa] + RBθ = CCO.RightBiasedC2F(; top = CCO.SetValue(θ_liq_ice_gm_toa)) + RBq = CCO.RightBiasedC2F(; top = CCO.SetValue(q_tot_gm_toa)) + wvec = CC.Geometry.WVector + ∇ = CCO.DivergenceF2C() + @. ∇θ_liq_ice_gm = ∇(wvec(RBθ(prog_gm.θ_liq_ice))) + @. ∇q_tot_gm = ∇(wvec(RBq(prog_gm.q_tot))) + @inbounds for k in real_center_indices(grid) # Apply large-scale horizontal advection tendencies ts = thermo_state_pθq(param_set, p0_c[k], prog_gm.θ_liq_ice[k], prog_gm.q_tot[k]) @@ -60,22 +73,18 @@ function compute_gm_tendencies!(edmf::EDMF_PrognosticTKE, grid, state, Case, gm, if rad_type(Case.Rad) <: Union{RadiationDYCOMS_RF01, RadiationLES} tendencies_gm.θ_liq_ice[k] += aux_gm.dTdt_rad[k] / Π end - H_cut = ccut_downwind(prog_gm.θ_liq_ice, grid, k) - q_tot_cut = ccut_downwind(prog_gm.q_tot, grid, k) - ∇H = c∇_downwind(H_cut, grid, k; bottom = FreeBoundary(), top = SetGradient(0)) - ∇q_tot = c∇_downwind(q_tot_cut, grid, k; bottom = FreeBoundary(), top = SetGradient(0)) if force_type(Case.Fo) <: ForcingDYCOMS_RF01 tendencies_gm.q_tot[k] += aux_gm.dqtdt[k] # Apply large-scale subsidence tendencies - tendencies_gm.θ_liq_ice[k] -= ∇H * aux_gm.subsidence[k] - tendencies_gm.q_tot[k] -= ∇q_tot * aux_gm.subsidence[k] + tendencies_gm.θ_liq_ice[k] -= ∇θ_liq_ice_gm[k] * aux_gm.subsidence[k] + tendencies_gm.q_tot[k] -= ∇q_tot_gm[k] * aux_gm.subsidence[k] end if force_type(Case.Fo) <: ForcingStandard if Case.Fo.apply_subsidence - tendencies_gm.θ_liq_ice[k] -= ∇H * aux_gm.subsidence[k] - tendencies_gm.q_tot[k] -= ∇q_tot * aux_gm.subsidence[k] + tendencies_gm.θ_liq_ice[k] -= ∇θ_liq_ice_gm[k] * aux_gm.subsidence[k] + tendencies_gm.q_tot[k] -= ∇q_tot_gm[k] * aux_gm.subsidence[k] end tendencies_gm.θ_liq_ice[k] += aux_gm.dTdt[k] / Π tendencies_gm.q_tot[k] += aux_gm.dqtdt[k] @@ -100,8 +109,8 @@ function compute_gm_tendencies!(edmf::EDMF_PrognosticTKE, grid, state, Case, gm, if Case.Fo.apply_subsidence # Apply large-scale subsidence tendencies - gm_H_subsidence_k = -∇H * aux_gm.subsidence[k] - gm_QT_subsidence_k = -∇q_tot * aux_gm.subsidence[k] + gm_H_subsidence_k = -∇θ_liq_ice_gm[k] * aux_gm.subsidence[k] + gm_QT_subsidence_k = -∇q_tot_gm[k] * aux_gm.subsidence[k] else gm_H_subsidence_k = 0.0 gm_QT_subsidence_k = 0.0