Huygens · Documentation
3D microwave field solver, circuits, antennas, waveguides and periodic structures
Open Huygens →

Quick start

Huygens is a general-purpose 3D microwave field solver: transmission lines and circuits (discrete ports), antennas, waveguide components (TE10 ports) and periodic structures (Floquet ports, normal and oblique incidence). On top of that it has dedicated tools for metasurface and FSS unit cells (layer-stack builder, element library, phase-library sweeps) from microwaves to THz. The solver is a 3D FDTD that runs on your browser's GPU (WebGPU): nothing to install, and your designs never leave your computer.

  1. 1
    Open the app and pick a template in File → New project… (for example Reflectarray patch).
  2. 2
    Adjust the geometry in the right-hand Unit Cell Builder or in the Parameter List tab.
  3. 3
    Press ▶ Start. A typical cell solves in under a second.
  4. 4
    Inspect the results in 1D Results (S-parameters, phase, absorption…) and the field in the 3D view.
  5. 5
    Save with ⌘/Ctrl+S: the project is stored with its results. To build a phase library, use the Parameter Sweep tab.
Note. You need a WebGPU browser: recent Chrome/Edge or Safari 26+. Without WebGPU the app falls back to a CPU reference engine (correct, but much slower).

Video tutorial

Silent, captioned walkthrough (≈ 2 min). The captions are in English.

Tutorial: reflectarray phase library

Goal: the reflection phase of a patch versus its size at 10 GHz, the “S-curve” used to design a reflectarray.

  1. 1
    In File → New project… choose Reflectarray patch: a square patch of side patch_a on grounded RT/duroid 5880, in a square lattice of period p = 15 mm.
  2. 2
    Press ▶ Start. 1D Results shows SZmax(x),Zmax(x): |S| ≈ 1, because the cell reflects almost everything and only the phase changes.
  3. 3
    Open the Parameter Sweep tab, choose patch_a, keep the proposed start/stop (×0.5 … ×1.5) and 9 points, and press ▶ Run sweep.
  4. 4
    On the left you get |S| versus frequency for every size; on the right the library: amplitude and unwrapped phase versus patch_a at the (editable) design frequency.
  5. 5
    Press Export library CSV to take the size → phase table to your array-synthesis tool.
Tip. A good reflectarray element covers ≥ 300° of phase with |S| close to 1. If the range is small, try a thinner substrate or a multi-resonant element (double ring, Jerusalem cross).

The interface

1Ribbon: File menu + Home · Modeling · Simulation · Post-Processing · View2Tree33D view4Bottom panel (parameters, 1D, sweep, check, messages)5Properties / builder66 · Status bar (mesh, progress, convergence)
#AreaWhat it is for
1Ribbon (CST style)The File menu (new, open, save, export) and the tabs Home, Modeling, Simulation, Post-Processing and View; each tab shows only its own commands on one strip. Always visible on the right: save, undo/redo, assistant, help and ▶ Start/■ Stop. Hide the strip with the ⌃ arrow or by double-clicking a tab; in View you can hide the tree, the properties or the bottom panel to give the 3D view more room.
2Navigation treeProject structure: unit cell and layers, components (solids), materials, ports, boundaries, mesh, solver, field monitors and 1D/2D results. One click opens its properties.
33D viewGeometry (drag to orbit, wheel to zoom), periodic-array preview (neighbor cells), incidence arrows (red = k direction, blue = E polarization), mesh plane and animated field plane.
4Bottom panelParameter List (variables), 1D Results (plots), Parameter Sweep (sweeps and libraries), Model check and Messages (log, warnings and errors).
5PropertiesEditor of the selected item. With the unit cell selected it shows the builder: lattice, walls, layer stack, excitation and top view.
6Status barUnits, mesh size and Δt; while solving: step, decay (dB), spectral residual ΔS and speed (Mcells/s).

Boundary colors in the 3D view: grey PEC, blue open (CPML), green periodic, violet PMC and amber E/H wall.

Design assistant (AI)

Open the panel with the ✦ button in the top bar, with ⌘/Ctrl+J, or with Alt+⇧+A (if your browser reserves the first one). Describe the structure you want in plain language (lattice, period, layers, materials, element, band) and the assistant builds it in the unit-cell builder. Every dimension becomes a parameter, so you can edit and sweep it as if you had typed it yourself.

You can ask for…Example
A new design“Reflectarray cell at 28 GHz: square copper patch on 0.508 mm RO4003C over ground, period λ/2”
Structural changes“Add a 50 µm Kapton layer on top and turn the patch into a ring”
Numerical tweaks“Make the patch 10 % smaller” · “Raise f_max to 14 GHz”
Materials not in the catalog“Use a substrate with εr = 2.9 and tanδ = 0.002” (defined as a custom material; it tells you what it assumed)

Every result goes through the same model check as ▶ Start before it is applied; if there are errors the assistant sees them and fixes itself. Each change shows up as a card with ▶ Simulate, Show in builder and ↶ Undo (also ⌘/Ctrl+Z). It answers in the language you write in.

Accessibility

  • Fully keyboard-operable: ⌘/Ctrl+J opens the panel and focuses the input; Enter sends; ⇧+Enter adds a line; Esc closes it and returns focus to the button.
  • The conversation is a live region: screen readers announce new answers and status changes (“structure built”, errors).
  • All controls have accessible names and a visible focus ring; text colors meet WCAG AA contrast (≥ 4.5:1).
  • Closing the panel keeps the conversation; New chat starts over.
Note. The assistant uses the paid Google Gemini API, called from our server, and only runs if it is enabled on this site and you have given your consent in the panel (see the privacy policy). Your messages and the current design (geometry and parameters) are sent so the model can modify it, nothing else; Google processes them as a service provider and does not use them for training. Do not type personal or confidential data. Requests are rate-limited; the panel tells you when a limit is reached.

Unit-cell builder

Select Unit Cell in the tree (or Unit cell in the Home tab). The whole model is generated from here; dimensions are bound to parameters, so any of them can be swept.

Lattice

TypeSimulated cellTypical use
▢ Squarep × pMost FSS and reflectarrays.
▭ Rect.px × py (creates its own py parameter)Anisotropic cells, long slots.
⬡ Hexagonala × √3·a with two elements (center + corners)Triangular lattices: better angular stability, tripoles. An exact representation.

Lateral walls

  • Periodic (Floquet): infinite array; computes co- and cross-polarization. Default.
  • E/H walls: symmetry walls (PEC normal to E, PMC normal to H), the classic “TEM waveguide”. Valid only for doubly mirror-symmetric cells; it suppresses cross-polarization by construction.

Backing and air space

Open (T + R) leaves both faces open (transmission and reflection). PEC (R only) adds an infinite metal plane below: reflection only, illuminated from above. air space is the air added above and below the stack; it must leave room for the source and the measurement planes, an error tells you if it is too small.

Layer stack (bottom to top)

  • + Dielectric: a slab filling the cell, with material and thickness.
  • + Pattern: a layer with an element. With thickness 0 it is a sheet at the interface (printed metal, resistive film, graphene). With thickness > 0 it is extruded (dielectric pillars, thick metal) and can have a fill material around it.
  • + Ground: a full metal sheet at the base.

The side diagram is clickable; use ▲ ▼ to reorder and ✕ to delete. The top view draws exactly what the solver sees in the selected layer; the dashed line is the periodic boundary.

Tip. Turn on Array in the View tab to see the neighbor cells and check that the element fits the lattice, especially for hexagonal lattices.

Element catalog

All elements support rotation (degrees, counter-clockwise), offset (x, y) and complementary mode (metal screen with the element cut out, Babinet: slots, apertures, fishnet). Default dimensions scale with the period.

ElementParametersUse
Full sheet-Ground plane or continuous resistive sheet.
Rectangular patch / dipolea, bReflectarray patch; with b ≪ a, a dipole or bar.
Circular patch / pillarrDisk, or dielectric pillar (with thickness).
Square loopa, b, wBand-stop FSS, absorbers.
Circular ringr, wRing resonator.
Crossl, wDual polarization.
Jerusalem crossl, w, c, tMiniaturized FSS (end-loaded capacitance).
Split-ring (square)a, w, gMagnetic resonance, chirality.
Split ring (circular)r, w, gC shape.
Double split-ringa, w, s, gPendry SRR with opposite gaps.
Tripolel, w120° arms, ideal in a hexagonal lattice.
V-antennal, w, ΔPhase-gradient metasurfaces.
Custom polygonvertices (u, v)Any polygonal shape.

Parameters and expressions

Any dimension accepts a number or an expression using parameters from Parameter List, e.g. patch_L / 2 or c0 / (f_max*1e9) / 20. Parameters may depend on each other in any order; cycles are detected.

ItemAvailable
Operators+ − * / % ^ (also **) and parentheses
Functionssin cos tan asin acos atan atan2 sinh cosh tanh sqrt exp log ln log10 abs min max pow floor ceil round deg rad
Constantspi e c0 mu0 eps0 eta0 (SI)

In the builder, a field bound to a parameter shows its name in a blue tag: editing it changes the parameter, so it is available for sweeps. The evaluated value appears to the right of each field; a ⚠ marks an error (hover for the reason).

Units: lengths in mm, µm, nm, cm or m and frequencies in MHz, GHz or THz, per project (see the status bar).

Materials

Open Materials in the Home tab, or the 📚 button next to a layer's material to assign one directly.

GHz–THz catalog

About 60 materials, each with its source (datasheet or paper): Rogers RO3000/RO4000/RT-duroid, Taconic, Isola, LCP and FR-4 laminates; ceramics and crystals (alumina, sapphire, fused silica, high-resistivity Si, GaAs, diamond, LTCC); polymers (PTFE, HDPE, Kapton, PDMS, PLA/ABS); liquid crystal; metals (incl. Drude metals for THz–IR); graphene; and resistive sheets (ITO, resistive ink, 377 Ω/sq).

refractiveindex.info database

The refractiveindex.info (CC0) tab searches the public-domain database. Each dataset tells you whether it covers your band; selecting it previews ε′, ε″ and tanδ over your range before you import it as a tabulated material. Most data are optical/IR; for THz there are Si, GaAs, Al₂O₃, diamond, water and several polymers.

Importing a table

In Import table paste three columns: frequency, ε′, ε″ (separated by spaces, commas or semicolons; lines starting with # are ignored).

Tabulated data (imported or from refractiveindex.info) are automatically converted to a causal pole model and simulated with true dispersion across the band (see Dispersive materials). “Normal” dielectrics use constant ε′ and tanδ by default, exact at the band center.

In the tree each material shows where it is used; unused ones can be deleted. Library → New material creates a dielectric, a wideband laminate, a pole-based medium or a graphene sheet.

Dispersive materials (ε that varies with frequency)

Huygens simulates dispersive media exactly in the time domain (ADE, auxiliary differential equations): for every pole the engine updates a polarization current alongside the fields, so one broadband run gives the right response at every frequency, including ε′ < 0 (plasmas, metals at THz).

Available models

  • Debye, Δε/(1 + jωτ): relaxation of polar liquids (water, ethanol), tissue, lossy ceramics.
  • Lorentz, Δε·ω0²/(ω0² − ω² + 2jωδ): resonances (phonons, homogenized metamaterials). f0 = resonance, δ = damping.
  • Drude, −ωp²/(ω² − jωγ): free electrons (plasmas, metals at THz–IR, doped semiconductors). fp = plasma frequency, γ = collision rate.
  • Wideband laminate (Djordjevic–Sarkar), from the datasheet εr and tanδ at one frequency: ε′ falls slowly and tanδ stays nearly flat over decades, like real FR-4. Causal (Kramers–Kronig consistent).
  • Graphene, zero-thickness sheet with intraband Kubo conductivity σs = σdc/(1 + jωτ), tunable through the chemical potential μc (gate bias).
  • Measured tables, fitted to a Debye sum (+ Drude if ε′ < 1) by non-negative least squares, which guarantees a causal, passive and stable model. The fit error is shown in the panel, with a warning above 3 %.

How to use it

  1. In Materials → categories Dispersive, Metals (Drude, THz–IR) or 2D materials; or in the Library panel → New material.
  2. Select the material in the tree: edit ε∞, add or remove poles (+ Debye, + Lorentz, + Drude) and see the ε′(f), ε″(f) plot over the project band. The dashed line is the model the solver runs (pole fit, or the constant model if you chose “narrow band”).
  3. For a normal dielectric, switch model to Wideband Djordjevic–Sarkar and enter the frequency at which εr and tanδ are specified.
Note. Validated against the exact Fabry–Pérot formula with complex ε(ω) for Debye, Lorentz and Drude (ε′ < 0) slabs, and against the conducting-sheet formula for graphene: maximum |S| error ≈ 1–1.5 % over 4–16 GHz from a single run.
Caution. A Lorentz resonance far above the band shortens the time step (ω0·Δt ≤ 0.5) and lengthens the run. Drude metals only make sense at THz–IR: at GHz any real metal is effectively a perfect conductor. Graphene interband terms are neglected (valid for f < 2μc/h, ≈ 145 THz at μc = 0.3 eV).

Excitation and Floquet ports

In the builder's Excitation section choose the incidence sides, from top (Zmax) and/or from bottom (Zmin), and the polarizations E ∥ x and/or E ∥ y. Each combination is one GPU run; together they fill the S-matrix. Incidence is normal.

KeyMeaning
SZmax(x),Zmax(x)Co-polar reflection: incident from the top with E∥x, reflected x component.
SZmax(y),Zmax(x)Cross-polar reflection (x→y conversion).
SZmin(x),Zmax(x)Co-polar transmission, top to bottom.
SZmax(x),Zmin(x)Co-polar transmission, bottom to top.

Phases are referenced to the faces of the stack (top and bottom), as with CST Floquet ports with de-embedding. The incident wave comes from an exact 1D reference, so no separate “empty” run is needed.

Tip. The circular basis and geometric phase need both x and y on the same side.

Physics of Floquet ports

A periodic structure (lattice periods Px, Py) lit by a plane wave with tangential wavevector kt = (kx0, ky0) = k0 sin θ (cos φ, sin φ) has, by the Bloch–Floquet theorem, fields that repeat from cell to cell up to a phase:E(x + Px, y, z) = E(x, y, z) · e−j kx0 Px. One unit cell with these phase-shifted (periodic) walls therefore represents the infinite array.

Floquet modes

Above and below the structure the field is a discrete sum of plane waves, the Floquet modes (m, n):

  • tangential wavenumbers kx,m = kx0 + 2πm/Px, ky,n = ky0 + 2πn/Py;
  • normal wavenumber kz,mn = √(k0² − kx,m² − ky,n²): real → the mode propagates (a diffraction order / grating lobe), imaginary → it is evanescent and decays away from the surface;
  • each (m, n) comes in two polarisations, TE (E ⟂ plane of incidence, wave impedance ZTE = η0k0/kz = η0/cos θ) and TM (H ⟂ plane of incidence, ZTM = η0kz/k0 = η0 cos θ).

The fundamental (0, 0) mode is the specular wave. A higher order starts to propagate when P ≥ λ / (1 + sin θ) (in air); from then on part of the power is diffracted into grating lobes.

What a Floquet port is

A Floquet port is a modal port placed on a plane parallel to the structure (Zmin / Zmax). Like a waveguide port it projects the total tangential field onto the Floquet modes and normalises each modal amplitude to power, so |S|² = fraction of incident power carried by each mode:

  • Huygens measures the (0, 0) mode: the area average of Et·e+jkt·r over a plane between the source and the structure (reflection) and behind it (transmission). Higher modes are evanescent there, or propagate and are not reported, the model check warns when the period allows grating lobes.
  • The incident wave is known exactly: at normal incidence from a 1D run on the same z-mesh, at oblique incidence from a vacuum reference run on the same mesh (both reproduce the grid's numerical dispersion, so it cancels in S).
  • S-parameters are de-embedded to the faces of the stack with e±jkzd. Co-polar terms are ratios of tangential E (same impedance on both sides in air); cross-polar TE ↔ TM terms are power-normalised: S = (Et,out/Et,in)·√(Zin/Zout).
  • Port names follow CST: SZmax(y),Zmin(x) = wave out of the Zmax port with E ∥ y, for an x-polarised wave into the Zmin port. At oblique incidence x/y are the tangential E directions (φ = 0°: y = TE, x = TM).

Normal and oblique incidence in the FDTD

At θ = 0 the walls are simply periodic. At θ ≠ 0 the time-domain field cannot carry the complex Bloch phase, so Huygens uses the sin–cos method: two real copies of the field (the real and imaginary parts of u = E·ejkt·r) are updated together and coupled only across the periodic walls by the rotation [cos ktP, sin ktP]. This fixes kt, not θ: within one run the angle changes with frequency, θ(f) = asin(kt c / 2πf). For a fixed angle the app runs a few anchor frequencies (kt exact at each) and interpolates in kt between neighbouring runs.

Below the grazing frequency fc = ktc/2π the (0, 0) mode is evanescent and energy there never leaves the cell, so each run is excited only above fc (≤ −100 dB of source spectrum at fc). E/H symmetry walls (PEC ⟂ E, PMC ⟂ H) are an alternative at normal incidence only, for doubly symmetric cells (no cross-polarisation by construction).

Tip. Rules of thumb: keep the period below λmin/(1 + sin θmax) unless you want grating lobes; leave at least λ/4 of air between the structure and each port plane so the evanescent orders have decayed; compare with CST using Floquet ports with 2 modes and the reference plane moved to the stack face.

Ports and excitations

Open Ports → Port manager / excitation in the tree (or Ports in the Simulation tab). Add, duplicate (⧉) and delete ports, and tick Excite for the ones to drive. Each ticked port is one run in which it is the source and the others are matched loads; together they fill the S-matrix columns, like CST's “selected ports”.

TypeWhen to use itDefinition
Discrete (lumped)Printed lines, point-fed antennas, components.Source with internal impedance Z0 between p1 and p2 (parallel to x, y or z). With face width > 0 it is split into parallel columns, recommended for wide strips. p1 on ground, p2 on the conductor.
Waveguide (TE10)Rectangular guides, filters, transitions, irises, dielectric loads.Fundamental TE10 mode on a rectangular aperture of an open boundary face. The aperture must be bounded by PEC walls and the guide uniform for ~14 cells inwards. S is referenced to the port face and power-normalized (ZTE).
Floquet (plane wave)Periodic unit cells.Normal incidence from Zmin and/or Zmax, x and/or y polarization. Managed by the builder in unit-cell projects.

Floquet ports cannot be mixed with discrete or waveguide ports in one project; discrete and waveguide ports can, as their waves are power-normalized.

Note. Waveguide ports measure the wave on four equally spaced planes with a least-squares fit that solves for β, the incident and the reflected wave at once, robust to numerical dispersion and standing-wave nulls. Below the mode cutoff the S-matrix is left blank.

Model check

Before every run (and in the background while you edit) Huygens checks the model: parameters, frequency band, materials, element dimensions, ports, boundaries, excitation compatibility, mesh size and the full compilation of each run. The Model check tab lists the issues with a suggested fix and a Go to button that opens the item. Errors block the run; warnings do not. Run it on demand with Check in the Home or Simulation tab.

Meshing and simulation

Mesh

The graded hexahedral mesh is automatic: λ/N in every dielectric (lines / λ), a minimum number of cells per geometric feature (cells / feature), a maximum ratio between neighbor cells, and lines snapped to every edge. Edit it under Mesh in the tree (or Mesh settings in the Simulation tab); you can add local refinement boxes.

Narrow slots and strips are found automatically. Every planar metal layer is scanned for slots, gaps and thin strips, including ones that primitive sizes don't reveal (a ring cut from a sheet, rotated arms, gaps between patches). Where the mesh is too coarse, it is refined locally to cells / gap cells across each slot (default 4; metal strips use cells / feature). Messages and the Mesh panel list what was refined. Set cells / gap to 0 to turn this off.

Mesh view shows a cut plane (X, Y or Z, with a slider): mesh lines, the voxel permittivity map (green = dielectric) and the metal as the solver sees it (gold). It is the best way to check that a fine detail is resolved.

Engine and convergence

Auto uses WebGPU when available; CPU reference is an exact mirror of the shader, slower. A run ends when (1) the port signals have decayed below the accuracy (Solver → accuracy, −40 dB by default) and (2) the S-parameters have stopped changing (ΔS < 2·10⁻³). This avoids unphysical results on very sharp resonances. The status bar shows both live; ■ Stop aborts.

Note. If the maximum number of steps is reached without convergence, Messages shows a warning; raise max steps in Solver.

Results

PlotWhat it shows
S-Params (dB)Magnitude of every S-parameter. Null responses (|S| < 10⁻⁶) are hidden and listed.
Phase (unwrapped)Unwrapped phase (no 360° jumps).
Power / absorptionPer incidence: |R|² and |T|², co and cross, and absorption A = 1 − ΣR − ΣT.
Pol. conversionPCR = |R×|²/(|R×|²+|Rco|²), for polarization converters.
Circular basisReflection in the circular basis: helicity-preserving (carries the 2θ geometric phase) and helicity-flipping terms. Needs x and y.
Smith chartNormalized impedance of the reflections (η0 for cells, Z0 for discrete ports).
Port signalsTime signals: incident and outputs per port/mode.
ValidationComparison with imported reference data (see below).

File → Export Touchstone (or Touchstone in Post-Processing) writes a .sNp. For unit cells the ports are the excited modes (Zmin(x)=1, Zmin(y)=2, Zmax(x)=3, Zmax(y)=4) with Z = η0; enable all sides and polarizations for the full matrix.

If you change the model after solving, results are marked stale until you press ▶ Start again.

2D fields

Field Monitors define field planes (E, H or surface current Js) at one frequency. One plane is recorded per run, the one marked record; click another and press Start to record it. Three are created by default: E and Js on the element plane and E on the y = 0 cut.

In the field legend you can ▶ Animate (Re{F·ejωt}), choose the component (|F|, x, y, z) and a linear or dB scale. Values are normalized to a 1 V/m incident wave (or 1 V source for discrete ports). The instantaneous field is shown live while solving.

Parameter sweep

  1. 1
    Open the Parameter Sweep tab → choose the parameter (start and stop default to ×0.5 and ×1.5 of the current value).
  2. 2
    Set the number of points and press ▶ Run sweep. Each point solves every excitation on the GPU.
  3. 3
    Under Library extraction choose the S-parameter and the design frequency.
  4. 4
    The right-hand plot is your library: |S| and unwrapped phase versus the parameter. Export it with Export library CSV.

Typical uses: patch size → phase (reflectarray), rotation → geometric phase (Pancharatnam–Berry cells), pillar radius → transmission phase (dielectric metasurfaces), spacer thickness → absorption.

Templates

TemplateWhat it demonstrates
Reflectarray patchPhase versus patch size (RT/duroid 5880, PEC ground).
Geometric-phase barReflective half-wave plate: rotating the bar by θ adds 2θ of phase in the circular basis.
Polarisation converter45° bar converting x into y on reflection (PCR).
Salisbury absorber377 Ω/sq sheet λ/4 above ground: ≈ 100 % absorption at 10 GHz.
Jerusalem-cross FSSMiniaturized band-stop FSS on RO4350B.
Hexagonal tripole FSSExact triangular lattice through a supercell.
Split-ring resonatorLC magnetic resonance of an SRR on FR-4.
THz Si-pillar metasurfaceSi pillars on fused silica, 0.4–1.4 THz (µm/THz units).
Validation benchmarksMicrostrip line, inset-fed patch antenna, slot FSS and WR-90 waveguide with a slab.

Projects: new, open, save

Everything lives in the File menu (blue button, top left):

  • New project… opens a template gallery (reflectarrays, absorbers, FSS, benchmarks). If you have unsaved changes it asks first.
  • Save (⌘/Ctrl+S, or the disk icon top right) stores the whole project in this browser's library: model, parameters, materials, references, S-parameter results, field plane and sweep. Next to the name you see ✓ saved or ● unsaved changes.
  • Open… lists saved projects (tagged results when they include them) and opens files from disk. Results appear immediately, without re-simulating.
  • Save to file… (⇧+⌘/Ctrl+S) writes a portable .huygens file with all of the above. In Chrome/Edge the file stays linked and later Saves update it; other browsers download it.
  • Export model only (.emproj) saves just the model (readable JSON, good for version control). .emproj files and older (CSTX) projects open too.
  • Rename the project by clicking its name in the center of the top bar.
  • Session: even without saving, reloading the page brings back the model and its results.
  • Undo/redo: the arrows in the top bar or ⌘/Ctrl+Z and ⌘/Ctrl+⇧+Z.
Caution. The library lives in this browser: clearing site data or using a private window loses it. Keep a .huygens file of anything important, or to share it.

Antennas and discrete ports

Besides unit cells, Huygens simulates structures with discrete ports (a resistive source of impedance Z0 between two points, with optional width): microstrip lines, patch antennas… See the Validation benchmarks templates. Geometry is edited as CSG solids (boxes, cylinders, spheres, extrusions with union, subtraction and intersection) under Components; with several ports, All ports fills the full S-matrix.

Validation and accuracy

TestResult
Salisbury absorber vs transmission-line theorycomplex S11 error ≤ 0.012; A > 99 % at 10 GHz
εr = 4 slab vs Fabry–PérotS11 and S21 error ≤ 0.013
Debye / Lorentz / Drude slabs vs exact theory (complex ε)max |ΔS| ≤ 0.015 over 4–16 GHz, one run
Graphene sheet vs sheet-conductance formulamax |Δ|S|| ≈ 0.002
Blind comparison with CST (3 ring cells, default mesh)resonance −0.10 / −0.13 / −0.41 %, max complex |ΔS| ≤ 0.026 (staircase metal: −2.6…−3.7 %)
Oblique incidence: εr = 4 slab at θ = 30° (TE and TM, both planes)max |ΔS| ≤ 0.017 vs exact theory; fixed-angle merge ≤ 0.017; θ → 0 equals normal incidence
Copper film (skin effect) vs sheet-impedance theory|S21| within 0.13 dB, ∠S21 within 4.5° (first order in Δt); copper ring absorbs more than PEC everywhere
Geometric phase (bar rotated 45°)conformal sheets: −90 ± 2° (staircase: −96.6°)
E/H walls vs periodic (symmetric cell)identical (|ΔS| < 10⁻⁵)
50 Ω microstrip|S11| < −20 dB and |S21| > −0.2 dB over 1–10 GHz
WR-90 guide with εr = 2.2 slab vs exact TE10 theoryS11 ≤ 0.007; S21 ≤ 0.025; power conserved; S12 = S21
All templatesconverge and are passive (|S| < 1.01, A > −0.02)
Fuzzing (100 random models)the check never throws; if it accepts a model, the run compiles
GPU vs CPUidentical signals to 10⁻³ of the peak

Validating against CST and other references

Validation is layered: (1) exact theory (the automated tests above), (2) comparison with another solver such as CST or HFSS, (3) mesh convergence and (4) measurements. Huygens includes the tooling for (2)–(4): import a Touchstone file and compare.

How to compare

  1. 1
    Simulate the model in Huygens.
  2. 2
    In 1D Results → Validation (or Compare in Post-Processing) press ⇪ Import reference (.sNp) and pick the file (.s1p, .s2p, .s4p…). The port count comes from the extension.
  3. 3
    Check the port mapping (edit mapping). By default reference port n maps to the order our export uses: discrete/waveguide by number; Floquet as Zmin(x), Zmin(y), Zmax(x), Zmax(y).
  4. 4
    The table gives per trace: max and RMS complex error, dB error, mean phase error, resonance shift and a verdict. Reference curves appear dashed on the S and phase plots.
Verdictmax |ΔS|Resonance shift
excellent< 0.05< 1 %
good< 0.15< 3 %
fair< 0.3< 6 %
poor≥ 0.3≥ 6 %

Protocol for CST Studio Suite

For a fair comparison both models must be the same problem:

  • Geometry and units: same dimensions (copy the values from Parameter List) and units.
  • Materials: same εr and tanδ. On zero-thickness sheets Huygens models copper's skin-effect loss (Solver → conductor loss); use copper in both, or PEC in both. For constant tanδ pick the same dispersion model in CST, or use the wideband / pole models here.
  • Unit cells: in CST, Unit cell boundaries in x/y, Floquet ports Zmin/Zmax with 2 modes (TE(0,0) and TM(0,0)) and the same scan angle θ (plane xz or yz). Check in CST's mode view which mode has E ∥ x and adjust the mapping.
  • Reference planes: Huygens S-parameters refer to the faces of the stack. CST Floquet ports sit at the domain edge: set Distance to reference plane = −(air space) on each port to move the plane to the face. Without it, magnitudes match but phases will not.
  • Waveguides: waveguide ports on the same faces, 1 mode (TE10), no reference-plane shift.
  • Discrete ports: discrete face port with the same Z0 at the same position.
  • Solver: Frequency Domain (recommended for cells) or Time Domain, with adaptive mesh refinement to convergence and the same frequency band.
  • Export: 1D Results → S-Parameters → File → Export → Touchstone, RI or MA format, no impedance renormalization.

Mesh convergence

Export Huygens' Touchstone, raise lines / λ and cells / feature by 50 % in Mesh, re-run and import the first file as the reference. An excellent verdict means the mesh is converged.

Tip. An analytic reference example is available: wr90_slab_theory.s2p, for the 3 · WR-90 Waveguide + Slab template.

Current limitations

  • Oblique incidence only in the xz or yz plane (φ = 0°/90°); fixed angles are interpolated from a few constant-kt runs (cost ≈ 2× per run plus a cheap reference).
  • “Normal” dielectrics with constant tanδ are exact only at the band center; use the wideband or pole models for wide bands.
  • Conductor loss is modelled on zero-thickness metal sheets (surface impedance; single E per edge, so a current on one face only needs current faces = 1); thick metal solids are lossless PEC.
  • Zero-thickness metal sheets are conformal (sub-cell); thick metal solids and dielectric interfaces are still staircased. Conformal sheets may lower the time step (shown in the log).
  • One field plane per run; no far field or RCS.
  • No STL/STEP import, no accounts or cloud projects.

Troubleshooting

SymptomWhat to do
“WebGPU unavailable” in the top barUse an up-to-date Chrome/Edge or Safari 26+ with hardware acceleration on. Meanwhile the (slower) CPU engine works.
“Not enough add-space…”Increase air space in the builder: the source and measurement planes need room above and below the stack.
“max steps reached”Raise max steps in Solver; very sharp resonances take long to decay.
A fine detail is missingTurn on Mesh view on that layer; raise cells / feature or add a refinement box.
Results marked “stale”You changed the model after solving: press Start.
A panel shows “hit an error”Press Reload panel; your project is safe. Please report what you clicked.
⚠ on a fieldHover it: usually a missing parameter or a circular dependency.

Keyboard shortcuts

ShortcutAction
⌘/Ctrl + SSave the project (with results)
⌘/Ctrl + ⇧ + SSave to a .huygens file
⌘/Ctrl + OOpen a project
⌘/Ctrl + J or Alt + ⇧ + AOpen/close the design assistant
⌘/Ctrl + ZUndo
⌘/Ctrl + ⇧ + Z or Ctrl + YRedo
EnterCommit a field
EscCancel editing a field, close a menu, dialog or the material library

Glossary

TermDefinition
Unit cellSmallest period of a periodic surface; one is simulated and assumed infinitely repeated.
Floquet portPlane-wave port of a periodic structure; here the fundamental TEM mode at normal incidence.
Co / cross-polarScattered field component parallel / perpendicular to the incident polarization.
PCRPolarization conversion ratio: fraction of reflected power that changes polarization.
Geometric (PB) phaseThe 2θ phase a circular wave picks up when an anisotropic element is rotated by θ.
ADEAuxiliary differential equation: time-domain update of a dispersive polarization current.
FDTDFinite-difference time-domain on the Yee lattice.
CPMLConvolutional perfectly matched layer that emulates open space.
PEC / PMCPerfect electric / magnetic conductor.
Δt / CFLTime step, limited by the smallest cell (Courant criterion).

Huygens is free software, created by D.M.G. de la Sacristana. The name honors Christiaan Huygens: every point on a wavefront re-radiates a secondary wavelet, the principle behind every radiating structure, and exactly what a metasurface engineers.