From 328e9fd5796d549051e65069657f5b349d0c2144 Mon Sep 17 00:00:00 2001 From: costachris Date: Fri, 1 Dec 2023 11:02:16 -0800 Subject: [PATCH] Add min area limiter --- .buildkite/pipeline.yml | 2 +- driver/generate_namelist.jl | 9 +- post_processing/mse_tables.jl | 246 +++++++++--------- src/closures/entr_detr.jl | 12 +- .../nondimensional_exchange_functions.jl | 11 + src/types.jl | 23 +- 6 files changed, 174 insertions(+), 129 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index abfc6432b..13ab31716 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -1,6 +1,6 @@ env: JULIA_VERSION: "1.9.3" - OPENMPI_VERSION: "4.0.4" + OPENMPI_VERSION: "4.1.5" CUDA_VERSION: "11.2" CLIMACOMMS_DEVICE: "CPU" JULIA_CPU_TARGET: 'broadwell;skylake' diff --git a/driver/generate_namelist.jl b/driver/generate_namelist.jl index d3375b661..dbf5bf9d4 100644 --- a/driver/generate_namelist.jl +++ b/driver/generate_namelist.jl @@ -111,8 +111,11 @@ function default_namelist( namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["turbulent_entrainment_factor"] = 0.075 namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["entrainment_smin_tke_coeff"] = 0.3 namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["updraft_mixing_frac"] = 0.25 - namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["area_limiter_scale"] = 4.0 - namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["area_limiter_power"] = 10.0 + namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["area_limiter_scale"] = 5.0 + namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["area_limiter_power"] = 30.0 + namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["limit_min_area"] = false + namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["min_area_limiter_scale"] = 3.0 + namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["min_area_limiter_power"] = 2000.0 namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["entrainment_scale"] = 0.0004 namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["sorting_power"] = 2.0 namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["min_upd_velocity"] = 0.001 @@ -159,7 +162,7 @@ function default_namelist( namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["entr_dim_scale"] = "buoy_vel" # {"buoy_vel", "inv_scale_height", "inv_z", "none"} namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["detr_dim_scale"] = "buoy_vel" # {"buoy_vel", "inv_scale_height", "inv_z", "none"} namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["entr_pi_subset"] = ntuple(i -> i, 6) # or, e.g., (1, 3, 6) - namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["pi_norm_consts"] = [478.298, 1.0, 1.0, 1.0, 1.0, 1.0] # normalization constants for Pi groups + namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["pi_norm_consts"] = [10.0, 5.0, 1.0, 1.0, 1.0, 1.0] # normalization constants for Pi groups namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["stochastic_entrainment"] = "deterministic" # {"deterministic", "noisy_relaxation_process", "lognormal_scaling", "prognostic_noisy_relaxation_process"} namelist_defaults["turbulence"]["EDMF_PrognosticTKE"]["pressure_closure_buoy"] = "normalmode" diff --git a/post_processing/mse_tables.jl b/post_processing/mse_tables.jl index b5cdd9873..c0ff77b88 100644 --- a/post_processing/mse_tables.jl +++ b/post_processing/mse_tables.jl @@ -5,76 +5,76 @@ all_best_mse = OrderedCollections.OrderedDict() # all_best_mse["ARM_SGP"] = OrderedCollections.OrderedDict() -all_best_mse["ARM_SGP"]["qt_mean"] = 0.2552463890767408 -all_best_mse["ARM_SGP"]["updraft_area"] = 327.3520363312712 -all_best_mse["ARM_SGP"]["updraft_w"] = 154.36957785345137 -all_best_mse["ARM_SGP"]["updraft_qt"] = 30.61454320120155 -all_best_mse["ARM_SGP"]["updraft_thetal"] = 172.0123422125184 +all_best_mse["ARM_SGP"]["qt_mean"] = 0.29076673178995216 +all_best_mse["ARM_SGP"]["updraft_area"] = 330.984813969893 +all_best_mse["ARM_SGP"]["updraft_w"] = 147.24652157952917 +all_best_mse["ARM_SGP"]["updraft_qt"] = 29.164231737860703 +all_best_mse["ARM_SGP"]["updraft_thetal"] = 172.00836919579936 all_best_mse["ARM_SGP"]["u_mean"] = 1.3235797273549681e-5 -all_best_mse["ARM_SGP"]["tke_mean"] = 1104.669205982547 -all_best_mse["ARM_SGP"]["temperature_mean"] = 0.00012756357403675883 -all_best_mse["ARM_SGP"]["ql_mean"] = 212.1064083740767 +all_best_mse["ARM_SGP"]["tke_mean"] = 1071.1115837851398 +all_best_mse["ARM_SGP"]["temperature_mean"] = 0.000145284205847849 +all_best_mse["ARM_SGP"]["ql_mean"] = 191.43313382586433 all_best_mse["ARM_SGP"]["qi_mean"] = "NA" -all_best_mse["ARM_SGP"]["thetal_mean"] = 0.00011934280706982167 -all_best_mse["ARM_SGP"]["Hvar_mean"] = 1639.1273022543226 -all_best_mse["ARM_SGP"]["QTvar_mean"] = 894.4270510115464 +all_best_mse["ARM_SGP"]["thetal_mean"] = 0.00013400187653103297 +all_best_mse["ARM_SGP"]["Hvar_mean"] = 464.6765528832271 +all_best_mse["ARM_SGP"]["QTvar_mean"] = 187.56407976591296 # all_best_mse["Bomex"] = OrderedCollections.OrderedDict() -all_best_mse["Bomex"]["qt_mean"] = 0.09739390729999153 -all_best_mse["Bomex"]["updraft_area"] = 127.52486658438369 -all_best_mse["Bomex"]["updraft_w"] = 17.600460504489188 -all_best_mse["Bomex"]["updraft_qt"] = 6.874952845534643 -all_best_mse["Bomex"]["updraft_thetal"] = 69.79142187577207 -all_best_mse["Bomex"]["v_mean"] = 64.9563162432342 -all_best_mse["Bomex"]["u_mean"] = 0.26581933718389134 -all_best_mse["Bomex"]["tke_mean"] = 70.51469538441916 -all_best_mse["Bomex"]["temperature_mean"] = 3.926286649960636e-5 -all_best_mse["Bomex"]["ql_mean"] = 8.237082183571355 +all_best_mse["Bomex"]["qt_mean"] = 0.09011341001015058 +all_best_mse["Bomex"]["updraft_area"] = 128.11120831307056 +all_best_mse["Bomex"]["updraft_w"] = 15.071877299719867 +all_best_mse["Bomex"]["updraft_qt"] = 6.880009558381172 +all_best_mse["Bomex"]["updraft_thetal"] = 69.78077555044864 +all_best_mse["Bomex"]["v_mean"] = 65.48877768586455 +all_best_mse["Bomex"]["u_mean"] = 0.26993515144140345 +all_best_mse["Bomex"]["tke_mean"] = 70.2632736760826 +all_best_mse["Bomex"]["temperature_mean"] = 3.2721342748183155e-5 +all_best_mse["Bomex"]["ql_mean"] = 7.5634994360906225 all_best_mse["Bomex"]["qi_mean"] = "NA" -all_best_mse["Bomex"]["thetal_mean"] = 3.986607753531752e-5 -all_best_mse["Bomex"]["Hvar_mean"] = 3047.497956802109 -all_best_mse["Bomex"]["QTvar_mean"] = 1117.6728870383952 +all_best_mse["Bomex"]["thetal_mean"] = 3.33221329251271e-5 +all_best_mse["Bomex"]["Hvar_mean"] = 5256.502176612955 +all_best_mse["Bomex"]["QTvar_mean"] = 1819.1486275444367 # all_best_mse["DryBubble"] = OrderedCollections.OrderedDict() -all_best_mse["DryBubble"]["updraft_area"] = 4.6329380448915837e-5 -all_best_mse["DryBubble"]["updraft_w"] = 0.00037381367465367816 -all_best_mse["DryBubble"]["updraft_thetal"] = 5.200056656308287e-13 -all_best_mse["DryBubble"]["u_mean"] = 1.7011568606656658e-9 -all_best_mse["DryBubble"]["tke_mean"] = 8.79488719128737e-5 -all_best_mse["DryBubble"]["temperature_mean"] = 2.6855797193846195e-14 -all_best_mse["DryBubble"]["thetal_mean"] = 2.042988524531394e-14 -all_best_mse["DryBubble"]["Hvar_mean"] = 3.869104151246155e-6 +all_best_mse["DryBubble"]["updraft_area"] = 193.75911462032647 +all_best_mse["DryBubble"]["updraft_w"] = 1222.4535227571926 +all_best_mse["DryBubble"]["updraft_thetal"] = 4.82595176836427e-5 +all_best_mse["DryBubble"]["u_mean"] = 0.0002439086451975369 +all_best_mse["DryBubble"]["tke_mean"] = 35499.24049194259 +all_best_mse["DryBubble"]["temperature_mean"] = 1.6369287103293815e-5 +all_best_mse["DryBubble"]["thetal_mean"] = 1.439036815409058e-5 +all_best_mse["DryBubble"]["Hvar_mean"] = 8082.579936607187 # all_best_mse["DYCOMS_RF01"] = OrderedCollections.OrderedDict() -all_best_mse["DYCOMS_RF01"]["qt_mean"] = 0.03222926628265145 -all_best_mse["DYCOMS_RF01"]["ql_mean"] = 35.24367441898816 -all_best_mse["DYCOMS_RF01"]["updraft_area"] = 29.91828462584687 -all_best_mse["DYCOMS_RF01"]["updraft_w"] = 6.11595116920508 -all_best_mse["DYCOMS_RF01"]["updraft_qt"] = 1.8880856499695946 -all_best_mse["DYCOMS_RF01"]["updraft_thetal"] = 46.187665218886046 -all_best_mse["DYCOMS_RF01"]["v_mean"] = 0.010541287021836489 -all_best_mse["DYCOMS_RF01"]["u_mean"] = 0.10339578823912228 -all_best_mse["DYCOMS_RF01"]["tke_mean"] = 17.149948550493168 -all_best_mse["DYCOMS_RF01"]["temperature_mean"] = 9.952426281664225e-5 -all_best_mse["DYCOMS_RF01"]["thetal_mean"] = 9.872176762671295e-5 -all_best_mse["DYCOMS_RF01"]["Hvar_mean"] = 1280.4368757405791 -all_best_mse["DYCOMS_RF01"]["QTvar_mean"] = 514.6927676054853 +all_best_mse["DYCOMS_RF01"]["qt_mean"] = 0.03219020337215431 +all_best_mse["DYCOMS_RF01"]["ql_mean"] = 34.90616805309427 +all_best_mse["DYCOMS_RF01"]["updraft_area"] = 29.853966612468575 +all_best_mse["DYCOMS_RF01"]["updraft_w"] = 6.102139340266054 +all_best_mse["DYCOMS_RF01"]["updraft_qt"] = 1.8860814628700717 +all_best_mse["DYCOMS_RF01"]["updraft_thetal"] = 46.18765704475976 +all_best_mse["DYCOMS_RF01"]["v_mean"] = 0.010463555165664547 +all_best_mse["DYCOMS_RF01"]["u_mean"] = 0.10329852122057932 +all_best_mse["DYCOMS_RF01"]["tke_mean"] = 17.105518846534395 +all_best_mse["DYCOMS_RF01"]["temperature_mean"] = 0.0001000176747758382 +all_best_mse["DYCOMS_RF01"]["thetal_mean"] = 9.923984901176976e-5 +all_best_mse["DYCOMS_RF01"]["Hvar_mean"] = 1280.408036883615 +all_best_mse["DYCOMS_RF01"]["QTvar_mean"] = 514.493100959033 # all_best_mse["DYCOMS_RF02"] = OrderedCollections.OrderedDict() -all_best_mse["DYCOMS_RF02"]["qt_mean"] = 0.05233788915003277 -all_best_mse["DYCOMS_RF02"]["ql_mean"] = 6.697294177859994 -all_best_mse["DYCOMS_RF02"]["qr_mean"] = 20.281931096948025 -all_best_mse["DYCOMS_RF02"]["updraft_area"] = 29.027058046698794 -all_best_mse["DYCOMS_RF02"]["updraft_w"] = 9.878615074729101 -all_best_mse["DYCOMS_RF02"]["updraft_qt"] = 4.690371468923403 -all_best_mse["DYCOMS_RF02"]["updraft_thetal"] = 40.545366095516705 -all_best_mse["DYCOMS_RF02"]["v_mean"] = 43.26323125566431 -all_best_mse["DYCOMS_RF02"]["u_mean"] = 19.893392920851007 -all_best_mse["DYCOMS_RF02"]["tke_mean"] = 11.975979927159647 -all_best_mse["DYCOMS_RF02"]["temperature_mean"] = 2.2777109899054987e-5 -all_best_mse["DYCOMS_RF02"]["thetal_mean"] = 1.828111212362259e-5 -all_best_mse["DYCOMS_RF02"]["Hvar_mean"] = 1188.6712169919972 -all_best_mse["DYCOMS_RF02"]["QTvar_mean"] = 264.1835681681652 +all_best_mse["DYCOMS_RF02"]["qt_mean"] = 0.05242881589199175 +all_best_mse["DYCOMS_RF02"]["ql_mean"] = 7.1954552121017885 +all_best_mse["DYCOMS_RF02"]["qr_mean"] = 21.140592728847118 +all_best_mse["DYCOMS_RF02"]["updraft_area"] = 28.648700307033906 +all_best_mse["DYCOMS_RF02"]["updraft_w"] = 9.102157759959661 +all_best_mse["DYCOMS_RF02"]["updraft_qt"] = 4.677162503059372 +all_best_mse["DYCOMS_RF02"]["updraft_thetal"] = 40.54508942465268 +all_best_mse["DYCOMS_RF02"]["v_mean"] = 43.29499782280301 +all_best_mse["DYCOMS_RF02"]["u_mean"] = 19.893374629727017 +all_best_mse["DYCOMS_RF02"]["tke_mean"] = 14.089722969784196 +all_best_mse["DYCOMS_RF02"]["temperature_mean"] = 2.4808639216725863e-5 +all_best_mse["DYCOMS_RF02"]["thetal_mean"] = 1.9854090822300147e-5 +all_best_mse["DYCOMS_RF02"]["Hvar_mean"] = 1259.1163139965176 +all_best_mse["DYCOMS_RF02"]["QTvar_mean"] = 342.95732990596997 # all_best_mse["GABLS"] = OrderedCollections.OrderedDict() all_best_mse["GABLS"]["updraft_thetal"] = 5.0057325456092485e-8 @@ -86,84 +86,84 @@ all_best_mse["GABLS"]["thetal_mean"] = 5.0057325456092485e-8 all_best_mse["GABLS"]["Hvar_mean"] = 0.09340414179438572 # all_best_mse["life_cycle_Tan2018"] = OrderedCollections.OrderedDict() -all_best_mse["life_cycle_Tan2018"]["qt_mean"] = 2.1980099071504733e-6 -all_best_mse["life_cycle_Tan2018"]["ql_mean"] = 0.007720864286987472 -all_best_mse["life_cycle_Tan2018"]["updraft_area"] = 0.003533017591198568 -all_best_mse["life_cycle_Tan2018"]["updraft_w"] = 0.005830504321530831 -all_best_mse["life_cycle_Tan2018"]["updraft_qt"] = 0.002239096166327306 -all_best_mse["life_cycle_Tan2018"]["updraft_thetal"] = 1.2775945212521939e-6 -all_best_mse["life_cycle_Tan2018"]["v_mean"] = 0.00012527220315071 -all_best_mse["life_cycle_Tan2018"]["u_mean"] = 2.838533918504724e-7 -all_best_mse["life_cycle_Tan2018"]["tke_mean"] = 0.000367555656715684 -all_best_mse["life_cycle_Tan2018"]["temperature_mean"] = 5.085403105269906e-10 -all_best_mse["life_cycle_Tan2018"]["thetal_mean"] = 5.269388688258327e-10 -all_best_mse["life_cycle_Tan2018"]["Hvar_mean"] = 159.43305140611452 -all_best_mse["life_cycle_Tan2018"]["QTvar_mean"] = 72.86468810491557 +all_best_mse["life_cycle_Tan2018"]["qt_mean"] = 0.020171806854823088 +all_best_mse["life_cycle_Tan2018"]["ql_mean"] = 16.55376904476486 +all_best_mse["life_cycle_Tan2018"]["updraft_area"] = 4.045935338129409 +all_best_mse["life_cycle_Tan2018"]["updraft_w"] = 4.033393062729022 +all_best_mse["life_cycle_Tan2018"]["updraft_qt"] = 0.06312055546212496 +all_best_mse["life_cycle_Tan2018"]["updraft_thetal"] = 3.5567317572989377e-5 +all_best_mse["life_cycle_Tan2018"]["v_mean"] = 0.10255562921273272 +all_best_mse["life_cycle_Tan2018"]["u_mean"] = 0.00030063658835013224 +all_best_mse["life_cycle_Tan2018"]["tke_mean"] = 0.12558848426117689 +all_best_mse["life_cycle_Tan2018"]["temperature_mean"] = 9.226065845501585e-6 +all_best_mse["life_cycle_Tan2018"]["thetal_mean"] = 9.666638291720499e-6 +all_best_mse["life_cycle_Tan2018"]["Hvar_mean"] = 148.89166182594923 +all_best_mse["life_cycle_Tan2018"]["QTvar_mean"] = 67.6929850413386 # all_best_mse["Nieuwstadt"] = OrderedCollections.OrderedDict() -all_best_mse["Nieuwstadt"]["updraft_area"] = 98.80140636900379 -all_best_mse["Nieuwstadt"]["updraft_w"] = 14.173869320877497 -all_best_mse["Nieuwstadt"]["updraft_thetal"] = 117.60593923755371 -all_best_mse["Nieuwstadt"]["u_mean"] = 13.55387743355792 -all_best_mse["Nieuwstadt"]["tke_mean"] = 283.65725551447355 -all_best_mse["Nieuwstadt"]["temperature_mean"] = 1.1363361194923952e-5 -all_best_mse["Nieuwstadt"]["thetal_mean"] = 1.1151563794475668e-5 -all_best_mse["Nieuwstadt"]["Hvar_mean"] = 718.0543948198399 +all_best_mse["Nieuwstadt"]["updraft_area"] = 112.10957975882653 +all_best_mse["Nieuwstadt"]["updraft_w"] = 14.588033431933509 +all_best_mse["Nieuwstadt"]["updraft_thetal"] = 117.60593461573117 +all_best_mse["Nieuwstadt"]["u_mean"] = 13.55271333393709 +all_best_mse["Nieuwstadt"]["tke_mean"] = 283.0506941645682 +all_best_mse["Nieuwstadt"]["temperature_mean"] = 1.1410628938335005e-5 +all_best_mse["Nieuwstadt"]["thetal_mean"] = 1.1197150405915735e-5 +all_best_mse["Nieuwstadt"]["Hvar_mean"] = 719.9710717939784 # all_best_mse["Rico"] = OrderedCollections.OrderedDict() -all_best_mse["Rico"]["qt_mean"] = 1.135326031628782 -all_best_mse["Rico"]["updraft_area"] = 479.44450709772644 -all_best_mse["Rico"]["updraft_w"] = 82.9293746327154 -all_best_mse["Rico"]["updraft_qt"] = 17.238873618857568 -all_best_mse["Rico"]["updraft_thetal"] = 133.87379116769426 -all_best_mse["Rico"]["v_mean"] = 0.5144924022690499 -all_best_mse["Rico"]["u_mean"] = 0.421100716597955 -all_best_mse["Rico"]["tke_mean"] = 155.81504934027012 -all_best_mse["Rico"]["temperature_mean"] = 0.0005444683250475638 -all_best_mse["Rico"]["ql_mean"] = 28324.553421041834 +all_best_mse["Rico"]["qt_mean"] = 0.8915568529497633 +all_best_mse["Rico"]["updraft_area"] = 482.7071788979082 +all_best_mse["Rico"]["updraft_w"] = 45.699277721275664 +all_best_mse["Rico"]["updraft_qt"] = 13.984219462606 +all_best_mse["Rico"]["updraft_thetal"] = 133.86163327416165 +all_best_mse["Rico"]["v_mean"] = 0.6974206687894534 +all_best_mse["Rico"]["u_mean"] = 0.37189477593429493 +all_best_mse["Rico"]["tke_mean"] = 160.79024884653123 +all_best_mse["Rico"]["temperature_mean"] = 0.0005293027359347022 +all_best_mse["Rico"]["ql_mean"] = 75.08746656949579 all_best_mse["Rico"]["qi_mean"] = "NA" -all_best_mse["Rico"]["qr_mean"] = 670.3960900621912 -all_best_mse["Rico"]["thetal_mean"] = 0.0005771832405292491 -all_best_mse["Rico"]["Hvar_mean"] = 154085.2917284029 -all_best_mse["Rico"]["QTvar_mean"] = 34840.39704458511 +all_best_mse["Rico"]["qr_mean"] = 769.6650438545246 +all_best_mse["Rico"]["thetal_mean"] = 0.0005031085794766699 +all_best_mse["Rico"]["Hvar_mean"] = 9174.696982539586 +all_best_mse["Rico"]["QTvar_mean"] = 1972.7385780751413 # all_best_mse["Soares"] = OrderedCollections.OrderedDict() -all_best_mse["Soares"]["qt_mean"] = 0.14292527789723997 -all_best_mse["Soares"]["updraft_area"] = 94.35222363436445 -all_best_mse["Soares"]["updraft_w"] = 13.065908605313801 -all_best_mse["Soares"]["updraft_qt"] = 23.639209142240095 -all_best_mse["Soares"]["updraft_thetal"] = 65.72137520255045 -all_best_mse["Soares"]["u_mean"] = 93.8971313259509 -all_best_mse["Soares"]["tke_mean"] = 216.61325540883917 -all_best_mse["Soares"]["temperature_mean"] = 1.3148802683589108e-5 -all_best_mse["Soares"]["thetal_mean"] = 1.2072841930884616e-5 -all_best_mse["Soares"]["Hvar_mean"] = 680.5458129832058 +all_best_mse["Soares"]["qt_mean"] = 0.11271305497300416 +all_best_mse["Soares"]["updraft_area"] = 101.11400451128685 +all_best_mse["Soares"]["updraft_w"] = 14.146144460387697 +all_best_mse["Soares"]["updraft_qt"] = 23.527627665482296 +all_best_mse["Soares"]["updraft_thetal"] = 65.72134058135259 +all_best_mse["Soares"]["u_mean"] = 93.79119005503397 +all_best_mse["Soares"]["tke_mean"] = 209.99387775984619 +all_best_mse["Soares"]["temperature_mean"] = 1.320395745424993e-5 +all_best_mse["Soares"]["thetal_mean"] = 1.204745446281957e-5 +all_best_mse["Soares"]["Hvar_mean"] = 697.9330920610389 # all_best_mse["TRMM_LBA"] = OrderedCollections.OrderedDict() -all_best_mse["TRMM_LBA"]["qt_mean"] = 2.1442449884684387 -all_best_mse["TRMM_LBA"]["updraft_area"] = 1254.0204932517388 -all_best_mse["TRMM_LBA"]["updraft_w"] = 9840.030762797738 -all_best_mse["TRMM_LBA"]["updraft_qt"] = 263.6487773314778 -all_best_mse["TRMM_LBA"]["updraft_thetal"] = 541.3714404624005 -all_best_mse["TRMM_LBA"]["v_mean"] = 71.08717681449379 -all_best_mse["TRMM_LBA"]["u_mean"] = 30.401331899246482 -all_best_mse["TRMM_LBA"]["tke_mean"] = 48667.31593951556 -all_best_mse["TRMM_LBA"]["temperature_mean"] = 0.0005684346487320295 -all_best_mse["TRMM_LBA"]["ql_mean"] = 248342.16732818636 +all_best_mse["TRMM_LBA"]["qt_mean"] = 2.158945215178641 +all_best_mse["TRMM_LBA"]["updraft_area"] = 1253.439729231915 +all_best_mse["TRMM_LBA"]["updraft_w"] = 9878.718995281484 +all_best_mse["TRMM_LBA"]["updraft_qt"] = 263.03596919055025 +all_best_mse["TRMM_LBA"]["updraft_thetal"] = 541.3148993223426 +all_best_mse["TRMM_LBA"]["v_mean"] = 71.03842471884745 +all_best_mse["TRMM_LBA"]["u_mean"] = 30.388590194053364 +all_best_mse["TRMM_LBA"]["tke_mean"] = 49629.51054235478 +all_best_mse["TRMM_LBA"]["temperature_mean"] = 0.0005737239966376086 +all_best_mse["TRMM_LBA"]["ql_mean"] = 249942.5982903604 all_best_mse["TRMM_LBA"]["qi_mean"] = "NA" all_best_mse["TRMM_LBA"]["qr_mean"] = "NA" all_best_mse["TRMM_LBA"]["qs_mean"] = "NA" -all_best_mse["TRMM_LBA"]["thetal_mean"] = 0.0005004674375363604 -all_best_mse["TRMM_LBA"]["Hvar_mean"] = 447022.7713463382 -all_best_mse["TRMM_LBA"]["QTvar_mean"] = 6288.665467442509 +all_best_mse["TRMM_LBA"]["thetal_mean"] = 0.0005039122622028263 +all_best_mse["TRMM_LBA"]["Hvar_mean"] = 448888.3884070762 +all_best_mse["TRMM_LBA"]["QTvar_mean"] = 6271.940536560742 # all_best_mse["LES_driven_SCM"] = OrderedCollections.OrderedDict() -all_best_mse["LES_driven_SCM"]["qt_mean"] = 0.1542447335052964 -all_best_mse["LES_driven_SCM"]["v_mean"] = 0.32696315559512423 -all_best_mse["LES_driven_SCM"]["u_mean"] = 0.0769025499324574 -all_best_mse["LES_driven_SCM"]["temperature_mean"] = 5.7834193462998045e-5 -all_best_mse["LES_driven_SCM"]["ql_mean"] = 18320.242710110357 -all_best_mse["LES_driven_SCM"]["thetal_mean"] = 5.255557008915138e-5 +all_best_mse["LES_driven_SCM"]["qt_mean"] = 0.1484084653743486 +all_best_mse["LES_driven_SCM"]["v_mean"] = 0.33921695947124486 +all_best_mse["LES_driven_SCM"]["u_mean"] = 0.08104493298620415 +all_best_mse["LES_driven_SCM"]["temperature_mean"] = 5.4200539879417664e-5 +all_best_mse["LES_driven_SCM"]["ql_mean"] = 15786.512018314408 +all_best_mse["LES_driven_SCM"]["thetal_mean"] = 5.3216351612268395e-5 # ################################# ################################# diff --git a/src/closures/entr_detr.jl b/src/closures/entr_detr.jl index c904e86f7..3f2b4664d 100644 --- a/src/closures/entr_detr.jl +++ b/src/closures/entr_detr.jl @@ -171,10 +171,20 @@ function εδ_dyn(εδ_model, εδ_vars, entr_dim_scale, detr_dim_scale, ε_nond δ_dim_scale = entrainment_inv_length_scale(εδ_model, εδ_vars, detr_dim_scale) area_limiter = max_area_limiter(εδ_model, εδ_vars.max_area, εδ_vars.a_up) + min_limiter = min_area_limiter(εδ_model, εδ_vars.a_up) + + ε_dim_scale = min(ε_dim_scale, 1.0) + δ_dim_scale = min(δ_dim_scale, 1.0) # fractional dynamical entrainment / detrainment [1 / m] ε_dyn = ε_dim_scale * ε_nondim - δ_dyn = δ_dim_scale * (δ_nondim + area_limiter) + δ_dyn = δ_dim_scale * δ_nondim + + if εδ_params(εδ_model).limit_min_area + ε_dyn += max(δ_dyn, ε_dyn) * min_limiter + end + + δ_dyn += max(ε_dyn, δ_dyn) * area_limiter return ε_dyn, δ_dyn end diff --git a/src/closures/nondimensional_exchange_functions.jl b/src/closures/nondimensional_exchange_functions.jl index 4c7e01af2..479bdba8e 100644 --- a/src/closures/nondimensional_exchange_functions.jl +++ b/src/closures/nondimensional_exchange_functions.jl @@ -7,6 +7,13 @@ function max_area_limiter(εδ_model, max_area, a_up) return A * exp(-k * (max_area - a_up)) end +function min_area_limiter(εδ_model, a_up) + FT = eltype(a_up) + A = εδ_params(εδ_model).min_area_limiter_scale + k = εδ_params(εδ_model).min_area_limiter_power + return A * exp(-k * a_up) +end + function non_dimensional_groups(εδ_model, εδ_model_vars) FT = eltype(εδ_model_vars.tke_en) Δw = get_Δw(εδ_model, εδ_model_vars.w_up, εδ_model_vars.w_en) @@ -19,6 +26,10 @@ function non_dimensional_groups(εδ_model, εδ_model_vars) Π₅ = εδ_model_vars.zc_i / εδ_model_vars.H_up / Π_norm[5] Π₆ = εδ_model_vars.zc_i / εδ_model_vars.ref_H / Π_norm[6] + # Π₁, Π₂ are unbounded, so clip values that blow up + Π₁ = clamp(Π₁, -1.0, 1.0) + Π₂ = clamp(Π₂, -1.0, 1.0) + Π_groups = (Π₁, Π₂, Π₃, Π₄, Π₅, Π₆) return map(i -> Π_groups[i], εδ_model_vars.entr_Π_subset) diff --git a/src/types.jl b/src/types.jl index 3d4b6067a..5d7cdee0e 100644 --- a/src/types.jl +++ b/src/types.jl @@ -51,6 +51,9 @@ Base.@kwdef struct εδModelParams{FT, AFT} c_λ::FT # scaling factor for TKE in entrainment scale calculations γ_lim::FT β_lim::FT + limit_min_area::Bool + min_area_limiter_scale::FT + min_area_limiter_power::FT c_γ::FT # scaling factor for turbulent entrainment rate c_δ::FT # factor multiplier for moist term in entrainment/detrainment Π_norm::AFT @@ -617,12 +620,30 @@ function EDMFModel(::Type{FT}, namelist, precip_model, rain_formation_model) whe c_λ = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "entrainment_smin_tke_coeff") γ_lim = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "area_limiter_scale") β_lim = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "area_limiter_power") + limit_min_area = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "limit_min_area") + min_area_limiter_scale = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "min_area_limiter_scale") + min_area_limiter_power = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "min_area_limiter_power") c_γ = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "turbulent_entrainment_factor") c_δ = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "detrainment_factor") Π_norm = parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "pi_norm_consts") Π_norm = SA.SVector{length(Π_norm), FT}(Π_norm) - εδ_params = εδModelParams{FT, typeof(Π_norm)}(; w_min, c_ε, μ_0, β, χ, c_λ, γ_lim, β_lim, c_γ, c_δ, Π_norm) + εδ_params = εδModelParams{FT, typeof(Π_norm)}(; + w_min, + c_ε, + μ_0, + β, + χ, + c_λ, + γ_lim, + β_lim, + limit_min_area, + min_area_limiter_scale, + min_area_limiter_power, + c_γ, + c_δ, + Π_norm, + ) entr_pi_subset = Tuple(parse_namelist(namelist, "turbulence", "EDMF_PrognosticTKE", "entr_pi_subset"))