官网链接:https://optics.ansys.com/hc/en-us/articles/360042800333-Y-branch-optimization-using-particle-swarm-algorithm
组件优化是任何致力于开发高性能光子器件的设计过程的关键步骤。 此绝缘体上硅 Y 分支示例演示了适用于任意优化例程的通用组件形状参数化方法。 此示例中的算法是 Lumerical 的内置粒子群优化 (PSO),可通过用户界面轻松设置。 此外,建议的优化过程展示了如何将 varFDTD 与全 3D FDTD 求解器相结合,以显着减少优化时间,同时保持高精度。
一、概述
了解模拟工作流程和关键结果
组件优化工作流程可以成功地概括为三个主要步骤——模型参数化、优化和验证。 优化算法通常需要多次运行模拟以发现趋势并找到最佳参数。 此外,所需模拟的数量随着优化参数的数量而增加。 因此,通常建议从一个简单的模型开始并多次迭代工作流,同时增加复杂性以微调性能。
第 1 步:模型参数化
参数化组件模型可以说是最耗时的步骤,它直接影响优化算法找到最佳解决方案的概率。因此,努力分析哪些模型属性对品质因数 (FOM) 的影响最大并找到一种通过少量标量参数控制它们的有效方法是非常值得的。
在 Y 分支示例中,我们只能通过 y 方向上的分离器壁形状来影响组件性能,因为材料和层厚度由制造过程锁定。实现的模型使用沿 x 轴等距分布的 13 个宽度点通过样条函数定义分割器形状。这种方法允许用有限数量的标量值完全控制形状,同时保证其形状不会发生阶跃变化。
第 2 步:优化
Lumerical 的内置随机 PSO 提供了一种通过 GUI 实现优化算法的便捷方式。 PSO 的主要要求是能够提供 FOM 和模型参数作为对象树中任意对象的结果或属性。在这个例子中,我们特别定义:
品质因数(Figure of merit):模型分析脚本用于根据输出分支中的净传输计算插入损耗,并设置为模型结果。
模型参数(Model parameters):13 个宽度参数被指定为名为“splitter”的结构组的用户属性。
运行优化将返回一组定义 Y 分支形状以获得最佳插入损耗的宽度参数。
第 3 步:验证
由于优化模拟通常旨在找到准确度和计算时间之间的良好折衷,因此有必要使用最佳参数进行收敛测试以验证组件的性能。
在此示例中,我们通过优化 varFDTD 求解器中的组件来实现这一点,该求解器可显着缩短仿真时间,而精度损失很小。然后通过 GDS 文件从 varFDTD 导出 Y 分支形状并在全 3D FDTD 求解器中重新运行仿真来验证优化的设计。
二、运行和结果
运行模型的说明和关键结果的讨论
第 1 步:参数化模型
此示例的第一步将引导您完成提供的参数化 Y 分支模型。此步骤的主要目标是强化模型参数化背后的主要概念,并以未优化的品质因数形式提供基准值。
1.打开 Y_branch_PSO.lms,右键单击“splitter”结构组并从菜单中选择“properties”
2.将标量值分配给 w1 - w13 参数,将分离器的宽度定义为 x 坐标的函数。使用您的最佳猜测或保留默认的未优化值。
3.运行模拟
4.通过右键单击“model”并选择“Visualize”->“insertion_loss”,注意未优化的 Y 分支的插入损耗
5.切换到布局
结果
在使用默认参数值运行 varFDTD 仿真后,我们能够记录 1.21 dB 的未优化插入损耗。
第 2 步:运行优化
1.在“Optimizations and sweep”选项卡中选择“optimization”,然后单击编辑按钮
2.验证 w1 - w13 参数是否设置为优化参数,计算的插入损耗是否设置为品质因数。必须设置优化以最小化 FOM。
3.运行优化,直到插入损耗达到低于 0.2 dB 的值
4.通过运行 Y_branch_apply_optimized_parameters.lsf 将优化的参数值加载到模型中。
笔记 :
如果您不想运行优化,请将第 7 行的 param_source 值更改为2。模型将应用参考论文中的参数值。
5.运行 Y_branch_GDS_auto_export.lsf 将优化的 Y 结结构导出到 GDSII 文件中
结果
运行优化程序后,我们在 30 代内实现了 0.11 dB 的优化插入损耗,低于 0.2dB 的目标值,与步骤 1 中记录的未优化插入损耗 1.26dB 相比有了相当大的改善。下图显示了优化期间的 Y 分支配置文件开发和 FOM 作为代际数的函数。值得注意的是,在前十代中实现了低于 0.2dB 的插入损耗,进一步优化仅提供了边际改进。结合 varFDTD 求解器的速度,我们能够在 10 分钟的模拟时间内在普通办公室台式计算机上实现低于 0.2dB 的插入损耗。
未优化的参考形状(左)和优化的形状(右)之间的 Y 分支形状比较,插入损耗分别为 1.26 和 0.1 dB:
第 3 步:验证 FDTD 中的结果
1.在 FDTD 中打开 Y_branch_PSO_3D_verification.fsp
2.打开并运行脚本 Y_branch_PSO_GDS_import.lsf 以从步骤 2 中创建的 GDS 文件中导入优化的 Y 分支形状。
3.运行 FDTD 模拟
4.从模型结果中获取最终插入损耗
结果
最终的 FDTD 仿真返回 0.19dB 的插入损耗,这满足了我们寻找插入损耗低于 0.2dB 的 Y 分支形状的目标。预计 2.5D varFDTD 和全 3D FDTD 求解器之间的差异是由于 varFDTD 引入的简化,即通过折叠 z 方向的折射率。结果彼此接近,最终的 3D 模拟为我们的优化结果提供了可喜的信心提升。我们建议访问 Lumerical 的 varFDTD100 课程,以更好地了解何时应使用 varFDTD 求解器以及如何进行收敛测试以实现更高的准确性。该链接在“additional resources”部分提供。
三、重要的模型设置
此模型中使用的重要对象和设置的描述
用样条函数定义组件形状
当我们将每个网格单元想象为二进制变量(Si 材料存在是/否)时,优化组件形状的挑战之一是几乎无限数量的不同形状组合。为了克服这个问题,我们需要找到一种通过相对较少的变量来定义形状的方法。此外,希望形状平滑变化并避免阶跃变化。这个问题的一个更明显的解决方案是在 xy 平面上定义有限的点组合,并通过多项式函数对它们进行插值。
Y 分支分离器使用 Lumerical 的内置样条函数来完成此任务。该函数的输入是定义分离器的 y 跨度的 13 个宽度点 (w1-w13),然后三次样条对整个 x 跨度内的所有剩余点进行插值,有效地定义了分离器壁的形状。
将参数传递给优化例程
一旦定义了模型参数,就需要将它们作为对象属性公开。这允许外部算法(例如优化或扫描)修改参数并有效地更改模拟设置。模型和结构组对象对此特别有用。它们允许用户在控制模拟的自定义设置脚本中定义用作输入变量的用户属性。
在这种情况下,我们将 w1 - w13 定义为名为“splitter”的结构组的用户属性。然后在结构组的设置脚本中使用这些变量,将它们传递给样条函数,定义充当 Y 分支主体的多边形对象的形状。然后可以通过 PSO 或任何其他外部算法控制这些属性。
插入损耗作为品质因数:
无源 Y 分支的最终目标是以最小的损失分割输入。 该属性可以通过插入损耗很好地定义。 实际上,我们还希望以 1550nm +/-50nm 的宽带术语来捕捉这一特性。 此外,PIC 设计者通常只对传输到基模的光量感兴趣。 为了满足这些要求,我们将插入损耗计算为:
其中 Tnet 是进入输出波导基模的净传输。 由于 Tnet 在多个频率点被捕获,我们计算平均传输以获得整个指定频段的平均插入损耗。 此计算在模型分析脚本中完成并传递给结果。 这允许优化例程使用计算值作为品质因数。
模型和模拟场在 y 方向上是对称的。这一事实使我们能够使用对称边界条件并将模拟时间减少 50%。这种方法的一个含义是我们只使用一个输出端口而不是两个。因此,在计算插入损耗时,端口#2 返回的传输必须乘以 2,以说明“missing”端口#3。
四、使用您的参数更新模型
根据您的设备参数更新模型的说明
-选择您选择的材料来替换默认的硅。
-添加顶层材料以掩埋硅 Y 分支结构。默认模拟将硅放在绝缘体 (SiO2) 上,空气作为顶层 (n=1)。您可以通过修改衬底 z 跨度和覆盖网格顺序来添加顶层 SiO2。在这种情况下,请确保同时更改 *.lms 和 *.fsp 文件。如果使用默认值未获得满意的结果,您可能还需要增加优化设置中的代数。
-向优化例程添加一个新参数。例如,可以添加拆分器对象的长度作为附加优化参数。在这种情况下,重要的是要注意模拟中的依赖关系。如果修改了分路器长度,则输入和输出波导的位置必须相应改变。同样,波导位置的较大变化可能需要在优化运行期间调整模拟区域跨度。所有这些依赖项都应在您的自定义结构组或模型设置脚本中解决。
-创建一个新的优化项目。只要您能够对模型进行参数化并计算单个品质因数,此示例中描述的一般步骤就可以扩展到各种组件。请注意,如果您只有少量参数需要优化,则参数扫描可能比优化更有效。例如,如果您希望找到最佳波导宽度以找到最大有效折射率,则扫描值范围可能比随机优化更快。
五、让模型更进一步
为想要进一步定制模型的用户提供的信息和提示
-设置其他本地或云资源。运行优化对计算资源的要求可能非常高。幸运的是,它也非常适合分布式计算。您可以通过产品内资源管理器简单地添加多台计算机或利用云计算功能。在其他资源中找到指向我们的云计算网络研讨会视频的链接。
-使用 Matlab 和 Python API 实现外部优化算法。内置 PSO 是用户友好的,但如果您希望通过添加约束、使用多个 FOM 或更喜欢不同的算法来进一步优化,您可以通过 Lumerical 的 API 从 Matlab 或 Python 执行此操作。由于将模型参数和 FOM 分别定义为对象属性和结果,通过 API 的实现就像使用单个命令设置参数并接收计算变量一样简单。
-从优化的 Y 分支中提取 S 参数,以便在互连中进行进一步的系统级仿真。这个过程在相关的 Y 分支示例中有详细描述。
六、案例学习
个人的总结和阐释
6.1 结构的建立
分离器锥形的部分,是80个点(上下对称,各40个)组成的多边形
观察该结构组:w1~w13表示各段的长度,resolution指样条函数插值点数,对应上面的80个点
deleteall;
# compute width of the splitter over x position using spline interpolation
x_original = linspace(-splitter_length/2,splitter_length/2,13); # 原来的13条的位置
x = linspace(-splitter_length/2,splitter_length/2,resolution); # 插值的位置
w_original = [w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13]; # 13条的大小
w = spline(w_original,x_original,x);
# add polygon representing the structure
addpoly;
set("z",0);
set("z span",thickness);
set("material",material);
x_positions = [x;flip(x,1)];
y_positions = [w/2;flip(-w/2,1)];
V=[x_positions,y_positions];
set("vertices",V);
三次样条插值函数spline
flip(x,1)把x的列向量反转顺序,匹配对称的x负半轴的点。
模式扩展监视器(mode expansion)可以分析传输到波导或光纤中的任何感兴趣模式的功率份额。它通过将波导或光纤截面测量的场扩展到波导或光纤中的受支持模上来工作。
模式扩展监视器本身不测量任何模拟数据,而是获取由指定频域场监视器测量的场强数据,并将监视器数据扩展到所选的模式上。推荐使用Frequency-domain field and power监视器,因为它与frequency-domain field profile监视器相比,插值误差较小。
运行模拟后,模式扩展监视器将返回此处列出的扩展结果。传输结果T_total,T_net,T_forward,T_backward给出了通过监视器的总传输量、所选模式的净传输、所选模式的正向传输、所选模式的反向传输(这里的正向和反向是坐标轴的正负方向)。a和b的结果是所选模式的正向和反向传播波的复数传播系数,这些系数可用于计算S参数。
model的:
其中insertion_loss表示计算的插入损耗结果。
Tnet 是进入输出波导基模的净传输,上文也解释了求平均和乘以2的原因。
优化相关设置:
w1~w13是待优化参数,插入损耗是品质因数,越小越好。
6.2 结果分析
优化中:
parameter trend观察13个参数随代际的变化趋势
best parameters查看优化结果的参数
fom history查看代际和同一代不同个体的品质参数。
![fo’mfom
parameter history 选定某一代,然后看不同个体对应的几个参数当前值。
使用优化结果:
Y_branch_apply_optimized_parameters.lsf
#This script will apply the best optimized parameters to the y_junction shape
#Select the source of the source of the best parameters:
# 1 - to apply the parameters from your optimization in varFDTD (must run first)
# 2 - to apply the pre-defined optimized parameters based on the referenced paper (does not require running optimization)
#此脚本将对y_junction形状应用最佳优化参数
#选择最佳参数源的源:
#1-应用varFDTD中优化的参数(必须首先运行)
#2-根据参考文件应用预定义的优化参数(不需要运行优化)
param_source = 1;
if (param_source == 1) {
#Load parameters from your optimization results in varFDTD
params = getsweepresult("optimization", "bestParams");
params = params.bestParams;
select("splitter");
for (i=1:13) {
name = ("w" + num2str(i));
set(name,params(i)); # 利用优化的参数,修改结构
}
?("Best parameters from your optimization were applied to the Y junction shape");
} else {
#Load parameters from pre-defiend optimization results based on referenced paper
params = [0.5e-6; 0.5e-6; 0.6e-6; 0.7e-6; 0.9e-6; 1.26e-6; 1.4e-6; 1.4e-6; 1.4e-6; 1.4e-6; 1.31e-6; 1.2e-6; 1.2e-6];
select("splitter");
for (i=1:13) {
name = ("w" + num2str(i));
set(name,params(i));
}
?("Pre-defined parameters from reference paper were applied to the Y junction shape");
}
Y_branch_GDS_auto_export.lsf
#####################################################
# Script file: GDS_auto_export.lsf
# Objective: Automatically export the physical structures into a GDSII file
# Associated files:
# - Lumerical_GDS_auto_export.lsfx
# - Lumerical_GDS_export_1.lsfx
# - Lumerical_GDS_export_2.lsfx
# - Lumerical_GDS_export_3.lsfx
# Copyright 2018 Lumerical Solutions
#####################################################
#-------- WORK FLOW -------#
# 1. Users define the output GDSII file name, and the top cell name.
# 2. Users define the layer properties. A layer number corresponds to a unique set of z & z span.
# 3. Users define optional settings, e.g., the number of points for the discretization of circle, ring, custom, and waveguide objects.
# 4. Lumerical scripts will automatically export the structures into a GDSII file.
#--------工作流程-------#
#1.用户定义输出GDSII文件名和顶部单元格名。
#2.用户定义图层属性。层号对应于一组唯一的z&z跨度。
#3.用户定义可选设置,例如圆、环、自定义和波导对象离散化的点数。
#4.Lumerical脚本将自动将结构导出到GDSII文件中。
#-------- NOTES --------#
# 1. Only support FDTD Solutions and MODE Solutions (2018a or later). DEVICE may be supported in future.
#
# 2. Only the physical structures will be exported.
# Supported object types: Polygon, Rectangle, Circle, Ring, Custom, Waveguide, and Structure/Analysis/Layout Groups that contain the above mentioned structures.
#
# 3. We strongly recommend using unique names for all physical objects, as GDSII requires unique cell names.
# If there are multiple objects having the same name, extra numbers will be added to the object names at the end for uniqueness.
# NOTE: Objects inside construction groups must have unique names, as their properties can not be changed from outside.
#
# 4. Currently, only 3 level of hierarchy is allowed. That is
# ::model
# ::level_1
# ::level_2
# ::level_3
# At level 3, only physical structure (Polygon, Rectangle, Circle, Ring, Custom, Waveguide) are allowed.
# Structure/Analysis/Layout Groups are only allowed at level 1 and level 2.
#
# 5. All objects must use relative coordinates, i.e., the "use relative coordinates" property should be true.
#
# 6. Rotations are not supported.
#
#--------注释--------#
#1.仅支持FDTD解决方案和MODE解决方案(2018a或更高版本)。未来可能会支持设备。
#
#2.仅导出物理结构。
#支持的对象类型:多边形、矩形、圆形、环形、自定义、波导和包含上述结构的结构/分析/布局组。
#
#3.我们强烈建议为所有物理对象使用唯一的名称,因为GDSII需要唯一的单元名称。
#如果有多个对象具有相同的名称,则会在末尾的对象名称中添加额外的数字以保持唯一性。
#注意:构造组内的对象必须具有唯一的名称,因为它们的属性不能从外部更改。
#
#4.目前,只允许3级层次结构。这就是
#::型号
#::级别_1
#::级别2
#::级别3
#在级别3,只允许物理结构(多边形、矩形、圆形、环形、自定义、波导)。
#结构/分析/布局组仅在级别1和级别2允许。
#
#5.所有对象必须使用相对坐标,即“使用相对坐标”属性应为true。
#
#6.不支持旋转。
#####################################################
# User modification section starts here
#用户修改部分从这里开始
clear;
# Do you want to load a specific file? If yes, provide the file name; otherwise, leave the line below commented and the current project will be used.
#是否要加载特定文件?如果是,请提供文件名;否则,请在下面的行中留下注释,将使用当前项目。
#load("Y_branch_PSO.lms");
# The scripts might change the object names if necessary (see NOTE #2 above)
# Do you want to save the project to a temporary file? If yes, provide the temporary file name; otherwise, leave the line below commented.
#如果需要,脚本可能会更改对象名称(请参见上面的注释2)
#是否要将项目保存到临时文件?如果是,请提供临时文件名;否则,请在下面留言。
#save("temp.fsp");
# STEP 1: Users define the output GDSII file name, and the top cell name.
#步骤1:用户定义输出GDSII文件名和顶部单元格名。
gds_filename = 'Y_branch_profile.gds';
top_cell = 'model';
# STEP 2. Users define the layer properties. A layer number corresponds to a unique set of z & z span.
#步骤2.用户定义图层属性。层号对应于一组唯一的z&z跨度。
layer_def = [1, 0, 0.22e-6]; # layer number, z, z span
# STEP 3. Users define optional settings, e.g., the number of points for the discretization of circle, ring, custom, and waveguide objects.
#步骤3:用户定义可选设置,例如,圆、环、自定义和波导对象离散化的点数。
n_circle = 64; # number of sides to use for circle approximation (64 by default).
#用于圆近似的边数(默认为64)。
n_ring = 64; # number of slices to use for ring approximation (64 by default).
n_custom = 64; # number of slices to use for custom approximation (64 by default).
n_wg = 64; # number of slices to use for waveguide approximation (64 by default).
round_to_nm = 1; # round the z and z span to the nearest integer of nm
# 将z和z跨度四舍五入到最接近的整数nm
grid = 1e-9; # snap to grid
# User modification section ends here
#用户修改部分到此结束
#####################################################
# STEP 4. Lumerical scripts will automatically export the structures into a GDSII file.
#步骤4.Lumerical脚本将自动将结构导出到GDSII文件中。
Lumerical_GDS_auto_export;
导出生成的分离器形状:
Y_branch_PSO_GDS_import.lsf
#Script to import optimized Y-Branch profile from GDSII file
switchtolayout;
#Specify import properties
gds_filename = 'Y_branch_profile.gds';
cell_name = 'model';
layer = 1;
material = 'Si (Silicon) - Palik';
z_min = -0.11e-6;
z_max = 0.11e-6;
#Remove previous structure if present
selectpartial("GDS_");
delete;
#Import the structure
gdsimport(gds_filename, cell_name, layer, material, z_min, z_max);
cell_name = 'splitter';
gdsimport(gds_filename, cell_name, layer, material, z_min, z_max);
?("Import successfull");
导入后:
运行后:
在FDTD中计算插入损耗,利用port2的T数据:
在model的分析组里查看算得的插入损耗:
其值为0.188782,小于0.2,达到了预期优化目标。
参考文献
Zhang et al., A compact and low loss Y-junction for submicron silicon waveguide (2013 Optical Society of America)