codexmeissner-cooling-and-field-history.py
meissner-cooling-and-field-history.py
"""Original preparation and equilibrium schematic, not data or cooling kinetics.
Run from _media. Tested with Python 3.14 and Matplotlib 3.10.7.
"""
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch, Rectangle
def sample(ax, x, y, interior, screened, label):
width, height = 1.48, 0.92
ax.add_patch(Rectangle((x, y), width, height, facecolor="#edf4f7",
edgecolor="#4b606c", lw=1.3))
if screened:
for edge in (x, x + width - 0.09):
ax.add_patch(Rectangle((edge, y), 0.09, height,
facecolor="#d97832", edgecolor="none"))
if interior:
for yy in (y + 0.24, y + 0.48, y + 0.72):
ax.add_patch(FancyArrowPatch((x + 0.12, yy), (x + width - 0.12, yy),
arrowstyle="-|>", mutation_scale=12,
lw=1.5, color="#176b9c"))
else:
ax.text(x + width / 2, y + height / 2, r"$B_{\rm bulk}\simeq0$",
ha="center", va="center", fontsize=11)
ax.text(x + width / 2, y - 0.15, label, ha="center", va="top", fontsize=10)
def main():
plt.rcParams.update({"font.size": 11, "figure.facecolor": "white"})
fig, ax = plt.subplots(figsize=(10.5, 5.3))
fig.subplots_adjust(left=0.025, right=0.975, bottom=0.14, top=0.84)
ax.set(xlim=(-1.45, 8.4), ylim=(-0.5, 4.05))
ax.axis("off")
columns = (0, 2.35, 4.75, 6.75)
for x, title in zip(columns, ("1. Start normal", "2. Prepare below transition",
"Meissner equilibrium", "Perfect-conductor model")):
ax.text(x + 0.74, 3.78, title, ha="center", va="bottom", fontsize=11)
for y, name in ((2.18, "Field first"), (0.27, "Cool first")):
ax.text(-1.34, y + 0.62, name, ha="left", va="center", weight="bold")
field_first = name == "Field first"
sample(ax, 0, y, field_first, False,
r"$T>T_c$, field on" if field_first else r"$T>T_c$, field off")
ax.add_patch(Rectangle((2.35, y), 1.48, 0.92, facecolor="#fff8ec",
edgecolor="#a38c65", lw=1.3))
ax.text(3.09, y + 0.46,
"Cool while\nholding field fixed" if field_first
else "Cool with field off;\nthen switch field on",
ha="center", va="center", fontsize=10)
sample(ax, 4.75, y, False, True, "Same screened end state")
sample(ax, 6.75, y, field_first, not field_first,
"Pre-existing field retained" if field_first else "Zero interior field retained")
for start, end in ((1.54, 2.29), (3.92, 4.69)):
ax.add_patch(FancyArrowPatch((start, y + 0.46), (end, y + 0.46),
arrowstyle="-|>", mutation_scale=13,
color="#53636c", lw=1.3))
fig.suptitle("Cooling and field history: expulsion versus flux memory", fontsize=15, y=0.96)
fig.text(0.5, 0.04,
"Both final states: same low temperature and weak applied field. Solid, simply connected, thick sample.\n"
"Blue: interior field. Orange: screening layer (schematic). Not measured data; no transition kinetics.",
ha="center", fontsize=10)
fig.savefig(Path(__file__).with_suffix(".png").name, dpi=110,
facecolor="white", transparent=False)
plt.close(fig)
if __name__ == "__main__":
main()