"""What a number of joules actually amounts to, in things people have done. WHY A SECOND TABLE, WHEN render.COMPARATORS ALREADY EXISTS That one answers "how long would this run an appliance": *twelve seconds of a 10 W bulb*. It is exact and it is nearly useless at the small end, because nobody has an intuition for twelve seconds of a light. This table answers the other question: "how much of a whole, familiar thing is this": *a tenth of a cup of tea*. Those are the units people already own. HOW THE NUMBERS WERE GOT Every entry is either derived here from physics, or is a rated figure for a common appliance run for a stated time. The working is in the note beside it so a reader can check it rather than trust it, which is the same standard the rest of this project applies to the figures it republishes. Water is the recurring one, so it is worth stating once. Heating water takes ``mass x 4186 J/kg/K x temperature rise``. A 250 ml mug from a 20 C tap to 100 C is ``0.25 x 4186 x 80 = 83.7 kJ`` of heat into the water. A domestic kettle puts roughly 80% of what it draws into the water, the rest going into the element, the body and the steam, so the wall figure is about 105 kJ. Where an entry says "in a kettle" it is the wall figure, because that is the electricity somebody actually paid for. Anything expressed in kWh is converted at 3.6 MJ per kWh. WHAT IS DELIBERATELY NOT HERE No CO2, no water footprint, no land, no money. Those are conversions with assumptions of their own -- grid mix, time of day, jurisdiction -- and this project does not make assessor-created estimates. A joule compared to another joule needs no assumption at all, which is why every entry on this list is an energy and nothing else. """ from __future__ import annotations from dataclasses import dataclass KWH = 3_600_000.0 #: Specific heat capacity of water, J/(kg K). WATER_SPECIFIC_HEAT = 4186.0 #: A domestic kettle delivers roughly this share of its draw into the water. KETTLE_EFFICIENCY = 0.80 #: Standard gravity, m/s^2. G = 9.81 def _heat_water(litres: float, rise_c: float, *, efficiency: float = 1.0) -> float: return litres * WATER_SPECIFIC_HEAT * rise_c / efficiency def _appliance(watts: float, seconds: float) -> float: return watts * seconds def _lift(kilograms: float, metres: float) -> float: return kilograms * G * metres @dataclass(frozen=True) class Comparator: """One familiar thing, and what it costs.""" #: Reads after a number: "about 2.5