Collector tilt optimizer
The textbook "tilt = latitude" rule maximises annual yield — which is the wrong objective when the collector array is oversized for the heat demand.
This tool models hour-by-hour clear-sky irradiance through the year, caps daily collection at what the tank can absorb, and picks the tilt that minimises unmet demand. For an oversized system, the answer comes out steeper than the textbook value — pushing more of the yield into shoulder months where it isn't wasted as bypass-dump.
Site
Defaults are the centre of Prague. Enter your own coordinates — positive latitude = north of the equator, positive longitude = east of Greenwich.
System
Collector efficiency: effective seasonal-average fraction of incident sunlight delivered as useful heat — NOT the peak optical efficiency you see on a collector datasheet (typically η₀ ≈ 0.75–0.82 for flat-plate, 0.70–0.78 for evacuated-tube). That peak number is the maximum possible at a single moment, with the sun normal to the collector and the tank cold; seasonal-average delivered is much lower because of a cascade of physical losses (temperature derate, cosine of incidence, control / pipe / stagnation losses, soiling). Conservative starting point: 0.40–0.45 for typical residential drainback flat-plate; up to ~0.50–0.55 for a well-designed short-pipe / low-temperature-delivery install; ~0.45–0.55 for evacuated tube in high-ΔT applications. The full cascade table and the Hottel–Whillier–Bliss equation behind these numbers live on the collector-efficiency reference page.
Tank inputs (size, max temp, supply temp, insulation):
the model tracks tank state day-by-day through the year — heat
collected today carries into tomorrow's draw, subject to the
tank's physical envelope and standing-loss-to-ambient. Inputs
are the physically-meaningful values you can read off a
nameplate or controller, not a derived "capacity" number.
Tank size (L): the actual water volume. Industry
sizing rule (Duffie & Beckman 1976 originally quoted
75 L/m²; modern solar-thermal practice narrows this to 50–60
L/m²): 50–60 L per m² of collector is the sweet spot, with
50–80 L/m² as the acceptable range — below 50 L/m² efficiency
drops fast, above 80 L/m² cost rises without benefit.
Defaults assume 300 L paired with the 6 m² default collector
area.
Max tank temp (°C): the controller's hi-limit cut-off.
60–75 °C is the usual residential range (mixing valve drops
delivery to 49 °C downstream); commercial sites with tempering
valves go to 82 °C / 180 °F. Above max-temp the controller
stops pumping and any additional clear-sky collection is bypass.
Cold-water supply (°C): the practical floor of the tank
— once the last useful kWh is extracted, you're left with
water at supply temperature. Central Europe / UK ≈ 10 °C;
warmer climates 12–18 °C; Nordic 5–8 °C. Reference-rig data
(449 000+ 1-minute samples, one full year) shows the tank
almost never drops below the local supply, sitting a few
degrees above it at its winter coldest (P10 ≈ 12 °C).
Tank insulation: drives the standing-loss-to-ambient
rate. "Good" matches the 8 cm-PUR reference rig and gives
~0.0012 × L kWh/day (about 1.7 kWh/day for a 1431 L tank,
matching measured rig values). Pick higher / lower as a
proxy for your insulation thickness or age.
System / fluid: our drainback systems pump collector water straight into the thermal store, so the only heat exchanger in the loop is the collector itself. The "water" is pure water dosed with the trace corrosion inhibitors described on the corrosion-inhibition page (sodium silicate + sodium sulfite, well under 0.1 % by mass — heat capacity is essentially that of pure water). Closed systems use a propylene-glycol antifreeze loop with an extra heat exchanger between the loop and the store — that HX typically costs 3-6 % at solar-thermal operating ΔTs, and the 40 % glycol mix itself carries roughly 6 % less heat per litre than pure water at solar-thermal temperatures (volumetric heat capacity ρ·cp ≈ 3.9 vs 4.1 MJ/m³/K, i.e. ~1.08 vs ~1.16 kWh per litre per °C) plus another 2-4 % loss to higher viscosity reducing convective heat transfer. Combined, the closed glycol path consistently delivers 10-15 % less to the store than a like-for-like drainback array, so we apply a 12 % performance penalty when glycol is selected. Closed systems also have to dump excess heat through a bypass valve when the tank is full — see the footnote under the monthly-energy chart for what the "Closed-system bypass" series means for each system type.
Sky / climate
0 % = clear-sky idealised maximum (the prior version of this tool's behaviour). Higher values attenuate the clear-sky direct-beam contribution and shift more of the remaining irradiance into the isotropic-sky diffuse component, which itself favours flatter panels. Rough starting points: ~10 % clear desert · ~30 % central Europe · ~50 % maritime Atlantic / persistent overcast. This is an annual-average proxy, not a climate database — sites with strong seasonal cloud asymmetry (e.g. Mediterranean summer-dry vs Atlantic winter-cloudy) will trade differently.
Demand profile
Fraction of the annual demand that comes from space heating (winter-weighted) vs domestic hot water (constant year-round). Higher = the optimum tilt shifts steeper because more demand falls on short winter days.
Panel orientation
* Closed-system loss only. In a pressurised closed loop, heat above the tank's capacity is dumped via a bypass valve once the store is full. Drainback systems (such as ours) simply stop circulating — there is no active heat-dump loop, so excess solar input is simply not harvested (the available irradiance is still incident on the panel; it just isn't picked up because the loop is dry). For a drainback install, treat "potential bypass" as a tank-sizing warning: it's roughly the yield you'd have to forfeit as bypass-valve dumping each year if you ran the same array as a pressurised closed system.
How it works
The sun-position math is the same simplified
NOAA / Meeus solar-position algorithm
our firmware uses to expose sunrise_unix, sunset_unix, and current
altitude/azimuth on the
live /api/health endpoint.
The plane-of-array correction is the standard cosine-of-incidence on a
tilted, azimuth-rotated panel; sun on the back face is clipped to zero.
A clear-sky DNI model (1366 W/m² · 0.7AM) gives a per-hour direct-beam estimate. Hourly samples across a representative non-leap year (8760 samples), summed for the candidate (tilt, azimuth, area, efficiency), give an upper-bound annual yield. Daily collection above (demand + tank-store) is treated as dumped; daily collection below demand is the unmet shortfall. No storage carryover between days: each UTC day is bucketed independently against that day's demand and the tank's daily-store capacity.
The "optimal" tilt is the 0–90° sweep value that minimises annual
unmet demand, not maximum yield — this is the key trick that makes
the "tilt steeper for oversized arrays" insight fall out naturally
rather than being a hand-tuned heuristic. The tool also tells you how
far the optimum sits from the classical tilt = lat rule (and its
seasonal variants lat + 15° for winter-peaking and lat − 15° for
summer-peaking, which appear throughout the textbook literature),
and why.
This is essentially a simplified, visualised F-Chart calculation (Klein, Beckman & Duffie 1976; canonical reference Duffie & Beckman, Solar Engineering of Thermal Processes, Wiley, 4th ed. 2013, ch. 21) — the industry-standard sizing method that solar-thermal engineers have used since the late 1970s. Full F-Chart computes a monthly solar fraction from two dimensionless groups (X and Y), then sums; this tool computes delivered + unmet directly via the same physical inputs (irradiance, tilt, area, demand, storage) without invoking the F-Chart equation form. Sanity check: a well-sized drainback flat-plate install at mid-latitudes typically delivers 400–600 kWh/m²/yr of net energy to the store — if your "Collected ÷ area" number falls anywhere in that band, the model is producing engineering-plausible results. Industry sweet-spot solar fraction is 30–60 %; chasing higher SF runs into diminishing-returns (per-collector yield drops sharply, and bypass losses grow) — common stopping rule: stop sizing once per-collector yield drops more than ~30 % vs the 1-collector baseline.
Assumptions to be aware of
- Clear-sky direct beam + isotropic diffuse + average- cloudiness attenuation. Base model: DNI ≈ 1366 W/m² · 0.7AM for direct beam, plus an isotropic diffuse component (Liu–Jordan sky-view factor for the tilted plane). The "Average cloudiness" slider attenuates the clear-sky GHI by up to 70 % and shifts the diffuse fraction from 15 % (clear) toward 90 % (overcast), so cloudier climates correctly favour flatter panels. This is a first-order proxy, not TMY3 / PVGIS climate data: real sites with seasonal cloud asymmetry (e.g. Mediterranean summer-dry vs Atlantic winter-cloudy) will trade differently across the year than a single annual-average cloudiness number can capture. Pyranometer-data-driven models like Hay–Davies are more accurate but need site-specific inputs.
- Demand profile = DHW (constant) + space heating (cosine). Space heating tracks a cosine of day-of-year peaking at the winter solstice — a reasonable proxy without site-specific weather data, but not a real heating-degree-day series: real demand is weather-driven, asymmetric across the shoulder seasons, and climate-dependent (e.g. maritime Atlantic vs continental Prague have very different heating-month shapes). The "space-heating share" slider controls the mix; higher share shifts the optimum steeper because more demand falls on short winter days.
- Multi-day tank state with standing loss. The simulation
tracks tank state day-by-day in kWh above the cold-water floor.
Each day's collection adds to state (clamped at the envelope
L × (T_max − T_supply) × 1.16 / 1000); each day's demand draws from state (shortfall = unmet); standing loss to ambient comes off state as ~L × insulation-factorkWh/day; collection above remaining headroom is bypass. A throwaway warm-up year runs first so the metered year starts from quasi-steady state rather than the arbitrary mid-envelope initialisation. This is the meaningful upgrade over the older per-day independent bucketing — yesterday's surplus is now genuinely available for today's draw, which especially helps installs with large well-insulated buffers (Privateer reference rig: 1431 L, 8 cm PUR). Standing-loss coefficients per insulation tier are calibrated against the reference-rig dataset (~1.7 kWh/day measured for the 1431 L "good" case). - Single fixed orientation. A tracker or seasonal-tilt mount would beat any fixed value, but introduces installation-cost and control-strategy trade-offs beyond this tool's scope.
- Clear horizon assumed. The optimiser sees the geometric sky only — trees, buildings, towers, and terrain that shade the array at any time of day aren't modelled. The optimum tilt is still close to correct if you have known obstructions (shading at one azimuth doesn't change the sun-trajectory geometry), but the absolute delivered figure is a ceiling rather than a prediction.
Further reading
Dr. Ben Gravely's solarhotwater-systems.com catalogues four decades of practical drainback installation experience (2000+ systems since 1978). Useful complement to the F-Chart / D&B references when you want to see how the canonical sizing and orientation rules behave on real installs.