Skip to content

Tutorial: Patch Antenna Design

This page connects the model that passes preflight in Your First Patch Antenna with the separate patch cross-check in validation/crossval/05_patch_antenna.py.

StageGoalPrimary page / script
1. Setup checkSize the patch, resolve preflight, and verify finite data from a short runYour First Patch Antenna
2. Narrow cross-checkRun the repository’s exact rfx/OpenEMS configuration and apply its stated gatesvalidation/crossval/05_patch_antenna.py
3. Radiation / reportingMove to far-field reporting after the resonance setup is stableFar-Field & RCS

The workflow models a rectangular 2.4 GHz patch on a 1.5 mm FR4 substrate over a finite ground plane. One setup choice is load-bearing: place the ground plane as an explicit finite PEC box inside the domain, not as a full-domain PEC boundary wall. A finite ground plane radiates into the absorber beneath it, which is the physical open-radiation problem; turning the bottom of the domain into a PEC wall instead makes the structure a closed cavity and shifts the resonance high. Pair the geometry with absorbing (CPML) boundaries on all faces.

Terminal window
python validation/crossval/05_patch_antenna.py

With the OpenEMS/CSXCAD Python bindings installed, the script prints a console summary comparing the rfx and OpenEMS resonances and writes a plot plus a JSON result file. Those bindings are not an rfx dependency: if they are missing, the script runs the rfx portion and then exits with status 2 behind a SKIPPED banner. That run is inconclusive and does not report a cross-solver pass.

  • Read Harminv resonance as the primary frequency estimate. The script’s primary gate is a resonance-frequency agreement — rfx Harminv vs OpenEMS Harminv within 20 %, and rfx internal self-consistency (Harminv vs the lumped-port S11 local dip) within 5 % — not an |S11| magnitude match.
  • Those tolerances and results apply only to the script’s geometry, mesh, frequency band, and metric. They do not validate the First Patch model or the patch gallery diagnostic.
  • Use impedance-referenced S-parameter results only through a documented port workflow — see Sources & Ports for add_port. The lumped-port S11 dip in this script is a secondary check with a known single-cell parasitic reactance, so read it as a local dip near the Harminv frequency, not a deep matched null.
  • Treat non-uniform mesh variants as limited support unless the page you are following says otherwise.