Component FDTD simulations

Component FDTD simulations#

Thanks to the GDSFactory plugin you can directly run simulations in different FDTD solvers.

See tutorial

Meep is open source and does not require a license. However, both tidy3d and Lumerical require licenses to use.

Tidy3d#

tidy3D is a fast GPU based FDTD tool developed by flexcompute.

To run, you need to create an account and add credits. The number of credits that each simulation takes depends on the simulation size and computation time.

cloud_model

import gplugins as sim
import gplugins.tidy3d as gt

import ubcpdk.components as pdk
from ubcpdk.config import PATH
c = pdk.ebeam_y_1550()
c.plot()
../_images/9a8bcb278df47b479658862aa2c0bcb4db9b365e42bcf2e4c93dd3343a3d4c27.png
sp = gt.write_sparameters(c, filepath=PATH.sparameters / "ebeam_y_1550_20634f71.npz")
17:36:53 UTC WARNING: 'simulation.structures[0]' is outside of the simulation   
             domain.                                                            
             WARNING: 'simulation.structures[0]' is outside of the simulation   
             domain.                                                            
Simulation loaded from PosixPath('/__w/ubc/ubc/sparameters/ebeam_y_1550_20634f71.npz')
sp.keys()
dict_keys(['o1@0,o1@0', 'o2@0,o1@0', 'o3@0,o1@0', 'o1@0,o2@0', 'o2@0,o2@0', 'o3@0,o2@0', 'o1@0,o3@0', 'o2@0,o3@0', 'o3@0,o3@0', 'wavelengths'])
sim.plot.plot_sparameters(sp)
../_images/e1388eeb38cef926e5fa4b449a3736c4485e699b5d01eeb2c61ef817da71e830.png
sim.plot.plot_loss1x2(sp)
../_images/7a822f4331325204adb02f676bf5407ddbdf146efebc4c132749794d876f37a5.png
sim.plot.plot_imbalance1x2(sp)
../_images/73c5ecd9eb5875679176e749c70e731de3261ff696d239926505362853074ebe.png

Lumerical FDTD#

You can write the Sparameters for all components in the UBC ubcpdk.components PDK using lumerical FDTD plugin in gplugins

To run simulations uncomment the following lines

import gplugins as sim

import ubcpdk.components as pdk
for f in [
    pdk.bend,
    pdk.coupler,
    pdk.coupler_ring,
    pdk.ebeam_y_1550,
    pdk.ebeam_crossing4,
]:
    component = f()
    component.plot()
    # ls.write_sparameters_lumerical(component=component)
../_images/5d7173897f0b670d4b228e59e275bcb5433ffd745c1dbe8d36afae18d74db136.png ../_images/e832ce55d4e3710660a324467c550c29db107c921ec0dcbf3d255c467a46f2ab.png ../_images/5b5785010fc2a3b10666513dd93af829d7e6909d8f038a1fe5b5bbcd71182a40.png ../_images/9a8bcb278df47b479658862aa2c0bcb4db9b365e42bcf2e4c93dd3343a3d4c27.png ../_images/11ac720485e135894c0d6564531f21e5798582bce902796b0ffedeccca804404.png
# sp = ls.read.read_sparameters_lumerical(component=ubcpdk.components.straight())
# sim.plot_sparameters(sp)