GABLS3 LES Intercomparison Study for Stable Boundary Layers: Description

Last updated: May 2026

References

Basu, S., Holtslag, A. A. M., and Bosveld, F. C. (2011). GABLS3 LES intercomparison study. In ECMWF/GABLS workshop on “Diurnal cycles and the stable atmospheric boundary layer”, ECMWF (pp. 75-82).

Holtslag, A. A. M., Svensson, G., Baas, P., Basu, S., Beare, B., Beljaars, A. C. M., Bosveld, F. C., Cuxart, J., Lindvall, J., Steeneveld, G.-J., Tjernström, M., and van De Wiel, B. J. (2013). Stable atmospheric boundary layers and diurnal cycles: challenges for weather and climate models. Bulletin of the American Meteorological Society, 94, 1691-1706.

Case Description

The GABLS3 case simulates the nocturnal stable boundary layer over Cabauw, Netherlands, during 00-09 UTC on 2 July 2006. Unlike GABLS1, it includes time- and height-varying geostrophic wind forcings and large-scale advection.

Parameter

Value

Reference run

examples/SBL_GABLS3/runs/128x128x128_LASDD_SM_SP

Domain

800 m x 800 m x 800 m

Reference grid

\(128^3\)

Run matrix

\(64^3\), \(128^3\), \(256^3\), \(384^3\) x LASDD-SM, LASDD-WL, LAD-SM, LAD-WL x SP, DP

Simulation time

32400 s (9 h)

Reference time step

0.1 s

Geostrophic wind

\(U_g = -6.5\) m s\(^{-1}\), \(V_g = 4.5\) m s\(^{-1}\)

Coriolis parameter

\(f = 1.149 \times 10^{-4}\) s\(^{-1}\)

Roughness lengths

\(z_{0m} = 0.15\) m, \(z_{0T} = 0.15\) m

Thermal surface option

optSurfBC = 2

Sensible heat flux

0 K m s\(^{-1}\)

Reference temperature

\(T_0 = 290\) K

Inversion strength

0.0029 K m\(^{-1}\)

SGS model

LASDD-SM (optSgs = 1)

Filter-to-grid ratio

FGR = 2

Damping layer

above \(z = 550\) m

Output statistics interval

300 s

3D output interval

SimTime s

Geostrophic forcing option

optGeoWind = 1

Advection forcing option

optAdvection = 1

Moisture option

optMoisture = 1

Surface boundary condition

Time-varying temperature and moisture

Reference averaging window

case-dependent time-height diagnostics

The representative configuration below is copied from examples/SBL_GABLS3/runs/128x128x128_LASDD_SM_SP/Config.py.

Reference Configuration

[ ]:
# Copyright (C) 2025 Sukanta Basu
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

"""
File: Config.py
===============

:Author: Sukanta Basu
:AI Assistance: Claude.AI (Anthropic) is used for documentation,
                code restructuring, and performance optimization
:Date: 2026-05-20
:Description: GABLS3 stable BL after Bosveld et al. (2020).
              Cabauw, Netherlands; 00-09 UTC 2 July 2006.
              Domain 800x800x800 m; moisture-active.
              Grid: 128x128x128, SGS: LASDD-SM,
              Precision: single.
"""


# ============================================================
# Imports
# ============================================================

import numpy as np


# ============================================================
# User Input
# ============================================================

# ------------------------------------------------------------
# Platform options
# ------------------------------------------------------------
use_double_precision = False
# 0: use CPU, 1: use GPU
optGPU = 1
GPU_ID = 0

# ------------------------------------------------------------
# Domain configuration
# ------------------------------------------------------------

# Domain size (m)
l_x = 800
l_y = 800
l_z = 800

# Number of grid points
nx = 128
ny = 128
nz = 128

# ------------------------------------------------------------
# Time integration configuration
# ------------------------------------------------------------

# Change this if it is a restart run
istep = 1

# Time stepping and simulation time
dt = 0.1          # unit: sec
SimTime = 32400   # unit: sec

# Galilean transformation (m/s)
Ugal = 0

# ------------------------------------------------------------
# Surface configuration
# ------------------------------------------------------------

# optSurfFlux: 0 = homogeneous, 1 = heterogeneous
optSurfFlux = 0

# optSurfBC: 0 = constant flux
#            1 = time-varying flux (from SurfaceBCFile)
#            2 = time-varying surface temperature (from SurfaceBCFile)
optSurfBC = 2

# Roughness lengths (m)
z0m = 0.15
z0T = 0.15

# Screen-level temperature reference height (m); 0 = use z0T
zTemperature = 0.25

# SensibleHeatFlux: not used when optSurfBC >= 1; set to 0 as placeholder
SensibleHeatFlux = 0.0  # K m/s

# Path to surface BC file (relative to run directory)
SurfaceBCFile = 'input/SurfaceBC.npz'

# ------------------------------------------------------------
# Forcing configuration
# ------------------------------------------------------------

# Geostrophic wind option:
#   0 = constant Ug2, Vg2 from Config
#   1 = time + height varying, loaded from GeoWindFile
optGeoWind = 1

# Constant geostrophic wind (m/s)
Ug2 = -6.5
Vg2 = 4.5

# Path to geostrophic wind file (relative to run directory)
GeoWindFile = 'input/GeoWind.npz'

# Coriolis parameter (1/s)
f_coriolis = 0.0001149

# Potential temperature lapse rate above domain top (K/m)
inversion = 0.0029

# Buoyancy calculation: 0 = use reference T_0, 1 = use local THv
optBuoyancy = 1

# Reference temperature (K)
T_0 = 290.0

# ------------------------------------------------------------
# Subgrid-scale configuration
# ------------------------------------------------------------

# SGS model: 1 = LASDD-SM, 2 = LASDD-WL, 3 = LAD-SM, 4 = LAD-WL
optSgs = 1

# Dynamic SGS update frequency (every N steps)
dynamicSGS_call_time = 1

# Filter to grid ratio (FGR=1: implicit + dealiasing; FGR>=2: explicit)
FGR = 2

# Initial SGS coefficients (used before first dynamic update)
Cs2 = 0.1 ** 2        # SM models: initial Cs^2
Cwl = 0.1 ** 2        # WL models: initial C_WL
Cs2PrRatio = Cs2 / 1.0
CwlPrRatio = Cwl / 1.0

# ------------------------------------------------------------
# Damping layer configuration
# ------------------------------------------------------------

optDamping = 1       # 1: activate Rayleigh damping
z_damping  = 550    # unit: m
RelaxTime  = 600    # unit: s

# ------------------------------------------------------------
# Statistics computation
# ------------------------------------------------------------

SampleInterval_sec   = 10.0   # collect a sample every N s
OutputInterval_sec   = 300.0   # output averaged stats every N s
Output3DInterval_sec = SimTime   # output 3D fields only at the end of the run

# ------------------------------------------------------------
# Large-scale advection forcing
# ------------------------------------------------------------
# 0: none, 1: time/height-varying (from AdvectionFile)
optAdvection = 1
AdvectionFile = 'input/AdvForcing.npz'

# ------------------------------------------------------------
# Moisture configuration
# ------------------------------------------------------------
# 0: dry run, 1: prognostic specific humidity Q
optMoisture = 1
# Screen-level moisture reference height (m); 0 = use z0T
zMoisture = 0.25
# Surface moisture flux (kg/kg m/s); used when optMoistureSurfBC = 0
MoistureFlux = 0.0
# 0: constant flux, 1: time-varying flux, 2: time-varying surface Q
optMoistureSurfBC = 2
MoistureSurfaceBCFile = 'input/MoistureSurfaceBC.npz'
# Specific humidity lapse rate above domain top (kg/kg/m); 0 = zero gradient
q_inversion = 0.0

# Pressure solver: 0 = LU (original), 1 = Thomas (tridiagonal, faster)
optPressureSolver = 1