摘要:最近在学习新的模型,其中有些模型需要观察参数变化对能带的影响,例如拓扑绝缘体中的能带会随着参数的变化出现能隙关闭再打开。对于这个,TopoTB软件包可以方便的做这件事,软件包见
最近在学习新的模型,其中有些模型需要观察参数变化对能带的影响,例如拓扑绝缘体中的能带会随着参数的变化出现能隙关闭再打开。对于这个,TopoTB软件包可以方便的做这件事,软件包见
软件包用Mathematica写的,你可以直接修改软件包中的画图风格等。除此之外,《Mathematica数值求解TB模型代码汇总》也给出了相关的代码,欢迎参考。
对于TB模型,我们需要知道该模型的正格子,这样可以确定倒格子,然后就得到了第一布里渊区和高对称点的坐标,可以直接画沿着高对称路径的能带!
下面我们以Kane-Mele模型为例进行计算,该模型对应的哈密顿量见《Kane-Mele模型学习笔记》一文。为了方便,贴出代码
H={{\[Lambda]v+\[Lambda]SO (-4 Cos[(Sqrt[3] ky)/2] Sin[kx/2]+2 Sin[kx]),0,t (1+2 Cos[kx/2] Cos[(Sqrt[3] ky)/2])-2 I t Cos[kx/2] Sin[(Sqrt[3] ky)/2],-I \[Lambda]R (1-Cos[kx/2] Cos[(Sqrt[3] ky)/2])+I Sqrt[3] \[Lambda]R Cos[(Sqrt[3] ky)/2] Sin[kx/2]+\[Lambda]R Cos[kx/2] Sin[(Sqrt[3] ky)/2]+Sqrt[3] \[Lambda]R Sin[kx/2] Sin[(Sqrt[3] ky)/2]},{0,\[Lambda]v-\[Lambda]SO (-4 Cos[(Sqrt[3] ky)/2] Sin[kx/2]+2 Sin[kx]),-I \[Lambda]R (1-Cos[kx/2] Cos[(Sqrt[3] ky)/2])-I Sqrt[3] \[Lambda]R Cos[(Sqrt[3] ky)/2] Sin[kx/2]+\[Lambda]R Cos[kx/2] Sin[(Sqrt[3] ky)/2]-Sqrt[3] \[Lambda]R Sin[kx/2] Sin[(Sqrt[3] ky)/2],t (1+2 Cos[kx/2] Cos[(Sqrt[3] ky)/2])-2 I t Cos[kx/2] Sin[(Sqrt[3] ky)/2]},
{t (1+2 Cos[kx/2] Cos[(Sqrt[3] ky)/2])+2 I t Cos[kx/2] Sin[(Sqrt[3] ky)/2],I \[Lambda]R (1-Cos[kx/2] Cos[(Sqrt[3] ky)/2])+I Sqrt[3] \[Lambda]R Cos[(Sqrt[3] ky)/2] Sin[kx/2]+\[Lambda]R Cos[kx/2] Sin[(Sqrt[3] ky)/2]-Sqrt[3] \[Lambda]R Sin[kx/2] Sin[(Sqrt[3] ky)/2],-\[Lambda]v-\[Lambda]SO (-4 Cos[(Sqrt[3] ky)/2] Sin[kx/2]+2 Sin[kx]),0},
{I \[Lambda]R (1-Cos[kx/2] Cos[(Sqrt[3] ky)/2])-I Sqrt[3] \[Lambda]R Cos[(Sqrt[3] ky)/2] Sin[kx/2]+\[Lambda]R Cos[kx/2] Sin[(Sqrt[3] ky)/2]+Sqrt[3] \[Lambda]R Sin[kx/2] Sin[(Sqrt[3] ky)/2],t (1+2 Cos[kx/2] Cos[(Sqrt[3] ky)/2])+2 I t Cos[kx/2] Sin[(Sqrt[3] ky)/2],0,-\[Lambda]v+\[Lambda]SO (-4 Cos[(Sqrt[3] ky)/2] Sin[kx/2]+2 Sin[kx])}};
H//TraditionalForm
3D布里渊区
<
lat={{1/2,Sqrt[3]/2,0},{-(1/2),Sqrt[3]/2,0},{0,0,3}};
(*给出正格子和倒格子及其对应的WS原胞和第一布里渊区*)
ds=FBZ3D[lat,False,Blue,Purple,3]
例如这里点击第四行,得到
<
ds=FBZ2D[lat,False,Blue,Purple,4]
对于2D布里渊区,用BrillouinZone2D可以给出更加详细的信息,这个函数可以辅助确定三维体结构对应的二维表面的高对称点,尤其是对于不规则的布里渊区。这部分代码在《二维布里渊区高对称点的计算》有介绍。
<
lat={a,b,c};
surf001={a,b};(*研究a和b组成的平面*)
ds=BrillouinZone2D[lat,surf001,{-1,1}]
能带
(*每两个高对称点撒点个数*)
HSPBand函数给出了随机的能带颜色,这样每次打开并重新计算,你都会得到不一样的能带颜色,希望能够给你带来好心情!😊😊😊!
以下是对于该函数计算结果的一些再处理,比如查看图片和导出图片
ds[5]
(*导出图片在当前文件夹下*)
SetDirectory[FileNameTake[NotebookFileName,{1,-2}]];
Export["Kane-Mele.png",ds[5],ImageResolution->1000]
导出数据和再次画图
(*根据ds[4]中的能带数据画第二条和第三条能带*)
temp=Normal[ds[4]];
ListPlot[{temp[[2]],temp[[3]]},PlotStyle->{Red,Blue}]
通过软件包中定义的一些函数再画图
tband=Normal[ds[4]];
KK=Normal[ds[3]];
(*BandPlot是软件包中定义的一个函数*)
BandPlot[tband,KK,Red,0.005,3/4,{-4,4}]
tband=Normal[ds[4]];
KK=Normal[ds[3]];
(*BandIndexPlot是软件包中定义的一个函数*)
BandIndexPlot[tband,KK,{Red,Blue,Green,Purple},0.005,3/4,{-4,4}]
tband=Normal[ds[4]];
KK=Normal[ds[3]];
(*BandLabelsPlot是软件包中定义的一个函数*)
BandLabelsPlot[tband,KK,Automatic,0.005,3/4,{-4,4}]
能带调节第一种方法,可以通过Do循环进行参数测试,这里保持其他参数取默认值,分别取值,计算结果保存在当前文件夹下。
{t,1,3}]
第二种方法,可以通过Manipulate交互式操作进行参数测试,通过设置参数范围,滑动滑块观察能带变化。如果有不错的能带,可以点击Save and Clear Output保存图片。
SetDirectory[FileNameTake[NotebookFileName,{1,-2}]];
nband=4;(*设置能带的数目*)
kpath=Normal[ds[1]];
kdist=Normal[ds[2]];
Manipulate[
bandFig=Module[{},
h[{kx_,ky_,kz_},t_:1,\[Lambda]R_:0.05,\[Lambda]SO_:0.06,\[Lambda]v_:0.1]=H;
vals=Table[Eigenvalues[h[i,t,\[Lambda]R,\[Lambda]SO,\[Lambda]v]]//Sort,{i,kpath}];
band=Table[Transpose[{kdist,vals[[All,i]]}],{i,1,nband}];
ListLinePlot[band,PlotLabel->{"t"->ToString[t],"\[Lambda]R"->ToString[\[Lambda]R],
"\[Lambda]SO"->ToString[\[Lambda]SO],"\[Lambda]v"->ToString[\[Lambda]v]}]
],
{t,0,2},{\[Lambda]R,0,0.1},{\[Lambda]SO,0,0.1},{\[Lambda]v,0,0.2},
Button["Save and Clear Output",
fileName="t="ToString[t]";\[Lambda]R="ToString[\[Lambda]R]
";\[Lambda]SO="ToString[\[Lambda]SO]";\[Lambda]v="ToString[\[Lambda]v]".png";
(*设置保存图片时的名称*)
Export[fileName,bandFig];
NotebookSave;
NotebookDelete[EvaluationCell]]
]
来源:晓霞科技论