[File 2]
#############################################################################
# Python Module: varFDTD_y_branch.py
#
# Description:
# This module defines the y_brach_init_() function used in the
# optimization for inverse design of the SOI Y-branch in 2D
#
# Steps include:
# 1. Define the base simulation parameters
# 2. Add non-dispersive materials
# 2. Define the geometry of input and output waveguides
# 3. Set up source and monitors and simulation region
#
# Copyright 2019, Lumerical Solutions, Inc.
##############################################################################
######## IMPORTS ########
# General purpose imports
import lumapi
import numpy as np
from scipy.constants import c
def y_branch_init_(mode):
## CLEAR SESSION
mode.switchtolayout()
mode.selectall()
mode.delete()
## SIM PARAMS
size_x=40e-6;
size_y=20e-6;
mesh_x=200e-9;
mesh_y=200e-9;
finer_mesh_size=19e-6;
mesh_accuracy=4;
lam_c = 1.550e-6;
thickness=2e-6;
separation=5e-6; #waveguide separation
coupler_length=24e-6;
width=2.4e-6; #waveguide
length=10e-6; #connecting waveguide
## MATERIAL
opt_material=mode.addmaterial('Dielectric');
mode.setmaterial(opt_material,'name','Si: non-dispersive');
n_opt = mode.getindex('Si (Silicon) - Palik',c/lam_c);
mode.setmaterial('Si: non-dispersive','Refractive Index',n_opt);
#print(n_opt);
sub_material=mode.addmaterial('Dielectric');
mode.setmaterial(sub_material,'name','SiO2: non-dispersive');
n_sub = mode.getindex('SiO2 (Glass) - Palik',c/lam_c);
mode.setmaterial('SiO2: non-dispersive','Refractive Index',n_sub);
mode.setmaterial('SiO2: non-dispersive',"color", np.array([0, 0, 0, 0]));
air_material=mode.addmaterial('Dielectric');
mode.setmaterial(opt_material,'name','air');
mode.setmaterial('air','Refractive Index',1);
wg_material=mode.addmaterial('Dielectric');
mode.setmaterial(opt_material,'name','SU-8');
mode.setmaterial('SU-8','Refractive Index',1.573);
## GEOMETRY
#INPUT WAVEGUIDE
mode.addrect();
mode.set('name','input wg');
mode.set('x span',10e-6);
mode.set('y span',width);
mode.set('z span',thickness);
mode.set('y',-separation/2);
mode.set('x',-coupler_length/2-length/2);
mode.set('z',0);
mode.set('material','SU-8');
mode.addrect();
mode.set('name','input wg 2');
mode.set('x span',10e-6);
mode.set('y span',width);
mode.set('z span',thickness);
mode.set('y',separation/2);
mode.set('x',-coupler_length/2-length/2);
mode.set('z',0);
mode.set('material','SU-8');
#OUTPUT WAVEGUIDES
mode.addrect();
mode.set('name','output wg top');
mode.set('x span',10e-6);
mode.set('y span',width);
mode.set('z span',thickness);
mode.set('y',separation/2);
mode.set('x',coupler_length/2+length/2);
mode.set('z',0);
mode.set('material','SU-8');
mode.addrect();
mode.set('name','output wg bottom');
mode.set('x span',10e-6);
mode.set('y span',width);
mode.set('z span',thickness);
mode.set('y',-separation/2);
mode.set('x',coupler_length/2+length/2);
mode.set('z',0);
mode.set('material','SU-8');
mode.addrect();
mode.set('name','sub');
mode.set('x span',100e-6);
mode.set('y span',100e-6);
mode.set('z span',10e-6);
mode.set('y',0);
mode.set('x',0);
mode.set('z',0);
mode.set('material','SiO2: non-dispersive');
mode.set('override mesh order from material database',1);
mode.set('mesh order',3);
mode.set('alpha',0.8);
## varFDTD
mode.addvarfdtd();
mode.set('mesh accuracy',mesh_accuracy);
mode.set('x min',-size_x/2);
mode.set('x max',size_x/2);
mode.set('y min',-size_y/2);
mode.set('y max',size_y/2);
mode.set('z',0);
mode.set('z span',4e-6);
mode.set('effective index method','variational');
mode.set('can optimize mesh algorithm for extruded structures',1);
mode.set('clamp values to physical material properties',1);
mode.set('x0',-1.3e-6);
mode.set('number of test points',4);
mode.set('test points',np.array([[0, 0],[1.3e-6, 0.4e-6], [1.3e-6, -0.4e-6], [1.3e-6, 0]]));
## SOURCE
mode.addmodesource();
mode.set('direction','Forward');
mode.set('injection axis','x-axis');
#mode.set('polarization angle',0);
mode.set('y',-separation/2);
mode.set("y span",width);
mode.set('x',-coupler_length/2-5e-6);
mode.set('center wavelength',1550e-9);
mode.set('wavelength span',0);
mode.set('mode selection','fundamental mode');
## MESH IN OPTIMIZABLE REGION
mode.addmesh();
mode.set('x',0);
mode.set('x span',finer_mesh_size);
mode.set('y',0);
mode.set('y span',finer_mesh_size);
mode.set('dx',mesh_x);
mode.set('dy',mesh_y);
mode.set('z span',4e-6);
## OPTIMIZATION FIELDS MONITOR IN OPTIMIZABLE REGION
mode.addpower();
mode.set('name','opt_fields');
mode.set('monitor type','2D Z-normal');
mode.set('x',0);
mode.set('x span',0.95*size_x);
mode.set('y',0);
mode.set('y span',0.95* size_y);
mode.set('z',0);
## FOM FIELDS
mode.addpower();
mode.set('name','fom');
mode.set('monitor type','Linear Y');
mode.set('x',coupler_length/2+1.5e-6);
mode.set('y',0);
mode.set('y span',size_y);
mode.set('z',0);
if __name__ == "__main__":
mode = lumapi.MODE(hide = False)
y_branch_init_(mode)
input('Press Enter to escape...')