Far-field computation#

Surface equivalence on a Huygens box#

The radiated far field of a time-domain run is obtained by the frequency-domain near-to-far-field transform: on a closed surface around the radiator, the tangential fields define equivalent surface currents \(\mathbf J = \hat n \times \mathbf H\) and \(\mathbf M = -\hat n \times \mathbf E\), whose radiation vectors

\[ \mathbf N(\hat r) = \oint \mathbf J\, e^{+jk\,\hat r\cdot\mathbf r'}\,dS', \qquad \mathbf L(\hat r) = \oint \mathbf M\, e^{+jk\,\hat r\cdot\mathbf r'}\,dS' \]

give the far-zone field per direction,

\[ E_\theta = -\frac{jk}{4\pi}\,\bigl(\eta N_\theta + L_\varphi\bigr), \qquad E_\varphi = -\frac{jk}{4\pi}\,\bigl(\eta N_\varphi - L_\theta\bigr). \]

This is the standard surface-equivalence formulation of FDTD/FIT post-processing, introduced by Umashankar and Taflove [53] and covered in textbook form by Taflove and Hagness [5]; the antenna-side definitions follow Balanis [54].

monitors.MonitorFarField(freqs=[...]) records everything needed during the run: it places a closed box a few grid cells inside the physical domain (the absorber layers are excluded automatically, the clearance is margin_cells) and accumulates a running DFT of the tangential fields on its faces at the requested frequencies. Each face lies on a grid-node plane; the fields are interpolated from the two adjacent cell layers onto that plane, which keeps the surface exactly closed and second-order accurate on graded grids. The memory cost is one complex sample per frequency and surface cell — negligible next to a volume monitor.

After the run, monitor.result(f) performs the transform and returns a FarFieldResult with the complex patterns \(E_\theta\), \(E_\varphi\) on a spherical grid (ISO convention: \(\theta\) from the \(+z\) axis, \(\varphi\) from \(+x\) in the \(xy\)-plane), evaluated at any angular resolution without re-running the solver.

Ground planes, walls and symmetry planes#

A domain face closed with an electric or magnetic wall — a monopole’s ground plane, for instance — makes a closed box impossible. Such faces are handled by image theory: the box is left open there and every recorded surface patch acquires a mirror image with the field signs of the corresponding wall type. Two situations share the same mechanics but differ in meaning:

  • A real boundary (a plain PEC/PMC face): the model is a half-space problem. The pattern is masked behind the plane, the radiated power integrates over the physical half sphere, and directivity refers to it — a quarter-wave monopole on a ground plane reports its textbook ~5.2 dBi, not the dipole’s 2.15 dBi.

  • A symmetry plane (SymmetryPEC/SymmetryPMC, or the as-built ForceSymmetry… forms): the mirror half exists physically. The image expansion reconstructs the full-model pattern over the whole sphere, and no additional power factor applies anywhere — the full-model excitation convention of the boundary chapter already makes one declared watt a full-model watt.

Periodic boundaries have no radiated field in this sense and are rejected. On a magnetic wall the natural wall of the staggered grid sits a fraction of a cell outside the outermost grid line; the mirrored surface inherits that sub-cell gap, a second-order effect on the pattern.

Normalisation, gain and radiated power#

All frequency-domain quantities of the library are effective (RMS) phasors normalised per √W of incident power, and the far field is no exception: the radiation intensity is \(U = \bigl(|E_\theta|^2 + |E_\varphi|^2\bigr)/\eta_0\) with no further factor, and

  • realized_gain \(= 4\pi U / 1\,\mathrm W\) — referenced to the incident power, mismatch included; this is the directly measured quantity,

  • gain \(= 4\pi U / P_\mathrm{acc}\) — the IEEE gain, using the accepted power \(1 - \sum|S|^2\) the scattering run wires into the result,

  • directivity \(= 4\pi U / P_\mathrm{rad}\),

  • radiation_efficiency \(= P_\mathrm{rad} / P_\mathrm{acc}\) — 1 for a lossless model, and a useful closure check: for a lossless antenna \(P_\mathrm{rad}\) must reproduce \(1 - |S_{11}|^2\).

The radiated power integrates the smooth full-sphere pattern and scales by the physical solid-angle fraction, which the image symmetry makes exact.

Plots#

pattern = ff.result(2.45e9)
pattern.plot_cut(plane="phi", angle=0.0)        # polar E-plane cut
pattern.plot_cut(plane="theta", angle=np.pi/2)  # azimuth cut
pattern.plot_3d()                               # 3D radiation surface

plots.plot_pattern_cut and plots.plot_pattern_3d are the free functions behind these methods. Polar cuts follow the antenna convention (zero angle up, clockwise) with a dB floor as the radial minimum; the 3D surface maps the dB value to the radius so nulls stay visible as indentations.