Hydraulic Network Sizing
A physics-based approach for automated mass flow calculation and pipe sizing in district heating networks.
Quick Start
import uesgraphs as ug
import uesgraphs.systemmodels.utilities as sysm_ut
# 1. Load your network
graph = ug.UESGraph()
graph.from_json("network.json", network_type="heating")
# 2. Set demand data and temperature differences
for node in graph.nodelist_building:
if not graph.nodes[node].get("is_supply_heating", False):
graph.nodes[node]["input_heat"] = 15000 # W (example: 15 kW peak load)
graph.nodes[node]["dT_Network"] = 30.0 # K
# 3. Size the network
sized_graph = sysm_ut.size_hydronic_network(
graph=graph,
catalog="isoplus",
load_scenario="peak_load"
)
# 4. Analyze results
for edge in sized_graph.edges:
data = sized_graph.edges[edge]
print(f"Pipe {edge}: {data['DN']}, {data['m_flow_peak_load']:.3f} kg/s")
Note
The function accepts both scalar values and time-series for input_heat:
Scalar:
graph.nodes[node]["input_heat"] = 15000(single peak load value)Time-series:
graph.nodes[node]["input_heat"] = [1000, 5000, 15000, ...](automatically extracts peak/average based onload_scenario)
Prerequisites
Your graph needs these node attributes:
input_heat: Thermal demand [W] at each consumer node
dT_Network: Temperature difference [K] between supply and return
is_supply_heating: Boolean flag to identify supply nodes
How it Works
1. Demand-Based Mass Flow Calculation
The system calculates mass flows starting at consumer nodes using the fundamental equation:
Where:
Q: Thermal load [W]
cp: Specific heat capacity (4184 J/kg·K for water)
ΔT: Temperature difference [K]
2. Flow Path Aggregation
Mass flows are aggregated backward through the network:
Identifies all supply-to-demand paths
Accumulates flows along each path
Applies maximum flow principle for robust sizing
3. Catalog-Based Pipe Selection
Matches calculated flows to real pipe diameters:
Uses manufacturer catalogs (e.g., Isoplus)
Selects next larger pipe if no exact match
Adds
DN(nominal diameter) anddiameter[m] attributes to edges
Core Functions
Mass Flow Calculation
# Calculate mass flows based on demand
graph = sysm_ut.estimate_m_flow_demand_based(
graph=graph,
network_type="heating",
demand_attribute="input_heat",
load_scenario="peak_load", # or "average_load"
dT_attribute="dT_Network"
)
Key features:
Scenario-based calculations (peak vs. average load)
Individual temperature differences per node
Robust path-based flow aggregation
Complete Hydraulic Sizing
# Full workflow: mass flows + pipe diameters
graph = sysm_ut.size_hydronic_network(
graph=graph,
catalog="isoplus",
dT_attribute="dT_Network",
network_type="heating",
load_scenario="peak_load"
)
Output Attributes
After sizing, edges contain:
m_flow_peak_load or m_flow_average_load: Mass flow [kg/s]
DN: Nominal diameter designation (e.g., “DN50”)
diameter: Inner pipe diameter [m]
Learn More
For detailed examples, see the comprehensive tutorial notebook: Examples (Example 14: Hydronic Sizing).
Advanced Features
Custom pipe catalogs: Add your own manufacturer data
Multiple scenarios: Compare peak vs. average sizing
Temperature flexibility: Different ΔT per building type
Visualization: Integrated diameter plotting with
uesgraphs.visuals
Note
This feature replaces the deprecated estimate_m_flow_nominal() function with a more accurate demand-based approach.