Benchmark
Thin-Film Coating Simulator — benchmark
Every case we check the transfer-matrix engine against: the closed form or the published value, our number, the deviation printed as it is, and a link that opens the same calculation in the simulator.
19 benchmark cases. Every input, every reference, every link.
- Analytic closed forms:
- worst deviation 1.0 × 10⁻¹⁷ in reflectance (7 cases)
- Independent code (Byrnes tmm 0.2.0):
- worst deviation 1.8 × 10⁻¹⁴ over 4,500 spectral points (9 comparisons)
- Published data:
- SCHOTT N-BK7 catalogue index reproduced to 3.5 × 10⁻⁸
- Published literature:
- five published reflector designs rebuilt from their design formula — layer count exact 5/5, total optical thickness within 0.031 %
A 7-pair TiO₂/SiO₂ quarter-wave mirror at 550 nm.
Textbook: Y = (n_H/n_L)^14 · n_s
= (2.647935017326822 / 1.4599108864687285)^14 × 1.5185223876207927 = 6332.203461824502
R = ((1 − Y)/(1 + Y))² = 0.9993685078282724
Photizon: 0.9993685078282724 — identical to the last printed digit.
What "agreement" means here
Every row carries a tolerance class, printed as a short tag, so you know what agreement means before reading the number. Four classes, and nothing ships in class T4.
| Class | Meaning | What the printed Δ is limited by | Used by |
|---|---|---|---|
| T1 — exact identity | The reference and the engine must agree to the last bit; any nonzero Δ is float64 rounding. | Accumulated round-off in the matrix product (grows with layer count: 2×10⁻¹⁶ at 4 layers, 1.8×10⁻¹⁴ at 14). | A1, A2, A3, A6, A7, all of B |
| T2 — analytic value from the same index data | The closed form is exact but is evaluated with the same n(λ) the engine uses, so this tests the numerics, not the material model. | Same as T1, plus the conditioning of the closed form. | A2, A3, A5, A6 |
| T3 — physical law with a named model gap | Agreement is not to machine precision and we say why, with the size of the gap and its cause. | The named physical effect. | A5 (FSR vs n_g: −0.078 %), A7 (Ta₂O₅ absentee: 5.3×10⁻⁵, caused by k = 2.1×10⁻⁵) |
| T4 — reference not verified at source | Nothing ships in this class. | — | — |
A dash in the class column means the source assigns no tolerance class to that row — the literature cases that compare against a published estimator rather than an exact value.
Every case at a glance
26 rows across 19 cases and five kinds of reference. 21 of them open in the simulator with one click, signed out, with the exact stack the row was measured on. Deviations are printed as they are, not rounded into an adjective.
| Case | What it is | What it tests | Reference class | Reference | Photizon | |Δ| | |
|---|---|---|---|---|---|---|---|
| A — Analytic closed forms | |||||||
| A1 | Fresnel single interface, 550 nm | interface, dispersion | T1 closed form | 0.04238804559477586 | 0.04238804559477586 | 0.0 | Open |
| A1′ | Index-matched layer is invisible | invariance | T1 invariance | (no change) | (no change) | 2.8 × 10⁻¹⁷ over 3 thicknesses | Open |
| A2 | (TiO₂/SiO₂)⁷ QW mirror, 550 nm | multilayer product | T1/T2 closed form | 0.9993685078282724 | 0.9993685078282724 | 0.0 | Open |
| A2′ | Same, N = 2 / 5 / 10 | accumulation | T1/T2 closed form | see the case | see the case | ≤ 2.2 × 10⁻¹⁶ | Open |
| A3 | MgF₂ QW AR minimum, 550 nm | AR condition | T1/T2 closed form | 0.012468763406465739 | 0.012468763406465728 | 1.0 × 10⁻¹⁷ | Open |
| A4 | Brewster zero at 56°, p-pol | polarization, angle, Snell | T1 closed form | λ_B = 320.7923776919618 nm, R_p = 0 | same λ, R_p < 10⁻³² | 0.0 pm | Open |
| A5a | Si etalon, Airy pointwise | multi-beam interference | T1/T2 closed form | Airy | engine | 2.8 × 10⁻¹⁴ (500 pts) | Open |
| A5b | Si etalon resonances T = 1 | phase over 40 orders | T1 closed form | 1 exactly | T = 1 to the last bit at all 12 (R < 10⁻²⁶) | max |1 − T| = 0.0 | Open |
| A5c | FSR from the group index | dispersion of the FSR | T3 closed form | 33.8698 nm | 33.8963 nm | −0.078 % | Open |
| A5d | FSR from the phase index (the wrong way) | — | T3 closed form | 35.1122 nm | 33.8963 nm | +3.59 % | Open |
| A6 | Opaque Ag, J&C node 756 nm | metals, complex index | T1/T2 closed form | 0.9957952959452914 | 0.9957952959452916 | 2.2 × 10⁻¹⁶ | Open |
| A6′ | Ag T over 50 → 500 nm | numerical stability | T1 closed form | exponential | 1.0 × 10⁻² → 9.4 × 10⁻²⁰ | clean over 18 decades | Open |
| A7 | Half-wave absentee × 9 | invariance | T1 invariance | (no change) | (no change) | 0.0 exactly | Open |
| A7′ | Absorbing half-wave (Ta₂O₅) | k resolution | T3 invariance | not absentee | Δ = 5.26 × 10⁻⁵ | (physical) | Open |
| B — Independent code | |||||||
| B1 | Ag-in-stack, 40°/70°, s & p | oblique + absorption | T1 tmm 0.2.0 | Byrnes | Photizon | ≤ 1.9 × 10⁻¹⁵ | Open |
| B2 | 14-layer QW, 0° & 45° | accumulation | T1 tmm 0.2.0 | Byrnes | Photizon | ≤ 2.0 × 10⁻¹⁴ | Open |
| B3 | Coherent / incoherent / coherent | Katsidis-Siapkas vs inc_tmm | T1 tmm 0.2.0 | Byrnes | Photizon | ≤ 2.6 × 10⁻¹⁵ | Open |
| B4 | 400 nm coating on a 160 µm slab | real-sample geometry | T1 tmm 0.2.0 | Byrnes | Photizon | ≤ 1.3 × 10⁻¹⁵ | Open |
| C — Published data | |||||||
| C1 | SCHOTT N-BK7 n_d / n_e / ν_d | material model | T2 published | 1.51680 / 1.51872 / 64.17 | 1.5168000345 / 1.5187219715 / 64.1673 | ≤ 3.5 × 10⁻⁸ (index) | no link |
| C2 | Johnson & Christy Ag table nodes | data provenance | T2 published | (0.03, 5.242) / (0.04, 7.795) | identical | 0.0 | Open |
| L — Published literature | |||||||
| L1 | Five wideband reflectors, Tikhonravov & Trubetskov 2012 Table 2 | design formula, 73–85 layers | T3 published table | N 73/83/85/83/82; TOT; R_min 99.80–99.94 % | N exact 5/5; TOT within 0.031 % | R_min −0.013 to +0.065 pp | no link |
| L2-a | Macleod p. 146 — four printed claims | absentee theorem + printed R | T1 / T2 textbook | absentee; 1.26 %; 0.38 %; "virtually zero" | 0.0 exactly; 1.260079 %; 0.376479 %; 0.000237 % | see the case | no link |
| L5 | Achievable broadband-AR envelopes (two independent papers) | the optimizer, not the TMM | — published estimators | 0.26982611286150426 % / 0.27240968739155025 % | 0.2965467215991829 % | +9.9 % / +8.9 % above | no link |
| L2-b | Macleod Table 4.2 — the Reichert four-layer design | a real patented coating | — textbook table | design centred on 550 nm (text claim, p. 155) | minima midpoint 549.85 nm | 0.15 nm | no link |
| O — Optimizer | |||||||
| O1 | Two-layer V-coat, LM convergence | optimizer vs an analytic root set | T1 analytic root set | a two-branch family | 15 / 15 runs, ≤ 1.8 × 10⁻¹ nm at shipped defaults | R ≤ 9.9 × 10⁻⁷ (1.0 × 10⁻⁶ stopping rule) | Open |
| O2 | Broadband AR preset is a stationary point of its own merit | convergence + the landscape | — independent stationary solve | MF 0.001299261999793193 | MF 0.0012992620232352503 | ≤ 0.0006 nm | Open |
A — Analytic closed forms
All Air incidence, all reproducible by a signed-out visitor today. Every range below was chosen so that the shipped 500-point grid lands on exactly 1.000 nm steps at integer wavelengths, so the wavelength quoted here is a wavelength you can hover. Several scans below deliberately run under a material’s cited window — the 301 nm floor sits below TiO₂’s cited 430–1530 nm, and case A7’s Ta₂O₅ link also starts below that dataset’s 350 nm floor — so those links open with a material-validity advisory. That is expected and correct: an advisory is a validity statement, not a breakage signal.
Fresnel reflectance at a single interface
|Δ| = 0.0 (bit-identical)
Quarter-wave stack maximum reflectance
|Δ| = 0.0 at N = 7; ≤ 2.2 × 10⁻¹⁶ from N = 2 to N = 10
Single-layer quarter-wave AR minimum
|Δ| = 1.0 × 10⁻¹⁷ (8.3 × 10⁻¹⁶ relative)
Brewster's angle — polarization × angle × dispersion
|Δλ| = 0.0 pm; R_p < 10⁻³² at λ_B
Fabry-Pérot etalon — the Airy formula, and the group-index FSR
max |ΔT| = 2.8 × 10⁻¹⁴ over 500 points; FSR −0.078 %
Opaque metal — the Fresnel limit and Beer-Lambert decay
|Δ| = 2.2 × 10⁻¹⁶ at 756 nm; 6.7 × 10⁻¹⁶ at 1088 nm
The half-wave absentee layer — an invariance gate
Deviation exactly 0.0 in all nine lossless insertions
B — Cross-validation against an independent implementation
Nine comparisons across four cases, each over the exact 500-point grid the share link produces — not a convenience grid. A number you cannot see on the plot is not a benchmark.
Reference implementations
- tmm 0.2.0 (released 26 November 2024), by Steven J. Byrnes, MIT licence, pypi.org/project/tmm/. The physics is documented in S. J. Byrnes, Multilayer optical calculations, arXiv:1603.02720. It is the de-facto free reference in this field and the package you are most likely to already have installed.
tmm, so the two run in separate processes, with our source directory explicitly removed from the interpreter path for the reference run. Ignoring that silently compares the engine to itself, which is the most dangerous possible failure mode for a page like this. Our materials layer exports the identical complex n(λ) table to the reference, so the comparison isolates the transfer-matrix algebra and does not double-count the material model.Silver inside the stack, 40° and 70°, both polarizations
max |ΔR| = 1.17 × 10⁻¹⁵ · max |ΔT| = 1.89 × 10⁻¹⁵
What the tool computes
MgF₂ 100 / Ag 15 / TiO₂ 60 on BK7, 400–899 nm.
Measured agreement
| Case | θ, pol | max |ΔR| | max |ΔT| | |
|---|---|---|---|---|
| B1a | 40°, s | 1.17 × 10⁻¹⁵ | 1.89 × 10⁻¹⁵ | Open |
| B1b | 40°, p | 9.44 × 10⁻¹⁶ | 1.89 × 10⁻¹⁵ | Open |
| B1c | 70°, p | 1.11 × 10⁻¹⁵ | 1.22 × 10⁻¹⁵ | Open |
Spot values you can check without running anything (B1a, 40°, s-polarised)
| λ | Photizon R | Byrnes R | Photizon T | Byrnes T |
|---|---|---|---|---|
| 450 nm | 0.5784396189 | 0.5784396189 | 0.4090235331 | 0.4090235331 |
| 650 nm | 0.3910825937 | 0.3910825937 | 0.5978161585 | 0.5978161585 |
| 850 nm | 0.4085056728 | 0.4085056728 | 0.5802531687 | 0.5802531687 |
Why a skeptic should care
A 15 nm silver layer inside the stack at 40° and 70°, in both polarizations. Absorption (R + T = 0.977 at 40°, measured closure gap 2.0 × 10⁻²), oblique incidence and the p-polarised admittance are all live simultaneously. This is where sign conventions on r_p and the complex-cosine branch cut go wrong, and where they would be invisible at normal incidence.
Fourteen layers of matrix product
max |ΔR| = 1.82 × 10⁻¹⁴ · max |ΔT| = 1.95 × 10⁻¹⁴
Coherent / incoherent / coherent — two different formalisms
max |ΔR| = 1.11 × 10⁻¹⁶ · max |ΔT| = 2.33 × 10⁻¹⁵
What the tool computes
MgF₂ 99.75 / BK7 1 mm incoherent / MgF₂ 99.75 in air, 350–849 nm.
Measured agreement
Why a skeptic should care
This is the case a sophisticated skeptic actually probes. Our per-layer incoherent handling is Katsidis-Siapkas — a 2×2 intensity-matrix product between coherent blocks; the reference’s incoherent path is a different formulation of the same physics. That two independent incoherent formalisms agree to 1.1 × 10⁻¹⁶ on a coherent–incoherent–coherent sandwich is a much stronger statement than any coherent-only agreement, because the incoherent path is where implementations genuinely disagree.
A real sample geometry — 400 nm coating on a 160 µm slab
max |ΔR| = 9.44 × 10⁻¹⁶ · max |ΔT| = 1.33 × 10⁻¹⁵
C — Published data
The two cases whose reference is a measurement rather than a formula. They test the material model — the half of the calculation the whole analytic and cross-validation stack takes as given.
SCHOTT N-BK7 catalogue check values
|Δ| ≤ 3.5 × 10⁻⁸ on the index
The reference
SCHOTT’s published N-BK7 data sheet (glass code 517642.251), freely downloadable, prints n_d = 1.51680 (587.5618 nm), n_e = 1.51872 (546.074 nm) and ν_d = 64.17. Our Sellmeier coefficients come from the SCHOTT Zemax catalogue 2017-01-20b; the check values are an independent output of that fit, printed by the manufacturer.
Measured agreement
| Quantity | SCHOTT published | Photizon | |Δ| |
|---|---|---|---|
| n_d (587.5618 nm) | 1.51680 | 1.5168000345005885 | 3.5 × 10⁻⁸ |
| n_e (546.074 nm) | 1.51872 | 1.5187219714708264 | 2.0 × 10⁻⁸ |
| ν_d = (n_d − 1)/(n_F − n_C) | 64.17 | 64.1673362374998 | 2.7 × 10⁻³ (4.1 × 10⁻⁵ rel.) |
Reference values are the manufacturer’s published check values for N-BK7 (SCHOTT AG data sheet, glass code 517642.251). Photizon values computed independently from the shipped Sellmeier fit. The three published values were read from the data sheet header and cross-checked against the RefractiveIndex.INFO SCHOTT page, which independently states n_d 1.5168 and V_d 64.17.
Johnson & Christy noble-metal constants → opaque mirror
Δ = 0.0 — the interpolant is exact at its own nodes
L — Published literature
Designs and results printed in the coating literature, rebuilt from their own published parameters and run through the shipped engine. A literature reproduction tests the model and the data path, so its agreement is orders of magnitude looser than the analytic tier — by design. The analytic tier prints 10⁻¹⁷; the first case below prints 0.013 percentage points. That is not a regression, it is a different and harder question being answered.
Five wideband reflectors from a published design formula
N exact 5/5 · TOT within 0.031 % · R_min −0.013 to +0.065 pp
What the tool computes
All five designs built from the paper’s own design formula and its published coefficients, then run through the shipped engine on the paper’s own grid: 400–900 nm at 0.5 nm, 1001 points, normal incidence, air incidence medium. Materials as the paper states them: n_H = 2.35, n_L = 1.45, substrate n_sub = 1.52, all non-dispersive and lossless. The formula coefficients are quarter-wave optical thickness units at a control wavelength of 500 nm, so a coefficient q on a layer of index n is a physical thickness q · 125 nm / n. A term whose coefficient is zero is omitted.
The design formula and its published coefficients
Outermost (air-side) layer first. Every number below is an input to the rebuild; the layer count beside each design is an output of it, and it is also the published one.
| Design | N (ours) | m₁ | m₂ | m₃ | a₁ | a₂ | a₃ | b₁ | b₂ | b₃ | c₁ | c₂ | c₃ | c₄ | d₁ | d₂ | d₃ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 73 | 11 | 8 | 14 | 0.888 | 1.202 | 1.512 | 0.908 | 1.168 | 1.578 | 1.035 | 1.146 | 0.991 | 2.0 | 0.938 | 1.308 | 0.899 |
| 2 | 83 | 14 | 11 | 13 | 0.906 | 1.208 | 1.604 | ≡ a₁ | ≡ a₂ | ≡ a₃ | 1.070 | 1.489 | ≡ a₂ | 1.982 | 1.752 | 1.282 | 1.918 |
| 3 | 85 | 13 | 12 | 14 | 1.657 | 1.196 | 0.904 | 1.482 | 1.181 | ≡ a₃ | 1.782 | 1.198 | 1.263 | 1.961 | 1.681 | 1.007 | ≡ a₃ |
| 4 | 83 | 12 | 13 | 13 | 0.897 | 1.180 | 1.581 | ≡ a₁ | ≡ a₂ | ≡ a₃ | 0.552 | 2.0 | 1.509 | 0.100 | 0.843 | 1.964 | ≡ a₃ |
| 5 | 82 | 10 | 14 | 14 | 0.894 | 1.179 | 1.573 | ≡ a₁ | ≡ a₂ | ≡ a₃ | 0.966 | 0.932 | 1.494 | ≡ 0 | 0.847 | 0.515 | ≡ a₃ |
Design coefficients from Table 2, “Parameters of Five Wide Band Reflector Designs”, of A. V. Tikhonravov and M. K. Trubetskov, Applied Optics 51(30), 7319–7332 (2012), journal p. 7328, DOI: 10.1364/AO.51.007319. The printed table was read two independent ways — a text extraction and a 300 DPI visual render of the page — which agree on all 19 rows across all five designs. Photizon values computed independently.
Measured agreement
| Design | N pub. | N ours | TOT pub. (nm) | TOT ours (nm) | ΔTOT | R_min pub. | R_min ours | Δ (pp) | R_avg ours |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 73 | 73 | 11285.6 | 11286.6 | +0.009 % | 99.80 % | 99.8133 % | +0.013 | 99.98801 % |
| 2 | 83 | 83 | 13045.3 | 13043.6 | −0.013 % | 99.81 % | 99.7971 % | −0.013 | 99.99653 % |
| 3 | 85 | 85 | 13056.3 | 13054.9 | −0.011 % | 99.94 % | 99.9693 % | +0.029 | 99.99785 % |
| 4 | 83 | 83 | 12732.0 | 12732.9 | +0.007 % | 99.92 % | 99.9352 % | +0.015 | 99.99604 % |
| 5 | 82 | 82 | 12661.8 | 12657.9 | −0.031 % | 99.87 % | 99.9353 % | +0.065 | 99.99628 % |
Reference values (layer count, total optical thickness and minimum reflectance) are from Table 2 of A. V. Tikhonravov and M. K. Trubetskov, “Modern design tools and a new paradigm in optical coating design”, Applied Optics 51(30), 7319–7332 (2012), DOI: 10.1364/AO.51.007319. Photizon values computed independently with the shipped transfer-matrix engine on the paper’s own 0.5 nm, 1001-point grid over 400–900 nm.
Two internal consistency checks on the inputs
- Layer count is an arithmetic identity of the design formula: N = 7 + 2(m₁+m₂+m₃), minus one when c₄ = 0. Evaluated on the published m values this gives 73, 83, 85, 83, 82 — exactly the published layer counts, 5/5, with no fitting.
- Total optical thickness is 125 nm × Σ(coefficients), which reproduces the published totals to ≤ 0.031 % across all five designs — consistent with the 3-decimal rounding of the printed parameters, again with no fitting.
What the agreement is limited by, and the two open items
The published design parameters are printed to 3 decimals and the results to 2. Perturbing every coefficient uniformly within ±0.0005 — half of the last printed digit, 150 draws per design — moves R_min by sd 0.005 pp for design 1 and sd 0.002 pp for design 5, and moves R_avg by under 0.0001 pp. So a few hundredths of a percentage point is the agreement level this case can realistically reach, and any residual smaller than that is not evidence of anything.
Why a skeptic should care
These authors are the originators of needle optimisation and the principals behind the design package the coating industry actually uses. A design given by a closed-form expression with printed numeric parameters, checked against a printed table of numbers, needs no curve digitisation — which removes the single largest error source in any literature reproduction.
A textbook three-layer AR — four printed claims from one page
Absentee difference exactly 0.0; three printed values reproduced at their printed precision
What the tool computes
Macleod introduces this design by observing that an inner half-wave layer is an absentee at λ₀, so the two-layer stack’s peak reflectance in the middle of the low-reflectance region equals that of the single-layer coating. Raising the index of the central quarter-wave layer to 2.0 and then to 2.13 reduces the reflectance at λ₀ twice more. Four independently checkable claims in one paragraph. All designs are all-quarter-wave at λ₀, non-dispersive, lossless, normal incidence, air incidence medium.
Measured agreement
| Claim | Design (air → substrate) | Photizon R(λ₀) | As printed in the book |
|---|---|---|---|
| A half-wave inner layer is an absentee | Air | 1.38 QW | 1.90 HW | Glass 1.52 | 0.012600790214630274 | — |
| …so it equals the single-layer coating | Air | 1.38 QW | Glass 1.52 | 0.012600790214630274 | — |
| Difference between the two | 0.0 exactly | the absentee claim | |
| Peak reflectance of that pair | either of the above | 1.260079 % | 1.26 % |
| …reduced by the higher-index centre | Air | 1.38 | 2.00 | 1.90 | Glass 1.52, all QW | 0.376479 % | 0.38 % |
| …reduced further at index 2.13 | Air | 1.38 | 2.13 | 1.90 | Glass 1.52, all QW | 0.000237 % | "virtually zero" |
Reference design and printed values from H. A. Macleod, Thin-Film Optical Filters, 4th ed., CRC Press / Taylor & Francis (2010), p. 146. Photizon values computed independently with the shipped transfer-matrix engine at normal incidence.
Two independent checks that this is a reproduction and not a coincidence
- Analytic identity. For an all-quarter-wave stack at λ₀, Y = n₁²n₃²/(n₂²n_s) and R = ((n₀−Y)/(n₀+Y))². Evaluated by hand this gives 0.01260079021463029, 0.0037647873741598423 and 2.370862680869589e-06 — the engine agrees to 6.9e-18, −2.6e-18 and 5.8e-19 respectively. That is a different computation from the transfer matrix, so it isolates the layer algebra.
- λ₀-invariance is bit-identical. Rebuilding the 0.38 % design at λ₀ = 400, 550, 1000 and 10 000 nm returns 0.0037647873741598397 at all four — the same float, not four close floats. A quarter-wave design’s on-resonance reflectance must not depend on the reference wavelength, and it does not.
Why a skeptic should care
Its first claim is the half-wave absentee theorem, which is already this page’s strongest case (nine lossless insertions returning a bit-identical number). This gives that invariance a textbook page number.
Two published estimators of the best achievable broadband AR
Our needle optimum sits +9.9 % and +8.9 % above the two envelopes; the envelopes agree with each other to 0.96 %
What the tool computes
The only case on this page that tests the optimizer rather than the transfer-matrix algebra. The problem was chosen to sit inside both papers’ validity grids simultaneously: band 400–800 nm, air incidence, substrate glass n = 1.52, n_L = 1.45, n_H = 2.03, all non-dispersive, normal incidence. Merit: 101 uniform targets on 400–800 nm, R → 0, unpolarized. Optimizer: the shipped needle refinement (max 40 insertions, minimum layer 1.0 nm). Reporting grid: 0.1 nm, 4001 points.
The reference
Two independent published estimators of the average residual reflectance achievable by a two-material broadband AR, restated here in our own typography:
with, in the paper’s own terms: B the longest wavelength in the band divided by the shortest (valid 1.4 to 5.0); L the index of the outermost layer (valid 1.1 to 2.2); T the total optical thickness in waves at the geometric mean of the band edges (valid 1.0 to 9.0); D the highest minus the lowest index among all layers except the last (valid 0.4 to 2.8). Near-normal incidence only; the output is a percentage.
Estimator from Eq. (1) of R. R. Willey, “Predicting achievable design performance of broadband antireflection coatings”, Applied Optics 32(28), 5447–5451 (1993), p. 5448, DOI: 10.1364/AO.32.005447. Photizon values computed independently.
where M is the number of clusters in the design, and R_∞ and b are tabulated per band ratio and index ratio. The cluster optical thickness that turns a total optical thickness into a cluster count M is
Estimator and tabulated parameters from Eqs. (2)–(3) and Tables 2–3 of A. V. Tikhonravov, M. K. Trubetskov, T. V. Amotchkina and J. A. Dobrowolski, “Estimation of the average residual reflectance of broadband antireflection coatings”, Applied Optics 47(13), C124–C130 (2008), DOI: 10.1364/AO.47.00C124. Photizon values computed independently.
Measured agreement
| Quantity | Value |
|---|---|
| Layers found | 19, sequence air→substrate LHLHLHLHLHLHLHLHLHL (outermost = n_L, as both papers require) |
| R_avg over 400–800 nm (ours) | 0.2965467215991829 % |
| R_max (ours) | 0.5669083899517552 % |
| Total optical thickness (ours) | 1697.4921668586087 nm |
| T — waves at 565.685 nm | 3.0007705554919215 |
| M — clusters (TOT / T_c, T_c = 442.64030323049093 nm) | 3.8349245526670748 |
| Willey Eq. (1) at that T, L = 1.45, D = 0.58 | 0.26982611286150426 % |
| Tikhonravov Eq. (3) at that M | 0.27240968739155025 % |
| Tikhonravov R_∞ (M → ∞ floor) | 0.195 % |
| ours / Willey | 1.0990289948378484 |
| ours / Eq. (3) | 1.0886056382163056 |
| ours / R_∞ | 1.520752418457348 |
Three things this establishes. Neither envelope is violated — both formulas estimate the achievable optimum and our best design sits above both, as it must; a result below either would have been a red flag about the engine, the merit or our reading of the formula, and that is the falsifiable part. The two published estimators agree with each other to 0.96 % (0.26983 % vs 0.27241 %) — two different groups, fifteen years apart, one an empirical curve-fit and one a cluster-theory derivation, at the same operating point. And our shipped needle optimizer lands within about 10 % of both, which is a statement about the optimizer that no analytic case on this page can make.
Two assumptions, flagged rather than hidden
- The averaging measure. Neither paper states whether average residual reflectance is averaged uniformly in λ or in wavenumber. We used uniform in λ. For a design with sub-percent ripple across a 2:1 band this is a small effect, but it is unverified.
- Merit vs reported quantity. Our optimizer minimises RMS(R); both papers report the mean of R. The procedures match, but the optimised functional and the reported functional are not the same function.
Reproducing the cluster-thickness formula against its own published table
Before using Eq. (2) we ran it against all eighteen rows of the paper’s own table of cluster thicknesses. Seventeen of the eighteen agree within 0.51 nm (largest of those seventeen: 0.5011674418578878 nm), and one row differs by 8.276 nm. That summary is over the whole table, not over what is shown below.
7 of the 18 rows are shown here — the rows the argument turns on: the six that share ρ_HL = 1.62069 and so bracket the outlier on both sides, plus the row this page’s engine test uses. The outlier is one of the seven.
| Band (nm) | ρ_HL | Eq. (2), computed here (nm) | As printed (nm) | Δ (nm) |
|---|---|---|---|---|
| 400–600 | 1.62069 | 345.66744496123863 | 346 | −0.333 |
| 400–700 | 1.62069 | 403.2786857881117 | 403 | +0.279 |
| 400–900 | 1.62069 | 518.5011674418579 | 518 | +0.501 |
| 400–1000 | 1.62069 | 576.112408268731 | 576 | +0.112 |
| 400–1100 | 1.62069 | 633.7236490956041 | 642 | −8.276 |
| 400–1500 | 1.62069 | 864.1686124030965 | 864 | +0.169 |
| 400–800 (used by the engine test above) | 1.40000 | 442.64030323049093 | 443 | −0.360 |
Printed cluster-thickness values from Table 2 of Tikhonravov, Trubetskov, Amotchkina and Dobrowolski, Applied Optics 47(13), C124–C130 (2008), DOI: 10.1364/AO.47.00C124 — 7 of the table’s 18 rows, being the rows this argument uses. The 17/18-within-0.51 nm statistic above is computed over all eighteen. Photizon values computed independently from Eq. (2) of the same paper.
The one row that does not reproduce, and why we print it
At 400–1100 nm with the index pair printed beside it (ρ_HL = 2.35/1.45 = 1.62069), Eq. (2) gives 633.7236490956041 nm against a printed 642 — a residual of −8.276 nm, while the other seventeen rows sit within 0.51 nm. The residual is internal to the published paper and we cannot resolve it from outside. Two explanations, neither asserted:
- (a) That cell was computed with a different index pair than the one printed beside it. Solving Eq. (2) = 642 at λ_u = 1100 gives ρ = 1.70174791563606, i.e. essentially exactly 1.7 = 2.465/1.45, for which Eq. (2) returns 641.8262507501745 — a −0.174 nm residual, dead-centre in the band the other rows occupy. A 1.45/2.465 row exists in both neighbouring blocks of the same table, so a one-column shift in a source spreadsheet is a mundane and specific mechanism.
- (b) Our reconstruction of Eq. (2) misses a ρ-dependence that only manifests at this point. The paper’s own data disfavours this heavily, and that can be quantified rather than asserted: ρ_HL = 1.62069 appears in six rows bracketing λ_u = 1100 on both sides, so a missing term would have to vanish at λ_u = 600, 700, 900, 1000 and 1500 and equal +8.276 nm at 1100 alone. No smooth function of (λ_u, ρ) behaves that way. We would not bet on this explanation — and we also cannot rule it out from outside, so both go on the record.
A second, weaker signal from the paper’s own data points the same way. For the five other ρ = 1.62069 rows, the experimental column minus the theory column is +26, +17, +2, +14 and +36 nm — all positive, mean +19.0. The 400–1100 row against the printed 642 gives −2 nm, outside that range; against Eq. (2)’s 633.724 it gives +6.276 nm, inside it. Five points is not a strong prior and we do not treat it as one.
We do not “fix” that row by adopting ρ = 1.7. Substituting our arithmetic for a publisher’s data is exactly what our data-integrity rule forbids, and no claim on this page depends on the row: the engine test above runs on the 400–800 row.
The tabulated parameters the estimate uses
| λ_u/λ_l | ρ_HL | ρ_La | R_∞ (%) | b | ln b as printed | ln b computed here |
|---|---|---|---|---|---|---|
| 2 | 1.4 | 1.45 | 0.195 | 3.604 | 1.28 | 1.2820443397460914 |
| 2 | 1.5 | 1.45 | 0.145 | 3.720 | 1.31 | 1.3137236682850553 |
Printed parameters from Table 3 of the same 2008 paper — 2 of the table’s 12 rows: the row the estimate above uses (first) and its neighbour in the index ratio. The ln b column is recomputed here from the printed b and reproduces the printed value 12/12 across the full table, which is what establishes that the b column was read correctly digit for digit. Photizon values computed independently.
Why a skeptic should care
Two independent published estimators of the best achievable broadband AR, from different groups fifteen years apart, agree with each other to 0.96 %, and our optimizer lands about 9 % above both. That is a claim about the tool, not about arithmetic.
A real patented four-layer coating
Design centre reproduces to 0.15 nm
O — Optimizer
Two-layer V-coat converges to an analytically enumerable root set
15 / 15 runs land on the analytic family; how close depends on the stopping rule, not the physics
What the tool computes
A two-layer MgF₂ / Ta₂O₅ anti-reflection coating on BK7, target R = 0 at 532 nm, optimised by the shipped Levenberg-Marquardt refiner against a single-point merit function — a merit a user can build in the optimizer panel’s target table in three clicks.
/thin-film?layers=main/MgF2/Franta:123.0660934743829,main/Ta2O5/Gao:138.34811272910952&sub=BK7&range=400-899&target=532
The reference
Analytic, not “our own merit”. At a single wavelength the two-layer AR problem has a closed solution: setting the recursive Fresnel amplitude r = (r₀₁ + r₁e^2iβ₁)/(1 + r₀₁r₁e^2iβ₁) to zero is two real equations in (d₁, d₂). It was solved with an independent implementation — a recursive Fresnel / Airy recursion sharing no code with the engine’s characteristic-matrix path — at n_MgF₂(532) = 1.384210012165197 (the measured e-beam film entry main/MgF2/Franta), n_Ta₂O₅(532) = 2.16353 + 3.3 × 10⁻⁵i and n_BK7(532) = 1.5194725830654814. The solution is a two-branch family, periodic in each layer by its own half-wave thickness (MgF₂ 192.1673717587982 nm, Ta₂O₅ 122.94722051462193 nm):
| Branch | d(MgF₂) | d(Ta₂O₅) | |r| (independent solver) | R (engine, at that design) |
|---|---|---|---|---|
| I | 69.0983193687416 nm | 107.54610900033335 nm | 7.3 × 10⁻¹⁷ | 5.8086 × 10⁻³² |
| II | 123.06932766464905 nm | 15.400600167543653 nm | 2.9 × 10⁻¹⁷ | 4.2353 × 10⁻³² |
…plus any integer number of half-waves added to either layer. This enumeration is the reference; it is a property of the physics, not of our optimizer.
Measured agreement
Fifteen runs from fifteen starting points: five fixed — (100, 100), (150, 50), (50, 150), (200, 200) and (123.33, 138.00) nm — plus ten uniform-random in [20, 300]² nm from default_rng(20260804).
| Metric | Shipped defaults | convergence_threshold = 1e-11 |
|---|---|---|
| Runs that converged to a member of the analytic family | 15 / 15 | 15 / 15 |
| Worst distance from the returned design to the nearest family member | 1.8 × 10⁻¹ nm | 7.1 × 10⁻³ nm |
| Worst residual reflectance at the returned design | 9.9 × 10⁻⁷ | 2.7 × 10⁻¹¹ |
| Iterations | 2 to 36 | 10 to 43 |
| Wall-clock per run | 1.5 to 43.4 ms | 6.9 to 49.0 ms |
convergence_thresholdof 1 × 10⁻⁶ therefore halts the run the moment R < 10⁻⁶. Tightening it to 1 × 10⁻¹¹ buys two more decades and then stops improving: the floor is the optimizer’s 0.001 nm thickness threshold and its 0.01 nm finite-difference step. At the exact analytic root the engine returns R = 1.0 × 10⁻³¹, so none of this is physics — it is the difference between “converged” and “converged to the precision it was asked for”. convergence_threshold is a field on the optimize API (OptimizeOptions, default 1 × 10⁻⁶); it is not exposed in the optimizer panel, so the left column is what you will reproduce in the browser.Why a skeptic should care
An optimizer is easy to fake: run it, print the merit it reached, declare success. Here the answer is known independently and is not unique, so the test is whether the optimizer lands on the solution manifold from arbitrary starting points — which catches a wrong analytic gradient, a sign error in the Jacobian, and a merit that is subtly not what it claims to be. Load the returned design and read R = 0.0000 % at 532 nm on the plot.
The shipped broadband-AR preset is a stationary point of its own merit
LM lands 0.0006 nm from an independent stationary solve
Local refinement is not global search, measured
On the 400–800 nm broadband-AR problem of case L5, plain Levenberg-Marquardt from random starts is much worse than needle synthesis, and it gets worse as layers are added — the opposite of what a naive reader expects.
| Method | N | R_avg over 400–800 nm |
|---|---|---|
| Needle, 10 insertions | 19 | 0.29655 % |
| LM, best of 8 random starts | 6 | 0.60645 % |
| LM, best of 8 random starts | 10 | 0.48823 % |
| LM, best of 8 random starts | 14 | 1.46459 % |
| LM, best of 8 random starts | 20 | 1.22699 % |
At the higher index contrast (n_L = 1.45, n_H = 2.465) random-start LM degrades to 2.57 % at N = 10 and 5.60 % at N = 20 — worse than bare glass (4.26 %) in one case. Needle is not a nicety on this problem; it is the difference between a working AR coating and a mirror.
Seed choice matters too, and it is measured rather than asserted: needle from a two-layer L|H seed inserted nothing at all and stopped at R_avg 1.98 %; from a four-layer L|H|L|H seed it reached 13 layers and 0.48956 %; from a two-layer H|L seed it reached 19 layers and 0.29655 %.
How to break it
Three links that are deliberately wrong, each beside the correct one. A benchmark page that only shows the tool succeeding reads like marketing. A page that hands you the knife reads like engineering, and it costs us nothing because the invariants hold.
| Try | What should happen | Why it is here | Correct |
|---|---|---|---|
| Half-wave layer at 188.4 nm, not 188.36766171747468 | R(550) moves: 0.9286763217372163 → 0.928676320223644, first differing decimal the 9th. Across the band the deviation is largest at the 301 nm edge, |ΔR| = 2.959 × 10⁻⁵. | Shows the invariance is real, not a hard-coded equality | Correct A7 |
| One layer at 5 % of its thickness (2.596362809137416 nm) | R drops from 99.94 % (0.9993685078282724) to a visibly different value | Shows the closed form is not being pattern-matched | Correct A2 |
| Etalon scanned over 1199–1698 nm | The material-validity advisory fires, naming the silicon dataset’s own cited 1360 nm floor | Shows the range gate is live, not decorative | Correct A5 |
Considered and not shipped
Four candidates were built, measured and then left off this page. They are listed because what a benchmark page leaves out is part of what it claims.
| Candidate | Why it is not here |
|---|---|
| A measured spectrum from a deposited film | The one strong candidate is the paper that produced the Ta₂O₅ dataset we ship, whose sample is exactly the geometry of case B4. Its full text could not be opened at source, and nothing is published here from a source we have not read. This remains the page’s one genuine gap. |
| A textbook buffer-layer invariance | The claim is that the admittance locus does not change with buffer-layer thickness. On our engine the two designs agree only at the buffer’s own half-wave wavelength (|Δ| = 2.6e-18 at 495.0 nm, where 2 × 247.50 = 495.00) and elsewhere the reflectance moves by an order of magnitude. The book’s sentence is a qualitative statement about the appearance of a plotted diagram and is fine as written; it is not an exact invariance, so it is not published here as a reproduced numeric claim. |
| Two design-contest summary papers | Neither prints a layer table for the problems we wanted — only aggregate columns (layer count, total thickness, merit). Four aggregate numbers cannot reconstruct a 23-layer design, and we do not substitute a plausible one. One of the two also depends on spectrum and dispersion files distributed outside the paper. |
| A commercial-software comparison tier | Dropped on legal advice before any measurement was made. |
How the numbers are produced
- Every published number is computed on the link’s own grid — the same 500-point spectral grid the share link produces, not a convenience grid. A number you cannot see on the plot is not a benchmark.
- The cross-validation reference is imported in a process where our own source directory is not on the interpreter path. Our engine’s package name collides with the reference’s; ignoring that would silently compare the engine to itself.
- Numbers on this page are rendered as strings from a fixed list, never recomputed at page load. A page that recomputes its own claims from the tool it is validating proves nothing.
- Full precision where the claim is full precision. A value whose whole point is that it agrees to sixteen digits is not shortened to four.
- Every share link on this page is machine-checked against the simulator’s own decoder, so a link cannot silently open a different stack from the one its row describes.
What this page does not claim
- These numbers are about the implementation, not about your coating. Agreement with a closed form at 10⁻¹⁶ says our arithmetic is right. It says nothing about whether the model describes a real deposited film. More in the manual
- The dominant uncertainty in any real prediction is the optical constants, not the numerics — by many orders of magnitude. Our TiO₂ is Devore’s 1951 bulk rutile (n = 2.648 at 550 nm); a real sputtered TiO₂ film is nearer 1.7–2.4. Our Ta₂O₅ is one specific IAD e-beam deposition run. If your process differs, so will your spectrum, and no amount of numerical precision fixes it. Each material page states its source and its validity window. More in the manual
- We model an idealised stack: perfectly flat, perfectly parallel, laterally homogeneous layers, illuminated by a plane wave. No scattering, no thickness non-uniformity, no substrate wedge, no birefringence, no nonlinearity, no thermal effects. Interface roughness is available as an effective-medium approximation (Bruggeman), which is a model of a rough interface, not a solution of one. More in the manual
- The textbook stop-band-width formula and our measured span differ by 47 nm, and dispersion is the smallest reason. Δλ = (4λ₀/π)·arcsin((n_H − n_L)/(n_H + n_L)) gives 205.46 nm for our 550 nm TiO₂/SiO₂ mirror; the engine’s contiguousR > 99 % span is 158.46 nm. The closed form is exact in normalized frequency g = λ₀/λ, where Δg = 0.373568 puts the band edges at λ₀/(1 ± Δg/2) = 463.44 and 676.33 nm, a width of 212.89 nm that the engine reproduces to 0.05 nm on a 15-pair stack with the same quarter-wave thicknesses and the indices frozen at their 550 nm values. So the 47.00 nm splits three ways: writing Δλ = λ₀·Δg instead of taking those edges, +7.43 nm; measuring seven pairs at the 99 % contour rather than an infinite stack at its band edge, −33.60 nm; and only then material dispersion, −20.83 nm, our TiO₂ running from n = 3.42 at 350 nm to 2.49 at 1000 nm. Neither the formula nor the engine is in error; the two numbers are different definitions of width. The same 301–800 nm scan carries a second R > 99 % run at 320.9–335.9 nm, produced by TiO₂ data extrapolated below its cited window; measured end to end across both runs the span is 316 nm. More in the manual
- The optimizer is a local refiner, not a global search. 200 random starts on a four-layer AR problem produced 70 distinct local minima. Needle synthesis and multi-start help; neither is a proof of global optimality, and we do not claim one. More in the manual
- “Lossless” materials in our catalogue are lossless in the model. BK7, SiO₂, MgF₂ and TiO₂ ship with k ≡ 0, so a computed transmittance through a thick substrate is an upper bound — real N-BK7 has a finite internal transmittance we do not model. More in the manual
- Forward modelling only. No inverse problem: we do not fit a stack to a measured spectrum, and the ellipsometry surface is forward Ψ/Δ only. More in the manual
- Validity windows are enforced, not assumed. Every material carries the wavelength range its cited source states, and the tool warns when a scan leaves it. Outside the window the curve is extrapolation, and we say so rather than drawing it silently. More in the manual