《片上集成光栅的仿真与优化全流程》

第3章 一维光栅结构建模

第3章 · 一维光栅结构建模

周期、占空比、刻蚀深度 —— 三个参数,搭起光栅的骨架。

一维光栅模型 周期 Λ 占空比 DC 刻蚀深度 h 参数化建模 → 几何基元 → 可调光栅单元

好,咱们进入正题。上一章我们把仿真环境搭好了,这一章就来亲手构建一维光栅的几何模型。说白了,就是定义三个核心参数:周期、占空比、刻蚀深度。你想想看,光栅的耦合效率、带宽、偏振敏感性,几乎都跟这三个数直接挂钩。

3.1 为什么是这三个参数?

我个人习惯把光栅看作「周期性折射率扰动」。周期决定了衍射角,占空比影响耦合强度,刻蚀深度则控制着模式重叠。我在项目中遇到过不少新手,一上来就调几十个变量,结果仿真跑了一周还没头绪。其实抓住这三个参数,就能覆盖 80% 的性能空间。

核心三角: 周期 Λ、占空比 DC (duty cycle)、刻蚀深度 h。三者独立又耦合,是后续优化的起点。

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.20.68 (C波段)
占空比DC0.3 ~ 0.70.5 起步
刻蚀深度h0.06 ~ 0.180.12 (部分刻蚀)
光栅周期数N10 ~ 4020 够用

构建几何时,我习惯用「从左到右」的循环。每个周期包含一个脊和一个槽。脊的 x 范围是 [i*Λ, i*Λ + ridge_width],槽是 [i*Λ + ridge_width, (i+1)*Λ]。刻蚀深度体现在槽区域的硅厚度减少。

💡 我的小习惯: 在槽区底部加一层很薄的氧化层(~2nm)作为刻蚀停止层,仿真时能避免数值奇异。虽然实际工艺里不一定有,但仿真中能提高稳定性。

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% 以下,排查了半天才发现是几何穿底了。

⚠️ 避坑: 刻蚀深度 + 残留硅厚度 ≤ 顶层硅厚度。例如 220nm 硅,刻蚀 120nm,残留 100nm。如果刻蚀 180nm,残留只有 40nm,模式会严重泄漏到衬底。

3.5 参数化建模的工程意义

我个人觉得,参数化不只是为了仿真方便,更是为了后续的优化流程铺路。你想想,如果每个几何都是硬编码的坐标,那参数扫描、伴随优化、逆向设计根本跑不起来。把周期、占空比、刻蚀深度变成变量,优化器才能「拧动」它们。

我记得有一次做宽带光栅,手动调参调了两周,结果用参数化模型加粒子群算法,三天就找到了更好的解。从那以后,我所有光栅模型第一件事就是写参数化类。

一句话总结: 周期定角度,占空比调强度,刻蚀深度控耦合。三个参数,一个类,光栅建模就这么简单。