3×3の大きさの(111)面を6層(3二重層)重ねたスラブ模型1)のListOfAtoms
オブジェクトをつくる。
from math import sqrt from Numeric import array ############################################ dh = 1.48 # Si-H bond length b = 2.35 # Si-Si bond length ############################################ c = b*4/sqrt(3) # lattice constant of cubic cell a = c/sqrt(2) # side of triangle in (111) plane d = b + b/3 # separation of double layers along [111] direction ############################################ NV = 6 # NV-double layer spacing for vacuum NL = 3 # Slab contains NL double layers N = 3 # NxN super structure ############################################ ######### unit cell (super cell) setting ########## u1 = a*sqrt(3)/2*N u2 = a/2*N u3 = d*(NL + NV) a1 = (u1, u2, 0) a2 = (u1, -u2, 0) a3 = (0, 0, u3) ################################################### ################################################### from ASE import Atom atoms = [] for iLayer in range(NL*2): iHLayer = iLayer%2 iDLayer = iLayer/2 iShifts = ((iLayer + 1)/2)%3 for iX in range(N): for iY in range(N): xPos = (iX + iShifts/3.)/N yPos = (iY + iShifts/3.)/N zPos = ((1 + iDLayer)*d + iHLayer*b/3)/u3 atoms.append(Atom('Si', (xPos, yPos, zPos), tag = 1)) # ---------------------------------------------------------- ################################################### from ASE import ListOfAtoms slab = ListOfAtoms(atoms) slab.SetUnitCell([a1, a2, a3]) ###################################################
できたら最後に
from ASE.IO.xyz import WriteXYZ WriteXYZ('slab_model.xyz', atoms = slab)
を付け加えてxyzフォーマットファイルを作成し、Jmol/iMolでできを確認せよ。
以下のようにして、スラブの表面と裏面のダングリングボンドを水素で終端できる。
# ---------------------------------------------------------- for iX in range(N): for iY in range(N): xPos = (iX*1.)/N yPos = (iY*1.)/N zPos = (d - dh)/u3 atoms.append(Atom('H', (xPos, yPos, zPos))) for iX in range(N): for iY in range(N): xPos = (iX + (NL%3)/3.)/N yPos = (iY + (NL%3)/3.)/N zPos = (NL*d + b/3 + dh)/u3 atoms.append(Atom('H', (xPos, yPos, zPos)))