Multimode interference (MMI) coupler
计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。
--------------------------------------------------------官网文本部分----------------------------------------------------------------------------
一、概述
了解模拟工作流程和关键结果
低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的良好匹配,可以将损耗降至最低。
EME 求解器非常适合表征这些设备。本例中的器件针对 TE 模式进行了优化,但该方法可以扩展到任何设计和极化。
第1步:
使用 EME 运行参数扫描以优化 MMI 几何形状。此示例对锥形宽度和干涉区域长度参数进行扫描。输出端口的传输是品质因数。
第2步:
找到最佳设计后,将 S 参数提取为每个感兴趣模式的波长函数。这些将用于在 INTERCONNECT 中创建紧凑模型。
第 3 步:
在 INTERCONNECT 中创建一个紧凑模型,使用光学 n 端口 s 参数 (SPAR) 元素并从步骤 2 导入数据。
使用 CML 编译器生成紧凑模型
要使用 CML Compiler 生成 MMI 耦合器的紧凑模型,只需跳过步骤 3 并将在步骤 2 中提取的数据提供给 CML Compiler。 如果您不熟悉此示例,我们强烈建议您先阅读前面的部分并了解各个步骤,然后再转到 CML 编译器的参数提取部分(Parameter extraction for CML Compiler)。
二、运行和结果
运行模型的说明和关键结果的讨论
第 1 步:优化 MMI 几何
运行一系列参数扫描以优化 MMI 性能。 扩展示例以扫描示例中未直接涵盖的其他参数很简单。
⋅ \cdot ⋅模式收敛扫描:确保每个单元中的模式数量足以给出准确的结果。 模式收敛扫描是确保模拟结果可靠的重要部分,应作为 EME 模拟文件初始设置的一部分进行。
⋅ \cdot ⋅波长扫描:EME 是一个单频求解器。 要获得宽带结果,需要进行参数扫描。
⋅ \cdot ⋅核心长度扫描:确定核心部分的最佳长度。 涉及更改区域长度的扫描非常适合 EME 求解器,因为几乎可以立即获得结果。
⋅ \cdot ⋅锥形宽度扫描:确定锥形区域的最佳宽度。
模式收敛扫描
1.打开 MMI.lms 模拟并运行它。
2.在 EME 分析窗口中,启用模式收敛扫描,模式间隔为 1。按下模式扫描按钮,然后可视化数据。
3.在可视化窗口中,仅保留 s21 属性并将标量运算设置为 Abs^2。 该图显示了输出端口中的传输作为模式数量的函数。
4.要加快仿真时间,请启用覆盖最大模式(override max modes )并将最大模式值设置为 20。
5.按下 eme propagate按钮,然后从 field_profile 监视器可视化场分布。
下图显示来自输出端口的传输结果正在以约 15 种模式收敛。 使用稍大的值来确保模式数量足以用于本示例中使用的其他扫描(如波长、纤芯长度和锥度宽度)。 从 field_profile 监视器获得的电场强度也显示在下图中。
波长扫描
6.在 EME 分析窗口中,启用波长扫描。将波长扫描设置为 1.5-1.6 µm,具有 100 个波长点。按波长扫描,然后可视化波长扫描。
7.在可视化窗口中,仅保留 s21 属性并将标量运算设置为 Abs^2。绘图显示了作为波长函数的输出端口中的传输。
波长扫描选项卡返回用户 s 矩阵( the user s-matrix)。然后可以从用户 s 矩阵的 S21 元素计算从端口 1 通过端口 2 在基本 TE 模式下的传输。右图显示了使用 EME 分析窗口中的波长扫描功能获得的 1.1 µm 锥度宽度的 MMI 透射率与波长的函数关系。
波长扫描是一种从 EME 求解器获得宽带结果的快速方法。但是,重要的是要了解波长扫描会做出一些近似以使计算运行得更快。应使用“优化和扫描”(Optimization and Sweeps)窗口中较慢但更准确的波长扫描来检查结果。
核心长度扫描
8.启用传播扫描并选择组跨度 2。相应地将开始和停止长度设置为 10 µm 和 200 µm。 将间隔设置为 1,然后按 eme sweep,然后可视化 eme sweep。
9.在可视化窗口中,仅保留 s21 属性并将标量运算设置为 Abs^2。 该图显示了作为干涉区域长度函数的输出端口中的传输。
下图显示了传输作为核心长度的函数。 如图所示,最大传输发生在约 37 µm 的纤芯长度处。
锥形宽度扫描
10.加载 MMI_sweep_taper.lsf 脚本文件并运行它。 结构组的锥度宽度属性上的参数扫描任务将返回用户 s 矩阵,并将提供作为锥度宽度函数的损失图。
在“Optimizations and Sweeps”窗口中,设置参数扫描任务,对0.4-1.1微米之间结构组的锥度宽度属性进行扫描,收集用户s-matrix。 脚本文件用于运行此参数扫描并收集用户 s-matrix 结果。 然后将从用户 s 矩阵的 S21 元素获得的值加倍以通过两个输出端口进行传输。 结果如下图所示。
第 2 步:S 参数提取
11.运行 MMI_write_s_params.lsf 以提取 INTERCONNECT 中 N 端口 S 参数对象的 s 参数。
MMI_write_s_params.lsf 脚本文件提取 1×2 MMI 耦合器的 s 参数(作为 TE 和 TM 模式的波长函数)并将它们保存到文件 MMI-s-params.txt 与光 N 端口 S - 组延迟选项的参数文件格式。 有关详细信息,请参阅附录:S 参数提取。
右侧的图显示了 TE 和 TM 模式到输出端口之一的传输。 正如预期的那样,TE 模式性能更好,因为该设备是为 TE 模式设计的。
第 3 步:INTERCONNECT 中的回路仿真
12.打开 MMI_circuit.icp 文件。
13.将 MMI-s-params.txt 加载到 SPAR 元素中。
14.通过更改 ONA 中的正交标识符,针对 TE 和 TM 模式运行仿真两次。
15.可视化来自 ONA 的每个极化的传输结果。
通过重现上一步中获得的传输曲线来验证 MMI 紧凑模型。 该图显示了两种极化的透射率。
三、重要的模型设置
此模型中使用的重要对象和设置的描述
模型设置脚本
MMI_coupler 对象中的设置脚本用于设置 1×2 MMI 耦合器的几何形状。该脚本是确保 MMI 耦合器几何形状正确的便捷方法。 MMI 耦合器的位置必须通过设置脚本设置。其他属性,例如模拟区域和网格覆盖位置,应直接在对象中进行修改。
网格覆盖区域
在锥形波导上使用网格覆盖,以确保它们的宽度和厚度是网格单元的整数倍。
对称
在 Z 方向使用对称边界条件 (BC) 以减少仿真时间。沿 z 方向的对称(反对称)BC 会将求解器限制为干涉区域中的仅 TE- (TM-) 模式。
虽然结构沿 y 方向对称,但必须模拟整个几何结构以获得正确的 S 参数。这是因为一旦应用了沿 y 方向的对称性,端口 3 将位于仿真区域之外并且不会被仿真。
波长扫描
有两种方法可以获得宽带结果。 EME 分析窗口中的“波长扫描”功能非常适合获得初始结果,因为它非常快。为了获得更准确的结果,有必要对每个波长运行完整的 EME 模拟。使用优化和扫描窗口中的“wavelength_sweep”来执行此操作。
长度扫描
EME 是一种理想的产品,可以在几乎没有额外成本的情况下对几何体的任何部分进行长度扫描。这有利于快速优化目的。但是,在使用标准优化功能运行优化时,不能使用特殊的 EME 长度扫描。要运行涉及更改长度的优化,设备长度以及其他对象(例如模拟区域)必须以与任何其他参数相同的方式进行参数化。
四、使用您的参数更新模型
根据您的设备参数更新模型的说明
MMI 耦合器经过参数化处理,可以更轻松地设置几何形状。该模板目前使用带有锥形波导的 1×2 MMI 耦合器。在“1×2 端口 MMI 耦合器”中指定参数后,对象的大小将被更新。
1.设置 MMI 耦合器的锥形和干涉区域的几何形状。
2.直接调整模拟区域和网格覆盖位置以考虑 MMI 几何的变化
3.设置 MMI 耦合器的材料或折射率。
4.当场和结构都存在对称性时,可以利用对称边界条件来减少内存和模拟时间。建议为您的初始模拟禁用对称性,因为选择正确的对称性可能具有挑战性。
五、CML 编译器的参数提取
用于 CML 编译器的参数提取说明以生成紧凑模型
在步骤 2 中使用自动脚本方法提取包括组索引的 S 参数数据。该数据已经具有所需的格式,并且可以被 CML 编译器用于为 MMI 耦合器生成紧凑模型。 请注意,CML 编译器的运行超出了本示例的范围。 有关 CML 编译器的更多信息,请访问产品页面。
1.打开模拟文件 MMI.lms 和脚本文件 MMI_write_s_params.lsf。
2.运行脚本。
六、让模型更进一步
为想要进一步定制模型的用户提供的信息和提示
⋅ \cdot ⋅可以定义一个更复杂的品质因数,既最大化前向传输又最小化背向反射。 abs(S11)^2 给出背反射功率。
⋅ \cdot ⋅varFDTD 求解器可用作优化 MMI 设备的补充工具。 varFDTD 更适合提供宽带结果,而 EME 非常适合在每个单元组的长度上运行扫描。
⋅ \cdot ⋅应该使用更慢但更准确的 3D FDTD 模拟来验证 EME 和 varFDTD 模拟的结果。
--------------------------------------------------------自学剖析部分----------------------------------------------------------------------------
一、结构设置
打开官网下载的仿真案例文件,大概长这个样
上图中:
⋅ \cdot ⋅coupler length和coupler length分别指耦合的长度和宽度,即中间长方形部分,MMI_core。
⋅ \cdot ⋅separation是右边输出波导的分开长度
⋅ \cdot ⋅taper length是左右锥形的长度
⋅ \cdot ⋅taper width是左右锥形较宽部分的宽度
⋅ \cdot ⋅waveguide width是左右锥形较窄部分的宽度
⋅ \cdot ⋅z span是z方向上的厚度
Script文本:
deleteall;
####################################################
# 1x2 port MMI coupler
# MMI coupler with taper between MMI region and input/output
# waveguides.
#
# Input properties
# total length
# coupler length
# coupler width
# waveguide width
# taper length
# taper width
# z span
# separation
# material
#
# Tags: MMI multimode interference coupler taper
#
# Copyright 2014 Lumerical Solutions Inc
###################################################### simplify variable names by removing spaces
total_length = %total length%;
coupler_length = %coupler length%;
coupler_width = %coupler width%;
taper_length = %taper length%;
taper_width = %taper width%;
waveguide_width = %waveguide width%;
z_span = %z span%;# add MMI coupling region
addrect;
set("name","MMI_core");
set("material",material);
set("x",0);
set("x span",coupler_length);
set("y",0);
set("y span",coupler_width);
set("z",0);
set("z span",z_span);# add tapered regions
addpoly;
set("name","left taper");
set("material",material);
set("z",0);
set("z span",z_span);
# calculate x, y vertex positions
x= [-coupler_length/2-taper_length; -coupler_length/2; -coupler_length/2; -coupler_length/2-taper_length];
y= [waveguide_width/2; taper_width/2; -taper_width/2; -waveguide_width/2];
V=[x,y];
set("vertices",V);addpoly;
set("name","right upper taper");
set("material",material);
set("z",0);
set("z span",z_span);
# calculate x, y vertex positions
x= [coupler_length/2+taper_length; coupler_length/2; coupler_length/2; coupler_length/2+taper_length];
y= [waveguide_width/2; taper_width/2; -taper_width/2; -waveguide_width/2] + separation/2;
V=[x,y];
set("vertices",V);addpoly;
set("name","right lower taper");
set("material",material);
set("z",0);
set("z span",z_span);
# calculate x, y vertex positions
x= [coupler_length/2+taper_length; coupler_length/2; coupler_length/2; coupler_length/2+taper_length];
y= [waveguide_width/2; taper_width/2; -taper_width/2; -waveguide_width/2] - separation/2;
V=[x,y];
set("vertices",V);
二、EME设置
背景折射率设置为1.444,模拟SiO2的包层
z轴上使用了对称条件
另有三个端口,设置在左右两侧
三、结果分析
模式收敛扫描
扫描结果
只看S21
覆盖最大模式在这里
场分布结果
波长扫描
扫描结果:
只看S21:
核心长度扫描
锥形宽度扫描
MMI_sweep_taper.lsf
#######################################
# MMI_sweep.lsf
#
# This script file runs MMI.lms and sweeps over the
# width of the linear taper at the interface between
# the waveguide and the MMI region, plots the loss
# over taper width, and the field profile for the maximum
# taper width over the sweep range.
# 此脚本文件运行 MMI.lms 并扫描波导和 MMI 区域之间界面处的线性锥形宽度,
# 绘制锥形宽度上的损耗,以及扫描范围内最大锥形宽度的场分布。
# Copyright 2014 Lumerical Solutions Inc
######################################### run the sweep over taper width
runsweep("taper_width_sweep");# collect sweep results
s_matrix = getsweepresult("taper_width_sweep","s-matrix");
usr_s_matrix = getattribute(s_matrix,"user s matrix");
taper_width = getparameter(s_matrix,"taper_width");# calculate transmission
s_21 = usr_s_matrix(2,1,1:length(taper_width));
trans = 2*abs(s_21)^2; #两个输出端口plot(taper_width*1e6,-10*log10(trans),"Taper width (um)","Loss (dB)");
参数扫描相关设置:
运行程序:
S 参数提取
11.运行 MMI_write_s_params.lsf 以提取 INTERCONNECT 中 N 端口 S 参数对象的 s 参数。
MMI_write_s_params.lsf 脚本文件提取 1×2 MMI 耦合器的 s 参数(作为 TE 和 TM 模式的波长函数)并将它们保存到文件 MMI-s-params.txt 与光 N 端口 S - 组延迟选项的参数文件格式。 有关详细信息,请参阅附录:S 参数提取。
右侧的图显示了 TE 和 TM 模式到输出端口之一的传输。 正如预期的那样,TE 模式性能更好,因为该设备是为 TE 模式设计的。
Script:
clear;
# 1x2 MMI file
filename = "MMI.lms";lambdac = 1.55e-6; # for group delay calculations
fc=c/lambdac;# port definitions for S-parameter files
ports = cell(3);
locations = cell(3);
ports{1} = "opt_1";
ports{2} = "opt_2";
ports{3} = "opt_3";
locations{1} = "LEFT";
locations{2} = "RIGHT";
locations{3} = "RIGHT";name = splitstring(filename,'.lms'); #分隔字符串
name = name{1};txtfilename = name+"-s-params"+".txt"; #S-parameter file name
if(fileexists(txtfilename)) { rm(txtfilename); }## Running simulations for TE and TM polarizations
#TE
load(name+".lms");
switchtolayout;
save(name+"_TE.lms");
setnamed("EME","z min bc", "Symmetric"); #forces TE mode to be selected
setnamed("EME","wavelength",lambdac);
run;
setemeanalysis("calculate group delays",1);
emepropagate;
groupdelay_TE = getresult("EME","user group delay");runsweep("wavelength_sweep");
s_matrix_TE=getsweepresult("wavelength_sweep","s-matrix");#TM
switchtolayout;
setnamed("EME","z min bc", "Anti-Symmetric"); #forces TM mode to be selected
save(name+"_TM.lms");
setnamed("EME","wavelength",lambdac);
run;
setemeanalysis("calculate group delays",1);
emepropagate;
groupdelay_TM = getresult("EME","user group delay");
runsweep("wavelength_sweep");
s_matrix_TM = getsweepresult("wavelength_sweep","s-matrix");# define mode number/ID
for (mode_ID_num = 1:2){if (mode_ID_num==1){s_matrix = s_matrix_TE;GD = groupdelay_TE;mode_ID = "TE";}else{s_matrix = s_matrix_TM;GD = groupdelay_TM;mode_ID = "TM";}# extract s-parametersspar = getattribute(s_matrix,"user s matrix");wl = getparameter(s_matrix,"wavelength");wl = transpose(wl);wl=flip(wl,1);f=c/wl; #transpose转置 flip翻转矩阵S11=pinch(spar(1,1,1:length(wl)));S12=pinch(spar(1,2,1:length(wl)));S13=pinch(spar(1,3,1:length(wl)));S21=pinch(spar(2,1,1:length(wl)));S22=pinch(spar(2,2,1:length(wl)));S23=pinch(spar(2,3,1:length(wl)));S31=pinch(spar(3,1,1:length(wl)));S32=pinch(spar(3,2,1:length(wl)));S33=pinch(spar(3,3,1:length(wl)));S11=flip(S11,1);S12=flip(S12,1);S13=flip(S13,1);S21=flip(S21,1);S22=flip(S22,1);S23=flip(S23,1);S31=flip(S31,1);S32=flip(S32,1);S33=flip(S33,1);plot(wl/1e-6,abs(S21)^2,"wavelength (um)","T","MMI","color=red,linewidth=2");plot(wl/1e-6,unwrap(angle(S21)),"wavelength (um)","(rad)","1x2 MMI Phase","color=red,linewidth=2");# write s-parameter file? "Writing " + name + ": "+mode_ID;format short;if (mode_ID_num==1){for (i=1:3) {write(txtfilename,'["'+ports{i}+'","'+locations{i}+'"]');}}for (i=1:3) {for (j=1:3) {text='("';text=text + ports{i} + '","' + mode_ID + '",'+ num2str(mode_ID_num)+',';text=text + '"';text=text + ports{j} + '",' + num2str(mode_ID_num)+ ',"transmission",';text=text + num2str(GD(i,j))+')';write(txtfilename,text);matrix_size="("+num2str(length(wl))+",3)";write(txtfilename,matrix_size);name_s = "S"+num2str(i)+num2str(j);#temp = "temp=[f, abs(" + name_s + "),unwrap(angle(" + name_s + "))];";temp = "temp=[f, abs(" + name_s + "),unwrap(angle(" + name_s + "))-2*pi*GD(i,j)*(f-fc)];";eval(temp);format long;write(txtfilename,num2str(temp));format short;}}}
cell:
splitstring
分割字符串,endl作为分割依据,S2是cell数组
fileexists
rm
wavelength_sweep
flip
angle
unwrap