用户工具

站点工具


atk:器件体系negf计算收敛指南

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
atk:器件体系negf计算收敛指南 [2020/06/01 21:47] – [2.增加电极的长度] xie.congweiatk:器件体系negf计算收敛指南 [2020/06/01 22:06] (当前版本) – [参考] xie.congwei
行 97: 行 97:
 更彻底的测试是使用 NanoLab 中的 **Electrode Validator** 工具。使用它之前首先要对电极进行自洽计算,然后在 //LabFloor// 上选择结果生成的 //BulkConfiguration//,然后点击右侧插件栏中的 Electrode Validator 工具。然后,NanoLab 将通知您电极是否有效,即是否足够长以满足上述标准。 更彻底的测试是使用 NanoLab 中的 **Electrode Validator** 工具。使用它之前首先要对电极进行自洽计算,然后在 //LabFloor// 上选择结果生成的 //BulkConfiguration//,然后点击右侧插件栏中的 Electrode Validator 工具。然后,NanoLab 将通知您电极是否有效,即是否足够长以满足上述标准。
 ==== 3.检查边界条件的正确性 ==== ==== 3.检查边界条件的正确性 ====
 +
 +列表中的下一项是确保计算使用具有正确边界条件的泊松求解器。如果要以这种方式对器件建模,则边界条件在 A 和 B 方向应具有周期性,如果在该方向上有栅,则边界条件应为 Neumann。最后,在 C 方向上应为 Dirichlet 边界条件。
 ==== 4.增加 k 点数量 ==== ==== 4.增加 k 点数量 ====
 +
 +接下来要检查的是在运输方向上的 k 点取样。为了匹配电极和中心区域之间的费米能级,电极 k 点网格沿 C 方向(传输方向)排布密集是很重要的。沿 C 方向的默认密度为 150(相比之下,否则为 2 至 7),有时甚至还有必要增大。注意,在大多数情况下,电极计算在总 NEGF 计算时间中是一个微不足道的部分,因此通常不必担心这部分的操作。
 +
 +另外一个重要的点是检查两个横向上 k 点的数量合理性地收敛。如果它们在一个方向上太低会导致非物理性的结果,也会妨碍收敛。下图我们展示了一个计算的费米能级与横向 k 点数量的关系。在这种情况下,我们可以预料到 1、2 和 3 个 k 点会给出非常差的结果,并且可能会出现收敛问题,而从 5 个点开始,结果会合理性地收敛。
 +
 +{{ :undefined:kpoint-20200601.png?650 |}}
 +
 +图192 费米能级与 k 点数量的关系图。在这里,我们显示的是沿非运输的 A 向和 B 向。
 ==== 5.对初始密度采用 EquivalentBulk 法 ==== ==== 5.对初始密度采用 EquivalentBulk 法 ====
 +
 +
 +下一个选项是尝试将初始密度的计算更改为 ''EquivalentBulk'',替代默认的 ''NeutralAtom''。默认行为是创建一个将中性原子密度直接加和作为初始密度的猜测。''EquivalentBulk'' 则是进行自洽计算,把中心区域视为块体构型,将所得密度作为 NEGF 计算的初始猜测。请注意这个计算可能要求很高,可能并不如 NEGF 计算本身那样可以有效地在许多计算核心上并行。
 +
 +''NeutralAtom'' 法在大多数情况下都适用,但对于某些系统就很有必要使用 ''EquivalentBulk'' 以从更好的初始猜测开始进行器件计算。但如果您的电极不相同和/或采用 Hückel 模型,则使用 ''EquivalentBulk'' 很可能不占优势。
 ==== 6.增大电子温度 ==== ==== 6.增大电子温度 ====
 +
 +特别是在金属或小间隙半导体中,如果没有充分地描述接近费米能级的状态,则会阻碍收敛。如果是这种情况,这些状态将在被占用和未被占用之间切换,从而导致收敛出现问题。这可以通过升高电子占有函数的温度(宽度)和/或尝试使用非默认占有函数之一来缓解。请注意,主页关于 [[https://docs.quantumatk.com/manual/technicalnotes/occupation_methods/occupation_methods.html#occupation-methods|Occupation Methods]] 的介绍中提到较高的温度可能会导致结果略有误差。
 ==== 7.提高围道积分的精度 ==== ==== 7.提高围道积分的精度 ====
 +
 +在 NanoLab 中设置计算器时,轮廓积分的下限会自动设置得很低,以使其包含构型中元素的所有价态。这个事实非常重要,接下来要做的是检查是否确实如此。如果您对此有疑问,可以对您的材料进行 DOS 计算,以确定最深的价态及其能量,并验证轮廓积分的下限在能量上低于这些状态。
 +
 +有时,可以通过增加默认 ''SemiCircleContour'' 中半圆部分点的数量或切换到 ''OzakiContour'' 来提升收敛性,在 OzakiContour 中可以更容易地增加极点数(等效于轮廓点),因为只有一个参数可以调整。注意,每个轮廓点/极点都必须像 k 点一样单独计算,因此计算成本随轮廓点/极点数变化近似为线性。有关更多信息,请参见 NEGF 的手册页 NEGF: Device Calculators 和两种轮廓积分类型:''SemiCircleContour'' 和 ''OzakiContour''
 +
 +
 +{{ :atk:contourintegral-20200601.png?600 |}}
 +
 +图193 使用半圆轮廓时的轮廓积分的草图。有关更多详细信息,请参见手册页。
 ==== 8.尝试一个新的泊松求解器 ==== ==== 8.尝试一个新的泊松求解器 ====
 +
 +更改 Poisson 求解器也可以帮助收敛,例如从 ''MultigridSolver'' 到 ''ParallelConjugateGradientSolver'',因为它们使用了不同的数值方法。这意味着计算得出的静电中的数值噪声将有所不同,这反过来又会影响具有更复杂静电系统(例如栅)的收敛。还要注意,对于并行运行的大型计算,''ParallelConjugateGradientSolver'' 通常会更快一些。
 ==== 9.增大网格密度截断能量 ==== ==== 9.增大网格密度截断能量 ====
 +
 +零偏压计算的最后一项检查是密度网格截断。与横向的 k 点一样,它应该足够高以提供正确的物理结果。确保就感兴趣的量进行适当收敛也将有助于收敛。下图我们展示了费米能级随网格截段的变化而变化,可以看出非常低的网格截断在确定费米能级时会带来不准确性。然而还要注意,此图和上文与 k 点有关的那个图在比例上的差异。
 +
 +{{ :atk:meshpoint-20200601.png?600 |}}
 +
 +图194 计算的费米能级与网格截断的关系。
 ===== 有限偏压 NEGF 计算 ===== ===== 有限偏压 NEGF 计算 =====
 +
 +通常情况下,有限偏压的计算要比零偏压更难收敛,以上所有要点也适用于这种情况。但还有另一件事可以尝试,将在下一章节中进行说明,并且如果零偏压计算能够很好地收敛时,则应该首先尝试一下。
 ==== 1.总是从收敛的计算重启 ==== ==== 1.总是从收敛的计算重启 ====
 +
 +有限偏压计算应始终从较小偏压或零偏压的收敛计算中重新开始。如果不收敛,它通常将有助于减小偏压差异。例如您想要从零偏压开始进行 0.4 V 的计算,最好的方法是逐步计算,比如以 0.1 V 为步长。以下示例脚本可以完全做到这一点:[[https://docs.quantumatk.com/_downloads/iv.py|↓ iv.py]]。
 +
 +<code python>  
 +# Set bias
 +# Positive: Forward
 +# Negative: Reverse
 +
 +bias_list = [0.10, 0.20, 0.30, 0.40]*Volt
 +
 +# Read DeviceConfiguration
 +zero_bias_file = 'device_zero_bias.hdf5'
 +device_configuration = nlread(zero_bias_file, DeviceConfiguration)[-1]
 +
 +for bias in bias_list:
 +    if processIsMaster():
 +        print("Bias is now: ", bias )
 +    # Get the calculator
 +    calculator = device_configuration.calculator()
 +
 +    # Set the bias voltage
 +    calculator=calculator(electrode_voltages=(bias/2, -bias/2))
 +
 +    # Attach the calculator and use the old initial state
 +    device_configuration.setCalculator(
 +      calculator(),
 +      initial_state=device_configuration)
 +    device_configuration.update()
 +    nlsave('device_bias_%.2f.hdf5' % bias.inUnitsOf(Volt), device_configuration)
 +</code>
 +
 +这种方法对于较高偏压会变得更重要,因为可能需要更短的增量才能实现收敛。因此在上述情况下,也许 0.1 V 和 0.2 V 时收敛,但 0.3 V 时不会。建议尝试 0.25 V,从 0.2 V 开始以 0.05 V 递进。当然,这种方法是否可行取决于所研究的系统以及您希望实现的最终目标。
 +
 ===== SCF 迭代控制参数 ===== ===== SCF 迭代控制参数 =====
 +
 +如果您已经验证了 NEGF 计算中使用的**物理模型**是合理且适当的(请参阅上文),但计算仍然无法收敛,那么最后一个选择就是调整控制 SCF 循环的参数。
 +
 +SCF 参数在 **ATK Python** 的 ''IterationControlParameters'' 类中定义——导航至 **New Calculator** 程序后在 //Iteration control parameters// 条目调整设置。
 +
 +{{ :atk:iteration_control_parameters-20200601.png?750 |}}
 ==== 1.最大步数 ==== ==== 1.最大步数 ====
 +
 +即使是稳健且表现良好的 NEGF 计算,有时朝着基态收敛的速度也会比预期的慢,因此可能需要额外的 SCF 步骤才能正确收敛。
 +
 +在这种情况下,只需增加参数 **Maximum steps**。
 +
 +然而,首先要从失败的计算中查阅 QuantumATK 的日志文件,确认 SCF 循环实际上是否运行良好,即是否收敛到了<color #00a2e8>合理的基态</color>。如果没有,那么额外的 SCF 步骤就不可能解决问题——可以考虑调整 <color #00a2e8>Pulay 混合</color>
 +
 +
 +
 +
 +
 === 什么是合理的基态? === === 什么是合理的基态? ===
 +
 +首先,**能带能量**和**哈密顿矩阵元素**都应稳定地收敛于恒定值。检查 ATK 日志文件:在每次 SCF 迭代之后查找报告能带能量 ''E'' 和与上一次 SCF 迭代的能量差(''dE'')和汉密尔顿矩阵元素(''dH'') 的所在行。在终端,可以很方便地使用 grep 命令实现:
 +
 +<code python>  
 +user@machine $ grep dE atk.log
 +|   0 E = -70.6148 dE =  5.719151e-01 dH =  7.266251e-01                       |
 +|   1 E = -56.8671 dE =  1.374766e+01 dH =  5.675282e-01                       |
 +|   2 E = -58.5695 dE =  1.702319e+00 dH =  1.737177e-01                       |
 +|   3 E = -59.6745 dE =  1.105067e+00 dH =  9.875918e-02                       |
 +|   4 E = -59.3529 dE =  3.216787e-01 dH =  4.048304e-02                       |
 +|   5 E = -59.0695 dE =  2.833359e-01 dH =  2.447425e-02                       |
 +|   6 E = -59.2082 dE =  1.386839e-01 dH =  2.978777e-03                       |
 +|   7 E = -59.0397 dE =  1.684759e-01 dH =  1.492602e-02                       |
 +|   8 E =  -59.078 dE =  3.826926e-02 dH =  1.691435e-03                       |
 +|   9 E =   -59.05 dE =  2.800614e-02 dH =  2.041091e-03                       |
 +|  10 E = -59.0559 dE =  5.931576e-03 dH =  1.624175e-03                       |
 +|  11 E = -59.0553 dE =  6.427625e-04 dH =  2.825693e-04                       |
 +|  12 E = -59.0543 dE =  1.008929e-03 dH =  1.880459e-04                       |
 +|  13 E = -59.0542 dE =  1.964723e-05 dH =  6.034241e-05                       |
 +</code>
 +
 +  * 能量和哈密顿量的差 ''dE'' 和 ''dH'' 应当朝着指定的公差(默认为10<sup>-4</sup>)持续稳定地减小。
 +  * 能量可能会在 SCF 循环的开始时振荡,但最终应会收敛到恒定值。
 +
 +其次 **Mulliken populations**(马利肯布居数)应在物理上合理。检查 ATK 日志文件中最近几次 SCF 迭代的 //Density Matrix Report// 。针对每个原子,报告了 ''DM'' 和 ''DD'' 的值。前者是器件密度矩阵(马利肯布居数)的迹,而后者是 ''DM'' 与原子上的中性原子电荷之间的差(由赝势给出)。
 +
 +  - 在相同局部环境中的原子应具有大致相同的占有率。
 +  - 变化应该是系统的和物理的,例如在氧化物中,我们期望氧原子上有多余的电子,而更多带正电性邻近原子上的电子少。
 +  - 电荷不应在电极附近积累。
 +
 +在下面的示例中,我们看到如何满足这些要求:
 +
 +<code python>  
 ++------------------------------------------------------------------------------+
 +| Density Matrix Report                             DM        DD               |
 ++------------------------------------------------------------------------------+
 +|    Si      1.907 ,    1.100 ,    1.564 ]    3.89764  -0.10236            |
 +|    Ni      0.001 ,   -0.000 ,    2.342 ]   18.21499   0.21499            |
 +|    Si      0.001 ,    2.201 ,    3.120 ]    3.89379  -0.10621            |
 +|    Si      0.001 ,   -0.000 ,    4.675 ]    3.89556  -0.10444            |
 +|    Ni      0.001 ,    2.201 ,    5.453 ]   18.21180   0.21180            |
 +|    Si      1.907 ,    1.100 ,    6.231 ]    3.89446  -0.10554            |
 +|    Si      0.001 ,    2.201 ,    7.787 ]    3.89564  -0.10436            |
 +|    Ni      1.907 ,    1.100 ,    8.565 ]   18.21115   0.21115            |
 +</code>
 +
 +  - 对于所有 Ni 原子和所有 Si 原子,Mulliken 布居数大致相同。
 +  - 我们看到所有的 Si 原子的 ''DD'' 值都为负,而 Ni 原子的相应正值是是它的两倍。
 +  - 靠近电极边界的原子(折射率最低的原子)不会显示出异常大的 Mulliken 布居数。
 ==== 2.Pulay 混合 ==== ==== 2.Pulay 混合 ====
 +
 +SCF 循环使用 ''PulayMixer'' 在每个 SCF 步骤中通过将之前一些步数中的密度混合到当前步骤的猜测中来生成电子密度。**Damping factor** 参数控制在混合中使用前几个密度的百分数,**History steps** 控制要使用前面步骤中密度的数量。
 +
 +通常默认的 Pulay mixing 参数应该可以实现快速、稳定的 SCF 收敛,但有时可以进行一些调整:
 +
 +  * 首先尝试将 **Damping factor** 减小到 0.05 或者甚至 0.01。对于费米能级的金属态尤其有帮助。
 +  * 增加 **History steps** 的数量可能会稍微改善收敛性,但也会增加内存消耗。
 ==== 3.公差 ==== ==== 3.公差 ====
 +
 +SCF 循环将会一直持续至达到精度公差或最大步数为止。该公差是对总能带能量和哈密顿矩阵元素都进行测量的——在两种情况下,一个 SCF 步骤与另一个 SCF 步骤之间的绝对差都必须低于指定的公差,以使计算被认为是准确和收敛的。
 +
 +  * 在极少数情况下,可能需要将 **Tolerance** 增大到默认值以上才能使 NEGF 计算收敛,但是这也会导致产生不准确的基态。//因此,高的公差只能作为不得已的选择!//实际上,更常见的是收紧 SCF 公差(将其降低到例如 10<sup>-6</sup>)以提高收敛基态的精度。
 ===== 联系支持 ===== ===== 联系支持 =====
 +
 +如果任何尝试都失败了,请在在线 QuantumATK 论坛(https://forum.quantumatk.com)上发帖或联系 QuantumATK 支持(quantumatk-support@synopsys.com)。在使用这两种方式联系时,请附上您的 QuantumATK 脚本和日志文件。
 ===== 参考 ===== ===== 参考 =====
  
 +
 +  * 英文原文:https://docs.quantumatk.com/technicalnotes/negf_convergence_guide/negf_convergence_guide.html
atk/器件体系negf计算收敛指南.1591019241.txt.gz · 最后更改: 2020/06/01 21:47 由 xie.congwei

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