FDE¶
Backend lightsmith-fde (method fde, modules lightsmith.backends.fde and lightsmith.backends._fde).
A full-vector finite-difference eigenmode solver for waveguide cross-sections,
straight or bent. The EME and FDFD solvers reuse it for port modes.
Method¶
- Formulation. The transverse E field on a 2D Yee grid (Zhu & Brown 2002). It solves (QP)E = n²E.
- Interfaces. Subpixel permittivity averaging: cells cut by an interface are supersampled. The
default
anisotropicscheme takes the harmonic mean along each E component and the arithmetic mean across it. - Boundaries. Walls are PEC, or a PML implemented as complex coordinate stretching. Mirror planes can be PEC or PMC.
- Bends (about y). The exact conformal-map transformation: ε' = ε·diag(h, h, 1/h) and μ' = diag(h, h, 1/h), with h = 1 + (x − x_c)/R.
- Eigensolver. Shift-invert Arnoldi (SciPy
spluplus ARPACK) aroundtarget_neff². - Group index. A perturbation formula that includes material dispersion, or a central finite difference in wavelength.
- Slabs.
window_size_nm[1] == 0gives a slab (1D) problem. - Normalisation. Fields are normalised to unit power, ½ Re∫E×H*·z dA = 1.
Options¶
options["fde"] or options["lightsmith-fde"].
| Option | Default | Meaning |
|---|---|---|
grid_spacing_nm |
None |
Grid step, as one value or (x, y). Default: the smaller of λ_min/(n_max · points_per_wavelength) and the smallest feature / cells_per_feature. |
points_per_wavelength |
20 |
Used for the default spacing |
cells_per_feature |
8 |
Used for the default spacing |
subpixel |
"anisotropic" |
"anisotropic", "volume" or "none" |
subsamples |
32 |
Samples per axis in cut cells |
boundary |
"auto" |
"auto" means PML for bends and PEC otherwise; "pec" or "pml" force one |
pml_cells |
12 |
PML thickness |
pml_reflection |
1e-6 |
Target normal-incidence reflection of the PML |
symmetry |
("none", "none") |
Mirror planes through the window centre, normal to x and to y: "none", "pec" or "pmc" |
polarization |
"any" |
"te" keeps modes with te_fraction > 0.5 (dominant Ex); "tm" keeps those below |
group_index |
"auto" |
"perturbation", "finite_difference" or "none". "auto" uses the perturbation formula without a PML and the finite difference with one. |
track_modes |
False |
Order modes at each wavelength by overlap with the previous wavelength |
bend_reference_x_nm |
None |
The x position at which the bend radius is measured. Default: the window centre. |
max_cells |
1000000 |
Refuse larger grids |
The solver runs on the CPU. There are no gradients.
Slab polarisation naming
For a slab normal to x, te_fraction is the share of Ex. The physical slab TE mode (Ey) is therefore
selected with polarization="tm".
Validation¶
All tests are in tests/test_fde.py.
| Test | Reference | Tolerance |
|---|---|---|
test_slab_matches_dispersion_relation (TE and TM): n = 2.0/1.45, d = 600 nm |
analytic slab dispersion relation | < 1e-4 at dx = 2.5 nm; second-order convergence |
test_slab_group_index_matches_analytic_derivative |
analytic dispersion derivative | 2e-4 |
test_step_index_fibre_he11: n = 1.50/1.45, a = 1.5 µm |
exact vector HE11 eigenvalue equation (Snyder & Love) | 2e-6 |
test_si_strip_te0_and_grid_convergence: 500 × 220 nm Si strip in SiO2, 1550 nm |
published neff 2.44523 | < 1e-3 at dx = 10 nm; 3.9 < ng < 4.2 |
test_si_strip_fine_grid (slow): dx = 5 nm |
neff 2.44523 | 3e-4 |
test_symmetry_matches_full_window_and_group_index_methods_agree |
full window; the other group-index method | 1e-9; 2e-3 |
test_bend_loss_decreases_with_radius: slab bend, R = 2–5 µm |
exponential trend in R | strictly decreasing; log-linear fit residual < 0.3 |
test_port_modes_match_mode_problem |
ModeProblem |
1e-6 |
Limits¶
- Bends only about the y axis, and no x-symmetry plane in a bend.
- Material dispersion enters only through the group index; materials are evaluated at each wavelength.
- Raises an error above
max_cells: increasegrid_spacing_nm, usesymmetry, or raise the cap. - Warnings:
- fewer modes found than requested;
- a mode is not guided (neff ≤ the background index);
- more than 20 % of |E|² is in the PML.