FAQ¶
Two dozen questions, answered straight. Click to expand.
Scope & philosophy¶
1 · What problems is Ikarus actually for?
Frequency-domain electromagnetics of structures periodic in two transverse directions and layered along z: gratings, metasurfaces, photonic-crystal slabs, thin-film stacks, Bragg mirrors. You get per-order efficiencies, complex amplitudes, phase, exit angles and real-space fields.
2 · And what is not a good fit?
Isolated (non-periodic) scatterers, continuously-varying-in-z topographies that resist layer slicing, time-domain/pulse physics, and full anisotropy. Not Ikarus's fault — not RCWA's domain (Theory → Limitations).
3 · What units does Ikarus use?
SI, uncompromisingly: meters for every length, degrees for every
angle. 200e-9, not 200.
4 · What's the time/sign convention?
Physics \(\exp(-i\omega t)\): absorbers have \(k>0\), \(\mathrm{Im}(\varepsilon) > 0\). Feed it gain-signed data and the energy balance exceeds 1 — that's your smoke detector.
Numerics¶
5 · How do I choose n_orders?
Start 8–12 for dielectric metasurfaces, more for metals/TM, then run the
convergence ritual — or
let simulate(auto_converge="once") decide. Cost is \(\mathcal{O}(M^6)\)
in 2-D, so don't dial it up "to be safe".
6 · resolution vs. n_orders — what's the difference?
resolution draws the geometry (real-space pixels); n_orders resolves
the field (Fourier harmonics — the accuracy dial). resolution is
auto-raised to ≥ 4*n_orders+1, so usually you only think about n_orders.
7 · Why isn't R + T exactly 1?
Three cases. (a) Absorbing material → R+T < 1, the rest is
absorptance — physics. (b) Slightly above 1 → unconverged; raise
n_orders. (c) Wildly above 1 → numerical breakdown; lower
n_orders or raise resolution. Ikarus warns on (b) and (c)
automatically.
8 · How do I get just the specular order?
result.T_orders[result.order_index(0, 0)] (same for R_orders).
The totals sum over all propagating orders.
9 · How do I set up a 1-D grating properly?
(Nx, 2) topology + n_orders=(M, 0) —
Lesson 2. 1-D physics at a 1-D price; a 2-D
expansion of a 1-D grating is the classic accidental slowdown.
Polarization & phase¶
10 · What exactly does linear_pol_angle mean?
Degrees from TE: 0 = TE/s, 90 = TM/p. At normal incidence it's the
literal E-field angle in the xy-plane (0 → +y, 90 → +x).
11 · How is circular polarization reported?
As {"co", "cross"} dicts of complex amplitudes (same/opposite
handedness), normalized so \(|co|^2 + |cross|^2\) is the zero-order
efficiency. Square magnitudes for power; np.angle for phase.
Lesson 5 has the guided tour.
12 · Can I get the transmitted/reflected phase?
result.T_phase / result.R_phase (radians, zero order). Mind the
convention when comparing across tools — see the next question.
13 · My phase disagrees with another RCWA code by a constant!
Working as intended. Time-sign and reference-plane conventions differ between tools; expect a sign flip and/or constant offset. In our grcwa cross-check the offset was a constant ≈ −π while the dispersion agreed to ~21 mrad. Compare dispersions, not absolutes.
Materials¶
14 · How do I add a custom material?
Four ways, by commitment level: a bare number inline (constant index),
MaterialLibrary.add_from_file
from CSV (λ_nm n [k]), a Lorentz-model JSON, or the
ikarus-add-material CLI for a
permanent entry.
15 · What if my band extends past the tabulated data?
Interpolation is cubic-spline inside the table; outside, values are clamped to the nearest endpoint — no divergence, but also no accuracy. Check the table's coverage before sweeping wide.
16 · Which materials ship in the box?
Air, Au, GaN, GaP, Si, Si₃N₄, SiO₂, TiO₂, aSi —
default_library.available() to confirm; default_library.get("Si",
1.55e-6) for the index.
Capabilities¶
17 · Does Ikarus run on the GPU?
No — pure NumPy/SciPy CPU. Before mourning: pin BLAS to one thread and parallelize across processes (Need for Speed); for typical metaatom sizes that's worth more than a GPU port.
18 · Are there gradients for optimization?
No analytic/AD gradients. The built-in inverse design is
gradient-free (GA / NSGA-III), and MetaAtom is a clean interface for any
other black-box optimizer.
19 · Anisotropic materials?
Not yet — isotropic only. Full 3×3 tensors are on the roadmap.
20 · How do I look at the near field?
rcwa.get_fields(plane="xz"|"yz"|"xy", ...) →
FieldMaps → plot_field(...), with the
structure outline overlaid automatically.
Lesson 3 demonstrates.
Workflow¶
21 · How do I save and reload results?
rcwa.save_results("run.h5", include=[...]) → self-describing HDF5;
RCWA.load_results("run.h5") → dict. Needs the io extra (h5py).
22 · What's the fast way to sweep?
One RCWA, many set_source(...) calls — it retains unspecified fields.
Only geometry changes force a new eigensolve.
Lesson 4 is the masterclass.
23 · Why is the PyPI name ikarus-rcwa but the import ikarus?
A stranger got to the short name on PyPI first. pip install ikarus-rcwa,
then import ikarus. The myth survives the namespace collision.
24 · How do I cite Ikarus?
BibTeX and guidance on the Citation page.