Tip
Need help? Please let us know in the SUEWS Community.
Please report issues with the manual on GitHub Issues (or use Report Issue for This Page for page-specific feedback).
Please cite SUEWS with proper information from our Zenodo page.
Note
Go to the end to download the full example code.
3.6. External Model Coupling#
Coupling SUEWS with external models for anthropogenic heat flux.
This example demonstrates how SUEWS can be coupled to external models that provide forcing data. We use a simple anthropogenic heat flux (\(Q_F\)) model driven by outdoor air temperature to show the coupling approach.
Key concepts:
Anthropogenic heat flux depends on outdoor temperature
SUEWS can receive external \(Q_F\) as forcing input
One-way coupling: external model provides forcing to SUEWS
Temperature feedback affects urban energy balance
API approach: This tutorial uses the SUEWSSimulation OOP interface but
extracts DataFrames for forcing modification. This hybrid pattern is required
for external model coupling where forcing variables must be modified at runtime.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from supy import SUEWSSimulation
3.6.1. Simple Anthropogenic Heat Model#
We define a simple \(Q_F\) model based on building heating and cooling:
Heating activates when T < 10 \(^{\circ}C\)
Cooling activates when T > 20 \(^{\circ}C\)
Between 10-20 \(^{\circ}C\): baseline \(Q_F\) = 0
This simplified model captures the temperature-dependent nature of building energy use without requiring detailed building simulation.
def QF_simple(T2):
"""Calculate anthropogenic heat flux from air temperature.
Parameters
----------
T2 : float
2-metre air temperature (:math:`^{\circ}C`)
Returns
-------
float
Anthropogenic heat flux (W m\ :sup:`-2`)
"""
T_cool = 20 # Cooling threshold (degC)
T_heat = 10 # Heating threshold (degC)
C_B = 5 # Cooling rate (W m^-2 K^-1)
H_B = 10 # Heating rate (W m^-2 K^-1)
scale = 0.3 # Scaling factor
if T2 > T_cool: # noqa: SIM300
qf = (T2 - T_cool) * C_B
elif T2 < T_heat: # noqa: SIM300
qf = (T_heat - T2) * H_B
else:
qf = 0
return qf * scale
/home/runner/work/SUEWS/SUEWS/docs/source/tutorials/tutorial_06_external_coupling.py:49: SyntaxWarning: invalid escape sequence '\c'
2-metre air temperature (:math:`^{\circ}C`)
3.6.2. Visualise the \(Q_F\) Model#
Plot the \(Q_F\) response to temperature to understand the model behaviour.
temp_range = np.arange(-5, 45, 0.5)
qf_values = [QF_simple(t) for t in temp_range]
# Create DataFrames for plotting by region
df_qf = pd.DataFrame({"Temperature": temp_range, "QF": qf_values})
fig, ax = plt.subplots(figsize=(8, 5))
# Heating region (T < 10 degC)
mask_heat = temp_range < 10
ax.plot(temp_range[mask_heat], np.array(qf_values)[mask_heat], "C1-", label="Heating", linewidth=2)
# Neutral region (10 <= T <= 20 degC)
mask_neutral = (temp_range >= 10) & (temp_range <= 20)
ax.plot(
temp_range[mask_neutral], np.array(qf_values)[mask_neutral], "C2-", label="Baseline", linewidth=2
)
# Cooling region (T > 20 degC)
mask_cool = temp_range > 20
ax.plot(temp_range[mask_cool], np.array(qf_values)[mask_cool], "C0-", label="Cooling", linewidth=2)
# Annotations
ax.axvline(10, color="grey", linestyle="--", alpha=0.5)
ax.axvline(20, color="grey", linestyle="--", alpha=0.5)
ax.annotate("$T_H$ = 10$^{\\circ}$C", xy=(10, 5), fontsize=10)
ax.annotate("$T_C$ = 20$^{\\circ}$C", xy=(20, 5), fontsize=10)
ax.set_xlabel("Air Temperature ($^\\circ$C)")
ax.set_ylabel("$Q_F$ (W m$^{-2}$)")
ax.set_title("Simple Anthropogenic Heat Flux Model")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()

3.6.3. Load Sample Data#
Load the sample dataset and prepare for coupled simulation.
sim = SUEWSSimulation.from_sample_data()
df_state_init = sim.state_init.copy()
# Disable snow module (not needed for this site)
df_state_init.loc[:, "snowuse"] = 0
# Slice forcing by time (returns SUEWSForcing object)
# Use shorter period for faster tutorial execution
forcing_sliced = sim.forcing["2012-01":"2012-02"].iloc[1:]
Important
External coupling requires DataFrame extraction: When injecting
variables from external models (here: \(Q_F\)), you must extract the
DataFrame with .df, add the new column, then pass it to the
simulation. This is the expected pattern for model coupling.
# Get DataFrame for modification (adding external :math:`Q_F`)
df_forcing = forcing_sliced.df
print(f"Simulation period: {df_forcing.index[0]} to {df_forcing.index[-1]}")
print(f"Time steps: {len(df_forcing)}")
Simulation period: 2012-01-01 00:10:00 to 2012-02-29 23:55:00
Time steps: 17278
3.6.4. Calculate External \(Q_F\) from Forcing Data#
Apply the simple \(Q_F\) model to the air temperature from the forcing data. This is a one-way coupling: the external model uses prescribed temperatures.
# Calculate :math:`Q_F` for each timestep
qf_external = df_forcing["Tair"].apply(QF_simple)
# Create modified forcing with external :math:`Q_F`
df_forcing_with_qf = df_forcing.copy()
df_forcing_with_qf["qf"] = qf_external
# Configure SUEWS to use external :math:`Q_F`
df_state_qf = df_state_init.copy()
df_state_qf.loc[:, "emissionsmethod"] = 0 # Use prescribed Q_F
print("Q_F statistics:")
print(f" Mean: {qf_external.mean():.2f} W/m^2")
print(f" Max: {qf_external.max():.2f} W/m^2")
print(f" Min: {qf_external.min():.2f} W/m^2")
Q_F statistics:
Mean: 15.49 W/m^2
Max: 47.10 W/m^2
Min: 0.00 W/m^2
3.6.5. Run Baseline Simulation (\(Q_F\) = 0)#
First, run a simulation without anthropogenic heat for comparison.
df_forcing_baseline = df_forcing.copy()
df_forcing_baseline["qf"] = 0
df_state_baseline = df_state_init.copy()
df_state_baseline.loc[:, "emissionsmethod"] = 0
sim_baseline = SUEWSSimulation.from_state(df_state_baseline).update_forcing(df_forcing_baseline)
output_baseline = sim_baseline.run(logging_level=90)
grid = df_state_init.index[0]
df_suews_baseline = output_baseline.SUEWS.loc[grid]
print("Baseline simulation complete (Q_F = 0)")
/home/runner/work/SUEWS/SUEWS/.venv/lib/python3.13/site-packages/pydantic/main.py:250: UserWarning: Configuration uses schema 0.1, current is 2025.12 (compatible)
validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self)
/home/runner/work/SUEWS/SUEWS/.venv/lib/python3.13/site-packages/pydantic/main.py:464: UserWarning: Pydantic serializer warnings:
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.02, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.02, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_runoff', input_value=0.98, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_runoff', input_value=0.98, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_runoff', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_runoff', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='faibldg', input_value=0.11, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='faibldg', input_value=0.11, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='bldgh', input_value=22.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='bldgh', input_value=22.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_min', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_min', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_max', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_max', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='maxconductance', input_value=7.4, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='maxconductance', input_value=7.4, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='faievetree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='faievetree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='evetreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='evetreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_min', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_min', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_max', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_max', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='maxconductance', input_value=11.7, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='maxconductance', input_value=11.7, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='faidectree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='faidectree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='dectreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='dectreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='pormin_dec', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='pormin_dec', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='pormax_dec', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='pormax_dec', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='capmax_dec', input_value=0.8, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='capmax_dec', input_value=0.8, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='capmin_dec', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='capmin_dec', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_min', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_min', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_max', input_value=0.21, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_max', input_value=0.21, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='maxconductance', input_value=33.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='maxconductance', input_value=33.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='flowchange', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='flowchange', input_value=0.0, input_type=RefValue])
return self.__pydantic_serializer__.to_python(
Baseline simulation complete (Q_F = 0)
3.6.6. Run Simulation with External \(Q_F\)#
Now run with the temperature-dependent \(Q_F\) from our simple model.
sim_with_qf = SUEWSSimulation.from_state(df_state_qf).update_forcing(df_forcing_with_qf)
output_qf = sim_with_qf.run(logging_level=90)
df_suews_qf = output_qf.SUEWS.loc[grid]
print("Coupled simulation complete (with external Q_F)")
/home/runner/work/SUEWS/SUEWS/.venv/lib/python3.13/site-packages/pydantic/main.py:250: UserWarning: Configuration uses schema 0.1, current is 2025.12 (compatible)
validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self)
/home/runner/work/SUEWS/SUEWS/.venv/lib/python3.13/site-packages/pydantic/main.py:464: UserWarning: Pydantic serializer warnings:
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.02, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.02, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_runoff', input_value=0.98, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_runoff', input_value=0.98, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_runoff', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_runoff', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='faibldg', input_value=0.11, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='faibldg', input_value=0.11, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='bldgh', input_value=22.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='bldgh', input_value=22.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_min', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_min', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_max', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_max', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='maxconductance', input_value=7.4, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='maxconductance', input_value=7.4, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='faievetree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='faievetree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='evetreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='evetreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_min', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_min', input_value=0.12, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_max', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_max', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='maxconductance', input_value=11.7, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='maxconductance', input_value=11.7, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='faidectree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='faidectree', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='dectreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='dectreeh', input_value=13.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='pormin_dec', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='pormin_dec', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='pormax_dec', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='pormax_dec', input_value=0.9, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='capmax_dec', input_value=0.8, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='capmax_dec', input_value=0.8, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='capmin_dec', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='capmin_dec', input_value=0.3, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bsoil', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_min', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_min', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb_max', input_value=0.21, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb_max', input_value=0.21, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_bioco2', input_value=8.747, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='beta_enh_bioco2', input_value=33.353, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_bioco2', input_value=0.004, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alpha_enh_bioco2', input_value=0.016, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_a', input_value=2.43, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='resp_b', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='theta_bioco2', input_value=0.96, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='maxconductance', input_value=33.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='maxconductance', input_value=33.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='min_res_bioco2', input_value=0.6, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_a', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='ie_m', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_paved', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_bldgs', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_dectr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_evetr', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_grass', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_water', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='to_soilstore', input_value=1.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.18, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='alb', input_value=0.1, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `RefValue[float]` - serialized value may not be as expected [field_name='flowchange', input_value=0.0, input_type=RefValue])
PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [field_name='flowchange', input_value=0.0, input_type=RefValue])
return self.__pydantic_serializer__.to_python(
Coupled simulation complete (with external Q_F)
3.6.7. Compare \(Q_F\) Values#
Compare the prescribed \(Q_F\) with the baseline (zero) case.
fig, axes = plt.subplots(2, 1, figsize=(10, 6), sharex=True)
# Plot Q_F time series
df_suews_qf["QF"].resample("1h").mean().plot(ax=axes[0], label="With external $Q_F$")
df_suews_baseline["QF"].resample("1h").mean().plot(ax=axes[0], label="Baseline ($Q_F$=0)")
axes[0].set_ylabel("$Q_F$ (W m$^{-2}$)")
axes[0].set_title("Anthropogenic Heat Flux")
axes[0].legend()
# Plot difference
diff_qf = (df_suews_qf["QF"] - df_suews_baseline["QF"]).resample("1h").mean()
diff_qf.plot(ax=axes[1], color="C2")
axes[1].set_ylabel("$\\Delta Q_F$ (W m$^{-2}$)")
axes[1].set_xlabel("Date")
axes[1].set_title("$Q_F$ Difference (Coupled - Baseline)")
axes[1].axhline(0, color="grey", linestyle="--", alpha=0.5)
plt.tight_layout()

3.6.8. Temperature Feedback#
Examine how the external \(Q_F\) affects the simulated 2-metre temperature.
fig, axes = plt.subplots(2, 1, figsize=(10, 6), sharex=True)
# Plot T2 time series
df_suews_qf["T2"].resample("1h").mean().plot(ax=axes[0], label="With external $Q_F$")
df_suews_baseline["T2"].resample("1h").mean().plot(ax=axes[0], label="Baseline")
axes[0].set_ylabel("$T_2$ ($^\\circ$C)")
axes[0].set_title("2-Metre Air Temperature")
axes[0].legend()
# Plot temperature difference
diff_t2 = (df_suews_qf["T2"] - df_suews_baseline["T2"]).resample("1h").mean()
diff_t2.plot(ax=axes[1], color="C3")
axes[1].set_ylabel("$\\Delta T_2$ ($^\\circ$C)")
axes[1].set_xlabel("Date")
axes[1].set_title("Temperature Difference (Coupled - Baseline)")
axes[1].axhline(0, color="grey", linestyle="--", alpha=0.5)
plt.tight_layout()

3.6.9. \(Q_F\) vs Temperature Response#
Analyse the relationship between \(Q_F\) change and temperature change.
# Daily statistics
df_daily_qf = df_suews_qf.resample("1D").mean()
df_daily_baseline = df_suews_baseline.resample("1D").mean()
diff_qf_daily = df_daily_qf["QF"] - df_daily_baseline["QF"]
diff_t2_daily = df_daily_qf["T2"] - df_daily_baseline["T2"]
fig, ax = plt.subplots(figsize=(6, 5))
ax.scatter(diff_qf_daily, diff_t2_daily, alpha=0.7, s=30)
ax.set_xlabel("$\\Delta Q_F$ (W m$^{-2}$)")
ax.set_ylabel("$\\Delta T_2$ ($^\\circ$C)")
ax.set_title("$Q_F$ - Temperature Feedback (Daily Means)")
# Add trend line
if len(diff_qf_daily.dropna()) > 2:
z = np.polyfit(diff_qf_daily.dropna(), diff_t2_daily.dropna(), 1)
p = np.poly1d(z)
x_line = np.linspace(diff_qf_daily.min(), diff_qf_daily.max(), 100)
ax.plot(x_line, p(x_line), "r--", alpha=0.7, label=f"Slope: {z[0]:.3f} $^{{\\circ}}$C/(W/m$^2$)")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()

3.6.10. Summary#
This example demonstrated one-way coupling between SUEWS and an external anthropogenic heat flux model:
Simple \(Q_F\) model: Temperature-dependent heating/cooling emissions
One-way coupling: External \(Q_F\) prescribed from air temperature
Temperature feedback: \(Q_F\) affects simulated air temperature
Key findings:
Anthropogenic heat adds energy to the urban surface
Higher \(Q_F\) leads to elevated air temperatures
The feedback magnitude depends on atmospheric conditions
Extensions:
Two-way coupling: SUEWS T2 drives external model, which provides \(Q_F\)
Building energy models for detailed \(Q_F\) estimation
Traffic and metabolic heat contributions
Note
For tight two-way coupling (timestep-by-timestep interaction), low-level SUEWS functions are required. See the source notebook for implementation details.
Total running time of the script: (0 minutes 21.984 seconds)