7 辅助工具使用教程
7.1 env环境部署
依赖环境: Python3.6及以上
- 依赖库安装: 
Pymatgen库 :使用
pip install pymatgen安装;
Statsmodels库 :使用
pip install statsmodels安装;
Dspawpy库 :使用
pip install -i https://test.pypi.org/simple/ dspawpy==0.3.0安装;
7.2 rho电荷密度数据处理
DS-PAW使用 pymatgen 的画图程序来显示的二维数据,使用 VESTA 来显示三维数据。以应用教程中Si体系的 band.json 和 dos.json 为例子:
- 在计算目录中新建一个 trans_rho.py 文件,内容如下: 
1 import json
2 from dspawpy.io import write_VESTA_format
3
4 with open("./rho.json","r") as file:
5 rho = json.load(file)
6
7 write_VESTA_format(rho["AtomInfo"], [rho["Rho"]["TotalCharge"]], "DS-PAW-rho.vesta")
- 第1,2行为需要导入的 python 库函数; 
- 第4,5行为需要读取的 - json文件;
- 第7行为执行 write_VESTA_format 函数,将数据保存为VESTA可识别的格式,其中 rho["AtomInfo"] 为读取 - rho.json中的晶格及坐标信息, [rho["Rho"]["TotalCharge"]] 为- rho.json中总的电荷密度的三维数据,- DS-PAW-rho.vesta表示生成的 vesta 格式数据;
- 执行 python trans_rho.py ; 
- 得到转换后的文件 - DS-PAW-rho.vesta,将其重命名为- CHGCAR.vasp以便在 VESTA 显示;
- 将 - CHGCAR.vasp文件拖入VESTA中则可得到如下的电荷密度图
 
7.3 band能带数据处理
以不开自旋时的MoS2体系的 band.json 为例子:
(1) 普通能带处理 :
创建 bandplot.py 文件,具体代码如下:
1from pymatgen.electronic_structure.plotter import BSPlotter
2from dspawpy.io import get_band_data
3
4band_data = get_band_data("./band.json")
5
6bsp = BSPlotter(bs=band_data)
7plt = bsp.get_plot()
8plt.savefig("bandplot.png",img_format="png")
9plt.show()
- 第1、2行为需要导入的 python 库函数,这里用到了pymatgen中的 BSPloter 库,以及 dspawpy.io 中的 - get_band_data函数;
- 第4行为读取 - band.json文件构造 band_data 这个结构体;
- 第6行为调用BSPloter处理 band_data 数据; 
- 第7行为使用 - bsp下面的 get_plot 进行画图;
- 第8行为保存图片的名称和格式,将数据保存为png格式命名为 bandplot.png ; 
- 第9行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将该行注释,之后打开 bandplot.png 文件查看。 
- 执行 python bandplot.py 
- 生成 - bandplot.png文件
知识点:
- Pymatgen中主要用到 electronic_structure.plotter 模块,基本上该模块下的80%的功能都能使用; 
- dspawpy.io 模块为 DS-PAW 的接口模块; 
- 使用 get_band_data 函数可以将 DS-PAW 计算得到的 band.json 文件转化为 pymatgen 支持的格式; 
- 使用 BSPlotter 模块获取到 DS-PAW 计算的 band.json 的数据; 
- 使用 BSPlotter 模块中 get_plot 函数绘制能带图; 
- 使用 savefig 函数可以将能带图以不同格式保存; 
- 使用 show 函数能够直接显示能带图,如果用户的机器上不支持图形界面,可以用#注释 show函数; 
执行代码可以得到以下能带图:
 
(2) 将能带投影到每一种元素然后分别作图,通过线条的粗细来表示该元素对该轨道的贡献 :
创建 bandplot_elt_projected.py 文件,具体代码如下:
 1from pymatgen.electronic_structure.plotter import BSPlotterProjected
 2from dspawpy.io import get_band_data
 3
 4band_data = get_band_data("./band.json")
 5
 6# 构建投影band数据实例
 7bsp = BSPlotterProjected(bs=band_data)
 8# 绘制按元素投影图片,返回matplotlib.pyplot
 9plt = bsp.get_elt_projected_plots()
10plt.savefig("bandplot_elt_projected.png",img_format="png")
11plt.show()
知识点:
- 用户如果需要绘制能带投影的数据,此时需要使用 BSPlotterProjected模块; 
- 使用 BSPlotterProjected模块中 get_elt_projected_plots 函数能够绘制每种元素对轨道贡献的能带图; 
执行代码可以得到以下能带图:
 
(3) 将能带投影到每一种元素然后分别作图,通过不同的颜色来表示该元素对该轨道的贡献:
创建 bandplot_elt_projected_color.py 文件,具体代码如下:
 1from pymatgen.electronic_structure.plotter import BSPlotterProjected
 2from dspawpy.io import get_band_data
 3
 4band_data = get_band_data("./data/band.json")
 5
 6bsp = BSPlotterProjected(bs=band_data)
 7# 绘制投影到元素band图片,返回matplotlib.pyplot({'Mo':['d'],'S':['s']})
 8plt = bsp.get_elt_projected_plots_color()
 9plt.savefig("bandplot_elt_projected_color.png",img_format="png")
10plt.show()
知识点:
使用 BSPlotterProjected模块中 bandplot_elt_projected_color 函数能够绘制每种元素对轨道贡献的能带图,用红绿蓝三原色来表示 spd轨道;
执行代码可以得到以下能带图:
 
(4) 能带投影到不同元素的不同轨道(L):
创建 bandplot_projected.py 文件,具体代码如下:
 1from pymatgen.electronic_structure.plotter import BSPlotterProjected
 2from dspawpy.io import get_band_data
 3
 4band_data = get_band_data("./data/band.json")
 5
 6bsp = BSPlotterProjected(bs=band_data)
 7
 8# 绘制投影到元素某些轨道band,返回matplotlib.pyplot
 9plt = bsp.get_projected_plots_dots({'Mo':['d'],'S':['s']})
10plt.savefig("bandplot_projected.png",img_format="png")
11plt.show()
知识点:
- 使用 BSPlotterProjected模块中 get_projected_plots_dots可以让用户来自定义需要绘制的某种元素某种轨道(L)的能带图; 
- 例如 get_projected_plots_dots ({'Mo':['d'],'S':['s']})就是绘制Mo的d轨道和S的s轨道; 
执行代码可以得到以下能带图:
 
(5) 将能带投影到不同原子的不同轨道(M):
创建 bandplot_plots_dots_patom_pmorb.py 文件,具体代码如下:
 1from pymatgen.electronic_structure.plotter import BSPlotterProjected
 2from dspawpy.io import get_band_data
 3
 4band_data = get_band_data("./band.json")
 5bsp = BSPlotterProjected(bs=band_data)
 6
 7plt = bsp.get_projected_plots_dots_patom_pmorb(dictio={'Mo':['px','py','pz']}, dictpa={'Mo':[1]})
 8
 9plt.savefig("bandplot_projected_plots_dots_patom_pmorb.png",img_format="png")
10plt.show()
- 第1、2行为需要导入的 python 库函数,这里用到了pymatgen中的 BSPloter 库,以及 dspawpy.io 中的 - get_band_data函数;
- 第4行为读取 - band.json文件构造 band_data 这个结构体;
- 第5行为调用 BSPlotterProjected 处理 band_data 数据; 
- 第7行为使用 - bsp下面的 get_projected_plots_dots 进行画图,用户可以根据自己的体系和需要绘制的投影轨道对参数进行修改;
- 第9行为保存图片的名称和格式,这里将数据保存为png格式命名为 bandplot_projected_plots_dots_patom_pmorb.png ; 
- 第10行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将该行注释,之后打开 png 文件查看。 
知识点:
- 使用 BSPlotterProjected模块中 get_projected_plots_dots_patom_pmorb 的自由度更高,可以让用户来自定义需要绘制的某种原子某种轨道 (M) 的能带图; 
- dictpa指定原子,dictio 指定该原子的轨道; 
- get_projected_plots_dots_patom_pmorb函数中还可以使用 sum_atoms 功能将多个原子的贡献相加,该功能用户可以自行根据使用方法进行尝试; 
注意:get_projected_plots_dots_patom_pmorb函数中序号是从1开始的;
执行代码可以得到以下能带图:
 
7.4 dos态密度数据处理
以应用教程中的反铁磁NiO体系的 dos.json 为例子:
(1) 总的态密度 :
创建 dosplot_total.py 文件,具体代码如下:
 1from pymatgen.electronic_structure.plotter import DosPlotter
 2from dspawpy.io import get_dos_data
 3
 4dos_data = get_dos_data("dos.json")
 5dos_plotter = DosPlotter(stack=False,zero_at_efermi=True)
 6dos_plotter.add_dos('total dos',dos=dos_data)
 7
 8plt = dos_plotter.get_plot()
 9plt.savefig("dos_total.png",img_format="png")
10plt.show()
- 第1、2行为需要导入的 python 库函数,这里用到了pymatgen中的 BSPloter 库,以及 - dspawpy.io中的- get_dos_data函数;
- 第4行为读取 - dos.json文件构造 dos_data 这个结构体;
- 第5行为调用 - DosPlotter处理 dos_data 数据,括号中 stack=False 表示态密度作图方式为曲线, stack=True 表示作图方式为面积, zero_at_efermi 控制是否将零点设为费米能级;
- 第6行使用 - add_dos来定义要处理的对象 dos ,调用前边定义好的dos对象- dos_data
- 第8行使用 - dos_plotter下面的 get_plot 进行画图;
- 第9行为保存图片的名称和格式,这里将数据保存为png格式命名为 dos_total.png ; 
- 第10行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将第该行注释,之后打开 png 文件查看。 
知识点:
- 使用 get_dos_data 函数可以将DS-PAW计算得到的 dos.json 文件转化为 pymatgen 支持的格式; 
- 使用 DosPlotter模块获取到DS-PAW计算的 dos.sjon 的数据; 
- DosPlotter函数可以传递参数:stack参数表示画态密度是否加阴影, zero_at_efermi 表示是否在态密度图中进行将费米能量置零,这里设置 stack=False , zero_at_efermi=False ; 
- 使用 DosPlotter 模块中 add_dos 获取态密度的数据; 
- DosPlotter模块中 et_plot函数 绘制态密度图; 
执行代码可以得到以下态密度图:
 
(2) 将态密度投影到不同的轨道上(L):
创建 dosplot_spd.py 文件,具体代码如下:
 1from pymatgen.electronic_structure.plotter import DosPlotter
 2from dspawpy.io import get_dos_data
 3
 4dos_data = get_dos_data("dos.json")
 5dos_plotter = DosPlotter(stack=False,zero_at_efermi=True)
 6dos_plotter.add_dos_dict(dos_data.get_spd_dos())
 7
 8plt = dos_plotter.get_plot()
 9plt.savefig("dos_spd.png",img_format="png")
10plt.show()
- 第1、2行是导入需要的 python 库函数,这里用到了 pymatgen 中的 DosPlotter 库,以及 dspawpy.io 中的 - get_dos_data函数;
- 第4行为读取 - dos.json文件构造 dos_data 这个结构体;
- 第5行为调用BSPlotterProjected处理 dos_data 数据,括号中 stack=False 表示态密度作图方式为曲线, stack=True 表示作图方式为面积, zero_at_efermi 控制是否将零点设为费米能级; 
- 第6行使用 - add_dos_dict获取投影信息,对- dos_data进行 get_spd_dos 操作,获得投影到轨道的信息;
- 第7行为保存图片的名称和格式,这里将数据保存为png格式命名为 dos_spd.png ; 
- 第8行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将该行注释,之后打开 dos_spd.png 文件查看。 
知识点:
- 使用 DosPlotter模块中 add_dos_dict 函数 获取投影态密度的数据,之后使用 get_spd_dos 将投影信息按照 spd 轨道投影输出; 
执行代码可以得到以下态密度图:
 
(3) 将态密度投影到不同的元素上 :
创建 dosplot_element.py 文件,具体代码如下:
 1# 导入pymatgen DosPlotter模块
 2from pymatgen.electronic_structure.plotter import DosPlotter
 3# 导入读取DS-PAW dos.json数据模块
 4from dspawpy.io import get_dos_data
 5
 6
 7dos_data = get_dos_data("dos.json")
 8dos_plotter = DosPlotter(stack=False,zero_at_efermi=True)
 9
10#按元素添加dos
11dos_plotter.add_dos_dict(dos_data.get_element_dos())
12
13#返回matplotlib.pyplot
14plt = dos_plotter.get_plot()
15plt.savefig("dos_element.png",img_format="png")
16plt.show()
知识点:
- 使用 DosPlotter模块中 add_dos_dict 函数 获取投影态密度的数据,之后使用 get_element_dos 将投影信息按照不同元素投影输出; 
执行代码可以得到以下态密度图:
 
(4) 将态密度投影到不同的元素的不同轨道(M)上:
创建 dosplot_element_orbital.py 文件,具体代码如下:
1from pymatgen.electronic_structure.plotter import DosPlotter
2from pymatgen.electronic_structure.core import Orbital
3from dspawpy.io import get_dos_data
4
5dos_data = get_dos_data("dos.json")
6dos_plotter = DosPlotter(stack=False,zero_at_efermi=False)
7dos_plotter.add_dos("Ni dxy",dos_data.get_site_orbital_dos(dos_data.structure[0],Orbital(4)))
8#dos_plotter.save_plot("dos_element_orbital.png",img_format="png")
9dos_plotter.show()
知识点:
- 使用 get_site_orbital_dos函数 提取dos数据中特定原子,特定轨道的贡献,这是获取第2个原子的第5个轨道的态密度 dos_data.structure[0],Orbital(4) ; 
- 之后使用 DosPlotter模块中 add_dos函数 进行画图; 
注意:get_site_orbital_dos函数中序号是从0开始的;
执行代码可以得到以下态密度图:
 
(5) 将态密度投影到不同的原子的t2g轨道和eg轨道上:
以应用案例NiO的反铁磁计算得到的 dos.json 为例,
创建 dosplot_t2g_eg.py 文件,具体代码如下:
1from pymatgen.electronic_structure.plotter import DosPlotter
2from dspawpy.io import get_dos_data
3
4dos_data = get_dos_data("./dos.json")
5dos_plotter = DosPlotter(stack=False,zero_at_efermi=True)
6dos_plotter.add_dos_dict(dos_data.get_site_t2g_eg_resolved_dos(dos_data.structure[1]))
7dos_plotter.save_plot("dos_t2g_eg.png",img_format="png")
8dos_plotter.show()
- 第1,2行为需要导入的 python 库函数,这里用到了pymatgen中的 DosPlotter 库,以及我们自己写的 - dspawpy.io中的 get_dos_data 函数;
- 第4行为读取 - dos.json文件构造- dos_data结构体;
- 第5行为调用DosPlotter处理dos_data数据,括号中 stack=False 表示态密度作图方式为曲线, stack=True 表示作图方式为面积, zero_at_efermi 控制是否将零点设为 费米能级 ; 
- 第6行使用 add_dos_dict 获取 投影信息 ,对dos_data进行 get_site_t2g_eg_resolved_dos 操作,获得 投影到轨道 的信息; 
- 第7行为保存图片的名称和格式,这里将数据保存为png格式命名为 dos_t2g_eg.png ; 
- 第8行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将该行注释了,之后打开 dos_t2g_eg.png 文件查看。 
- 执行 python dosplot_t2g_eg.py ; 
- 生成 - dos_t2g_eg.png文件
 
知识点:
- 使用 get_site_t2g_eg_resolved_dos函数 提取dos数据中特定原子的 t2g和 eg轨道的贡献,这是获取第1个原子的t2g和eg轨道的贡献; 
- 之后使用 DosPlotter 模块中 add_dos_dict函数 进行画图; 
7.5 bandDos能带和态密度共同显示
以应用教程中Si体系的 band.json 和 dos.json 为例子:
(1) 将能带和态密度显示在一张图上:
创建 banddosplot.py 文件,具体代码如下:
 1# 导入pymatgen BSDOSPlotter 画图模块
 2from pymatgen.electronic_structure.plotter import BSDOSPlotter
 3# 导入dspawpy 读取DS-PAW band.json,dos.json模块
 4from dspawpy.io import get_band_data,get_dos_data
 5
 6# 读取dos.json, 参数dos.json文件路径
 7dos_data = get_dos_data("./data/dos.json")
 8# 读取band.json, 参数band.json文件路径
 9band_data = get_band_data("./data/band.json")
10
11bdp = BSDOSPlotter()
12
13# 绘制BandDos图,返回matplotlib.pyplot
14plt = bdp.get_plot(bs=band_data,dos=dos_data)
15
16# 保存png图片
17plt.savefig("banddos.png",img_format="png")
18# 显示图片
19plt.show()
知识点:
- 首先使用 dspawpy.io 中的 get_band_data 和 get_dos_data 模块获取 band.json 和 dos.json 的数据; 
- 之后使用 BSDOSPlotter模块中的 get_plots函数 直接进行画图; 
- 如果需要将投影能带和投影态密度画在一起,可以参考前面单独画图的代码。 
执行代码可以得到以下能带态密度图:
 
7.6 potential势函数数据处理
以Si的slab模型的 potential.json 为例:
(1) 势函数转化为VESTA能够支持的三维显示格式:
创建 trans_VESTA.py 文件,具体代码如下:
1 import json
2 from dspawpy.io import write_VESTA_format
3
4 with open("./potential.json","r") as file:
5       potential= json.load(file)
6
7 write_VESTA_format(potential["AtomInfo"], [potential["Potential"]["TotalElectrostaticPotential"], potential["Potential"]], "DS-PAW.vesta")
- 第1,2行为需要导入的 python 库函数; 
- 第4,5行为需要读取的 json 文件,这里 - ./potential.json指的时读取当前路径下的- potential.json,如果需要读取其他的 json* 文件可以自行修改;
- 第6行为执行 write_VESTA_format 函数,将数据保存为 VESTA 可识别的格式,其中 - potential["AtomInfo"]为读取- potential.json中的晶格及坐标信息, potential["Potential"]["TotalElectrostaticPotential"] 为- potential.json中总的静电势的三维数据, "DS-PAW- potential.vesta" 表示将这些数据写入到 DS-PAW- potential.vesta 文件中;
VESTA展现的效果可以通过设置VESTA中Isosurface level数值来调节,具体步骤为VESTA-properties-Isosurfaces-Isosurface level
知识点:
- 使用 with open语法 加载需要处理的三维网格数据; 
- 使用 write_VESTA_format函数 可以将三维数据保存为VESTA格式的数据,其中 potential["AtomInfo"] 为晶格信息, potential["Potential"]["TotalElectrostaticPotential"] 总的静电势的数据,之后将数据命名为 DS-PAW.vesta ; 
- write_VESTA_format 支持输出多个网格数据,例如想要保存总的和自旋静电势,命令如下:write_VESTA_format(potential["AtomInfo"], [potential["Potential"]["TotalElectrostaticPotential"], potential["Potential"]["SpinElectrostaticPotential"]], " DS-PAW.vesta ") ; 
- 处理部分电荷密度文件pcharge.json时,最后一行代码应可参考write_VESTA_format(pcharge["AtomInfo"], [pcharge["Pcharge"][0]["TotalCharge"]], "DS-PAW-pcharge.vesta")格式,其中[0]对应json文件中第1条待测能带电荷密度的三维数据,若需处理第2条能带该关键词应写作[1]。 
执行代码可以得到VESTA支持的数据,将数据拽入VESTA中得到以下势函数三维图:
 
(2) 将三维势函数进行面内平均:
创建 plot _planar_macroscopic.py 文件,具体代码如下:
 1import json
 2import numpy as np
 3from dspawpy.plot import plot_potential_along_axis
 4
 5with open("./potential.json","r") as file:
 6    potential = json.load(file)
 7
 8grid = potential["AtomInfo"]["Grid"]
 9pot= np.asarray(potential ["Potential"]["TotalElectrostaticPotential"]).reshape(grid,order="F")
10
11plt = plot_potential_along_axis(pot,axis=2,smooth=False)
12plt.legend()
13plt.show()
- 第1,2,3行为需要导入的 python 库函数,这里用到了 dspawpy.io 中的 - plot_potential_along_axis函数;
- 第5,6行为需要读取的 json 文件,这里 - ./potential.json指的时读取当前路径下的- potential.json,如果需要读取其他的 json 文件可以自行修改;
- 第8行为获取grid,其中 potential["AtomInfo"]["Grid"] 为读取 - potential.json中的晶格及坐标信息;
- 第9行为执行 pot 函数,其中 potential["Potential"]["TotalLocalPotential"] 为读取 - potential.json中的局部势能信息,
- 第11行调用 plot_potential_along_axis 函数作图, smooth=False 则不作宏观平均图; 
- 第12行为设置图例; 
- 第13行为显示图片 
知识点:
- 进行面内平均及宏观平均时需要使用到 numpy 的库; 
- DS-PAW软件中三维的数据都是按照一维的格式保存的,因此需要使用 np.asarray函数 将一维数据还原成3维数据; 
- 之后使用 plot_potential_along_axis 将某两个维度进行求平均,之后将剩下的维度数据进行绘图; 
- plot_potential_along_axis的第一个变量为三维格点数据,第二个为沿着某个维度画图,将另外两个维度求平均,第三个参数为是否绘制宏观平均的曲线,第四个参数为宏观平均算法中的权重; 
执行代码可以得到以下势函数图:
 
7.7 elf电子局域密度数据处理
以快速入门Si电子局域密度计算计算得到的 elf.json 为例:
- 在计算目录中新建一个 trans_elf.py 文件,内容如下: 
1 import json
2 from dspawpy.io import write_VESTA_format
3
4 with open("./elf.json","r") as file:
5       elf = json.load(file)
6
7 write_VESTA_format (elf ["AtomInfo"], [elf ["ELF"]["TotalELF"]], "DS-PAW-elf.vesta")
- 第1,2行为需要导入的 python 库函数 
- 第4,5行为需要读取的 json 文件,这里 - ./elf.json指的时读取当前路径下的- elf.json,如果需要读取其他的 json 文件可以自行修改;
- 第7行为执行 write_VESTA_format 函数,将数据保存为 VESTA 可识别的格式,其中 elf["AtomInfo"] 为读取 - elf.json中的晶格及坐标信息, elf ["ELF"]["TotalELF"] 为读取- elf.json中总的局域电荷密度的三维数据, DS-PAW- elf.vesta 表示将这些数据写入到 DS-PAW- elf.vesta 文件中;
- 执行 python trans_ elf.py ; 
- 得到转换后的文件 - DS-PAW-elf.vesta,将其重命名为- elf.vasp以便在 VESTA 显示;
- 将 - elf.vasp文件拖入 VESTA 中则可得到如下的势能图,展现的效果可以通过设置VESTA中 Isosurface level 数值来调节,具体步骤为 VESTA-properties-Isosurfaces-Isosurface level 。
 
7.8 pcharge部分电荷密度数据处理
以快速入门石墨烯部分电荷密度计算得到的 pcharge.json 为例:
- 在计算目录中新建一个 trans_pcharge.py 文件,内容如下: 
1import json
2from dspawpy.io import write_VESTA_format
3
4with open("./pcharge.json","r") as file:
5      pcharge= json.load(file)
6
7write_VESTA_format(pcharge["AtomInfo"], [pcharge["Pcharge"][0]["TotalCharge"]], "DS-PAW-pcharge.vesta")
- 第1,2行为需要导入的 python 库函数 
- 第4,5行为需要读取的 json 文件,这里 - ./pcharge.json指的时读取当前路径下的- pcharge.json,如果需要读取其他的 json 文件可以自行修改;
- 第7行为执行 write_VESTA_format 函数,将数据保存为 VESTA 可识别的格式,其中 pcharge["AtomInfo"] 为读取 - pcharge.json中的晶格及坐标信息, pcharge["Pcharge"][0]["TotalCharge"] 为- pcharge.json中第1条待测能带电荷密度的三维数据,此例中为能带4的数据,若写作 pcharge["Pcharge"][1]["TotalCharge"] 则读取能带5的数据, DS-PAW-pcharge.vesta 表示将这些数据写入到 DS-PAW-pcharge.vesta 文件中;
- 执行 python trans_pcharge.py ; 
- 得到转换后的文件 - DS-PAW-pcharge.vesta,将其重命名为- pcharge.vasp以便在 VESTA 显示;
- 将 - pcharge.vasp文件拖入 VESTA 中则可得到如下的势能图,展现的效果可以通过设置vesta中 Isosurface level 数值来调节,具体步骤为 vesta-properties-Isosurfaces-Isosurface level 。
 
7.9 optical光学性质数据处理
以快速入门Si体系光学性质计算得到的 optical.json 为例:
(1) 反射率数据处理:
创建 optical.py 文件,具体代码如下:
 1import matplotlib.pyplot as plt
 2from dspawpy.plot import plot_optical
 3
 4plot_optical("./optical.json","Reflectance",index=0)
 5
 6plt.xlabel('Photon energy (eV)', fontsize=16)
 7plt.ylabel('Reflectance', fontsize=16)
 8plt.tick_params(labelsize=16)
 9
10plt.savefig("optical.png",img_format="png")
11plt.show()
- 第1,2行为需要导入的 python 库函数;这里用到了 matplotlib 库,以及我们自己写的 dspawpy.plot 中的 plot_optical 模块 
- 第4行调用 plot_optical 处理 - optical.json文件中 Reflectance 部分的数据,其中 Reflectance 为- optical.json文件中的部分数据,这里用户可以根据需要自行修改,若需要处理其他光学性质的数据,可替换该参数为 AbsorptionCoefficient 或 ExtinctionCoefficient 或 RefractiveIndex
- 第6-8行设置x轴y轴的名称以及标签字体大小 
- 第9行为保存图片的名称和格式,这里将数据保存为png格式命名为 optical.png 
- 第10行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将该行注释,之后打开 optical.png 文件查看。 
知识点:
- Reflectance为光学性质中的一种,用户可以根据自己的需求将该关键词修改为“AbsorptionCoefficient”或”ExtinctionCoefficient”或”RefractiveIndex”,分别对应吸收系数、消光系数和折射率; 
执行代码可以得到以下反射率随能量变化的曲线:
 
7.10 neb过渡态计算数据处理
以快速入门Pt体系的过渡态计算得到的 neb.json 为例:
(1) 输入文件之生成中间构型:
创建 neb_structure.py 文件,具体代码如下:
 1from dspawpy.io.structure import from_dspaw_as
 2from dspawpy.diffusion.neb import NEB,write_neb_structures
 3
 4#导入初态构型
 5init_struct = from_dspaw_as("./structure00.as")
 6#导入末态构型
 7final_struct = from_dspaw_as("./structure06.as")
 8
 9#设置插点个数
10neb = NEB(init_struct,final_struct,5)
11structures = neb.idpp_interpolate()
12
13#修改文件夹存储路径
14write_neb_structures(structures,True,"as","./neb")
知识点:
- 用户可以根据需要自行修改插点个数,设置为任意插值的序号即可 
执行代码可以得到包含7个结构文件的文件夹,其中新生成的中间构型为5个。
(2) 过渡态计算数据处理:
创建 neb.py 文件,具体代码如下:
 1import json
 2from pymatgen.core import Structure
 3from pymatgen.io.vasp import Poscar
 4from dspawpy.io.structure import to_file,from_hzw,from_dspaw_as,from_dspaw_atominfo
 5from dspawpy.diffusion.neb import NEB,write_neb_structures,plot_neb_barrier,plot_neb_converge
 6import matplotlib.pyplot as plt
 7
 8plot_neb_barrier("./neb.json")
 9plt.xlabel('Reaction Coordinate',fontsize=16)
10plt.ylabel('Energy (eV)',fontsize=16)
11plt.tick_params(labelsize = 16)
12plt.savefig("neb_reaction_coordinate.png",img_format="png")
13plt.show()
14
15plot_neb_converge("./neb.json","03")
16plt.savefig("neb_ionic_step.png",img_format="png")
17plt.show()
- 第1-6行为需要导入的 python 库函数 
- 第8行为调用 plot_neb_barrier 函数处理 json 文件作反应势垒图,这里 ./neb.json 指的时读取当前路径下的 neb.json 
- 第9-11行设置x轴y轴的名称以及标签字体大小 
- 第12行为保存图片的名称和格式,这里将数据保存为png格式命名为 neb_reaction_coordinate.png 
- 第13行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将该行注释,之后打开 neb_reaction_coordinate.png 文件查看 
- 第15行为调用 plot_neb_converge 函数处理 json 文件作 03 构型的弛豫受力图 
- 第16行为保存图片的名称和格式 
- 第17行为显示图片 
知识点:
- 作能量和力在离子弛豫过程中的变化曲线时,03为处理插入的第3个构型的数据,这里用户可以根据需要自行修改,设置为任意插值的序号即可; 
执行代码可以得到以下能量随反应路径变化曲线:
 
 
7.11 phonon声子计算数据处理
以Au体系的声子能带态密度计算得到的 phonon.json 为例:
(1) 声子能带数据处理:
创建 phonon_bandplot.py 文件,具体代码如下:
 1from pymatgen.phonon.plotter import PhononBSPlotter
 2from dspawpy.io import get_phonon_band_data
 3
 4band_data = get_phonon_band_data("./phonon.json")
 5
 6bsp =  PhononBSPlotter(band_data)
 7plt = bsp.get_plot()
 8
 9plt.savefig("phonon_bandplot.png",img_format="png")
10plt.show()
- 第1、2行为需要导入的 python 库函数,这里用到了pymatgen中的 PhononBSPlotter 库,以及 dspawpy.io 中的 - get_phonon_band_data函数;
- 第4行为读取 - phonon.json文件构造 band_data 这个结构体;
- 第6行为调用 PhononBSPlotter 处理 band_data 数据; 
- 第7行为使用 - bsp下的 get_plot 进行画图;
- 第9行为保存图片的名称和格式,将数据保存为png格式命名为 phonon_bandplot.png ; 
- 第10行为显示图片,如果用户运行的环境无法直接显示图片,用户可以将该行注释,之后打开 phonon_bandplot.png 文件查看。 
执行代码可以得到以下声子能带曲线:
 
(2) 声子态密度数据处理:
创建 phonon_dosplot.py 文件,具体代码如下:
 1from pymatgen.phonon.plotter import PhononDosPlotter
 2from dspawpy.io import get_phonon_dos_data
 3
 4dos = get_phonon_dos_data("phonon.json")
 5
 6dp = PhononDosPlotter()
 7dp.add_dos("Phonon",dos)
 8plt = dp.get_plot()
 9
10plt.savefig("phonon_dosplot.png",img_format="png")
11plt.show()
执行代码可以得到以下声子态密度曲线:
 
7.12 aimd分子动力学模拟数据处理
以快速入门 \(H_{2}O\)  分子体系分子动力学模拟得到的 aimd.json 为例:
(1) 分子动力学模拟数据处理:
创建 aimd2pdb.py 文件,具体代码如下:
1import json
2from dspawpy.io.structure import from_dspaw_atominfos,to_pdb
3
4with open("./aimd.json","r") as file:
5    aimd = json.load(file)
6
7structures = from_dspaw_atominfos(aimd["Structures"])
8to_pdb(structures,"aimd.pdb")
- 第1,2行为需要导入的 python 库函数 
- 第4,5行为需要读取的 json 文件,这里 ./aimd.json 指的是读取当前路径下的 aimd.json ,如果需要读取其他的 json 文件可以自行修改 
- 第7行为调用 from_dspaw_atominfos 处理 structure 的数据 
- 第8行将处理的数据转为 pdb 格式 
执行代码可以得到包含体系原子径向分布信息的文件 aimd.pdb ,得到通用轨迹pdb文件后,就可以利用vmd等分子动力学后处理软件进行分析。 例如VMD中处理RDFs操作步骤:File - New Molecule - browse - open - Load - Extensions - Analysis - Radial Pair Distribution Function g(r) - Selection 1: element H , selction 2: element O - compute g(r)