Source code for gdsfactory.components.optimal_90deg
from __future__ import annotations
import numpy as np
from gdsfactory.cell import cell
from gdsfactory.component import Component
from gdsfactory.snap import snap_to_grid
from gdsfactory.typings import LayerSpec
[docs]
@cell
def optimal_90deg(
width: float = 100,
num_pts: int = 15,
length_adjust: float = 1,
layer: LayerSpec = (1, 0),
) -> Component:
"""Returns optimally-rounded 90 degree bend that is sharp on the outer corner.
Args:
width: Width of the ports on either side of the bend.
num_pts: The number of points comprising the curved section of the bend.
length_adjust: Adjusts the length of the non-curved portion of the bend.
layer: Specific layer(s) to put polygon geometry on.
Notes:
Optimal structure from https://doi.org/10.1103/PhysRevB.84.174510
Clem, J., & Berggren, K. (2011). Geometry-dependent critical currents in
superconducting nanocircuits. Physical Review B, 84(17), 1–27.
"""
D = Component()
# Get points of ideal curve
a = 2 * width
v = np.logspace(-length_adjust, length_adjust, num_pts)
xi = (
a
/ 2.0
* ((1 + 2 / np.pi * np.arcsinh(1 / v)) + 1j * (1 + 2 / np.pi * np.arcsinh(v)))
)
xpts = list(np.real(xi))
ypts = list(np.imag(xi))
# Add points for the rest of curve
d = 2 * xpts[0] # Farthest point out * 2, rounded to nearest 100
xpts.append(width)
ypts.append(d)
xpts.append(0)
ypts.append(d)
xpts.append(0)
ypts.append(0)
xpts.append(d)
ypts.append(0)
xpts.append(d)
ypts.append(width)
xpts.append(xpts[0])
ypts.append(ypts[0])
D.add_polygon([xpts, ypts], layer=layer)
D.add_port(
name="e1",
center=snap_to_grid((a / 4, d)),
width=a / 2,
orientation=90,
layer=layer,
)
D.add_port(
name="e2",
center=snap_to_grid((d, a / 4)),
width=a / 2,
orientation=0,
layer=layer,
)
return D
if __name__ == "__main__":
c = optimal_90deg()
c.show(show_ports=True)
c.assert_ports_on_grid()