Documentation
PIC Directional Coupler Simulator
How to read the coupler's results, which engine to use, and how each figure is computed and checked.
What the coupler computes
Two waveguides run close together. Light launched into one of them leaks into the other through the overlap of their fields, and then back again, so the power swaps between the guides along the length. The simulator tells you how much of the input power ends up in the other waveguide for the design you entered, and the length over which one full swap happens.
The page models four shapes of coupling region. Pick one under the region control:
- Straight: two parallel waveguides at a fixed gap, over an interaction length you set.
- S-bend: a straight section with bends that bring the guides together and take them apart. The bends couple too. Pick the bend shape that matches your layout (Raised cosine, Circular arc or Euler; each tab’s hover says which to use).
- Ring-bus arc: a straight bus waveguide beside a ring of the radius you set, as in a ring resonator.
- Gap profile: a gap that varies along the length, entered as a table.
The two numbers everything else hangs on:
- κ², the cross-coupled power: the fraction of the input power that leaves through the other waveguide.
- L_c, the coupling length: the length at which the cross power first peaks; on two identical waveguides, the length at which it has fully crossed. (On unequal waveguides the power never fully crosses.) On a straight coupler the power crosses and comes back periodically, so a length past L_c gives less cross power, not more, up to the next transfer.
Reading the result card
The card is titled “Cross-coupled power”. Under the title, a caption states the design it answers: “At L = … µm, gap … nm” on a straight pair, or “… µm between the bends, narrowest gap … nm” on an S-bend.
The values
| Row | What it tells you |
|---|---|
| “Cross (κ²)” | The fraction of the input power that leaves through the cross port. |
| “Through” | The rest, 1 − κ². |
| “L_c” | The length at which the cross power first peaks; on two identical waveguides, the length at which it has fully crossed. On an S-bend the row reads “L_c, straight pair (the bends add phase)”: it is the straight section’s coupling length, and the bends add coupling on top of it. |
| “Maximum transfer F” | Shown on the Full-vectorial engine. The largest fraction of power that can cross between the two guides, estimated from the computed modes of the coupled pair. It is 1 for two identical waveguides and less when the guides differ, because the light no longer swaps completely. |
| “Gap sensitivity” | How strongly the result depends on the gap, a dimension that varies in fabrication. On a straight pair: “L_c +… % per nm wider gap”. On a curved region: “κ² +… % per nm wider gap”; near a null of the transfer “κ² +… per nm wider gap (near a null of the transfer)”; at full transfer “κ² is at its maximum: a small change in gap changes it only at second order”. |
On the Effective index engine, L_c carries its accuracy in place, for example “… µm, quick estimate: runs … % short”. The clause says how far that engine’s L_c is known to stray for your kind of core, or “accuracy not measured for this core” where it has not been measured. The section “Accuracy of the Effective index engine” gives the measurements.
The design hint. When your length is past the first full transfer, the card adds: “You're past the first transfer; κ² is very sensitive to gap and length.” Past L_c, a small error in gap or length moves κ² much more than it would near the first transfer, so a design there is harder to fabricate on target. On an S-bend the same hint appears when the total coupling, bends included, passes the first transfer.
Whether the result was checked. Under the values, a status line says what the result was compared with:
- “Checked against a full 3D simulation of this design: close.”
- “Checked against full 3D simulations of similar designs: close.” When the reference design differs from yours, the line names how, for example: “(the reference differs in wall angle and wavelength).”
- Where the check found a larger difference, the status line shows amber with the measured figure.
- With no line, the result has not been compared with a 3D simulation.
The hover on the status line (“What was checked”) gives the figure and the full comparison. The section “What has been measured in full 3D” lists every comparison.
Cautions and notices.
- Curved regions and gap profiles are checked against the limits of the method. When the check passes with something to watch, the outcome reads “Passed, with a caution:” or “Passed, with … cautions:”, followed by each caution.
- A notice that asks you to act, such as running on a finer mesh, shows amber on the page.
- Notices that only qualify the result stay in the notes block under the card.
- A design the method cannot answer is refused, and the refusal replaces the values, so no number is shown that the method does not support.
The check behind the estimate. On S-bends and gap profiles, the figures behind the outcome can be downloaded from the Design menu: “Check behind this estimate (CSV)”. Each figure is at full precision, with the limit it was compared against.
Two engines, and when to use each
| Engine | How it runs | Use it when |
|---|---|---|
| Effective index | “Instant, in your browser. Updates as you type.” | You are exploring: sizing a gap and length, or comparing shapes. It models two identical waveguides with vertical walls, coupling in the same mode. |
| Full-vectorial | “Exact hybrid supermodes on a finite-difference mesh. Runs on the server.” | You need the more accurate estimate: the one the full 3D comparisons in “What has been measured in full 3D” were made against. On the ring-bus arcs checked in 3D, the full-vectorial κ² falls inside a 3D range about ±11 % wide. You also need it for anything the quick estimate cannot model: unequal waveguide widths, different modes in the two waveguides, or sloped sidewalls. |
- Unequal widths or modes. While unequal widths are entered on the Effective index engine, the page says so: “This estimate is for two identical waveguides coupling in the same mode. Unequal widths, or different modes in the two waveguides, need the Full-vectorial (FDE) engine.”
- Switching engines keeps the last result on screen with a line naming where it came from, for example “Shown: Effective index results. Run Full-vectorial to replace them.” Nothing is replaced until you run.
- Changing the design after a run grays the result and adds “The design changed since the result below was solved. Run again to update it.”
- Mesh. The Full-vectorial engine solves on the mesh you choose in the Run section. A finer mesh is slower and resolves modes closer to the cladding index. When a supermode lies inside the mesh’s own error, the card withholds that pair’s coupling length rather than print a number for a mode it cannot confirm. The hover “Why this pair is not resolved” explains why. When a finer mesh is offered, the line shows amber and says which mesh to run at.
- Access. The Full-vectorial engine is part of PIC Full-Vectorial Pro. Anyone can choose it; running it needs a signed-in account and the product or its free trial, and until then its offer shows in place of the results.
The same supermode solver runs the PIC Waveguide Mode Solver, and its manual covers the mesh and window in depth.
The device views and the port numbers
The device is drawn three ways, from the inputs you entered: 3D, Top and Cross-section.
- Top shows the layout from above, with the gap, the lengths and (on an S-bend) the bend height marked.
- Cross-section shows a slice across both waveguides. Move it with “Cross-section position from the input port”.
- 3D shows the whole device.
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.
A vertical stretch control exaggerates the drawing’s height so thin layers stay visible. It changes the drawing, not the design.
The light. After a result, the views draw the light: “Brightness: power flowing along the coupler”.
- It is light as this model computes it, not a propagation simulation, so radiation, reflection and bend loss are not drawn. The hover “How the light is computed” says this in full.
- Where the waveguides curve, only each guide’s power is drawn, not the interference pattern. That is the same estimate as κ² (“What the curved section shows”).
The port numbers. The Top and 3D views label each port face: “1 · in”, “2”, “3 · through”, “4 · cross”. From the labels’ ⓘ: “Ports 1 and 2 are where light enters guides A and B; ports 3 and 4 are where it leaves. Port 3 is the through port of port 1, and port 4 its cross port. Guide A is the upper or lower waveguide in this view.”
The same numbers name the S-parameter plots, label the exported files, and travel with an import into the Ring Resonator Calculator. So port 4 is the same port on every surface.
S-parameters on the plots
An S-parameter says how much light, and with what phase, goes from one port to another. |Sij|² is “the fraction of the power launched into port j that leaves port i”.
The vs Wavelength plot and the Parameter Sweep plot can show S-parameters. Choose the entry first, then the quantity.
Entries:
- “port 1 → port 3, through”
- “port 1 → port 4, cross”
- “port 2 → port 4, through”
- “port 2 → port 3, cross”
Quantities:
- “|S|² (dB)”
- “|S|² (linear)”
- “Phase, cross relative to through”: the phase of the cross output relative to the through output, arg(S₄₁ / S₃₁). For two identical waveguides on a straight coupler without loss, it is +90° before the first full transfer and flips by 180° at each full transfer after it. On unequal waveguides it is not ±90°. The absolute phases are in the downloaded file, not on the plot.
What these engines do not model. Both engines follow the light forward through the coupler and are reciprocal by construction. From the selector’s ⓘ: “This engine is reciprocal by construction, so each reverse direction (for example port 3 → port 1) equals its forward one. It has no backward wave, so reflections and back-coupling are not modeled by this engine.”
- So the selector lists the four forward entries.
- Reflections and back-coupling appear disabled, as “port 1 → port 1, reflection: not modeled by this engine”.
- An unmodeled entry is never shown as a number, because a 0 would read as a measurement of no reflection.
Curved regions. On an S-bend, a ring-bus arc or a gap profile, the S-parameters are computed at the design wavelength only. The phase through a curved region needs each guide’s own path phase along its bend. Where the page has computed it for your region, the S-parameters are complex; where it has not, they are shown as power only (|S|², no phase), and the reason is stated beside them.
Downloading S-parameters
The Design menu offers the run’s S-parameters as files.
Touchstone, for circuit tools. “S-parameters (Touchstone, .s4p)”: “One file per polarization, readable by circuit tools such as scikit-rf and INTERCONNECT. The format requires a reference impedance; the "R 50" in the file is a placeholder, not a property of the device.”
- Rows run in increasing frequency, so the wavelength grid appears reversed.
- Values are complex (real and imaginary parts).
- The header names the design, the engine and its mesh, the build, and the time it was computed or saved.
Unmodeled entries are NaN, not zero. The file writes each unmodeled entry as NaN (not a number) and names those entries on a comment line, so no tool reads them as a measured zero. After the download the page says: “Downloaded 2 files, one per polarization. Entries this engine does not model are written as NaN, not zero; a tool that rejects NaN cannot load the file.”
For tools that cannot read NaN. A second item writes zeros instead: “S-parameters (Touchstone, .s4p), zeros for unmodeled entries (tool compatibility)”. From its ⓘ: “For circuit tools that cannot read NaN. Entries this engine does not model are written as 0, and the file's header says they were not computed. Use the first download unless your tool rejects it.” The header’s comment line then says that those entries were not computed and that zero is not their value.
CSV. A curved region’s S-parameters are power only (“S-parameters on the plots”). Touchstone needs a phase, so the page downloads them as a CSV of |S|² instead. In the CSV, an unmodeled entry reads “not modeled by this engine”.
When a download is refused. The page shows a short reason and a fuller one:
| What happened | Short message |
|---|---|
| The run has no S-parameters (or none for that polarization) | “This run has no S-parameters for TM.” |
| An unsaved run's result has expired | “This run's result has expired, so its S-parameters are gone.” |
| The design was saved without a run | “This design has no saved run, so there are no S-parameters to download.” |
| The saved copy fails its integrity check | “This design's saved run failed its checksum, so it is not served.” |
| A parameter sweep asked for Touchstone | “A parameter sweep has no frequency axis, so it exports as CSV, not Touchstone.” |
Each detail line names the way forward: run again, save after the run, or use the CSV.
Saving a design with its run
Saving a design keeps its parameters. On the Full-vectorial engine, it also keeps the run’s result with the design. The run includes its S-parameters, so the card, the plots and the downloads come back when you open the design, without solving again.
- After a save: “This result is saved with the design (…).” The saved result counts toward your storage.
- An unsaved Full-vectorial result is kept on the server for 24 hours. After that, a reload shows “The last run's result has expired: unsaved server results expire after 24 hours. Run again to get it back.” Saving keeps it beyond that.
- The Effective index engine saves no result, because it recomputes instantly from the parameters when the design opens.
- Opening a saved design shows its saved result. If you then change the design, the result grays with the stale line in “Two engines, and when to use each”. Changing only the run settings (mesh, sweeps) leaves it current; it keeps showing the mesh it was solved on until you run again.
- If a save cannot keep the result, the design is still saved, and the page says why. For example: “The design is saved, but this result could not be kept with it: your storage for saved results is full.”
- If you delete a saved result from your storage panel, the design stays. Opening it shows “This design's saved result was deleted. Run again to restore it, then save to keep it with the design.”
- A version keeps its parameters and a pointer to each run the design had when the version was saved, not a copy of the runs. If the design's run of that kind is later saved again or deleted, the version's history entry says that run was not kept; restoring the version brings back its parameters, and the design's current run is not affected.
- Downloads from a saved design read the saved copy, so they keep working after the 24-hour window has closed for the original run.
Sweeps: Parameter Sweep and Wavelength sweep
Two sweeps show how the result changes. Each opens its own section under the results.
Wavelength sweep. This sweep (“Wavelength sweep”) runs the design across a band around your wavelength. It plots κ², or any S-parameter entry from “S-parameters on the plots”, against wavelength.
The Wavelength sweep computes the coupling across a range. On a straight coupler it is a dense sweep at the number of points you set. On a ring-bus arc each wavelength is a full run, so it uses a few: three when the range is 100 nm or less, otherwise equally spaced and no more than 50 nm apart, all in one solve window sized at the longest, and the plot draws a fitted curve between them. Opening the coupler from the ring calculator's import link fills in the ring's range. The O-, C- and L-band buttons set the range to that band's ITU-T edges.
Parameter Sweep. This sweep steps one design value and plots an output against it:
- “X-Axis (sweep parameter)”: gap (“Gap”, or “Narrowest gap” on curved regions), length (“Interaction length”, or “Length between the bends” on an S-bend), “Ring radius” (ring-bus arc only), “Width (both)” and “Thickness”. A gap profile offers gap, width and thickness.
- “Y-Axis (output quantity)”: “Cross-coupled Power (κ²)”, “Coupling Length (L_c)”, “Index Splitting (Δn_eff)”, or an S-parameter entry (“S-parameters on the plots”) on the Full-vectorial engine.
- “Number of points”: how many steps between the start and the stop.
Some pairs are disabled, with the reason in place. For example: “The coupling length does not depend on the interaction length.”
The sweep’s S-parameters. On the Full-vectorial engine, every swept point carries its own S-parameters, at the run’s single wavelength. The Design menu then offers them as “S-parameters (CSV)”: “One row per swept value, all at the run's wavelength. A sweep's axis is the swept value, not frequency, so it exports as CSV, not Touchstone. Entries this engine does not model read "not modeled by this engine", never 0.”
When a file has unmodeled entries, a second item writes them as zeros: “S-parameters (CSV), zeros for unmodeled entries (tool compatibility)”.
Words this manual uses
- Design: the set of inputs on the page (waveguides, materials, region, wavelength). It can be saved to your account and opened again, or shared by link.
- Design menu: the menu at the top of the tool with Save, Share and the downloads.
- Run: one Full-vectorial solve on the server, started with the Run button. The Effective index engine has no run; it updates as you type.
- Saved result: a run’s result stored with a saved design (“Saving a design with its run”). It counts toward your storage, which you can review and clear in your account.
- In a quoted page line, … stands for a value the page fills in.
- Unsaved result: a run’s result that is not saved with a design. The server keeps it for 24 hours.
How κ² is computed
A straight coupler. The page solves the coupled pair’s cross-section for its two lowest modes, which spread across both waveguides: the even and the odd supermode, with effective indices n_even and n_odd. Their difference Δn = n_even − n_odd sets everything:
- Coupling length: L_c = λ / (2Δn), the length at which the two supermodes have slipped half a wavelength against each other.
- Cross power at length L: κ² = F · sin²(πΔn·L/λ).
- F: 1 for two identical waveguides. For unequal waveguides it is computed from how much of each waveguide’s own mode lies in each supermode, so it is less than 1.
A curved coupler (S-bend, ring-bus arc, gap profile). The gap changes along the light’s path, so the page adds up the coupling gap by gap:
- Coupling phase: φ = (π/λ) ∫ Δn(g(s)) ds, integrated along the waveguide’s centerline. Δn(g) comes from the straight pair solved at a ladder of gaps.
- Cross power: κ² = F · sin² φ.
- Gap: always the distance between the waveguides’ facing edges.
- Shape: the drawn curve is the waveguide’s centerline.
- Ring-bus arc: the integral includes the arc’s flanks beyond the narrowest point, where the guides still couple weakly.
This “local” estimate assumes the gap changes slowly compared with the coupling itself. The next section says how the page checks that.
The two engines.
- Effective index: reduces each waveguide to a one-dimensional problem. It is exact for no real waveguide, but instant.
- Full-vectorial: solves the full cross-section on a finite-difference mesh. Where a supermode’s effective index lies within the mesh’s own error of the cladding, it withholds that pair’s numbers (“Two engines, and when to use each”).
How a curved coupler is checked
The gap-by-gap estimate is only as good as its assumption that each short stretch of the curved region behaves like a straight pair at its local gap. Before the page prints a curved result, it runs the method’s own checks against the design. Each check has a figure and a limit:
- No abrupt step in the gap. Inside the coupling zone, the gap table’s slope between rows must stay below the step limit. A steeper change is a junction, which this method cannot treat, so the design is refused.
- The two waveguides stay close to parallel. The check’s figure is a weighted mean-square tilt between the guides over the coupling zone.
- Caution above the amber limit.
- Refused above the refusal limit. That limit is the width of the 3D range measured on the tightest ring checked (next section).
- The integral is sampled finely enough. The figure is the change in the coupling phase φ between two interpolations of the gap table. Above the limit, the page shows a caution: a denser table would change the result.
- The tail beyond the table is small. The coupling the integral would need beyond the table’s last row must stay below a small share of the total. Otherwise the design is refused rather than extrapolated.
- On a region where both guides bend: the bend’s effect on the local coupling, beyond the stated allowance, shows as a caution. It is computed, not assumed away.
| Check | Limit | Past the limit |
|---|---|---|
| Step | steeper than 45° | refused |
| Parallelism | 2.8 % of κ² | caution |
| Parallelism | 10.7 % of κ² | refused |
| Sampling | 0.5 % of φ | caution |
| Tail | 1 % of the total coupling | refused |
| Both guides bend | the range measured in full 3D | caution |
| Table size | 2 to 1000 rows | refused at input |
Outcomes:
- If every check is inside its limit, the outcome reads “Passed”.
- If one passes with something to watch, it reads “Passed, with a caution:” and names it.
- If one fails, the page refuses the design and shows no number.
- The Design menu’s “Check behind this estimate (CSV)” lists every figure with its limit, at full precision.
What has been measured in full 3D
The page’s own estimates are cross-section methods. To test them, we ran full three-dimensional electromagnetic simulations (finite-difference time-domain) of specific designs, and compared the cross power.
Why each 3D result is a range. A 3D mesh draws a curved waveguide wall as small steps. Different, equally fine ways of drawing the same wall give slightly different answers, so each comparison is stated as the range spanned by several wall representations at the same mesh. A model value inside that range is as close to 3D as this 3D method can tell.
Ring-bus arcs (silicon strips in oxide).
| Ring radius | 3D range of κ² | Full-vectorial κ² | Width of the range |
|---|---|---|---|
| 5 µm | 0.00657 – 0.00814 | 0.00676, inside | ±11 % |
| 10 µm | 0.0124 – 0.0156 | 0.0131, inside | ±11 % |
The width of each range corresponds to about ±7 nm of gap. That is the resolution of the comparison, and the honest limit of what it confirms.
S-bend couplers. A set of S-bend designs was simulated in 3D the same way. The card’s status line for an S-bend names the nearest simulated design and how yours differs. Its figure comes from these simulations:
Where the two waveguides are closest, each bend curves away from the other waveguide. In a bent waveguide the light shifts toward the outside of the bend, which here is toward the gap, so with both waveguides bending, the light in each moves toward the other and they couple as if the gap were narrower than drawn. This estimate adds up the coupling from the gap as drawn, so it leaves that out. Full 3D simulations of the reference pair, on raised-cosine bends and one arc, with tightest radii from 3.6 to 26 µm, measured the extra coupling in the bends: 2–14 % at the gentlest and 61–80 % at the most tightly curved. How tightly your bends curve is averaged over the stretch where the waveguides couple, so a bend that is tight only briefly counts for less than one that stays tight.
What 3D does not cover. Only the designs listed in this section have been compared in 3D. Any other design rests on the cross-section calculation and its mesh checks alone, and its status line says so by its absence.
Accuracy of the Effective index engine
The Effective index engine is fast because it approximates the waveguide. How far its coupling length strays was measured against the full-vectorial engine on its 20 nm mesh, on the page’s own core types, at every gap listed. The card’s accuracy clause uses the same comparison. At one gap per core (200 nm), the full-vectorial engine was also run at 10 nm. That second column shows how much the 20 nm reference itself moves.
| Core type | Gaps measured | Effective index L_c against full-vectorial (20 nm mesh; 10 nm at 200 nm) |
|---|---|---|
| Si 500 × 220 nm, Air above, SiO₂ below, at 1550 nm | 150 nm, 200 nm, 300 nm | -32 % to -30 %; -33 % to -32 % |
| n = 3.476 500 × 220 nm, n = 1.444 above, n = 1.444 below, at 1550 nm | 200 nm, 300 nm | -36 % to -32 %; -34 % to -33 % |
| Si 800 × 220 nm, Air above, SiO₂ below, at 1550 nm | 200 nm, 300 nm, 400 nm | -41 % to -40 %; -43 % to -42 % |
| Si₃N₄ 1000 × 400 nm, Air above, SiO₂ below, at 1550 nm | 200 nm, 400 nm, 600 nm | -7 % to 24 %; -7 % to -6 % |
| Si 450 × 150 nm, Air above, SiO₂ below, at 1310 nm | 200 nm, 300 nm, 400 nm | -30 % to -26 %; -33 % to -32 % |
| Si₃N₄ 1000 × 400 nm, SiO₂ above, SiO₂ below, at 1550 nm | 200 nm, 400 nm, 600 nm | -25 % to -12 %; -13 % to -12 % |
How to read it:
- A negative value means the Effective index engine’s L_c is shorter than the full-vectorial one.
- The size and even the sign of the error depend on the core. That is why the card prints the clause for your core type, and “accuracy not measured for this core” for any core not in this table.
- Use the Effective index engine to explore, and the full-vectorial engine for the more accurate estimate.