File:ColdnessScale.svg - Wikipedia


Article Images

The radial lines denote key temperatures, clockwise from bottom including He evaporation (dotted cyan) around 4 K ↔ 3265 GB/nJ (just CCW from the 4732.51 GB/nJ of the 2.76 K cosmic background) and N2 evaporation (dashed cyan) around 77 K ↔ 170 GB/nJ, CO2 sublimation around −78.5 °C ↔ 67.1 GB/nJ (dot-dashed cyan), H2O liquification around 0 °C ↔ 47.8 GB/nJ and evaporation around 100 °C ↔ 35.0 GB/nJ (dot-dashed green), "red-hot" (solid red) around 500 °C ↔ 16.9 GB/nJ, rock melting around 1500 °C ↔ 7.37 GB/nJ (solid magenta), graphite sublimation (dashed magenta) around 3642 °C ↔ 3.34 GB/nJ, and the surface of the sun (dotted magenta) around 5778 K ↔ 2.26 GB/nJ ≈ 2.01 nat/eV. The dashed red lines represent the min-max European temperature range (from 0 °F ↔ 51.2 GB/nJ to 100 °F ↔ 42.0 GB/nJ) on which Fahrenheit based his scale, at top of which is also the human basal temperature at around 98.6 °F ↔ 42.1 GB/nJ. Room temperature (3 o'clock) is defined as either 20 °C = 68 °F ↔ 44.6 GB/nJ ≈ 39.6 nat/eV = 1/kT or 22 °C = 71.6 °F ↔ 44.3 GB/nJ ≈ 39.3 nat/eV = 1/kT, and therefore kTroom is about 1/40 of an electron Volt.

Inverted-population states for finite-energy systems are found on the left half of this plot. These include: (i) 1024 end-on dominoes acting like stonehenge in the earth's gravitational-field (grey-dotted) at −.001[J]/(kBln[1024]) ≈ −1.04×1019 K ↔ −1.25×10−15 GB/nJ, (ii) a mole of excited Ne atoms in a He-Ne LASER ready for stimulated-emission (grey-dashed) at −1.96 [eV]/(kBln[6×1023]) ≈ −415 K ↔ −31.5 GB/nJ, and (iii) the orientation-temperature for 500,001 up out of 1,000,000 proton-spins in a 1 Tesla field (grey) at 1.41×10−26 J/(kB(ψ[1 + 1000000 − 500001] − ψ[1 + 500001])) ≈ −1.41×10−26 J/(kBln[1000000/500001 − 1]) ≈ −255 K ↔ −51.1 GB/nJ where ψ[x] is the PolyGamma function. The dot-dashed grey lines are for 500,002 and 500,003 out of 1,000,000 protons oriented spin-up in that same 1 [Tesla] field.

This plot illustrates that you can use either temperature T or reciprocal-temperature 1/kT to predict the direction of heat-flow. When you use temperature, remember that the highest possible temperature T is minus-zero-Kelvin and the lowest possible T is plus-zero-Kelvin. With coldness 1/kT, the lowest value is minus-infinity and the highest is plus-infinity so that heat energy naturally and simply flows from numerically low to numerically high 1/kT.

In the table of conversions above, note that the uncertainty-slope or coldness β≡1/kT in [GiB/nJ] or [GB/nJ] is nearly equal to the reciprocal of kT in [eV/nat]. Even more curiously, if we don't mind using binary-multiples i.e. gibiBytes instead of powers of ten, we can say that 1 [nat/eV] = 1.04827 [GiB/nJ] = 1.12557 [GB/nJ]. Hence room temperature coldness is about 40 [GiB/nJ] simply because kT at room temperature is about 1/40 [eV].

The following code generated the plot above. The legend and arrowhead were added later in Inkscape.

import numpy as np
import matplotlib.pyplot as plt

kb_inv = 1/1.380649e-23/np.log(2)/8/1e18 # in GB per nJ
TAU = np.math.tau
gib_per_nj = np.array([-140, -120, *np.arange(-100, 110, 10), 120, 140])

scale = 44.3 # Defines the 3 o'clock position
angles = 2 * np.arctan(gib_per_nj/scale)
r = np.ones(len(gib_per_nj))

kelvins = np.arange(-900, 1000, 100)
k_angles = 2 * np.arctan(kb_inv/kelvins/scale)
r_k = np.ones(len(kelvins))

celsius = np.arange(-200, 600, 100)
c_angles = 2 * np.arctan(kb_inv/(273.15 + celsius)/scale)
r_c = np.ones(len(c_angles))

fahrenheit = np.arange(-400, 600, 100)
f_angles = 2 * np.arctan(kb_inv/(273.15 + 5*(fahrenheit-32)/9)/scale)
r_f = np.ones(len(f_angles))

angle_cut = TAU/36
circle_angles = np.linspace(-(TAU/2 - angle_cut), TAU/2, 2**12)
r_circ = np.ones(len(circle_angles))
semi_angles = np.linspace(0, TAU/2, 2**12)
r_semi = np.ones(len(semi_angles))

size = 'x-small'
def get_text(angles, labels, distance, color):
    for i, label in enumerate(labels):
        rot_angle = angles[i] * 360 / TAU
        plt.text(angles[i], distance + 0.1, label, color=color, ha='center', va='center', rotation=90-rot_angle, fontsize=size)

fig = plt.figure(dpi=150)
ax = fig.add_subplot(projection='polar')
gb_distance = 1
k_distance = .8
c_distance = .6
f_distance = .4

get_text(angles, gib_per_nj, gb_distance, 'k')
get_text(k_angles, kelvins, k_distance, 'b')
get_text(c_angles, celsius, c_distance, 'g')
get_text(f_angles, fahrenheit, f_distance, 'r')
# for i, label in enumerate(gib_per_nj):
#     rot_angle = angles[i] * 360 / TAU
#     plt.text(angles[i], r[i]+.15, label, ha='center', va='center', rotation=90-rot_angle)
    # plt.annotate(label, (angles[i], r[i]))

# Plot lines
def plot_line(angle, color, line_type):
    ax.plot([angle, angle], [0,1], color=color, linestyle=line_type, lw=1)
# Helium boiling point
plot_line(2 * np.arctan(kb_inv/4./scale), 'c', ':')
# N2 boiling point
plot_line(2 * np.arctan(kb_inv/77./scale), 'c', '--')
# CO2 sublimation
plot_line(2 * np.arctan(kb_inv/(273.15-78.5)/scale), 'c', '-.')
# H20 freezing
freezing_angle = 2 * np.arctan(kb_inv/(273.15)/scale)
plot_line(freezing_angle, 'g', '-.')
# H20 boiling
boiling_angle = 2 * np.arctan(kb_inv/(373.15)/scale)
plot_line(boiling_angle, 'g', '-.')
# Liquid water range
ax.bar((boiling_angle+freezing_angle)/2, c_distance, boiling_angle-freezing_angle, color='g', alpha=0.25)
# Red hot
plot_line(2 * np.arctan(kb_inv/(273.15 + 500)/scale), 'r', '-')
# Rock melting
plot_line(2 * np.arctan(kb_inv/(273.15 + 1500)/scale), 'm', '-')
# Graphite sublimation
plot_line(2 * np.arctan(kb_inv/(273.15 + 3642)/scale), 'm', '--')
# Surface of the Sun
plot_line(2 * np.arctan(kb_inv/5778/scale), 'm', ':')
# 0 °F
plot_line(2 * np.arctan(kb_inv/(273.15+5*(0-32)/9)/scale), 'r', '--')
# 100 °F
plot_line(2 * np.arctan(kb_inv/(273.15+5*(100-32)/9)/scale), 'r', '--')
# 1024 Stonehenge dominoes
plot_line(2 * np.arctan(-1.25e-15/scale), 'darkgrey', ':')
# HeNe laser
plot_line(2 * np.arctan(-31.5/scale), 'darkgrey', '--')
# 500,001 spin-up protons out of 1 million in 1T magnetic field
mu_p = 1.410606797e-26 # proton magnetic moment
plot_line(2 * np.arctan(kb_inv/(mu_p/(1.38e-23*np.log(1000000/500001-1)))/scale), 'darkgrey', '-')
# 500,002 spin-up protons out of 1 million in 1T magnetic field
plot_line(2 * np.arctan(kb_inv/(mu_p/(1.38e-23*np.log(1000000/500002-1)))/scale), 'darkgrey', '-.')
# 500,003 spin-up protons out of 1 million in 1T magnetic field
plot_line(2 * np.arctan(kb_inv/(mu_p/(1.38e-23*np.log(1000000/500003-1)))/scale), 'darkgrey', '-.')

# Plot circles
ax.plot(circle_angles, gb_distance*r_circ, 'k-')
ax.plot(circle_angles, k_distance*r_circ, 'b-')
ax.plot(semi_angles, c_distance * r_semi, 'g-')
ax.plot(semi_angles, f_distance * r_semi, 'r-')

# Plot infinities
ax.plot([TAU/2], [gb_distance], 'k.')
plt.text(TAU/2, 0.075 + gb_distance, r'$+\infty$', ha='center', va='center', rotation = -90, fontsize=size)
ax.plot(0., k_distance, 'b.')
plt.text(0., 0.075 + k_distance, r'$\pm\infty$', color='b', ha='center', va='center', rotation = 90, fontsize=size)
# plt.annotate('$+\infty$', (TAU/2, 1.))
# plt.grid(visible=None)
plt.axis('off')

# Plot points
ax.plot(angles, gb_distance*r, 'k.')
ax.plot(k_angles, k_distance*r_k, 'b.')
ax.plot(c_angles, c_distance * r_c, 'g.')
ax.plot(f_angles, f_distance * r_f, 'r.')

# Orient plot
ax.set_theta_zero_location('N')
ax.set_theta_direction(-1)

# Set linewidths
plt.setp(ax.lines, linewidth=0.6)
plt.title('Universal coldness/temperature scale')
plt.savefig('fig/ColdnessScale-mpl.svg');