晶体学简介

“Introductory Solid State Physics with MATLAB Applications” 一书的学习笔记。

晶体结构基础

理想晶体被理解为结构单元在空间中的无限重复。

晶格与基元

所有晶体的结构都可以用晶格来描述,每个格点上都存在原子群。我们做出如下定义:晶格在某一维度上是无限延伸的点阵列,其中每个点都被它近邻的点以相同的方式包围。 从定义上来看,晶格是一种数学抽象,每个格点被称为构成该晶格的点。 原子群被称为基元。基元可以是一个、两个、或多个原子。当基元在空间中按照晶格几何重复排列时,就形成了晶体。

晶格平移矢量

在数学上,根据晶格平移矢量构建晶格。晶体中的一般矢量写为: \[\begin{equation}\label{equ-1-2-1} \vec{r}^{\prime}=\vec{r}+\vec{T} \end{equation}\] 以使得从\(\vec{r}^{\prime}\)看原子排列与从\(\vec{r}\)看时原子排列相同。 此处,\(\vec{T}\)是。

\[\begin{equation}\label{equ-1-2-2} \vec{T}=u_1 \vec{a}_1+u_2 \vec{a}_2+u_3 \vec{a}_3 \end{equation}\]晶格平移矢量。其中,\(u_1\)\(u_2\)\(u_3\)是任意整数。而\(\vec{a}_1\)\(\vec{a}_2\)\(\vec{a}_3\)则是基本平移矢量。 我们将在下面讨论基本平移矢量的一个例子:基(平移)矢(量)。

基矢

考虑晶体中原子排列看起来相同的两个点\(\vec{r}\)\(\vec{r}^{\prime}\), 选择合适的\(u_1\)\(u_2\)\(u_3\) (整数)以满足方程\(\ref{equ-1-2-1}\),则\(\vec{a}_1\)\(\vec{a}_2\)\(\vec{a}_3\) (由此创建晶胞)是基元。 这也意味着\(\vec{T}\)是真正的晶格平移矢量。 显然除基矢以外,存在任意矢量集使得方程\(\ref{equ-1-2-1}\)也成立。然而,基矢是空间中可以重复形成晶体结构的最小体积。 这里我们使用基矢所定义的基元晶轴来取代笛卡尔坐标,例如它们不必是正交的。 有时物理学家使用非基矢晶轴,当它们与晶体结构的对称性有更简单的关系时。 非基矢晶轴也可以构成晶体,但这些轴所围成的体积不一定是重复形成晶体结构的最小体积。

综上所述,为了描述一个晶体结构,我们需要以下几个方面:

  • 什么是晶格?
  • 确定\(\vec{a}_1\)\(\vec{a}_2\)\(\vec{a}_3\)的最优选择,无论它们是否是基矢。
  • 什么是基元?

上述的平移操作\(\vec{T}\)属于对称操作。有几种对称性操作:(a)平移,(b)转动,(c)反映,以及(d)其中两个或多个的复合操作。 对称性操作是重要的,因为对晶体结构进行这些操作之后,晶格保持不变。

关于基元和晶体结构的进一步介绍

如前所述,每个格点上都存在原子基元,每个基元在组成、排列和取向上都相同。 让我们考虑略有不同的矩形晶格。

正如我们所看到的,基元中的原子数可能不止一个。基元的中心原子\(j\)相对于相应格点的位置为: \[\begin{equation}\label{equ-1-2-3} \vec{r}_j=x_j \vec{a}_1+y_j \vec{a}_2+z_j \vec{a}_3 \end{equation}\] 其中,\(j=1,2,...\)是基元中原子的个数。与方程\(\ref{equ-1-2-2}\)中的\(u_1\)\(u_2\)以及\(u_3\)不同,\(x_j\)\(y_j\)\(z_j\)可能是非整数。

原胞

原胞是由基矢构成的最小体积(或二维中的体积,一维中的长度)。它是一种晶胞或单胞。一个晶胞可以通过合适的晶体对称性操作,进行自身的重复来填充所有空间。

选择基矢和原胞的方法有很多种。虽然原胞中的原子数可以不止一个,但对于给定的晶体结构,原胞中的原子数总是相同的。 由基矢定义的面积或体积是相等的,因为它们都定义了构建晶体的单元格。

在三维空间,平行六面体的体积为: \[\begin{equation}\label{equ-1-2-5} V=\left|\left(\vec{a}_1 \times \vec{a}_2\right) \cdot \vec{a}_3\right| \end{equation}\] 为了数值计算,Python附录中描述了在该环境下进行\(\times\)和点乘操作的方法。

维格纳-塞茨原胞

维格纳-塞茨方法是一种非常精确获取原胞(维格纳-塞茨原胞)的方法。具体方法如下:

  • 通过画线将给定格点与附近所有格点连接;
  • 在这些直线的中点和法线处,画出新的直线(二维)或平面(三维);
  • 这样围成的最小面积(二维)或体积(三维)就是维格纳-赛茨原胞。

基本晶格类型

晶格可以通过晶格对称操作与其自身重合。常见的操作是关于格点的旋转。可以发现晶格有一重(360 度)、二重(180 度)、三重(120 度)、四重(90 度)和六重(60 度)旋转,对应的旋转为\(2m\pi /n\),其中\(n\)分别为1、2、3、4和6,\(m\)为整数。旋转轴用指数\(n\)表示。

格点群是对称操作的集合。将其应用于格点后晶体与其自身重合。我们有:

  • 关于轴的可能旋转( \(2\pi / n\) ,其中\(n = 1 , 2 , 3 , 6\)),记作\(C_n\)旋转(C是cyclic的首字母)旋转;
  • 关于通过一个格点的平面的镜面反映。此处,垂直于镜面的轴线符号发生变化(例如当镜面垂直于\(z\)轴时,\(z\to - z\))。该操作被称为\(m\)\(\sigma\)操作(如(b)所示);
  • 反演,先旋转\(\pi\)后再关于垂直于旋转轴的平面反映(此处,若旋转轴为\(z\)轴,旋转导致\(x\)\(y\)轴都发生了变号,反映又使得\(z\)轴变号),总的效果是\(\vec{r}\to -\vec{r}\)。用\(i\) (反演)或\(s_4\)表示(以用于组合运算);

笛卡尔坐标系下的晶体

考虑\(x\)-\(y\)-\(z\)正交坐标系,令矢量\(\vec{a}\)沿\(x\)方向,使得: \[\begin{equation}\label{equ-1-3-6} \vec{a} = a \hat{x} \end{equation}\] 另外,令\(\vec{b}\)位于\(x\)-\(y\)平面上。

我们可将\(\vec{b}\)写成如下形式: \[\begin{equation}\label{equ-1-3-7} \vec{b}=b_1 \hat{x}+b_2 \hat{y}=b \cos \gamma \hat{x}+b \sin \gamma \hat{y} \end{equation}\] 接下令\(\vec{c}\)在任意方向,也就是: \[\begin{equation}\label{equ-1-3-8} \vec{c}=c_1 \hat{x}+c_2 \hat{y}+c_3 \hat{z}=c \cos \beta \hat{x}+c_2 \hat{y}+c_3 \hat{z} \end{equation}\] 因此,\(\vec{a}\cdot\vec{c}=ac\cos\beta=a\hat{x}\cdot(c_1\hat{x}+c_2\hat{y}+c_3\hat{z})=ac_1\), 也就是, \[\begin{equation}\label{equ-1-3-9} c_1=c\cos\beta \end{equation}\] 类似的,我们有\(\vec{b}\cdot\vec{c}=bc\cos\alpha=(b\cos\gamma\hat{x}+b\sin\gamma\hat{y})\cdot(c_1\hat{x}+c_2\hat{y}+c_3\hat{z})=bc_1\cos\gamma+bc_2\sin\gamma\)。 利用方程\(\ref{equ-1-3-9}\)可得: \[\begin{equation}\label{equ-1-3-10} \vec{b}\cdot\vec{c}=bc\cos\alpha=bc\cos\beta\cos\gamma+bc_2\sin\gamma \end{equation}\]\[\begin{equation}\label{equ-1-3-11} c_2=\frac{c(\cos\alpha-\cos\beta\cos\gamma)}{\sin\gamma} \end{equation}\] 最后, \[\begin{equation}\label{equ-1-3-12-a} |\vec{c}|^2=c^2=c_1^2+c_2^2+c_3^2 \end{equation}\] 利用方程\(\ref{equ-1-3-9}\)和方程\(\ref{equ-1-3-11}\),我们有: \[\begin{equation}\label{equ-1-3-12-b} c_3=\sqrt{c^2-c_2^2-c_3^2}=c\sqrt{1-\cos^2\beta-(\frac{\cos\alpha-\cos\beta\cos\gamma}{\cos\gamma})} \end{equation}\] 注意到,我们可将方程\(\ref{equ-1-3-6}\)到方程\(\ref{equ-1-3-8}\)写成如下形式: \[\begin{equation}\label{equ-1-3-13-a} \left( \begin{array}{ccc} \vec{a} & \vec{b} & \vec{c} \end{array} \right) = \left( \begin{array}{ccc} \hat{x}&\hat{y}&\hat{z} \end{array} \right) \left( \begin{array}{ccc} a&b\cos\gamma&c_1\\ 0&b\sin\gamma&c_2\\ 0&0&c_3 \end{array} \right) = \left( \begin{array}{ccc} \hat{x}&\hat{y}&\hat{z} \end{array} \right) C \end{equation}\] 其中,

\[\begin{equation}\label{equ-1-3-13-b} C\equiv\left(\begin{array}{ccc}a&b\cos\gamma&c_1\\ 0&b\sin\gamma&c_2\\ 0&0&c_3\end{array}\right) \end{equation}\]

\(c_1\)\(c_2\)以及\(c_3\)则由方程\(\ref{equ-1-3-9}\)\(\ref{equ-1-3-12-a}\)给出。

接下来,考虑给出晶体坐标中原子位置的矢量\(\vec{t}\),如: \[\begin{equation} \vec{t}=u\vec{a}+\nu\vec{b}+w\vec{c} \end{equation}\]

其中,\(u\)\(v\)\(w\)是整数。问题出现了,这个原子相对于原点的笛卡尔坐标是什么? 重写\(\vec{t}\)则可给出答案: \[\begin{equation} \vec{t}=x\hat{x}+y\hat{y}+z\hat{z}=u\vec{a}+\nu\vec{b}+w\vec{c}. \end{equation}\]

借助方程\(\ref{equ-1-3-13-a}\)中行矢量\((\begin{array}{ccc}\vec{a}&\vec{b}&\vec{c}\end{array})\)的帮助, 上式变成: \[\begin{equation} \vec{t}=(\begin{array}{ccc}\widehat{x}&\widehat{y}&\widehat{z}\end{array})\left(\begin{array}{c}x\\y\\z\end{array}\right)=(\begin{array}{ccc}\hat{x}&\hat{y}&\hat{z}\end{array})\boldsymbol{C}\left(\begin{array}{c}u\\\nu\\w\end{array}\right) \end{equation}\] 或者 \[\begin{equation} \left.\left(\begin{array}{c}x\\y\\z\end{array}\right.\right)=C\left(\begin{array}{c}u\\\nu\\w\end{array}\right) \end{equation}\] 这些是根据晶体轴的大小寻求的笛卡尔坐标大小。在这里,矩阵C被称为转换矩阵。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from numpy import cos, sin, sqrt, array, pi, shape, dot

def angle2Radian(angle):
return angle*pi/180

class crystalAxes2Cartesian():
def __init__(self, a, b, c, alpha, beta, gamma):
self.a = a # 坐标轴单位为angstroms
self.b = b
self.c = c
self.alpha = angle2Radian(alpha) # 角度转弧度
self.beta = angle2Radian(beta)
self.gamma = angle2Radian(gamma)

# 定义C矩阵
c1 = c*cos(self.beta)
c2 = c*(cos(self.alpha) - cos(self.gamma)*cos(self.beta)/sin(self.gamma))
c3 = sqrt(c**2 - c1**2 - c2**2)

self.C = array([
[a, b*cos(self.gamma), c1],
[0, b*sin(self.gamma), c2],
[0, 0, c3]
])

def cal(self, u, v, w):
vector = array([u,v,w])
return dot(self.C, vector)

原子级表面微观形貌

STM技术是由Gerd Binnig与Heinrich Rohrer共同开发的,他们因这一成就在1986年获得了诺贝尔奖。 在这种技术中,会在一个金属探针和感兴趣的样品之间施加一个恒定的偏压电压。当探针尖端在表面移动时, 样品电子会通过间隙(宽度为\(d\))从样品隧穿到探针。 隧穿电流与量子力学隧穿概率成正比:\(I\sim|T|\)\[\begin{equation}\label{equ-1-7-19a} T=\frac{|\psi_{transmitted}|^2}{|\psi_{incident}|^2}\sim\exp(-2kd) \end{equation}\] 其中, \[\begin{equation} k=\sqrt{\frac{2m}{\hbar^2}(W-E)} \end{equation}\]

\(m\)表示电子的质量;\(E\)代表电子的动能;而\(W\)则是样品电子的功函数(跃过能隙所需的最小能量)。 电子的动能可以与所施加的电压相关联,即\(E=e\phi_{app}\);通过分析隧穿电流,可以对晶体样品的表面结构进行成像。

对于这个模型,电子会经历量子力学隧穿。在一维情况下,如果我们有一个高度为\(V = V_0\)、宽度为\(a\)的量子力学势垒,携带能量\(E\)的电子具有一个通过障碍的概率,这个概率由下式给出: \[\begin{equation} \label{equ-1-7-20a} T=\frac{|\psi_{transmitted}|^2}{|\psi_{incident}|^2}=\frac1{1+D\sinh^2(\alpha a)} \end{equation}\] 其中, \[\begin{equation} D=\frac{V_0^2}{4E(V_0-E)} \end{equation}\] 以及, \[\begin{equation} \alpha=\sqrt{\frac{2m}{\hbar^2}(V_0-E)} \end{equation}\]

\(\alpha a\gg1\)的极限下,并令\(V_0 = W\)。方程\(\ref{equ-1-7-20a}\)变成: \[\begin{equation} T=\frac{|\psi_{transmitted}|^2}{|\psi_{incident}|^2}\approx T_0\exp(-2kd) \end{equation}\] 其中, \[\begin{equation} T_0=\frac{16E(W-E)}{W^2} \end{equation}\]

通过粗略地令\(T_0\sim 1\),则上面的方程又变回了方程\(\ref{equ-1-7-19a}\)。 让我们用方程\(\ref{equ-1-7-19a}\)做一个简单的数值模拟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import scipy.constants as C
import numpy as np
import matplotlib.pyplot as plt

hbC = C.hbar*C.c*1E9/C.e # hbar*C in eV nm
mc2 = C.m_e*C.c**2/C.e # rest mass of the electron mc^2 in eV

# 在这里,我们采用近似的隧穿公式,及振幅约等于1

class tunnel0():
def __init__(self, V0, d): # V0 功函数
self.V0 = V0
self.Va = np.arange(0, self.V0 + self.V0/100.0, self.V0/100.0) # applied voltage in electron volts
self.E = self.Va

self.k = np.sqrt(2*mc2*(self.V0-self.E)/hbC**2)
self.d = d # gap width in nm
self.T1_approx = np.exp(-2.0*self.k*self.d) # approximation

self.plotTvsE()
self.plotTvsa()

# 显示图形
plt.show()

def plotTvsE(self):
# 创建子图
plt.subplot(1, 2, 1)
plt.plot(self.E, self.T1_approx, 'k--', linewidth=2)
plt.axis([0, 1.1*self.V0, 0, 1])
plt.text(0.1, 0.8, r'$T(E)=e^{-2.0k(E)d}$', fontsize=16)
plt.xlabel('E (eV)', fontsize=16)
plt.ylabel('T', fontsize=16)
plt.title('T vs E', fontsize=16)

def plotTvsa(self):
s = np.arange(0, self.d+self.d/25, self.d/25)
EE = 0.5*self.V0
k = np.sqrt(2*mc2*(self.V0-EE)/hbC**2)
T2_approx = np.exp(-2*k*s)

plt.subplot(1, 2, 2)
plt.plot(s, T2_approx, 'k--', linewidth=2)
plt.axis([0, 1.1*self.d, 0, 1])
plt.text(self.d/4, 0.4, r'$T(d)=e^{-2.0kd}$', fontsize=16)
plt.xlabel('d (nm)', fontsize=16)
plt.ylabel('T', fontsize=16)
plt.title('T vs a', fontsize=16)

tunnel = tunnel0(4.3, 0.3)