在 QuantumATK 中实现 NEGF 输运模型的一个重要特性就是处理异构体系的能力,即两个电极的器件构型不同。这使其可以研究更广范围的重要体系如两种材料间的接触电阻(例如一种半导体/金属界面)或不同手性纳米管间的结电容。在本教程,您将学习如何设置这种结的几何结构。
本教程使用特定版本的QuantumATK创建,因此涉及的截图和脚本参数可能与您实际使用的版本略有区别,请在学习时务必注意。
Builder 中涉及的步骤相当简单,但对于这种类型的几何结构,重要的是研究传输和其他性质如何根据两个管重叠的程度而变化。因此,您还将学习如何通过在脚本添加几行 Python 代码来改变重叠距离。
NEGF
您可以在此处找到 Non-Equilibrium Green’s Function 方法的简介:arXiv。
碳纳米管的原子结构由叫做手性指数的一组整数集 $(n,m)\in\mathbf{Z}^2$ 描述。若 $m=0$ 则碳纳米管为 zigzag 结构。其它特殊指数描述具有特别性质碳纳米管的情况如下:
注解 1:这里我们用垂直条表示连接:“|”。
注解 2:金属和半导体之间的连接也很有趣,尽管在那种情况下可能的相关结构是 m|s|m,而不是 m|s。
首先,您需要设置两个管刚相互接触的参考结构,将其定义为两个管边缘上的原子具有相同 Z 坐标的情况是合理的。
CNT 导电结实例:手性指数为 (12, 12)|(5, 5) 的 m|m
以下说明适用于具有 (12, 12)|(5, 5) 结的m|m 案例,但所涉及到的步骤对于任何手性组合都是相同的。
标注:为了稍后能将两个纳米管做区分,可以将(5, 5)管的所有原子添加标签,具体操作:首先选中所有原子(Ctrl + A),然后打开 Slelect Tags,给 (5, 5) 管的原子都加上 cnt55 的标签。
设置该原子的 Z 坐标为 0 Å,按下 Enter 键。关闭 Move 窗口退出 Move 工具,点击黑色的背景(或按下 Esc 键)取消选中所有原子。对(5, 5)管重复以上操作,只是这次选中最左侧边缘的原子(Z 坐标值最小)。
改变两管间的距离:手动方式
您现在有一个 d = 0 的构型,即该结构两管间的距离定义为 0。为改变两管间重叠的距离,原则上您可以执行以下步骤:
对所有您想研究的 d 值重复以上步骤。现在,如果您想浏览一些距离将会相当麻烦。因此,您可以做一个小的 Python 函数自动执行任务。这将在下一部分描述。
利用一个 Python 函数改变重叠距离
安全起见,保存 d = 0 时构型的副本作为 Python 脚本。利用 Builder 右下角的 Send To 按钮()将结构从 Builder 发送到 Editor 。滚动至脚本的底端,在脚本的最下面嵌入以下代码。
1 # ---------------------------------------------------------------------------- 2 def moveTube(device_configuration, d=0.0): 3 # d is assumed to be in Angstrom 4 # Extract the central region from the device configuration 5 central_region = device_configuration.centralRegion() 6 7 # Number of atoms 8 N = len(central_region.cartesianCoordinates()) 9 # Which atoms are in the right tube? Those with tag="2" 10 right_tube = device_configuration.indicesFromTags("2") 11 12 # Set a Z shift of d for these atoms, and zero for others 13 delta = numpy.zeros(N) 14 delta.put(indices=right_tube, values=d) 15 Delta = numpy.array([numpy.zeros(N),numpy.zeros(N),delta]).transpose() 16 # Shift coordinates! 17 new_coordinates = central_region.cartesianCoordinates() + Delta*Angstrom 18 # Extend (or contract) the unit cell by the same amount 19 va, vb, vc = central_region.bravaisLattice().primitiveVectors() 20 vc = vc + [0.0, 0.0, d]*Angstrom 21 new_cell = UnitCell(va,vb,vc) 22 # Rebuild central region (transfer ghost atoms too) 23 new_central_region = BulkConfiguration( 24 bravais_lattice=new_cell, 25 elements=central_region.elements(), 26 cartesian_coordinates=new_coordinates, 27 ghost_atoms = central_region.ghostAtoms(), 28 ) 29 30 # Transfer the tags to the new configuration 31 for tag in central_region.tags(): 32 new_central_region.addTags(tag, central_region.indicesFromTags(tag)) 33 34 # "Device from bulk" the scripting way 35 from NL.CommonConcepts.Configurations.DeviceFromBulk import deviceFromBulk 36 left_electrode, right_electrode = device_configuration.electrodes() 37 left_electrode_length = left_electrode.bravaisLattice().primitiveVectors()[2,2] 38 right_electrode_length = left_electrode.bravaisLattice().primitiveVectors()[2,2] 39 new_device = deviceFromBulk(left_electrode_length, right_electrode_length, 40 new_central_region 41 ) 42 43 return new_device 44 # ---------------------------------------------------------------------------- 45 d = -5.0 46 device_configuration = moveTube(device_configuration, d)
如果您想理解这段代码的工作原理,可以研究下提供的非常详细的解释的注释。否则,你真正需要知道的就是通过改变倒数第二行的“d”值(单位假定设为 Å),右管移入(d 值为负)或移出(d 值为正)左管。
为观察操作结果,再次使用 按钮将脚本发送回 Builder。因为电极和中心区域也被识别为脚本中存在的有效构型,这将添加不少于四种构型到 Stash 区。如果您替代地将脚本发送到 Script Generator ,则只会有一个构型被传输。
注释: