====== Si(111)スラブ模型 ======
3x3の大きさの(111)面を6層(3二重層)重ねたスラブ模型((板状の構造模型))の''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)))