||
Siesta 把能量本征值存储在 *.EIG 文件中,但这个文件本身不太适合各种数据处理软件读取。
Siesta 将“费米能级”写在 *.EIG 文件的第一行。但对于半导体和绝缘体,这个“费米能级”是按照禁带中心取的,并非像 VASP 一样取在价带顶。
正确地计算半导体和绝缘体的禁带宽度,需要在输入文件中设置一些特殊的K点(高对称点),然后在这若干个高对称K点中寻找导带底和价带顶。
但有时候我们并非计算体材料,而是很复杂的一个超原胞,未必知道那些高对称的K点在哪里。在这种情况下我认为可以加大K点密度(Monkhorst-Pack 方案),再检查所有的本征值,来近似读取禁带宽度。
怎样才能从 *.EIG 文件中读出禁带宽度呢?我写个 C# 小程序(方便在 Windows 下运行)如下:
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
// Extract band gap from Siesta
// Written by Kanhao XUE
public class SiestaGap
{
public static void Main()
{
// Read original data
StreamReader sr = new StreamReader(@"D:EIG");
StreamWriter sw = new StreamWriter(@"D:Eig.txt");
double Ef, Gap, VBM = -1000, CBM = 1000;
int M, N, P, Q, i, j, l;
Ef = double.Parse(sr.ReadLine().Trim());
// Read basic information
string line = sr.ReadLine().Trim();
string[] lineDetails = Regex.Split(line, @"s+");
N = int.Parse(lineDetails[0]);
M = int.Parse(lineDetails[2]);
Console.WriteLine("Fermi level: " + Ef.ToString());
Console.WriteLine("K points: " + M.ToString());
Console.WriteLine("Band count: " + N.ToString());
P = N / 10;
Q = N % 10;
for (i=0; i<M; i++)
{
line = sr.ReadLine().Trim();
sw.Write(line);
// First line has 11 elements
lineDetails = Regex.Split(line, @"s+");
for (l=1; l<=10; l++)
{
double val = double.Parse(lineDetails[l]);
if (val>Ef)
{
if (val < CBM) CBM = val;
}
else
{
if (val > VBM) VBM = val;
}
}
for (j=1; j<P; j++)
{
line = sr.ReadLine().Trim();
sw.Write(line);
lineDetails = Regex.Split(line, @"s+");
for (l=0; l<10; l++)
{
double val = double.Parse(lineDetails[l]);
if (val>Ef)
{
if (val < CBM) CBM = val;
}
else
{
if (val > VBM) VBM = val;
}
}
}
line = sr.ReadLine().Trim();
sw.Write(line);
lineDetails = Regex.Split(line, @"s+");
if (Q != 0)
{
sw.Write(line);
for (l=0; l<Q; l++)
{
double val = double.Parse(lineDetails[l]);
if (val>Ef)
{
if (val < CBM) CBM = val;
}
else
{
if (val > VBM) VBM = val;
}
}
}
sw.WriteLine();
}
sr.Close();
sw.Close();
Gap = CBM - VBM;
Console.WriteLine("VBM: " + VBM.ToString());
Console.WriteLine("CBM: " + CBM.ToString());
Console.WriteLine("Band gap: " + Gap.ToString());
Console.ReadLine();
}
}
运行的时候,把 *.EIG 文件改名为 EIG 保存在 D: 下面
用 csc 编译程序, 然后运行生成的 exe 文件
程序会读出价带顶,导带底,以及禁带宽度。同时会生成一份适合各种数据处理软件阅读的能量本征值文件(D:Eig.txt)
一个典型运行结果是:
Fermi level: -13.762
K points: 8125
Band count: 92
VBM: -17.91691
CBM: -9.68061
Band gap: 8.2363
但有个小疑问:计算出价带顶与费米能级相差 4.15491 eV,但导带底和费米能级相差 4.08139 eV,两者并不相等。莫非 Siesta 不是恰好取禁带的中心,而是考虑了什么其他因素?但我没有让 Siesta 计算导带底和价带顶载流子的有效质量,它没有理由不取禁带的中心。还有一种解释是:这个差异只是在数值误差之内的。
最后,我猜 Siesta 官方可能已经提供了类似的程序,但懒得去在那些 Linux 目录下找了,还是自己弄个 Windows 下的用着方便。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-25 16:59
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社