本教程的目的是向您展示如何在 ATK-SE 中实现在基于密度泛函的紧束缚(DFTB)模型[1][2]中安装新参数集。
ATK 附带了 CP2K 和 Hotbit 合作的 Slater-Koster 参数文件,用于半经验 DFTB 模型。本教程将介绍如何从 DFTB 网站下载其他参数并安装,使它们作为 ATK 的本机部分工作。
安装参数以后,它们就可以用于构建分子、块体和器件系统。在本教程中,您将首先下载并安装 DFTB 参数集,然后学习如何使用 Slater-Koster 计算器计算自旋极化块体系统的性质。
您将主要使用图形用户界面的 QuantumATK 进行设置和分析结果。如果您不熟悉 QuantumATK,我们建议您先阅读一些 QuantumATK 教程。
本教程的基础计算引擎是 ATK-SE,为 QuantumATK 的半经验部分。有关所有参数的完整说明,以及在许多情况下对其物理相关性的详细讨论,请参见 ATK Reference Manual。
为运行本教程并采用 ATK 中通常使用的半经验模型,您必须拥有 ATK-SE 的许可。如果您没有,可以通过网站联系我们获取限时的演示许可:Contact QuantumWise。
dftb.org 网站上有许多 DFTB 方法中可以与 ATK-SE 一起使用的参数。为下载参数,您需要填写他们的注册表。完成注册后,您将收到网站的用户名和密码。
在 DFTB 的下载页面上,您可以看到不同 DFTB 参数集的概述。主要部分是名称为“mio”、“pbc”和“matsci”的参数集,“mio”集可以通过下面进一步列出的大量专业集进一步扩展。该页面还列出了使用参数集时必须参考的论文。
登录 dftb.org 并下载您感兴趣的参数集。下载的文件将位于压缩的 tar 文件(.tar.gz
)中。
ATK 为三个 DFTB 参数集中的每一个都设立了一个特殊的文件夹。例如,安装“mio”参数集势,请解压缩下载的 tar 文件并将 .skf
文件复制到安装 ATK 的目录下 share / tightbinding / dftb / mio /
。在 Linux 中,您可以使用以下命令:
tar zxvf mio-1-1.tar.gz cp mio-1-1/* [ATKPATH]/share/tightbinding/dftb/mio
其中 [ATKPATH]
是安装 QuantumATK 的路径。同样地,应将“pbc”和“matsci”参数文件分别复制到 dftb / pbc
和 dftb / matsci
目录中。请注意,这些目录都是已经存在的,但是空的。
如果您在笔记本电脑或工作站上使用 QuantumATK 设置计算,然后在集群上单独安装 ATK 运行计算,则必须分别在两个系统上都安装参数文件。
为了测试参数是否正确安装,您可以对石墨烯执行以下的能带结构计算。
graphene.nc
。Script Generator 现在应该具有以下设置:
现在打开 New Calculator 模块,并做如下更改:
如果您没有在列表中看到“DFTB [mio]”基组,则是安装过程中出现了问题。检查在您的 ATK 安装目录中是否存在文件 atkpython / share / tightbinding / dftb / mio / C-C.skf
。
为调用自洽的 DFTB 计算,取消勾选 No SCF iteration 的选项框。
默认的假设为紧束缚模型是非自洽的。对于自洽的模型,用户需要取消勾选 No SCF iteration 的选项框。大多数 DFTB 模型都是自洽的。
graphene.nc
,使用右侧工具栏中的 Bandstructure Analyzer 绘制能带结构。您应该能够得到如下所示的结果:如果测试进展顺利,则已正确安装了 DFTB 参数。然后,您可以在 QuantumWise 网站上提供的一些其他 ATK 教程(包括量子传输计算)中采用 DFTB 参数代替 DFT 以节省计算时间。
显然,这仅适用于 DFTB 基组所涵盖的元素。
接下来,您将设置石墨烯纳米带,并使用 DFTB [mio] 模型执行自旋极化计算。
使用 builder 窗口右下角的 按钮将结构发送到 Script Generator,设置能带结构的计算。
在 Script Generator,添加以下模块:
更改输出文件名称为 ribbon.nc
。
Script Generator 现在应该具有如下设置:
DFTB 参数集不包括自旋极化参数。代替地,我们将从 ATK_W 数据库获得自旋极化参数。
点击 OK,完成设置。
下一步,
对话框现在看起来应如下所示。
ribbon.nc
,绘制能带结构图。如果您想要计算多个纳米带的能带结构,使用 Python 脚本将会非常方便。下面的脚本用于执行手性指数为(n,n)的纳米带能带结构计算,其中n是从 1 到 10。
ATK 中纳米带的手性指数符号基于用于形成单胞的平面石墨烯单位矢量的线性组合。因此,(n,n)具有锯齿形边缘,并且实际上对应于具有相同手性指数的展开的扶手椅形纳米管。
对于扶手椅形边缘纳米带,手性指数为(n,0)。
# Setup the DFTB Calculator basis_set = DFTBDirectory("dftb/mio/") pair_potentials = DFTBDirectory("dftb/mio/") numerical_accuracy_parameters = NumericalAccuracyParameters( k_point_sampling=(1, 1, 51), ) iteration_control_parameters = IterationControlParameters() calculator = SlaterKosterCalculator( basis_set=basis_set, pair_potentials=pair_potentials, numerical_accuracy_parameters=numerical_accuracy_parameters, iteration_control_parameters=iteration_control_parameters, spin_polarization=True, ) #loop over different NanoRibbons for n in range(1,10): #generate the nanoribbon bulk_configuration = NanoRibbon(n,n) #Determine the initial spin of the configuration elements = bulk_configuration.elements() coords = bulk_configuration.fractionalCoordinates() scaled_spins = numpy.zeros(len(elements)) #find the index of the two edge Carbon atoms, ymin = 0.5 ymax = 0.5 imin=0 imax=0 for i in range(len(elements)): if coords[i][1] < ymin and elements[i] == Carbon: ymin = coords[i][1] imin = i if coords[i][1] > ymax and elements[i] == Carbon: ymax = coords[i][1] imax = i # set opposite spins on the edge Carbon atoms scaled_spins[imin] = 1 scaled_spins[imax] = -1 #attach calculator, and set the initial spin bulk_configuration.setCalculator( calculator(), initial_spin=InitialSpin(scaled_spins=scaled_spins), ) bulk_configuration.update() # Calculate Bandstructure bandstructure = Bandstructure( configuration=bulk_configuration, route=['G', 'Z'], points_per_segment=200, bands_above_fermi_level=All ) nlsave('bandgap.nc',bandstructure)
下载脚本到项目文件夹(↓ bandgap.py),在 QuantumATK 窗口通过拖放将其发送到 Job Manager。
生成文件 bandgap.nc
。
为分析数据,下载(↓ analyze_bandgap.py),将以下脚本发送到 Job Manager。
w_list = [] gap0_list = [] gap1_list = [] # read a list with the bandstructure data bandstructure = nlread('bandgap.hdf5', Bandstructure) for i in range(len(bandstructure)): # get all the bandlines energies = bandstructure[i].evaluate().inUnitsOf(eV) #calculate the number of occupied bands occupied_bands = numpy.sum(numpy.array(energies[0]) < 0) #calculate the minimum direct band gap gap0 = numpy.min(energies[:,occupied_bands]- energies[:,occupied_bands-1]) #calculate the band gap at the zone boundary gap1 = energies[-1,occupied_bands]- energies[-1,occupied_bands-1] #determine the coordinates in the y direction y_values = NanoRibbon(i+1,i+1).cartesianCoordinates().inUnitsOf(Ang)[:,1] # calculate the width, as distance between furthest carbon atoms # i.e. calculate the H-H distance and subtracting the C-H distance w = numpy.max(y_values)-numpy.min(y_values)-2.2 #append calculated values to the list w_list.append(w) gap0_list.append(gap0) gap1_list.append(gap1) #print the data import pylab pylab.figure() pylab.plot(w_list,gap0_list, 'k-o') pylab.plot(w_list,gap1_list, 'k-o', markerfacecolor='white') pylab.xlabel(r"$w_z$ ($\AA$)", size=16) pylab.ylabel("$\Delta_z$ (eV)", size=16) pylab.show()
图25 直接带隙(实心圆)和区域边界处的带隙作为纳米带宽度的函数。
除了最小的能带外,该图显示了与参考文献[3]中图 4c 相同的定性行为。与 DFT-LDA 计算相比,结果的差异与 DFTB 方法的准确性有关。为了测试,您可以修改脚本,更改计算器的定义:
calculator = LCAOCalculator( numerical_accuracy_parameters=numerical_accuracy_parameters, exchange_correlation = LSDA.PZ )
请记住还要修改输出文件的名称,以便将新数据与旧数据区分开。然后执行脚本。