《基于仿真优化的阵列波导光栅调校》

第3章 波导模式分析:EIM、FDM 与模式求解器

第3章 波导模式分析:EIM、FDM 与模式求解器

做 AWG 调校,第一关就是摸透波导里的光场怎么分布。说白了,有效折射率、模场形状这些东西搞不清楚,后面阵列波导的相位、串扰全得翻车。我早年刚接触硅光时,觉得模式分析不就是解个本征方程嘛,结果第一次流片回来,测试和仿真差了十万八千里……嗯,从那以后我老老实实把有效折射率法(EIM)和有限差分法(FDM)的底子补上了。

这一章咱们就聚焦两个最常用的工具:有效折射率法(EIM) 和 有限差分法(FDM)。我会结合自己写过的 Python 模式求解器,把核心思路拆开揉碎。你想想看,一个波导截面就那么几微米,怎么用数值方法把模式“抓”出来?

波导模式分析 · 核心逻辑 模式求解器 有效折射率法 (EIM) 解析近似 · 快速评估 有限差分法 (FDM) 数值离散 · 高精度 有效折射率 · 模场分布 · 色散曲线

3.1 有效折射率法 (EIM) —— 快速估算的利器

EIM 的核心思想很简单:把二维波导截面拆成两个一维平板波导,分别算等效折射率,再合成有效折射率。我习惯叫它“降维打击”。

举个例子,脊形波导(rib waveguide)—— 先算芯层区域在垂直方向的平板模式,得到 n_eff_core;再算两侧 slab 区域的等效折射率 n_eff_slab。然后水平方向再解一次三层平板波导,就得到整个脊波导的 n_eff。

适用场景: 初步设计、参数扫描、趋势判断。精度通常够用,尤其对单模波导,误差在 1% 以内。
我个人的小习惯: 在做 AWG 阵列波导初步设计时,先用 EIM 扫一遍宽度、刻蚀深度的影响,确定大致范围,再用 FDM 精修。这样能省不少时间。

3.2 有限差分法 (FDM) 基础 —— 把偏微分方程变成代数问题

FDM 的思路更暴力:把波导截面划分成网格,用差分近似代替偏导数,最后求解一个大型稀疏矩阵的特征值问题。特征值就是有效折射率,特征向量就是模场分布。

我记得第一次自己写 FDM 求解器时,最头疼的是边界条件。后来我统一用完美匹配层(PML)或者狄利克雷边界,收敛性才稳定下来。

FDM 的关键步骤:

  1. 离散化:将波导截面划分为 Nx × Ny 网格。
  2. 构建差分矩阵:对 ∇² 算符用五点差分格式。
  3. 加入折射率分布:在对角线上填入 k₀² n²(x,y)。
  4. 求解广义特征值问题:A · ψ = n_eff² · ψ。
我曾经踩过的坑: 网格尺寸必须小于 λ/(5n_core),否则会出现伪模。有一次我偷懒把网格设成 100nm,结果算出来的基模形状像鬼影……后来老老实实加密到 40nm。

3.3 模式求解器实现 (Python 示例)

下面给一个极简的 FDM 模式求解器核心片段。我用 scipy.sparse 构建矩阵,求解最小的几个特征值。你直接复制就能跑,但记得调参数。

import numpy as np
from scipy.sparse import diags, csr_matrix
from scipy.sparse.linalg import eigsh

def fdm_mode_solver(wavelength, n_core, n_clad, wg_width, wg_height, dx=0.04, dy=0.04, n_modes=3):
    k0 = 2 * np.pi / wavelength
    nx = int(wg_width / dx) + 20   # 加边界
    ny = int(wg_height / dy) + 20
    x = np.linspace(-wg_width/2, wg_width/2, nx)
    y = np.linspace(-wg_height/2, wg_height/2, ny)
    X, Y = np.meshgrid(x, y)
    # 折射率分布 (矩形波导)
    n = np.full_like(X, n_clad)
    mask = (np.abs(X) < wg_width/2) & (np.abs(Y) < wg_height/2)
    n[mask] = n_core
    # 拉普拉斯算子 (五点差分)
    N = nx * ny
    e_x = np.ones(N)
    e_y = np.ones(N)
    Dxx = diags([e_x[1:], -2*e_x, e_x[:-1]], [-1, 0, 1], shape=(N, N)) / dx**2
    Dyy = diags([e_y[nx:], -2*e_y, e_y[:-nx]], [-nx, 0, nx], shape=(N, N)) / dy**2
    A = csr_matrix(Dxx + Dyy)
    # 对角项 k0^2 * n^2
    n_flat = n.ravel()
    V = diags(k0**2 * n_flat**2, 0, shape=(N, N))
    H = -A + V
    # 求解最小的 n_modes 个特征值 (有效折射率平方)
    vals, vecs = eigsh(H, k=n_modes, which='SM')
    n_eff = np.sqrt(vals) / k0
    return n_eff, vecs.reshape((ny, nx, n_modes))

这个函数返回有效折射率数组和对应的模场。我个人习惯把模场画出来,看一眼是不是基模——如果出现多峰或者不对称,大概率是网格不够密或者边界条件没设好。

3.4 EIM vs FDM:怎么选?

方法速度精度适用场景
EIM极快 (毫秒级)中等 (误差 < 1%)初始设计、参数扫描、趋势分析
FDM较慢 (秒~分钟)高 (误差 < 0.1%)精确模式、模场分布、高阶模分析
避坑指南: 如果你用 EIM 算出来的有效折射率比包层折射率还低,那肯定是搞反了等效方向。我曾经在脊波导上犯过这个错,折腾了两天才发现是水平方向和垂直方向弄颠倒了。

好了,模式分析这块地基咱们算是打牢了。下一章就要用这些有效折射率去设计阵列波导的路径长度差。你想想看,如果有效折射率算偏了 0.01,相位误差就能让 AWG 的通道偏移半个信道——所以这一步千万别糊弄。