ems
A pure Rust FDTD (finite-difference time-domain) electromagnetic field solver, intended as a replacement for openEMS.
- Clean-room implementation: no openEMS or CSXCAD code was consulted. See CLEANROOM.md. MIT licensed.
- Models come from
csx, the companion CSXCAD-compatible geometry and material crate.emsadds the solver: mesh compilation, time stepping, boundaries, sources, probes, ports, and post-processing. - Goal: run existing openEMS XML models unchanged.
- Edition 2024, MSRV 1.95.
Status: early development (milestone 1 mostly done). The API will still change. See docs/DESIGN.md for the architecture and roadmap.
Quick start
Build a model with csx, describe the solver settings with ems::Fdtd,
run it, and analyse the port:
use BoxShape;
use ;
use *;
let mut model = new;
model.grid.delta_unit = 1e-3; // drawing unit: mm
for a in 0..3
let sub = model.add_property;
model.add_primitive?;
let port = new
.excite
.add_to?; // writes LumpedElement + Excitation + probes into the model
let fdtd = new
.waveform
.boundaries
.end_criteria;
let mut sim = new?;
for w in sim.warnings
let res = sim.run?;
let z_in = port.analyze?.z_in;
Run an existing openEMS XML file (Simulation::from_xml in the API):
cargo run --release --example run_xml -- model.xml [--threads N] [--out DIR]
It prints warnings, progress and the outcome, and writes every probe as
DIR/<name>.csv and every dump as .vtr files. More examples:
cavity, microstrip, patch_antenna, dipole (cargo run --release --example <name>).
Status
| area | implemented | not yet |
|---|---|---|
| mesh | Cartesian rectilinear (non-uniform), solver-aware checks (ems::mesh) |
cylindrical (M4) |
| materials | ε, μ, κ, σ, diagonal anisotropy, weighting, sub-cell averaging (via csx); Drude, Lorentz, Debye (electric and magnetic) |
|
| metal | PEC volumes, sheets and lines; priorities | conducting-sheet model (approximated as PEC), conformal (M4) |
| boundaries | PEC, PMC, Mur, CPML (PML_n) |
periodic (M3) |
| sources | E/H soft/hard excitations with weighting and delay; Gaussian, sine, Dirac, step, custom waveforms | plane waves |
| lumped elements | R, L, C, parallel and series | |
| probes | voltage, current, E/H field; DFT | waveguide probes |
| dumps | E/H time and frequency domain, VTK .vtr |
HDF5, openEMS file layout (M2) |
| ports | lumped port helper, S-parameters, Z_in | MSL / waveguide ports (M2), NF2FF (M3) |
| openEMS XML | Simulation::from_xml, <FDTD> settings, bit-identical round trip |
|
| engine | multithreaded, deterministic for any thread count, energy end criteria | GPU |
Features
| feature | default | description |
|---|---|---|
xml |
yes | run openEMS XML files (via csx/xml) |
Documentation
| document | contents |
|---|---|
| docs/DESIGN.md | architecture, numerical formulation, milestones |
| CLEANROOM.md | rules for contributors (mandatory reading) |
License
MIT. See LICENSE.