这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
atk:si_100_表面的复数能带 [2018/12/26 23:24] – [复数能带的计算] xie.congwei | atk:si_100_表面的复数能带 [2019/09/01 10:00] (当前版本) – [背景] dong.dong | ||
---|---|---|---|
行 3: | 行 3: | ||
- | 本教程中,您将计算 Si 晶体 (100) 面上的复数能带。 | + | 本教程中,您将计算 Si 晶体 (100) 面上的复数能带。您将: |
- | + | ||
- | 特别地,您将: | + | |
- 创建 Si(100) 表面; | - 创建 Si(100) 表面; | ||
行 14: | 行 12: | ||
===== 背景 ===== | ===== 背景 ===== | ||
- | 对于周期性固体,薛定谔方程 $H \psi_{n{\bf k}} = E_{n{\bf k}} S \psi_{n{\bf k}}$ ($S$ 为重叠矩阵)中的 $\psi_{n{\bf k}}$ 可以写为 $\psi_{n{\bf k}}({\bf r}) = e^{-i {\bf k}\cdot {\bf r}} U_{n{\bf k}}({\bf r})$,这里的 $U_{n{\bf k}}({\bf r})$ 是与晶体自身周期性相同的周期函数。在一般的能带结构计算中,波矢量 ${\bf k}$ 为实数,通过求解上面的薛定谔方程得到不同 ${\bf k}$ (通常位于第一布里渊区的对称线上) | + | 对于周期性固体,薛定谔方程 $H \psi_{n{\bf k}} = E_{n{\bf k}} S \psi_{n{\bf k}}$ ($S$ 为重叠矩阵)中的 $\psi_{n{\bf k}}$ 可以写为 $\psi_{n{\bf k}}({\bf r}) = e^{-i {\bf k}\cdot {\bf r}} U_{n{\bf k}}({\bf r})$,这里的 $U_{n{\bf k}}({\bf r})$ 是与晶体自身周期性相同的周期函数。在一般的能带结构计算中,波矢量 ${\bf k}$ 为实数,通过求解上面的薛定谔方程得到不同 ${\bf k}$ (通常位于第一布里渊区的高对称线上) 值上的本征矢量,由此确定本征能量 $E_{n{\bf k}}$ (即能带结构)。 |
- | 计算复数能带的另一个方法可参考 <color # | + | 计算复数能带的方法可参考 <color # |
+ | |||
+ | 更多关于复数能带结构的概念和在导电结中的应用,请参考: | ||
+ | * Jensen, A. et al. Complex band structure and electronic transmission eigenchannels. J. Chem. Phys. 147, 224104 (2017)。 | ||
+ | * Yia-Chung Chang and J. N. Schulman. Complex band structures of crystalline solids: An eigenvalue method. Phys. Rev. B, 25: | ||
行 24: | 行 26: | ||
本教程中的计算将使用 QuantumATK 的半经验模型。所有参数的完整说明和有关其物理相关性在很多情况下的详细讨论,可参阅 [[https:// | 本教程中的计算将使用 QuantumATK 的半经验模型。所有参数的完整说明和有关其物理相关性在很多情况下的详细讨论,可参阅 [[https:// | ||
+ | </ | ||
+ | |||
+ | <WRAP center info 100%> | ||
+ | === 提示 === | ||
+ | **本教程使用特定版本的QuantumATK创建,因此涉及的截图和脚本参数可能与您实际使用的版本略有区别,请在学习时务必注意。** | ||
+ | * 不同版本的QuantumATK的py脚本可能不兼容; | ||
+ | * 较新的版本输出的数据文件默认为hdf5; | ||
+ | * 老版本的数据文件为nc文件,可以被新版本读取。 | ||
</ | </ | ||
行 62: | 行 72: | ||
- 更改默认输出文件名为 '' | - 更改默认输出文件名为 '' | ||
- | {{ : | + | {{ : |
行 79: | 行 89: | ||
+ | {{ : | ||
+ | <WRAP center important 100%> | ||
+ | === 注意 === | ||
+ | 在复数能带计算中, ${\bf k}$ 在切割平面的投影保持不变,且投影值从 $(k_A,k_B)$ 参数获得,该参数用两个第一倒易晶格矢量 ${\bf g}_A$ 和 ${\bf g}_B$ 表示。因此,所得解将位于与切割平面法线平行的第三倒易晶格矢量 ${\bf g}_C$。对应于每一个 $(k_A,k_B)$ 值可以获得一组新解 $k_C+i\kappa_C$。 | ||
+ | 请注意,$k_C$ 是复数能带机构的实部,而 $kappa_C$ 为虚部。 | ||
+ | </ | ||
+ | |||
+ | |||
+ | 您现在已经完成了 Python 脚本,保存为 '' | ||
+ | |||
+ | <WRAP center tip 100%> | ||
+ | === 提示 === | ||
+ | 这种类型的计算并行得非常好,因此对于较大的结构,强烈建议并行执行脚本。 | ||
+ | </ | ||
行 86: | 行 110: | ||
==== 分析结果 ==== | ==== 分析结果 ==== | ||
+ | |||
+ | 文件 '' | ||
+ | |||
+ | ^ {{ : | ||
+ | |||
+ | 选择那个分析数据块,选择右边插件栏的 **Show 2D Plot** 工具,显示复数能带图的窗口弹出。放大一些可以过滤掉那些复数部分 $\kappa_C$ 的较大值,因为这些都不是真正相关的。 | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 图51 Si(100) 的能带结构。图右侧显示的是实数能带——注意 ~1.2 eV 的间接带隙。图左侧显示的是复数能带随虚部 $\kappa_C$ 变化。具有一个小虚部的能带是最重要的,因为在您试图沿(100)方向上用电子穿过硅薄片时,它们会衰减较少。 | ||
+ | |||
+ | <WRAP center important 100%> | ||
+ | === 注意 === | ||
+ | 在上图中,$\kappa_C$ 的解可从倒易的笛卡尔坐标中获取,以便更容易地比较不同结构。另一方面,对于能带结构的实部,$\kappa_C$ 的解由 $L$ 归一化后得到,分层垂直于切割平面。在 fcc 晶体沿(100)面切割的案例中,分层为 $L=a/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
==== 3D 和 2D 的可视化 ==== | ==== 3D 和 2D 的可视化 ==== | ||
+ | |||
+ | <WRAP center tip> | ||
+ | 提示:在较新的版本中,复数能带可以直接在分析工具中用Complex Band Structure Analyzer可视化,无需再使用脚本。此处保留脚本供大家学习如何使用Python语言进行复杂的作图。 | ||
+ | </ | ||
+ | |||
+ | |||
+ | 在能带结构的复数部分中,解也包含了实数部分。因此解可以在三维图中可视化,$(x, | ||
+ | |||
+ | <code python> | ||
+ | 1 from QuantumATK import * | ||
+ | 2 from mpl_toolkits.mplot3d import Axes3D | ||
+ | 3 | ||
+ | 4 | ||
+ | 5 | ||
+ | 6 # Read the complex bandstructure object from the NC file | ||
+ | 7 cbs = nlread(' | ||
+ | 8 | ||
+ | 9 | ||
+ | 10 L = cbs.layerSeparation() | ||
+ | 11 | ||
+ | 12 fig = plt.figure() | ||
+ | 13 ax = fig.add_subplot(111, | ||
+ | 14 | ||
+ | 15 # First plot the real bands | ||
+ | 16 kvr = numpy.array([]) | ||
+ | 17 e = numpy.array([]) | ||
+ | 18 | ||
+ | 19 # Loop over energies, and pick those where we have solutions | ||
+ | 20 for (j, energy) in enumerate(energies): | ||
+ | 21 k = k_real[j]*L/ | ||
+ | 22 if len(k)> | ||
+ | 23 e = numpy.append(e, | ||
+ | 24 kvr = numpy.append(kvr, | ||
+ | 25 | ||
+ | 26 # Plot the bands with red | ||
+ | 27 | ||
+ | 28 | ||
+ | 29 # Next plot the complex bands | ||
+ | 30 kvr = [] | ||
+ | 31 kvi = [] | ||
+ | 32 e = [] | ||
+ | 33 | ||
+ | 34 # Again loop over energies and pick solutions | ||
+ | 35 for (j, energy) in enumerate(energies): | ||
+ | 36 if len(k_complex[j])> | ||
+ | 37 for x in numpy.array(k_complex[j]*L/ | ||
+ | 38 kr = numpy.abs(x.real) | ||
+ | 39 ki = -numpy.abs(x.imag) | ||
+ | 40 # Discard rapidly decaying modes which clutter the plot | ||
+ | 41 if ki>-0.3: | ||
+ | 42 e += [energy] | ||
+ | 43 kvr += [kr] | ||
+ | 44 kvi += [ki] | ||
+ | 45 | ||
+ | 46 # Plot the complex bands with blue | ||
+ | 47 | ||
+ | 48 | ||
+ | 49 # Put on labels | ||
+ | 50 | ||
+ | 51 | ||
+ | 52 | ||
+ | 53 | ||
+ | 54 | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | 使用作业管理器 **Job Manager** {{: | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | 图 52 Si(100) 面复数能带的 3D 可视化图,实数能带由红色圆点表示,复数部分由蓝色圆点表示。请注意复数能带是怎样与实数能带连接的。 | ||
+ | |||
+ | 另一种将复数能带结构实数部分可视化的方式就是利用颜色。脚本 [[https:// | ||
+ | |||
+ | <code python> | ||
+ | 1 from QuantumATK import * | ||
+ | 2 | ||
+ | 3 | ||
+ | 4 | ||
+ | 5 # Read the complex bandstructure object from the NC file | ||
+ | 6 cbs = nlread(' | ||
+ | 7 | ||
+ | 8 | ||
+ | 9 | ||
+ | 10 ax = plt.axes() | ||
+ | 11 | ||
+ | 12 | ||
+ | 13 # First plot the real bands | ||
+ | 14 kvr = numpy.array([]) | ||
+ | 15 e = numpy.array([]) | ||
+ | 16 for (j, energy) in enumerate(energies): | ||
+ | 17 k = k_real[j]*cbs.layerSeparation()/ | ||
+ | 18 if len(k)> | ||
+ | 19 e = numpy.append(e, | ||
+ | 20 kvr = numpy.append(kvr, | ||
+ | 21 | ||
+ | 22 # Plot | ||
+ | 23 | ||
+ | 24 c=numpy.abs(kvr), | ||
+ | 25 cmap=cmap, marker=' | ||
+ | 26 | ||
+ | 27 # Next plot the complex bands | ||
+ | 28 kvr = numpy.array([]) | ||
+ | 29 kvi = numpy.array([]) | ||
+ | 30 e = numpy.array([]) | ||
+ | 31 | ||
+ | 32 for (j, energy) in enumerate(energies): | ||
+ | 33 if len(k_complex[j])> | ||
+ | 34 kr = [numpy.abs(x.real) for x in k_complex[j]] | ||
+ | 35 ki = [numpy.abs(x.imag) for x in k_complex[j]] | ||
+ | 36 e = numpy.append(e, | ||
+ | 37 kvr = numpy.append(kvr, | ||
+ | 38 kvi = numpy.append(kvi, | ||
+ | 39 | ||
+ | 40 # Plot with color depending on the imaginary part (corresponding to real k-points) | ||
+ | 41 sc = ax.scatter(-kvi, | ||
+ | 42 | ||
+ | 43 | ||
+ | 44 | ||
+ | 45 # Put on labels and decorations | ||
+ | 46 | ||
+ | 47 | ||
+ | 48 | ||
+ | 49 | ||
+ | 50 | ||
+ | 51 | ||
+ | 52 | ||
+ | 53 | ||
+ | 54 # Add a colorbar | ||
+ | 55 fig = plt.gcf() | ||
+ | 56 x1, x2, y1, y2 = 0., 1, ax.get_ylim()[0], | ||
+ | 57 trans = ax.transData + fig.transFigure.inverted() | ||
+ | 58 | ||
+ | 59 | ||
+ | 60 | ||
+ | 61 | ||
+ | 62 a = numpy.outer(numpy.arange(0, | ||
+ | 63 | ||
+ | 64 ax = plt.gca() | ||
+ | 65 | ||
+ | 66 | ||
+ | 67 | ||
+ | 68 | ||
+ | 69 | ||
+ | 70 | ||
+ | </ | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | |||
+ | 图 53 复数能带结构的 2D 可视化图。注意 k 值的颜色编码如何应用于能带结构的实数和复数部分,这使得能更容易分辨出复数能带附着于实数能带的位置。 | ||
+ | |||
+ | 复数能带的“森林”中有一个相当大的 $\kappa$ 值,在紧束缚模拟中并不常见。然而,对于 DFT 和 Hückel 理论中,基组更大,因此与含有各种价带的未占用能级连接的复数能带也就更多。 | ||
+ | |||
+ | |||
+ | <WRAP center tip 100%> | ||
+ | === 提示 === | ||
+ | 您可能注意到了可视化中存在着“间隙”。原因在于,与正常的能带图不同,不是将数据绘制成线而是圆点。在标准的能带图中,您可以用一些置信水平定义“能带”,在对称点(只有在能带交叉处会产生一些小问题)间连续分布。在当前案例中,首先解的数量在每个能量处(尤其是复数一侧)不同,且依赖于能量取样的密度,您可能不会找到一条特别的能带接近于某些点,这些点位于能带非常平缓(重的有效质量)的位置。通过增加能量点的数量可以在一定程度上缓解这种情况。 | ||
+ | </ | ||
+ | |||
+ | |||
==== 参考 ==== | ==== 参考 ==== | ||
+ | |||
+ | * [CS82] Yia-Chung Chang and J. N. Schulman. Complex band structures of crystalline solids: An eigenvalue method. //Phys. Rev. B//, 25: | ||
+ | |||
+ | * Jensen, A. et al. Complex band structure and electronic transmission eigenchannels. J. Chem. Phys. 147, 224104 (2017). | ||
+ | * 英文原文:[[https:// |