Skip to content

Add the fan (parallel) dipole as a first-class antenna type - #4

Merged
skip17331 merged 1 commit into
mainfrom
fan-dipole
Jun 2, 2026
Merged

Add the fan (parallel) dipole as a first-class antenna type#4
skip17331 merged 1 commit into
mainfrom
fan-dipole

Conversation

@skip17331

Copy link
Copy Markdown
Owner

What

Adds the fan (parallel) dipole as a first-class antenna type: several half-wave dipoles, one per band, sharing a single feedpoint — multiband coverage without traps. This unblocks the fan-dipole design wizard (a follow-up).

NEC topology

The tricky part is feeding multiple legs from one feedpoint (unlike a Yagi, whose elements don't connect). Modelled with a two-node feed gap: a one-segment bridge wire carries the source, and every leg's right half ties to the bridge's right node while its left half ties to the left node — so all the dipoles hang in parallel across the feed. This is the same shared-node feeding the vertical already uses for its radials. The legs spread over a 30° azimuth fan so the wires stay clear. On each band the resonant leg presents the low impedance and dominates.

Verified solving on multiple bands (40 m + 20 m legs): physical feedpoint R and real gain on each leg's band. The legs default to a textbook half-wave and show some reactance from real inter-leg coupling — exactly why fan dipoles get trimmed in practice, which the editor allows.

Touch points (full new-antenna-type checklist)

  • model/antenna.pyFanDipoleLeg + FanDipoleModel (≥ 2 legs); a shared half_wave_length_m() helper.
  • cards/fan_dipole.pybuild_fan_dipole_deck; registered in cards/build.py.
  • ui/fan_dipole_editor.py — add/remove leg list (band + length; editing the band re-fills the half-wave, then trim).
  • ui/main_window.py — picker entry + geometry page appended last so existing stacked-widget indices are untouched (the page index tracks the picker index 1:1), _build_model branch, unit-system propagation, and capture/restore of the legs. (Folded dipole already owns _fd_*, so the fan height field is _fan_height — caught and avoided a clobber.)
  • cards/validation.py — fan dipole is centre-fed.
  • results/buildsheet.py — names it "Fan dipole" (the report reuses that name).

Tests

tests/test_fan_dipole.py (+12): the model and its ≥2 legs rule, deck topology (one feed bridge, two wires per leg, every half meeting a feed node), multiband NEC solves, the leg editor (min-2, frequency→length refill), the build-sheet name, and MainWindow build + capture/restore (incl. picker↔page index alignment). Suite 473 → 485. Verified in a clean CI-equivalent venv.

Follow-up

The fan-dipole wizard (pick bands → designed legs) is now easy on the existing wizard framework — happy to add it next.

🤖 Generated with Claude Code

A fan dipole is several half-wave dipoles, one per band, sharing a single
feedpoint — multiband coverage without traps. This adds it end to end.

Topology: the legs are fed across a common centre gap. A one-segment bridge
wire carries the source; every leg's right half ties to the bridge's right
node and its left half to the left node, so all the dipoles hang in parallel
across the feed (the same shared-node feeding the vertical uses for its
radials). The legs spread over a 30 deg azimuth fan so the wires stay clear.
On each band the resonant leg presents the low impedance and dominates.

Touch points:
  * model/antenna.py — FanDipoleLeg + FanDipoleModel (>= 2 legs), and a
    half_wave_length_m() helper shared with the leg editor.
  * cards/fan_dipole.py — build_fan_dipole_deck; registered in cards/build.py.
  * ui/fan_dipole_editor.py — an add/remove leg list (band + length; editing
    the band re-fills the half-wave length, which can then be trimmed).
  * main_window.py — picker entry + geometry page (appended last so existing
    stacked-widget indices are untouched), _build_model branch, and
    capture/restore of the legs. Note: folded dipole already owns _fd_*, so
    the fan height field is _fan_height.
  * validation.py — fan dipole is centre-fed.
  * buildsheet.py — names it "Fan dipole" (report reuses that name).

Tests cover the model, the deck topology (one feed bridge, two wires per leg,
all halves meeting the feed nodes), multiband NEC solves, the leg editor, the
build-sheet name, and MainWindow build + capture/restore. Suite: 473 -> 485.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@skip17331
skip17331 merged commit 3feb97d into main Jun 2, 2026
6 of 8 checks passed
@skip17331
skip17331 deleted the fan-dipole branch June 2, 2026 23:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant