Documentation

Ring Resonator Calculator

How to set up a ring, import its waveguide and coupling from your saved designs, read the result card, and how each figure is computed and checked.

Open the Ring Resonator CalculatorLast updated 4 October 2026

What the calculator computes

A ring resonator is a waveguide closed on itself, beside one or two straight bus waveguides. Light in a bus leaks into the ring at the coupler. At the wavelengths where one round trip holds a whole number of wavelengths, the light in the ring adds up in phase, and the bus transmission dips. The calculator draws the spectrum, phase and group delay at the bus ports, and a result card for the resonance nearest the wavelength you design for.

Everything it computes comes from four inputs:

  • the effective index n_eff and the group index n_g, typed, or read across wavelength from a waveguide you saved in the PIC Waveguide Mode Solver;
  • the loss per round trip: the propagation loss you enter plus the bend loss;
  • κ², the fraction of the power that crosses between bus and ring at each coupler, typed, or imported from a coupler you saved in the PIC Directional Coupler Simulator;
  • the ring’s length, the circumference at the radius you enter.

Two configurations: “All-pass: one bus waveguide, and the light that enters the ring returns to it. Add-drop: a second bus picks off the light at resonance and sends it to the drop port.”

Each import is optional. With nothing imported the page computes from the values you type, and every imported value can be detached and edited.

In a quoted page line, … stands for a value the page fills in.

The inputs, section by section

The left panel has four sections. Before any import, the panel shows only what a ring needs: the configuration, the radius, the propagation loss, the bend loss, n_eff and n_g, κ², and the design wavelength. What an import brings appears only after it is applied.

The presets’ n_eff and n_g come from the PIC Waveguide Mode Solver and their κ² from the PIC Directional Coupler Simulator, each on a stated cross-section and gap, and the Preset control’s ⓘ names them. Their radius, loss and design wavelength are design values, chosen to show a kind of ring rather than taken from a device. The LNOI Modulator’s κ² is a design value too, because the coupler does not model lithium niobate.

Ring

ControlWhat it sets
“All-pass” · “Add-drop”One bus or two (above).
“Radius, center line (µm)”“Measured to the waveguide's center line, as the PIC Waveguide Mode Solver and the PIC Directional Coupler Simulator measure it, so a radius carries between the three tools unchanged.”

Waveguide properties

ControlWhat it sets
“Propagation loss (dB/cm)”“Loss of the straight waveguide: scattering and absorption, as measured or quoted for your process. Radiation from the bend is entered separately below.”
“Bend loss (dB/cm)”“Radiation from the curve, per centimeter of ring. It changes steeply with radius, so a value from a bend solve holds only at the radius it was solved at.”
“Effective index n_eff”“The phase index of the ring's mode. With an imported table, the page reads it at every wavelength of the range, so resonances fall where the waveguide's dispersion puts them.”
“Group index n_g”“The group index sets the free spectral range. With an imported table it comes from the same run, at the design wavelength.”

The propagation loss is always yours: it stays editable after an import. The other three can be filled by an import (“Importing the waveguide”).

Coupling

ControlWhat it sets
“Coupling κ₁², input bus (0–1)”“The fraction of the power in the bus that crosses into the ring at the coupler.”
“Coupling κ₂², drop bus (0–1)”“The same at the drop bus. A ring is critically coupled when the light it loses per round trip equals what the bus takes out.” Add-drop only.
“Use the input bus's coupling for the drop bus”Add-drop, once κ₁² is imported. κ₂² then follows the input bus’s import and says “Same as the input bus”. It is the right shortcut for a symmetric ring, and wrong when the two gaps differ; a second import exists for that case.

Simulation

ControlWhat it sets
“Design wavelength (nm)”“The wavelength the result card reports at. The card uses the resonance nearest to it, and imported values are read here.”
“Range and points”Closed by default, with “Automatic” beside it and the note “Automatic: 5 free spectral ranges around the design wavelength, 501 points.” Open it to set “From (nm)”, “To (nm)” and “Points”, up to 5001 points; “Back to automatic” returns to the automatic range.

The points set the even grid across the range. Narrow resonances are not left to that grid: the page always adds a dense window of points around every resonance it finds, so a line narrower than the grid spacing is still drawn at its true depth (“The transfer functions and the card”).

With an imported table, the automatic range is cut to the wavelengths the table covers, and the note says so. A range you set yourself is never cut: if it leaves the table, the page refuses it by name (“What the ring refuses”).

Importing the waveguide

The button “Import from Mode Solver” (hover: “Import from the PIC Waveguide Mode Solver”) opens “Import from a waveguide design”, with “Your saved waveguide designs”. Pick a design to see what it carries; nothing on the page changes until you press Apply. The summary lists one line per thing it will set:

  • The runs the design holds: “Wavelength sweep, … to … nm” or “Single wavelength, … nm”, and “Bend, R = … µm”.
  • “Mode: …”, with a mode select when the run kept more than one guided mode.
  • “n_eff and n_g: … wavelengths from … to … nm (Full-vectorial (FDE): saved run)” for a wavelength sweep, or “n_eff at … nm only.” for a run at one wavelength.
  • “Bend loss: from the bend solve at R = … µm”, or “Bend loss: none in this design, so it stays as you entered it.”
  • “Waveguide: …”: the cross-section the device view draws and the coupler check compares (see “When the coupler’s waveguide differs”).

One visit for both runs. The modal’s footer link, “Open the PIC Waveguide Mode Solver set up for this ring: a wavelength sweep over … to … nm and a bend at R = … µm”, opens the mode solver with this ring’s waveguide, a sweep over the ring’s range and a bend at its radius. Its hover: “Opens in a new tab with this ring's waveguide. Run the sweep and the bend, saving after each; both runs go into one design, and Import here takes both.” A saved design with one of the two runs missing offers “Add the bend run in the PIC Waveguide Mode Solver” or “Add the wavelength sweep in the PIC Waveguide Mode Solver” under its summary once you pick it.

After the import

  • The button becomes a status line, “Waveguide: “…”, …”, with a link to change the design.
  • n_eff and n_g turn read-only and show their value at the design wavelength: “n_eff … at … nm” and “n_g … at … nm”. They follow the design wavelength as you move it.
  • Under them, the source: “From “…”: Full-vectorial (FDE): saved run, …–… nm, saved …”. Its ⓘ, “Where these values came from”, gives the full record of the run.
  • “Detach” keeps the two values and makes them editable. From its ⓘ: “Keeps the values shown and makes them editable. The ring stops following the imported table, so changing the design wavelength no longer updates them.”

With a bend run in the design

  • Under n_eff: “Includes the bend's index shift, …, from the bend solve at R = … µm”. Its ⓘ, “What the bend shift assumes”: “A bent mode's effective index differs from the straight one's. The ring adds this difference, from the same bend run, to the imported table at every wavelength. It is measured at one wavelength and assumed the same across the range; how it changes with wavelength has not been measured.”
  • The n_g ⓘ then adds one sentence: “The group index sets the free spectral range. With an imported table it comes from the same run, at the design wavelength. n_g is the straight guide's; the bend shift is applied to n_eff only.”
  • Bend loss turns read-only with its source, “From the bend solve at R = … µm in “…””, and the label “Held constant across the range”. Its ⓘ, “Why it is constant”: “The bend loss comes from one bend solve at one wavelength, and the ring uses that value at every wavelength of the range. How it changes with wavelength is not included.”
  • Its own “Detach”: “Keeps the value shown and makes it editable. It stops being tied to the bend solve, and a radius change no longer flags it.”
  • When the ring’s radius differs from the radius the bend was solved at, a flag says so: “Solved at R = … µm; your ring is … µm. Bend loss changes steeply with radius, so it is not carried from one radius to another.” It offers two actions, “Use R = … µm” and “Solve the bend at … µm”.
  • When the solve’s materials absorb, the imported bend loss already includes that absorption: “The imported bend loss already includes the materials' absorption, so enter only scattering loss as yours.”

A design without a bend run imports the table alone, and the page says “No bend run in “…”: n_eff is the straight guide's.” Bend loss then stays as you entered it.

Importing the coupling

The button “Import from Directional Coupler” (hover: “Import coupling from the PIC Directional Coupler Simulator”) sits under each coupling, one per bus. It opens “Import coupling from a coupler design”, which on an add-drop ring names the bus: “Import coupling from a coupler design for the input bus” or “Import coupling from a coupler design for the drop bus”. The list is “Your saved coupler designs”. The summary of a picked design shows:

  • “κ² … at … nm (ring-bus arc)”, naming the kind of region the coupler modeled;
  • “Gap … nm”, when the region has one gap;
  • the coupling phase, carried with the import and not used by the ring;
  • “Excess loss: not modeled by this engine, so the ring treats the coupler as lossless.”

The footer link, “Open the PIC Directional Coupler Simulator with this ring's radius, wavelength and waveguide”, opens the coupler with the ring’s radius, the design wavelength and the imported waveguide, in a new tab.

After the import

The status line reads “Coupler: “…”, ring-bus arc”, and κ² turns read-only. Its source line takes one of three forms, by what the coupler run holds:

The run holdsSource line
κ² at one wavelength“From “…”: κ² at … nm, saved …”, with “Held constant across the range”. Its ⓘ: “The coupler run gives κ² at one wavelength, and the ring uses that value at every wavelength of the range.”
κ² from full runs at several wavelengths (a ring-bus arc)“From “…”: κ² from … coupler runs, … to … nm, saved …”. Its ⓘ, “How the coupling was sampled”: “The coupler ran in full at … wavelengths across the range: three when the range is 100 nm or less, otherwise equally spaced and no more than 50 nm apart, both ends included. The ring interpolates κ² between them and never beyond the range.”
κ² from a wavelength sweep“From “…”: κ² from its wavelength sweep, … wavelengths, … to … nm, saved …”
  • With several wavelengths, κ² is read at every wavelength of the range (see “How κ² is read across wavelength”).
  • When κ² comes from exactly two wavelengths, a second line says how closely a straight line between them matched full runs: “κ² between the two runs: within 0.3 %” up to 50 nm apart, “κ² between the two runs: within 2 %” up to 100 nm. For one sweep with two wavelengths the line reads “κ² between the sweep's two wavelengths: within 0.3 %” or “κ² between the sweep's two wavelengths: within 2 %”. The ⓘ, “How this was checked”: “Between two runs the ring draws κ² as a straight line in ln κ². Checked against full runs every 10 to 25 nm on two silicon arcs and one silicon nitride arc at R = 10 and 50 µm, the largest difference was 1.07 % for runs 100 nm apart and 0.29 % for runs 50 nm apart.”
  • A run the server refused is named under the source line, one line each: “Not computed at … nm: that run needed more cells than the server allows. The other wavelengths are used.” at an end of the range, or “Not computed at … nm: that run needed more cells than the server allows; the ring does not estimate between … and … nm.” inside it. A run refused for another reason names it: “Not computed at … nm: …” or “Not computed at … nm: …; the ring does not estimate between … and … nm.”.
  • “Detach”: “Keeps the value shown and makes it editable. It stops following the coupler run, so changing the radius or the design wavelength no longer re-reads it.”
  • The provenance ⓘ, “Where these values came from”: “These values come from the coupler run. Changing the radius or the design wavelength re-reads them where the run allows, and flags them where it does not. Detach to enter κ² by hand.”

When the coupler’s waveguide is not the ring’s

κ² holds for the waveguide the coupler was designed with. When it differs from the waveguide imported above, the coupling row shows an amber flag: “This coupler was designed with …; the ring's waveguide is …. Its κ² holds for its own waveguide, so the two may not describe one device.” Its action: “Open the coupler with the ring's waveguide”. It warns and does not block: two runs can describe different process corners on purpose. With no waveguide imported, a gray line asks for one: “This coupler was designed with …. Import the ring's waveguide above to check that they match.” Which fields count is in “When the coupler’s waveguide differs”.

When an arc coupler’s radius differs from the ring’s by more than 0.005 µm, the summary says so: “Coupler ring radius … µm; your ring is … µm. The coupling depends on the radius, so it is not carried from one to the other.” Apply keeps the coupler with the ring but does not use its κ²: the ring goes on with the κ² you entered. Choosing “Use R = … µm” sets the ring’s radius to the coupler’s, and only then is the imported κ² applied, read-only, with Detach. A later import of the same bus is flagged when its gap differs by more than 0.5 nm.

Reading the result card

The card is titled “At the resonance nearest … nm”, and its first row, “Resonance at … nm”, names the resonance it describes. n_eff and n_g are shown at the design wavelength; every other row is computed at that resonance.

RowWhat it tells you
“Loaded Q”“The Q of the resonance as the bus sees it: the ring's own loss plus the light the bus couples out.”
“Intrinsic Q”“The Q the ring would have with its own loss alone, without the bus. Beside the loaded Q, it shows how much of the linewidth comes from coupling rather than loss.”
“Finesse”The free spectral range divided by the linewidth.
“3-dB bandwidth”The full width of the resonance at half depth.
“Extinction ratio”The through port’s transmission off resonance over its transmission on resonance.
“Insertion loss”How far the drop port’s transmission on resonance falls short of all the input, in dB (its formula is under “The transfer functions and the card”); zero would mean every photon at resonance reached the drop port. Add-drop rings only.
“FSR”The spacing to the next resonance, in wavelength and in frequency.
“Photon lifetime”How long light stays in the ring, from the loaded Q.
“Group delay”The through port’s group delay on resonance.
“Round-trip loss”The power lost in one trip around the ring: propagation loss plus bend loss.
  • The coupling regime line under the rows says whether the ring is under-coupled, critically coupled or over-coupled: whether the bus takes out less light per round trip than the ring loses, about the same, or more.
  • When anything is imported, the line at the bottom of the card names it, for example “n_eff and n_g from “…”; κ² from “…””.
  • When the design wavelength falls where κ² is not estimated (a refused run inside the range), the card shows “No result at … nm: it falls between … and … nm, where the ring does not estimate κ². The spectrum shows the rest of the range.”

The device view

The ring is drawn three ways, from the inputs on the page: 3D, Top and Cross-section, the same views the PIC Waveguide Mode Solver and the PIC Directional Coupler Simulator use. The page opens on 3D.

  • Top draws the ring at its radius and each bus beside it. The gap is drawn between the facing edges of ring and bus, never between their center lines, and a scale bar gives true length.
  • A waveguide is far narrower than a ring is wide, so the drawing can stretch the narrow dimensions: at × N, every waveguide width and gap is drawn N times its true size about its own center line, while the radius stays true. Auto picks N so the gap is visible, and you can choose another value; the largest offered keeps the ring’s inner edge at least half the radius from its center. In 3D the heights are stretched by the same factor. Cross-section always keeps true proportions.
  • 3D draws the same outlines through the layer stack.
  • In 3D, drag to rotate, scroll to zoom and right-drag to pan; in Top and Cross-section, scroll to zoom and drag to pan. Reset view fits the drawing again; on Top and Cross-section, so does a double-click.
  • Before any import, the drawing is estimated from your values: the single-mode width of a 220 nm silicon strip, with oxide below and air above, whose mode index matches your n_eff, and the widest gap at which a ring-bus arc of that width, at your radius, couples your κ². They are for the drawing only. Import a waveguide and a coupler to draw their true dimensions.
  • Until a waveguide or coupler is imported, the drawing carries no width, gap or thickness numbers and no dimension lines: its geometry is an estimate. A waveguide import brings the waveguide’s dimensions, and a coupler import brings its own waveguide’s width and the gap; the gap’s number shows only once a coupler is imported. The radius and the scale bar are true from the start.
  • Cross-section draws the imported waveguide with the mode solver’s own labels. Before an import it shows “Import a waveguide to see its cross-section.” and draws nothing.

The drawing sits above the spectrum and the result card below them, and the panel scrolls. The divider under the drawing trades height between the drawing and the spectrum: drag it to give either more room.

How n_eff and n_g are read across wavelength

A wavelength sweep from the mode solver carries n_eff and n_g at each swept wavelength, for the one mode the sweep tracks. The ring reads the whole table. n_g is read as the run served it: the solver forms it with a central stencil on a grid padded beyond the table’s ends, and forming it again from the table would give a second number for the same quantity and lose the ends.

Between the swept wavelengths

Between two swept wavelengths, n_eff is a cubic whose values are the two served n_eff and whose slopes come from the served n_g, by the definition of the group index:

dn/dλ = (n_eff − n_g) / λ at each swept wavelength · n_g(λ) = n(λ) − λ·dn/dλ of the same cubic

At a swept wavelength the page uses the served values exactly. The phase the resonances depend on therefore follows the waveguide’s own dispersion between the samples.

Measured on a served sweep of Si 440 × 220 nm, Air above, SiO₂ below, 1500 to 1600 nm in 11 wavelengths: keeping one wavelength every 20 nm and comparing with the 5 wavelengths left out,

RuleLargest n_eff differenceResonance shift it causes (pm)Largest n_g difference
The cubic above2.36 × 10⁻⁸0.008143.84 × 10⁻⁵
A straight line in n_eff3.13 × 10⁻⁵10.5not defined

Gaps and edges

  • A swept wavelength the run marked is not used: where the mode stopped being guided, where n_eff showed a step, where the sweep lost track of the mode, or where the group index was withheld.
  • The usable table is the longest run of consecutive good wavelengths that contains the design wavelength. The cubic never bridges a gap.
  • The table is never extrapolated. Holding n_eff at the table’s edge would freeze the dispersion and misplace every resonance beyond it by an amount nothing on the page would show, so a wavelength outside the table is refused instead (“What the ring refuses”).

Without a table

With values typed, or a run at one wavelength imported, the phase index is the first-order model about that wavelength λ₀:

n(λ) = n_eff − (n_g − n_eff)·(λ − λ₀) / λ₀ · n_g constant

For typed values λ₀ is the design wavelength; for an imported run at one wavelength it is that run’s wavelength. A ring with nothing imported therefore places its resonances where the first-order model puts them.

The bend: its index shift and its loss

The bend’s index shift in the phase

In a ring the light travels in the bent mode, whose effective index differs from the straight guide’s. When the design carries a bend run, the ring adds the difference to the table at every wavelength:

n(λ) = n_table(λ) + Δn_bend · Δn_bend = Re n_bent(R) − Re n_straight, both from the same bend run
  • n_straight is the bend run’s own straight index, solved with the same absorbing boundary as the bent mode, not a separate straight solve. Both indices come from one run on one grid with one boundary, so the solver’s own offset cancels in the difference.
  • Δn_bend is measured at the bend run’s wavelength and assumed the same across the range. How it changes with wavelength has not been measured.
  • n_g is not corrected for the bend. The bend moves n_g by a similar order, and that is not modeled; the free spectral range and the resonance search use the straight guide’s n_g.

The bend loss

The bend run gives the loss per quarter turn, which the ring converts to a loss per length of ring:

α_bend (dB/cm) = loss per 90° (dB) / (πR/2), R in cm
  • A single bend solve is used only when its radius matches the ring’s within 0.005 µm. Otherwise the import is kept but not used, and bend loss stays as you entered it, until you choose “Use R = … µm”, which sets the ring’s radius to the solved one. A bend sweep over radius is interpolated between the two solved radii around the ring’s, with the logarithm of the loss linear in radius, and never beyond them.
  • The value is held constant across the range. Bend radiation depends on wavelength; how much it changes across the range has not been measured here and is not included.

The round-trip amplitude combines both losses over the ring’s length L = 2πR:

a = 10^(−α_tot·L_cm / 20) · α_tot = α_prop + α_bend (dB/cm)

How κ² is read across wavelength

From a saved coupler run the ring reads κ² = |S₄₁|², the power that crosses from the bus input (port 1) into the ring (port 4), in the coupler’s own port numbering. Three things are left out on purpose:

  • The coupling phase is carried for the record and not used: the ring’s model does not need it.
  • The bus’s own phase through the coupler is never imported. The ring already counts the phase along its whole length, and adding the coupler’s would count the coupling region twice.
  • The coupler is treated as lossless, because no engine that serves these runs models its excess loss.

Across wavelength

  • A run at one wavelength gives one κ², held constant across the range.
  • Several wavelengths (full runs of a ring-bus arc, or a coupler’s wavelength sweep) give κ² exactly at each of them. Between them, κ² is the exponential of the quadratic in ln κ² through the three nearest:
κ²(λ) = exp( Σᵢ ln κᵢ² · Πⱼ≠ᵢ (λ − λⱼ) / (λᵢ − λⱼ) ), over the three run wavelengths nearest λ

κ² is never read outside the first and last run wavelengths. A range beyond them is refused by name.

Why the logarithm: across 1500 to 1600 nm, κ² of the measured arcs grew by a factor of 2.7 to 3.1, close to exponentially in wavelength, so a curve in ln κ² follows it far better than one in κ². Measured on two ring-bus arcs run in full every 10 nm (air above) and every 25 nm (oxide above), R = 10 µm, gap 200 nm, 20 nm mesh: the largest relative difference from the full runs at the wavelengths left out (%):

WaveguideRuns at (nm)Checked at (nm)Line in κ²Line in ln κ²Quadratic in ln κ²Monotone cubic in ln κ²
Si 500 × 220 nm, Air above, SiO₂ below1500, 1550, 16001510 to 1590, every 10, the runs excepted (8)4.00.140.0110.086
Si 500 × 220 nm, Air above, SiO₂ below1500, 1520, 1540, 1560, 1580, 16001510, 1530, 1550, 1570, 15900.640.0240.00200.012
Si 500 × 220 nm, SiO₂ above, SiO₂ below1500, 1550, 16001525, 15752.90.230.00590.11

How the runs are placed: three when the ring’s range is 100 nm or less (both ends and the middle), otherwise equally spaced and no more than 50 nm apart, both ends included. Each is a full run; the runs share one solve window, sized for their most demanding wavelength.

From exactly two wavelengths

Two wavelengths do not define a quadratic, so the ring draws a straight line in ln κ² between them. Measured on the same two silicon arcs and on one silicon nitride arc, against the full runs between the two ends (%):

WaveguideBetween (nm)Checked at (nm)Line in ln κ²Line in κ²
Si 500 × 220 nm, Air above, SiO₂ below1500 to 16001510, 1520, 1530, 1540, 1550, 1560, 1570, 1580, 15900.5317
Si 500 × 220 nm, Air above, SiO₂ below1500 to 15501510, 1520, 1530, 15400.144.0
Si 500 × 220 nm, Air above, SiO₂ below1550 to 16001560, 1570, 1580, 15900.123.8
Si 500 × 220 nm, SiO₂ above, SiO₂ below1500 to 16001525, 1550, 15750.8711
Si 500 × 220 nm, SiO₂ above, SiO₂ below1500 to 155015250.232.9
Si 500 × 220 nm, SiO₂ above, SiO₂ below1550 to 160015750.222.7
Si₃N₄ 1000 × 400 nm, Air above, SiO₂ below1500 to 16001525, 1550, 15751.1not measured
Si₃N₄ 1000 × 400 nm, Air above, SiO₂ below1500 to 155015250.27not measured
Si₃N₄ 1000 × 400 nm, Air above, SiO₂ below1550 to 160015750.29not measured
  • The page prints the bound as the ceiling of the largest measured difference at one significant figure: within 0.3 % for wavelengths up to 50 nm apart, and within 2 % up to 100 nm.
  • Two wavelengths more than 100 nm apart are not interpolated: the line was not checked that far.
  • Under the placement rule above, two runs remain only when an end run of a three-run range was refused, so they are at most 50 nm apart. A wavelength sweep with two points can be wider.
  • The bound was measured on two silicon arcs at R = 10 µm and one silicon nitride arc at R = 50 µm. It is printed for every coupler, and its ⓘ states that scope.
  • Three or more wavelengths keep the quadratic rule; measured on the same three arcs, it stays within 0.03 % of the full runs.

A refused run inside the range

When the server refuses one of the runs inside the range, the stretch between its two neighbors has no run in it, and the ring does not estimate κ² there. A curve through the next three runs would span that stretch with no data, which is the extrapolation the rule forbids. The spectrum is drawn on the rest of the range, resonances inside the stretch are not reported, and a refused end run shortens the range to the last computed one.

The transfer functions and the card

At every wavelength λ of the grid, with n(λ) and κⱼ²(λ) read as above:

φ = 2π·n(λ)·L / λ · rⱼ = √(1 − κⱼ²)
All-pass through: T = (a² − 2ar₁ cos φ + r₁²) / (1 − 2ar₁ cos φ + (ar₁)²)
Add-drop through: T = (r₂²a² − 2r₁r₂a cos φ + r₁²) / (1 − 2r₁r₂a cos φ + (r₁r₂a)²)
Add-drop drop: D = κ₁²κ₂²a / (1 − 2r₁r₂a cos φ + (r₁r₂a)²)

These are the calculator’s transfer functions, unchanged; the group delays keep their closed forms.

Finding the resonances

A resonance is a wavelength where the ring holds a whole number m of wavelengths, n(λ)·L/λ = m. The page solves it by Newton steps, started from the first-order model’s closed form:

λ ← λ + (n(λ)·L/λ − m) · λ² / (n_g(λ)·L)

A dense window of points, scaled to each resonance’s linewidth and spacing, is placed around every resonance found in the range and added to the even grid.

The card

At the resonance nearest the design wavelength, λ_res, with κ² read there:

FSR = λ_res² / (n_g(λ_res)·L) · X = r₁a (all-pass) or r₁r₂a (add-drop)
F = π√X / (1 − X) · FWHM = FSR / F · loaded Q = λ_res / FWHM
intrinsic Q: the same with X = a · photon lifetime = loaded Q / (2πν)
insertion loss (add-drop) = −10·log₁₀ D(λ_res), D the drop transmission above at φ = 0
  • The card’s Q is the loaded Q: its linewidth includes the light the bus couples out. The intrinsic Q keeps only the ring’s own loss.
  • The finesse above is its high-finesse form.
  • The coupling regime compares r₁ with a (all-pass) or with r₂a (add-drop): under-coupled when r₁ is larger, over-coupled when it is smaller, and critically coupled inside the band
|r₁ − a| (or |r₁ − r₂a|) < 0.05·(1 − a) + 1 × 10⁻⁶

When the coupler’s waveguide differs

The coupler’s ring-side waveguide is compared with the waveguide imported from the mode solver. The bus waveguide may legitimately differ from the ring’s and is not compared.

FieldDiffers when
Cross-section typethe mode solver’s guide is not a strip: the coupler models strips only
Widththe two differ by more than 0.5 nm
Thicknessthe two differ by more than 0.5 nm
Wall anglethe two differ by more than 0.05° (vertical walls when none is given)
Core, substrate, claddingthe material names differ once spelled alike; a custom material differs unless it is the same stored material

The tolerances are display precision, not physics: a difference too small to see in either tool’s inputs is not flagged. How fast κ² moves with the ring guide’s width at a fixed gap has not been measured for this comparison, so no physics tolerance is claimed. The wavelength is not a waveguide field; each import’s wavelength coverage is checked on its own.

What the ring refuses

Where the inputs cannot be read, the page says so by name rather than estimate. No refusal is a clamp: a value is never held at an edge to fill a gap.

WhenWhat the page says
The design wavelength is outside the imported table“The design wavelength, … nm, is outside the imported table (… to … nm). Set it within the table, or detach to enter n_eff and n_g by hand.”
The range leaves the imported table“The imported table covers … to … nm, and the range here runs to … nm. n_eff is not extrapolated: narrow the range, or sweep the waveguide over the full range and import again.”
The range leaves the coupler run’s wavelengthsκ² is refused outside its first and last wavelength, with the coupler import’s own sentence naming the wavelengths it covers.
A refused run inside the range“Not computed at … nm: that run needed more cells than the server allows; the ring does not estimate between … and … nm.”
The design wavelength falls in that stretch“No result at … nm: it falls between … and … nm, where the ring does not estimate κ². The spectrum shows the rest of the range.”
κ² at only two wavelengths, more than 100 nm apart“κ² is not estimated between … and … nm: the coupler run has κ² only at those two wavelengths, … nm apart, and the ring interpolates across at most 100 nm. Run the coupler's wavelength sweep with more points to import across this range.” Its ⓘ, “Why the import does not estimate here”: “Between two wavelengths the ring draws κ² as a straight line in ln κ². That line was checked against full runs only for wavelengths up to 100 nm apart, so a wider gap is not estimated.”
The coupler’s runs at several wavelengths were refused as a whole“Held at its … nm value: the coupling at several wavelengths was refused on …, because their shared solve window needs more cells than the server allows.” Its ⓘ, “Why it is held”, gives the refused band, the longest wavelength, the window and its cells against the limit.

What is not modeled

  • How the bend’s index shift changes with wavelength: it is measured at one wavelength and held across the range.
  • The bend’s effect on the group index: n_g is the straight guide’s.
  • How the bend loss changes with wavelength: one value is held across the range.
  • The coupler’s excess loss: the coupler is treated as lossless.
  • The coupler’s phase: carried with the import, not used.
  • A physics tolerance for the waveguide comparison: the comparison is at display precision.
  • Reflections at the couplers and backscattering into the counter-propagating ring mode, which splits resonances: the transfer functions assume light travels one way around the ring.
  • Racetrack rings: the ring is a circle.