codexrectangular-waveguide-te10-field-geometry.py
rectangular-waveguide-te10-field-geometry.py
"""Original ideal TE10 field diagram; Python 3.14, numpy 2.3.5, matplotlib 3.10.7.
Run from _media; the output basename matches this script. All dimensions are
stipulated, not measurements or a commercial waveguide specification.
"""
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np
def main():
a, b = 30.0, 12.0 # millimetres
plt.rcParams.update({'font.size': 11, 'axes.spines.top': False,
'axes.spines.right': False, 'figure.facecolor': 'white'})
fig, (ax, profile) = plt.subplots(1, 2, figsize=(10.8, 4.7),
gridspec_kw={'width_ratios': [1.65, 1]})
fig.subplots_adjust(left=0.065, right=0.975, bottom=0.19, top=0.78, wspace=0.32)
fig.suptitle(r'$\mathrm{TE}_{10}$: one electric-field half-wave across the broad dimension',
fontsize=15, y=0.97)
fig.text(0.5, 0.865, r'Chosen vacuum guide: $a=30$ mm, $b=12$ mm; '
r'$f=1.25f_c\approx6.246$ GHz; ideal conducting walls', ha='center')
ax.add_patch(Rectangle((0, 0), a, b, fill=False, linewidth=5, edgecolor='#505963'))
x = np.linspace(2, 28, 13)
for y in (2.1, 6, 9.9):
amp = 3.2 * np.sin(np.pi * x / a)
ax.quiver(x, y - amp / 2, np.zeros_like(x), amp, angles='xy',
scale_units='xy', scale=1, width=0.006, color='#1670b6')
ax.plot([0, a], [b / 2, b / 2], 'o', color='#c45131', markersize=6)
ax.annotate('', (a, -2), (0, -2), arrowprops={'arrowstyle': '<->', 'color': '#505963'})
ax.text(a / 2, -3.7, r'$a=30$ mm', ha='center')
ax.annotate('', (-2, b), (-2, 0), arrowprops={'arrowstyle': '<->', 'color': '#505963'})
ax.text(-4.0, b / 2, r'$b=12$ mm', ha='center', va='center', rotation=90)
ax.text(a / 2, b + 1.4, r'$E_y\propto\sin(\pi x/a)$, independent of $y$', ha='center')
ax.text(0, -6.1, r'$x\rightarrow$ $y\uparrow$ $\odot\ +z$ out of page', fontsize=11)
ax.text(a / 2, b / 2 + 0.8, r'$E_y$ strongest at $x=a/2$', ha='center', fontsize=10,
bbox={'facecolor': 'white', 'edgecolor': 'none', 'alpha': 0.9})
ax.set(xlim=(-5.5, 32), ylim=(-7, 15), aspect='equal')
ax.axis('off')
xx = np.linspace(0, a, 501)
ee = np.sin(np.pi * xx / a)
profile.plot(xx, ee, color='#1670b6', linewidth=2.7)
profile.fill_between(xx, ee, color='#1670b6', alpha=0.1)
profile.plot([0, a], [0, 0], 'o', color='#c45131', clip_on=False)
profile.axvline(a / 2, color='#b4bcc4', linestyle=':', linewidth=1)
profile.set(xlim=(0, a), ylim=(0, 1.1), xticks=[0, 15, 30], yticks=[0, .5, 1],
xlabel=r'$x$ across broad dimension (mm)', ylabel=r'$E_y/E_0$ at a positive-phase plane')
profile.set_title('Electric profile at every height', fontsize=12, pad=10)
profile.grid(alpha=0.18)
fig.text(0.5, 0.045, 'Zero tangential E at the side walls; normal E is allowed at the top and bottom walls.',
ha='center', fontsize=10, color='#3e4952')
fig.savefig(Path(__file__).stem + '.png', dpi=130, facecolor='white', transparent=False)
plt.close(fig)
if __name__ == '__main__':
main()