《片上集成光栅的仿真与优化全流程》
第3章 一维光栅结构建模
第3章 · 一维光栅结构建模
周期、占空比、刻蚀深度 —— 三个参数,搭起光栅的骨架。
好,咱们进入正题。上一章我们把仿真环境搭好了,这一章就来亲手构建一维光栅的几何模型。说白了,就是定义三个核心参数:周期、占空比、刻蚀深度。你想想看,光栅的耦合效率、带宽、偏振敏感性,几乎都跟这三个数直接挂钩。
3.1 为什么是这三个参数?
我个人习惯把光栅看作「周期性折射率扰动」。周期决定了衍射角,占空比影响耦合强度,刻蚀深度则控制着模式重叠。我在项目中遇到过不少新手,一上来就调几十个变量,结果仿真跑了一周还没头绪。其实抓住这三个参数,就能覆盖 80% 的性能空间。
3.2 参数化定义 —— 用 Python 把几何写活
我建议用 Python 类来封装光栅几何。这样参数一变,模型自动重建,不用手动改坐标。下面是我常用的一个基础模板:
class Grating1D:
"""一维光栅参数化模型 (SOI 平台, 220nm 顶层硅)"""
def __init__(self, period: float = 0.7, duty_cycle: float = 0.5,
etch_depth: float = 0.12, n_grating: int = 20):
self.period = period # 单位 μm
self.duty_cycle = duty_cycle # 0~1
self.etch_depth = etch_depth # μm
self.n_grating = n_grating # 光栅周期数
@property
def ridge_width(self) -> float:
"""脊宽 = 周期 × 占空比"""
return self.period * self.duty_cycle
@property
def groove_width(self) -> float:
"""槽宽 = 周期 - 脊宽"""
return self.period - self.ridge_width
def build_geometry(self):
"""生成光栅多边形列表 (用于 FDTD 或 gds 导出)"""
# 实际实现会生成矩形/多边形,这里展示结构
pass
你看,ridge_width 和 groove_width 都是从周期和占空比算出来的。这样改一个参数,所有几何自动更新。嗯,这里要注意:占空比不要写成死值,我习惯用 0.5 作为初始值,但优化时经常跑到 0.35~0.65 之间。
3.3 构建基础几何模型
一维光栅说白了就是一堆「脊-槽」交替排列。脊是未刻蚀的硅,槽是刻蚀掉一部分硅。下面这个表格总结了典型 SOI 光栅的尺寸范围:
| 参数 | 符号 | 典型范围 (μm) | 我的经验值 |
|---|---|---|---|
| 周期 | Λ | 0.5 ~ 1.2 | 0.68 (C波段) |
| 占空比 | DC | 0.3 ~ 0.7 | 0.5 起步 |
| 刻蚀深度 | h | 0.06 ~ 0.18 | 0.12 (部分刻蚀) |
| 光栅周期数 | N | 10 ~ 40 | 20 够用 |
构建几何时,我习惯用「从左到右」的循环。每个周期包含一个脊和一个槽。脊的 x 范围是 [i*Λ, i*Λ + ridge_width],槽是 [i*Λ + ridge_width, (i+1)*Λ]。刻蚀深度体现在槽区域的硅厚度减少。
3.4 代码实战:生成光栅截面
下面这段代码生成光栅的二维截面多边形,可以直接用于 FDTD 的几何导入:
import numpy as np
def build_grating_polygons(period=0.7, duty=0.5, etch=0.12,
n_periods=20, si_thick=0.22):
"""返回脊多边形和槽多边形的列表"""
ridges, grooves = [], []
w_ridge = period * duty
w_groove = period - w_ridge
for i in range(n_periods):
x0 = i * period
# 脊 (未刻蚀)
ridges.append([
(x0, 0), (x0 + w_ridge, 0),
(x0 + w_ridge, si_thick), (x0, si_thick)
])
# 槽 (刻蚀深度 etch)
grooves.append([
(x0 + w_ridge, 0), (x0 + period, 0),
(x0 + period, si_thick - etch),
(x0 + w_ridge, si_thick - etch)
])
return ridges, grooves
# 试试默认参数
r, g = build_grating_polygons()
print(f"生成了 {len(r)} 个脊和 {len(g)} 个槽")
这段代码我用了不下百次。你想想看,改一行 duty=0.45,整个光栅的脊宽就变了,多方便。不过要提醒一句:刻蚀深度不要超过硅膜厚度,否则槽区就挖穿了。我曾经犯过这个错,仿真出来的耦合效率直接掉到 10% 以下,排查了半天才发现是几何穿底了。
3.5 参数化建模的工程意义
我个人觉得,参数化不只是为了仿真方便,更是为了后续的优化流程铺路。你想想,如果每个几何都是硬编码的坐标,那参数扫描、伴随优化、逆向设计根本跑不起来。把周期、占空比、刻蚀深度变成变量,优化器才能「拧动」它们。
我记得有一次做宽带光栅,手动调参调了两周,结果用参数化模型加粒子群算法,三天就找到了更好的解。从那以后,我所有光栅模型第一件事就是写参数化类。