用户工具

站点工具


atk:模拟气相沉积薄膜生长过程

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
atk:模拟气相沉积薄膜生长过程 [2016/09/19 16:27] – [设置沉积模拟] nie.hanatk:模拟气相沉积薄膜生长过程 [2018/03/20 22:15] (当前版本) liu.jun
行 8: 行 8:
 在本实例中你将模拟在晶体碳化硅(SiC)基底上生长SiC,与文献[1]中的研究类似。你将使用半经验势,相比从头算方法(譬如DFT方法),它能进行更大系统和更大时间规模的模拟。本例中的模拟主要是物理气相沉积(PVD)方法。当然,如果包含了描述化学反应的合适的力场,或者有充足的计算资源来使用从头算方法,化学气相沉积(CVD)过程原则上也是可以进行模拟的。 在本实例中你将模拟在晶体碳化硅(SiC)基底上生长SiC,与文献[1]中的研究类似。你将使用半经验势,相比从头算方法(譬如DFT方法),它能进行更大系统和更大时间规模的模拟。本例中的模拟主要是物理气相沉积(PVD)方法。当然,如果包含了描述化学反应的合适的力场,或者有充足的计算资源来使用从头算方法,化学气相沉积(CVD)过程原则上也是可以进行模拟的。
  
-对于本实例来说,你需要熟悉在[[atk:分子动力学基础|分子动力学基础]]中描述的分子动力学基本功能。你将学到如何使用Python脚本语言和ATK分子动力学常规中的挂钩功能(hook functionality)来运行高级的模拟。+对于本实例来说,你需要熟悉在[[atk:分子动力学基础|分子动力学基础]]中描述的分子动力学基本功能。你将学到如何使用Python脚本语言和QuantumATK分子动力学常规中的挂钩功能(hook functionality)来运行高级的模拟。
  
-<WRAP center round important 100%>+<WRAP center round info 100%>
 **小提示 !** **小提示 !**
-在文献[1]中使用的修正嵌入原子模型(MEAM)目前在VNL-ATK中不可用。你将使用Tersoff势来代替,它并不会产生如参考文献中那样的层状晶体。模拟技术显然独立于势能的选取,因此对各种材料都适用。+在文献[1]中使用的修正嵌入原子模型(MEAM)目前在QuantumATK中不可用。你将使用Tersoff势来代替,它并不会产生如参考文献中那样的层状晶体。模拟技术显然独立于势能的选取,因此对各种材料都适用。
 </WRAP> </WRAP>
  
-<WRAP center round important 100%>+<WRAP center round info 100%>
 **小提示 !** **小提示 !**
 限定的可接近的模拟时间需要在蒸汽压值下具有可操作性,而这个蒸汽压比实验值高出很多。当你解读模拟结果时,你应该时刻注意这一点。在remarks部分可以找到与之相关的更细致的讨论。 限定的可接近的模拟时间需要在蒸汽压值下具有可操作性,而这个蒸汽压比实验值高出很多。当你解读模拟结果时,你应该时刻注意这一点。在remarks部分可以找到与之相关的更细致的讨论。
行 21: 行 21:
 ===== 模拟策略 ===== ===== 模拟策略 =====
  
-运行一个沉积模拟需要一些不同的技术。与通常的平衡态分子动力学模拟最主要的不同是,随着蒸汽原子或分子的引入,整个系统的粒子数随之增加。在VNL-ATK中有两种策略来实现:+运行一个沉积模拟需要一些不同的技术。与通常的平衡态分子动力学模拟最主要的不同是,随着蒸汽原子或分子的引入,整个系统的粒子数随之增加。在QuantumATK中有两种策略来实现:
  
 1.为每个新引进的原子或者分子运行一次新的模拟。通过在已沉积原子/分子上连续添加新的原子/分子可以实现整个沉积的模拟。 1.为每个新引进的原子或者分子运行一次新的模拟。通过在已沉积原子/分子上连续添加新的原子/分子可以实现整个沉积的模拟。
行 27: 行 27:
 2.将所有需要沉积的原子或分子放在模拟晶胞的库(reservoir)中。对于每个新的沉积过程,从库中取出一个原子把它放在基底上方。 2.将所有需要沉积的原子或分子放在模拟晶胞的库(reservoir)中。对于每个新的沉积过程,从库中取出一个原子把它放在基底上方。
  
-第一个方法的好处是只有真正需要的原子才出现在模拟晶胞中,这提高了模拟效率。然而,由于原子数在变化,在VNL-ATK中不可能将整个模拟保存在一个[[http://www.quantumwise.com/documents/manuals/latest/ReferenceManual/index.html/ref.mdtrajectory.html|MD Trajectory]]中用以后续的可视化和分析。所以,本实例选取了第二种方法。当准备模拟时,我们必须注意在库中的原子不会与系统活跃部分有显著的相互作用,尤其是吸附发生的表面。在本实例中,库将会呈现为放在紧挨着基底底部的晶体。+第一个方法的好处是只有真正需要的原子才出现在模拟晶胞中,这提高了模拟效率。然而,由于原子数在变化,在QuantumATK中不可能将整个模拟保存在一个[[http://www.quantumwise.com/documents/manuals/latest/ReferenceManual/index.html/ref.mdtrajectory.html|MD Trajectory]]中用以后续的可视化和分析。所以,本实例选取了第二种方法。当准备模拟时,我们必须注意在库中的原子不会与系统活跃部分有显著的相互作用,尤其是吸附发生的表面。在本实例中,库将会呈现为放在紧挨着基底底部的晶体。
 {{ :atk:reservoir_schematic.png?400 |}} {{ :atk:reservoir_schematic.png?400 |}}
  
行 89: 行 89:
  
 <code python> <code python>
-        # Check if it is time for the deposition of a new atom from the reservoir.+# ------------------------------------------------------------ 
 +# Define a hook class to deposit atoms from the reservoir 
 +# onto the active surface of the substrate. 
 +# ------------------------------------------------------------ 
 + 
 +class VaporDepositionHook: 
 +    def __init__(self, 
 +                 deposition_interval, 
 +                 configuration, 
 +                 substrate_atoms, 
 +                 vapor_temperature=300.0*Kelvin): 
 +        """ 
 +        Constructor 
 +        """ 
 +        # Store the parameters. 
 + 
 +        # The interval after which a new atoms is deposited. 
 +        self._deposition_interval = deposition_interval 
 + 
 +        # Store the original coordinates. They will be used to constrain the reservoir atoms. 
 +        self._original_coordinates = configuration.cartesianCoordinates().inUnitsOf(Angstrom) 
 + 
 +        # The indices of the atoms that should not be deposited 
 +        self._substrate_atoms = substrate_atoms 
 + 
 +        # The vapor temperature. 
 +        self._vapor_temperature = vapor_temperature 
 + 
 +        # Deposition count. 
 +        self._deposited_index = 0 
 + 
 +        # Get the atoms in the reservoir, i.e. all with z-coordinates lower 
 +        # than the fixed bottom of the substrate. 
 +        self._lowest_substrate = self._original_coordinates[self._substrate_atoms, 2].min() 
 +        self._reservoir_indices = numpy.where(self._original_coordinates[:, 2] < self._lowest_substrate - 0.1)[0].tolist() 
 + 
 +        # Get the lattice vectors. 
 +        cell = configuration.bravaisLattice().primitiveVectors().inUnitsOf(Angstrom) 
 +        self._lx = cell[0, 0] 
 +        self._ly = cell[1, 1] 
 +        self._lz = cell[2 ,2] 
 +</code> 
 + 
 +在构造器中,你本质上为沉积存储有用的参数,比如从库中取出原子的间隔,和将原子约束在库中的原始坐标。 
 +最后,你需要定义一个类函数,当挂钩函数被调用时访问该类函数。由于我们的挂钩是以Python类来实现的,__call__() 类函数必须被定义得使它表现的像一个函数。所有挂钩函数必须有 step, time, 和configuration参数。这个类函数应该以如下形式实现。 
 +<code python> 
 +def __call__(self, step, time, configuration, forces, stress): 
 +        """ Call the hook during MD. """ 
 +        # Get the coordinates. 
 +        coordinates = configuration.cartesianCoordinates().inUnitsOf(Angstrom) 
 + 
 +        # The reservoir is composed of all atoms that are below the bottom 
 +        # layer of the substrate 
 +        # or above the ceiling of the cell. 
 +        self._reservoir_indices = numpy.where((coordinates[:, 2] < self._lowest_substrate - 0.1) | 
 +                                              (coordinates[:, 2] > self._lz))[0] 
 + 
 +        # Freeze the reservoir atoms and reset their positions at every step. 
 +        velocities = configuration.velocities() 
 +        velocities[self._reservoir_indices, :] = 0.0*Angstrom/fs 
 +        configuration._changeAtoms(indices=self._reservoir_indices, 
 +                                   positions=self._original_coordinates[self._reservoir_indices]*Angstrom) 
 +</code> 
 + 
 +首先,从当前构型中提取笛卡尔坐标。其次,库中原子是根据它们当前的位置是在基底之下或者在上晶胞边界之外来决定。对于所有的库原子速度设置为零(我们不想让它们移动),尤其是当库被移出原子不断的侵蚀。另外,在沉积模拟的开始,它们的位置被重设为原始位置。 
 + 
 +接下来的部分包含了库中的一个新的原子的实际沉积过程,它只在每个沉积间隔的开始执行一次。 
 +<code python> 
 + # Check if it is time for the deposition of a new atom from the reservoir.
         if (step % self._deposition_interval) == 0:         if (step % self._deposition_interval) == 0:
             # Get elements and velocities.             # Get elements and velocities.
行 151: 行 219:
 # ------------------------------------------------------------ # ------------------------------------------------------------
 </code> </code>
 +
 +首先我们决定接下来沉积哪种元素。由于硅原子和碳原子交替地沉积,只需要查看当前沉积指数是奇数还是偶数就可以检测到。然后库原子中所有这个元素被挑选出来,选择在库最底的原子。如果出于某种原因库中没有所需的元素类型,我们会选择其他元素来代替。通过构型中的 _changeAtoms() 类函数产生新的随机横坐标和距晶胞上端15.0Å的高度。为了更好的可视化,使用 wrap()类函数将坐标包进晶胞中。为了建模沉积原子的蒸汽温度,按Maxwell-Boltzmann分布选取新的速度,并且为了保证原子驶向表面,速度矢量被重新对齐。为了简化,矢量总是垂直指向表面,但总的来说,不同的冲击角度也很容易实现。使用setVelocities() 类函数来给沉积原子分配新的速度和更新构型的速度。最后,运行沉积指数增加,完成类的定义。
 +完成VaporDepositionHook 类的定义后,新的实例开始,并指定了当前模拟的参数。这应当在脚本中的Molecular Dynamics模块紧前面完成。
 +
 +<code python>
 +# Initialize the hook class.
 +deposition_hook = VaporDepositionHook(deposition_interval=5000,
 +                                      configuration=bulk_configuration,
 +                                      substrate_atoms=substrate+bottom,
 +                                      vapor_temperature=2400.0*Kelvin)
 +</code>
 +
 +为了运行模拟,在**Script Generator**中预定义的分子动力学模块基础上做两个小改动。在Nose-Hoover chain虚拟热浴类函数的定义中, reservoir_temperatures参数被修改,从而使只有被标记为“基底”的原子群才与虚拟热浴进行耦合。
 +<code python>
 +# Define an NVT thermostat where only the substrate atoms are thermalized.
 +method = NVTNoseHoover(
 +    time_step=1*femtoSecond,
 +    reservoir_temperature=[('substrate', 2400*Kelvin)],
 +    thermostat_timescale=100*femtoSecond,
 +    heating_rate=0*Kelvin/picoSecond,
 +    chain_length=3,
 +    initial_velocity=initial_velocity
 +)
 +</code>
 +这是有必要的,确保气相中的沉积原子的动力学在被表面吸附前不被虚拟热浴所影响(也就是说,沉积原子应该处于NVE系综中)。最后,deposition_hook 项作为逻辑判据必须在 MolecularDynamics()函数中被通过。
 +<code python>
 +md_trajectory = MolecularDynamics(
 +    bulk_configuration,
 +    constraints=bottom,
 +    trajectory_filename='SiC_deposit_tutorial_md.nc',
 +    steps=800000,
 +    post_step_hook=deposition_hook,
 +    log_interval=2500,
 +    method=method
 +)
 +</code>
 +
 +整个模拟完整的脚本可以在{{ :atk:script_deposit_sic.rar |Script_deposit_SiC.py}}文件中找到。
 +
 +<WRAP center round info 100%>
 +**注意**
 +在2016版ATK中,NVT Nose–Hoover方法是通过NVTNoseHoover级来实现,所需脚本如上面下载提供。但是在2015版的ATK或者更早的版本,这级命名为NVTNoseHooverChain。所需脚本请在{{ :atk:script_deposit_sic_atk2015.rar |Script_deposit_SiC_atk2015.py}}下载。
 +</WRAP>
 +
 +
  
  
 ===== 运行模拟 ===== ===== 运行模拟 =====
 +
 +通过**Job Manager**或着在一个终端中运行脚本。如此长的分子动力学模拟可能花费数小时来完成。你会注意到一些原子并没有被表面吸附,而是被散射回气相。不过没关系,这些原子向上运动将最终到达库,然后自动地被再一次视为正常的库原子。
 +
 +下面这些图展示了沉积模拟不同阶段的快照。
 +{{ :atk:sic_deposit_series.png?400 |}}
 +
 +最开始,只有少数原子被沉积在表面并被吸附形成单个吸附原子。随着越来越多的原子被沉积,在基底表面上开始形成第一层。第一层,至少部分地,像基底的晶体结构,而接着的几层展现的更像是无定型结构。这主要归结于所选的势(参见开始的小提示),而在某种程度上也归结于高的沉积频率(由 deposition_interval参数所规定)。一个大的 deposition_interval会降低沉积频率,从而使沉积原子的集成更可控。切记,如果你增加沉积间隔,你必须对沉积模拟总步数也有相同的增幅来确保库中所有的原子会被沉积。
 +
 +注意在薄膜生长的同时,随着越来越多的原子被拿走,平板底部库区域是如何变小的。然而,脚本中特殊的约束保证了消失的结构不会使整个系统不稳定。
 +
 +
 +
 +
 +
 +
 ===== 概要 ===== ===== 概要 =====
 +
 +这个模拟技术原则上适用于各种材料。当然,你可能会需要在脚本中做一些修改,比如调整元素。除了单原子,你也可以沉积整个分子。对于生产模拟你或许需要增加库的层数来得到一个大的沉积薄膜。你还可以对其他参数比如温度或者沉积间隔进行调整。沉积频率,也就是沉积间隔的倒数,可以通过Hertz- Knudsen方程与蒸汽压建立联系(参见[3]):
 +
 +$\frac{dN_i}{dt}=\frac{p_i A}{\sqrt{2 \pi m_i k_B T}}$,
 +
 +其中$p_i$表示原子/分子i的分压,A表示表面积,$m_i$表示原子/分子质量。
 +
 +插入模拟中的参数,你将会发现相应的蒸汽压大约为66 bar,远远大于典型的实验的近真空状态。这方面显示了此类模拟的一个显著缺点,由于在多数情况下可达到的模拟时间不允许实际压力值的使用,致使时间分辨解析生长动力学很困难。本质上,这意味着粒子以过高的速率撞击,由于反应热从表面到受恒温器控制的块体基底传的不够快,将导致局部加热的增加。然而,所获的沉积薄膜的结构模型在多数情况下可被视为真实薄膜结构的一个很好的近似。你应当记住实行模拟的条件,并考虑这些条件是否会对沉积结构产生影响。
 +此外,要注意使用恒定的沉积间隔提供了另一个近似,因为实际过程遵循的是泊松分布而不是均匀分布。虽然泊松分布可以很容易在脚本中实现(使用比如python的 random.poisson函数),当沉积时间间隔选的足够高从而产生想要的实际蒸汽压,选择这种分布才会变得有意义。
 +
 ===== 参考文献 ===== ===== 参考文献 =====
 +
 +[1] (1, 2, 3) Kang, K.-H; Eun, T.; Jun, M.-C.; Lee, B.-J.: Governing factors for the formation of 4H or 6H-SiC polytype during SiC crystal growth: An atomistic computational approach. J. Cryst. Growth, 389, 120 (2014)
 +
 +[2] P. Erhart and K. Albe: Analytical potential for atomistic simulations of silicon, carbon, and silicon carbide. Physical Review B, 71, 035211, (2005)
 +
 +[3] K. Reuter: First-Principles Kinetic Monte Carlo Simulations for Heterogeneous Catalysis: Concepts, Status, and Frontiers. in “Modeling Heterogeneous Catalytic Reactions: From the Molecular Process to the Technical System”, Wiley-VCH (2011)
 +
 +本文翻译:王吉章
  
  
  
  
atk/模拟气相沉积薄膜生长过程.1474273659.txt.gz · 最后更改: 2016/09/19 16:27 由 nie.han

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