GOTM Runtime

Runtime containers and the compiled timestep loop. The Python/Numba boundary is crossed exactly once per simulation run by calling the compiled time_loop_*_compiled() function.

Runtime Containers

Runtime state arrays for the compiled single-column GOTM runner.

class pygotm.gotm.runtime_state.RuntimeState(nlev, ga, z, zi, h, ho, u, uo, v, vo, w, T, S, Tp, Sp, Ti, Tobs, Sobs, NN, NNT, NNS, SS, SSU, SSV, SSCSTK, SSSTK, buoy, alpha, beta, rho_p, rho, rad, xP, avh, fric, drag, bioshade, tke, tkeo, eps, omega, L, kb, epsb, P, B, Pb, Px, PSTK, num, nuh, nus, nucl, gamu, gamv, gamb, gamh, gams, cmue1, cmue2, cmue3, sq_var, sl_var, gam, as_, an, at, av, aw, SPF, r, Rig, xRf, uu, vv, ww, z0b, z0s, za, u_taub, u_taubo, u_taus, taub, tx, ty, Hice, Hsnow, Hfrazil, T1, T2, Tice_surface, fdd, ice_cover, Tf, albedo_ice, transmissivity, ocean_ice_flux, ocean_ice_heat_flux, ocean_ice_salt_flux, surface_ice_energy, bottom_ice_energy, melt_rate, T_melt, S_melt)[source]

Bases: object

Flat 1D state arrays owned by the compiled single-column runtime.

Parameters:
nlev: int
ga: ndarray[tuple[Any, ...], dtype[float64]]
z: ndarray[tuple[Any, ...], dtype[float64]]
zi: ndarray[tuple[Any, ...], dtype[float64]]
h: ndarray[tuple[Any, ...], dtype[float64]]
ho: ndarray[tuple[Any, ...], dtype[float64]]
u: ndarray[tuple[Any, ...], dtype[float64]]
uo: ndarray[tuple[Any, ...], dtype[float64]]
v: ndarray[tuple[Any, ...], dtype[float64]]
vo: ndarray[tuple[Any, ...], dtype[float64]]
w: ndarray[tuple[Any, ...], dtype[float64]]
T: ndarray[tuple[Any, ...], dtype[float64]]
S: ndarray[tuple[Any, ...], dtype[float64]]
Tp: ndarray[tuple[Any, ...], dtype[float64]]
Sp: ndarray[tuple[Any, ...], dtype[float64]]
Ti: ndarray[tuple[Any, ...], dtype[float64]]
Tobs: ndarray[tuple[Any, ...], dtype[float64]]
Sobs: ndarray[tuple[Any, ...], dtype[float64]]
NN: ndarray[tuple[Any, ...], dtype[float64]]
NNT: ndarray[tuple[Any, ...], dtype[float64]]
NNS: ndarray[tuple[Any, ...], dtype[float64]]
SS: ndarray[tuple[Any, ...], dtype[float64]]
SSU: ndarray[tuple[Any, ...], dtype[float64]]
SSV: ndarray[tuple[Any, ...], dtype[float64]]
SSCSTK: ndarray[tuple[Any, ...], dtype[float64]]
SSSTK: ndarray[tuple[Any, ...], dtype[float64]]
buoy: ndarray[tuple[Any, ...], dtype[float64]]
alpha: ndarray[tuple[Any, ...], dtype[float64]]
beta: ndarray[tuple[Any, ...], dtype[float64]]
rho_p: ndarray[tuple[Any, ...], dtype[float64]]
rho: ndarray[tuple[Any, ...], dtype[float64]]
rad: ndarray[tuple[Any, ...], dtype[float64]]
xP: ndarray[tuple[Any, ...], dtype[float64]]
avh: ndarray[tuple[Any, ...], dtype[float64]]
fric: ndarray[tuple[Any, ...], dtype[float64]]
drag: ndarray[tuple[Any, ...], dtype[float64]]
bioshade: ndarray[tuple[Any, ...], dtype[float64]]
tke: ndarray[tuple[Any, ...], dtype[float64]]
tkeo: ndarray[tuple[Any, ...], dtype[float64]]
eps: ndarray[tuple[Any, ...], dtype[float64]]
omega: ndarray[tuple[Any, ...], dtype[float64]]
L: ndarray[tuple[Any, ...], dtype[float64]]
kb: ndarray[tuple[Any, ...], dtype[float64]]
epsb: ndarray[tuple[Any, ...], dtype[float64]]
P: ndarray[tuple[Any, ...], dtype[float64]]
B: ndarray[tuple[Any, ...], dtype[float64]]
Pb: ndarray[tuple[Any, ...], dtype[float64]]
Px: ndarray[tuple[Any, ...], dtype[float64]]
PSTK: ndarray[tuple[Any, ...], dtype[float64]]
num: ndarray[tuple[Any, ...], dtype[float64]]
nuh: ndarray[tuple[Any, ...], dtype[float64]]
nus: ndarray[tuple[Any, ...], dtype[float64]]
nucl: ndarray[tuple[Any, ...], dtype[float64]]
gamu: ndarray[tuple[Any, ...], dtype[float64]]
gamv: ndarray[tuple[Any, ...], dtype[float64]]
gamb: ndarray[tuple[Any, ...], dtype[float64]]
gamh: ndarray[tuple[Any, ...], dtype[float64]]
gams: ndarray[tuple[Any, ...], dtype[float64]]
cmue1: ndarray[tuple[Any, ...], dtype[float64]]
cmue2: ndarray[tuple[Any, ...], dtype[float64]]
cmue3: ndarray[tuple[Any, ...], dtype[float64]]
sq_var: ndarray[tuple[Any, ...], dtype[float64]]
sl_var: ndarray[tuple[Any, ...], dtype[float64]]
gam: ndarray[tuple[Any, ...], dtype[float64]]
as_: ndarray[tuple[Any, ...], dtype[float64]]
an: ndarray[tuple[Any, ...], dtype[float64]]
at: ndarray[tuple[Any, ...], dtype[float64]]
av: ndarray[tuple[Any, ...], dtype[float64]]
aw: ndarray[tuple[Any, ...], dtype[float64]]
SPF: ndarray[tuple[Any, ...], dtype[float64]]
r: ndarray[tuple[Any, ...], dtype[float64]]
Rig: ndarray[tuple[Any, ...], dtype[float64]]
xRf: ndarray[tuple[Any, ...], dtype[float64]]
uu: ndarray[tuple[Any, ...], dtype[float64]]
vv: ndarray[tuple[Any, ...], dtype[float64]]
ww: ndarray[tuple[Any, ...], dtype[float64]]
z0b: ndarray[tuple[Any, ...], dtype[float64]]
z0s: ndarray[tuple[Any, ...], dtype[float64]]
za: ndarray[tuple[Any, ...], dtype[float64]]
u_taub: ndarray[tuple[Any, ...], dtype[float64]]
u_taubo: ndarray[tuple[Any, ...], dtype[float64]]
u_taus: ndarray[tuple[Any, ...], dtype[float64]]
taub: ndarray[tuple[Any, ...], dtype[float64]]
tx: ndarray[tuple[Any, ...], dtype[float64]]
ty: ndarray[tuple[Any, ...], dtype[float64]]
Hice: ndarray[tuple[Any, ...], dtype[float64]]
Hsnow: ndarray[tuple[Any, ...], dtype[float64]]
Hfrazil: ndarray[tuple[Any, ...], dtype[float64]]
T1: ndarray[tuple[Any, ...], dtype[float64]]
T2: ndarray[tuple[Any, ...], dtype[float64]]
Tice_surface: ndarray[tuple[Any, ...], dtype[float64]]
fdd: ndarray[tuple[Any, ...], dtype[float64]]
ice_cover: ndarray[tuple[Any, ...], dtype[float64]]
Tf: ndarray[tuple[Any, ...], dtype[float64]]
albedo_ice: ndarray[tuple[Any, ...], dtype[float64]]
transmissivity: ndarray[tuple[Any, ...], dtype[float64]]
ocean_ice_flux: ndarray[tuple[Any, ...], dtype[float64]]
ocean_ice_heat_flux: ndarray[tuple[Any, ...], dtype[float64]]
ocean_ice_salt_flux: ndarray[tuple[Any, ...], dtype[float64]]
surface_ice_energy: ndarray[tuple[Any, ...], dtype[float64]]
bottom_ice_energy: ndarray[tuple[Any, ...], dtype[float64]]
melt_rate: ndarray[tuple[Any, ...], dtype[float64]]
T_melt: ndarray[tuple[Any, ...], dtype[float64]]
S_melt: ndarray[tuple[Any, ...], dtype[float64]]
iter_profile_arrays()[source]

Yield every physical profile array in stable declaration order.

Return type:

Iterator[tuple[str, ndarray[tuple[Any, ...], dtype[float64]]]]

iter_scalar_arrays()[source]

Yield mutable scalar arrays in stable declaration order.

Return type:

Iterator[tuple[str, ndarray[tuple[Any, ...], dtype[float64]]]]

validate()[source]

Raise if any runtime profile violates compiled-runner assumptions.

Return type:

None

pygotm.gotm.runtime_state.allocate_runtime_state(nlev)[source]

Allocate zero-filled 1D state arrays with GOTM 0:nlev indexing.

Return type:

RuntimeState

Parameters:

nlev (int)

Scalar runtime parameters for compiled single-column GOTM integration.

class pygotm.gotm.runtime_params.RuntimeParams(nlev, nt, dt, cnpar, latitude, longitude, depth, gravity, rho0, cori, avmolu, avmolT, avmolS, cp, h0b, z0s_min, calc_bottom_stress, charnock, charnock_val, max_it_z0b, plume_active, int_press_type, plume_type, plume_slope_x, plume_slope_y, seagrass_active, seagrass_alpha, seagrass_grassind, seagrass_grassn, stokes_active, w_adv_active, w_adv_discr, s_adv, t_adv, sprof_input_active, tprof_input_active, uprof_input_active, vprof_input_active, zeta_input_active, grid_method, airsea_fluxes_method, airsea_hum_method, airsea_shortwave_method, airsea_shortwave_type, airsea_longwave_method, airsea_longwave_type, airsea_albedo_method, airsea_ssuv_method, airsea_sst_obs_method, airsea_shortwave_scale_factor, airsea_heat_scale_factor, airsea_const_albedo, ice_model, turb_method, tke_method, len_scale_method, my_b1, my_sq, my_sl, my_e1, my_e2, my_e3, my_ex, my_e6, my_length, stab_method, scnd_method, kb_method, epsb_method, iw_model, prandtl0_fix, mld_method, mld_diff_k, mld_ri_crit, kappa, cm0, cmsf, cde, k_min, eps_min, kb_min, epsb_min, tx, ty, dzetadx, dzetady, ext_press_mode, vel_relax_ramp, k_ubc, k_lbc, psi_ubc, psi_lbc, ubc_type, lbc_type, length_lim, sig_k, sig_w, cw, gen_alpha, gen_l, galp, cc1, ct1, ctt, a1, a2, a3, a5, at1, at2, at3, at5, cw1, cw2, cw3plus, cw3minus, cwx, cw4, ce1, ce2, ce3plus, ce3minus, cex, ce4, sig_e, sig_e0, sig_peps, iw_alpha, klimiw, rich_cr, numiw, nuhiw, numshear, light_A, light_g1, light_g2, density_method, rhob, alpha0, beta0, T0, S0)[source]

Bases: object

Scalar parameters extracted before crossing into Numba.

Parameters:
nlev: int
nt: int
dt: float
cnpar: float
latitude: float
longitude: float
depth: float
gravity: float
rho0: float
cori: float
avmolu: float
avmolT: float
avmolS: float
cp: float
h0b: float
z0s_min: float
calc_bottom_stress: int
charnock: int
charnock_val: float
max_it_z0b: int
plume_active: int
int_press_type: int
plume_type: int
plume_slope_x: float
plume_slope_y: float
seagrass_active: int
seagrass_alpha: float
seagrass_grassind: int
seagrass_grassn: int
stokes_active: int
w_adv_active: int
w_adv_discr: int
s_adv: int
t_adv: int
sprof_input_active: int
tprof_input_active: int
uprof_input_active: int
vprof_input_active: int
zeta_input_active: int
grid_method: int
airsea_fluxes_method: int
airsea_hum_method: int
airsea_shortwave_method: int
airsea_shortwave_type: int
airsea_longwave_method: int
airsea_longwave_type: int
airsea_albedo_method: int
airsea_ssuv_method: int
airsea_sst_obs_method: int
airsea_shortwave_scale_factor: float
airsea_heat_scale_factor: float
airsea_const_albedo: float
ice_model: int
turb_method: int
tke_method: int
len_scale_method: int
my_b1: float
my_sq: float
my_sl: float
my_e1: float
my_e2: float
my_e3: float
my_ex: float
my_e6: float
my_length: int
stab_method: int
scnd_method: int
kb_method: int
epsb_method: int
iw_model: int
prandtl0_fix: float
mld_method: int
mld_diff_k: float
mld_ri_crit: float
kappa: float
cm0: float
cmsf: float
cde: float
k_min: float
eps_min: float
kb_min: float
epsb_min: float
tx: float
ty: float
dzetadx: float
dzetady: float
ext_press_mode: int
vel_relax_ramp: float
k_ubc: int
k_lbc: int
psi_ubc: int
psi_lbc: int
ubc_type: int
lbc_type: int
length_lim: int
sig_k: float
sig_w: float
cw: float
gen_alpha: float
gen_l: float
galp: float
cc1: float
ct1: float
ctt: float
a1: float
a2: float
a3: float
a5: float
at1: float
at2: float
at3: float
at5: float
cw1: float
cw2: float
cw3plus: float
cw3minus: float
cwx: float
cw4: float
ce1: float
ce2: float
ce3plus: float
ce3minus: float
cex: float
ce4: float
sig_e: float
sig_e0: float
sig_peps: int
iw_alpha: float
klimiw: float
rich_cr: float
numiw: float
nuhiw: float
numshear: float
light_A: float
light_g1: float
light_g2: float
density_method: int
rhob: float
alpha0: float
beta0: float
T0: float
S0: float
pygotm.gotm.runtime_params.make_runtime_params(*, nlev, nt, dt, cnpar=1.0, latitude=0.0, longitude=0.0, depth=1.0, gravity=9.81, rho0=1027.0, cori=0.0, avmolu=1.3e-06, avmolT=1.4e-07, avmolS=1.1e-09, cp=3991.86795711963, h0b=0.05, z0s_min=0.02, calc_bottom_stress=0, charnock=0, charnock_val=1400.0, max_it_z0b=10, plume_active=0, int_press_type=0, plume_type=2, plume_slope_x=0.0, plume_slope_y=0.0, seagrass_active=0, seagrass_alpha=0.0, seagrass_grassind=0, seagrass_grassn=0, stokes_active=0, w_adv_active=0, w_adv_discr=4, s_adv=0, t_adv=0, sprof_input_active=0, tprof_input_active=0, uprof_input_active=0, vprof_input_active=0, zeta_input_active=0, grid_method=0, airsea_fluxes_method=0, airsea_hum_method=1, airsea_shortwave_method=1, airsea_shortwave_type=1, airsea_longwave_method=3, airsea_longwave_type=1, airsea_albedo_method=0, airsea_ssuv_method=1, airsea_sst_obs_method=0, airsea_shortwave_scale_factor=1.0, airsea_heat_scale_factor=1.0, airsea_const_albedo=0.0, ice_model=1, turb_method=0, tke_method=0, len_scale_method=0, my_b1=0.0, my_sq=0.2, my_sl=0.2, my_e1=1.8, my_e2=1.33, my_e3=1.8, my_ex=1.8, my_e6=4.0, my_length=1, stab_method=0, scnd_method=0, kb_method=0, epsb_method=0, iw_model=0, prandtl0_fix=0.74, mld_method=2, mld_diff_k=1e-05, mld_ri_crit=0.5, kappa=0.4, cm0=0.5477, cmsf=1.0, cde=0.0, k_min=1e-10, eps_min=1e-12, kb_min=1e-10, epsb_min=1e-12, tx=0.0, ty=0.0, dzetadx=0.0, dzetady=0.0, ext_press_mode=0, vel_relax_ramp=1000000000000000.0, k_ubc=1, k_lbc=1, psi_ubc=1, psi_lbc=1, ubc_type=1, lbc_type=1, length_lim=0, sig_k=1.0, sig_w=2.0, cw=100.0, gen_alpha=-2.0, gen_l=0.2, galp=0.27, cc1=0.0, ct1=0.0, ctt=0.0, a1=0.0, a2=0.0, a3=0.0, a5=0.0, at1=0.0, at2=0.0, at3=0.0, at5=0.0, cw1=0.555, cw2=0.833, cw3plus=0.5, cw3minus=0.0, cwx=0.555, cw4=0.15, ce1=1.44, ce2=1.92, ce3plus=1.5, ce3minus=0.0, cex=1.44, ce4=0.0, sig_e=1.3, sig_e0=1.3, sig_peps=0, iw_alpha=0.0, klimiw=1e-06, rich_cr=0.7, numiw=0.0001, nuhiw=1e-05, numshear=0.005, light_A=0.58, light_g1=0.35, light_g2=23.0, density_method=1, rhob=1027.0, alpha0=0.0, beta0=0.0, T0=10.0, S0=35.0)[source]

Build RuntimeParams with explicit GOTM-compatible defaults.

Return type:

RuntimeParams

Parameters:

Persistent work arrays for compiled single-column GOTM integration.

class pygotm.gotm.runtime_work.RuntimeWork(nlev, au, bu, cu, du, ru, qu, avh, q_sour, l_sour, sig_eff, adv_cu, idpdx, idpdy, dusdz, dvsdz, vel_relax_tau, vel_relax_tau_eff, s_relax_tau, t_relax_tau, uprof, vprof, q2l, seagrass_z, seagrass_exc, seagrass_vfric, seagrass_xx, seagrass_yy, seagrass_xxP, seagrass_excur, seagrass_grassfric)[source]

Bases: object

Reusable scratch arrays passed explicitly into compiled routines.

Parameters:
nlev: int
au: ndarray[tuple[Any, ...], dtype[float64]]
bu: ndarray[tuple[Any, ...], dtype[float64]]
cu: ndarray[tuple[Any, ...], dtype[float64]]
du: ndarray[tuple[Any, ...], dtype[float64]]
ru: ndarray[tuple[Any, ...], dtype[float64]]
qu: ndarray[tuple[Any, ...], dtype[float64]]
avh: ndarray[tuple[Any, ...], dtype[float64]]
q_sour: ndarray[tuple[Any, ...], dtype[float64]]
l_sour: ndarray[tuple[Any, ...], dtype[float64]]
sig_eff: ndarray[tuple[Any, ...], dtype[float64]]
adv_cu: ndarray[tuple[Any, ...], dtype[float64]]
idpdx: ndarray[tuple[Any, ...], dtype[float64]]
idpdy: ndarray[tuple[Any, ...], dtype[float64]]
dusdz: ndarray[tuple[Any, ...], dtype[float64]]
dvsdz: ndarray[tuple[Any, ...], dtype[float64]]
vel_relax_tau: ndarray[tuple[Any, ...], dtype[float64]]
vel_relax_tau_eff: ndarray[tuple[Any, ...], dtype[float64]]
s_relax_tau: ndarray[tuple[Any, ...], dtype[float64]]
t_relax_tau: ndarray[tuple[Any, ...], dtype[float64]]
uprof: ndarray[tuple[Any, ...], dtype[float64]]
vprof: ndarray[tuple[Any, ...], dtype[float64]]
q2l: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_z: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_exc: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_vfric: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_xx: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_yy: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_xxP: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_excur: ndarray[tuple[Any, ...], dtype[float64]]
seagrass_grassfric: ndarray[tuple[Any, ...], dtype[float64]]
iter_arrays()[source]

Yield every persistent work array.

Return type:

Iterator[tuple[str, ndarray[tuple[Any, ...], dtype[float64]]]]

validate()[source]

Raise if work arrays violate compiled-runner assumptions.

Return type:

None

pygotm.gotm.runtime_work.allocate_runtime_work(nlev)[source]

Allocate persistent work arrays once for a single-column run.

Return type:

RuntimeWork

Parameters:

nlev (int)

Dense output buffers for compiled single-column GOTM integration.

class pygotm.gotm.runtime_output.RuntimeOutput(enabled, output_every, force_final, nout, output_step, time, zeta, u_taus, u10, v10, airt, airp, hum, es, ea, qs, qa, rhoa, cloud, albedo, precip, evap, int_precip, int_evap, int_swr, int_heat, int_total, I_0, qh, qe, ql, heat, tx, ty, sst, sst_obs, sss, mld_surf, u_taub, taub, mld_bott, us0, vs0, ds, Ekin, Epot, Eturb, extra_scalars, fabm_scalars, rho_p, rho, u, v, T, S, Tp, Ti, Sp, Tobs, Sobs, u_obs, v_obs, idpdx, idpdy, tke, eps, num, nuh, h, xP, fric, drag, avh, bioshade, ga, uu, vv, ww, NN, NNT, NNS, buoy, SS, P, B, Pb, kb, epsb, L, PSTK, cmue1, cmue2, as_, an, at, gamu, gamv, gamh, gams, Rig, gamb, gam, r, taux, tauy, rad, us, vs, dusdz, dvsdz, nus, nucl, z, zi, extra_z_profiles, fabm_z_profiles, fabm_attrs)[source]

Bases: object

Preallocated dense output buffers filled inside the compiled loop.

Parameters:
enabled: bool
output_every: int
force_final: bool
nout: int
output_step: ndarray[tuple[Any, ...], dtype[int64]]
time: ndarray[tuple[Any, ...], dtype[float64]]
zeta: ndarray[tuple[Any, ...], dtype[float64]]
u_taus: ndarray[tuple[Any, ...], dtype[float64]]
u10: ndarray[tuple[Any, ...], dtype[float64]]
v10: ndarray[tuple[Any, ...], dtype[float64]]
airt: ndarray[tuple[Any, ...], dtype[float64]]
airp: ndarray[tuple[Any, ...], dtype[float64]]
hum: ndarray[tuple[Any, ...], dtype[float64]]
es: ndarray[tuple[Any, ...], dtype[float64]]
ea: ndarray[tuple[Any, ...], dtype[float64]]
qs: ndarray[tuple[Any, ...], dtype[float64]]
qa: ndarray[tuple[Any, ...], dtype[float64]]
rhoa: ndarray[tuple[Any, ...], dtype[float64]]
cloud: ndarray[tuple[Any, ...], dtype[float64]]
albedo: ndarray[tuple[Any, ...], dtype[float64]]
precip: ndarray[tuple[Any, ...], dtype[float64]]
evap: ndarray[tuple[Any, ...], dtype[float64]]
int_precip: ndarray[tuple[Any, ...], dtype[float64]]
int_evap: ndarray[tuple[Any, ...], dtype[float64]]
int_swr: ndarray[tuple[Any, ...], dtype[float64]]
int_heat: ndarray[tuple[Any, ...], dtype[float64]]
int_total: ndarray[tuple[Any, ...], dtype[float64]]
I_0: ndarray[tuple[Any, ...], dtype[float64]]
qh: ndarray[tuple[Any, ...], dtype[float64]]
qe: ndarray[tuple[Any, ...], dtype[float64]]
ql: ndarray[tuple[Any, ...], dtype[float64]]
heat: ndarray[tuple[Any, ...], dtype[float64]]
tx: ndarray[tuple[Any, ...], dtype[float64]]
ty: ndarray[tuple[Any, ...], dtype[float64]]
sst: ndarray[tuple[Any, ...], dtype[float64]]
sst_obs: ndarray[tuple[Any, ...], dtype[float64]]
sss: ndarray[tuple[Any, ...], dtype[float64]]
mld_surf: ndarray[tuple[Any, ...], dtype[float64]]
u_taub: ndarray[tuple[Any, ...], dtype[float64]]
taub: ndarray[tuple[Any, ...], dtype[float64]]
mld_bott: ndarray[tuple[Any, ...], dtype[float64]]
us0: ndarray[tuple[Any, ...], dtype[float64]]
vs0: ndarray[tuple[Any, ...], dtype[float64]]
ds: ndarray[tuple[Any, ...], dtype[float64]]
Ekin: ndarray[tuple[Any, ...], dtype[float64]]
Epot: ndarray[tuple[Any, ...], dtype[float64]]
Eturb: ndarray[tuple[Any, ...], dtype[float64]]
extra_scalars: dict[str, ndarray[tuple[Any, ...], dtype[float64]]]
fabm_scalars: dict[str, ndarray[tuple[Any, ...], dtype[float64]]]
rho_p: ndarray[tuple[Any, ...], dtype[float64]]
rho: ndarray[tuple[Any, ...], dtype[float64]]
u: ndarray[tuple[Any, ...], dtype[float64]]
v: ndarray[tuple[Any, ...], dtype[float64]]
T: ndarray[tuple[Any, ...], dtype[float64]]
S: ndarray[tuple[Any, ...], dtype[float64]]
Tp: ndarray[tuple[Any, ...], dtype[float64]]
Ti: ndarray[tuple[Any, ...], dtype[float64]]
Sp: ndarray[tuple[Any, ...], dtype[float64]]
Tobs: ndarray[tuple[Any, ...], dtype[float64]]
Sobs: ndarray[tuple[Any, ...], dtype[float64]]
u_obs: ndarray[tuple[Any, ...], dtype[float64]]
v_obs: ndarray[tuple[Any, ...], dtype[float64]]
idpdx: ndarray[tuple[Any, ...], dtype[float64]]
idpdy: ndarray[tuple[Any, ...], dtype[float64]]
tke: ndarray[tuple[Any, ...], dtype[float64]]
eps: ndarray[tuple[Any, ...], dtype[float64]]
num: ndarray[tuple[Any, ...], dtype[float64]]
nuh: ndarray[tuple[Any, ...], dtype[float64]]
h: ndarray[tuple[Any, ...], dtype[float64]]
xP: ndarray[tuple[Any, ...], dtype[float64]]
fric: ndarray[tuple[Any, ...], dtype[float64]]
drag: ndarray[tuple[Any, ...], dtype[float64]]
avh: ndarray[tuple[Any, ...], dtype[float64]]
bioshade: ndarray[tuple[Any, ...], dtype[float64]]
ga: ndarray[tuple[Any, ...], dtype[float64]]
uu: ndarray[tuple[Any, ...], dtype[float64]]
vv: ndarray[tuple[Any, ...], dtype[float64]]
ww: ndarray[tuple[Any, ...], dtype[float64]]
NN: ndarray[tuple[Any, ...], dtype[float64]]
NNT: ndarray[tuple[Any, ...], dtype[float64]]
NNS: ndarray[tuple[Any, ...], dtype[float64]]
buoy: ndarray[tuple[Any, ...], dtype[float64]]
SS: ndarray[tuple[Any, ...], dtype[float64]]
P: ndarray[tuple[Any, ...], dtype[float64]]
B: ndarray[tuple[Any, ...], dtype[float64]]
Pb: ndarray[tuple[Any, ...], dtype[float64]]
kb: ndarray[tuple[Any, ...], dtype[float64]]
epsb: ndarray[tuple[Any, ...], dtype[float64]]
L: ndarray[tuple[Any, ...], dtype[float64]]
PSTK: ndarray[tuple[Any, ...], dtype[float64]]
cmue1: ndarray[tuple[Any, ...], dtype[float64]]
cmue2: ndarray[tuple[Any, ...], dtype[float64]]
as_: ndarray[tuple[Any, ...], dtype[float64]]
an: ndarray[tuple[Any, ...], dtype[float64]]
at: ndarray[tuple[Any, ...], dtype[float64]]
gamu: ndarray[tuple[Any, ...], dtype[float64]]
gamv: ndarray[tuple[Any, ...], dtype[float64]]
gamh: ndarray[tuple[Any, ...], dtype[float64]]
gams: ndarray[tuple[Any, ...], dtype[float64]]
Rig: ndarray[tuple[Any, ...], dtype[float64]]
gamb: ndarray[tuple[Any, ...], dtype[float64]]
gam: ndarray[tuple[Any, ...], dtype[float64]]
r: ndarray[tuple[Any, ...], dtype[float64]]
taux: ndarray[tuple[Any, ...], dtype[float64]]
tauy: ndarray[tuple[Any, ...], dtype[float64]]
rad: ndarray[tuple[Any, ...], dtype[float64]]
us: ndarray[tuple[Any, ...], dtype[float64]]
vs: ndarray[tuple[Any, ...], dtype[float64]]
dusdz: ndarray[tuple[Any, ...], dtype[float64]]
dvsdz: ndarray[tuple[Any, ...], dtype[float64]]
nus: ndarray[tuple[Any, ...], dtype[float64]]
nucl: ndarray[tuple[Any, ...], dtype[float64]]
z: ndarray[tuple[Any, ...], dtype[float64]]
zi: ndarray[tuple[Any, ...], dtype[float64]]
extra_z_profiles: dict[str, ndarray[tuple[Any, ...], dtype[float64]]]
fabm_z_profiles: dict[str, ndarray[tuple[Any, ...], dtype[float64]]]
fabm_attrs: dict[str, dict[str, str]]
declare_fabm_output(name, nlev, *, z_profile, attrs=None, replace_extra=False)[source]

Allocate one dynamic FABM output buffer.

Return type:

None

Parameters:
validate(nlev)[source]

Raise if output buffers do not match the runtime grid.

Return type:

None

Parameters:

nlev (int)

pygotm.gotm.runtime_output.allocate_runtime_output(nlev, nt, *, enabled=True, output_every=1, force_final=True)[source]

Allocate dense output arrays for initial, periodic, and final states.

Return type:

RuntimeOutput

Parameters:

Preprocessed forcing arrays for compiled single-column GOTM integration.

class pygotm.gotm.runtime_forcing.RuntimeForcing(nlev, nt, yearday, time, secondsofday, zeta, dpdx, dpdy, h_press, tx, ty, heat, swr, airp, airt, hum, cloud, u10, v10, precip, longwave, sst_obs, sss_obs, w_adv, w_height, us0, vs0, ds, light_A, light_g1, light_g2, Tobs, Sobs, Tprof, Sprof, epsprof, uprof, vprof, dtdx, dtdy, dsdx, dsdy, us, vs, dusdz, dvsdz)[source]

Bases: object

Dense forcing and observation inputs prepared before Numba integration.

Parameters:
nlev: int
nt: int
yearday: ndarray[tuple[Any, ...], dtype[int64]]
time: ndarray[tuple[Any, ...], dtype[float64]]
secondsofday: ndarray[tuple[Any, ...], dtype[float64]]
zeta: ndarray[tuple[Any, ...], dtype[float64]]
dpdx: ndarray[tuple[Any, ...], dtype[float64]]
dpdy: ndarray[tuple[Any, ...], dtype[float64]]
h_press: ndarray[tuple[Any, ...], dtype[float64]]
tx: ndarray[tuple[Any, ...], dtype[float64]]
ty: ndarray[tuple[Any, ...], dtype[float64]]
heat: ndarray[tuple[Any, ...], dtype[float64]]
swr: ndarray[tuple[Any, ...], dtype[float64]]
airp: ndarray[tuple[Any, ...], dtype[float64]]
airt: ndarray[tuple[Any, ...], dtype[float64]]
hum: ndarray[tuple[Any, ...], dtype[float64]]
cloud: ndarray[tuple[Any, ...], dtype[float64]]
u10: ndarray[tuple[Any, ...], dtype[float64]]
v10: ndarray[tuple[Any, ...], dtype[float64]]
precip: ndarray[tuple[Any, ...], dtype[float64]]
longwave: ndarray[tuple[Any, ...], dtype[float64]]
sst_obs: ndarray[tuple[Any, ...], dtype[float64]]
sss_obs: ndarray[tuple[Any, ...], dtype[float64]]
w_adv: ndarray[tuple[Any, ...], dtype[float64]]
w_height: ndarray[tuple[Any, ...], dtype[float64]]
us0: ndarray[tuple[Any, ...], dtype[float64]]
vs0: ndarray[tuple[Any, ...], dtype[float64]]
ds: ndarray[tuple[Any, ...], dtype[float64]]
light_A: ndarray[tuple[Any, ...], dtype[float64]]
light_g1: ndarray[tuple[Any, ...], dtype[float64]]
light_g2: ndarray[tuple[Any, ...], dtype[float64]]
Tobs: ndarray[tuple[Any, ...], dtype[float64]]
Sobs: ndarray[tuple[Any, ...], dtype[float64]]
Tprof: ndarray[tuple[Any, ...], dtype[float64]]
Sprof: ndarray[tuple[Any, ...], dtype[float64]]
epsprof: ndarray[tuple[Any, ...], dtype[float64]]
uprof: ndarray[tuple[Any, ...], dtype[float64]]
vprof: ndarray[tuple[Any, ...], dtype[float64]]
dtdx: ndarray[tuple[Any, ...], dtype[float64]]
dtdy: ndarray[tuple[Any, ...], dtype[float64]]
dsdx: ndarray[tuple[Any, ...], dtype[float64]]
dsdy: ndarray[tuple[Any, ...], dtype[float64]]
us: ndarray[tuple[Any, ...], dtype[float64]]
vs: ndarray[tuple[Any, ...], dtype[float64]]
dusdz: ndarray[tuple[Any, ...], dtype[float64]]
dvsdz: ndarray[tuple[Any, ...], dtype[float64]]
iter_scalar_series()[source]

Yield scalar forcing series in stable declaration order.

Return type:

Iterator[tuple[str, ndarray[tuple[Any, ...], dtype[float64]]]]

iter_profile_series()[source]

Yield profile forcing series in stable declaration order.

Return type:

Iterator[tuple[str, ndarray[tuple[Any, ...], dtype[float64]]]]

validate()[source]

Raise if forcing arrays violate compiled-runner assumptions.

Return type:

None

pygotm.gotm.runtime_forcing.allocate_runtime_forcing(nlev, nt)[source]

Allocate dense runtime forcing arrays for steps 0:nt.

Return type:

RuntimeForcing

Parameters:

Output Coordinates

The RuntimeOutput buffers use two vertical coordinates in the returned xarray.Dataset:

  • z — cell-centre depth levels (shape nlev); used by scalar fields (\(\theta\), \(S\), \(k\), \(\varepsilon\), etc.)

  • zi — interface depth levels (shape nlev + 1); used by flux and diffusivity fields (\(\nu_t\), \(\kappa_t\), etc.)

Output scheduling (output_every, initial/final slots) is resolved before entering the compiled loop. runtime_output_to_dataset() maps the dense buffers to GOTM-compatible variable names and attaches latitude/longitude as scalar coordinates after the run completes.

Time Loop

Numba-compiled central timestep loop for single-column GOTM runs.

pygotm.gotm.time_loop.run_compiled_time_loop(params, state, work, forcing, output, step_offset=0, out_slot_base=0, write_ic=1, init_int_precip=0.0, init_int_evap=0.0, init_int_swr=0.0, init_int_heat=0.0, init_int_total=0.0, hydro_store=0, hydro_T=None, hydro_S=None, hydro_rho=None, hydro_h=None, hydro_nuh=None, hydro_rad=None, hydro_taub=None)[source]

Validate runtime containers and cross into the compiled unified loop.

step_offset is the global step index where this call starts — used to slice forcing arrays when running one chunk of a larger simulation. out_slot_base is the output-array slot offset for this call. Both default to 0 for full-run (non-chunked) execution.

Return type:

int

Parameters:
pygotm.gotm.time_loop.time_loop_compiled(nlev, nt, dt, cnpar, output_every, output_enabled, force_final_output, gravity, rho0, density_method, rhob, alpha0, beta0, T0, S0, avmolu, avmolT, avmolS, cp, cori, latitude, longitude, depth, h0b, z0s_min, charnock, charnock_val, calc_bottom_stress, max_it_z0b, plume_active, int_press_type, plume_type, plume_slope_x, plume_slope_y, seagrass_active, seagrass_alpha, seagrass_grassind, seagrass_grassn, w_adv_active, w_adv_discr, s_adv, t_adv, sprof_input_active, tprof_input_active, uprof_input_active, vprof_input_active, zeta_input_active, grid_method, ext_press_mode, vel_relax_ramp, airsea_fluxes_method, airsea_hum_method, airsea_shortwave_method, airsea_shortwave_type, airsea_longwave_method, airsea_longwave_type, airsea_albedo_method, airsea_ssuv_method, airsea_sst_obs_method, airsea_shortwave_scale_factor, airsea_heat_scale_factor, airsea_const_albedo, ice_model, light_A, light_g1, light_g2, len_scale_method, scnd_method, tke_method, turb_method, stab_method, prandtl0_fix, mld_method, mld_diff_k, mld_ri_crit, my_b1, my_sq, my_sl, my_e1, my_e2, my_e3, my_ex, my_e6, my_length, kappa, cm0, cmsf, cde, k_min, eps_min, kb_min, epsb_min, k_ubc, k_lbc, psi_ubc, psi_lbc, ubc_type, lbc_type, length_lim, sig_k, sig_w, sig_e, sig_e0, sig_peps, cw, gen_alpha, gen_l, galp, cc1, ct1, ctt, a1, a2, a3, a5, at1, at2, at3, at5, cw1, cw2, cw3plus, cw3minus, cwx, cw4, ce1, ce2, ce3plus, ce3minus, cex, ce4, iw_model, iw_alpha, klimiw, rich_cr, numiw, nuhiw, numshear, h, ho, u, uo, v, vo, w, T, S, Tp, Ti, Sp, Tobs, Sobs, NN, NNT, NNS, SS, SSU, SSV, SSCSTK, SSSTK, xP, fric, drag, avh, bioshade, ga, rad, buoy, alpha_density, beta_density, rho_p, rho, tke, tkeo, eps, omega, L, kb, epsb, P, B, Pb, Px, PSTK, num, nuh, nus, nucl, gamh, gams, cmue1, cmue2, cmue3, as_, an, at, av, aw, uu, vv, ww, sq_var, sl_var, z, zi, z0b, z0s, za, u_taub, u_taubo, u_taus, taub, tx, ty, Hice, Hsnow, Hfrazil, T1, T2, Tice_surface, fdd, ice_cover, Tf, albedo_ice, transmissivity, ocean_ice_flux, ocean_ice_heat_flux, ocean_ice_salt_flux, surface_ice_energy, bottom_ice_energy, melt_rate, T_melt, S_melt, au, bu, cu, du, ru, qu, work_avh, q_sour, l_sour, sig_eff, adv_cu, idpdx, idpdy, dusdz, dvsdz, relax_tau, relax_tau_eff, s_relax_tau, t_relax_tau, uprof, vprof, q2l, seagrass_z, seagrass_exc, seagrass_vfric, seagrass_xx, seagrass_yy, seagrass_xxP, seagrass_excur, seagrass_grassfric, stokes_active, forcing_yearday, forcing_secondsofday, forcing_dpdx, forcing_dpdy, forcing_h_press, forcing_tx, forcing_ty, forcing_heat, forcing_swr, forcing_airp, forcing_airt, forcing_hum, forcing_cloud, forcing_u10, forcing_v10, forcing_precip, forcing_longwave, forcing_sst_obs, forcing_sss_obs, forcing_Tobs, forcing_Sobs, forcing_Tprof, forcing_Sprof, forcing_uprof, forcing_vprof, forcing_dtdx, forcing_dtdy, forcing_dsdx, forcing_dsdy, forcing_w_adv, forcing_w_height, forcing_zeta, forcing_us0, forcing_vs0, forcing_ds, forcing_light_A, forcing_light_g1, forcing_light_g2, forcing_us, forcing_vs, forcing_dusdz, forcing_dvsdz, output_step, output_time, output_zeta, output_u_taus, output_u10, output_v10, output_airt, output_airp, output_hum, output_es, output_ea, output_qs, output_qa, output_rhoa, output_cloud, output_albedo, output_precip, output_evap, output_int_precip, output_int_evap, output_int_swr, output_int_heat, output_int_total, output_I_0, output_qh, output_qe, output_ql, output_heat, output_tx, output_ty, output_sst, output_sst_obs, output_sss, output_mld_surf, output_u_taub, output_taub, output_mld_bott, output_us0, output_vs0, output_ds, output_Ekin, output_Epot, output_Eturb, output_rho_p, output_rho, output_u, output_v, output_T, output_S, output_Tp, output_Ti, output_Sp, output_Tobs, output_Sobs, output_u_obs, output_v_obs, output_idpdx, output_idpdy, output_tke, output_eps, output_num, output_nuh, output_h, output_xP, output_fric, output_drag, output_avh, output_bioshade, output_ga, output_uu, output_vv, output_ww, output_NN, output_NNT, output_NNS, output_buoy, output_SS, output_P, output_B, output_Pb, output_kb, output_epsb, output_L, output_PSTK, output_cmue1, output_cmue2, output_as, output_an, output_at, output_gamu, output_gamv, output_gamh, output_gams, output_Rig, output_gamb, output_gam, output_r, output_taux, output_tauy, output_rad, output_us, output_vs, output_dusdz, output_dvsdz, output_nus, output_nucl, output_z, output_zi, output_Hfrazil, output_Hice, output_T1, output_T2, output_Tf, output_Tice_surface, output_bottom_ice_energy, output_ocean_ice_flux, output_ocean_ice_heat_flux, output_ocean_ice_salt_flux, output_surface_ice_energy, step_offset, out_slot_base, write_ic, init_int_precip, init_int_evap, init_int_swr, init_int_heat, init_int_total, hydro_store, hydro_T, hydro_S, hydro_rho, hydro_h, hydro_nuh, hydro_rad, hydro_taub)[source]

Run profile-forced cases through the compiled timestep loop.

Fortran-parity notes (seagrass validation case):

cmue1/cmue2 pre-population removed — an earlier version initialised cmue1/cmue2 across all levels before the step-0 NetCDF write by re-running the stability-function kernel (Munk-Anderson, Schumann-Gerz, or Constant) for turb_method == 2. This was incorrect: Fortran GOTM’s init_turbulence seeds only level 1 via the compute_cpsi3 probe; all other levels are zero in the reference NetCDF at t=0. Pre-populating overwrote those zeros with cm0_fix-derived values and broke parity for cmue1/cmue2. The block has been removed; the stability kernels run at the start of every proper timestep, which is correct.

kb passed to step_turbulence_first_order_single — previously the kb (buoyancy variance) array was passed as a tke placeholder in the first-order path. Because alpha_mnb reads kb to compute the at stability parameter, this produced a wrong at value whenever kb > kb_min. kb is now forwarded correctly as a read-only input.

Return type:

int

Parameters:
pygotm.gotm.time_loop.warmup_couette_step_routines(params, state, work)[source]

Directly call major Couette step routines once to populate signatures.

Return type:

None

Parameters:

Builder

Setup helpers for the compiled single-column GOTM runtime.

class pygotm.gotm.runtime_builder.RuntimeBundle(params, state, work, forcing, output, runner)[source]

Bases: object

All setup-time containers needed to invoke a compiled runtime.

Parameters:
params: RuntimeParams
state: RuntimeState
work: RuntimeWork
forcing: RuntimeForcing
output: RuntimeOutput
runner: TimeLoopRunner
run()[source]

Execute the selected compiled time-loop wrapper.

Return type:

int

class pygotm.gotm.runtime_builder.RuntimePhaseTimings(runtime_build_s=0.0, force_build_s=0.0, integration_s=0.0, compiled_integration_s=0.0, fabm_chunk_s=0.0, copy_back_s=0.0)[source]

Bases: object

Optional wall-clock timing accumulator for compiled runtime phases.

Parameters:
runtime_build_s: float
force_build_s: float
integration_s: float
compiled_integration_s: float
fabm_chunk_s: float
copy_back_s: float
class pygotm.gotm.runtime_builder.TimeLoopRunner(*args, **kwargs)[source]

Bases: Protocol

Callable wrapper that crosses into the compiled timestep loop.

exception pygotm.gotm.runtime_builder.UnsupportedConfigurationError[source]

Bases: RuntimeError

Raised when setup requests physics not yet supported by compiled loops.

pygotm.gotm.runtime_builder.build_runtime(params, *, output=True, output_every=1, force_final=True)[source]

Allocate containers and select the compiled loop for params.

Return type:

RuntimeBundle

Parameters:
pygotm.gotm.runtime_builder.build_runtime_forcing(nlev, nt)[source]

Allocate dense forcing arrays for a compiled runtime.

Return type:

RuntimeForcing

Parameters:
pygotm.gotm.runtime_builder.build_runtime_forcing_from_run(run, *, max_steps=None)[source]

Precompute observation and surface forcing arrays from an initialized run.

Return type:

RuntimeForcing

Parameters:
  • run (Any)

  • max_steps (int | None)

pygotm.gotm.runtime_builder.build_runtime_from_run(run, *, max_steps=None, output=False, timings=None)[source]

Copy an initialized GotmRun object graph into flat runtime containers.

Return type:

RuntimeBundle

Parameters:
pygotm.gotm.runtime_builder.build_runtime_output(nlev, nt, *, output=True, output_every=1, force_final=True)[source]

Allocate dense output buffers.

Return type:

RuntimeOutput

Parameters:
pygotm.gotm.runtime_builder.build_runtime_params(*, nlev, nt, dt, cnpar=1.0, latitude=0.0, longitude=0.0, depth=1.0, gravity=9.81, rho0=1027.0, cori=0.0, avmolu=1.3e-06, avmolT=1.4e-07, avmolS=1.1e-09, cp=3991.86795711963, h0b=0.05, z0s_min=0.02, calc_bottom_stress=0, charnock=0, charnock_val=1400.0, max_it_z0b=10, plume_active=0, int_press_type=0, plume_type=2, plume_slope_x=0.0, plume_slope_y=0.0, seagrass_active=0, seagrass_alpha=0.0, seagrass_grassind=0, seagrass_grassn=0, stokes_active=0, w_adv_active=0, w_adv_discr=4, s_adv=0, t_adv=0, sprof_input_active=0, tprof_input_active=0, uprof_input_active=0, vprof_input_active=0, zeta_input_active=0, grid_method=0, airsea_fluxes_method=0, airsea_hum_method=1, airsea_shortwave_method=1, airsea_shortwave_type=1, airsea_longwave_method=3, airsea_longwave_type=1, airsea_albedo_method=0, airsea_ssuv_method=1, airsea_sst_obs_method=0, airsea_shortwave_scale_factor=1.0, airsea_heat_scale_factor=1.0, airsea_const_albedo=0.0, ice_model=1, turb_method=0, tke_method=0, len_scale_method=0, my_b1=0.0, my_sq=0.2, my_sl=0.2, my_e1=1.8, my_e2=1.33, my_e3=1.8, my_ex=1.8, my_e6=4.0, my_length=1, stab_method=0, scnd_method=0, kb_method=0, epsb_method=0, iw_model=0, prandtl0_fix=0.74, mld_method=2, mld_diff_k=1e-05, mld_ri_crit=0.5, kappa=0.4, cm0=0.5477, cmsf=1.0, cde=0.0, k_min=1e-10, eps_min=1e-12, kb_min=1e-10, epsb_min=1e-12, tx=0.0, ty=0.0, dzetadx=0.0, dzetady=0.0, ext_press_mode=0, vel_relax_ramp=1000000000000000.0, k_ubc=1, k_lbc=1, psi_ubc=1, psi_lbc=1, ubc_type=1, lbc_type=1, length_lim=0, sig_k=1.0, sig_w=2.0, cw=100.0, gen_alpha=-2.0, gen_l=0.2, galp=0.27, cc1=0.0, ct1=0.0, ctt=0.0, a1=0.0, a2=0.0, a3=0.0, a5=0.0, at1=0.0, at2=0.0, at3=0.0, at5=0.0, cw1=0.555, cw2=0.833, cw3plus=0.5, cw3minus=0.0, cwx=0.555, cw4=0.15, ce1=1.44, ce2=1.92, ce3plus=1.5, ce3minus=0.0, cex=1.44, ce4=0.0, sig_e=1.3, sig_e0=1.3, sig_peps=0, iw_alpha=0.0, klimiw=1e-06, rich_cr=0.7, numiw=0.0001, nuhiw=1e-05, numshear=0.005, light_A=0.58, light_g1=0.35, light_g2=23.0, density_method=1, rhob=1027.0, alpha0=0.0, beta0=0.0, T0=10.0, S0=35.0)

Build RuntimeParams with explicit GOTM-compatible defaults.

Return type:

RuntimeParams

Parameters:
pygotm.gotm.runtime_builder.build_runtime_state(nlev)[source]

Allocate runtime state arrays.

Return type:

RuntimeState

Parameters:

nlev (int)

pygotm.gotm.runtime_builder.build_runtime_work(nlev)[source]

Allocate persistent runtime work arrays.

Return type:

RuntimeWork

Parameters:

nlev (int)

pygotm.gotm.runtime_builder.runtime_output_to_dataset(run, bundle, *, attrs=None)[source]

Convert dense compiled output buffers to an xarray dataset after a run.

Return type:

Dataset

Parameters:
pygotm.gotm.runtime_builder.select_time_loop(params)[source]

Return the compiled loop wrapper for the currently supported setup.

Return type:

TimeLoopRunner

Parameters:

params (RuntimeParams)