inverse-design-of-grating-coupler-3d(2)
一、设计和优化3D光栅耦合器
1、 结构组成
(1)substrate
功能与作用:
-
物理支撑:为整个光栅耦合器提供机械支撑
-
光学隔离:防止光泄漏到下层结构中
-
模式控制:与波导形成折射率对比,约束光场在波导层传播
设计原则:
-
厚度标准:需大于光穿透深度(通常≥2μm)
-
材料选择:折射率需低于波导层(SiO₂@1550nm: n≈1.44 < Si: n≈3.47)
-
扩展范围:x/y方向超出仿真区域2μm,避免边界反射影响
(2)wg(波导)
功能与作用:
-
光传输通道:将光栅耦合的光能传输至芯片内部
-
模式转换:将光栅的辐射模式转换为波导束缚模式
-
结构基准:定义后续光栅的起始连接位置
关键参数:
wg_height=220e-9 # 标准SOI器件层厚度
wg_width=500e-9 # 确保单模传输(TE/TM偏振)
x_max=2e-6 # 连接器起始位置
设计原则:
-
单模条件:宽度/高度满足
限制
-
材料匹配:必须与光栅层材料一致(如Si)
-
端面处理:x_min延伸至仿真边界外,避免截断反射
(3)silicon(硅基座)
功能与作用:
-
光栅载体:作为环形光栅的基底结构
-
角度定义:通过theta_start/stop控制光栅有效区域
-
椭圆校正:
make_ellipsoid=True
补偿斜入射像差
关键参数:
outer_radius=60e-6 # 足够覆盖所有环形结构
theta_start=330° # 30°锥角对应的起始角度
z_max=wg_height # 与波导高度严格对齐
设计原则:
-
半径裕度:需大于最终光栅外径+10%
-
角度对称:theta_stop=360°-theta_start保证对称性
-
材料一致:必须与波导相同(避免界面反射)
(4)rings(环形光栅)
功能与作用:
-
光耦合:通过周期性结构实现光纤-波导的模式匹配
-
布拉格散射:控制槽宽/间距实现特定波长选择性
-
偏振管理:椭圆环可调节TE/TM偏振响应
关键参数:
n_trenches=30 # 典型周期数
etch_depth=70e-9 # 部分刻蚀保持机械强度
distances=[...] # 交替的槽宽/间距参数
设计原则:
-
渐变周期:外圈周期>内圈周期(匹配模场扩展)
-
刻蚀深度:需满足
≥
-
椭圆率:
outer_radius_2
补偿斜入射相位
制造约束:
-
最小槽宽≥100nm(电子束光刻限制)
-
间距一致性误差≤±5nm
(5)blocker(遮挡块)
功能与作用:
-
几何过渡:掩盖波导与光栅的原始直角连接
-
材料隔离:防止背景材料渗入连接区域
-
场平滑:消除连接处的不连续散射
关键参数:
x_min=connector_start-0.05μm # 略超出连接区
y_span=10μm # 完全覆盖波导宽度
material=背景材料 # 折射率匹配
设计原则:
-
光学透明:折射率需接近背景材料(SiO₂)
-
完全覆盖:必须包裹原始连接处的所有突变
-
Z轴对齐:高度与波导严格一致
(6)connector(连接器)
功能与作用:
-
绝热过渡:实现波导宽度到光栅的平滑转变
-
模式匹配:降低连接处的反射损耗(<-30dB)
-
参数化控制:通过插值点优化形状
关键参数:
n_connector_pts=28 # 足够多的控制点
interpolation_points=300 # 高密度插值确保光滑
cubic_spline_interpolation # 保证二阶导数连续
优化策略:
-
起始点固定:y=wg_width/2(波导宽度)
-
终点约束:y=x*tan(θ_taper)(光栅角度匹配)
-
中间点优化:通过
connector_pts
参数调节曲率
物理意义:
-
相当于一个逆锥形耦合器(inverse taper)
-
插值点数直接影响插入损耗(每增加50点≈0.1dB改进)
2、设计思路
(1)n_bg = 1.44401,n_wg = 3.47668
n_bg = 1.44401,这是二氧化硅在1550波长附近的常见值
n_wg = 3.47668,在 1550 nm 波长下,硅的折射率约为 3.476
二氧化硅在1550nm附近有最低的传输损耗。
(2)self.x_fib = 18e-6 self.x_fib_span = 26e-6 self.z_fib = 0.5e-6
参数 | 典型值范围 | 依据 |
---|---|---|
| 15–25 μm | 光栅长度 + 安全距离(避免波导干扰) 光纤与光栅末端的距离通常为 15–20 μm |
| 20–30 μm | 2.5×MFD(单模光纤)(以确保高斯光束的尾部能量被完整捕获) 或覆盖光栅散射场 标准单模光纤(SMF-28)在 1550 nm 波长的模场直径约为 10.4 μm(MFD) |
| 0.5–2 μm | 光纤与光栅表面的垂直间距 1. 工艺可实现距离 |
(3)模式监视器的位置和尺寸
self.mode_pos_x = self.x_fib - self.x_fib_span / 2 - 1e-6 if dim == 2 else -1e-6
-
2D 仿真(
dim == 2
):
监视器位于光纤起始位置左侧1 μm
处(x_fib - x_fib_span/2
是光纤左边缘),确保:-
捕获从光栅耦合到光纤的所有光场(避免漏光)。
-
避开光源直接照射(防止干扰)。
-
-
3D 仿真(
dim == 3
):
监视器固定在x=-1 μm
(波导入口附近),用于测量 反向传输到波导中的光功率(即耦合效率的 FOM)。
维度 | 模式监视器位置 | 目标 |
---|---|---|
2D | 光纤左侧 ( | 简化模型,直接测量光纤-光栅的耦合场(忽略波导三维效应)。 |
3D | 波导入口 ( | 实际器件更关注 波导中的导模能量(需完整三维仿真)。 |
self.mode_span_y = 3e-6
在 1550 nm 波长下,单模光纤的 MFD 约 10.4 μm,但实际耦合区域集中在中心 3–5 μm(因高斯光束能量集中在中心)。
self.mode_span_z = 3e-6
光栅的散射场在 z 方向通常扩展至 1–2 μm(包括渐逝场),3 μm 确保完整捕获。
(4)反向光源位置
self.bksrc_pos_x = self.mode_pos_x + 100e-9
-
正向:光纤→光栅→波导(模式监视器测量波导中的光)。
-
反向:波导→光栅→光纤(需独立的光源和监视器)。
关键点 | 原因 |
---|---|
紧邻监视器 | 确保反向光完全注入波导模式,且与正向光路分离。 |
100 nm偏移 | 平衡数值稳定性(避免网格冲突)和物理准确性(覆盖模场)。 |
与波导尺寸的关系 | 偏移量需小于波导模场直径(如硅波导约300 nm),否则会漏光。 |
(5)仿真网格尺寸
dx=30e-9
经验法则:网格尺寸 ≤ 最小特征尺寸的1/5(示例中 dx=30 nm
可解析 150 nm 以上的结构)
dzFactor=3
dzFactor=3
表示z方向网格是刻蚀深度的 1/3,确保每个刻蚀层至少被 3个网格点 采样(满足Nyquist采样定理)
参数 | 设计原则 | 物理意义 |
---|---|---|
| ≤最小特征尺寸/5,各向同性简化( | 解析光栅周期和刻槽的横向场变化 |
| = | 解析刻蚀深度的垂直场梯度 |
| 经验值3–5,高精度需扫描验证 | 控制z方向网格的细化程度 |
(6)仿真区域边界
参数 | 依赖关系 | 物理意义 |
---|---|---|
|
| 波导模式向左自然衰减,兼容PML层 |
|
| 覆盖光纤模式与光栅散射场 |
|
| 对称覆盖光纤和光栅的横向场 |
| 固定 | 衬底厚度 + PML层 SiO₂衬底通常需要足够厚度(如 负方向延伸需包含PML层(通常厚度 |
| 固定 | 光纤模式展开 + 光栅散射场 光纤位于 |
(7)光纤角度
代码片段 | 物理意义 |
---|---|
| 根据Snell定律计算光纤在空气中的等效入射角,确保仿真与实际封装条件一致。 |
保留 | 兼容不同介质(如直接耦合/空气隙耦合)的光源设置需求。 |
-
从光纤到光栅:光在光纤(SiO₂包层,
n≈1.444
)中以theta_fib_mat
角度入射到光栅。 -
从空气到光栅:若光纤与光栅间有空气隙(如未完全封装),需用
theta_fib_air
计算实际入射角。
(8)填充因子
self.F0 = 0.95
-
高填充因子(如 0.95) 能增强光栅的 散射强度,因为更多的光被硅-空气界面反射/散射,从而提高光纤与波导的耦合效率。
-
但过高的 FF(如 >0.98)会导致刻蚀槽过窄,可能引发制造困难或场局域化效应。
应用场景 | 典型填充因子范围 | 原因 |
---|---|---|
高耦合效率设计 | 0.90–0.95 | 增强散射强度,同时保持可制造性 |
制造友好的设计 | 0.80–0.90 | 放宽对刻蚀精度的要求(如电子束光刻) |
超紧凑光栅 | 0.95–0.98 | 牺牲工艺容差,追求极限性能(需亚10 nm硅宽度) |
(9)连接波导和光栅的过渡区域
x_connector_start = -0.5e-6
(起始位置)
-
波导的有效折射率变化需要平滑过渡。
-
经验表明,预留
0.5 μm
可容纳波导模式的渐逝场(evanescent field)衰减。
x_connector_end = 4.0e-6
(结束位置)
-
锥形过渡长度需满足 绝热条件(adiabatic condition),避免模式耦合损耗。
-
对于硅波导(220 nm 厚度),典型锥形过渡长度为 3–5 μm 。
self.initial_points_x = np.linspace(-0.5e-6, 4.0e-6, 28+2) # 30个点
-
经验法则:每微米设置 5–10 个插值点(示例中过渡长度
4.5 μm
,插值点间距约161 nm
)。 -
端点扩展:
+2
表示在起始(-0.5e-6
)和结束(4.0e-6
)处各添加一个固定点,确保连接器与波导/光栅的几何连续性。 -
均匀分布:
np.linspace
生成均匀分布的插值点,为后续的 样条插值(spline interpolation) 提供基础控制点。
(10)偏振模式与初始锥角
self.pol_angle = 90 if polarization == 'TE' else 0
-
90°对应TE模式:使电场方向(E-field)沿y轴,实现横向电场分布
-
0°对应TM模式:使电场方向沿z轴,满足横向磁场条件
self.initial_theta_taper = initial_theta_taper
-
控制光栅耦合器的模式匹配过渡区形状,影响光场从波导到光栅的能量传递效率
-
典型值30°可平衡以下因素:
-
避免突变反射(角度过大会引起散射损耗)
-
保证足够渐变区域(角度过小导致过渡区过长)
-
(11)"simulation time": 5000e-15
(仿真时间)
设置为 5 ps(5000飞秒),是光在硅光子器件中传播的典型时间范围
-
太短(如 1 ps):可能无法捕获完整的场演化。
-
太长(如 10 ps):浪费计算资源。
-
对于 1550 nm 光(周期约 5 fs),5000 fs 覆盖约 1000 个光学周期,足够观察瞬态和稳态行为。
(12)"auto shutoff min": 1e-6
(自动停止阈值)
-
1e-6 是经验值,确保剩余能量不影响结果(如耦合效率计算)。
-
过高(如 1e-4)会提前终止,漏掉弱信号;过低(如 1e-8)会增加计算时间。
(13)"mesh refinement": "conformal variant 0"
(网格细化方法)
-
"conformal":确保网格贴合曲面,避免阶梯近似误差。
-
"variant 0":平衡精度和速度,适合大多数硅光子器件。
选项 | 精度 | 速度 | 适用场景 | 几何兼容性 |
---|---|---|---|---|
| 高 | 中 | 常规硅光子器件(默认选择) | 复杂曲面、高折射率对比 |
| 极高 | 低 | 超表面、纳米结构 | 极端复杂几何 |
| 最高 | 最低 | 逆向设计、超材料 | 亚波长特征 |
| 低 | 最高 | 快速验证/教学 | 简单矩形结构 |
| 最低 | 极高 | 理论模型(如均匀波导) | 无结构变化 |
(14) "meshing tolerance": 1.2e-15
(网格容差)
FDTD仿真时,软件会把真实的光栅结构用一堆小方块(网格)拼出来。容差决定了这些方块和实际形状的最大允许偏差。可以把网格容差想象成“画图纸时的铅笔粗细”。
-
例子:光栅刻蚀槽的边缘本应是光滑的,但网格只能近似成锯齿状。容差越小,锯齿越细腻(更接近真实)。
-
光栅的刻蚀槽(如 70 nm 深)需要极高精度描述边缘场。
-
普通仿真可用 1e-12,但高精度优化需 1e-15 级容差。
-
过大的容差(如 1e-9)会导致网格粗糙,低估散射效率。
(15)高斯光源的设置
① beam_parameters="Waist size and position"
(光束模式)
-
设计意义:选择高斯光束的定义方式
-
目的:直接指定束腰尺寸和位置,更接近实际光纤输出
-
标准:光纤常用束腰参数(而非远场发散角)
② waist_radius_w0=5.2e-6
(束腰半径)
-
设计意义:高斯光束的束腰大小
-
目的:匹配单模光纤的模场直径(MFD≈10.4μm → 半径5.2μm)
-
标准:
-
单模光纤在1310nm波长下MFD通常为9.2-10.4μm
-
③ distance_from_waist=0.0
(束腰距离)
-
设计意义:束腰与光源平面的相对位置
-
目的:将束腰直接设在光源位置(光纤端面)
-
标准:设为0表示光纤端面即为束腰位置
④ wavelength_span=0.1e-6
(波长范围)
-
设计意义:光源的频谱宽度(100nm)
-
目的:覆盖光栅带宽需求(如±40nm)
-
标准:
-
需大于目标带宽(如粗波分复用CWDM)
-
过大会降低频率分辨率
-
⑤ optimize_for_short_pulse=False
(短脉冲优化)
-
设计意义:禁用短脉冲优化模式
-
目的:
-
频域仿真中优先保证波长精度
-
避免因脉冲压缩引入的数值误差
-
-
标准:连续波(CW)仿真必须设为
False
(15)
fdtd.setglobalmonitor("use wavelength spacing", True)(波长间距模式)
在宽带仿真中,波长间距能保证光谱响应尖锐特征(如谐振峰)被均匀捕获,而频率间距可能导致短波长区域过度采样;频域监视器(如透射率监视器)默认按波长存储电场数据,波长间距可避免后续数据转换的额外插值误差;周期边界结构(如光栅)的仿真中,波长间距天然匹配布洛赫波矢条件,避免频率间距导致的波矢离散化误差。
间距模式 | 适用场景 | 优势 | 局限性 |
---|---|---|---|
波长间距 ( | 宽带光学器件、色散材料分析 | 物理直观、计算稳定 | 长波长区域分辨率可能不足 |
频率间距 ( | 窄带通信系统、时域信号处理 | 频谱均匀性更好 | 需手动调整关键波长采样密度 |
(16)fdtd.addmesh(name="source_mesh", x=self.x_fib, x_span=24e-6, y_min=self.y_min, y_max=self.y_max, z=self.z_fib,z_span=2 * self.dz, override_x_mesh=False, override_y_mesh=False, override_z_mesh=True, dz=self.dz)
重写Z方向网格:
-
全局网格:相当于普通放大镜,所有方向放大倍数相同(默认均匀网格)。
-
仅重写Z方向:相当于把放大镜换成单方向高倍镜,只在关键方向(如光传播方向)精细观察,其他方向用普通镜片(沿用全局网格)
许多光学结构(如光纤、波导)在Z方向(光传播方向)存在快速变化的物理场(如倏逝波、模式干涉),需要更密网格捕捉细节;而XY方向场分布较平缓,默认网格已足够。
场景 | 仅重写Z方向的优势 | 典型结构 |
---|---|---|
光纤-芯片耦合 | Z向加密捕捉倏逝波衰减(精度↑),XY向节省算力(速度↑) | 锥形波导、光栅耦合器 |
多层薄膜反射率 | Z向分层精确采样(如WO₃/W界面),避免全局加密浪费 | 太阳能电池、光学涂层 |
大尺寸结构仿真 | 局部Z向加密关键区域,全局网格保持宽松(内存↓) | 集成光路的长距离传输波导 |
步长dz
取值依据:
需小于最小特征尺寸的1/5(例如220nm硅波导层,dz≤44nm
),且小于最小波长/(10×最高折射率)(如1550nm光在硅中需dz≤1550/(10×3.5)≈44nm
)。
(17)fdtd.setnamed("source_mesh", "enabled", False)
-
通过脚本临时禁用网格,可在后续步骤中按需启用(如迭代优化时局部加密网格)
-
避免仿真初始化阶段不必要的网格划分计算,提升启动速度
(18)重写X方向的网格
# 添加优化区域监视器 记录光栅区域的电场分布,用于后续优化算法分析fdtd.addpower(name="opt_fields", monitor_type="3D", x_min=self.x_min_opt_region, x_max=self.x_max,y_min=self.y_min, y_max=self.y_max, z_min=self.wg_height - self.etch_depth, z_max=self.wg_height,# z 最小值(刻蚀深度)z 最大值(波导高度)output_Hx=False, output_Hy=False, output_Hz=False, output_power=False) # 禁用磁场输出 禁用功率输出(仅保存电场)fdtd.addmesh(name="opt_fields_mesh", x_min=self.x_min_opt_region, x_max=self.x_max, y_min=self.y_min,y_max=self.y_max, z_min=self.wg_height - self.etch_depth, z_max=self.wg_height, dx=self.dx,dy=self.dy, dz=self.dz)
主要是为了针对X方向的光场特性进行精确控制,说明X方向有一个特定光学区域(如光栅、耦合器或缺陷结构),此处光场会剧烈变化(如衍射、散射)。
场景 | 为何重写X方向? | 示例结构 |
---|---|---|
光栅耦合器仿真 | X方向需匹配光栅周期(如Λ=500nm),需精确采样每个刻槽边缘场 | 表面光栅、布拉格光栅 |
波导弯曲损耗分析 | X方向弯曲区域场分布畸变严重,需加密网格捕捉辐射损耗 | 硅光弯曲波导、环形谐振腔 |
多模干涉器件 | X方向存在多模干涉条纹,网格需密到能分辨相邻峰谷(如1μm间距需dx≤200nm) | MMI耦合器、分束器 |
-
Z向加密:针对层状结构(如薄膜堆叠)或光传播方向的倏逝波。
-
X向加密:针对横向周期性/非均匀结构(如光栅、波导侧壁粗糙度)。
(19)spatial_interpolation='none'
禁止任何形式的“空间插值”处理。也就是说,程序会直接使用原始网格点上的数据值,不会根据周围点推算未知位置的值。
-
优点:避免插值算法(如线性平滑或样条拟合)引入额外误差,适合高精度分析场景。
-
缺点:结果可能显得不连续或有“锯齿感”,尤其在网格较粗时
简单说:'none'
= “别美化直接给我原始数据”,重在保真度而非平滑度。
(20)def get_opt_region_pos(self):(计算光栅耦合器优化区域的网格点坐标)
网格生成标准:
dx_in_nm = int(round(self.dx * 1e9)) # 30nm网格 → 精确转为30整数
x_points = int(round(范围长度/dx)) +1 # 确保完全覆盖区域
-
强制网格对齐:通过round+int保证所有网格点落在整数纳米位置
-
边界冗余:y方向+2个点,z方向+2个点,防止边缘截断效应
三维协调标准:
-
x/y方向:按用户设定的dx/dy划分(通常30nm)
-
z方向特殊处理:根据刻蚀深度动态调整
z_points = self.dzFactor + 2 # 通常3+2=5层
因为:
-
刻蚀深度仅70nm(浅结构)
-
需要比xy方向更密的网格捕捉垂直方向场变化
(21)def get_permittivities(self, fdtd, wavelengths):(获取仿真中材料的最小和最大介电常数(ε))
-
介电常数(ε)的物理意义:
-
相当于光在材料中传播的"阻力系数",决定光速变慢程度(ε=𝑛²,𝑛为折射率)
-
例如:SiO₂的ε≈2.25(𝑛=1.5),Si的ε≈12.25(𝑛=3.5)严格遵循ε=𝑛²的电磁理论
-
-
代码作用:
-
动态获取仿真中波导材料和背景材料的ε值
-
为后续计算场分布、耦合效率等提供关键材料参数
-
-
支持色散材料:
-
通过设置波长范围(
wavelength start/stop
),使材料折射率计算覆盖所有工作波长 -
示例:硅在1310nm和1550nm的折射率不同(约3.476 vs 3.45)
-
-
优化计算效率:
-
仅计算中心频率(
f0
)的折射率,避免全波段扫描的计算开销 -
取实部(
.real
)忽略微小吸收(虚部),适用于低损耗光栅设计
-
-
兼容性设计:
-
同时支持自定义介质(
<Object defined dielectric>
)和预定义材料(如"Si - Palik")
-
(22)光栅耦合器的光栅结构
① 2D光栅
想象一个 锯齿形光栅,只有X方向(光传播方向)有齿和缝
-
这里只有 X方向 的周期性结构,Y方向是 完全均匀延伸 的(像无限宽的平板)
-
现实问题:这种结构无法控制光的 横向扩散(Y方向),导致能量泄漏
② 3D光栅
实际光栅耦合器是 环形或扇形 的立体结构,像一个 同心圆靶子:
俯视图(X-Y平面):
-
每个圆环 同时具有:
-
X方向的齿缝:控制光向前(X)传播时的相位匹配
-
Y方向的齿缝:控制光向两侧(Y)扩散的程度
-
③ 为什么需要Y方向控制?
原因1:斜入射光的补偿
当光斜着射入(如8°角)时:
-
X方向:光需要较宽的齿缝匹配相位(
distances
) -
Y方向:光程更短,需要较窄齿缝避免过度散射(
distances_2
)
原因2:抑制侧向泄漏
-
如果没有Y方向控制,光会像水波一样 向两侧扩散(能量损失)
-
Y方向窄齿缝相当于 给光波装上侧挡板
原因3:偏振控制
-
TE偏振光(电场沿Y方向)对Y齿缝更敏感
-
TM偏振光对X齿缝更敏感
(23)def get_connector_points(self, connector_params, theta_taper):
需要注意的一点:
# 前两点:波导末端宽度固定为wg_width/2(上下对称)中间点:由connector_params控制过渡形状(如S型弯曲参数) 末端点:根据theta_taper计算倾斜角度对应的Y值(x * tan(theta))points_y = np.concatenate(([self.wg_width / 2.0, self.wg_width / 2.0], connector_params,points_x[-2:] * math.tan(math.radians(theta_taper))))
为什么两次写入 self.wg_width / 2.0
① 三次样条插值 (kind='cubic'
) 在边界处需要 固定导数值。重复起始Y坐标是为了隐式定义:
这强制曲线在波导端起始时是 水平切线(零斜率),避免非物理的尖角。
② 想象正在设计一个冬奥会滑雪大跳台:
-
波导 = 助滑区(笔直的冰道,宽度固定为
wg_width
) -
过渡区 = 起跳曲线(需要从水平逐渐弯曲)
-
光栅 = 落地区(扇形展开的坡道,角度由
theta_taper
决定)
为什么需要两个wg_width/2
?
场景1:错误设计(单点固定)
-
只在起点放一个固定点 → 相当于仅用一个钉子固定跳台起始端
-
后果:
-
运动员(光)刚出发时跳台可能晃动(斜率不确定)
-
容易在起点处形成"凹陷"(光学反射)
-
实测数据:运动员摔倒概率>30%(光损耗>15%)
-
场景2:正确设计(双点固定)
-
在起点处钉两个平行固定点(两个
wg_width/2
) -
效果:
-
确保运动员起滑时板底完全水平(零初始角度)
-
起跳曲线自然平滑过渡(光场连续无反射)
-
实测数据:空中姿态稳定(光损耗<0.5%)
-
滑雪场景 | 光栅耦合器 | 物理原理 |
---|---|---|
助滑区水平 | 波导模式匹配 | 波导边缘电场导数为零 |
双固定点 | 两点确定初始斜率 | 强制三次样条插值起始导数为0 |
起跳曲线平滑 | 过渡区渐变 | 避免模式失配导致的散射 |
(24)def perform_taper_angle_sweep(...)
执行流程:
① filename = basefilename + '_t{:04d}'.format(int(theta_taper * 100))
符号 | 含义 | 示例输入 |
---|---|---|
| 格式说明符开始 | - |
| 用零填充空缺位 | 5 → |
| 总位数 | 123 → |
| 十进制整数 | 12.3 → 错误 |
② initial_points_y
initial_points_y = np.linspace(start = 波导半宽度, # y_startstop = 光栅末端宽度, # y_end = x_end * tanθnum = 插值点数 # 控制过渡平滑度
)
(25)if __name__ == "__main__":
with lumapi.FDTD(hide=False) as fdtd:
代码部分 | 意义 |
---|---|
| 启动Lumerical FDTD内核(相当于打开MATLAB引擎) |
| 显示GUI界面(调试用),生产环境建议 |
| 将仿真器实例赋值给 |
(26)np.concatenate(([r0], distances))
-
np.concatenate(([r0], distances))
中:-
外层括号是函数调用的括号
-
内层
([r0], distances)
是一个元组(tuple),包含两个元素:-
第一个元素是列表
[r0]
-
第二个元素是数组
distances
-
-
如果写成 np.concatenate([r0], distances)
:
-
[r0]
会被当作第一个参数(要连接的数组序列) -
distances
会被当作第二个参数(axis 参数,默认为0) -
这会导致错误,因为
distances
不是合法的 axis 参数值
np.concatenate()
的规范语法是
numpy.concatenate((a1, a2, ...), axis=0)
第一个参数必须是一个序列(通常是元组或列表)包含所有要连接的数组。
写法 | 等效形式 | 是否合法 | 说明 |
---|---|---|---|
| 传入一个元组参数 | 正确 | 标准用法 |
| 传入两个单独参数 | ❌错误 | 会把 |
二、设计和仿真3D光栅耦合器
(1)from lumjson import LumEncoder, LumDecoder
类 | 作用 |
---|---|
| 将 Lumerical 的特殊数据类型(如复数、矩阵、对象)转换为标准 JSON 字符串 |
| 将 JSON 字符串还原为 Lumerical 可识别的原生数据类型 |
(2)json.load和json.loads区别
特性 |
|
|
---|---|---|
输入类型 | 文件对象(如 | 字符串( |
适用场景 | 直接读取 JSON 文件 | 解析内存中的 JSON 字符串 |
参数名 |
|
|
性能 | 需磁盘 I/O,稍慢 | 直接操作内存,更快 |
是否自动关文件 | 是(配合 | 不涉及文件操作 |
(3)y_max = wall_positions_2[-1]*math.sin(math.radians(theta_taper))
这里为什么用sin而不是tan
光栅结构的本质:环形扇形,不是直线锥形
光栅耦合器的结构类似 扇子的骨架,而不是简单的斜线。
-
环形光栅:所有齿/槽沿着扇形排列,最终形成一个 圆弧边界。
-
关键特征:每个点到中心的角度相同(锥角
θ
),但横向(Y方向)偏移由 圆弧的几何特性 决定。
对于环形光栅上的任意一点:
-
它的位置由 半径
R
和 角度θ
决定。 -
Y坐标 的计算公式是:
-
R
:光栅外缘半径(即代码中的wall_positions_2[-1]
)。 -
θ
:光栅锥角(如 30°)。 -
Y_max
:圆弧最外侧点的Y坐标,即R·sinθ
。
(4)生成GDSII格式的掩模文件
extract_contour_script = ('idx = getresult("index_xy","index");' + # 获取折射率数据'level=[(min(idx.index_z)+max(idx.index_z))/2];' + # 计算中间层高度'idx.addattribute("index_z_real",real(idx.index_z));' + # 添加实部属性'contours = getcontour(idx, "index_z_real", level);' + # 提取等高线'polys=contours{1}.polygons;' + # 获取多边形数据'f = gdsopen("{}", 1e-3, 1e-9);'.format(gds_filename) + # 创建GDS文件'gdsbegincell(f,"Grating Coupler");' + # 开始写入单元'for(i = 1:length(polys)){ gdsaddpoly(f, 1, polys{i}); }' + # 写入多边形'gdsendcell(f);' + # 结束单元'gdsclose(f);' # 关闭文件
)
代码片段 | 功能 |
---|---|
getresult("index_xy","index") | 从名为index_xy 的监视器获取折射率分布数据 |
(min+max)/2 | 计算光栅结构在Z方向的中间高度(刻蚀深度中点) |
addattribute("index_z_real",real(...)) | 将复数折射率转换为实数(仅保留实部) |
getcontour(..., level) | 提取指定高度的等高线(类似地形图的等高线) |
contours{1}.polygons | 获取等高线对应的多边形顶点坐标 |
gdsopen(..., 1e-3, 1e-9) | 创建GDS文件,单位:1e-3米(毫米),精度1e-9米(纳米) |
gdsaddpoly(f, 1, polys{i}) | 将多边形写入GDS文件的第1层 |