GABLS4 LES Intercomparison Study for Stable Boundary Layers: Description

[1]:
from IPython.display import display, Markdown
from datetime import datetime, timezone
display(Markdown(f"*Last run: {datetime.now(timezone.utc).strftime('%B %d, %Y at %H:%M UTC')}*"))

Last run: June 24, 2026 at 09:27 UTC

References

Couvreux, F., Bazile, E., Canut, G., Seity, Y., Köhler, M., Masson, V., Bouyssel, F., and Brun, E. (2020). Representation of the atmospheric boundary layer in the operational NWP model used at Météo-France for the GABLS4 benchmark. Boundary-Layer Meteorology, 177, 53–74.

Case Description

The GABLS4 Stage 3 case simulates an extremely stable nocturnal boundary layer at Dome C, Antarctica, during a 24-hour period in December 2009. The site sits at 3233 m elevation (surface pressure ≈ 651 hPa). Unlike GABLS1 and GABLS3, this case is dry (no moisture) and requires no large-scale advection forcing; only the time- and height-varying geostrophic wind and the prescribed surface temperature are needed.

Parameter

Value

Reference run

examples/SBL_GABLS4/runs/256x256x256_LASDD_SM_SP

Domain

1000 m × 1000 m × 1000 m

Reference grid

\(256^3\)

Run matrix

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

Simulation time

86 400 s (24 h)

Reference time step

0.1 s

Near-surface geostrophic wind (t=0)

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

Geostrophic forcing

time- and height-varying (optGeoWind = 1)

Coriolis parameter

\(f = -1.409 \times 10^{-4}\) s\(^{-1}\) (Dome C, 75.1°S, Southern Hemisphere)

Roughness lengths

\(z_{0m} = z_{0T} = 0.01\) m

Thermal surface option

optSurfBC = 2 (time-varying surface \(\Theta_s\))

Surface pressure

\(p_\mathrm{sfc} = 65 100\) Pa

Surface potential temperature (t=0)

\(\Theta_s \approx 273\) K

Reference temperature

\(T_0 = 271\) K

Inversion strength

\(\approx 0.0078\) K m\(^{-1}\)

SGS model

LASDD-SM (optSgs = 1)

Filter-to-grid ratio

FGR = 2

Damping layer

above \(z = 700\) m

Output statistics interval

600 s

3D output interval

SimTime

Advection forcing

none (optAdvection = 0)

Moisture

dry (optMoisture = 0)

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

Reference Configuration

[2]:
from pathlib import Path

def find_repo_root(start=None):
    path = Path(start or ('__file__' in globals() and __file__) or Path.cwd()).resolve()
    for candidate in (path, *path.parents):
        if (candidate / 'examples').is_dir() and (candidate / 'docs').is_dir():
            return candidate
    raise FileNotFoundError('Could not locate jaxalfa repository root')

BaseDir = find_repo_root()
RunDir  = BaseDir / 'examples/SBL_GABLS4/runs/128x128x128_LASDD_SM_SP'

print((RunDir / 'Config.py').read_text())
# 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-06-14
:Description: GABLS4 stable BL at Dome C, Antarctica (Stage 3).
              Domain 1000x1000x1000 m; 24-hour simulation.
              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 = 1000
l_y = 1000
l_z = 1000

# 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 = 24 * 3600   # 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 = 1e-3
z0T = 1e-4

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

# 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

# Near-surface geostrophic wind at t=0 (m/s); fallback when optGeoWind=0
Ug2 = 1.25
Vg2 = 4.5

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

# Coriolis parameter (1/s); negative for Southern Hemisphere (Dome C, 75.1 deg S)
f_coriolis = -1.4012e-4

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

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

# Reference temperature (K)
T_0 = 270.0

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

# SGS model: 0 = Static SM, 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  = 700    # unit: m
RelaxTime  = 300     # unit: s

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

SampleInterval_sec   = 10.0   # collect a sample every N s
OutputInterval_sec   = 600.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 = 0
AdvectionFile = 'input/AdvForcing.npz'

# ------------------------------------------------------------
# Moisture configuration
# ------------------------------------------------------------
# 0: dry run, 1: prognostic specific humidity Q
optMoisture = 0
# Screen-level moisture reference height (m); 0 = use z0T
zMoisture = 0.0
# 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 = 0
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