薛堪豪的个人博客分享 http://blog.sciencenet.cn/u/bfax 兴趣:凝聚态物理,电化学

博文

Siesta计算禁带宽度

已有 7222 次阅读 2013-12-11 00:32 |个人分类:学习心得|系统分类:科研笔记

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 下的用着方便。



https://blog.sciencenet.cn/blog-365047-748807.html

上一篇:说说电池(一)
下一篇:法国地理,行政区划和城市快速入门【上】
收藏 IP: 194.57.109.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-25 16:59

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部