From 87d36df3171aa50a6f4b08930a6f588c7b6f66e0 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Thu, 26 Mar 2026 10:54:17 +0000 Subject: [PATCH 01/13] Merge in FCM version of this branch --- dependencies.sh | 4 +- interfaces/jules_interface/build/extract.cfg | 1 + .../rose-meta/jules-lfric/HEAD/rose-meta.conf | 77 +++++++++++++++++++ .../source/support/jules_physics_init_mod.f90 | 27 ++++++- .../lfric_coupled_atmosphere/rose-app.conf | 5 ++ 5 files changed, 109 insertions(+), 5 deletions(-) diff --git a/dependencies.sh b/dependencies.sh index 20df3ddc2..8619b6141 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -25,8 +25,8 @@ export lfric_core_rev=54094 export lfric_core_sources= export casim_rev=apps2.2 export casim_sources= -export jules_rev=31238 -export jules_sources= +export jules_rev=git_migration +export jules_sources=fcm:jules.xm_br/dev/dancopsey/git_migration_zenith_angle_seaice@31401 export socrates_rev=1869 export socrates_sources= export ukca_rev=7497 diff --git a/interfaces/jules_interface/build/extract.cfg b/interfaces/jules_interface/build/extract.cfg index 40f73b6ca..b77df312c 100644 --- a/interfaces/jules_interface/build/extract.cfg +++ b/interfaces/jules_interface/build/extract.cfg @@ -124,6 +124,7 @@ extract.path-incl[jules] = src/science/params/veg_param_mod.F90 \ src/science/radiation/Jin11_osa_mod.F90 \ src/science/radiation/albpft_jls_mod.F90 \ + src/science/radiation/albpond_mod.F90 \ src/science/radiation/albsnow_jls_mod.F90 \ src/science/radiation/albsnow_ts_jls_mod.F90 \ src/science/radiation/calc_direct_albsoil_mod.F90 \ diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf b/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf index 2cddaa708..ea5b61c76 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf +++ b/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf @@ -33,6 +33,83 @@ trigger=namelist:files=albedo_vis_ancil_path: .true. ; [namelist:jules_radiation=l_sea_alb_var_chl] trigger=namelist:files=sea_ancil_path: .true. ; +[namelist:jules_sea_seaice=l_zenith_albedo] +compulsory=true +description=Use zenith angles in the calculation of sea ice + = (and snow on sea ice) albedos +help=With this set to true then the sea ice albedo is adjusted in the same + =way as bare soil in order to adjust the albedo to take into account + =zenith angle. + =The snow on sea ice will also use the same code as snow on land in + =order to calculate the snow albedo which also takes into account + =the zenith angle. +!kind=default +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12 +type=logical + +[namelist:jules_sea_seaice=snow_grain_size_min] +compulsory=true +description=Minimum snow grain size +help=The snow albedo scheme includes a snow grain size temperature + =dependence. For snow on sea ice this goes from a minimum snow + =grain size at -30oC to a maximum snow grain size at melting point. + =The minimum snow grain size is set here. The larger the snow grain + =size the lower the albedo in the NIR part of the spectrum. The + =recommended value is 50 um. +!kind=default +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12a +type=real + +[namelist:jules_sea_seaice=snow_grain_size_max] +compulsory=true +description=Maximum snow grain size +help=The snow albedo scheme includes a snow grain size temperature + =dependence. For snow on sea ice this goes from a minimum snow + =grain size at -30oC to a maximum snow grain size at melting point. + =The maximum snow grain size is set here. The larger the snow grain + =size the lower the albedo in the NIR part of the spectrum. The + =recommended value is 200 um. +!kind=default +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12b +type=real + +[namelist:jules_sea_seaice=snowpatch] +compulsory=true +description=snowpatch length scale (m) +help=Length scale for parameterizing non uniform snow coverage (m). + =This is the depth of snow at which half of the sea ice is + =covered in snow. The smaller this number the more the sea ice + =is covered by snow. +!kind=default +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12c +type=real + +[namelist:jules_sea_seaice=meltpond_alb_vn] +compulsory=true +description=Melt pond albedo scheme +!enumeration=true +help=The scheme used to calculate the albedo of melt ponds + =none: Use this if no melt ponds are used in the model which + = instead adds a temperature dependence on albedo to + = represent how melt ponds would have made the surface + = darker if they existed. + =cice: Use the CICE melt pond albedo scheme which uses a fixed value + = (from albpondv_cice and albpondi_cice) which is linearly + = ramped to with melt pond depth. No zenith angle dependence is + = included. + =malinka: Use the Malinka et al melt pond albedo scheme which uses + = Fresnel equations for reflection off the surface and multiple + = scattering within the pond. This has inbuilt zenith angle + = dependence and more realistic depth dependence. +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C11 +value-titles="none","cice","malinka" +values='none','cice','malinka' + [namelist:jules_snow=can_clump] fail-if=len(this) != namelist:jules_surface_types=npft; # A value must be given for each PFT =all(this == 0) and any(namelist:jules_snow=cansnowpft == '.true.'); # Results in floating point exception if 0. Only used if can_model = 4 (JULES default), cansnowpft = TRUE on that tile and l_embedded_snow = TRUE (LFRic default). diff --git a/interfaces/jules_interface/source/support/jules_physics_init_mod.f90 b/interfaces/jules_interface/source/support/jules_physics_init_mod.f90 index 7b4153e1f..10b39d097 100644 --- a/interfaces/jules_interface/source/support/jules_physics_init_mod.f90 +++ b/interfaces/jules_interface/source/support/jules_physics_init_mod.f90 @@ -56,6 +56,14 @@ module jules_physics_init_mod i_high_wind_drag_null, & i_high_wind_drag_limited, & i_high_wind_drag_reduced_v1, & + meltpond_alb_vn, & + meltpond_alb_vn_none, & + meltpond_alb_vn_cice, & + meltpond_alb_vn_malinka, & + l_zenith_albedo_in => l_zenith_albedo, & + snow_grain_size_min_in => snow_grain_size_min, & + snow_grain_size_max_in => snow_grain_size_max, & + snowpatch_in => snowpatch, & cdn_hw_sea_in => cdn_hw_sea, & cdn_max_sea_in => cdn_max_sea, & u_cdn_hw_in => u_cdn_hw, & @@ -192,7 +200,8 @@ subroutine jules_physics_init() ip_ss_coare_mq, a_chrn_coare, b_chrn_coare, u10_max_coare, & l_10m_neut, alpham, dtice, l_iceformdrag_lupkes, & l_stability_lupkes, l_use_dtstar_sea, hcap_sea, beta_evap, & - l_sice_meltponds, l_sice_meltponds_cice, & + l_sice_meltponds, i_meltpond_alb_vn, l_zenith_albedo, & + snow_grain_size_min, snow_grain_size_max, snowpatch, & l_cice_alb, l_saldep_freeze, l_sice_multilayers, & l_sice_scattering, l_sice_swpen, l_ssice_albedo, & pen_rad_frac_cice, sw_beta_cice, & @@ -344,12 +353,25 @@ subroutine jules_physics_init() z0h_z0m_miz = 0.2_r_um z0h_z0m_sice = 0.2_r_um z0sice = 5.0e-4_r_um + l_zenith_albedo = l_zenith_albedo_in + snow_grain_size_min = snow_grain_size_min_in + snow_grain_size_max = snow_grain_size_max_in + snowpatch = snowpatch_in + + ! Setup the melt pond albedo scheme + select case (meltpond_alb_vn) + case(meltpond_alb_vn_none) + i_meltpond_alb_vn = 0 + case(meltpond_alb_vn_cice) + i_meltpond_alb_vn = 1 + case(meltpond_alb_vn_malinka) + i_meltpond_alb_vn = 2 + end select ! Setup switches that vary depending if the model is ! coupled to an ocean/sea-ice model or not. if (l_couple_sea_ice) then l_sice_meltponds = .true. - l_sice_meltponds_cice = .true. l_tstar_sice_new = .false. l_cice_alb = .true. l_saldep_freeze = .true. @@ -361,7 +383,6 @@ subroutine jules_physics_init() sw_beta_cice = 0.3_r_um else l_sice_meltponds = .false. - l_sice_meltponds_cice = .false. l_tstar_sice_new = .true. l_cice_alb = .false. l_saldep_freeze = .false. diff --git a/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf b/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf index f0275c2a9..6454dd845 100644 --- a/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf +++ b/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf @@ -668,7 +668,12 @@ l_iceformdrag_lupkes=.true. l_sice_heatflux=.true. l_stability_lupkes=.true. l_use_dtstar_sea=.false. +l_zenith_albedo=.true. +meltpond_alb_vn='malinka' nice=5 +snow_grain_size_max=100.0 +snow_grain_size_min=70.0 +snowpatch=0.02 u_cdn_hw=55.0 u_cdn_max=33.0 !!z0h_specified=0.01 From 39b15205810a787e0b7079e3891dd36a6c15e048 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Thu, 26 Mar 2026 11:05:24 +0000 Subject: [PATCH 02/13] Added two changes that were lost in the merge --- dependencies.yaml | 4 ++-- interfaces/jules_interface/build/extract.yaml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dependencies.yaml b/dependencies.yaml index 136ad8637..94ef876aa 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -22,8 +22,8 @@ casim: ref: 2025.12.1 jules: - source: git@github.com:MetOffice/jules.git - ref: 69aaf4d8e5dcf4e0134aac006b183e591aeb94d7 + source: git@github.com:DanCopsey/jules.git + ref: zenith_angle_seaice lfric_apps: source: diff --git a/interfaces/jules_interface/build/extract.yaml b/interfaces/jules_interface/build/extract.yaml index 41128cc14..b5d013f3d 100644 --- a/interfaces/jules_interface/build/extract.yaml +++ b/interfaces/jules_interface/build/extract.yaml @@ -106,6 +106,7 @@ jules: - src/science/params/veg_param_mod.F90 - src/science/radiation/Jin11_osa_mod.F90 - src/science/radiation/albpft_jls_mod.F90 + - src/science/radiation/albpond_mod.F90 - src/science/radiation/albsnow_jls_mod.F90 - src/science/radiation/albsnow_ts_jls_mod.F90 - src/science/radiation/calc_direct_albsoil_mod.F90 From 1abbc34984f62e41ca1542a03e29a9eef0b01686 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Tue, 7 Apr 2026 14:26:10 +0100 Subject: [PATCH 03/13] Corrected location of lfric_gal_diagnostics.nc file --- rose-stem/app/lfric2lfric/opt/rose-app-lbc.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rose-stem/app/lfric2lfric/opt/rose-app-lbc.conf b/rose-stem/app/lfric2lfric/opt/rose-app-lbc.conf index 791043130..629b93487 100644 --- a/rose-stem/app/lfric2lfric/opt/rose-app-lbc.conf +++ b/rose-stem/app/lfric2lfric/opt/rose-app-lbc.conf @@ -6,7 +6,7 @@ source=$ROSE_SUITE_DIR/app/lfric2lfric/file/iodef_lbc.xml [file:source_file_lbc.nc] mode=auto -source=/data/scratch/juan.m.castillo/lfric_gal_diagnostics.nc +source=$BIG_DATA_DIR/lfric2lfric/lfric_gal_diagnostics.nc [namelist:lfric2lfric] destination_mesh_name='dynamics' From 5d8186e548954b0c343119607548f8fb8bb6994e Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Tue, 7 Apr 2026 15:08:20 +0100 Subject: [PATCH 04/13] Add upgrade macro --- .../rose-meta/jules-lfric/versions.py | 83 +++---------------- 1 file changed, 10 insertions(+), 73 deletions(-) diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py index 329bfc2bc..813fb8680 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py +++ b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py @@ -31,81 +31,18 @@ def upgrade(self, config, meta_config=None): """ -class vn30_t146(MacroUpgrade): - """Upgrade macro for ticket #146 by Maggie Hendry.""" +class vn31_t400(MacroUpgrade): + """Upgrade macro for ticket #400 by Dan Copsey.""" - BEFORE_TAG = "vn3.0" - AFTER_TAG = "vn3.0_t146" + BEFORE_TAG = "vn3.1" + AFTER_TAG = "vn3.1_t400" def upgrade(self, config, meta_config=None): - # Commands From: rose-meta/jules-lfric - # Add jules_model_environment_lfric namelist - source = self.get_setting_value( - config, ["file:configuration.nml", "source"] - ) - source = re.sub( - r"namelist:jules_hydrology", - r"namelist:jules_hydrology)" - + "\n" - + " (namelist:jules_model_environment_lfric", - source, - ) - self.change_setting_value( - config, ["file:configuration.nml", "source"], source - ) - self.add_setting( - config, - ["namelist:jules_model_environment_lfric", "l_jules_parent"], - "'lfric'", - ) - # Add jules_surface namelist items - self.add_setting( - config, - ["namelist:jules_surface", "all_tiles"], - "'off'", - ) - self.add_setting(config, ["namelist:jules_surface", "beta1"], "0.83") - self.add_setting(config, ["namelist:jules_surface", "beta2"], "0.93") - self.add_setting( - config, ["namelist:jules_surface", "beta_cnv_bl"], "0.04" - ) - self.add_setting( - config, - ["namelist:jules_surface", "fd_hill_option"], - "'capped_lowhill'", - ) - self.add_setting(config, ["namelist:jules_surface", "fwe_c3"], "0.5") - self.add_setting( - config, ["namelist:jules_surface", "fwe_c4"], "20000.0" - ) - self.add_setting(config, ["namelist:jules_surface", "hleaf"], "5.7e4") - self.add_setting(config, ["namelist:jules_surface", "hwood"], "1.1e4") - self.add_setting( - config, ["namelist:jules_surface", "i_modiscopt"], "'on'" - ) - self.add_setting( - config, ["namelist:jules_surface", "l_epot_corr"], ".true." - ) - self.add_setting( - config, ["namelist:jules_surface", "l_land_ice_imp"], ".true." - ) - self.add_setting( - config, ["namelist:jules_surface", "l_mo_buoyancy_calc"], ".true." - ) - self.add_setting( - config, ["namelist:jules_surface", "orog_drag_param"], "0.15" - ) - self.add_setting( - config, ["namelist:jules_surface", "l_flake_model"], ".false." - ) - self.add_setting( - config, ["namelist:jules_surface", "l_elev_land_ice"], ".false." - ) - self.add_setting( - config, ["namelist:jules_surface", "l_elev_lw_down"], ".false." - ) - self.add_setting( - config, ["namelist:jules_surface", "l_point_data"], ".false." - ) + + self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".false.") + self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'cice'") + self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_max"], "100.0") + self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_min"], "70.0") + self.add_setting(config, ["namelist:jules_sea_seaice", "snowpatch"], "0.02") return config, self.reports From 6c672829bad0e9229aa8b6977dd1735d93bf4924 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Fri, 10 Apr 2026 13:25:06 +0100 Subject: [PATCH 05/13] Add upgrade macro --- .../jules_interface/rose-meta/jules-lfric/versions.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py index 1118b9da2..043c8adac 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py +++ b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py @@ -40,9 +40,17 @@ class vn31_t400(MacroUpgrade): AFTER_TAG = "vn3.1_t400" def upgrade(self, config, meta_config=None): + + # Is this a coupled model? The easiest way to get this is from the number of sea ice categories. + nice = int(self.get_setting_value(config, ["namelist:jules_sea_seaice", "nice"]) + is_coupled = nice > 1 + # Add the new namelist settings self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".false.") - self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'cice'") + if is_coupled: + self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'cice'") + else: + self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'none'") self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_max"], "100.0") self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_min"], "70.0") self.add_setting(config, ["namelist:jules_sea_seaice", "snowpatch"], "0.02") From 2671c955448ce3af2043aecbec6d19cce68c124e Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Fri, 10 Apr 2026 13:27:32 +0100 Subject: [PATCH 06/13] Removed manual settings added through rose-stem --- rose-stem/app/lfric_coupled_atmosphere/rose-app.conf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf b/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf index 775ca305d..b9830a668 100644 --- a/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf +++ b/rose-stem/app/lfric_coupled_atmosphere/rose-app.conf @@ -673,12 +673,7 @@ l_iceformdrag_lupkes=.true. l_sice_heatflux=.true. l_stability_lupkes=.true. l_use_dtstar_sea=.false. -l_zenith_albedo=.true. -meltpond_alb_vn='malinka' nice=5 -snow_grain_size_max=100.0 -snow_grain_size_min=70.0 -snowpatch=0.02 u_cdn_hw=55.0 u_cdn_max=33.0 !!z0h_specified=0.01 From 3f0ce0d16336faad5aed58f31b5b58c786e7ade2 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Fri, 10 Apr 2026 16:55:16 +0100 Subject: [PATCH 07/13] Improve command to help black --- .../rose-meta/jules-lfric/.versions.py | 54 +++++++++++++++++++ .../rose-meta/jules-lfric/versions.py | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 interfaces/jules_interface/rose-meta/jules-lfric/.versions.py diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/.versions.py b/interfaces/jules_interface/rose-meta/jules-lfric/.versions.py new file mode 100644 index 000000000..402709fdf --- /dev/null +++ b/interfaces/jules_interface/rose-meta/jules-lfric/.versions.py @@ -0,0 +1,54 @@ +import re +import sys + +from metomi.rose.upgrade import MacroUpgrade # noqa: F401 + +from .version30_31 import * + + +class UpgradeError(Exception): + """Exception created when an upgrade fails.""" + + def __init__(self, msg): + self.msg = msg + + def __repr__(self): + sys.tracebacklimit = 0 + return self.msg + + __str__ = __repr__ + + +""" +Copy this template and complete to add your macro +class vnXX_txxx(MacroUpgrade): + # Upgrade macro for by + BEFORE_TAG = "vnX.X" + AFTER_TAG = "vnX.X_txxx" + def upgrade(self, config, meta_config=None): + # Add settings + return config, self.reports +""" +class vn31_t400(MacroUpgrade): + """Upgrade macro for ticket #400 by Dan Copsey.""" + + BEFORE_TAG = "vn3.1" + AFTER_TAG = "vn3.1_t400" + + def upgrade(self, config, meta_config=None): + # Commands From: rose-meta/jules-lfric + # Is this a coupled model? The easiest way to get this is from the number of sea ice categories. + nice = int(self.get_setting_value(config, ["namelist:jules_sea_seaice", "nice"]) + is_coupled = nice > 1 + # Add the new namelist settings + self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".false.") + if is_coupled: + self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'cice'") + else: + self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'none'") + self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_max"], "100.0") + self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_min"], "70.0") + self.add_setting(config, ["namelist:jules_sea_seaice", "snowpatch"], "0.02") + + + return config, self.reports diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py index 043c8adac..94d3309aa 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py +++ b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py @@ -43,7 +43,7 @@ def upgrade(self, config, meta_config=None): # Is this a coupled model? The easiest way to get this is from the number of sea ice categories. nice = int(self.get_setting_value(config, ["namelist:jules_sea_seaice", "nice"]) - is_coupled = nice > 1 + is_coupled = bool(nice > 1) # Add the new namelist settings self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".false.") From 517bee95a1d1f9fd72ed003f84ce16ac428dd4e7 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Fri, 10 Apr 2026 16:58:39 +0100 Subject: [PATCH 08/13] Added bracked --- interfaces/jules_interface/rose-meta/jules-lfric/versions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py index 94d3309aa..36d63dbe2 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py +++ b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py @@ -42,8 +42,8 @@ class vn31_t400(MacroUpgrade): def upgrade(self, config, meta_config=None): # Is this a coupled model? The easiest way to get this is from the number of sea ice categories. - nice = int(self.get_setting_value(config, ["namelist:jules_sea_seaice", "nice"]) - is_coupled = bool(nice > 1) + nice = int(self.get_setting_value(config, ["namelist:jules_sea_seaice", "nice"])) + is_coupled = nice > 1 # Add the new namelist settings self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".false.") From a4ca6a1130f01764edbb37843f844e7c3c1b38bc Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Fri, 17 Apr 2026 17:07:06 +0100 Subject: [PATCH 09/13] Removed .versions.py file that got acidentally added --- .../rose-meta/jules-lfric/.versions.py | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 interfaces/jules_interface/rose-meta/jules-lfric/.versions.py diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/.versions.py b/interfaces/jules_interface/rose-meta/jules-lfric/.versions.py deleted file mode 100644 index 402709fdf..000000000 --- a/interfaces/jules_interface/rose-meta/jules-lfric/.versions.py +++ /dev/null @@ -1,54 +0,0 @@ -import re -import sys - -from metomi.rose.upgrade import MacroUpgrade # noqa: F401 - -from .version30_31 import * - - -class UpgradeError(Exception): - """Exception created when an upgrade fails.""" - - def __init__(self, msg): - self.msg = msg - - def __repr__(self): - sys.tracebacklimit = 0 - return self.msg - - __str__ = __repr__ - - -""" -Copy this template and complete to add your macro -class vnXX_txxx(MacroUpgrade): - # Upgrade macro for by - BEFORE_TAG = "vnX.X" - AFTER_TAG = "vnX.X_txxx" - def upgrade(self, config, meta_config=None): - # Add settings - return config, self.reports -""" -class vn31_t400(MacroUpgrade): - """Upgrade macro for ticket #400 by Dan Copsey.""" - - BEFORE_TAG = "vn3.1" - AFTER_TAG = "vn3.1_t400" - - def upgrade(self, config, meta_config=None): - # Commands From: rose-meta/jules-lfric - # Is this a coupled model? The easiest way to get this is from the number of sea ice categories. - nice = int(self.get_setting_value(config, ["namelist:jules_sea_seaice", "nice"]) - is_coupled = nice > 1 - # Add the new namelist settings - self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".false.") - if is_coupled: - self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'cice'") - else: - self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'none'") - self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_max"], "100.0") - self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_min"], "70.0") - self.add_setting(config, ["namelist:jules_sea_seaice", "snowpatch"], "0.02") - - - return config, self.reports From 45ca8fb72d6d52f812da588b87797299be34f729 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Fri, 17 Apr 2026 17:14:09 +0100 Subject: [PATCH 10/13] Make all 3 new inputs double precision. This is in response to Ian Boutle's suggestion on 16/04/2026 --- .../rose-meta/jules-lfric/HEAD/rose-meta.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf b/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf index 934c3a66f..9e4da6f32 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf +++ b/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf @@ -94,7 +94,7 @@ help=The snow albedo scheme includes a snow grain size temperature =The minimum snow grain size is set here. The larger the snow grain =size the lower the albedo in the NIR part of the spectrum. The =recommended value is 50 um. -!kind=default +!kind=double ns=namelist/Science/JULES Surface/Sea and sea-ice sort-key=Panel-C12a type=real @@ -108,7 +108,7 @@ help=The snow albedo scheme includes a snow grain size temperature =The maximum snow grain size is set here. The larger the snow grain =size the lower the albedo in the NIR part of the spectrum. The =recommended value is 200 um. -!kind=default +!kind=double ns=namelist/Science/JULES Surface/Sea and sea-ice sort-key=Panel-C12b type=real @@ -120,7 +120,7 @@ help=Length scale for parameterizing non uniform snow coverage (m). =This is the depth of snow at which half of the sea ice is =covered in snow. The smaller this number the more the sea ice =is covered by snow. -!kind=default +!kind=double ns=namelist/Science/JULES Surface/Sea and sea-ice sort-key=Panel-C12c type=real From 12089564710ff2d36716dd85019859680962788d Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Wed, 22 Apr 2026 10:54:02 +0100 Subject: [PATCH 11/13] Make new code turned on the default (will change KGOs) --- interfaces/jules_interface/rose-meta/jules-lfric/versions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py index 36d63dbe2..6825f9282 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/versions.py +++ b/interfaces/jules_interface/rose-meta/jules-lfric/versions.py @@ -46,9 +46,9 @@ def upgrade(self, config, meta_config=None): is_coupled = nice > 1 # Add the new namelist settings - self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".false.") + self.add_setting(config, ["namelist:jules_sea_seaice", "l_zenith_albedo"], ".true.") if is_coupled: - self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'cice'") + self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'malinka'") else: self.add_setting(config, ["namelist:jules_sea_seaice", "meltpond_alb_vn"], "'none'") self.add_setting(config, ["namelist:jules_sea_seaice", "snow_grain_size_max"], "100.0") From ab396f5d90af505da8e2275c0a045e414e263f24 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Thu, 23 Apr 2026 17:58:57 +0100 Subject: [PATCH 12/13] Changed checksums for new code turned on --- ...pled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt index f443e8a0f..f6e4f9b0d 100644 --- a/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 411B540D9DA63C6C -Inner product checksum theta = 42735B1B24537EDD -Inner product checksum u = 456F42BA8FBFE59A -Inner product checksum mr1 = 40368429CA80B478 -Inner product checksum mr2 = 3F3FC9B57D725706 -Inner product checksum mr3 = 3F0247C38AA5E417 -Inner product checksum mr4 = 3F3672C68E0DEAB3 +Inner product checksum rho = 411B5408FE49596F +Inner product checksum theta = 42735B1E7F9AFC79 +Inner product checksum u = 456F417B18A1C060 +Inner product checksum mr1 = 403684B2BF59E16C +Inner product checksum mr2 = 3F400271DBE5BDB9 +Inner product checksum mr3 = 3F024A769B874A7D +Inner product checksum mr4 = 3F36663312EA3A6D Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 From 54c54323fba6e5c5461a1e835f7549ccada38c84 Mon Sep 17 00:00:00 2001 From: Dan Copsey Date: Mon, 27 Apr 2026 18:02:03 +0100 Subject: [PATCH 13/13] Moved meta data to lfric-jules-shared as per reviewer comments --- .../rose-meta/jules-lfric/HEAD/rose-meta.conf | 77 ------------------ .../jules-sea-seaice/HEAD/rose-meta.conf | 78 +++++++++++++++++++ 2 files changed, 78 insertions(+), 77 deletions(-) diff --git a/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf b/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf index 9e4da6f32..cd725e1b6 100644 --- a/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf +++ b/interfaces/jules_interface/rose-meta/jules-lfric/HEAD/rose-meta.conf @@ -70,83 +70,6 @@ trigger=namelist:files=albedo_vis_ancil_path: .true. ; [namelist:jules_radiation=l_sea_alb_var_chl] trigger=namelist:files=sea_ancil_path: .true. ; -[namelist:jules_sea_seaice=l_zenith_albedo] -compulsory=true -description=Use zenith angles in the calculation of sea ice - = (and snow on sea ice) albedos -help=With this set to true then the sea ice albedo is adjusted in the same - =way as bare soil in order to adjust the albedo to take into account - =zenith angle. - =The snow on sea ice will also use the same code as snow on land in - =order to calculate the snow albedo which also takes into account - =the zenith angle. -!kind=default -ns=namelist/Science/JULES Surface/Sea and sea-ice -sort-key=Panel-C12 -type=logical - -[namelist:jules_sea_seaice=snow_grain_size_min] -compulsory=true -description=Minimum snow grain size -help=The snow albedo scheme includes a snow grain size temperature - =dependence. For snow on sea ice this goes from a minimum snow - =grain size at -30oC to a maximum snow grain size at melting point. - =The minimum snow grain size is set here. The larger the snow grain - =size the lower the albedo in the NIR part of the spectrum. The - =recommended value is 50 um. -!kind=double -ns=namelist/Science/JULES Surface/Sea and sea-ice -sort-key=Panel-C12a -type=real - -[namelist:jules_sea_seaice=snow_grain_size_max] -compulsory=true -description=Maximum snow grain size -help=The snow albedo scheme includes a snow grain size temperature - =dependence. For snow on sea ice this goes from a minimum snow - =grain size at -30oC to a maximum snow grain size at melting point. - =The maximum snow grain size is set here. The larger the snow grain - =size the lower the albedo in the NIR part of the spectrum. The - =recommended value is 200 um. -!kind=double -ns=namelist/Science/JULES Surface/Sea and sea-ice -sort-key=Panel-C12b -type=real - -[namelist:jules_sea_seaice=snowpatch] -compulsory=true -description=snowpatch length scale (m) -help=Length scale for parameterizing non uniform snow coverage (m). - =This is the depth of snow at which half of the sea ice is - =covered in snow. The smaller this number the more the sea ice - =is covered by snow. -!kind=double -ns=namelist/Science/JULES Surface/Sea and sea-ice -sort-key=Panel-C12c -type=real - -[namelist:jules_sea_seaice=meltpond_alb_vn] -compulsory=true -description=Melt pond albedo scheme -!enumeration=true -help=The scheme used to calculate the albedo of melt ponds - =none: Use this if no melt ponds are used in the model which - = instead adds a temperature dependence on albedo to - = represent how melt ponds would have made the surface - = darker if they existed. - =cice: Use the CICE melt pond albedo scheme which uses a fixed value - = (from albpondv_cice and albpondi_cice) which is linearly - = ramped to with melt pond depth. No zenith angle dependence is - = included. - =malinka: Use the Malinka et al melt pond albedo scheme which uses - = Fresnel equations for reflection off the surface and multiple - = scattering within the pond. This has inbuilt zenith angle - = dependence and more realistic depth dependence. -ns=namelist/Science/JULES Surface/Sea and sea-ice -sort-key=Panel-C11 -value-titles="none","cice","malinka" -values='none','cice','malinka' - [namelist:jules_snow=can_clump] fail-if=len(this) != namelist:jules_surface_types=npft; # A value must be given for each PFT =all(this == 0) and any(namelist:jules_snow=cansnowpft == '.true.'); # Results in floating point exception if 0. Only used if can_model = 4 (JULES default), cansnowpft = TRUE on that tile and l_embedded_snow = TRUE (LFRic default). diff --git a/interfaces/jules_interface/rose-meta/lfric-jules-shared/jules-sea-seaice/HEAD/rose-meta.conf b/interfaces/jules_interface/rose-meta/lfric-jules-shared/jules-sea-seaice/HEAD/rose-meta.conf index 8f6938c9e..5537f8427 100644 --- a/interfaces/jules_interface/rose-meta/lfric-jules-shared/jules-sea-seaice/HEAD/rose-meta.conf +++ b/interfaces/jules_interface/rose-meta/lfric-jules-shared/jules-sea-seaice/HEAD/rose-meta.conf @@ -195,6 +195,43 @@ sort-key=Panel-C14 trigger=namelist:jules_sea_seaice=hcap_sea: .true.; type=logical +[namelist:jules_sea_seaice=l_zenith_albedo] +compulsory=true +description=Use zenith angles in the calculation of sea ice + = (and snow on sea ice) albedos +help=With this set to true then the sea ice albedo is adjusted in the same + =way as bare soil in order to adjust the albedo to take into account + =zenith angle. + =The snow on sea ice will also use the same code as snow on land in + =order to calculate the snow albedo which also takes into account + =the zenith angle. +!kind=default +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12 +type=logical + +[namelist:jules_sea_seaice=meltpond_alb_vn] +compulsory=true +description=Melt pond albedo scheme +!enumeration=true +help=The scheme used to calculate the albedo of melt ponds + =none: Use this if no melt ponds are used in the model which + = instead adds a temperature dependence on albedo to + = represent how melt ponds would have made the surface + = darker if they existed. + =cice: Use the CICE melt pond albedo scheme which uses a fixed value + = (from albpondv_cice and albpondi_cice) which is linearly + = ramped to with melt pond depth. No zenith angle dependence is + = included. + =malinka: Use the Malinka et al melt pond albedo scheme which uses + = Fresnel equations for reflection off the surface and multiple + = scattering within the pond. This has inbuilt zenith angle + = dependence and more realistic depth dependence. +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C11 +value-titles="none","cice","malinka" +values='none','cice','malinka' + [namelist:jules_sea_seaice=nice] compulsory=true description=Number of sea ice categories @@ -209,6 +246,46 @@ range=1:99 sort-key=Panel-C00a type=integer +[namelist:jules_sea_seaice=snow_grain_size_min] +compulsory=true +description=Minimum snow grain size +help=The snow albedo scheme includes a snow grain size temperature + =dependence. For snow on sea ice this goes from a minimum snow + =grain size at -30oC to a maximum snow grain size at melting point. + =The minimum snow grain size is set here. The larger the snow grain + =size the lower the albedo in the NIR part of the spectrum. The + =recommended value is 50 um. +!kind=double +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12a +type=real + +[namelist:jules_sea_seaice=snow_grain_size_max] +compulsory=true +description=Maximum snow grain size +help=The snow albedo scheme includes a snow grain size temperature + =dependence. For snow on sea ice this goes from a minimum snow + =grain size at -30oC to a maximum snow grain size at melting point. + =The maximum snow grain size is set here. The larger the snow grain + =size the lower the albedo in the NIR part of the spectrum. The + =recommended value is 200 um. +!kind=double +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12b +type=real + +[namelist:jules_sea_seaice=snowpatch] +compulsory=true +description=snowpatch length scale (m) +help=Length scale for parameterizing non uniform snow coverage (m). + =This is the depth of snow at which half of the sea ice is + =covered in snow. The smaller this number the more the sea ice + =is covered by snow. +!kind=double +ns=namelist/Science/JULES Surface/Sea and sea-ice +sort-key=Panel-C12c +type=real + [namelist:jules_sea_seaice=u_cdn_hw] compulsory=true description=Neutral wind speed where the drag attains the high wind value. @@ -243,3 +320,4 @@ help=Specified value held fixed throughout the run range=0.0:100.0 sort-key=Panel-C09a type=real +