这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版上一修订版两侧同时换到之后的修订记录 | ||
atk:使用atk研究电子输运 [2016/06/02 19:53] – dong.dong | atk:使用atk研究电子输运 [2018/03/20 18:39] – liu.jun | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== 使用ATK研究电子输运 ====== | + | ====== 使用QuantumATK研究电子输运 ====== |
- | 本文用简单的实例介绍使用ATK研究电子输运的基本概念,计算设置应该注意的事项和对体系输运性质进行的常用分析方法。 | + | 本文用简单的实例介绍使用QuantumATK研究电子输运的基本概念,计算设置应该注意的事项和对体系输运性质进行分析的常用方法。 |
为了快速完成计算,这里用到的体系是Zn-ZnO-Zn,使用ATK-SE半经验方法进行计算。体系的结构见下图: | 为了快速完成计算,这里用到的体系是Zn-ZnO-Zn,使用ATK-SE半经验方法进行计算。体系的结构见下图: | ||
行 6: | 行 6: | ||
{{ : | {{ : | ||
+ | <WRAP center tip 100%> | ||
+ | 要了解如何构建可靠的器件模型,请参考:[[atk: | ||
+ | </ | ||
+ | |||
+ | <WRAP center info 100%> | ||
+ | === 提示 === | ||
+ | **本教程使用特定版本的QuantumATK创建,因此涉及的截图和脚本参数可能与您实际使用的版本略有区别,请在学习时务必注意。** | ||
+ | </ | ||
===== 实例简述 ===== | ===== 实例简述 ===== | ||
实例计算中使用紧束缚近似(TB)的半经验方法,结合非平衡态格林函数方法(NEGF)研究上述器件结构的电子输运特性。理论方法的详细描述见:[[http:// | 实例计算中使用紧束缚近似(TB)的半经验方法,结合非平衡态格林函数方法(NEGF)研究上述器件结构的电子输运特性。理论方法的详细描述见:[[http:// | ||
- | 这里主要介绍器件电子输运计算的核心概念与在VNL-ATK中可以进行的常用计算: | + | 这里主要介绍器件电子输运计算的核心概念与在QuantumATK中可以进行的常用计算: |
* 器件的基本结构 | * 器件的基本结构 | ||
* 选择合适的计算精度 | * 选择合适的计算精度 | ||
行 23: | 行 31: | ||
与通常的计算模拟中常见的块体材料的周期性体系(bulk)和分子体系的孤立结构(molecule)不同,用于电子输运计算的器件体系(device)比较特殊。器件结构由左、右两个电极(electrode,分别是周期性体系)和中间区域(central region,分子体系)构成。在晶体管器件中,左、右电极也称为源、漏电极。中间区域则是一个有限的区域,也称为散射区(scattering region),由于载流子从一个电极到另一个电极传输时会受到中间区域的散射,因此,中间区域是决定器件特性的关键区域。 | 与通常的计算模拟中常见的块体材料的周期性体系(bulk)和分子体系的孤立结构(molecule)不同,用于电子输运计算的器件体系(device)比较特殊。器件结构由左、右两个电极(electrode,分别是周期性体系)和中间区域(central region,分子体系)构成。在晶体管器件中,左、右电极也称为源、漏电极。中间区域则是一个有限的区域,也称为散射区(scattering region),由于载流子从一个电极到另一个电极传输时会受到中间区域的散射,因此,中间区域是决定器件特性的关键区域。 | ||
- | 中间区域除了可能存在的不同于电极部分的材料之外,还包括左、右电极部分的一个完整的、严格的重复(electrode extension),这在使用VNL构建器件结构和ATK的整个计算过程中是必须满足也是默认满足的条件。 | + | 中间区域除了可能存在的不同于电极部分的材料之外,还包括左、右电极部分的一个完整的、严格的重复(electrode extension),这在使用VNL构建器件结构和QuantumATK的整个计算过程中是必须满足也是默认满足的条件。 |
{{ : | {{ : | ||
行 34: | 行 42: | ||
* 中间区域可以是各种形式的材料,如金属-半导体-金属的夹层结构、分子、纳米管、纳米带等; | * 中间区域可以是各种形式的材料,如金属-半导体-金属的夹层结构、分子、纳米管、纳米带等; | ||
* 左右电极可以是不同种材料,VNL提供功能强大的异质界面建模工具,方便构建此类模型; | * 左右电极可以是不同种材料,VNL提供功能强大的异质界面建模工具,方便构建此类模型; | ||
- | * 除了源漏电极之外,ATK计算中还可以增加静电门电极,用来模拟晶体管。 | + | * 除了源漏电极之外,QuantumATK计算中还可以增加静电门电极,用来模拟晶体管。 |
==== 屏蔽区域 ==== | ==== 屏蔽区域 ==== | ||
行 64: | 行 72: | ||
===== 设置电极参数的精度 ===== | ===== 设置电极参数的精度 ===== | ||
- | ATK的器件计算通常分为多个步骤。 | + | QuantumATK的器件计算通常分为多个步骤。 |
首先是将电极和中间区域作为周期性的块体材料体系进行自洽电子密度计算。 | 首先是将电极和中间区域作为周期性的块体材料体系进行自洽电子密度计算。 | ||
随后开始的器件计算首先将中间区域的电子密度作为初始猜测,使两个电极和中间区域在接触的边界匹配。 | 随后开始的器件计算首先将中间区域的电子密度作为初始猜测,使两个电极和中间区域在接触的边界匹配。 | ||
行 498: | 行 506: | ||
==== 透射谱计算的对k点的收敛性测试 ==== | ==== 透射谱计算的对k点的收敛性测试 ==== | ||
+ | |||
+ | 如前所述,通常情况下要得到收敛很好的透射谱需要比SCF自洽更多的k点。例如,下图显示了三个能量下的总透射(所有k点平均)对横向(A、B方向)的k点数的关系图。得到下图的脚本也附在后面('' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | <file python transmission_kpts.py> | ||
+ | # Restart from the previous calculation. | ||
+ | device_configuration = nlread(' | ||
+ | |||
+ | # Array with k-values. | ||
+ | numbers_of_kpoints = range(3, | ||
+ | |||
+ | # Energies at which to calculate the transmission function. | ||
+ | energies = [-3,0,3] | ||
+ | |||
+ | # Array with transmission values. | ||
+ | T = numpy.zeros([len(energies), | ||
+ | |||
+ | # Loop over numbers of k-points. | ||
+ | for i, num_k in enumerate(numbers_of_kpoints): | ||
+ | # ------------------------------------------------------------- | ||
+ | # Transmission spectrum | ||
+ | # ------------------------------------------------------------- | ||
+ | transmission_spectrum = TransmissionSpectrum( | ||
+ | configuration=device_configuration, | ||
+ | energies=numpy.array(energies)*eV, | ||
+ | kpoints=MonkhorstPackGrid(num_k, | ||
+ | energy_zero_parameter=AverageFermiLevel, | ||
+ | infinitesimal=1e-06*eV, | ||
+ | self_energy_calculator=KrylovSelfEnergy(), | ||
+ | ) | ||
+ | |||
+ | # Put the k-point averaged transmission into the array. | ||
+ | T[:,i] = transmission_spectrum.evaluate() | ||
+ | |||
+ | # Convert to numpy array. | ||
+ | numbers_of_kpoints | ||
+ | |||
+ | # Plot the results. | ||
+ | import pylab | ||
+ | |||
+ | pylab.subplot(311) | ||
+ | pylab.plot(numbers_of_kpoints , T[0,:] ,' | ||
+ | pylab.xlabel('# | ||
+ | pylab.ylabel(' | ||
+ | pylab.legend() | ||
+ | |||
+ | pylab.subplot(312) | ||
+ | pylab.plot(numbers_of_kpoints , T[1,:] ,' | ||
+ | pylab.xlabel('# | ||
+ | pylab.ylabel(' | ||
+ | pylab.legend() | ||
+ | |||
+ | pylab.subplot(313) | ||
+ | pylab.plot(numbers_of_kpoints , T[2,:] ,' | ||
+ | pylab.xlabel('# | ||
+ | pylab.ylabel(' | ||
+ | pylab.legend() | ||
+ | |||
+ | # Show the plot. | ||
+ | pylab.show() | ||
+ | </ | ||
+ | |||
+ | 图中可以看出,不同能量处的透射收敛情况非常不同。费米能量处大约 5~7 个k点即收敛,但在 -3eV 和 3eV 处,看上去要取13个k点才获得收敛的结果。 | ||
+ | |||
+ | 回顾透射谱的形状,可以注意到在透射谱的 -3 eV 处有许多尖峰。通常存在尖峰的透射谱需要更多的k点才能得到收敛的结果。然而,有时候可能由于尝试计算时k点过于粗糙导致某些透射谱上某些孤立尖峰被忽略,为了避免这种情况,就需要仔细研究k分辨透射图,以大致确定到底需要多少的k点取样。 | ||
+ | |||
+ | 此外,区域里存在大量(尖锐的)透射峰时,也需要增加能量取样点数,以改善为了计算电流时对能量空间进行积分的准确性。 | ||
==== 进一步分析 ==== | ==== 进一步分析 ==== | ||
+ | |||
+ | 这一节介绍几种进一步分析零偏压透射的方法。ATK 的一个重要特性是,不用从一开始就定义所有要进行的分析计算;你可以随时进行各种分析计算得到有用的物理量,而且不必从头进行费时的自洽计算。 | ||
+ | |||
+ | 接下来,我们计算Zn--ZnO--Zn体系的器件态密度(DDOS)和差别静电势(EDP): | ||
+ | * 打开 **Script Generator** 窗口; | ||
+ | * 将输出文件改为'' | ||
+ | * Analysis from File; | ||
+ | * DeviceDensityOfStates; | ||
+ | * ElectrostaticDifferencePotential。 | ||
+ | {{ : | ||
+ | * 打开“Analysis from File”。这个功能决定QuantumATK脚本从何处读取已经自洽的零偏压计算得到的态。你需要指定保存了DeviceConfiguration的文件名,以在此基础上继续计算。 | ||
+ | * 选择'' | ||
+ | {{ : | ||
+ | |||
+ | <WRAP center tip 80%> | ||
+ | ==== 提示 ==== | ||
+ | 每个数据对象的ID号显示在LabFloor里对应的图标下方。为区别同一个文件里的不同Configuration对象,你可以点击右侧的General information插件查看最重要的计算参数等信息。 | ||
+ | |||
+ | </ | ||
+ | |||
+ | * 接下来,编辑**DeviceDensityOfStates**的设置,与计算透射谱的设置类似: | ||
+ | * 能量从 -4 eV 到 4 eV,共201个点; | ||
+ | * k点7×7; | ||
+ | * Krylov自能计算器 | ||
+ | * 不需要修改 ElectrostaticDifferencePotential。 | ||
+ | |||
+ | 分析脚本就准备好了。保存为'' | ||
+ | |||
+ | <file python analysis.py> | ||
+ | # ------------------------------------------------------------- | ||
+ | # Analysis from File | ||
+ | # ------------------------------------------------------------- | ||
+ | configuration = nlread(u' | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Device Density Of States | ||
+ | # ------------------------------------------------------------- | ||
+ | device_density_of_states = DeviceDensityOfStates( | ||
+ | configuration=configuration, | ||
+ | energies=numpy.linspace(-4, | ||
+ | kpoints=MonkhorstPackGrid(7, | ||
+ | contributions=All, | ||
+ | energy_zero_parameter=AverageFermiLevel, | ||
+ | infinitesimal=1e-06*eV, | ||
+ | self_energy_calculator=KrylovSelfEnergy(), | ||
+ | ) | ||
+ | nlsave(' | ||
+ | nlprint(device_density_of_states) | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Electrostatic Difference Potential | ||
+ | # ------------------------------------------------------------- | ||
+ | electrostatic_difference_potential = ElectrostaticDifferencePotential(configuration) | ||
+ | nlsave(' | ||
+ | </ | ||
+ | |||
+ | 计算结束后,会LabFloor里会出现两个新的结果: | ||
+ | |||
+ | * DeviceDensityOfStates | ||
+ | {{ : | ||
+ | * ElectrostaticDifferencePotential | ||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
==== 器件态密度 ==== | ==== 器件态密度 ==== | ||
+ | |||
+ | 选中DeviceDensityOfStates对象,点击右侧的 **2D Plot** 工具可以作图可视化。 | ||
+ | |||
+ | 打开的 2D Plot 窗口左侧显示了DDOS图,右侧则用以选择投影DOS的原子序号和轨道。 | ||
+ | |||
+ | * 选择'' | ||
+ | * 放大DDOS如下图,显示ZnO中间部分的投影器件态密度。 | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 注意到,DDOS的形状与透射谱形状十分类似:两者在费米能级附近都有相当宽的区域接近零,表明了ZnO的半导体特性;能量低于 -2 eV 处有很多尖峰;还有,两者在 +3 eV处都有一个宽峰。透射谱与DDOS的对应关系在器件计算中是十分常见的特性。 | ||
==== 差别静电势 ==== | ==== 差别静电势 ==== | ||
+ | |||
+ | 差别静电势(ElectrostaticDifferencePotential)数据对象包含了一组三维网格数据,代表了自洽得到的价电子密度的静电势(自洽价电子密度代入泊松方程解得的电势)与原子价电子密度直接重叠得到的静电势的差别。后面会用到这个物理量来计算电压降。 | ||
+ | |||
+ | 使用 **Viewer** 工具可以可视化这种三维网格数据,效果与上面显示透射本征态十分类似。此外,还有一种分析三维网格数据的方法是使用一维投影工具 **1D Projector**。这个工具可以将电势或电子密度在某一个方向作图,而在另外两个垂直方向上进行积分或平均。对于器件体系,最有意义的是沿输运方向(C方向)进行电势分析,而对A和B方向进行平均。 | ||
+ | |||
+ | * 选中 LabFloor 中的 ElectrostaticDifferencePotential 数据对象,打开右侧的1D Projector插件。 | ||
+ | * 将Projection Type改为 // | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 你现在可以看到如上图的一条曲线,代表了差别静电势$\Delta V_H$ 随 C 方向坐标(0~1)的变化关系。 | ||
+ | |||
+ | 图中可以看到由于Zn--ZnO界面上显著的电荷转移导致了自洽的静电势相对于原子价电子电势发生了显著的变化。在金属Zn区域,振荡相当小,表明这个区域的的自洽电子密度分布与孤立原子价电子密度分布十分接近。 | ||
+ | |||
===== 有限偏压计算 ===== | ===== 有限偏压计算 ===== | ||
+ | |||
+ | 以上所有计算都仅限于零偏压的情况(左右电极上电压都为零)。接下来这一节介绍如何使用零偏压的结果作为起点进行非零偏压下的计算,此时左右电极电压将不再相同。这将导致左右电极费米能级的相对移动,这也是电子器件的运作的基本模式。 | ||
+ | |||
+ | 从零偏压结果出发逐步增加电压进行非零偏压计算是快速、准确的获得收敛结果的最佳技术方案。这里对器件进行0.5V偏压的计算。 | ||
+ | |||
==== 计算设置 ==== | ==== 计算设置 ==== | ||
+ | 在VNL 项目文件列表里,勾选'' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 添加三个计算步骤:Initial State,Analysis -> ElectrostaticDifferencePotential,以及 Analysis -> TransmissionSpectrum. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 将输出文件改为'' | ||
+ | * 将左电极电压设为 -0.5V。 | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 接下来,打开“Initial State”告诉QuantumATK使用零偏压的计算得到的态作为有限偏压的初始猜测: | ||
+ | |||
+ | * 选中 **Use old calculation**,选择'' | ||
+ | |||
+ | 最后,设置透射谱计算,与零偏压完全相同: | ||
+ | |||
+ | * 能量范围 -4eV 到 4eV,共201个点; | ||
+ | * 7×7 横向k点; | ||
+ | * Krylov自能计算器。 | ||
+ | |||
+ | 将脚本保存为'' | ||
+ | <file python finite-bias.py> | ||
+ | # ------------------------------------------------------------- | ||
+ | # Two-probe Configuration | ||
+ | # ------------------------------------------------------------- | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Left Electrode | ||
+ | # ------------------------------------------------------------- | ||
+ | |||
+ | # Set up lattice | ||
+ | vector_a = [1.3325, -2.30795770109, | ||
+ | vector_b = [1.3325, 2.30795770109, | ||
+ | vector_c = [0.0, 0.0, 4.947]*Angstrom | ||
+ | left_electrode_lattice = UnitCell(vector_a, | ||
+ | |||
+ | # Define elements | ||
+ | left_electrode_elements = [Zinc, Zinc] | ||
+ | |||
+ | # Define coordinates | ||
+ | left_electrode_coordinates = [[ 1.3325 | ||
+ | [ 1.3325 | ||
+ | |||
+ | # Set up configuration | ||
+ | left_electrode = BulkConfiguration( | ||
+ | bravais_lattice=left_electrode_lattice, | ||
+ | elements=left_electrode_elements, | ||
+ | cartesian_coordinates=left_electrode_coordinates | ||
+ | ) | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Right Electrode | ||
+ | # ------------------------------------------------------------- | ||
+ | |||
+ | # Set up lattice | ||
+ | vector_a = [1.3325, -2.30795770109, | ||
+ | vector_b = [1.3325, 2.30795770109, | ||
+ | vector_c = [0.0, 0.0, 4.947]*Angstrom | ||
+ | right_electrode_lattice = UnitCell(vector_a, | ||
+ | |||
+ | # Define elements | ||
+ | right_electrode_elements = [Zinc, Zinc] | ||
+ | |||
+ | # Define coordinates | ||
+ | right_electrode_coordinates = [[ 1.0280478 , 0.59354366, | ||
+ | [ 1.0280478 , -0.94509484, | ||
+ | |||
+ | # Set up configuration | ||
+ | right_electrode = BulkConfiguration( | ||
+ | bravais_lattice=right_electrode_lattice, | ||
+ | elements=right_electrode_elements, | ||
+ | cartesian_coordinates=right_electrode_coordinates | ||
+ | ) | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Central Region | ||
+ | # ------------------------------------------------------------- | ||
+ | |||
+ | # Set up lattice | ||
+ | vector_a = [1.3325, -2.30795770109, | ||
+ | vector_b = [1.3325, 2.30795770109, | ||
+ | vector_c = [0.0, 0.0, 40.5741587317]*Angstrom | ||
+ | central_region_lattice = UnitCell(vector_a, | ||
+ | |||
+ | # Define elements | ||
+ | central_region_elements = [Zinc, Zinc, Zinc, Zinc, Zinc, Zinc, Oxygen, Zinc, Oxygen, Zinc, | ||
+ | | ||
+ | Zinc] | ||
+ | |||
+ | # Define coordinates | ||
+ | central_region_coordinates = [[ 1.3325 | ||
+ | [ 1.3325 | ||
+ | [ 1.3325 | ||
+ | [ 1.3325 | ||
+ | [ 1.3325 | ||
+ | [ 1.3325 | ||
+ | [ 1.3325 | ||
+ | [ 2.3605478 , | ||
+ | [ 2.3605478 , | ||
+ | [ 1.0280478 , | ||
+ | [ 1.0280478 , | ||
+ | [ 1.3325 | ||
+ | [ 1.3325 | ||
+ | [ 2.3605478 , | ||
+ | [ 2.3605478 , | ||
+ | [ 1.0280478 , | ||
+ | [ 1.0280478 , -0.94509484, | ||
+ | [ 1.0280478 , | ||
+ | [ 1.0280478 , -0.94509484, | ||
+ | [ 1.0280478 , | ||
+ | [ 1.0280478 , -0.94509484, | ||
+ | |||
+ | # Set up configuration | ||
+ | central_region = BulkConfiguration( | ||
+ | bravais_lattice=central_region_lattice, | ||
+ | elements=central_region_elements, | ||
+ | cartesian_coordinates=central_region_coordinates | ||
+ | ) | ||
+ | |||
+ | device_configuration = DeviceConfiguration( | ||
+ | central_region, | ||
+ | [left_electrode, | ||
+ | ) | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Calculator | ||
+ | # ------------------------------------------------------------- | ||
+ | # | ||
+ | # Basis Set | ||
+ | # | ||
+ | basis_set = DFTBDirectory(" | ||
+ | |||
+ | # | ||
+ | # Pair Potentials | ||
+ | # | ||
+ | pair_potentials = DFTBDirectory(" | ||
+ | |||
+ | # | ||
+ | # Numerical Accuracy Settings | ||
+ | # | ||
+ | left_electrode_k_point_sampling = MonkhorstPackGrid( | ||
+ | na=5, | ||
+ | nb=5, | ||
+ | nc=100, | ||
+ | ) | ||
+ | left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters( | ||
+ | k_point_sampling=left_electrode_k_point_sampling, | ||
+ | ) | ||
+ | |||
+ | right_electrode_k_point_sampling = MonkhorstPackGrid( | ||
+ | na=5, | ||
+ | nb=5, | ||
+ | nc=100, | ||
+ | ) | ||
+ | right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters( | ||
+ | k_point_sampling=right_electrode_k_point_sampling, | ||
+ | ) | ||
+ | |||
+ | device_k_point_sampling = MonkhorstPackGrid( | ||
+ | na=5, | ||
+ | nb=5, | ||
+ | nc=100, | ||
+ | ) | ||
+ | device_numerical_accuracy_parameters = NumericalAccuracyParameters( | ||
+ | k_point_sampling=device_k_point_sampling, | ||
+ | ) | ||
+ | |||
+ | # | ||
+ | # Iteration Control Settings | ||
+ | # | ||
+ | left_electrode_iteration_control_parameters = IterationControlParameters( | ||
+ | tolerance=4e-05, | ||
+ | ) | ||
+ | |||
+ | right_electrode_iteration_control_parameters = IterationControlParameters( | ||
+ | tolerance=4e-05, | ||
+ | ) | ||
+ | |||
+ | device_iteration_control_parameters = IterationControlParameters( | ||
+ | tolerance=4e-05, | ||
+ | ) | ||
+ | |||
+ | # | ||
+ | # Poisson Solver Settings | ||
+ | # | ||
+ | left_electrode_poisson_solver = FastFourier2DSolver( | ||
+ | boundary_conditions=[[PeriodicBoundaryCondition, | ||
+ | | ||
+ | | ||
+ | ) | ||
+ | |||
+ | right_electrode_poisson_solver = FastFourier2DSolver( | ||
+ | boundary_conditions=[[PeriodicBoundaryCondition, | ||
+ | | ||
+ | | ||
+ | ) | ||
+ | |||
+ | # | ||
+ | # Electrode Calculators | ||
+ | # | ||
+ | left_electrode_calculator = SlaterKosterCalculator( | ||
+ | basis_set=basis_set, | ||
+ | pair_potentials=pair_potentials, | ||
+ | numerical_accuracy_parameters=left_electrode_numerical_accuracy_parameters, | ||
+ | iteration_control_parameters=left_electrode_iteration_control_parameters, | ||
+ | poisson_solver=left_electrode_poisson_solver, | ||
+ | ) | ||
+ | |||
+ | right_electrode_calculator = SlaterKosterCalculator( | ||
+ | basis_set=basis_set, | ||
+ | pair_potentials=pair_potentials, | ||
+ | numerical_accuracy_parameters=right_electrode_numerical_accuracy_parameters, | ||
+ | iteration_control_parameters=right_electrode_iteration_control_parameters, | ||
+ | poisson_solver=right_electrode_poisson_solver, | ||
+ | ) | ||
+ | |||
+ | # | ||
+ | # Device Calculator | ||
+ | # | ||
+ | calculator = DeviceSlaterKosterCalculator( | ||
+ | basis_set=basis_set, | ||
+ | pair_potentials=pair_potentials, | ||
+ | numerical_accuracy_parameters=device_numerical_accuracy_parameters, | ||
+ | iteration_control_parameters=device_iteration_control_parameters, | ||
+ | electrode_calculators= | ||
+ | [left_electrode_calculator, | ||
+ | electrode_voltages=( -0.5*Volt, 0.0*Volt) | ||
+ | ) | ||
+ | |||
+ | device_configuration.setCalculator(calculator) | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Initial State | ||
+ | # ------------------------------------------------------------- | ||
+ | old_calculation = nlread(' | ||
+ | device_configuration.setCalculator( | ||
+ | calculator, | ||
+ | initial_state=old_calculation, | ||
+ | ) | ||
+ | device_configuration.update() | ||
+ | nlsave(' | ||
+ | nlprint(device_configuration) | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Electrostatic Difference Potential | ||
+ | # ------------------------------------------------------------- | ||
+ | electrostatic_difference_potential = ElectrostaticDifferencePotential(device_configuration) | ||
+ | nlsave(' | ||
+ | |||
+ | # ------------------------------------------------------------- | ||
+ | # Transmission Spectrum | ||
+ | # ------------------------------------------------------------- | ||
+ | transmission_spectrum = TransmissionSpectrum( | ||
+ | configuration=device_configuration, | ||
+ | energies=numpy.linspace(-4, | ||
+ | kpoints=MonkhorstPackGrid(7, | ||
+ | energy_zero_parameter=AverageFermiLevel, | ||
+ | infinitesimal=1e-06*eV, | ||
+ | self_energy_calculator=KrylovSelfEnergy(), | ||
+ | ) | ||
+ | nlsave(' | ||
+ | nlprint(transmission_spectrum) | ||
+ | </ | ||
+ | |||
+ | <WRAP center info 80%> | ||
+ | ==== 关于电极电压和电流 ==== | ||
+ | 对于不含门电极的体系,只有左右电极的电压差会影响计算结果。也就是说,电压设为 -0.25/0.25V 和 -0.5/ | ||
+ | |||
+ | 偏压的定义是左右电压的差别(右电压减去左电压)。 正电流对应于电荷从左移动到右,也就是电子从右移动到侧(电子电荷为负)。因此,当左电极电压高于右电极时,电流为正;而对于上面的计算的偏压设置,将得到负电流。 | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center important 80%> | ||
+ | ==== NEGF 环路积分 ==== | ||
+ | 对于非零偏压计算,一个影响收敛的重要的参数设置是“// | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 另外两个重要的参数是 //Integral lower bound// 和 //Circle points// | ||
+ | {{ : | ||
+ | </ | ||
==== 结果分析 ==== | ==== 结果分析 ==== | ||
+ | 回到VNL主窗口,打开'' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 非零偏压得到透射谱与零偏压基本一致。回顾之前关于DDOS的分析也可以发现,透射函数的形状基本上是由ZnO得态密度决定,与电极的电子态几乎没有什么关系。由于偏压窗口中的透射非常小,体系电流也就很小,ZnO的DDOS变化也很小。更一般的情况并非如此,尤其是如果偏压大到能够跨越散射区域的带隙的话。 | ||
==== 电压降 ==== | ==== 电压降 ==== | ||
+ | |||
+ | 接下来的任务是分析器件输运方向上的电势分布,或者叫电压降(由于外加偏压导致的电势重新分布)。这可以由非零偏压和零偏压下的差别静电势作差得到: | ||
+ | $$ | ||
+ | \Delta V_H(\vec{r})=\delta V_H^{\mathtt{finite-bias}}-\delta V_H^{\mathtt{zero-bias}} | ||
+ | $$ | ||
+ | |||
+ | <WRAP center info 80%> | ||
+ | 差别静电势是自洽得到的价电子密度对应的电势与孤立原子价电子密度叠加对应的电势的差别。由于原子价电子密度在零偏压和非零偏压下一样,因此上述得到的$\Delta V_H(\vec{r})$就是由于外加电压导致的电势重新分布,即电压降。 | ||
+ | </ | ||
+ | |||
+ | VNL中的 网格数据运算(Gird Operation)工具在这里非常方便。这个工具可以将两套网格数据相加或作差,甚至乘法或除法。下面用这个工具计算$\Delta V_H(\vec{r})$,并保存文件,之后用Viewer工具可视化。 | ||
+ | |||
+ | * LabFloor里默认按文件名分组。为方便起见,可以改为**Group by** //Item Type//。 | ||
+ | * 之后选择两个ElectrostaticDifferencePotential数据对象,打开Grid Operation工具。 | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 在这个工具窗口中,每套数据都给定了一个别名,根据选择数据时的先后顺序,有限偏压和零偏压的数据分别被命名为A1和B1,或者相反。为计算电压降(有限偏压的数据减去零偏压数据),在上面输入B1- A1 (或者相反),回车。 | ||
+ | |||
+ | 你马上就可以在3D 显示窗口里画出这个电压降数据的切面图或轮廓图,或者将结果保存到一个新的NetCDF文件,点击// | ||
+ | |||
+ | 将网格数据差别保存为'' | ||
+ | |||
+ | <WRAP center info 80%> | ||
+ | $f(r)$ GridValue 是表示3D网格数据的通用符号。 | ||
+ | </ | ||
+ | |||
+ | 选择DeviceConfiguration,用**Viewer**打开这个器件结构。然后将GridValue对象拖动到Viewer上,即可在器件结构上显示电压降。选择 //Cut Plane// | ||
+ | |||
+ | 显示结果如下图所示。电压降明显的出现在中间区域的ZnO附近,表明电子散射发生的主要区域。 | ||
+ | |||
+ | 为了定量分析,打开 **1D Projector**,选择投影类型为// | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 也应注意到接近电极部分的电势是平坦的,说明中间区域内两端的Zn层提供了足够的屏蔽。 | ||
+ | |||
===== IV曲线 ===== | ===== IV曲线 ===== | ||
+ | 本教程的最后一部分器件非零偏压分析是IV曲线计算。这可以通过使用**IVCurve**分析计算工具得到,并用IV-Plot可视化工具分析。 | ||
+ | |||
==== 计算设置 ==== | ==== 计算设置 ==== | ||
- | ==== 可视化 ==== | + | 打开一个新的**Script Generator**窗口,按下面操作: |
- | ===== 总结 ===== | + | |
+ | * 添加“Analysis from File”; | ||
+ | * 添加Analysis-> | ||
+ | * 将输出文件名改为'' | ||
+ | {{ : | ||
+ | 编辑 Analysis from File: | ||
+ | * 将NetCDF文件设置为'' | ||
+ | 编辑IVCurve: | ||
+ | * 设置偏压结束点V< | ||
+ | * 设置偏压点数为5; | ||
+ | * 设置横向k点:5×5; | ||
+ | * 选择Krylov自能计算器。 | ||
+ | {{ : | ||
+ | 计算设置到此完成。保存脚本为'' | ||
+ | 完整的计算脚本如下。计算结果可以直接下载:[[http:// | ||
+ | <file python iv-curve.py> | ||
+ | # ------------------------------------------------------------- | ||
+ | # Analysis from File | ||
+ | # ------------------------------------------------------------- | ||
+ | configuration = nlread(u' | ||
+ | # ------------------------------------------------------------- | ||
+ | # IV Curve | ||
+ | # ------------------------------------------------------------- | ||
+ | biases = [0.000000, 0.250000, 0.500000, 0.750000, 1.000000]*Volt | ||
+ | iv_curve = IVCurve( | ||
+ | configuration=configuration, | ||
+ | biases=biases, | ||
+ | energies=numpy.linspace(-2, | ||
+ | kpoints=MonkhorstPackGrid(5, | ||
+ | self_energy_calculator=KrylovSelfEnergy(), | ||
+ | energy_zero_parameter=AverageFermiLevel, | ||
+ | infinitesimal=1e-06*eV, | ||
+ | selfconsistent_configurations_filename_prefix=" | ||
+ | log_filename_prefix=" | ||
+ | ) | ||
+ | nlsave(' | ||
+ | nlprint(iv_curve) | ||
+ | </ | ||
+ | ==== 可视化 ==== | ||
+ | 计算完成后,IV曲线数据对象出现在'' | ||
+ | {{ : | ||
+ | <WRAP center info 80%> | ||
+ | IVCurve数据对象包含了计算得到IV曲线以及每个偏压下的透射谱。 | ||
+ | </ | ||
+ | 选择IVCurve,点击右侧的 IV-Plot 分析工具,IV曲线分析窗口出现。点击// | ||
+ | {{ : | ||
+ | |||
+ | 每个透射谱和谱电流对应了一个偏压点。偏压窗口对应的能量积分区间在曲线上用蓝色显示。将鼠标沿着IV曲线或dI/ | ||
+ | |||
+ | <WRAP center important 80%> | ||
+ | 需特别注意谱电流:为得到准确度的电流,所有可能对总电流有贡献的部分(偏压窗口)都必须包含在能量范围以内。如果不是,应该用更大的能量范围重新进行计算。 | ||
+ | </ | ||
+ | |||
+ | 使用更精细的偏压点可以得到更精确的微分电导(dI/ | ||
+ | |||
+ | 更精细的IV曲线如下图所示。与上面的粗略采样相比,可以发现IV曲线大致形状一致,但dI/ | ||
+ | |||
+ | {{ : | ||
+ | ===== 总结 ===== | ||
+ | 上面介绍了如何用QuantumATK进行电子输运的计算。这篇教程要达到的主要目的有: | ||
+ | * 了解了器件基本的几何结构,可以继续学习如何构建其他的器件结构:[[atk: | ||
+ | * 了解最重要的收敛性参数,例如横向k点,密度网格截断,NEGF环路积分参数设置等; | ||
+ | * 学会进行零偏压和非零偏压的透射谱计算,并使用Transmission Analyzer分析计算结果; | ||
+ | * 掌握如何进行分析计算,如IV曲线、投影器件态密度、差别静电势、透射本征值与本征态; | ||
+ | * 学会如何用3D Viewer可视化三维数据对象,并作一维投影。 | ||
+ | ===== 参考 ===== | ||
+ | * 英文教程原文:[[http:// |