Skip to content

EMStudio v1.3.0 — wave ports from your own selection, and a silent S-parameter bug fixed

Choose a tag to compare

@king-aj3 king-aj3 released this 21 Aug 14:21
· 42 commits to master since this release

Install or update through the FreeCAD Add-on Manager — it installs from master, so you may already have this.

What's new

N-port is reachable from the GUI. Select the faces you want as ports and use Analysis ▸ Wave Ports from Selection — port 1 is the first face you click, because only you know which physical connector that is. A live 3-port WR-90 T-junction now solves end to end: passivity 0.9996, losslessness 2.9985 against an ideal 3.0, and a genuine .s3p written with one matrix row per line.

Every capability has a tutorialdocs/TUTORIALS.md, 28 of them. Each ends in a checkable number and names the automated gate that pins it, and each quotes the range the gate allows rather than a single value, because your mesh will not reproduce ours exactly.

Solver Setup shows a version you can trust. ElmerSolver --version carries a run timestamp, so that column used to change every time you pressed Re-detect. Now gated.

Correctness fixes — read this part

openEMS silently accepted more than one excited port. Every port created through the GUI carries Excited=True, and the guard tested "any" while the S-parameter contract says exactly one. Adding a second port the obvious way produced a deck driving both, which openEMS accepts — and then s11 = uf_ref/uf_inc treats port 1 as the only source, so the incident wave is contaminated and the S-parameters are silently wrong. No exception, no warning, a plausible answer. Now refused, with the offending ports named. Shipped templates were never affected, and FullSMatrix was never affected.

The litz proximity fallback used the wrong asymptote. On a build without SciPy, _proximity_h returned 0.166 · x where the true large-x limit is (x−1)/833 % high even at x = 512, and 5.92× just above the x = 2 join. Proximity loss is the number litz wire exists to control. Corrected; x ≥ 4 is now within 1.6 %. If you have SciPy installed you were never affected.

Guided source builds were blocked on macOS. _lib_present() shelled out to ldconfig, which is glibc-only, and reported every library prerequisite missing on macOS — often ones Homebrew had already installed. A probe that cannot run now answers "present", because unprovable must not masquerade as proven-missing.

Also: shell quoting in the OpenFOAM command builder, and a SHA256 pin on the Windows OpenFOAM installer.

Verify it yourself

git clone https://github.com/king-aj3/EMStudioFree
python3 tests/validation/run_battery.py

82 validation gates in this tree. The fast tier needs only numpy and scipy — no solver install. --all adds the benchmark tier, which does need the solvers present. The tests and the reference data they check against are both in the repo, so you can read what they assert before running anything.

Known limits

Nothing radiating is gated above 2.435 GHz — the patch. Palace is gated to 39 and 57 GHz on closed structures (waveguide, cavity), and openEMS to 3.68 GHz on a microstrip notch filter, which is not a radiator. Treat higher-frequency antenna work as unproven here until there is a gate for it.