近期,高通量計算和機器學習在化學領域迅猛發展,並且以理論計算為主導的材料篩選和預測,隨後接實驗驗證的設計思路也越來越流行,成為新材料設計和開發的強有力手段。顧名思義,無論高通量計算還是機器學習,我們都需要大量的數據作為支撐。
手動建模(Material studio, p4vasp, vesta, jmol等)方法無法滿足大批量結構數據的創建和後期計算處理。目前在大批量建模方面兩個主要的工具是pymatgen和ASE,這裡將著重介紹如何用ASE進行表面建模。
ASE簡介:ASE(Atomic Simulation Environment)是一款基於python語言集建模、計算、可視化、分析於一體的開源工具。它可以兼容VASP,QE,CP2K, lammps, Gaussian等多種主流計算軟體的接口和格式。
網站:https://wiki.fysik.dtu.dk/ase/
參考文獻:
https://iopscience.iop.org/article/10.1088/1361-648X/aa680e
ASE建模:ASE的安裝很簡單,根據官網推薦步驟安裝即可,這裡不具體描述。ASE在構建體相(bulk)結構和表面(surface)結構方面都十分優秀,下面以表面催化科學常用到的表面模型為例給大家介紹一下它的使用方法。
表面建模需要考慮的幾個基本點:bulk結構
特定miller指數表面切割
表面的厚度
表面超晶胞大小
真空層厚度
切割的termination
吸附質分子的添加
簡單金屬體系表面建模:接下來以Cu(111)表面NO吸附為實例進行詳細介紹
導入表面建模需要用到的ASE相關模塊from ase.spacegroup import crystal
from ase.build import fcc111, add_adsorbate, bulk
from ase import Atoms
from ase.io import read, write
from ase.build import surface, molecule
from ase.visualize import view
a=3.64
slab=fcc111('Cu',(3, 3, 6),a=a,vacuum=10)
view(slab)
1b 利用自定義bulk結構構建a=3.64 #晶胞參數
Cu_bulk=crystal('Cu',[(0,0,0)],spacegroup=225,cellpar=[a,a,a,90,90,90])
slab=surface(Cu_bulk,(1,1,1),6,vacuum=10) #miller指數,面厚度,真空層厚度
slab=slab*(3,3,1) #超晶胞
2 在已創建表面添加NO分子adsorbate=molecule('NO') #從ASE分子庫調取NO分子或自己利用Atoms模塊創建
2a 利用ASE內部定義位點信息構建add_adsorbate(slab,adsorbate,1.8,'ontop') #將NO添加在表面上,1.8初始高度,ontop是初始位置。
add_adsorbate(slab,adsorbate,1.8,(0,0)) #(0,0)為位點的x,y坐標
氧化物表面構建與金屬體系構建過程基本一樣,不同的是構建氧化物表面時可能會遇到不同termination的情況。下面以TiO2為例介紹不同截面構建。
1. 自定義bulk結構a = 4.6
c = 2.95
Tio2 =crystal(['Ti','O'], basis=[(0, 0, 0), (0.3, 0.3, 0.0)],spacegroup=136, cellpar=[a, a, c, 90, 90, 90])
2a. 氧終端表面這裡要利用surface_with_termination函數處理不同終端問題
from ase.build.surfaces_with_termination import surfaces_with_termination
slab=surfaces_with_termination(Tio2,(1,1,0),layers=5,vauum=10,tol=1e-10,termination='O')
該方法會返回所有氧原子在頂層的結構類型
view(slab[2]*(2,2,1))
slab=surfaces_with_termination(Tio2,(1,1,0),layers=5,vauum=10,tol=1e-10,termination='TiO')
view(slab*(2,2,1))
結構導出ASE提供多種主流軟體的input格式:
write('slab.vasp',slab) #導出為vasp輸入文件格式
write('slab.pwi',slab) #導出為QE輸入文件格式
write('slab.cif',slab) #導出為cif格式
總結這裡主要介紹了簡單金屬體系和複雜氧化物體系的表面建模,流程簡單且模式化,如果想進行批量的結構構建,寫個簡單的循環腳本即可。