Design study: finned tubes or a packed bed?#

PyTES models share their outputs, parameters, experiments and energy reference across families (DESIGN D4), so different designs compare like for like. This notebook uses that to answer a practical question:

A heat battery for domestic hot water should store about 2.5 kWh between 10 °C and 70 °C and deliver 3 kW until its outlet falls below 40 °C. Should it be a finned-tube unit or a packed bed of PCM capsules?

The point is the workflow, not a verdict: with other materials, sizes or heat transfer coefficients the answer changes.

import pytes
from pytes import plotting
from pytes.experiments import Experiment, run_experiment
from pytes.experiments import step as s

T_cold, T_hot = 273.15 + 10, 273.15 + 70

Same PCM, same storable energy#

The finned-tube unit is the default sharp-front model, with one tube. The packed bed takes the same PCM, fluid and temperatures from it (parameters are layered by prefix, DESIGN D1; see parameter layers), and its cross-section is sized with energy_between so that it stores the same energy between 10 °C and 70 °C.

finned = pytes.SharpFrontModel()
finned_values = finned.default_parameter_values
capacity = pytes.energy_between(finned, T_cold, T_hot, finned_values)

bed = pytes.PackedBedModel()
bed_values = bed.default_parameter_values
shared = (
    "Reference temperature [K]",
    "Initial temperature [K]",
    "Inlet temperature [K]",
)
for name, value in finned_values.items():
    if name.startswith(("PCM ", "Heat transfer fluid ")) or name in shared:
        bed_values[name] = value
bed_values["Bed cross-sectional area [m2]"] = 1
per_area = pytes.energy_between(bed, T_cold, T_hot, bed_values)
bed_values["Bed cross-sectional area [m2]"] = capacity / per_area

print(f"finned tubes: {capacity / 3.6e6:.2f} kWh")
print(
    f"packed bed: {pytes.energy_between(bed, T_cold, T_hot, bed_values) / 3.6e6:.2f} kWh, "
    f"cross-section {capacity / per_area:.3f} m2"
)
finned tubes: 2.45 kWh
packed bed: 2.45 kWh, cross-section 0.047 m2

The same test for both#

Both start full (uniform at 70 °C) and deliver 3 kW with water at 10 °C, the flow adjusted to hold the power (see experiments), until the outlet falls below 40 °C.

test = Experiment(
    [
        s.Power(
            3e3,
            inlet_temperature=T_cold,
            termination=[
                s.outlet_temperature_below(273.15 + 40),
                s.mass_flow_rate_above(1.0),
            ],
            period=10,
        )
    ]
)
results = {}
for name, model, values in [
    ("finned tubes", finned, finned_values),
    ("packed bed", bed, bed_values),
]:
    results[name] = run_experiment(model, test, parameter_values=values)
    delivered = results[name]["Discharged energy [J]"].entries[-1]
    minutes = results[name]["Time [min]"].entries[-1]
    print(
        f"{name}: 3 kW for {minutes:.1f} min, delivering {delivered / 3.6e6:.2f} kWh "
        f"({delivered / capacity:.0%} of what it stores)"
    )

fig, axes = plotting.plot_summary(list(results.values()), labels=list(results))
finned tubes: 3 kW for 34.5 min, delivering 1.72 kWh (70% of what it stores)
packed bed: 3 kW for 25.5 min, delivering 1.28 kWh (52% of what it stores)
../_images/04ee0c9e8f6b71374579a9135639253a339f00544f21288a4081010572585eff.png

Both store the same energy, but the finned unit delivers about 70 % of it before the outlet cools, and the bed only about half: heat leaves its large paraffin capsules (55 mm across) slowly, through a low film coefficient and a poorly conducting PCM, so the outlet cools long before the capsules are spent.

What would make the bed competitive?#

Smaller capsules at the same porosity store the same energy but expose more surface and conduct over a shorter distance.

for radius in (27.5e-3, 15e-3, 7.5e-3):
    values = bed_values.copy()
    values["Capsule radius [m]"] = radius
    solution = run_experiment(bed, test, parameter_values=values)
    delivered = solution["Discharged energy [J]"].entries[-1]
    print(
        f"capsules of {2e3 * radius:4.0f} mm: 3 kW for "
        f"{solution['Time [min]'].entries[-1]:5.1f} min, {delivered / capacity:.0%} delivered"
    )
capsules of   55 mm: 3 kW for  25.5 min, 52% delivered
capsules of   30 mm: 3 kW for  38.7 min, 79% delivered
capsules of   15 mm: 3 kW for  45.0 min, 92% delivered

The same few lines answer the next question too: a different PCM, a higher film coefficient, more tubes. Every family exposes the same outputs and runs the same experiments, so a comparison is a loop over models and parameter values.