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.
- 1Open the app and pick a template in File → New project… (for example Reflectarray patch).
- 2Adjust the geometry in the right-hand Unit Cell Builder or in the Parameter List tab.
- 3Press ▶ Start. A typical cell solves in under a second.
- 4Inspect the results in 1D Results (S-parameters, phase, absorption…) and the field in the 3D view.
- 5Save with ⌘/Ctrl+S: the project is stored with its results. To build a phase library, use the Parameter Sweep tab.
Video tutorial
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.
- 1In File → New project… choose Reflectarray patch: a square patch of side
patch_aon grounded RT/duroid 5880, in a square lattice of periodp= 15 mm. - 2Press ▶ Start. 1D Results shows
SZmax(x),Zmax(x): |S| ≈ 1, because the cell reflects almost everything and only the phase changes. - 3Open the Parameter Sweep tab, choose
patch_a, keep the proposed start/stop (×0.5 … ×1.5) and 9 points, and press ▶ Run sweep. - 4On the left you get |S| versus frequency for every size; on the right the library: amplitude and unwrapped phase versus
patch_aat the (editable) design frequency. - 5Press Export library CSV to take the size → phase table to your array-synthesis tool.
The interface
| # | Area | What it is for |
|---|---|---|
| 1 | Ribbon (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. |
| 2 | Navigation tree | Project structure: unit cell and layers, components (solids), materials, ports, boundaries, mesh, solver, field monitors and 1D/2D results. One click opens its properties. |
| 3 | 3D view | Geometry (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. |
| 4 | Bottom panel | Parameter List (variables), 1D Results (plots), Parameter Sweep (sweeps and libraries), Model check and Messages (log, warnings and errors). |
| 5 | Properties | Editor of the selected item. With the unit cell selected it shows the builder: lattice, walls, layer stack, excitation and top view. |
| 6 | Status bar | Units, 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.
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
| Type | Simulated cell | Typical use |
|---|---|---|
| ▢ Square | p × p | Most FSS and reflectarrays. |
| ▭ Rect. | px × py (creates its own py parameter) | Anisotropic cells, long slots. |
| ⬡ Hexagonal | a × √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.
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.
| Element | Parameters | Use |
|---|---|---|
| Full sheet | - | Ground plane or continuous resistive sheet. |
| Rectangular patch / dipole | a, b | Reflectarray patch; with b ≪ a, a dipole or bar. |
| Circular patch / pillar | r | Disk, or dielectric pillar (with thickness). |
| Square loop | a, b, w | Band-stop FSS, absorbers. |
| Circular ring | r, w | Ring resonator. |
| Cross | l, w | Dual polarization. |
| Jerusalem cross | l, w, c, t | Miniaturized FSS (end-loaded capacitance). |
| Split-ring (square) | a, w, g | Magnetic resonance, chirality. |
| Split ring (circular) | r, w, g | C shape. |
| Double split-ring | a, w, s, g | Pendry SRR with opposite gaps. |
| Tripole | l, w | 120° arms, ideal in a hexagonal lattice. |
| V-antenna | l, w, Δ | Phase-gradient metasurfaces. |
| Custom polygon | vertices (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.
| Item | Available |
|---|---|
| Operators | + − * / % ^ (also **) and parentheses |
| Functions | sin cos tan asin acos atan atan2 sinh cosh tanh sqrt exp log ln log10 abs min max pow floor ceil round deg rad |
| Constants | pi 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
- In Materials → categories Dispersive, Metals (Drude, THz–IR) or 2D materials; or in the Library panel → New material.
- 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”).
- For a normal dielectric, switch model to Wideband Djordjevic–Sarkar and enter the frequency at which εr and tanδ are specified.
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.
| Key | Meaning |
|---|---|
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.
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).
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”.
| Type | When to use it | Definition |
|---|---|---|
| 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.
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.
max steps in Solver.Results
| Plot | What 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 / absorption | Per incidence: |R|² and |T|², co and cross, and absorption A = 1 − ΣR − ΣT. |
| Pol. conversion | PCR = |R×|²/(|R×|²+|Rco|²), for polarization converters. |
| Circular basis | Reflection in the circular basis: helicity-preserving (carries the 2θ geometric phase) and helicity-flipping terms. Needs x and y. |
| Smith chart | Normalized impedance of the reflections (η0 for cells, Z0 for discrete ports). |
| Port signals | Time signals: incident and outputs per port/mode. |
| Validation | Comparison 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
- 1Open the Parameter Sweep tab → choose the parameter (start and stop default to ×0.5 and ×1.5 of the current value).
- 2Set the number of points and press ▶ Run sweep. Each point solves every excitation on the GPU.
- 3Under Library extraction choose the S-parameter and the design frequency.
- 4The 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
| Template | What it demonstrates |
|---|---|
| Reflectarray patch | Phase versus patch size (RT/duroid 5880, PEC ground). |
| Geometric-phase bar | Reflective half-wave plate: rotating the bar by θ adds 2θ of phase in the circular basis. |
| Polarisation converter | 45° bar converting x into y on reflection (PCR). |
| Salisbury absorber | 377 Ω/sq sheet λ/4 above ground: ≈ 100 % absorption at 10 GHz. |
| Jerusalem-cross FSS | Miniaturized band-stop FSS on RO4350B. |
| Hexagonal tripole FSS | Exact triangular lattice through a supercell. |
| Split-ring resonator | LC magnetic resonance of an SRR on FR-4. |
| THz Si-pillar metasurface | Si pillars on fused silica, 0.4–1.4 THz (µm/THz units). |
| Validation benchmarks | Microstrip 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
.huygensfile 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).
.emprojfiles 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.
.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
| Test | Result |
|---|---|
| Salisbury absorber vs transmission-line theory | complex S11 error ≤ 0.012; A > 99 % at 10 GHz |
| εr = 4 slab vs Fabry–Pérot | S11 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 formula | max |Δ|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 theory | S11 ≤ 0.007; S21 ≤ 0.025; power conserved; S12 = S21 |
| All templates | converge 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 CPU | identical 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
- 1Simulate the model in Huygens.
- 2In 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.
- 3Check 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).
- 4The 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.
| Verdict | max |Δ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.
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
| Symptom | What to do |
|---|---|
| “WebGPU unavailable” in the top bar | Use 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 missing | Turn 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 field | Hover it: usually a missing parameter or a circular dependency. |
Keyboard shortcuts
| Shortcut | Action |
|---|---|
| ⌘/Ctrl + S | Save the project (with results) |
| ⌘/Ctrl + ⇧ + S | Save to a .huygens file |
| ⌘/Ctrl + O | Open a project |
| ⌘/Ctrl + J or Alt + ⇧ + A | Open/close the design assistant |
| ⌘/Ctrl + Z | Undo |
| ⌘/Ctrl + ⇧ + Z or Ctrl + Y | Redo |
| Enter | Commit a field |
| Esc | Cancel editing a field, close a menu, dialog or the material library |
Glossary
| Term | Definition |
|---|---|
| Unit cell | Smallest period of a periodic surface; one is simulated and assumed infinitely repeated. |
| Floquet port | Plane-wave port of a periodic structure; here the fundamental TEM mode at normal incidence. |
| Co / cross-polar | Scattered field component parallel / perpendicular to the incident polarization. |
| PCR | Polarization conversion ratio: fraction of reflected power that changes polarization. |
| Geometric (PB) phase | The 2θ phase a circular wave picks up when an anisotropic element is rotated by θ. |
| ADE | Auxiliary differential equation: time-domain update of a dispersive polarization current. |
| FDTD | Finite-difference time-domain on the Yee lattice. |
| CPML | Convolutional perfectly matched layer that emulates open space. |
| PEC / PMC | Perfect electric / magnetic conductor. |
| Δt / CFL | Time 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.