fasterhenry 0.1.1

Clean-room PEEC inductance/resistance extraction for 3-D conductor geometries — FastHenry's problem class, none of its code
Documentation

fasterhenry

A clean-room, MIT-licensed Rust engine for PEEC (partial-element equivalent circuit) extraction of resistance and inductance of 3-D conductor geometries: spirals, busbars, bond wires, on-chip interconnect. FastHenry's problem class, none of its code.

Status: 0.1, early release. Following semver for 0.x, a minor release (0.2, 0.3, …) may make breaking API changes; patch releases stay compatible. Changes are recorded in CHANGELOG.md.

What it does

  • Geometry → filaments → Z(ω). Nodes and rectangular-section segments are cut into filaments (uniform, surface-graded, or graded to the skin depth at a frequency of interest), assembled into a loop-basis mesh system, and solved for the port impedance matrix over a frequency sweep.
  • Ground planes as meshed conductors, with rectangular holes and graded contact regions under via landings.
  • Coupling truncation: declare which groups of segments couple and skip the mutual inductance of the rest.
  • Two solvers. The default is a dense complex LU, parallel across all cores with SIMD-batched kernels. For large problems, IterativeSystem solves the same system matrix-free: restarted GMRES on a precorrected-FFT (PfftOperator) evaluation of L·x, in near-linear time and memory. SolverChoice::Auto picks between them by size — dense up to DENSE_PATH_MAX_FILAMENTS (10 000 filaments), matrix-free above — and is what the fasterhenry CLI does by default.
  • Validated against independent oracles — PyPEEC and the Greenhouse closed forms on a spiral fixture (inductance within 0.5 %), plus skin-effect and ground-plane references; see docs/validation.md.

Use

[dependencies]
fasterhenry = "0.1"

A 1 mm copper bar with a port across its ends, swept from DC to 1 GHz (SI units throughout):

use fasterhenry::{solve, Discretization, Geometry, Node, Port, SegmentDef, Subdivision};

let mut geometry = Geometry::new();
let a = geometry.add_node(Node::new(0.0, 0.0, 0.0))?;
let b = geometry.add_node(Node::new(1e-3, 0.0, 0.0))?;
geometry.add_segment(SegmentDef::new(a, b, 100e-6, 20e-6, 5.8e7))?;

let result = solve(
    &geometry,
    &[Port::new(a, b)],
    &Discretization::Uniform(Subdivision::new(5, 3)),
    &[0.0, 1e6, 1e9],
)?;
println!("R(DC) = {} Ω", result.resistance(0)[(0, 0)]);
println!("L(1 MHz) = {:?} H", result.inductance(1).map(|l| l[(0, 0)]));

SweepResult serializes to JSON. API documentation: https://docs.rs/fasterhenry. For a command-line tool that reads FastHenry .inp decks, see the fasterhenry-cli crate.

Method

Ruehli's PEEC formulation; the approach of Kamon, Tsuk and White (FASTHENRY: a multipole-accelerated 3-D inductance extraction program, IEEE Trans. MTT 42(9), 1994); Grover/Rosa closed forms for parallel filament partial inductances; numerical quadrature for arbitrary orientation; the precorrected-FFT method of Phillips and White for acceleration. Implemented from the papers, not from any existing program's source.

Stack

Rust (stable), nalgebra + simba/wide for portable SIMD, rayon for parallel matrix fill, num-complex, and rustfft (pure Rust) for the precorrected-FFT operator. No BLAS/LAPACK, no C dependencies, and #![forbid(unsafe_code)].

License

MIT — see LICENSE. Changes are recorded in CHANGELOG.md. Source, issues, and the contribution rules (including the clean-room rule) live at https://github.com/2AMLogic/fasterhenry.