comsol六角蜂窝光子晶体能带仿真 高对称路径+k空间,含两个仿真模型和一个k空间能带图出图matlab脚本 comsol光学仿真

光子晶体能带仿真这玩意儿,说难不难说简单也不简单。最近在COMSOL里折腾六角蜂窝结构,发现有几个关键操作特别容易翻车,特别是高对称路径的设置和能带图后处理。咱们直接开整,先说怎么在COMSOL里搞出这个蜂窝结构。

建模时记得先画个六边形基元,用参数控制晶格常数a。这里有个骚操作:用阵列复制功能时勾选"移位复制",参数设置成sqrt(3)a的水平位移和1.5a的垂直位移,这样能直接生成蜂窝结构。别用默认的正交阵列,不然蜂窝会变形成麻将席(别问我怎么知道的)。
matlab
% 晶格参数设置
a = 1e-6; % 晶格常数1微米
theta = 0:60:300; % 六边形顶点角度
x = a*cosd(theta);
y = a*sind(theta);
波动方程模块里边界条件要选Bloch周期性条件,注意k向量的三个分量得用参数kx,ky表示。这里有个坑:六角晶系的高对称路径是Γ-M-K-Γ,对应的k空间坐标得手动换算。比如M点坐标是(2π/(sqrt(3)a), 0),K点是(π/(sqrt(3)a), π/(3a))。建议直接在参数扫描里设置参数化路径:
matlab
% 高对称路径参数
gamma = [0, 0];
M = [2*pi/(sqrt(3)*a), 0];
K = [pi/(sqrt(3)*a), pi/(3*a)];
path = linspace(gamma, M, 20); % Γ-M段
path = [path; linspace(M, K, 20)]; % M-K段
path = [path; linspace(K, gamma, 20)]; % K-Γ段
仿真跑完后处理数据时,COMSOL自带的能带图功能可能会把不同模式混在一起。这时候要用MATLAB脚本清洗数据。重点是把特征频率按k点顺序重新排列,用sortrows函数按频率值排序,同时保持k点路径的连续性。这里分享个实用技巧------用移动平均滤波消除数值噪声:
matlab
% 数据后处理
raw_data = load('band_data.txt');
k_points = raw_data(:,1);
freq = raw_data(:,2:end);
[~, idx] = sort(k_points);
sorted_freq = freq(idx,:);
% 滑动平均去毛刺
window_size = 5;
smoothed_freq = movmean(sorted_freq, window_size, 1);
% 绘制能带图
figure('Position',[100 100 800 400])
hold on
for n = 1:size(smoothed_freq,2)
plot(k_points(idx), smoothed_freq(:,n), 'LineWidth',1.5)
end
xlabel('Wave vector');
ylabel('Frequency (Hz)');
set(gca,'XTick',[0 1/3 2/3 1], 'XTickLabel',{'Γ','M','K','Γ'})
最后说个血泪教训:检查特征频率的单位!COMSOL默认用Hz,但光子晶体文献常用归一化频率a/λ。有次我忘了单位转换,结果论文里的能带图和别人差了两个数量级,被审稿人怼成筛子。记住这个公式保命:f_normalized = a*f/c,其中c是光速。

