Skip to content
1 change: 1 addition & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
| yaswant | Yaswant Pradhan | Met Office | 2026-06-30 |
| doucla | Douglas Clark | UKCEH | 2026-07-03 |
| james-bruten-mo | James Bruten | Met Office | 2026-07-09 |
| eleanorgb | Eleanor Burke | Met Office | 2026-08-24 |
13 changes: 10 additions & 3 deletions doc/source/namelists/jules_soil.nml.rst
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ This file sets the soil options and parameters. It contains one namelist called

Switch for using a thermal bedrock column beneath the soil column. The bedrock has no hydrological processes - diffusion of heat is the only process represented.

Properties of the bedrock can be set using :nml:mem:`ns_deep`, :nml:mem:`hcapdeep`, :nml:mem:`hcondeep` and :nml:mem:`dzdeep`.
Properties of the bedrock can be set using :nml:mem:`ns_deep`, :nml:mem:`hcapdeep`, :nml:mem:`hcondeep`, :nml:mem:`dzdeep` and :nml:mem:`hflux_geo`.

TRUE
An additional bedrock column is used below the soil column.
Expand Down Expand Up @@ -147,9 +147,9 @@ This file sets the soil options and parameters. It contains one namelist called
.. nml:member:: hcondeep

:type: real
:default: 8.6
:default: 3.0

The heat conductivity of the bedrock (W m\ :sup:`-2` K\ :sup:`-1` ).
The heat conductivity of the bedrock (W m\ :sup:`-1` K\ :sup:`-1` ).


.. nml:member:: dzdeep
Expand All @@ -159,6 +159,13 @@ This file sets the soil options and parameters. It contains one namelist called

The thickness of the bedrock layers (m).

.. nml:member:: hflux_geo

:type: real
:default: 0.067

The geothermal heat flux (W m\ :sup:`-2` ).


.. nml:member:: cs_min

Expand Down
13 changes: 11 additions & 2 deletions rose-meta/jules-standalone/HEAD/rose-meta.conf
Original file line number Diff line number Diff line change
Expand Up @@ -4700,21 +4700,30 @@ url=https://metoffice.github.io/jules/latest/namelists/jules_soil.nml.html#JULES

[namelist:jules_soil=hcondeep]
compulsory=true
description=Thermal conductivity of bedrock (W m-2 K-1)
description=Thermal conductivity of bedrock (W m-1 K-1)
range=0.4:12.0
sort-key=Panel-E06c
type=real
url=https://metoffice.github.io/jules/latest/namelists/jules_soil.nml.html#JULES_SOIL::hcondeep

[namelist:jules_soil=hflux_geo]
compulsory=true
description=Geothermal heat flux (W/m2)
range=-0.052:15.6
sort-key=Panel-E06e
type=real
url=https://metoffice.github.io/jules/latest/namelists/jules_soil.nml.html#JULES_SOIL::hflux_geo

[namelist:jules_soil=l_bedrock]
compulsory=true
description=Include bedrock below soil column with thermal diffusion; does not include hydrology
description=Include bedrock below soil column with thermal diffusion - does not include hydrology
=NOT AVAILABLE TO UM
sort-key=Panel-E06
trigger=namelist:jules_soil=ns_deep: .true.;
= namelist:jules_soil=hcapdeep: .true.;
= namelist:jules_soil=hcondeep: .true.;
= namelist:jules_soil=dzdeep: .true.;
= namelist:jules_soil=hflux_geo: .true.;
type=logical
url=https://metoffice.github.io/jules/latest/namelists/jules_soil.nml.html#JULES_SOIL::l_bedrock

Expand Down
8 changes: 5 additions & 3 deletions rose-meta/jules-standalone/versions.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,17 @@
from .version81_82 import *


class vnYY_txxxx(MacroUpgrade):
class vn82_t76(MacroUpgrade):

"""Upgrade macro from JULES by Author"""

BEFORE_TAG = "vnY.Y"
AFTER_TAG = "vnY.Y_txxxx"
BEFORE_TAG = "vn8.2"
AFTER_TAG = "vn8.2_t76"

def upgrade(self, config, meta_config=None):
"""Upgrade a JULES runtime app configuration."""

# Add settings
self.add_setting(config, ["namelist:jules_soil", "hflux_geo"], "0.067")
self.change_setting_value(config, ["namelist:jules_soil", "hcondeep"], "3.0")
return config, self.reports
Comment on lines 58 to 61
46 changes: 32 additions & 14 deletions src/control/shared/jules_soil_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
MODULE jules_soil_mod

USE max_dimensions, ONLY: sm_levels_max
USE ancil_info, ONLY: nsoilt

USE missing_data_mod, ONLY: rmdi, imdi

Expand Down Expand Up @@ -129,12 +130,13 @@ MODULE jules_soil_mod

REAL(KIND=real_jlslsm) :: &
hcapdeep = rmdi, &
! Heat capacity of bedrock
! Heat capacity of bedrock (J/K/m3)
hcondeep = rmdi, &
! Thermal conductivity of bedrock
dzdeep = rmdi
! Thickness of bedrock layers

! Thermal conductivity of bedrock (W/m/K)
dzdeep = rmdi, &
! Thickness of bedrock layers (m)
hflux_geo = rmdi
! Geothermal heat flux (W/m2)

!-----------------------------------------------------------------------------
! Variable length arrays that can be set using the namelist
Expand Down Expand Up @@ -172,7 +174,7 @@ MODULE jules_soil_mod
l_holdwater, l_tile_soil, &
! Parameters
cs_min, zsmc, zst, confrac, ns_deep, hcapdeep, hcondeep, &
dzdeep, dzsoil_io, dzsoil_elev
dzdeep, dzsoil_io, dzsoil_elev, hflux_geo



Expand Down Expand Up @@ -211,7 +213,6 @@ SUBROUTINE check_jules_soil()

! Check that sm_levels has been set
IF ( sm_levels < 1 ) THEN
errorstatus = 101
CALL ereport("check_jules_soil", errorstatus, &
"sm_levels must be between 1 and sm_levels_max")
END IF
Expand Down Expand Up @@ -280,33 +281,44 @@ SUBROUTINE check_jules_soil()
END IF

IF ( l_bedrock ) THEN
! Check ns_deep, dzdeep, hcondeep. hcapdeep are set and valid
IF ( ABS( ns_deep - rmdi ) < EPSILON(1.0) ) THEN
CALL ereport(RoutineName, errorstatus, 'ns_deep not found')
! Check ns_deep, dzdeep, hcondeep. hcapdeep, hflux_geo are set and valid
IF ( ns_deep == imdi ) THEN
CALL ereport(RoutineName, errorstatus, 'ns_deep not specified')
ELSE IF ( ns_deep < 1 ) THEN
CALL ereport(RoutineName, errorstatus, &
'Bedrock must have at least one layer')
ELSE IF ( nsoilt > 1 ) THEN
CALL ereport(RoutineName, errorstatus, &
'Bedrock not yet compatible with soil tiling')
END IF

IF ( ABS( dzdeep - rmdi ) < EPSILON(1.0) ) THEN
CALL ereport(RoutineName, errorstatus, 'dzdeep not found')
ELSE IF ( dzdeep < 0.01 ) THEN
CALL ereport(RoutineName, errorstatus, &
'layer thickness for bedrock (dzdeep) must be > 0.01')
'layer thickness for bedrock (dzdeep) must be > 0.01 m')
END IF

IF ( ABS( hcondeep - rmdi ) < EPSILON(1.0) ) THEN
CALL ereport(RoutineName, errorstatus, 'hcondeep not found')
ELSE IF ( hcondeep < 0.4 .OR. hcondeep > 12.0 ) THEN
CALL ereport(RoutineName, errorstatus, &
'hcondeep must lie in the range 0.4 to 12.0')
'hcondeep must lie in the range 0.4 to 12.0 W/m/K')
END IF

IF ( ABS( hcapdeep - rmdi ) < EPSILON(1.0) ) THEN
CALL ereport(RoutineName, errorstatus, 'hcapdeep not found')
ELSE IF (hcapdeep < 100000.0 .OR. hcapdeep > 8000000.0 ) THEN
CALL ereport(RoutineName, errorstatus, &
'hcapdeep must lie in the range 100000 to 8000000')
'hcapdeep must lie in the range 100000 to 8000000 J/K/m3')
END IF

! For continents, areal average 0.067 (F.LUCAZEAU, 2019)
IF ( ABS( hflux_geo - rmdi ) < EPSILON(1.0) ) THEN
CALL ereport(RoutineName, errorstatus, 'hflux_geo not found')
ELSE IF (hflux_geo < -0.052 .OR. hflux_geo > 15.6 ) THEN
CALL ereport(RoutineName, errorstatus, &
'hflux_geo must lie in the range -0.052 to 15.6 W/m2')
END IF
END IF ! end if l_bedrock

Expand Down Expand Up @@ -372,6 +384,9 @@ SUBROUTINE print_nlist_jules_soil()
WRITE(lineBuffer, *) ' dzdeep = ', dzdeep
CALL jules_print('jules_soil', lineBuffer)

WRITE(lineBuffer, *) ' hflux_geo = ', hflux_geo
CALL jules_print('jules_soil', lineBuffer)

WRITE(lineBuffer, *) ' dzsoil_io = ', dzsoil_io(1:sm_levels)
CALL jules_print('jules_soil', lineBuffer)

Expand Down Expand Up @@ -418,7 +433,7 @@ SUBROUTINE read_nml_jules_soil (unitnumber)
! set number of each type of variable in my_namelist type
INTEGER, PARAMETER :: no_of_types = 3
INTEGER, PARAMETER :: n_int = 3
INTEGER, PARAMETER :: n_real = 8 + sm_levels_max
INTEGER, PARAMETER :: n_real = 9 + sm_levels_max
INTEGER, PARAMETER :: n_log = 6

TYPE :: my_namelist
Expand All @@ -433,6 +448,7 @@ SUBROUTINE read_nml_jules_soil (unitnumber)
REAL(KIND=real_jlslsm) :: hcapdeep
REAL(KIND=real_jlslsm) :: hcondeep
REAL(KIND=real_jlslsm) :: dzdeep
REAL(KIND=real_jlslsm) :: hflux_geo
REAL(KIND=real_jlslsm) ::dzsoil_io(sm_levels_max)
REAL(KIND=real_jlslsm) ::dzsoil_elev
LOGICAL :: l_vg_soil
Expand Down Expand Up @@ -467,6 +483,7 @@ SUBROUTINE read_nml_jules_soil (unitnumber)
my_nml % confrac = confrac
my_nml % hcapdeep = hcapdeep
my_nml % hcondeep = hcondeep
my_nml % hflux_geo = hflux_geo
my_nml % dzdeep = dzdeep
my_nml % dzsoil_io = dzsoil_io
my_nml % dzsoil_elev = dzsoil_elev
Expand All @@ -493,6 +510,7 @@ SUBROUTINE read_nml_jules_soil (unitnumber)
hcapdeep = my_nml % hcapdeep
hcondeep = my_nml % hcondeep
dzdeep = my_nml % dzdeep
hflux_geo = my_nml % hflux_geo
dzsoil_io = my_nml % dzsoil_io
dzsoil_elev = my_nml % dzsoil_elev
l_vg_soil = my_nml % l_vg_soil
Expand Down
11 changes: 10 additions & 1 deletion src/control/shared/prognostics.F90
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ MODULE prognostics

REAL(KIND=real_jlslsm), ALLOCATABLE :: tsoil_deep_gb(:,:)
! Deep soil temperatures (K)
REAL(KIND=real_jlslsm), ALLOCATABLE :: dtsd_acc_gb(:,:)
! Accumulated correction in deep soil (bedrock) temperature (K).
REAL(KIND=real_jlslsm), ALLOCATABLE :: sice_surft(:,:,:)
! Snow layer ice mass on tiles (kg/m2)
REAL(KIND=real_jlslsm), ALLOCATABLE :: sliq_surft(:,:,:)
Expand Down Expand Up @@ -201,6 +203,7 @@ MODULE prognostics
INTEGER, POINTER :: years_since_harvest(:,:)

REAL(KIND=real_jlslsm), POINTER :: tsoil_deep_gb(:,:)
REAL(KIND=real_jlslsm), POINTER :: dtsd_acc_gb(:,:)
REAL(KIND=real_jlslsm), POINTER :: sice_surft(:,:,:)
REAL(KIND=real_jlslsm), POINTER :: sliq_surft(:,:,:)
REAL(KIND=real_jlslsm), POINTER :: snowdepth_surft(:,:)
Expand Down Expand Up @@ -409,10 +412,13 @@ SUBROUTINE prognostics_alloc(land_pts, t_i_length, t_j_length, &
! Only allocate the bedrock tsoil_deep_gb if bedrock is being used
IF ( l_bedrock ) THEN
ALLOCATE(progs_data%tsoil_deep_gb(land_pts,ns_deep))
progs_data%tsoil_deep_gb(:,:) = 0.0
ALLOCATE(progs_data%dtsd_acc_gb(land_pts,ns_deep))
ELSE
ALLOCATE(progs_data%tsoil_deep_gb(1,1))
ALLOCATE(progs_data%dtsd_acc_gb(1,1))
END IF
progs_data%dtsd_acc_gb(:,:) = 0.0
progs_data%tsoil_deep_gb(:,:) = 0.0
Comment on lines 414 to +421

! Prognostics for microbial methane scheme
ALLOCATE(progs_data%substr_ch4(land_pts,dim_ch4layer))
Expand Down Expand Up @@ -566,6 +572,7 @@ SUBROUTINE prognostics_dealloc(progs_data)
END IF

DEALLOCATE(progs_data%tsoil_deep_gb)
DEALLOCATE(progs_data%dtsd_acc_gb)

IF ( ALLOCATED(progs_data%t_home_gb) ) THEN
DEALLOCATE(progs_data%t_home_gb)
Expand Down Expand Up @@ -662,6 +669,7 @@ SUBROUTINE prognostics_assoc(progs,progs_data)
progs%frac_biocrop_prev_gb => progs_data%frac_biocrop_prev_gb
progs%triffid_co2_gb => progs_data%triffid_co2_gb
progs%tsoil_deep_gb => progs_data%tsoil_deep_gb
progs%dtsd_acc_gb => progs_data%dtsd_acc_gb
progs%lai_pft => progs_data%lai_pft
progs%canht_pft => progs_data%canht_pft
progs%smcl_soilt => progs_data%smcl_soilt
Expand Down Expand Up @@ -752,6 +760,7 @@ SUBROUTINE prognostics_nullify(progs)
NULLIFY(progs%frac_biocrop_prev_gb)
NULLIFY(progs%triffid_co2_gb)
NULLIFY(progs%tsoil_deep_gb)
NULLIFY(progs%dtsd_acc_gb)
NULLIFY(progs%lai_pft)
NULLIFY(progs%canht_pft)
NULLIFY(progs%smcl_soilt)
Expand Down
1 change: 1 addition & 0 deletions src/control/shared/surf_couple_extra_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,7 @@ SUBROUTINE surf_couple_extra( &
progs%canopy_surft, wtrac_jls%canopy_surft, &
progs%smcl_soilt, psparms%sthf_soilt, &
psparms%sthu_soilt, crop_vars%sthu_irr_soilt, progs%tsoil_deep_gb, &
progs%dtsd_acc_gb, &
progs%t_soil_soilt, progs%t_soil_soilt_acc, progs%tsurf_elev_surft, &
wtrac_jls%smcl_soilt, wtrac_jls%sthf_soilt, wtrac_jls%sthu_soilt, &
fsat_soilt, fwetl_soilt, sthzw_soilt, zw_soilt, wtrac_jls%sthzw_soilt, &
Expand Down
12 changes: 9 additions & 3 deletions src/initialisation/standalone/init_soil.F90
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ SUBROUTINE init_soil(nml_dir)
USE jules_soil_mod, ONLY: jules_soil, sm_levels, dzsoil, dzsoil_elev, &
l_vg_soil, l_soil_sat_down, soilhc_method, &
l_bedrock, l_tile_soil, l_broadcast_ancils, &
check_jules_soil
check_jules_soil, ns_deep

USE jules_surface_mod, ONLY: l_elev_land_ice

USE logging_mod, ONLY: log_info, log_fatal
USE logging_mod, ONLY: log_info, log_fatal, log_warn

USE errormessagelength_mod, ONLY: errormessagelength

Expand Down Expand Up @@ -111,9 +111,15 @@ SUBROUTINE init_soil(nml_dir)
"soilHc_method = 3 - Chadburn et al. (2015)")
END IF

IF ( l_bedrock ) &
IF ( l_bedrock ) THEN
CALL log_info("init_soil", "Bedrock will be included at base of soil")

IF ( ns_deep == 1) THEN
CALL log_warn("init_soil", "Bedrock will be modelled as a single layer")
CALL log_warn("init_soil", "There is no geothermal heat flux applied")
END IF
END IF

IF ( l_tile_soil ) THEN
CALL log_info("init_soil", &
"l_tile_soil = T. Soil tiling is switched on: nsoilt = nsurft")
Expand Down
Loading