基于Comsol计算场与Matlab数据处理得到的三角晶格陈数计算方法
三角晶格的陈数计算comsol计算场然后Matlab处理数据得到陈数打开COMSOL的时候鼠标突然抖了一下——这种量子反常霍尔效应的模拟总是带着点玄学。咱们今天要搞的三角晶格陈数计算本质上就是在k空间里玩一场拓扑捉迷藏。别慌先整两杯咖啡咱们从贝里曲率的战场开始冲锋。在COMSOL里搭六边形晶格的时候记得把原胞参数设成sqrt(3)倍数关系。关键操作是在参数化扫描里把kx、ky的遍历范围锁定在布里渊区对角线方向就像这样kx linspace(-pi, pi, 51); ky linspace(-pi/sqrt(3), pi/sqrt(3), 51);这时候磁场设置要玩点花活用周期性边界条件把矢势Ax、Ay调成磁通量匹配的模式。跑完仿真别急着关软件导出贝里曲率数据时注意要把BerryCurvature变量存成三维数组第三维度留着给k点编号。三角晶格的陈数计算comsol计算场然后Matlab处理数据得到陈数转战Matlab战场先来个数据乾坤大挪移data load(berry_curvature.mat); B reshape(data.B, [51,51]); % 重整成k空间网格 [kx_grid, ky_grid] meshgrid(ky, kx); % 注意坐标轴别搞反了 cumulative_chern cumtrapz(ky, cumtrapz(kx, B, 1), 2); chern_number cumulative_chern(end,end)/(2*pi);这里trapz函数的双积分操作暗藏玄机。第一次积分沿着kx方向把贝里曲率铺成条状第二次沿着ky方向把这些条状能量卷起来最后那个除以2π的骚操作才是拓扑不变量的精髓。跑完程序如果看到chern_number输出是0.999或者1.001别慌这货本来就应该是个整数小数点后三位都是数值误差在作妖。有个坑得提醒当k点取样不够密时贝里曲率在狄拉克点附近会像过山车一样剧烈抖动。这时候得祭出插值大法比如在Matlab里用scatteredInterpolant把数据重新网格化。还有个邪门现象——有时候算出的陈数会突然跳变那多半是COMSOL里边界条件没设对回去检查下原胞的周期性连接有没有被磁通量戳破。