这是本文档旧的修订版!
在 QuantumATK 中实现 NEGF 输运模型的一个重要特性就是处理异构体系的能力,即两个电极的器件构型不同。这使其可以研究更广范围的重要体系如两种材料间的接触电阻(例如一种半导体/金属界面)或不同手性纳米管间的结电容。在本教程,您将学习如何设置这种结的几何结构。 |
---|
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\\ 3\\ 4\\ 5\\ 6\\ 7\\ 8\\ 9\\ 10\\ 11\\ 12\\ 13\\ 14\\ 15\\ 16\\ 17\\ 18\\ 19\\ 20\\ 21\\ 22\\ 23\\ 24\\ 25\\ 26\\ 27\\ 28\\ 29\\ 30\\ 31\\ 32\\ 33\\ 34\\ 35\\ 36\\ 37\\ 38\\ 39\\ 40\\ 41\\ 42\\ 43\\ 44\\ 45\\ 46 ^ # ----------------------------------------------------------------------------\\ def moveTube(device_configuration, d=0.0):\\ # d is assumed to be in Angstrom\\ # Extract the central region from the device configuration\\ central_region = device_configuration.centralRegion()\\ \\ # Number of atoms\\ N = len(central_region.cartesianCoordinates())\\ # Which atoms are in the right tube? Those with tag="2"\\ right_tube = device_configuration.indicesFromTags("2")\\ \\ # Set a Z shift of d for these atoms, and zero for others\\ delta = numpy.zeros(N)\\ delta.put(indices=right_tube, values=d)\\ Delta = numpy.array([numpy.zeros(N),numpy.zeros(N),delta]).transpose()\\ # Shift coordinates!\\ new_coordinates = central_region.cartesianCoordinates() + Delta*Angstrom\\ # Extend (or contract) the unit cell by the same amount\\ va, vb, vc = central_region.bravaisLattice().primitiveVectors()\\ vc = vc + [0.0, 0.0, d]*Angstrom\\ new_cell = UnitCell(va,vb,vc)\\ # Rebuild central region (transfer ghost atoms too)\\ new_central_region = BulkConfiguration(\\ bravais_lattice=new_cell,\\ elements=central_region.elements(),\\ cartesian_coordinates=new_coordinates,\\ ghost_atoms = central_region.ghostAtoms(),\\ )\\ \\ # Transfer the tags to the new configuration\\ for tag in central_region.tags():\\ new_central_region.addTags(tag, central_region.indicesFromTags(tag))\\ \\ # "Device from bulk" the scripting way\\ from NL.CommonConcepts.Configurations.DeviceFromBulk import deviceFromBulk\\ left_electrode, right_electrode = device_configuration.electrodes()\\ left_electrode_length = left_electrode.bravaisLattice().primitiveVectors()[2,2]\\ right_electrode_length = left_electrode.bravaisLattice().primitiveVectors()[2,2]\\ new_device = deviceFromBulk(left_electrode_length, right_electrode_length,\\ new_central_region\\ )\\ \\ return new_device\\ # ----------------------------------------------------------------------------\\ d = -5.0\\ device_configuration = moveTube(device_configuration, d) ^