codexpersistent-superconducting-current-geometry.py
persistent-superconducting-current-geometry.py
"""Schematic of field preparation and magnetic readout; not a scale reconstruction.
Tested with Python 3.14, matplotlib 3.10.7 and numpy 2.3.5.
Run from _media; writes this script's basename with a .png suffix to CWD.
"""
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, FancyArrowPatch, Rectangle
def arrow(ax, start, end, color="#bb472a", **kwargs):
ax.add_patch(FancyArrowPatch(start, end, arrowstyle="-|>", mutation_scale=15,
lw=2, color=color, **kwargs))
def main():
plt.rcParams.update({"font.size": 11, "font.family": "DejaVu Sans"})
fig, axes = plt.subplots(1, 2, figsize=(11, 5), facecolor="white")
blue, red, green = "#185b97", "#bb472a", "#23806c"
for ax in axes:
ax.set(xlim=(0, 10), ylim=(0, 8), aspect="equal")
ax.axis("off")
ax = axes[0]
ax.set_title("Prepare a closed path, then remove the field", fontsize=13, pad=16)
ax.add_patch(Rectangle((1, 1.2), 6.7, 5.5, fc="#edf7fc", ec=blue, lw=1.5))
ax.text(4.35, 6.15, "Liquid-helium bath / cryostat", ha="center", color=blue)
for r in (1.45, 1.58, 1.71):
ax.add_patch(Circle((4.2, 3.7), r, fill=False, ec=blue, lw=2))
ax.plot([4.95, 5.23], [2.55, 2.3], lw=7, solid_capstyle="round", color=green)
ax.annotate("Fused lead closure", xy=(5.1, 2.4), xytext=(5.7, 1.65),
ha="center", arrowprops={"arrowstyle": "-", "color": green}, color=green)
for x, y in ((3.55, 3.4), (4.65, 3.4), (4.1, 4.45)):
ax.add_patch(Circle((x, y), .15, fill=False, ec=red, lw=1.5))
ax.add_patch(Circle((x, y), .035, color=red))
ax.text(4.2, 5.65, "Applied field through the turns", ha="center", color=red)
ax.text(4.2, .65, "Cool in field; keep the loop closed.\nWithdraw the inducing magnet while cold.",
ha="center", va="top")
ax.text(.3, 7.2, "A Face view", weight="bold")
ax = axes[1]
ax.set_title("Sense the field without a contact in the loop", fontsize=13, pad=16)
ax.add_patch(Rectangle((.35, 1.8), 3.1, 4.4, fc="#edf7fc", ec=blue, lw=1.5))
for x in (1.45, 1.7, 1.95):
ax.add_patch(Ellipse((x, 4), .55, 2.6, fill=False, ec=blue, lw=2))
ax.text(1.9, 6.45, "Cold lead loop", ha="center", color=blue)
arrow(ax, (2.6, 4), (4.5, 4), color=blue)
ax.text(3.9, 4.45, "Loop field", ha="center", color=blue)
ax.add_patch(Circle((5.4, 4), .65, fc="white", ec="#555555"))
arrow(ax, (5.4, 3.5), (5.4, 4.5), color="#343b40")
ax.text(5.4, 2.8, "Compass needle\n(null at balance)", ha="center")
for x in (8, 8.25, 8.5):
ax.add_patch(Ellipse((x, 4), .35, 2.5, fill=False, ec=red, lw=2))
arrow(ax, (7.55, 4), (6.3, 4), color=red)
ax.text(7.45, 4.55, "Opposing field", ha="center", color=red)
ax.text(8.15, 6.1, "Separate copper\ncompensation coil", ha="center", color=red)
ax.text(7.8, 2.2, "Adjust measured\nreference current", ha="center", color=red)
ax.text(.3, 7.2, "B Plan view (schematic)", weight="bold")
ax.text(5, .65, "The reference coil has its own circuit.\nNo galvanometer or supply interrupts the lead loop.",
ha="center", va="top")
fig.text(.5, .025, "Original schematic; winding counts, shapes and spacing are illustrative.",
ha="center", fontsize=10, color="#555555")
fig.subplots_adjust(left=.03, right=.98, top=.88, bottom=.12, wspace=.12)
fig.savefig(Path(__file__).stem + ".png", dpi=120, facecolor="white")
plt.close(fig)
if __name__ == "__main__":
main()