从VASP输出文件DOSCAR组织LDOS和PDOS的脚本


介绍

感谢您的辛勤工作。这是桥本

VASP可以输出LDOS和PDOS。
LDOS(状态局部密度)是属于某个原子的电子的状态密度,而PDOS是属于每个Rails的电子的状态密度。即,LDOS的总和为PDOS。 VASP结果输出文件" DOSCAR"包含全原子DOS和PDOS。

如果您知道状态的密度,则可以知道能量的哪个部分以及电子的占有量,因此您可以计算出有助于导电的电子数量,比热等物理量,并知道状态化学键的作用。
如您所见,这是相当重要的物理量,因此我编写了自己的Python脚本来组织结果,同时读取文件。

0.前提

如果您对手动组织结果的内容不感兴趣,请使用pymatgen" https://pymatgen.org/"或p4vasp" http://www.p4vasp.at/#/"。然后,您可以将DOS的内容输出到黑框中。

对于

pymatgen,官方参考和RKS WEBSITE的文章" http://ryokbys.web.nitech.ac.jp/pymatgen.html"将很有帮助。
在VASP官方网站" https://www.vasp.at/wiki/index.php/CO_partial_DOS"中介绍了p4vasp的方法。

老实说,即使它是

,当被问到它是否易于使用时,它还是微妙的。本文的目标是"因为格式不是那么困难,所以请使用python提取DOSCAR并使其易于理解。"

1.获取DOSCAR

要获得包含LDOS的DOSCAR,您需要运行两次(或三次)计算。

Step1.1首次计算

准备计算所需的文件。

?" POSCAR":
优化结构或创建要计算的结构后,请准备具有固定结构的文件。

?" KPOINTS":
准备一个具有足够k点的文件,以使计算的准确性收敛。

?" POTCAR":
准备一个PAW(投影机增强波)方法文件以计算所有电子。

?" INCAR":
请参阅" https://qiita.com/youkihashimoto3110/items/de92172e0b5e9f3872d3",了解计算设置文件INCAR中使用的每个标签的含义。

第一个计算是电荷优化(电子弛豫)计算的新计算。注释掉所有结构优化参数。
必需标签为

1
2
3
4
5
ISTART  =   0
PREC    =   Accurate
EDIFF   =   1E-5
LREAL   =   Auto
ALGO    =   VeryFast

它是

。对于金属,

1
2
ISMEAR  =   1 #または2,-5
SIGMA   =   0.5

绝缘子?

用于半导体

1
2
ISMEAR  =   0 #または-5
SIGMA   =   0.01

使用

调整SIGMA值,以使外向熵项小于每个原子1 meV。
请勿将ISMEAR>0用于绝缘体或半导体!
同样,使用ISMEAR=-5(四面体方法)可以提高精度,但不适用于大多数结构。 (???)
另外,请适当使用"不收敛时的有效措施"。

设置完成后,将执行第一个计算。

step2。第二计算

计算完成后,我们将开始第二次计算。在第二次计算中,电荷优化是由连续作业执行的,因此仅" INCAR"文件被重写。

第一个计算文件中的更改为

1
2
3
ISTART  =   1
ISYM    =   0
LORBIT  =   11

它是

。让我们以相同的方式重新计算其他值。

另外,如果要使DOS能量步长更小,

1
EMIN = -10.0;EMAX = 17.0;NEDOS = 1001

使用

。每个含义在模板中进行了描述。
ICHARG=11(执行非粗心的初始电荷放置)也有效。

2.阅读DOSCAR

使用任何文本编辑器在第二个计算中打开" DOSCAR"输出。
DOSCAR的内容如下图所示。
image.png
对不起,很难看到。 (换行符是由于ruby字符引起的,但在真实事物中没有换行符。)
VASP官方" https://www.vasp.at/wiki/index.php/DOSCAR"和东北大学宫本教授" http://www.aki.che.tohoku.ac.jp/~taiko/vasp.html"请访问该网站以获取信息。
同样,上面显示的示例在计算中未考虑旋转。在考虑自旋的计算情况下,也会为每个自旋输出。

3.用python输出结果


"有6个固定字符串,首先是DOS。与第5行有相同的字符串,第一个原子的LPDOS与第5行有相同的字符串,第二个是...."
您可以看到它的结构。此外,没有空白行换行符,您需要跳过空格。

如果基于这些进行编程,将如下所示。

Extract_dos.py

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
51
52
53
54
55
56
57
import csv

atom_index = [1,2,3]          #LPDOSを出力したい原子の番号(POSCARから何番目か)
doscar_name = "DOSCAR"        #読み込むDOSCARの名前
save_csv_name = "doscar.csv"  #DOSCARをcsvとして保存する名前
save_dos = "dos.csv"          #全DOSの保存名

#DOSCARからリストに格納
with open(doscar_name, newline='') as doscar:
    dos_read = csv.reader(doscar, delimiter=' ', skipinitialspace=True)
    dos_list = [i for i in dos_read]

#DOSCARをCSVで出力
with open(save_csv_name, mode='w', newline='') as doscar_csv:
    dos_write = csv.writer(doscar_csv)
    dos_write.writerows(dos_list)

#DOSCARから全dosを抽出
i = 5 #読み込み開始インデックス
dos = []
count = 0
dos.append(dos_list[i])
while True:
    i = i + 1
    count = count + 1
    dos.append(dos_list[i])
    if dos[0] == dos_list[i+1]:
        break

with open(save_dos, mode="w", newline='') as dos_csv:
    dos_write = csv.writer(dos_csv)
    dos_write.writerows(dos)

#DOSCARから指定したlpdosを抽出してそれぞれCSVに保存
lpdos_all = []
while True:
    i = i + 1
    pdos = []
    count = 0
    pdos.append(dos_list[i])
    while True:
        i = i + 1
        count = count + 1
        pdos.append(dos_list[i])
        if len(dos_list)==i+1:
            break
        if len(pdos[count]) != len(dos_list[i+1]):
            lpdos_all.append(pdos)
            break
    if len(dos_list)==i+1:
        break
#lpdosを保存
for j in atom_index:
    save_lpdos = "lpdos"+str(j)+".csv"
    with open(save_lpdos, mode="w", newline='') as lpdos_csv:
        lpdos_write = csv.writer(lpdos_csv)
        lpdos_write.writerows(lpdos_all[j+1])

这是一个糟糕的程序,但我认为它很难阅读。
如果在atom_index=[]中按POSCAR的顺序指定原子数,则具有该数字的LPDOS将输出为" lpdos_number.csv"。之后,如果使用Excel等对其进行绘制,则可以在每个原子和Rails上绘制DOS。

另外,在组织VASP输出文件时,删除空格并存储在数组中的"从#DOSCAR中存储在列表中"的方法有效。

显示在

上使用DOS时指定atom_index=[100,160,200]时的结果。
image.png
image.png
image.png
仅此一项,您就可以预测该物质具有的结构和性质。 ^^;