用户工具

站点工具

本页面的其他翻译:
  • zh

atk:quantumatk-se中的dftb模型

QuantumATK-SE中的DFTB模型

本教程的目的是向您展示如何在 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 参数

获取 DFTB 的许可

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 / pbcdftb / matsci 目录中。请注意,这些目录都是已经存在的,但是空的。

警告

如果您在笔记本电脑或工作站上使用 QuantumATK 设置计算,然后在集群上单独安装 ATK 运行计算,则必须分别在两个系统上都安装参数文件。

测试安装

能带结构计算

能带结构计算

为了测试参数是否正确安装,您可以对石墨烯执行以下的能带结构计算。

  • 启动 QuantumATK 并创建一个新项目,然后单击 Open
  • 启动 Builder,然后单击 Add From Database,找到石墨烯。

  • 将结构添加到 Stash (双击或使用 按钮)。
  • 利用 按钮将结构发送到 Script Generator
  • Script Generator,添加以下模块:
    1. New Calculator
    2. Bandstructure
  • 修改输出文件名称为 graphene.nc

Script Generator 现在应该具有以下设置:

现在打开 New Calculator 模块,并做如下更改:

  • 选择 ATK-SE: Slater-Koster 计算器。
  • 更改 k-point sampling 为 (5, 5, 1)。
  • 转至 Slater-Koster basis set,检查已安装的基组是否在基组列表里。选择 “DFTB [mio]” 基组。

注意

如果您没有在列表中看到“DFTB [mio]”基组,则是安装过程中出现了问题。检查在您的 ATK 安装目录中是否存在文件 atkpython / share / tightbinding / dftb / mio / C-C.skf

为调用自洽的 DFTB 计算,取消勾选 No SCF iteration 的选项框。

关注

默认的假设为紧束缚模型是非自洽的。对于自洽的模型,用户需要取消勾选 No SCF iteration 的选项框。大多数 DFTB 模型都是自洽的。

  • 使用 Send To 按钮()将脚本传输到 Job Manager,然后启动计算。
  • 作业完成后,在 QuantumATK 主窗口的项目文件下找到文件 graphene.nc,使用右侧工具栏中的 Bandstructure Analyzer 绘制能带结构。您应该能够得到如下所示的结果:

注意

如果测试进展顺利,则已正确安装了 DFTB 参数。然后,您可以在 QuantumWise 网站上提供的一些其他 ATK 教程(包括量子传输计算)中采用 DFTB 参数代替 DFT 以节省计算时间。

显然,这仅适用于 DFTB 基组所涵盖的元素。

用 DFTB 计算自旋极化

计算石墨烯带的自旋极化

接下来,您将设置石墨烯纳米带,并使用 DFTB [mio] 模型执行自旋极化计算。

  • 打开 Builder,然后点击 Add From Plugin Nanoribbon。
  • 构建一个具有 8 个原子宽的锯齿形带。

使用 builder 窗口右下角的 按钮将结构发送到 Script Generator,设置能带结构的计算。

Script Generator,添加以下模块:

  • New Calculator
  • Initial State
  • Bandstructure

更改输出文件名称为 ribbon.nc

Script Generator 现在应该具有如下设置:

打开 New Calculator 模块。

  • 选择 ATK-SE: Slater-Koster 计算器。
  • 更改 k-point sampling 为 (1,1,11)。
  • 转至 Slater-Koster basis set,选择 “DFTB [mio]” 基组。
  • 为执行自旋极化 DFTB 计算,勾选 Use polarized spin 的选框。

注意

DFTB 参数集不包括自旋极化参数。代替地,我们将从 ATK_W 数据库获得自旋极化参数。

点击 OK,完成设置。

下一步,

  • 双击打开 Initial State 模块。
  • 设置 Initial state typeUser spin
  • 在 Spin 下,设置 Carbon 和 Hydrogen 的默认旋转为 0。
  • 在 3D 视图:
    • 单击上方的碳原子(原子列表中的索引为 0),将它的 initial relative spin 设置为 1.0。
    • 对位于较低位置的碳原子(列表中的编号为 1)重复以上步骤,将其 initial relative spins 设置为 -1.0。(不要被碳原子并不是按 Y 坐标排序的事实所混淆)。
    • 保持氢原子和其他碳原子的 initial relative spins 值为 0.0。

对话框现在看起来应如下所示。

最后,打开 Bandstructure 模块:

  • Points pr. Segment 设置为 200。这意味着每条能带将以 200 个点的分辨率计算。
  • 另外请注意默认建议的布里渊区(以倒易晶格矢量为单位,从 $\Gamma$ 点 G=(0,0,0) 到 Z=(0,0,1/2) )是很合适的。

  • 发送脚本到 Job Manager 并运行。
  • 返回至主 QuantumATK 窗口,选中文件 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
    )

请记住还要修改输出文件的名称,以便将新数据与旧数据区分开。然后执行脚本。

参考

atk/quantumatk-se中的dftb模型.txt · 最后更改: 2019/05/28 21:46 由 xie.congwei

© 2014-2022 费米科技(京ICP备14023855号