Lightchaser

三人行,必有我师

QE简介

(1)EPW模块:计算载流子迁移率与超导转变温度。
(2)声子模块:计算电声耦合以及动力学矩阵。
(3)微动弹性带模块:计算化学反应过渡态与反应路径。
(4)开源软件,完全免费多种泛函可供选择,提供外部泛函库(libxc)赝势种类众多,根据需求生成

输入文件

pw.x处理的计算包括以下7种类型,在输入文件中用calculation设置:

‘scf’:自洽计算,self-consistent field,通过迭代的方式数值求解微分-积分方程(Kohn-Sham方程),迭代收敛以电荷的变化足够小为准,最终得到自洽电荷。

‘nscf’:非自洽计算,scf计算常在k空间的网格上进行,网格要足够密以完成k空间上的积分,在DOS等计算需要更密的k
点,这时在自洽电荷基础上,计算这些更多的k
点,nscf计算保持自洽电荷不变。

‘bands’:也是一种nscf计算,k
点按照三维k空间中的特殊路径选取。

‘relax’:一系列scf计算,通过Hellman-Feynman力计算离子坐标驰豫(通过优化算法找到受力为零的结构),relax计算时固定cell不变。

‘vc-relax’: 允许cell变化的relax,通过应力的计算改变cell。

‘md’:分子动力学,将电子对离子的作用看成离子感受到的势,根据势能和离子初始速度求解离子运动的经典力学方程。

‘vc-md’:允许cell改变的md。

pw.x的输入说明见INPUT_PW。注意默认的单位,其中原子单位制为(以下数值见源程序q-e-qe-6.3/Modules/constants.f90):

1
2
1 bohr = 1 a.u. (atomic unit) = 0.52917720859 angstroms.
1 Rydberg (Ry) = 13.60569193 eV

Sym4state Manual

1
CurrentModule = Sym4state.ModCore
pre_and_post
1
2
using PrintFileTree
local pair_mat, coeff_array

bilinear Heisenberg model can be described by

$\mathcal{H} = \sum_{i < j} S_i \cdot \mathcal{J}{i j} \cdot S_j + \sum{i} S_i \cdot \mathcal{A} \cdot S_i - m \sum_{i} S_i \cdot \vec{B}$

where the symbol $\mathcal{J}_{ij}$ denotes the exchange interaction matrix between two spins, $S_i$ and $S_j$, the matrix $\mathcal{A}$ represents the single-ion anisotropy. 四态法计算磁耦合,需要计算4种不同的磁基态,allowing the extraction of individual components for the exchange matrix.

想计算每一个元素的交换矩阵,就需要计算36个能量,由于一些结构的等价性,手动分析对称性筛选很有挑战,而且有遗漏的风险。

Pre-process

One can use our program to streamline the simpilifing and calculating process easily. For example, with a POSCAR file of monolayer CrI3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cr2 I6                                  
1.00000000000000
7.1131374882967124 0.0000000000000000 0.0000000000000000
-3.5565687441483571 6.1601577654763897 0.0000000000000000
0.0000000000000000 0.0000000000000000 18.0635365764484419
Cr I
2 6
Direct
0.6666666666666643 0.3333333333333357 0.5000000247180765
0.3333333333333357 0.6666666666666643 0.5000000501683317
0.6415738047516142 0.9999977877949036 0.4116659127023310
0.3584239830432894 0.3584261952483858 0.4116659127023310
0.0000022122051035 0.6415760169567106 0.4116659127023310
0.3584241488090230 0.9999980859273947 0.5883340783387269
0.6415739371183646 0.6415758511909699 0.5883340783387269
0.0000019140726053 0.3584260628816354 0.5883340783387269

合适设置 INCAR, POTCAR and KPOINTS 用于磁性自洽计算, 可以用 Sym4state.jl 产生所有的输入文件用于计算最近邻交换作用和单离子各向异性,过程如下:

pre_and_post
1
2
3
4
5
6
7
8
using Sym4state
cd("CrI3") do # hide
Sym4state.pre_process(
"./POSCAR",
[24], # Take Cr element as magnetic
5.0 # There exists an interaction between atoms within a distance of 5 Å.
)
end # hide

它将会构建超胞,满足两个任意原子无相互作用。给定的单层 ${CrI3}$ with a cutoff radius of 5 Å, a $2 \times 2 \times 1$ supercell will provide sufficient size. The supercell diagram below labels all the ${Cr}$ atoms:

Within the 5 Å cutoff radius, the monolayer of \ce{CrI3} exhibits two distinct groups of interactions. The first group corresponds to interactions between nearest neighbors, whereas the second group pertains to interactions arising from single-ion anisotropy. It is important to note that all atom pairs within the same group are considered equivalent. This equivalence implies the existence of symmetric operations that can transform one interaction matrix into another, highlighting the underlying symmetry of the system.

pre_process function的输出结果中,1组包含6对等价,第2组有2对等价。尽管简化了计算,还是要计算几种磁结构。 在考虑最近邻情况下,至少计算9个磁基态,相反在处理单离子各向异性需要2个。
不同参数和能量的关系储存在 cal.jld2. 另外该功能会生成几个目录储存对应输入文件。

pre_and_post
1
printfiletree("CrI3")   # hide

所有的目录储存在 cal_list, 后续提交任务即可。 Slurm‘s job array by submitting a shell like:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

#SBATCH -n 144
#SBATCH --array=1-11%2

module load vasp-6.3.2-optcell

target_dir=$(sed -n "${SLURM_ARRAY_TASK_ID}p" cal_dir_list)

cd ${target_dir}

srun vasp_ncl

这个 shell 脚本创建 Slurm job array 计算所有 11 magnetic configurations, while efficiently managing computational resources by allowing a maximum of 2 jobs to run simultaneously.

Post-process

计算完成后 post_process function 提取不同磁结构的能量,最终创建交换矩阵。

pre_and_post
1
2
3
4
5
6
7
8
9
cd("CrI3") do   # hide
global pair_mat, coeff_array # hide
mv("../oszicar.tar.gz", "./oszicar.tar.gz") # hide
run(`tar -xvzf oszicar.tar.gz`) # hide
for (idx, dir_name) in enumerate(readlines("cal_dir_list")) # hide
cp("oszicar/OSZICAR_$(idx)", dir_name * "OSZICAR") # hide
end # hide
pair_mat, coeff_array = Sym4state.post_process("./cal.jld2")
end # hide

我们可以测试 the dimensions of pair_mat and coeff_array, 它分别存储了不同原子对的起始点和结束点的索引及其对应的相互作用矩阵。

pre_and_post
1
2
size(pair_mat)
size(coeff_array)

因此我们看到共有8个相互作用在cutoff radius of 5 Å. 让我们检查pair_mat中的一个特定条目,它包含表示原子对的索引:

pre_and_post
1
pair_mat[:, 1]

初始数字和最终数字分别对应于起点原子和终点原子的指数。第二个和第三个数字表示原始单元格沿x轴和y轴的偏移量。

Monte Carlo Simulation

前面 pair_mat and coeff_array的结果,可以通过 Monte Carlo simulation 计算 phase transition temperature or magnetic texture :

pre_and_post
1
2
3
4
5
6
7
8
9
10
11
using Unitful, UnitfulAtomic
mcconfig = Sym4state.MC.MCConfig{Float32}(
lattice_size=[128, 128],
magmom_vector=[3.5, 3.5],
pair_mat=pair_mat,
interact_coeff_array=coeff_array,
temperature=collect(150:-2:0),
magnetic_field=zeros(3),
equilibration_step_num=100_000,
measuring_step_num=100_000
)

In the aforementioned code snippet, we have configured a simulated annealing simulation, commencing at a temperature of 150 K and progressively reducing it to 0 K in steps of 2 K. The simulation operates on a $128 \times 128$ supercell of ${CrI3}$ using the previously computed interaction matrix. To assess the system, we perform a preliminary equilibration phase consisting of 100000 sweeps, followed by a measurement phase comprising 100000 sweeps for acquiring physical quantities. It is worth noting that the magnetic field is absent, rendering the magmom_vector inconsequential.

With the created mcconfig, one can initiate a Monte Carlo simulation as follows:

1
2
3
4
5
6
7
8
9
10
11
(
states_over_env,
norm_mean_mag_over_env,
susceptibility_over_env,
specific_heat_over_env
) = Sym4state.MC.mcmc(
mcconfig,
backend=Sym4state.MC.CPU()
progress_enabled=false,
log_enabled=false
)

The parameter backend can be configured to employ CUDABackend() provided by CUDA.jl or any other backends supported by KernelAbstractions.jl to enhance performance utilizing the GPU.

The MCConfig can also be stored into a .toml file by:

pre_and_post
1
2
3
cd("CrI3") do   # hide
Sym4state.MC.save_config("CrI3.toml", mcconfig)
end # hide

or it can also be restored by:

pre_and_post
1
2
3
cd("CrI3") do   # hide
mcconfig = Sym4state.MC.load_config("CrI3.toml")
end # hide

Functions

1
2
3
4
reduce_interact_mat_for_a_pair
supercell_check
pre_process
post_process
1
2
rm("CrI3", recursive=true)
nothing

手册

当前模块

Sym4state.ModCore 使用 PrintFileTree 本地 pair_matcoeff_array

对于磁体的磁性特性的理论探索,双线性海森堡模型被证明是表示磁相互作用的有用框架,可以用以下公式描述:
$$
\mathcal{H} = -\sum_{i,j} \mathcal{J}_{ij} \mathbf{S}_i \cdot \mathbf{S}j + \sum{i} \mathcal{A} \mathbf{S}_i^2
$$
其中符号 \mathcal{J}_{ij} 表示两个自旋 S_iS_j 之间的交换相互作用矩阵,矩阵 \mathcal{A} 表示单离子各向异性。为了确定磁相互作用矩阵元素,研究人员通常采用四态方法 1 2 3。该方法涉及计算四种不同的磁配置的能量,从而提取交换矩阵的各个分量。将此方法扩展到交换矩阵的每个元素需要计算总共 36 种能量,以获得完整的矩阵。需要注意的是,由于材料的对称性,一些能量是简并的。尽管如此,进行手动对称分析以简化能量计算的数量仍然是一项具有挑战性的工作,因为存在遗漏或误解某些对称操作的潜在风险。

预处理

可以使用我们的程序轻松简化和计算过程。例如,使用 \ce{CrI3} 的 POSCAR 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Cr2 I6
1.00000000000000
7.11313748829671 0.00000000000000 0.00000000000000
-3.55656874414836 6.16015776547639 0.00000000000000
0.00000000000000 0.00000000000000 18.06353657644844
Cr I2 6
Direct
0.66666666666666 0.33333333333333 0.50000002471808
0.33333333333333 0.66666666666666 0.50000005016833
0.64157380475161 0.99999778779490 0.41166591270233
0.35842398304329 0.35842619524839 0.41166591270233
0.00000221220510 0.64157601695671 0.41166591270233
0.35842414880902 0.99999808592739 0.58833407833873
0.64157393711836 0.64157585119097 0.58833407833873
0.00000191407261 0.35842606288164 0.58833407833873

以及适当设置的 INCAR、POTCAR 和 KPOINTS 文件以进行 SCF 计算,可以简单地使用 Sym4state.jl 生成所有输入文件以计算最近的交换相互作用和单离子各向异性相互作用,如下所示:

1
2
3
4
5
6
using Sym4state
cd("CrI3") do
Sym4state.pre_process("./POSCAR", [24], # 以 Cr 元素作为磁性
5.0 # 存在一个距离为 5 Å 的原子间相互作用
)
end

此函数将利用 supercell_check 方法为提供的结构创建超晶胞。超晶胞应足够大,以确保在指定的截止半径内,任何两个原子之间不超过一个连接。对于给定的 \ce{CrI3} 单层,截止半径为 5 Å,2 \times 2 \times 1 的超晶胞将提供足够的大小。下图标记了所有的 \ce{Cr} 原子:

单层 \ce{CrI3} 的俯视图

在 5 Å 的截止半径内,单层 \ce{CrI3} 显示出两组不同的相互作用。第一组对应于最近邻之间的相互作用,而第二组则涉及单离子各向异性引起的相互作用。需要注意的是,同一组内的所有原子对被视为等效。这种等效性意味着存在对称操作,可以将一个相互作用矩阵转换为另一个,突显了系统的潜在对称性。

根据 pre_process 函数获得的输出,初始组包含 6 对等效的原子对,而第二组则包含 2 对等效的原子对。尽管通过使用对称操作简化涉及各种相互作用矩阵的计算的潜力存在,但仍然有一个特定的相互作用矩阵需要计算最少数量的配置。在最近邻相互作用的情况下,必须计算至少 9 种磁配置的能量。相反,在处理单离子各向异性相互作用时,需要评估至少 2 种磁配置的能量。

该函数将恢复不同能量和配置之间的所有关系到文件 cal.jld2 中。此外,该函数将生成多个目录以存储与各种磁配置相对应的输入文件。

1
printfiletree("CrI3")

所有这些目录的路径存储在文件 cal_list 中,可以使用该文件通过提交如下的 shell 创建 Slurm 的作业数组:

1
2
3
4
5
6
7
#!/bin/sh
#SBATCH -n 144
#SBATCH --array=1-11%2
module load vasp-6.3.2-opt
celltarget_dir=$(sed -n "${SLURM_ARRAY_TASK_ID}p" cal_dir_list)
cd ${target_dir}
srun vasp_ncl

该 shell 脚本旨在创建一个 Slurm 作业数组,以计算所有 11 种磁配置的能量,同时通过允许最多 2 个作业同时运行来有效管理计算资源。

后处理

一旦所有计算都已收敛,可以利用 post_process 函数提取与不同配置相关的能量。此过程最终导致构建相互作用矩阵。

1
2
3
4
5
6
7
8
9
cd("CrI3") do
global pair_mat, coeff_array
mv("../oszicar.tar.gz", "./oszicar.tar.gz") # 隐藏
run(`tar -xvzf oszicar.tar.gz`) # 隐藏
for (idx, dir_name) in enumerate(readlines("cal_dir_list")) # 隐藏
cp("oszicar/OSZICAR_$(idx)", dir_name * "OSZICAR") # 隐藏
end # 隐藏
pair_mat, coeff_array = Sym4state.post_process("./cal.jld2")
end # 隐藏

我们可以检查 pair_matcoeff_array 的维度,这些存储了各种原子对的起始和结束点的索引及其对应的相互作用矩阵。

1
2
size(pair_mat)
size(coeff_array)

因此,我们观察到在 5 Å 的截止半径内存在总共 8 种相互作用。让我们检查 pair_mat 中的一个特定条目,该条目包含表示原子对的索引:

初始和最终数字对应于起始和结束点原子的索引,第二和第三个数字表示沿 x 轴和 y 轴的原始单元的偏移量。

蒙特卡罗模拟

利用前面的结果 pair_matcoeff_array,我们可以设置一个蒙特卡罗模拟的配置,以确定相变温度或磁纹理,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
using Unitful, UnitfulAtomic

mcconfig = Sym4state.MC.MCConfig{Float32}(
lattice_size=[128, 128],
magmom_vector=[3.5, 3.5],
pair_mat=pair_mat,
interact_coeff_array=coeff_array,
temperature=collect(150:-2:0),
magnetic_field=zeros(3),
equilibration_step_num=100_000,
measuring_step_num=100_000
)

在上述代码片段中,我们配置了一个模拟退火模拟,从 150 K 开始,逐渐降低到 0 K,步长为 2 K。模拟在 \ce{CrI3}128 \times 128 超晶胞上运行,使用先前计算的相互作用矩阵。为了评估系统,我们进行初步的平衡阶段,包含 100000 次扫掠,随后是包含 100000 次扫掠的测量阶段,以获取物理量。值得注意的是,磁场缺失,因此 magmom_vector 并不重要。

使用创建的 mcconfig,可以如下启动蒙特卡罗模拟:

1
2
(states_over_env, norm_mean_mag_over_env, susceptibility_over_env, specific_heat_over_env) = 
Sym4state.MC.mcmc(mcconfig, backend=Sym4state.MC.CPU(), progress_enabled=false, log_enabled=false)

参数 backend 可以配置为使用 CUDABackend() 提供的 GPU 加速,或任何其他由 KernelAbstractions.jl 支持的后端,以提高性能。

MCConfig 还可以存储到 .toml 文件中:

1
2
3
cd("CrI3") do
Sym4state.MC.save_config("CrI3.toml", mcconfig)
end # 隐藏

或者也可以通过以下方式恢复:

1
2
3
cd("CrI3") do
mcconfig = Sym4state.MC.load_config("CrI3.toml")
end # 隐藏

函数

  • reduce_interact_mat_for_a_pair
  • supercell_check
  • pre_process
  • post_process
  • rm("CrI3", recursive=true)

参考文献

  1. Xiang, H. J., et al. “Predicting the spin-lattice order of frustrated systems from first principles.” Physical Review B 84.22 (2011): 224429.
  2. Šabani, D., C. Bacaksiz, and M. V. Milošević. “Ab initio methodology for magnetic exchange parameters: Generic four-state energy mapping onto a Heisenberg spin Hamiltonian.” Physical Review B 102.1 (2020): 014457.
  3. Xiang, Hongjun, et al. “Magnetic properties and energy-mapping analysis.” Dalton Transactions 42.4 (2013): 823-853.

SAXIS

默认值: SAXIS = (0, 0, 1)

描述

设置全局自旋量子化轴相对于笛卡尔坐标系的方向。

SAXIS 指定由泡利矩阵生成的自旋子空间的相对方向。默认情况下,SAXIS(0, 0, 1),即自旋量子化轴沿 z 轴方向。

重要性

在包含自旋轨道耦合时(LSORB = True),自旋量子化轴的相对方向与真实空间的关系变得重要。所有由 VASP 写入或读取的磁矩和类自旋量子数都以自旋子空间的基底表示。

坐标系统

坐标系统

图 1. 欧拉角 $\alpha$ 和 $\beta$ 的定义。

默认方向为 $\sigma_1=\hat x$,$\sigma_2=\hat y$,$\sigma_3 = \hat z

Automag

An automatic workflow software for calculating the ground collinear magnetic state of a given structure and for estimating the critical temperature of the magnetically ordered to paramagnetic phase transition.
用于计算共线磁基态的自动工作流程软件,并用于估计磁相变温度。

Installation安装

Automag is meant to be run on a computing cluster. The first step in the installation is to clone the repository
Automag 旨在运行在计算集群上。第一步 installation 是克隆存储库

git clone https://github.com/michelegalasso/automag.git

I assume that you have Python 3 installed on your system, accessible through the python command, with the wheel and the venv packages installed. After cloning, go to the automag directory which has appeared and initialize a Python virtual environment
我假设您的系统上安装了 Python 3,可通过 python 命令,安装了 wheel 和 venv 包。 克隆后,转到已出现的 automag 目录并初始化 Python 虚拟环境

1
2
cd automag
python -m venv .venv

After that, activate your virtual environment. If you are working on an Unix-like system, you can do it with the command
之后,激活您的虚拟环境。如果您正在使用类 Unix 系统,您可以使用命令

source .venv/bin/activate

Finally, you need to install all the necessary Python dependencies for Automag with the command
最后,您需要为 Automag 安装所有必要的 Python 依赖项 使用命令

pip install -r requirements.txt

Before using Automag, make sure that enumlib is installed on your system and that that your command line has access to the commands enum.x and makeStr.py. In addition, Automag needs to know how to use VASP, so you need to edit the file automag/ase/run_vasp.py for Automag to correctly load the MKL and MPI libraries (if needed) and call the vasp_std executable on your system. Then add the following lines to your ~/.bashrc file
在使用 Automag 之前,请确保系统上已安装 enumlib 并且 您的命令行可以访问命令 enum.x 和 makeStr.py。 此外,Automag 需要知道如何使用 VASP,因此您需要编辑文件 automag/ase/run_vasp.py 用于 Automag 正确加载 MKL 和 MPI 库 (如果需要)并调用系统上的 vasp_std 可执行文件。然后添加以下几行添加到您的 ~/.bashrc 文件

1
2
3
4
export PYTHONPATH=/PATH/TO/automag:$PYTHONPATH
export VASP_SCRIPT=/PATH/TO/automag/ase/run_vasp.py
export VASP_PP_PATH=/PATH/TO/pp
export AUTOMAG_PATH=/PATH/TO/automag

obviously replacing /PATH/TO with the actual path to these files or directories. The pp folder is the VASP pseudopotential library and it should contain two subfolders named, respectively, potpaw_LDA and potpaw_PBE.
显然将 /PATH/TO 替换为这些文件或目录的实际路径。 pp 文件夹是 VASP 赝势库,它应该包含两个子文件夹分别命名为 potpaw_LDA 和 potpaw_PBE。

Before starting to use Automag, you should also make sure to have the FireWorks library correctly pointing to a MongoDB database and configured for launching jobs through a queue management system (for more detailed information refer to the FireWorks documentation). Last but not least, open the file automag/common/SubmitFirework.py and edit line 23 with the location of your my_launchpad.yaml file. Now you are ready to use Automag.
在开始使用 Automag 之前,您还应该确保拥有 FireWorks 库正确指向 MongoDB 数据库并配置为启动作业(有关更多详细信息,请参阅 添加到 FireWorks 文档)。最后打开文件 automag/common/SubmitFirework.py 并编辑第 23 行编辑 my_launchpad.yaml 文件。现在,您可以开始使用 Automag。

Convergence tests收敛测试

When studying a magnetic structure, you may want to start from convergence tests. Automag allows you to check for convergence of the VASP parameter ENCUT, which is the energy cut-off of the plane wave basis set, and to simultaneously check for convergence of the two parameters SIGMA and kpts, which are the electronic smearing parameter and the k-mesh resolution parameter for Brillouin zone sampling, respectively.
在研究磁性结构时,您可能希望从收敛测试开始。 Automag 允许您检查 VASP 参数 ENCUT 的收敛性,该参数是平面波基组的能量截止,并同时检查 SIGMA 和 kpts 这两个参数的收敛,它们是电子的用于布里渊区采样的涂抹参数和 k-mesh 分辨率参数, 分别。

In order to run convergence tests, go to the folder 0_conv_tests and insert the following input parameters in the file input.py:
要运行收敛测试,请转到文件夹 0_conv_tests 并插入文件 input.py 中的以下输入参数:

  • mode can be “encut” for convergence tests with respect to ENCUT or “kgrid” for convergence tests with respect to SIGMA and kpts;
    mode可以是 “ENCUT” 用于关于 ENCUT 或 “kgrid” 的收敛测试 用于 SIGMA 和 kpts 的收敛测试;

  • poscar_file is the name of the file in POSCAR format which contains the input geometry and which has been put in the folder automag/geometries;
    poscar_file 是包含输入的 POSCAR 格式文件的名称 geometry 的 ,并且已放入文件夹 automag/geometries;

  • params is a collection of VASP parameters to be used during single-point energy calculations.
    params 是要在单点期间使用的 VASP 参数的集合 能量计算。
    In addition, the following optional parameters can be specified:
    此外,还可以指定以下可选参数:

  • magnetic_atoms contains the atomic types to be considered magnetic (defaults to transition metals);
    magnetic_atoms 包含要被视为磁性的原子类型(默认值 过渡到过渡金属);

  • configuration is the magnetic configuration to use for convergence tests (defaults to ferromagnetic high-spin);
    configuration 是用于收敛测试的磁性配置 (默认为铁磁高自旋);

  • encut_values contains the trial values for ENCUT (defaults to the interval [500, 1000] eV at steps of 10 eV);
    encut_values 包含 ENCUT 的 trial 值(默认为区间 [500, 1000] eV,步长为 10 eV);

  • sigma_values contains the trial values for SIGMA (defaults to the interval [0.05, 0.20] eV at steps of 0.05 eV);
    sigma_values包含 SIGMA 的试验值(默认为区间 [0.05, 0.20] eV,步长为 0.05 eV);

  • kpts_values contains the trial values for kpts (defaults to the interval [20, 100] A^-1 at steps of 10 A^-1).
    kpts_values 包含 kpts 的试验值(默认为区间 [20, 100]A^-1 以 10 A^-1 为步长)。
    Once you have inserted the input parameters in the file input.py, launch the script 1_submit.py using the python executable of your virtual environment and a number of workflows containing single-point VASP calculations will be saved in your remote database. These calculations need to be run in a separate directory called CalcFold. You can enter it and then submit the jobs with the following commands, being in the automag directory
    在文件 input.py 中插入输入参数后,启动使用虚拟环境的 python 可执行文件1_submit.py,以及 许多包含单点 VASP 计算的工作流将保存在您的远程数据库。这些计算需要在单独的目录中运行 称为 CalcFold。您可以输入它,然后使用以下内容提交作业 命令, 位于 automag 目录中

    1
    2
    cd CalcFold
    nohup qlaunch -r rapidfire -m 10 --nlaunches=infinite &

    This will enter the directory CalcFold and it will invoke the qlaunch command in the background, which constantly checks for new calculations in the remote database and submits them to the queue management system of your cluster. The command line option -m 10 means that qlaunch will allow a maximum number of 10 jobs to be in the queue of your system at the same time. If 10 or more jobs are waiting or running in your queue, qlaunch will not submit more jobs until their total number becomes less than 10. If you wish, you can change this parameter to a different number. In the following, I assume that the qlaunch process is always working in the background.
    这将进入 CalcFold 目录,并将调用 qlaunch 命令,该命令会不断检查 remote 数据库,并将其提交到集群的队列管理系统。 命令行选项 -m 10 表示 qlaunch 将允许最大数量 的 10 个作业同时位于您的系统队列中。如果 10 或更多作业正在等待或正在您的队列中运行,qlaunch 不会提交更多作业 直到它们的总数小于 10。如果您愿意,您可以更改此 参数设置为不同的数字。在下文中,我假设 qlaunch 进程始终在后台运行。

After all calculations have been completed, you can launch the script named 2_plot_results.py in the 0_conv_tests folder. It will read the output file that Automag wrote in CalcFold and it will produce a plot of the parameters under study versus energy. In addition, the script will also print on screen the values of the parameters under study for which the error in energy is less than 1 meV/atom with respect to the most accurate result.
完成所有计算后,您可以启动名为 2_plot_results.py 0_conv_tests 文件夹中。它将读取输出文件 Automag 在 CalcFold 中写入的,它将生成参数图 正在研究与能源。此外,脚本还将在屏幕上打印能量误差小于 1 meV/atom 相对于最准确的结果。

Calculation of the electronic correlation parameter U by linear response通过线性响应计算电子相关参数 U

The linear response formalism for the calculation of the Hubbard U is based on the application of a series of small perturbations to the first magnetic atom. During the whole process, the perturbed atom must be treated independently from the other atoms of the same species, and we achieve this using a simple trick: we change the chemical identity of the atom to which we want to apply perturbations to a dummy atomic species, but we place the POTCAR file of the original atomic species in the pp folder corresponding to the dummy atom. For example, if we are calculating the value of the Hubbard U for Fe in the system Fe12O18 and we choose Zn as dummy atom, we need to ensure that the same POTCAR file of Fe is used also for Zn in order to have, instead of Zn, a Fe atom that is treated independently from the others. This can be achieved with the following commands
用于计算 Hubbard U 的线性响应形式基于对第一个磁性原子施加一系列小扰动。 在整个过程中,必须独立于同一物种的其他原子,我们用一个简单的技巧来实现这一点:我们更改我们要施加扰动的原子的化学性质添加到虚拟原子种类中,但我们将原始原子的 POTCAR 文件物种。例如,如果我们是 计算系统 Fe12O18 中 Fe 的哈伯德 U 值,我们选择 Zn 作为虚拟原子,我们需要确保也使用相同的 Fe 的 POTCAR 文件 对于 Zn,以便有一个独立处理的 Fe 原子,而不是 Zn 从其他人那里。这可以通过以下命令来实现

1
2
3
cd $VASP_PP_PATH/potpaw_PBE/Zn
mv POTCAR _POTCAR
cp ../Fe/POTCAR .

In this way the Automag code, and in particular the ASE library, will treat the system as if it was ZnFe11O18, but when they will look for the POTCAR file in the Zn folder, they will find the POTCAR of Fe, so the system will remain Fe12O18. Before launching this calculation, go to the directory 1_lin_response and set the necessary parameters in the file input.py:
通过这种方式,Automag 代码,特别是 ASE 库,将处理系统,就好像它是 ZnFe11O18 一样,但是当他们将在 Zn 文件夹中,他们会找到 Fe 的 POTCAR,因此系统将保持 Fe12O18。 在启动此计算之前,请转到目录 1_lin_response 并设置 文件中的必要参数 input.py:

  • poscar_file is the name of the file in POSCAR format which contains the input geometry and which has been put in the folder automag/geometries;
    poscar_file 是包含输入的 POSCAR 格式文件的名称 geometry 的 ,并且已放入文件夹 automag/geometries;
  • dummy_atom is the name of the dummy atomic species to use for the atom which is subject to perturbations (do not forget to manually put the right POTCAR file in the pp folder for this atom);
    dummy_atom 是用于原子的虚拟原子种类的名称,其中 会受到干扰(不要忘记手动放置正确的 POTCAR 文件 在此原子的 pp 文件夹中);
  • dummy_position is the position of the dummy atom in your POSCAR file (from 0 to N - 1, where N is the number of atoms in the unit cell);
    dummy_position 是虚拟原子在 POSCAR 文件中的位置(从 0 到 N - 1,其中 N 是晶胞中的原子数);
  • perturbations contains the values of the perturbations to apply to the chosen atom in eV;
    perturbations 包含要应用于所选 原子在 eV 中;
    params is a collection of VASP parameters to be used during * single-point energy calculations.
    params 是要在单点期间使用的 VASP 参数的集合能量计算。

In addition, the following optional parameters can be specified:
此外,还可以指定以下可选参数:

  • magnetic_atoms contains the atomic types to be considered magnetic (defaults to transition metals);
    magnetic_atoms 包含要被视为磁性的原子类型(默认值 过渡到过渡金属);
  • configuration is the magnetic configuration to use for U calculation (defaults to ferromagnetic high-spin).
    configuration 是用于 U 计算的磁性配置(默认值 到铁磁高自旋)。

Once the input parameters have been inserted in the file input.py, you can launch the script 1_submit.py in order to save the necessary VASP jobs to the remote database. You will see that the instance of qlaunch which is running in the background will immediately send these jobs to the queue management system of your cluster. When all calculations are completed, you will find in CalcFold the file charges.txt, containing the amount of electrons on the partially occupied shell of the chosen atom for each value of the applied perturbation, for both the selfconsistent and the non-selfconsistent runs. Now you can execute the script 2_plot_results.py, which will plot the selfconsistent and the non-selfconsistent responses, it will interpolate them as straight lines to the least squares and it will calculate their slopes. The value of U is obtained from U = 1/X - 1/X0, where X and X0 are the selfconsistent and the non-selfconsistent slopes, respectively.
将输入参数插入文件 input.py 后,您可以 启动脚本1_submit.py,以便将必要的 VASP 作业保存到 远程数据库。您将看到在 后台会立即将这些作业发送到队列管理系统 的集群。完成所有计算后,您将在 CalcFold 中找到 该文件charges.txt,其中包含部分 所选原子的占用壳,用于施加扰动的每个值, 对于自洽和非自洽游程。现在您可以执行 脚本2_plot_results.py,它将绘制 selfconsistent 和 nonself-align 响应,它会将它们作为直线插入到 最小二乘法,它将计算它们的斜率。U 的值由 U = 1/X - 1/X0,其中 X 和 X0 是自洽和非自洽 slopes 的 Slope 值。

Search for the most stable magnetic state寻找最稳定的磁态

The search for the ground collinear magnetic state consists in generating a number of trial configurations and in computing their single-point energy, in order to determine which is the most thermodynamically stable. The trial configurations differ from each other only by the choice of the unit cell and by the initialization of the magnetic moments. Note that the value of the magnetic moment on each atom can change during the single-point energy calculation. Automag generates trial configurations by separately initializing each Wyckoff position occupied by magnetic atoms in a ferromagnetic (FM), antiferromagnetic (AFM) or non magnetic (NM) fashion, taking into account all possible combinations. A completely non-magnetic (NM) configuration is also generated. In this way, overall ferrimagnetic (FiM) states are allowed if the magnetic atoms occupy more than one Wyckoff position. For each magnetic atom, one or two absolute values for the magnetization can be given in input. In the first case, the given value is used for initializing all the spin-up and spin-down states in the configurations generated by Automag. Conversely, if two separate values are given for high-spin (HS) and low-spin (LS) states, then each Wyckoff position occupied by that magnetic atom is separately initialized in a HS or LS fashion, taking into account all possible combinations. In order to run such a calculation, go to the directory 2_coll and set the necessary input parameters in the file input.py:
对共线磁基态的搜索包括生成一个 试验配置的数量和计算它们的单点能量,在 order 来确定哪个是最热力学稳定的。审判 配置彼此之间唯一的区别在于晶胞的选择和 磁矩的初始化。请注意,磁性 在单点能量计算过程中,每个原子上的矩都会发生变化。 Automag 通过单独初始化每个 Wyckoff 来生成试验配置 铁磁 (FM) 中磁性原子占据的位置, 反铁磁 (AFM) 或非磁性 (NM) 方式,同时考虑所有可能的组合。 还会生成完全无磁性 (NM) 配置。这样, 如果磁性原子占据更多,则允许整体亚铁磁性 (FiM) 状态 比一个 Wyckoff 位置。对于每个磁性原子,一个或两个 磁化强度可以在 input 中给出。在第一种情况下,给定值为 用于初始化配置中的所有 spin-up 和 spin-down 状态 由 Automag 生成。相反,如果为 high-spin 给定两个单独的值 (HS) 和低自旋 (LS) 状态,则每个 Wyckoff 位置都由该 磁性原子以 HS 或 LS 方式单独初始化,同时考虑到 所有可能的组合。要运行此类计算,请转到目录 2_coll并设置必要的输入参数:

poscar_file is the name of the file in POSCAR format which contains the input geometry and which has been put in the folder automag/geometries;
poscar_file 是包含输入的 POSCAR 格式文件的名称 geometry 的 ,并且已放入文件夹 automag/geometries;
supercell_size is the maximum supercell size for generating distinct magnetic configurations, in multiples of the input structure;
supercell_size 是产生不同磁性元件的最大超级单元大小 配置,以输入结构的倍数;
spin_values a maximum of two values (HS and LS) of the magnetization in Bohr magnetons for each magnetic atom, used to initialize spin-up and spin-down states;
spin_values玻尔的磁化强度最多两个值(HS 和 LS) 每个磁性原子的磁子,用于初始化自旋上升和自旋下降状态;
params is a collection of VASP parameters to be used during single-point energy calculations.
params 是要在单点期间使用的 VASP 参数的集合 能量计算。
In addition, the following optional parameter can be specified:
此外,还可以指定以下可选参数:

lower_cutoff is the minimum value in Bohr magnetons to which a magnetic moment can fall in order for the corresponding configuration to be used for estimating the critical temperature of the material (defaults to zero).
lower_cutoff 是磁矩达到的玻尔磁子的最小值 可以进行 材料的临界温度(默认为零)。
Once the input parameters have been inserted in the file input.py, you can launch the script 1_submit.py in order to save the necessary VASP jobs to the remote database. The running instance of qlaunch will send these jobs to the queue management system of your cluster. Once all calculations have been completed, you can launch the script 2_plot_results.py which will produce a number of files containing the histogram plot of the obtained energies for all trial configurations that successfully completed the single-point energy calculation. The script also prints on screen the name of the configuration with lowest energy.
将输入参数插入文件 input.py 后,您可以 启动脚本1_submit.py,以便将必要的 VASP 作业保存到 远程数据库。正在运行的 qlaunch 实例会将这些作业发送到 集群的队列管理系统。一旦所有计算都已完成 complete,您可以启动脚本2_plot_results.py,这将生成一个 包含所有所得能量的直方图的文件数 成功完成单点能量的 Trial 配置 计算。该脚本还会在屏幕上打印配置的名称 以最低的能量。

Calculation of the critical temperature
临界温度的计算
Automag can calculate the critical temperature of the magnetically ordered to paramagnetic phase transition from a Monte Carlo simulation of the effective Hamiltonian which describes the magnetic interaction. Automag computes the coupling constants of the corresponding Heisenberg model and provides all the necessary input files to run the Monte Carlo simulation with the VAMPIRE software package. The simulation itself needs to be run by the user, while Automag can be used to plot and to fit the results. The accuracy of the Heisenberg model is evaluated by computing the Pearson Correlation Coefficient (PCC) between the DFT energies and the predicted energies of a control group of magnetic configurations. It is worth noting that this approach can be applied only if all magnetic atoms have the same absolute value of the magnetization. In order to estimate the critical temperature with Automag, go to the folder 3_monte_carlo and set the necessary parameters in the file input.py:
Automag 可以计算出磁力排序的临界温度 顺磁相变来自蒙特卡洛模拟的有效 描述磁相互作用的哈密顿量。Automag 计算 耦合常量,并提供所有 使用 VAMPIRE 软件运行 Monte Carlo 模拟所需的输入文件 包。仿真本身需要由用户运行,而 Automag 可以 用于绘制和拟合结果。海森堡模型的精度为 通过计算 DFT 能量和磁控制组的预测能量 配置。值得注意的是,只有在所有 磁性原子具有相同的磁化绝对值。为了 使用 Automag 估计临界温度,转到 3_monte_carlo 并在 file input.py 中设置必要的参数:

configuration is the name of the magnetic configuration to use for the Monte Carlo simulation (usually you want to put here the name of the configuration with lowest energy, obtained at the previous step);
configuration 是用于 Monte 的磁性配置的名称 Carlo 模拟(通常您希望在此处使用 最低能量,在上一步获得);
cutoff_radius is the maximum distance between two magnetic atoms to be considered as interacting neighbors;
cutoff_radius 是两个磁性原子之间的最大距离 被视为互动邻居;
control_group_size is the relative size of the control group used to evaluate the accuracy of the Heisenberg model;
control_group_size 是用于评估的对照组的相对大小 海森堡模型的准确性;
append_coupling_constants is a boolean flag which tells Automag whether or not to append the computed values of the coupling constants to the file input.py, which are needed by the script 2_write_vampire_ucf.py.
append_coupling_constants 是一个布尔标志,它告诉 Automag 是否 要将耦合常量的计算值附加到文件 input.py, 脚本2_write_vampire_ucf.py需要。
In addition, the following optional parameter can be specified:
此外,还可以指定以下可选参数:

magnetic_atoms contains the atomic types to be considered magnetic (defaults to transition metals).
magnetic_atoms 包含要被视为磁性的原子类型(默认值 过渡到过渡金属)。
Once the input parameters have been inserted in the file input.py, you can launch the script 1_coupling_constants.py. It will compute the coupling constants for the given cutoff radius and it will print their values on screen. In addition, it will create a file model.png, which contains a plot of the Heisenberg model energies versus the DFT energies for all the configurations in the control group. The values of the distances between neighbors, the amounts of neighboring pairs of magnetic atoms in the unit cell at each distance and the value of the PCC are also printed on screen.
将输入参数插入文件 input.py 后,您可以 1_coupling_constants.py启动脚本。它将计算耦合 常量,它将在屏幕上打印它们的值。 此外,它还将创建一个文件model.png,其中包含 海森堡模型能量与 DFT 能量的关系 Control 组。相邻要素之间的距离值、 晶胞中每个距离处的相邻磁原子对和 PCC 的值也打印在屏幕上。

We suggest to run the script 1_coupling_constants.py a couple of times with the append_coupling_constants flag set to False and with different values of the cutoff_radius, in order to investigate how many neighbors you need to include for obtaining a well-converged Heisenberg model. Once you are satisfied with the model’s accuracy, run the script a last time with the append_coupling_constants flag set to True and Automag will append the values of the coupling constants and the distances between neighbors to the file input.py. Now you are ready to run the script 2_write_vampire_ucf.py, which will read the file input.py and will produce a VAMPIRE unit cell file vamp.ucf. Now you can run VAMPIRE on your cluster using the unit cell file written by Automag, an input file and a material file specific for your problem. Automag contains a sample input file and a sample material file in the folder 3_monte_carlo/vampire_input, which can be simply edited and adapted to the problem under study. Once the VAMPIRE run is done, you can copy the output file in the folder 3_monte_carlo and run the last script 3_plot_results.py. It will produce a plot of the mean magnetization length (of the spin-up channel for antiferromagnetic materials) versus temperature obtained from the Monte Carlo simulation and it will fit the data using the analytical expression of the mean magnetization length, obtaining the values of the critical temperature and of the critical exponent. The fitted values of these two parameters are printed on screen.
1_coupling_constants.py我们建议使用 append_coupling_constants标志设置为 False,并且 cutoff_radius,为了调查您需要包含多少个邻居 获得收敛良好的 Heisenberg 模型。一旦您对 model 的 accuracy 时,请使用 append_coupling_constants flag 设置为 True 将附加耦合常量的值 以及 input.py 的邻居之间的距离。现在您已准备好 运行脚本 2_write_vampire_ucf.py,它将读取文件 input.py 将生成一个 VAMPIRE 晶胞文件 vamp.ucf。现在,您可以在 使用 Automag 编写的晶胞文件、输入文件和材质的簇 特定于您的问题的文件。Automag 包含一个样本输入文件和一个样本 material 文件,可以是 3_monte_carlo/vampire_input 文件夹中,也可以是简单的 编辑并改编了正在研究的问题。VAMPIRE 运行完成后,您 可以复制 3_monte_carlo 文件夹中output文件并运行最后一个脚本 3_plot_results.py。它将生成平均磁化长度 (的 反铁磁材料的自旋向上通道)与温度的关系 来自 Monte Carlo 模拟,它将使用分析来拟合数据 平均磁化长度的表达式,得到临界 温度和临界指数。这两个的拟合值 参数打印在屏幕上。

vasp磁性参数

设置ISPIN和MAGMOM参数,详见vasp官网。关闭对称性:ISYM=0.一般有的采用先做非磁结构优化,再打开自旋和磁性设置做磁基态计算。确定磁性体系可以直接做磁性计算。磁性计算一般属于过渡金属,要进行DFT+U计算。对于考虑LDAU的情况一般推荐增加参数 LMAXMIX。

INCAR中的参数设置:

1
2
3
4
5
6
7
LORBIT = 11
LDAU = .TRUE. 打开LDAU
LDAUTYPE =2 LDAU类型LDAUTYPE=2: 只考虑U-J的值;LDAUTYPE=1: 同时考虑U和J,J基本为常数1 eV
LDAUL = 2 -1 库伦排斥的轨道
LDAUU = 2.8 0 库伦排斥的大小
LDAUJ = 0 0 stoner 交换参数大小
LMAXMIX = 4 mix轨道

如果进行非线性计算,LNONCOLLINEAR = .TRUE. MAGMOM = x y z . . . … 可以读前一步的CHGCAR,进行非线性自洽计算(不用结构优化),也可以直接进行非线性计算。为了避免以上报错,增
加mix参数:

1
2
3
4
5
LMAXMIX = 4
AMIX = 0.2
BMIX = 0.00001
AMIX_MAG = 0.8
BMIX_MAG = 0.00001

提交任务要使用vasp_ncl版本的程序

自旋轨道耦合
默认 SAXIS = 0 0 1
加入磁矩参数
MAGMOM = x y z … …

一般接口wannier90还需要
ISYM=-1
NPAR =1 或者将这个开关删除
##

铁磁半导体相对好收敛,遇到不收敛问题,可尝试降低 AMIX,增加 BMIX
尝试更换不同的ISMEAR,比如加电场时,会遇到矩阵不厄密。
call to ZHEGV failed 问题可能是

  1. 结构不合理
  2. 优化时优化到一个不合理的结构: 尝试改变弛豫算法IBRION ,减小步长POTIM = 0.1或者更小
  3. 对角化算法不稳定 : ALGO = Normal/Fast
  4. 尝试关掉对称性

磁基态

得出体系的具体磁基态:比较三个计算无磁,铁磁,反铁磁的能量,能量更低的为体系的磁基态。构建不同磁基态有可能需要扩胞。

得出体系原子的具体磁矩:用vi编辑器打开OUTCAR或其他方式打开,从最后往前翻动,第一个magnetization (x)开头的表格就是原子的磁矩大小。需要打开LORBIT=11

磁矩分布画图:使用chgsplit.sh(可以向组内师兄师姐寻找)。磁性测试输出CHGCAR后,运行命令./chgsplit.sh CHGCAR得到cf1和cf2文件,把cf2文件重命名为CHGCAR-mag,与CONTCAR一起拖入VESTA中画图即可。

磁耦合

对于磁性体系的第一性原理计算结果,能量部分可以分
为两个部分E = E_0 (非磁项) + E_s (磁性相关能量)
对比磁性耦合产生的能量,不能够用磁性态的能量跟非
磁的去对比
E_s 包含交换耦合以及单离子各向异性能(SOC)
一般来说,磁性相关的能量可以用下面的公式来表示

  1. 磁性态的构造
    为了求磁耦合强度,我们需要构造出不同磁构型哈密顿,通过求解这些哈密顿方程
    组来得到磁耦合参数。例如对于一个体系,我们需要求解最近邻J1和次
    近邻J2,那么体系能量中有三个未知量H0, J1, J2。这样我们需要构造三个线性独立的方程来求解。
    磁耦合参数

四态法

接下来,我们以一个例子来看四态法
是如何用来求磁耦合的。

  1. 构建超胞
    这里我们以二维六角晶格为例,原胞
    中有两个磁性原子,我们构建一个
    881的超胞,目标是求下图中A、B
    之间的磁耦合作用。
    构建四个磁性态 ,分别

    其中第一项是DFT中的非磁项,联立这四个方程组就
    可以求解
    注意这里的超胞大小,只要满足这个8*8的超胞里的A、
    B与周期外的A、B格点之间没有作用或者作用可忽略就
    可以。

单离子各向异性,对于沿Z轴具有三重四重六重旋转对称性的体系,只需要计算一个Azz − Axx 。

居里温度

对于铁磁有序材料,当温度达到某一临界值之后,在没有外磁场的情况下,材料会变成
顺磁态,这个温度点便是居里温度(Curie temperature: Tc)
铁磁是一种铁性材料,所谓铁磁是指在外场作用下,极化随着外场的翻转会有一个滞后,
自旋极化随着外场的变化曲线形成磁滞回线。对于反铁磁有序材料,当温度达到某一临界值之后,在没有外磁场的情况下,材料同样会变成
顺磁态,这个温度点便是奈尔温度(Neel temperature: TN)

对于反铁磁有序材料,一般可以使用测试磁化率来判断其相变温度,磁化率满足居里外斯定律

  1. 平均场近似
  2. 自旋波方法详细推导见文件夹mean-field-theory
  3. Monte Carlo方法

居里温度的Monte Carlo 模拟

  1. 撒点,给初始磁矩
  2. 计算哈密顿
    3 尝试随机反转一个格点的磁矩,计算能量
    4判断,如果能量变低,则翻转,如果能量变高,那么
    如果 则翻转,否则不翻转
    5 先进行充足的MC步骤至平衡,然后在进行充足的步骤采样,取平均磁矩。
    每一个温度点做一次1-5步骤,即每一个温度点有一个平均磁矩,磁矩下降最快的点(斜率绝对值最大)即为
    居里温度。
    反铁磁需要计算奈尔温度,那么平均磁矩会一直是0,有两种办法,算其中一个格点的平均磁矩,或者看磁比

mcsolver计算XY模型的一个例子。

在学习的过程中,我发现参数设置非常重要,也比较难,但网上并没有给出一个详细的教程说明,结合网上已有说明和朋友讨论,以下给出我的一点见解,希望大家相互讨论学习,有错误欢迎批评指正。

1.lattice晶格常数

关于晶格常数的设置,这步比较简单。

晶格常数需要采用归一化后的晶格常数,a1、a2、a3分别归一化,例如a1=(3,4,0)归一化后就是(0.6,0.8,0)。

sc(supercell)表示使用的超胞规模,一般情况下尽可能的大,例如16161或32321(在二维情况下)。

2.Orbital list

这一步是对原胞中不等价磁性原子的设置。

ID是对设置的原子的编号,在可视化界面中,这一项不用手动设置,程序会自动根据我们的设置进行从0开始的编号。

type表示原胞中磁性原子的种类,根据具体情况进行设置,如果只有一种磁性原子,都设置成0就可以。

init spin表示自旋磁矩的设置,比如你用VASP计算出来得到的磁矩是3,那么这一项需要设置为1.5(需要除以一个2,换算成玻尔磁子)。

pos对磁性原子的位置坐标进行设置,这里最好是采用分数坐标(如果是笛卡尔坐标建议转换成分数坐标进行计算)。(更正:应该是相对于a1、a2、a3的分数坐标,也就是相对于斜的平行四边形的而言的,以其两条邻边为晶格矢量,例如CrI3是0.333 0.666667 0,如果是直角坐标系下的分数坐标的话第一个值应该是负的才对)

Ani表示单离子在xyz方向上的各向异性系数或单离子磁晶各向异性能(在Ising模型中是无用的,在XY模型中只使用前两个)。对自己的结构做一个易磁化轴位置的判断。一般为Z方向就在DZ处添加。同时,注意各向异性的单位是开尔文。 (1meV=11.604609K)

至此,我们已经完成了第二步Orbital list的设置。

3.Bond list

设置第二步里面的磁性原子之间的交换耦合系数,在你的计算中,一共考虑到了多少个相互作用就要添加多少个。比如,对于CrI3来说,考虑到了最近邻、次近邻和第三近邻相互作用,分别有3个、6个和3个,那么你一共就需要添加12条信息。

对于每一项来说,设置方法如下:

ID是相互作用的编号,如同第二步一样,系统会从0开始自动编号。

J是磁性原子之间的交换耦合系数,一个J有九个矩阵元素,分别包括Jxx、Jyy、Jzz、Jxy、Jxz、Jyz、Jyx、Jzx、Jzy。每个元素描述了自旋的两个分量之间的耦合。对于Ising模型,由于只考虑一维自选变数,即只存在自旋向上或自旋向下,因此只使用第一个元素Jxx。对于XY模型也一样,自旋的朝向由up和down解放到了XY平面的任意朝向,因此只使用Jxx、Jyy、Jxy、Jyz。而对于heisenberg模型来说,三个自旋方向都存在相互作用,因此Jxx、Jyy、Jzz、Jxy、Jxz、Jyz、Jyx、Jzx、Jzy九个矩阵元素都需要设置。(对于模型的设置在后面的Model处进行选择。)对于前Ising和XY模型来说,即便你设置了九个矩阵元素,有效输入的也只是对应的起作用的元素,因此选好模型很关键。

s,t和over lat.表示我们考虑哪两个磁性原子之间的相互作用,s和t要选择我们在第二步中设置的原胞中磁性原子的ID,over lat.的三个元素指代一个晶格矢量,这个晶格矢量表示:在晶格中,你考虑的原子(在该中心原胞平移该晶格矢量后的原胞的t原子),和中心s原子之间的相互作用。(这里比较难,为了便于理解,建议读者找个例子琢磨琢磨或者自己多动手尝试一下)

注意所有的能量单位都是开尔文(1meV=11.604609K)

至此,我们已经完成了第三步Bond list的设置。

现在,我们可以在Structure viewer里面看到超胞里磁性原子的分布和相互作用示意图。大家可以根据右上角的图查看自己添加的是否正确。一定要多加尝试。

4.Other settings其他设置

关于一些其他参数的设置。

T start&end表示起始和结束温度,也就是温度的取值范围,total points表示温度插值次数(用于温度扫描),也就是总取点数,一般来说点越多图形越精确。示例给出的0.9,1.2和8只是为了快速计算得到结果,真实输入的时候要视实际情况而定。

同理,H start&end表示外加磁场的取值范围,total points表示采样次数(用于磁场扫描)。

nthermal是使系统进入平衡状态的总步骤,nsweep是测量所涉及的总步骤,tau表示每一步的MC更新。

xAxis表示右边Result viewer的x轴上的物理量,可以是T(表示M-T曲线)或H(表示迟滞回线)。

Model可以选择Ising模型、XY模型或Heisenberg模型。

Algorithm选择相应的算法(支持Wolff,Metropolis,Swedsen-Wang)。

Measure corr. si&sj设置spin_i和spin_j以及它们之间的晶格矢量,用于相关拼接。(如果spin_i=spin_j并且overLat=0 0 0,那么你将得到spin_i的磁化率)。

nFrame是输出自旋构型的数目,用于说明在平衡或非平衡状态下的自旋构型。

core设置并行计算的核心资源。

至此,所有参数都设置完毕。

5.最后

save可以选择保存当前参数到文件,以便下一次找到。

单击StartMC启动计算。

等待右面板中的关系图更新。之后,你可以在mcsolver的根目录下找到一个result.txt文件,其中有许多有用的信息,包括平均自旋(在步骤5中定义的spin_i和j上),spin_i和j之间的相关性,内能,比热容量和Binder累积量U4等。如果你处理有多个核心的模拟,那么结果可能不会根据温度排序,但是,每一行的对应关系都是可以的。

原文链接:https://blog.csdn.net/qq_46679797/article/details/134455309

MAE

磁晶各向异性 magnetic anisotropic energy (MAE) 是指自旋方向在不同方向上的能量差。MAE跟体系对称性有关。
对于简单体二维系,易磁化轴可能在面内或者垂直于面,我们可以选择计算不同方向的某一磁性态能量对比来求MAE
比如CrI3, 我们可以计算沿着x方向的FM能量Ex,然后计算沿着z方向的FM能量Ez。
MAE = (Ex -Ez)/2
对于对称性较低的体系,需要每个面去计算MAE。在vasp中,三维体系研究MAE,可以在高对称轴上算能量差

三步:结构优化,共线计算磁性并输出CHGCAR,读取CHGCAR改为非线性计算不同方向的能量。

晶体磁各向异性能量由按不同方向旋转所有自旋决定。首先,必须在基态下进行精确(PREC=精确,LREAL=.False.)共线计算(使用vasp_std版本)。接下来,考虑自旋轨道耦合(LSORBIT=.True.,使用vasp_ncl版本)对几种自旋取向进行非自洽计算(ICHARG=11)。在大多数情况下,能量变化非常小(有时约为微电子伏)。与共线相比,必须将NBANDS加倍。

为了修改晶体中自旋的取向,我们考虑这里描述的第二种方法。对于MAGMOM标签,根据z方向编写总局部磁矩(必要时,x和y方向均为0)。自旋取向(𝑢,𝑣,𝑤)由笛卡尔坐标系中的SAXIS标签定义。通过使自旋朝不同方向取向计算晶体磁各向异性能量和以下方程式

𝐸MAE=𝐸(𝑢,𝑣,𝑤)−𝐸0

其中 𝐸0 是最稳定自旋方向的能量。更多细节请查看SAXIS和LSORBIT页面。

练习:通过将自旋沿以下路径定向,确定NiO的非自洽方式下的晶体磁各向异性能量:(2,2,2) –> (2,2,1) –> (2,2,0) –> … –> (2,2,-6)。与自洽方法进行比较。

INCAR:

{.line-numbers}
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
NiO MAE
SYSTEM = "NiO"

Electronic minimization
PREC = Accurate
ENCUT = 450
EDIFF = 1E-7
LORBIT = 11
LREAL = .False.
ISYM = -1
NELMIN = 6
# ICHARG = 11
# LCHARG = .FALSE.
# LWAVE = .FALSE.
# NBANDS = 52
# GGA_COMPAT = .FALSE.

DOS
ISMEAR = -5

Magnetism
ISPIN = 2
MAGMOM = 2.0 -2.0 2*0.0
# MAGMOM = 0 0 2 0 0 -2 6*0 # Including Spin-orbit
# LSORBIT = .True.
# SAXIS = 1 0 0 # Quantization axis used to rotate all spins in a direction defined in the (O,x,y,z) Cartesian frame

Orbital mom.
LORBMOM = T

Mixer
AMIX = 0.2
BMIX = 0.00001
AMIX_MAG = 0.8
BMIX_MAG = 0.00001

GGA+U
LDAU = .TRUE.
LDAUTYPE = 2
LDAUL = 2 -1
LDAUU = 5.00 0.00
LDAUJ = 0.00 0.00
LDAUPRINT = 1
LMAXMIX = 4

vaspkit

先执行结构优化计算(略),之后使用以下INCAR参数并选择991 K点进行自旋极化静态计算,运行vasp_std得到CHGCAR文件。

MAE的INCAR:

{.line-numbers}
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
#General
PREC = ACCURATE
ISTART= 0
ICHARG= 11
ENCUT = 520
EDIFF = 1E-8
EDIFFG = -0.001
LREAL = .F.
NPAR = 4
NSW= 0
IBRION = -1
ISIF = 2
ISMEAR = -5
SIGMA = 0.05
LCHARG = .F.
LWAVE = .F.
POTIM = 0.5
NEDOS = 2001
NBANDS = 144 # 修改为上一步静态计算NBANDS数值的2

#Magnetic properties

MAGMOM = 18*0 0 0 4 0 0 4
NELMIN = 6
LORBIT = 11
ISYM = 0
LSORBIT = .True.
LMAXMIX = 4 ! for d-elements increase LMAXMIX to 4, f-elements: LMAXMIX = 6

和VPKIT.in

1
2
3
1                              ! 1为预处理, 2为后处理
0 360 12 ! Phi, Spherical coordinate system
0 180 12 ! 0<= theta <=180, 90 degree means in x-y plane

VPKIT.in说明:
第一行:在第二步计算前使用1,第二步计算完后设置为2;

第二行:三维球坐标系下矢量在xy面投影与x轴正方向的夹角方位角φ,由起始角度0°到终止角度360°(0°),最后是分割角度的个数;

第三行:三维球坐标系下矢量与z轴的夹角θ,由起始角度0°到终止角度180°,最后是分割角度的个数(注意包含180°在内需要+1,所以是7);

其中和分别为方位角和极角,其值变化范围分别是从0°到180°和从0°到360°,这里方位角和极角各取12个离散点(共计144个计算作业)。如果计算资源允许,可以选取更小间隔。调用vaspkit-621命令产生如下所示的一系列计算作业。理论上要生成144个计算作业,考虑到一部分相等无需计算,实际上共生成了122个计算作业。预处理时VASPKIT会自动在每个计算作业文件夹里的INCAR后根据公式(1)追加SAXIS =

接下来可使用以下脚本模板批量提交vasp_ncl作业。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# just for reference
path=`pwd`
for c in *.*
do
cd $path/$c
echo `pwd`
qsub vasp_job_soc.sh ! vasp_job_soc.sh为vasp_ncl作业脚本
cd ${path}
done

待vasp_ncl计算完成后,把INPUT.in文件中的第一行修改2,然后再次运行vaspkit-621得到MAE.dat文件。我们可利用vaspkit/examples/MAE文件夹中的MATLAB脚本mae_3D_plot_matlab.m进行可视化。

  • 如果想得到xy二维平面内的MAE,INPUT.in可设置为:
    1
    2
    3
    1                              ! 1为预处理, 2为后处理
    0 360 12 ! Phi, Spherical coordinate system
    90 90 1 ! xy平面内theta始终等于90°
  • 如果想得到xz二维平面内的MAE,INPUT.in可设置为:
    1
    2
    3
    1                              ! 1为预处理, 2为后处理
    0 0 1 ! Phi, Spherical coordinate system
    0 180 12 !
    tips:

根据提示我们需要先执行一步sta,然后读取WAVECAR和CHGCAR进行Nocollinear的计算,当读取WAVECAR进行测试的时候,计算是一定会报错的,因为俩步计算电子的自由度是不同。这时候VASP一定会提示:ERROR: while reading WACECAR,plane wave coefficidents changed

那么继续根据官网的操作手册

  • 我们第一步只计算无磁性基态的CHGCAR,第二步去读取CHGCAR进行计算。
    这里只比对了x方向和z方向的结果:发现计算的结果是一模一样的,无法区分。

  • 接下来不读取之前的CHGCAR进行计算,还是依照之前的设置.这时候发现计算的结果是有区分的。方向不同。

  • 还有一种计算方式是读取写入磁基态的CHGCAR,再进行自旋轨道耦合的计算。这样计算的结果是,无论选择量子化轴在哪个方向,计算的结果都是在Z轴方向,但是能量有所差距。但是根据以上俩种结果去推断Cr原子的磁晶各向异性能,发现这种计算的结果跟文献的600-800eV的结果更为接近。 所以姑且认为进行计算是合理的结果。

电子结构分析

磁性一般来自于d、f轨道的半占据电子,下面以d轨道为例介绍电子结构的分析

  1. 磁矩约等于非成对的电子数,但是电子的占据方式并不仅仅由洪特规则来决定。
    以一个Mn2+为例,最外层5个电子,按照洪特规则Mn磁矩应该是5,但是在晶体场的作用下,它有可能呈现高自旋、
    中自旋、低自旋态。

如何查找结构晶体场:

  1. 确定点群 运行vaspkit
  2. 查表
    http://gernot-katzers-spice- pages.com/character_tables/index.html
  3. 判断能及大小

一、USPEX 简介

USPEX: Universal Structure Predictor: Evolutionary Xtallography. USPEX 代码能够通过仅仅只知道材料的化学成分来预测具有任意 P-T 条件的晶体结构。在全世界有6000多名研究人员使用它,它的出现极大的促进了相关领域的发展。而它的发明者:Oganov教授,通过这个软件做出了一系列漂亮的结果。

而 CALYPSO 的主要是由吉林大学的马琰铭教授主导开发的。

二、 下载安装

  1. 浏览器进入:https://uspex-team.org/en/uspex/downloads,这个是 USPEX 下载地址和官方手册。点击红色标记的 register 进行注册和登录即可免费下载。
    USPEX-9.4.4 是 USPEX 最经典的版本,体积最小,而最新的版本的体积急剧膨胀,相对老的版本,最新版本是Oganov教授团队采用 Python 将 USPEX-9.4.4 (MATLAB)改写了一遍,无大的新功能增加,发布时间较短,质量无法得到保证。更主要的是,USPEX-9.4.4 有中文文档!

  2. 确保机器上有 MATLAB 或者Octave,假如都没有,并且机器与外网隔离的情况下,可以参考这个安装 MATLAB( https: //blog.csdn.net/pihuanwan3227/article/details/84849969 ), 参考这个安装Octave (https://www.cnblogs.com/freeweb/p/7124589.html)。

  3. 接下进行安装: ./install.sh,。接下来会提示让填写安装地址(如果机器里面 Octave 已经安装好,会显示 Octave。当然 MATLAB 安装好,也会显示 MATLAB)

  4. 接下来还有重要的最后三步(这个就是设置环境变量,能够当前用户能够直接调用 USPEX):

  • vi ~/.bashrc
  • export PATH=$PATH: /home/xiaoming/EDU/USPEX
  • export USPEXPATH=/home/xiaoming/EDU/USPEX/src

其中/home/xiaoming/EDU/USPEX为USPEX安装目录。

三、进行计算

在上一步中已经成功安装好 USPEX 了,这时候可以使用 USPEX 进行计算了,本教程使用的是最主流的软件组合:USPEX+VASP,本教程需要 VASP 已安装好,至于 VASP 懂不懂并不影响本教程的使用。

3.1 准备输入文件

首先建立一个名为/La-H/0GPa的文件夹,进入这个文件之后,在终端输入命令: USPEX –g,然后查看文件夹 0GPa,会发现多了四个文件夹:AntiSeeds、Seeds、Specific、Submission。

其中,AntiSeeds 和 Seeds 文件夹中里面的存放的的是结构文件,由于本教程使用的是VASP进行计算,故这两个文件夹放的是 POSCARS 的文件(至于为什么是POSCARS,等下解释)。而 Specific 文件夹里面放的是 VASP 进行计算时,需要的和赝势文件,而 Submission 文件夹里面放的是 USPEX 各种方式提交任务的脚本。这 4 个文件夹是 USPEX 程序自动生成的,因而需要进入每个文件夹里面进行修改或者准备所需要的输入文件。接下来我们一个个文件来进行详细说明(划重点)。

a. AntiSeeds 文件夹,这个文件顾名思义,就是禁止 USPEX 生成的结构的种子文件,与 Seeds 文件夹作用相反,并且这个功能不常使用,本教程 AntiSeeds 文件夹就不设置,不用管它,直接考虑 Seeds 文件夹。

b. Seeds文件夹,这个文件夹就是USPEX计算时,需要种子文件存放的地方。好了,既然需要种子文件,那么我们来准备种子文件吧。本教程要进行搜索的是 La-H 体系,那么开始准备La、H结构文件吧。首先到日本晶体结构数据NIMS网站(https://crystdb.nims.go.jp/crystdb/search-materials: 免费注册且免费下载,并且里面结构文件多数有其引用的相关文献)上找结构。

1)、 把这两种元素的cif结构文件全部下载下来;

2)、用VESTA 
(http://www.jp-minerals.org/vesta/en/download.html:下载后解压即可使用,功能很强大的软件) 打开,另存为VASP5 格式的POSCAR文件;

3)、打包上传到机器上刚刚建立的/La-H/0GPa /Seeds文件下;

4)、包把La和H的POSCAR文件合并为一个文件,并命名为POSCARS (1、可以使用cat 命令合并,如:cat POSCAR_La* POSCAR_H >> POSCARS,2、建议查看一下POSCARS文件格式,假如有类似乱码的东西,dos2unix POSCARS百度了解一下)。

c. Specific文件夹,这个文件夹主要存放的是USPEX控制的VASP进行计算的输入文件,由于本教程是La-H体系在0 GPa的变组分结构搜索,主要是用VASP计算USPEX生成结构的能量,因而这个文件内主要是POSCAR进行结构优化的文件:
INCAR_1-5: 这样设置的主要原因:考虑有你的初始结构通常远离局部最小点,在这种情况下,

INCAR_1,2首先应该在保持体积固定的情况下(ISIF=4)弛豫原子和晶胞形状,然后在INCAR_3,4中做完全弛豫(ISIF=3),在INCAR_5中完成非常精确的单点计算(ISIF=2,NSW=0)(至于更具体的细节问题,手册上有详细的描述,请查看手册第3章第3.4小节)。值得注意的是:K点设置由USPEX自动生成了,无需考虑。

d. Submission文件夹, 这个文件夹主要是USPEX来提交计算任务和检查计算任务的情况的一些脚本。一般情况下,提交计算任务都是通过登陆到服务器上进行提交,那么这时候需要修改submitJob_local.m和checkStatus_local.m这两个脚本。

e. INPUT.txt

USPEX 自动生成的4个文件夹已经处理好了,那么接下来就是控制USPEX计算的输入文件:INPUT.txt (固定名字的文件),在/La-H/0GPa文件通过文本编辑器(vi INPUT.txt),把上面的内容输入进去,并并保存,下面来解释每行代表的意思,这是超级重重点。

上图都是USPEX计算输入控制文件:INPUT.txt主要内容,棕黄色的数字标志是行数,只是为了显示方便,不是需要输入的内容。

1-3行、为注释说明行。
第4行、为选择计算类型行,主要是选择什么样的计算方法进行不同类型的计算,目前USPEX支持四种计算方法分别为:USPEX、VCNEB、META、PSO等。但目前采用变组分结构搜索的话,选用其王牌类型,USPEX就行,其他方法请参阅手册
第5行、需要计算的结构类型、是否为分子和是否为变组分计算,301:3代表了三维块状结构,0代表了不是分子,1代表了采用变组分。
第6行、1是代表了进行结构搜索最稳定结构时采用了生成焓作为筛选标准,当然还有其他标准:体积,硬度,结构有序度等等,详情参阅手册。
第7行、1代表了设置允许系统自动进行进化的变分操作,这个设置能加快运算。
第9-11行、是设置需要计算的体系,本教程是La-H体系,所以在第10行输入La H, 当然你也可以在第10行输入 La H 的原子序数:57 1 ,这样也是被允许的。
第13-16行、设置上面你设置的体系原子的个数之比,表示着:LaxHy,也就是说任意x个La和任意y个H的结构都是可以生成的。假如需要生成任意x个La和任意2y个H的结构怎么设置?
第17-24行、设置关于生成结构的数目,第20行populationSize设置除了第一代,其余以后每代生成的结构的数目,第21行initialPopSize设置第一代生成的结构的数目,第22行numGenerations,设置总共计算的最大代数。第23行stopCrit设置多少代的最好结构结构都一样就停止USPEX计算。第24行是设置是否重新优化幸存的结构,默认是0,意思就是不重新优化。(需要注意的是,这里的设置的大小,大致上决定你需要优化的结构的数目)
第25-29行、设置允许生成LaxHy结构中8<=x+y<=18,这样设置能够更好锁定搜索结构的范围,当然越小计算量越少了,这个主要看个人选择了,但是minAt和maxAt不要相差太大,太大容易出错或者最后结果漏掉一些结构,手册上有推荐选择范围,自己参阅考虑。
第30-37行、设置遗传变分操作的具体细节的,主要设置各个操作的所占比例,fracGene:基因遗传占的比例,fracRand:随机生成的占比例,fracAtomsMut:原子摄动占的比例,fracTrans:晶格转变占的比例,fracLatMut:点阵摄动占的比例。注意:所有比例之和必须为1。
第39行、这行是设置体系的压强大小,单位是GPa, 0是不施加外压。当然了前面提到的文章,压力有150 GPa 和 300 GPa,在相应的压力下进行搜索时,应该此处改为150 或 300。
第41-46行、是设置调用的外部程序执行具体计算用的,1代表了调用VASP,1 1 1 1 1  跟Specific 文件夹里面INCAR_1、INCAR_2、INCAR_3、INCAR_4、INCAR_5遥相呼应,表示一个结构需要优化5次得到精确的能量值。
第48行、设置USPEX一次总共提交多少个任务,
第49行、设置提交任务方式,1设置为local,毕竟USPEX一般都是安装在服务器上面的。
第51-56行、设置重新启动USPEX运算,这个设置应该好好琢磨一下,尤其是第54行pickUpYN,0是不进行计算,1是进行重新计算,第55行pickUpGen根据你的结果文件夹results*里面的generation*的数目进行设置,第56行pickUpFolder是根据哪个结果文件夹results*进行重新计算,这3行一定要配合使用,是相关联的。当然本教程是进行新计算,都设置为0,即可,这个弄明白了,重新计算时,可以节省大量时间。

好了,La-H 体系不同压强下变组分结构搜索的INPUT.txt的主要设置内容介绍完毕。

f. 最后一项设置,就是提交整个USPEX的脚本了,很简单的shell脚本,任何一个机器上提交USPEX任务,都可以用这个,只是切记一定要把这个脚本命名好。如果在自己机器上使用了MATLAB把 –o 去掉就行了,-o的意思是使用octave。

3.2 提交USPEX任务

如果前面一切输入文件准备好了之后,那么我们可以开始了神奇的USPEX变组分结构搜索之旅了。终端输入命令:n nohup ./uspex_Lah0.sh >> log &(其中uspex_Lah0.sh就是1.f中提到的提交USPEX任务的脚本)。

四、官方算例1(EX01-3D_Si_vasp)

案例1,0 GPa下的Si( 一个晶胞里面8个原子)
我们先把案例1拷贝到当前目录下:USPEX –c 1

1、输入文件

其中reference里面是案例1的计算结果,属于参考答案,等下我们来分析一下里面的文件。现在我们先考虑一下,USPEX计算需要哪些文件夹?这里是不是还少了一些文件夹?少哪些了?答案很简单嘛:USPEX –g ,然后我们看看INPUT.txt,了解一下这个案例是做什么的。

第5行、calculationMethod (计算方法):USPEX(遗传演化算法,也就是遗传、变异遗传算法那套原理的改进版)。
第6行、calculationType(计算类型):300 (3:三维、0:非分子、0:非变组分)
第7行、optType(优化类型):1(焓值)
第8行、AutoFrac ??:我也不记得了。。。不要怕,前面不是讲过怎么查看参数嘛!USPEX -p AutoFrac
第11行、Si:计算的体系的原子类型
第15行、8:计算的体系的原子类型的个数为8
第20行、populationSize (每代多少结构):20
第21行、numGenerations(要计算多少代):25 (这个代数,是最多要计算的代数,假如达到收敛的条件,可以在提前结束)
第22行、stopCrit(收敛的条件):8 (单位:代。意思就是假如连续有8代的最优结构的优化类型(本例中为焓值)是一样,那么证明计算收敛了,可以停止计算了)
第23行、bestFrac(上一代用于生成下一代结构的比例):0.6 (这个值默认值是0.7,在0.6-0.8之间是合理的)
第27行、fracGene(本代由遗传生产结构的比例):0.5
第28行、fracRand(本代由晶体对称性随机产生结构的比例):0.2
第29行、fracAtomsMut(本代由较小的突变产生结构的比例):0.2
第30行、fracLatMut(本代由点阵突变产生结构的比例):0.1
特别需要注意的是:fracGene+ fracRand+ fracAtomsMut+ fracLatMut = 1
第35行、计算总能软件的代码:1 1 1 1 1(VASP、采用5步优化,那么Specific应该有哪些文件了?请到入门教程找找)
第39行、计算总能的K点密度设置:0.13 0.11 0.10 0.08 0.06(这个值越低、K点越密集)具体描述如下:USPEX -p KresolStart 。不懂哪个参数就USPEX -p
第43行、运行总能计算软件的指令:一般建议不在这个设置这个参数,直接在Submission文件夹里面提交计算任务的脚本里面改就可以了。
第46行、whichCluster(采用什么计算方式):一般采用1,同第43行原理。
第47行、numParallelCalcs(并行计算数):10 (意思就是一次提交10个总能计算任务)
第48行、ExternalPressure(计算外压):0.00001 (GPa、老朋友啦,不解释了)

把这个INPUT.txt读完以后,案例1就是搜索包含8个Si原子的晶胞在大气压最稳定的结构。

返回INPUT.txt目录,USPEX计算4大准备目录:AntiSeeds、Seeds、Specific、Submission和提交任务脚本EX01-3D_Si_vasp.sh。

a、AntiSeeds文件夹没特别需要,不用理它;
b、Seeds文件夹,需要从NIMS下载所有稳定的Si结构,最后做成一个POSCARS,具体操作,读者需要自己动动手了,参考入门教程;
c、Specific文件夹本案例中已经准备好了;
d、Submission文件夹,读者需要自己动动手了,参考入门教程。
f、EX01-3D_Si_vasp.sh:本案例已经准备好了,需要注意的一点就是USPEX –r –o >> log / USPEX –r >>log : (Octave/ MATLAB用哪个自己修改)。

2、计算

1
nohup ./EX01-3D_Si_vasp.sh >> log & 

在计算的过程中会出现一个重要的文件夹results1,results1里面放的就是计算结果,随着计算的时间的增长,里面会有文件夹generation1、generation2、generation3…,还有一些其他文件。但是肯定包括reference(参考答案)里面的文件,文件夹reference包含了计算结果,但是笔者先提醒一下,本次计算的目的:搜索8个Si原子的晶胞在大气压下最稳定的结构。
那么带着目的和INPUT.txt,我们来看一下计算结果。

3、输出文件

我们先来看最需要的答案:BESTgatheredPOSCARS和BESTIndividuals,这两个文件是定组分变胞计算的最最重要的文件,并且相互对应。

  • 先看看BESTIndividuals:顾名思义,这个文件里面存着每一代最稳定的结构!

    第1行标题,Gen是generation的缩写,USPEX计算时种群的代数;ID是USPEX计算时给每个结构做的标记,这个数值一般就是整个USPEX计算时产生第几个结构;Origin表示这个结构由什么遗传算法操作产生的;Composition成分;Enthalpy焓值;Volume、Density、KPOINTS这三个看字面意思就能明白了,SYMM代表空间群对称性,这个数字代表1-230个空间群代表;Fitness、Q_entr、A_order 、S_order这些都是代表晶胞有序度相关的量,都是根据fingerprint这篇文章里面定义的(doi:10.1107/S0108767310026395)!

  • 好了,我们把标题了解完了,来查看结果:焓值越低,结构越稳定!显然可见第13代(第15行)的ID301结构最稳定,而这个结构是从第12代ID276结构继承来(Origin: keptBest),那么可以从这个文件里面看到USPEX计算过程中,最稳定的结构一代代遗传演化过程!

  • 既然我们已经得到最稳定的结构的ID是301,那么它的具体原子坐标了?这时候该BESTgatheredPOSCARS出马了!从文件名字意思可以猜出这是最好的结构的原子坐标的集合,当然POSCAR这个就可以看出是以VASP的POSCAR形式存储的。既然我们有ID=301这个目标,看一下这个结构在文件里面哪一行?

    grep 301 -n BESTgatheredPOSCARS

    在文件里面的193行,现在我们打开文件,定位到这一行。

  • 整个文件是VASP5格式的POSCAR集合,打开文件定位到这一行的时候,ID=301这个结构是位于文件的最后,而上一个结构是EA276,上上一个结构是EA254…而EA301是第13代最稳定的结构,EA276是第12代最稳定的结构,EA254是第11代最稳定的结构。。。可以看出BESTgatheredPOSCARS的结构原子坐标和BESTIndividuals每一代的最稳定的结构是一一对应的,那么BESTgatheredPOSCARS里面的结构原子坐标也是一代代最稳定的结构步步演化过程。

  • 把BESTIndividuals和BESTgatheredPOSCARS理解透彻了,其余的文件根据文件名字也能知道里面存放的具体数据是什么。比如文件Individuals里面放的是所有结构的焓值、体积、密度和有序度等信息,gatheredPOSCARS里面放的是所有的结构的原子坐标,Parameters.txt就是INPUT.txt的副本。余下的文件里面值得注意的就是OUTPUT.txt,这个文件是USPEX计算过程的软件自身的log文件。

    里面包含了对于整个USPEX计算的解释,随着每一代计算的结束,OUTPUT.txt。这个文件里面也会有对于这一代计算的总结,整个计算结束以后,USPEX也会做出总结。总而言之,OUTPUT.txt就是log文件,假如不明白USPEX怎么计算的,或者USPEX计算过程出错了,在这里都能找到原因。

五、官方算例2(2-8)

案例2

  • 主要目标:在100 GPa,MgAl2O4(28个原子的单胞)使用GULP(General Utility Lattice Program,http://gulp.curtin.edu.au/gulp/,使用力场方法进行计算的软件包,里面有很多有意思热力学计算功能,有机会再介绍) -采用Buckingham势-进行变胞计算。这个案例直接揭示了地球内部物理现象,但是由于力场方法精确性不如DFT方法,所以想要更精确的结果,可以改用VASP一类的软件,同时计算时间会增长不少!

  • 看完案例的简单介绍,我们来读一下INPUT.txt,复习一下定成分变胞计算怎么设置参数。

    第4行、 calculationMethod (计算方法):USPEX(遗传演化算法,也就是遗传、变异遗传算法那套原理的改进版)。
    第5行、calculationType(计算类型):300 (3:三维、0:非分子、0:非变组分)
    第6行、optType(优化类型):1(焓值)
    第7行、AutoFrac:1(允许系统自动变异演化,比用户自定义的快2倍)。一般建议设置为1即可。
    第10行、Mg Al O:计算的体系的原子类型
    第14行、4 8 16:计算的体系的Mg、Al、O的个数分别为4、8、16,也就是体系的原子总数为28的MgAl2O4。
    第19行、populationSize (每代多少结构):40
    第20行、numGenerations(要计算多少代):60 (这个代数,是最多要计算的代数,假如达到收敛的条件,可以在提前结束)
    第21行、stopCrit(收敛的条件):30(单位:代。意思就是假如连续有30代的最优结构的优化类型(本例中为焓值)是一样,那么证明计算收敛了,可以停止计算了)
    第22行、bestFrac(上一代用于生成下一代结构的比例):0.6 (这个值默认值是0.7,在0.6-0.8之间是合理的)
    第26行、fracGene(本代由遗传生产结构的比例):0.5
    第27行、fracRand(本代由晶体对称性随机产生结构的比例):0.2
    第28行、fracPerm(本代由置换产生结构的比例):0.1
    第29行、fracAtomsMut(本代由较小的突变产生结构的比例):0.2
    特别需要注意的是:fracGene+ fracRand+ fracPerm+ fracAtomsMut = 1
    第35行、计算总能软件的代码:3 3 3 3 (GULP、采用4步优化,那么Specific应该有哪些文件了?等下介绍)

    以上就是USPEX所有用于结构优化的软件包
    第39行、运行总能计算软件的指令:一般建议不在这个设置这个参数,直接在Submission文件夹里面提交计算任务的脚本里面改就可以了。
    第43行、numParallelCalcs(并行计算数):1(意思就是一次提交1个总能计算任务,计算效率太低,建议设置16个左右)。
    第44行、whichCluster(采用什么计算方式):一般采用1,同第43行原理。
    第45行、ExternalPressure(计算外压):100 (GPa)

    把INPUT.txt读完以后,案例2和案例1计算类型和参数设置几乎都是一样,但是需要注意的这次是采用GULP来计算的,那么问题来了!

    问题1. Seeds 和AntiSeeds里面的种子文件采用的是GULP格式的吗?

答:不是!还是VASP5 格式的POSCARS。另外提醒一下,种子文件都是POSCARS的形式,跟采用何种结构优化软件包无关!

问题2. Specific里面的文件怎么设置?

  • GULP计算时,ginput 和goptions一一对应,文件夹里面的文件还和INPUT.txt里面的4次结构优化对应。
    文件夹Submission的文件需要读者自己根据自己机器去修改了,然后假如读者机器里面有GULP的话,可以提交任务计算结果和reference对比一下。笔者在此不多说,直接看reference文件夹。

    里面的文件和案例2的文件都是一样的,可见定成分变胞计算结果都是由这些文件组成的。现在我们看看结果文件BESTIndividuals和BESTgatheredPOSCARS,其余文件就不再介绍了。

    从文件BESTIndividuals中可以看出到了第34代计算停止,之前30代的结构的焓值计算是一样,与INPUT.txt中stopCrit参数值30是对应的。既然有第34代最稳定结构的ID=1562,那么根据ID=1562去BESTgatheredPOSCARS中找结构,直接到文件最后找一下,另存ID=1562的结构信息为一个文本文件,然后拖到VESTA,可以很直观的看到计算出的最稳定的结构究竟长什么样!

官方算例3

案例3:MgSiO3(每个单胞有20个原子)使用GULP(采用Buckingham势)在知道结构参数的条件下进行结构预测。这个结构的晶格参数和后钙钛矿一致。后钙钛矿的发现(Oganov & Ono, Nature 2004; Murakami et al., Science 2004)在地球科学领域是一个重大突破。
我们直接来来读一下INPUT.txt:

第11-13行、symmetries:16-74。第一次出现,设置生成结构的晶体对称性。三维晶体的取值范围:2-230。
第42-44行、Latticevalues:2.474 8.121 6.138 90.0 90.0 90.0 = b, c, alpha, beta, and gamma values。此参数仅用作初始猜测,仅影响第一代,USPEX计算的每个结构都经过充分优化,并采用与(自由)能量最小值相对应的晶体参数。INPUT.txt中其他的参数都在案例2中讲解过一次了,就不再解释了。下面我们来继续看一下结果!

可以看出,案例3总共计算20代,共626个结构,得到最稳定的结构的原子结构之后,可以去计算MgSiO3其他的性质。

其他算例解释

案例4:预测16个C原子的最稳定的晶胞,但是使用LAMMPS优化结构计算能量,跟案例2、案例3基本上一样的,就不多介绍了!

案例5:预测8个Si原子的最稳定的晶胞,但是ATK里面的tight binding近似方法来优化结构计算总能,不多解释啦!

案例6:预测10 GPa下8个C原子的最稳定的晶胞,但是使用CASTEP优化结构计算能量,你懂的!

案例7:预测8个Si原子构成的二维晶体在0 GPa下最稳定的结构。
这个案例有点不一样,我们来直接看一下INPUT.txt,再讲一下不一样的参数怎么构成不一样的计算。

第5行、calculationType:-200。
这个为什么是-2,没这个维数取值呀?不懂直接USPEX –p calculationType!

可以看到2是表面结构,而-2是二维晶体结构,至于二维晶体和表面结构有什么区别?这个问题笔者不能很通俗易懂告诉大家,只能告诉你在USPEX中,二维晶体计算既不需要端点参考能也不需要衬底,而只需设置二维初始结构的厚度即可,而表面计算需要!

第7行、thicknessS:3.0。初始层厚度,最后一个是大写的S,因为是Start的缩写。


第10-12行、vacuumSize:8 9 10 12(20)?。设置真空层厚度,这是二维晶体和表面计算必须要设置的,不然的话,没有真空层,就会有作用力,计算的也就不是二维晶体。而这个参数,这里貌似设置错误了,少了1个参数。

既然,我们读完INPUT.txt,那么有一个问题出来了:Seeds里面的文件怎么去设置了?还是POSCARS,里面还是放所有稳定的Si原子结构!

我们现在来看一下结果!总共计算了13代共295个结构。那么最后一代稳定的结构长什么样了?显然POSCAR的原子坐标,根本看不出什么,而单胞结构示意图也看不出是二维晶体,做一个3x3x3的超胞,可以看出这就是一个二维晶体!USPEX多么神奇!

案例8: 36个Mo原子的纳米粒子结构预测。使用Lennard-Jones对势函数的GULP进行结构优化。
这个案例值得看一下INPUT.txt。

第5行、calculationType:000。纳米颗粒结构计算。

第36-38行、vacuumSize:10 10 11 12 12。真空厚度,案例7已经提到了,显然这个案例中真空层厚度值设置正确了。

这个计算结果,显示在第7代一下突然找到低焓值的结构,然后一直持续到了26代,总共有20代的最稳定的结构的焓值是一样。所以到了第26代计算结束了。而我们查看第26代最稳定的结构示意图如下,也真是纳米颗粒结构!

总结

案例2:在100 GPa,MgAl2O4(28个原子的单胞)使用GULP采用Buckingham势-进行变胞计算。(calculationType:300)
案例3:MgSiO3(每个单胞有20个原子)使用GULP(采用Buckingham势)在知道结构参数的条件下进行结构预测。(calculationType:300)
案例4:预测16个C原子的最稳定的晶胞,但是使用LAMMPS优化结构计算能量。(calculationType:300)
案例5:预测8个Si原子的最稳定的晶胞,但是ATK里面的tight binding近似方法来优化结构计算总能。(calculationType:300)
案例6:预测10 GPa下8个C原子的最稳定的晶胞,但是使用CASTEP优化结构计算能量。(calculationType:300)
案例7:预测8个Si原子构成的二维晶体在0 GPa下最稳定的结构。(calculationType: -200)
案例8:36个Mo原子的纳米粒子结构预测。使用Lennard-Jones对势函数的GULP进行结构优化。(calculationType: 000)

其实可以看出,USPEX刚开始开发的时候,主要是用于定组分变胞的三维晶体最稳定的结构预测,后来功能慢慢的扩展开来,能够预测二维晶体、纳米粒子结构以及后面要讲案例中有关分子结构的预测、进化准动力学方法、表面结构预测、三元变组分结构预测方面的内容。

六、官方算例(9-13)

案例9:预测有4个甲烷分子的单胞在20 GPa下最稳定结构,结构优化采用的是VASP。
分子?这个我们还是第一次遇到,现在来看看怎么一回事?

可以看到案例9多出一个MOL_1的文件,现在我们先看看这个MOL_1文件有些什么:
这个文件在手册里面第5章里面有介绍,也可以在线观看(https://uspex-team.org/online_utilities/uspex_manual_release/ChineseVersion/uspex_manual_chinese_V10.2/sect0029.html),里面还介绍怎么通过XYZ坐标格式的文件来创建USPEX使用的MOL文件。手册上面这块讲的挺麻烦的,让笔者摸不着头脑,毕竟笔者对于分子接触的少。但是从朱强博士相关论文中,可以读到这个文件设置的作用:在USPEX产生分子结构的时候进行约束,这样大大降低搜索空间,减少计算量;其次,任何分子的能量值,都要比其分解为水和盐的化合物的能量值低。

进行分子结构预测时的INPUT.txt又需要注意哪些呢?

第5行、calculationType:310 三维分子定组分。
第14行、numSpecies:1 4,这个官方案例有点问题,少了一个1,知道为啥不?
第35-38行、IonDistances,设置不同原子类型之间的最小原子间距离矩阵,而低于离子距离低于这个距离都被认为没有物理意义的,将被忽略!这里只有两种原子,所以只设置两行就行!第36行的2.0,表示C原子和C原子之间的最小距离,1.7表示C原子和H原子之间的最小距离;第37行的0.7表示H原子和H原子之间的最小距离。这些值都要比真实健值要小!

第40-42行、MolCenters,设置分子中心之间最小距离的矩阵,而任何低于这值的距离都表明分子有很大的重叠,是没有物理意义的,将被严格避免!第41行的2.8表示CH4的最小距离,单位为埃。进行分子结构预测时,这个必须设置!

INPUT.txt其余的参数在前面的案例中,已经介绍了。可以看出结构优化时,计算CH4结构的能量采用的是VASP,那么Specific文件夹里面就是INCAR五部曲和C、H原子的赝势!当然进行计算时,Seeds文件夹依旧是POSCARS,里面放的是C、H原子的最稳定的结构!可以看到除了多了MOL_1文件和INPUT.txt部分参数不一样外,分子结构预测跟其他晶体预测设置不一样?

下面我们来看看参考结果的reference文件夹:

里面也有MOL_1文件,这个是从之前的那个MOL_1拷贝过来的。其余的文件格式和内容与之前介绍的定成分计算的文件格式和内容都是一样!

案例9总共计算了9代197个结构,其中最稳定的结构也是这个对称性最低的CH4。

案例10:预测有8个甲烷分子的单胞在常压下最稳定结构,结构优化采用的是DMACRYS;跟案例9类似,就不介绍了!

案例11:预测有2个尿素分子的单胞在常压下最稳定结构,结构优化采用的是TINKER;跟案例9、10类似,就不介绍了!

案例12:预测Mo-B二元体系常用最稳定的结构,变组分的结构预测,结构优化是采用Lennard-Jones对势的GULP做的。
案例12跟入门教程的La-H二元体系变组分结构预测是相似的,只是结构优化软件的软件包是不一样的,所以INPUT.txt就不介绍了。而在La-H二元变组分结构预测中,没来得及对计算结果进行分析,这次就在本教程对变组分的结果进行详细讨论。

我们先看参考答案reference文件夹里面有哪些文件:

这次文件夹里面有很多文件,又有些文件和定组分不同,但是对于变组分结构预测而言,只有extended_convex_hull、extended_convex_hull_POSCARS、extendedConvexHull.pdf和OUTPUT.txt这四个文件最重要,彻底掌握了这四个文件就掌握了变组分结构预测的结果分析。

下面先来看看老朋友OUTPUT.txt,看一下Mo-B变组分运算过程的信息:

可以看到总共计算了60代共5287个结构,最后列出来最稳定的成分,也就是凸包线点:Mo4、B6、MoB14、Mo4B8、Mo4B4、Mo2B6。(ps: 凸包线上稳定的单胞)。那么现在读者肯定很想知道凸包线是什么?直接打开extendedConvexHull.pdf!

图中绿色的点就是本次计算的结构的,而最下面的那条黑色就是凸包线,位于这条线上的点就是热力学上稳定的结构。在本图中从左到右总共有6个落在线上的点,和OUTPUT.txt里面的6个稳定的成分是相对应的。读者应该知道能够很清楚的知道X轴代表什么意思,怎么计算的。而Y轴形成焓(Enthalpy of formation,eV/atom)是由下面公式计算出来的:
Y = (E(AxBy)-xE(A)-yE(B))/(x+y)
在案例12中,x: Mo原子的个数,y:B原子的个数。

而凸包线画法麻烦一点,先从两个端点开始,连接焓值最低点,然后找到端点到焓值最低点这段直线中下方最远的点,连线。迭代下去,直到没有一个点位于凸包线下面!
这条线的做法决定了稳定的结构都位于凸包线上。 假如有一个稳定的点在凸包线上方,那么它很容易分解为距离这个点最近的凸包线上的两个稳定点,有点类似直线方程的意思。

读者需要仔细体会上面一段内容,因为理解了上面的观点也就明白了变组分结构预测中凸包线的意思,那么一大堆相关论文也就会明白了。
既然我们得到知道稳定的成分,那么它们具体的结构是什么了?先看一下extended_convex_hull文件:

这个文件有些意思,第1-4行解释了extended_convex_hull文件的X、Y和Fitness这些标题的含义,其中X、Y和extendedConvexHull.pdf中X、Y轴是一一对应的,而Fitness这个就是结构离凸包线的距离,值为0意思就是在凸包线上,而值大于0就是在为凸包线上方,那么一个小小的思考题来了:为什么这个文件中没有Fitness值小于0的?(提示:思考凸包线的画法)

现在我们把注意放在第7-12行,因为它们Fitness的值为0,也就是说它们就是凸包线上的点。再看一下它们的Compositions和Enthalpies值,与OUTPUT.txt里面的值是一一对应的,综合以上信息,可以确定以上6个结构就是我们要找的稳定结构。从第13行往后就是根据Fitness从小到大排下去的,也可以认为这是根据稳定性排下去的,当然大部分情况下,这些结构都是不需要考虑的!既然我们知道要找到的稳定结构,那么怎么找到这些结构的原子坐标?这就需要看看extended_convex_hull_POSCARS了:

整个文件就是POSCAR的集合,并且每个结构的表头和之前的BESTgatheredPOSCARS是一样的,再加上第1行和第25行的ID,与extended_convex_hull里面前两个稳定结构的ID是一一对应的,那么显而易见extended_convex_hull_POSCARS文件和extended_convex_hull文件里面的结构是一一对应的。

既然知道这些预测出的稳定新结构了,就可以继续通过DFT计算它们的性质,然后得到数据,发Paper了,这还不简单?
这就是变组分结构预测需要了解和处理的文件:extended_convex_hull、extended_convex_hull_POSCARS、extendedConvexHull.pdf和OUTPUT.txt。除了凸包线画法需要用心体会,其余很简单吧!

案例13:USPEX能很容易地找到最无序的合金结构。这个案例只是为了演示TixCo(1-x)O。您需要在/Seeds/POSCARS中指定初始结构,并且只使用置换突变操作。(在这种情况下,不需要使用任何外部代码。在这个例子中,我们优化(最小化)结构有序度(Oganov and Valle(2009);Lyakhov Oganov Valle(2010))而不需要进行结构优化(abinitioCode=0)。种子结构(Ti-Co-O结构的超级细胞)中的Ti原子和Co原子被置换,以寻找具有最小的有序度。在这种情况下最小化有序度,我们得到了“特殊准随机结构”的广义形式。)

这个案例的说明比较饶舌,还是直接看INPUT.txt吧:

第6行、optType: -4,寻找有序最小的结构!因为4是寻找有序度最大的结构,所以-4是相反的意思。
第30行、howManySwaps:15,设置为这个值,是因为在第29行设置本次计算的子代结构都是通过交换父代结构中的原子产生的。本次计算的Co16Ti16O64的单胞,总共有96个原子,这个值占比15%左右。

第32-34行、specificSwaps:

1 2,指明只有Co、Ti原子能进行置换。

其余没有什么新鲜的参数要介绍了,不过读者可能会注意到,本次并没有进行结构优化,或者说是调用外部软件进行计算。都是USPEX通过自己的Fingerprint算法来计算有序度,这个具体是怎么一回事?可以参考这个在线网址(https://uspex-team.org/online_utilities/fingerprints2/)。

好了,再把Seeds/POSCARS文件准备好:放入Co、Ti、O原子所有稳定的结构信息进去就OK了。至于计算,本地计算就可以。我们先来看看结果吧(由于这次是300计算,结果只是需要关注BESTIndividuals、BESTgatheredPOSCARS、OUTPUT.txt),先看一下BESTIndividuals文件:

可见BESTIndividuals文件还是跟以前,到文件末尾总共有50代 (本图志截取到19代 ),那么问题又来了,我们需要预测的结构长什么样了?我们接着打开BESTgatheredPOSCARS文件:可以看出这个结构还是比较复杂的,有点无序的感觉,有点高熵合金的感觉。

总结

案例9:预测有4个甲烷分子的单胞在20 GPa下最稳定结构,结构优化采用的是VASP。310
案例10:预测有8个甲烷分子的单胞在常压下最稳定结构,结构优化采用的是DMACRYS; 310
案例11:预测有2个尿素分子的单胞在常压下最稳定结构,结构优化采用的是TINKER; 310
这三个都是分子结构预测:310类型的,所以只详细的介绍了310。

案例12:预测Mo-B二元体系常用最稳定的结构,变组分的结构预测,结构优化是采用Lennard-Jones对势的GULP做的。301
这个案例主要是介绍了结果分析,其中关于凸包线的那段值得读者思考一下,弄明白了,很多Paper都能理解了。

案例13:预测最无序的TixCo(1-x)O合金结构。300
这个案例主要介绍无序结构预测,有点准随机的感觉,目前笔者感觉其在高熵合金方面有潜在用途。

七、官方案例讲解(14-15)

案例14:通过进化准动力学(Evolutionary metadynamics)预测下常压下Si的低能亚稳结构,结构优化采用的是VASP。
这个案例就是为了展示Evolutionary Metadynamics强大的威力,其实最近为了演示水分子结晶问题这一科学热点问题,Metadynamics出了很大一把力。下面还是闲话少说,我们来看看怎么设置计算和分析结果的。
先看一下INPUT.txt

第1行、calculationMethod: META,第一次看到不是USPEX,而是META(Evolutionary metadynamics)。
第8行、minVectorLength: 2.0,设置生成的子代结构最短的健长

第9行、maxVectorLength:8.0,这个值是Evolutionary metadynamics独有的,是设置最大的健长,假如在进化准动力学计算中,单胞的健长没有处在最小健长和最大健长之间,那么在计算时,软件会自动校正,使晶胞进入正常的范围。


第15行、mutationDegree:3.0、设置软模突变(softmutation)的程度,单位为埃。简单一点的意思就是设置晶格某个原子位置方向的突变距离。在Evolutionary metadynamics算法中,晶胞都是通过软模突变生成子代结构的。


第16行、:GaussianHeight:250.0,进化准动力学专门的参数,用来促进晶胞相变,具体的值跟晶格常数和剪切模量相关。

第17行、GaussianWidth:0.3。有高斯高度,那么肯定会有一个高斯宽度了!作用和GaussianHeight一样,但是这个参数只和晶胞最小长度有关。

第18行、FullRelax:2,metadynamics原理是晶胞在某个方向上,长度发生变化,然后进行固定体积结构优化。而这个FullRelax就是设置结构优化的程度,可以理解为精度,0:精度最低,1:精度一般,2:精度可靠,大部分计算都采用2。

好了,进化准动力学参数介绍就介绍了到这里了。但是读者可能会有点好奇,这里为什么我们没有设置体系? 因为不需要!META计算类型,计算很特别的:

不需要设置Seeds/POSCARS文件,因为计算时一般采用POSCAR_1作为初始结构,然后通过软模突变(softmutation)生成子代结构,然后结构优化,选择最稳定结构迭代下去,另一个需要注意的是这个计算截止条件是INPUT.txt里面设置的代数。

好了我们来处理一下结果,这里需要提一句的就是,进化准动力学是寻找跟初始结构相差不是很大的亚稳结构,因而每一代焓值最低的结构都要考虑。我们来看一下参考文件夹reference

这里面有很多文件很熟悉,看着名字也能猜出文件里面放的是什么,那么META(进化准动力学) 最重要的文件就是BESTIndividuals_relaxed 和BESTgatheredPOSCARS_relaxed这两个文件,不过我们先看一下BestEnthalpy.pdf

这个图片,绿色的点连成的红色虚线是未完全弛豫的最好结构的焓值,而蓝色的线则是完全弛豫结构的焓值。
接着打开BESTIndividuals_relaxed,熟悉的味道:

打开BESTgatheredPOSCARS_relaxed也还是熟悉的味道,就不多解释了。

不过这样打开展示结果并不是一个很好的方式,也许在BestEnthalpy.pdf的图片中添加亚稳结构的示意图会更有意思,更直观,但是不在这个教程演示了,会在案例21:EX21-META_MgO_gulp里面展示,并总结一下META方法和USPEX方法之间的对比。

BESTgatheredPOSCARS_relaxed就是案例9计算最后得到的亚稳结构,在研究中,所有的这些结构都需要考虑。也许有人会感觉这个META方法有点鸡肋,但是在研究相变的时候,尤其是水分子结晶过程,这个方法很有用!

案例15:通过VCNEB (variable-cell nudged elastic band)预测下常压下Ar的fcc-hcp的转变过程,结构优化采用的是GULP,并采用Lennard-Jones对势。
闲话少说,我们先看看INPUT.txt是怎么一回事:

第18行、vcnebType:111,指定VCNEB计算的类型。此变量由三个指标组成:计算选项(1:VCNEB方法,2:没有VCNEB计算的结构优化模式)、虚像结构数目的可变性(0:VCNEB虚像结构的数目是固定的,1:VCNEB虚像结构的数目是固定的是可变的)和弹簧常数的可变性(0:固定的弹性常数,1:可变的弹性的常数);111,一般是推荐在重构相变(reconstructive phase transitions)上使用。重构相变:在热力学上,重构相变在相变压力/温度下呈现出焓和体积 “跳跃”变化的特征,其中,由于原子位置的变化,自由能一阶导数(熵和体积)存在不连续性。

第19行、numImages:15,执行VCNEB的初始虚像的结构的数目。
第20行、numSteps:500,执行VCNEB计算相变路径优化时的最大步数,由于VCNEB计算的过程收敛比较慢,所以一般推荐设置为500。
第21行、optimizerType:1,结构优化采用的算法:1、最速下降法,2、FIRE (Fast Inertial Relaxation Engine)。
第22行、optReadImages:2,虚像结构文件(Images)类型读取选项:0,文件中包含了所有的虚像结构,1,文件中只包含初始和最后的虚像结构,2,文件包含了初始、最后和特别指定中间虚像结构。其中选项1,2其余的虚像结构都是通过线性插值获得。
第23行、optRelaxType:3,结构优化的模式,选项:1,晶胞固定只优化原子位置,经典的NEB的方法;2,只优化晶胞点阵大小(仅仅用作测试);3,晶胞点阵大小和原子位置都优化(变胞优化)。
第24行、dt:0.25,结构优化的时间步,设置的值太小时收敛很慢,设置很大的时候经常产生没意义的相变路径。
第25行、ConvThreshold:0.003,整个VCNEB计算收敛的标准:RMS(Root Mean Square forces)。
第29行、VarPathLength:0.3,变虚像结构方法的虚像结构的路径长度批判准则。当两个相邻虚像结构之间的长度大于VarPathLength的1.5倍时,将使用线性插值方法在两个虚像结构之间添加一个新虚像结构;当长度小于该值的0.5时,将删除第二个虚像结构。
第30行、K_min:3,单位:eV/A^2,最小的弹性常数,只在变弹性常数的VCNEB中使用。
第31行、K_max:6,单位:eV/A^2,最大的弹性常数,只在变弹性常数的VCNEB中使用。
第32行、optFreezing:0,达到收敛标准时,虚像结构是否还变动,0:变,1:不变。
第33行、optMethodCIDI:0,是否采用Climbing-Image (CI)/ Downing-Image (DI)方法,推荐使用0:CI/DI方法不采用。具体讲解如下:

到此案例15的VCNEB计算参数介绍也算完成了,VCNEB就是用来研究固体相变和反应路径的,比NEB更高级一点。
设置完了INPUT.txt,就可以准备计算了,但是需要注意VCNEB计算不需要设置种子文字Seeds,需要设置一个Images的文件,也就是虚像结构文件,包括初始虚像结构和最终虚像结构,(VCNEB就是计算初始结构和最终结构之间的相变路径的),其采用的是VASP4的POSCAR形式,如下图所示:

计算完之后,我们来看看结果!

里面有很多文件,我们不认识,但是没关系的,很多文件通过文字名字也能了解很多,我们一般只熟悉EnergyBarrier.pdf和transitionPath_POSCARs即可,因为EnergyBarrier.pdf里面放的是反应路径中虚像结构和能量的图,而transitionPath_POSCARs则是这个反应路径中对应的虚像结构的POSCAR文件。综合EnergyBarrier.pdf和transitionPath_POSCARs这两个文件,可以得到如下漂亮的结果:

图中,展示了初始、最终和中间鞍点的Ar结构,其余结构就没多做演示了。但是从这个这个图可以看出VCNEB计算相变路径的强大的能力。但是为什么选择这个路径了?从计算结果文件里面查看PATH这个文件夹内容,就会发现有500个相变路径(和INPUT.txt的参数numSteps对应),但是最后还是找到EnergyBarrier的反应路径(step 434),因为这个是实际情况最接近了,也可以从SelectedEnergyBarrier.pdf文件里面直观看出来为什么选择step 434:

从初始的fcc-Ar结构怎么变成了最后的hcp-Ar结构了?VCNEB给出最佳路径和中间反应的一系列的结构是不是真实的?从这个方法的程序编写者钱博士(虽然他现在不从事科研,去做人工智能创业)的PPT中可以看到VCNEB还是比较有用的:

上面讲了很多VCNEB在USPEX程序中的参数设置和简单的结果的文件分析,但是这个VCNEB方法跟NEB有什么区别了?或者说它的原理是什么了?可以看出在Update Images这个过程当中使用的进化算法进行迭代,其余过程和NEB计算过程都差不多。还有一个特别值得一提的是:VCNEB能够给出一个相对可靠的相变路径,但是结合TPS(Transition Path Sampling)方法,能够给出更可靠的相变路径,这是这个方法存在的意义!

总结

案例14:通过进化准动力学(Evolutionary metadynamics)预测下常压下Si的一系列低能亚稳结构,结构优化采用的是VASP。
案例15:通过VCNEB (variable-cell nudged elastic band)预测下常压下Ar的fcc-hcp的相变路径,结构优化采用的是GULP,并采用Lennard-Jones对势。

这两个案例比较特殊,分别介绍了META、VCNEB两个计算方法,虽然目前这两个方法用的人比较少,但是笔者相信,这两个方法对于某些工作绝对是一个有力的工具。

八、官方案例讲解(16-18)

案例16:变胞定组分预测SrTiO3(50 原子/单胞 )0 GPa下稳定的结构,结构优化采用的是GULP(采用Buckingham势)。(这个案例存在的意义就是为了吊打XtalOpt:也是遗传算法的结构预测软件,USPEX大体系的成功率大于90%,而XtalOpt只有7-12%)。
案例16是300类型,我们的老朋友了,就不介绍INPUT.txt了,直接来看结果吧。300类型的计算,结果需要看哪些文件了?BESTIndividuals和BESTgatheredPOSCARS!

从BESTIndividuals可以看到本次计算了42代结构,计算了大概1400多个结构,最后得到如下的稳定结构:

可见对于单胞50个原子这么大的结构,USPEX也能很快得到稳定的结果,而其中执行结构优化的GULP也功不可没呐。

案例17:以最高德拜温度为目的变胞定组分预测单胞8个C原子的稳定结构,结构优化采用VASP软件包。

案例17还是300类型的计算,但是这次是预测具有最高德拜温度的温度结构,那么也只需要在optType参数中,将我们通用的以焓值为优化目的改为以德拜温度为目的就行了。其余的话,参数设置和一般300类型类似。但是这次需要对Specific文件里面的INCAR做一次了解,因为根据INCAR也能猜测出USPEX究竟怎么计算的。

Specific文件里面有5个INCAR,可以看出第一次和第二次是定体积的结构优化,而第三次和第四次结构优化是变体积的,经过这四步结构优化得到最小能量和相应的构型,最后才做弹性常数计算,因为德拜温度和弹性常数计算相关(当然这些计算是在VASP当中完成的)。

从OUT.txt中可以看出USPEX总共计算了15代共351个结构,这样计算量并不大,因为这个案例是作为演示用的,INPUT.txt里面设置的代数和每代个数并不多。

300计算类型的还需要看的就是BESTIndividuals和BESTgatheredPOSCARS这两个文件。先来看看BESTIndividuals这个文件:

由于这次是根据德拜温度为目标进行稳定结构预测,那么就是根据Fitness大小程度来筛选德拜温度最高的稳定结构,Fitness负的越大的结构,德拜温度更高,接下来我们来看看这个德拜温度最高的稳定结构长什么样?

可以看出只需要在optType参数里面修改优化参数就能获得具有相应特殊性质的稳定结构,这些特殊性质包括:

案例18:三元体系Zn-O-H的变成分结构预测,结构优化还是采用GULP软件进行的。

由于变组分结构预测这方面非常非常重要,我们前面也介绍过两次了,但是这次准备继续再一次仔细介绍一下,因为大部分USPEX文章都是靠这个变组分结构预测方法产生。先来看看INPUT.txt文件:

第4-17行是设置整个大的计算类型和体系,也就是让软件知道采用USPEX方法进行301计算,以焓值最低为目的进行优化(焓值越低越稳定)。而计算哪个体系?Zn-O-H,这三个元素以任意比例构成的结构。
第21-25行是设置USPEX遗传算法种群大小和代数。
第29-33行是设置遗传算法的产生子代结构的具体操作。
第37-46行是设置外挂的第一性原理软件。

USPEX的参数设置总结起来就是,先设置体系和类型,再设置种群和遗传操作,最后设置外挂的第一性原理软件,当然从官方案例拷贝一个类型的INPUT.TXT修改一下就行,不懂的参数USPEX –p xxx,就这么简单。

前面介绍过二元体系的变组分结构预测的结果处理,强调了凸包线的原理和作用,而此次是三元体系的变组分结构预测,还是凸包线吗?想想也是不可能,只能往三元金字塔相图那边想,预测结果最直观的展示就是打开compositionStatistic.pdf文件:

当然看到这个图,肯定会有点懵逼的感觉了,这个图要表达什么意思,这个Stable的结构到底是哪个了?不要着急,这个只是展示结构分布的图,具体的稳定的结构从OUTPUT.txt可以得到的:

这里需要抱怨一下USPEX开发者吧,这里数据并没有处理,三元体系的稳定的结构的成分为三种元素构成,前两个是整数,后一个为啥是小数了?虽然最后一位是小说看起来很别扭,但是这些结构都是我们的指路明灯,有些这些结构我们就能很有针对性和目标性的处理extended_convex_hull和extended_convex_hull_POSCARS这两个重要的文件。

先来看看extended_convex_hull这个文件,这个和二元体系有什么区别,其实是没多大区别的,但是二元体系里面的数据能够生动的和凸包线结合在一起,二元体系里面前面的几行的数据和OUTPUT.txt里面总结出来的稳定结构一一对应,也就是说都是凸包线上的点。而三元体系的数据有点让人摸不着头脑的感觉,看看前面几行的数据和OUTPUT.txt得到的稳定结构对应不上,只能根据OUTPUT.txt得到的稳定结构的成分来搜索。比如想找Zn1O5H10这个成分的稳定结构,直接
grep "1 5 10" extended_convex_hull
一下子就能extended_convex_hull找到好几个成分为Zn1O5H10的结构,当然是焓值最低的结构最稳定,那么ID为9219的结构最稳定了,既然知道了稳定的结构的ID,那么它的原子坐标信息也就好办了,直接上extended_convex_hull_POSCARS搜索一下就行:
grep -n EA9219 extended_convex_hull_POSCARS

很简单一个命令就能找到ID为9219的原子坐标信息所在的行数,那么知道行数以后,直接去extended_convex_hull_POSCARS找。

当然这只是一个结构的处理,OUTPUT.txt那么多稳定的结构还等待读者去处理。当然可以一个个手工去处理,也可以写一个简单脚本去处理。接下来请稍微深入的思考一下:三元体系变组分的有了这么一个初步的结果,怎么把这些结果变成paper了?下面一篇文章能够得到很好答案。
doi: 10.1038/srep18347 (2015)

对于三元变组分结构预测,笔者还有一些需要说道一下:三元变组分搜索的计算巨大,比二元变组分计算量大的不只是一点点,并且准确率还是一个值得考虑的问题,所以一般并不建议采用这个三元体系去计算,除非计算资源很大,并不考虑投入产出的问题,存粹只是为了科研。

就拿Zn-O-H这三元体系计算来说,问题还是比较大的,总共计算了9339种结构,并且每种结构计算了5次,这就是差不多5W次计算,服务器跑起来至少一个月左右。再对结果进行进一步的处理,一个月左右的时间又过去了。这仅仅是一个压强下的结果,而实际上还需要计算不同压强的情况。此外有时候为了更好的处理三元体系的结果,还需要从三元体系里面找一些二元体系进行计算,这是一个庞大的工作。笔者在这里只是想强调三元体系计算变组分并不容易,如果准备三元体系计算变组分还需要做好心理准备。

总结

案例16:变胞定组分预测SrTiO3(50 原子/单胞 )0 GPa下稳定的结构,结构优化采用的是GULP(采用Buckingham势)。300
案例17:以最高德拜温度为目的变胞定组分预测单胞8个C原子的稳定结构,结构优化采用VASP软件包。300
案例18:三元体系Zn-O-H的变成分结构预测,结构优化还是采用GULP软件进行的。301

这三案例都是老朋友,前面都讲过很多次,但还是有些不一样的地方,所以这次教程比较详细的介绍了不同的地方:大体系定组分稳定结构预测、以德拜温度为目的进行定组分结构预测、计算量惊人的三元体系的变组分结构预测。

参考官网:
https://www.vasp.at/wiki/index.php/Machine_learning_force_field_calculations:_Basics

https://www.vasp.at/wiki/index.php/Best_practices_for_machine-learned_force_fields

https://www.vasp.at/wiki/index.php/Machine_learning_force_field:_Theory

vasp6自带的机器学习

on-the-fly训练是基于分子动力学(MD)模拟来采样训练结构。逐步自动组装数据集,并在可行时用于生成MLFF。相反,在每个时间步骤中,当前力场预测能量、力和相应的贝叶斯误差估计。简单来说,如果误差超过一定阈值,将执行另一个从头开始的计算,并将参考能量和力添加到训练数据集中。相反的情况下,从头开始的步骤将被省略,系统将通过MLFF预测进行传播。随着轨迹上力场的改善,许多从头开始的步骤可以被避免,MD模拟将显著加速。最终,现场训练会产生一个准备投入生产的MLFF,即以预测模式运行MD模拟。以下步骤概述了从开始到生产运行的路径:

基础

1、准备

准备POSCAR、POTCAR、KPOINTS和AIMD的INCAR文件。

2、从零开始 on-the-fly训练

1
2
ML_LMLFF = .TRUE.  #开启机器学习
ML_MODE = train #训练模式

将会生成几个重要的文件:

ML_LOGFILE The log file for all MLFF-related details; training status, current errors and other important quantities can be extracted from here.(search err)

ML_ABN This file contains the collected training structures and a list of selected local reference configurations.

ML_FFN A binary file containing the current MLFF.

3、重复训练(可选)

1
2
cp ML_ABN ML_AB
cp CONTCAR POSCAR

也可以重复2步骤完全重新训练。INCAR和其他文件保持不变。如果读取上一步的力场,可以修改POSCAR以完成结构的变化,比如吸附、表面等。

将 ML_MODE 设置为 train 不变,然后重新启动 VASP。日志文件将包含一个描述现有数据集的部分,以及在生成力场之后,常规的即时程序将继续进行。最终,ML_ABN 将包含来自两个即时运行的训练结构。类似地,ML_FFN 文件是一个合并的力场。在存在 ML_AB 文件的情况下,train 模式将始终执行一个续集运行。如果想重新开始,只需从执行目录中删除 ML_AB 文件。

4、refit快速预测

cp ML_ABN ML_AB

INCAR修改:

ML_MODE = refit

会生成新的 ML_FFN。官网提示这一步是必要的。在即时训练成功且结果符合你对适用性和剩余误差的期望时,在力场应用于仅预测的 MD 运行之前还有最后一步需要完成:为快速预测模式重新拟合。再次将最终数据集拷贝到 ML_AB 文件中:

cp ML_ABN ML_AB
同时,在 INCAR 文件中设定:

ML_MODE = refit
运行 VASP 将会创建一个新的 ML_FFN 文件,最终可以用于生产。

重要提示:尽管在技术上可能直接进行第5步,但强烈不建议这样做。没有重新拟合步骤,VASP 无法启用具有大约 20 到 100 倍加速的快速预测模式。你可以检查 ML_FFN 文件的 ASCII 头部信息,确保其中的力场支持快速预测。

5、运行机器学习MD

cp ML_FFN ML_FF

INCAR修改:

ML_MODE = run

选择这个设置后,VASP 将仅使用来自 MLFF 的预测结果,不进行从头算的计算。与相应的从头算运行相比,每个时间步的执行时间将降低几个数量级。

提示:MLFF 可以应用于更大的系统尺寸,即,你可以复制模拟盒以获得改进的统计数据。由于这种方法与原子数呈线性关系,因此你可以轻松估计对计算需求的影响。

ML_MODE参数见:
https://www.vasp.at/wiki/index.php/ML_MODE

建议:

即时学习可能比单点电子计算要复杂得多,因为它结合了 VASP 的多个特征。每个部分都需要通过可用的 INCAR 标签进行适当设置。如果计算的某个部分配置错误,可能会严重影响生成的 MLFF 的质量。在最坏的情况下,成功的训练甚至可能不可能实现。更具体地说,即时学习需要控制以下方面:

一致的收敛性
需要确保通过即时学习收集的所有从头算参考数据在单点电子计算设置方面是一致且收敛良好的。注意分子动力学运行中针对不同温度和密度的目标。一个 MLFF 只能再现单一的势能景观!
正确设置分子动力学模拟
考虑热力学集合的选择、恒温器和恒压器设置以及适当的时间步长。
正确设置机器学习力场参数
注意系统相关参数,如截断半径或原子环境描述符分辨率。
通过即时学习控制数据集生成
监控和控制通过自动贝叶斯阈值确定和稀疏化收集多少从头算参考数据。
质量控制
建立对剩余训练误差的合理期望。通过将预测与已知量(从从头算中)进行比较来评估生成的力场的质量。
提示:在尝试从头开始生成 MLFF 之前,首先要彻底熟悉系统的纯从头算计算。一旦你有信心控制收敛性,可以继续进行一次简短的 MD 模拟,不使用机器学习辅助。验证结果是否符合预期的值,如守恒原理等。只有在这样做之后,才能继续进行计算的机器学习方面。

  • 熟悉第一性原理计算,机器学习之前先进行简短的MD模拟以验证结构是否符合预期。
  • 为了结果的准确性,要注意动态训练收集的参考数据与单点电子计算设置保持一致且收敛良好。注意 MD 运行中针对的不同温度和密度。MLFF只能再现单一的势能!
  • 选择MD过程合适的系综、时间步长等参数

进阶

使用机器学习力场方法,VASP可以基于第一性原理模拟来构建力场。在构建、测试、重新学习和应用力场时,必须仔细考虑许多方面。这里列出了一些最佳实践,但请注意,这个列表并不全面,这种方法尚未被应用到大量系统中。因此,我们建议进行常规严格的监测,这对所有研究项目都是必要的。机器学习力场(MLFF)培训所需的基本步骤可以在机器学习力场计算的基础页面上找到。

要开始训练运行,请将 ML_MODE = TRAIN。取决于在执行 VASP 的文件夹中是否存在有效的 ML_AB,将自动选择两种模式中的一种:没有 ML_AB 文件:训练算法将从零开始。存在 ML_AB 文件:基于现有结构数据库将继续训练。在这种操作模式下,将从现有数据库(ML_AB 文件)生成一个力场,然后从指定的 POSCAR 文件中继续进行 MD 运行。这种模式用于从材料的相空间中选择额外的结构。但也可以用于通过首先训练块材料,然后在 POSCAR 文件中向表面添加分子并继续训练来检查表面。
如果有几个相同种类的原子应该由机器学习算法进行不同处理,重要的是在 POSCAR 文件中给它们不同的名称。例如,如果在块材料中有氧原子并且在表面的分子中也有氧原子,建议在 POSCAR 中将氧原子分成两组,并分别命名为 O1 和 O2。不可能在POSCAR文件中给不同的原子组相同的名称,名称限制为两个字符。训练模式要求VASP执行从头算计算,因此第一步是建立电子最小化方案。

警告:非常重要的一点是在从头开始训练和继续训练之间不要更改INCAR文件中的从头参数设置。同样,在恢复训练时不允许更改POTCAR文件。

第一性原理计算部分

  • 先进行自洽计算,不要设置 MAXMIX>0
  • 一般可以先单胞,然后应用到超胞。
  • 自洽计算检查K点、截断能等收敛情况。
  • (ISYM=0)对于标准的MD
  • NPT等不固定体积的ENCUT要比固体体积大30%。

通常,VASP DFT 计算适用的一切也适用于这里。电子最小化的准则可用于为即时学习设置从头算部分。另外,我们强烈建议在即时学习期间遵循以下关于从头算计算的准则:
当使用用于机器学习的力场时,请不要设置 MAXMIX>0。在机器学习过程中,常常会跳过第一原理计算数百甚至数千个离子步骤,而离子在第一原理计算之间可以有明显的移动。在这些情况下,使用 MAXMIX 往往会导致电子结构不收敛或在自洽循环中出现错误。
通常可以在较小的单元胞上训练力场,然后将其应用于较大的系统。务必选择一个足够大的结构,以便声子或集体振荡“适应”到超晶格中。
学习准确的力很重要。为此,必须检查电子最小化是否收敛。这些检查可能包括 KPOINTS 文件中的 k 点数目、平面波极限(ENCUT)、电子最小化算法等。
关闭标准分子动力学运行的对称性(ISYM=0)。
对于没有固定网格(NpT)的模拟,平面波截断 ENCUT 必须设置得比固定体积计算高出至少 30%。此外,经常重新启动(ML_MODE=TRAIN,工作目录中存在现有的 ML_AB 文件)以重新初始化 KS 轨道的 PAW 基函数并避免 Pulay 应力。

MD部分

  • 有轻原子要减小POTIM或增大轻原子的POMASS,氢原子不超过0.7 fs 氧原子不超过 1.5 fs。
  • TEEND要大于TEBEG,且大于目标温度30%。
  • 最好NPT,或者NVT+ Langevin thermostat,避免NVE。

通过Hellmann-Feynman定理从电子最小化获得力之后,VASP必须传播离子以在相空间中获得新的构型。对于分子动力学部分,熟悉设置分子动力学运行是有利的。此外,在分子动力学部分,我们建议以下设置:

如果系统中含有轻元素,请减小积分步长(POTIM),或者在INCAR或POTCAR文件中增加轻元素质量(POMASS)。作为一个经验法则,时间步长不应超过氢元素和含氧化合物分别为0.7 fs和1.5 fs。然而,对于重元素(如硅),3 fs的时间步长可能效果更好。
如果可能的话,通过温度梯度逐渐加热系统(将TEEND设置得高于TEBEG)。从一个较低的温度(不是零度)开始,并逐渐增加到所需应用温度的30%以上。这将有助于“实时”训练探索相空间的更大部分,并将导致更稳定的力场。
如果可能的话,更倾向于在NpT集合中进行分子动力学训练(ISIF=3)。额外的晶胞波动可以提高所得到的力场的稳健性。但是,对于流体,只允许超晶胞的体积变化,否则晶胞可能“崩溃”,即极端倾斜,使系统成为一层原子。这可以通过ICONST在这里和这里来实现。有关约束晶胞形状的示例输入,请参阅ICONST页面或本页面的末尾。NVT集合(ISIF=2)对于训练也是可以接受的,但使用随机热浴恒温器,因为它非常适合相空间采样(遍历性)。
我们应该尽可能地探索材料相空间的更多部分。因此,应始终避免在NVE集合中训练。

训练部分

  • 分步训练:比如表面吸附分子,先训练晶体,然后表面、单独分子和整个系统。
  • 给定结构,温度、压力越大,误差越大,

ML_MODE=TRAIN已经为机器学习中的即时训练设置了广泛使用的默认值。尽管如此,我们仍然想为设置单独的机器学习参数提供以下指导:

如果系统包含不同组件,首先要分别训练它们。例如,如果系统由一个晶体表面和与该表面结合的分子组成。先训练主要的晶体,然后是表面,可能是孤立的分子,最后是整个系统(如果您不需要描述孤立的分子,可以跳过对该分子的训练)。通过这种方式,可以避免在计算密集型的复合系统中进行大量的从头算计算。

如果在训练过程中没有足够的参考配置(在ML_ABN中可以看到),则应该调整ML_EPS_LOW的默认值,以稀疏使用从ML_AB中提取的局部参考配置。这可以改善训练好的力场的性能。但是,这也可能会降低准确性。

注意:超参数优化应始终从默认值开始。对于流体,减少ML_LMAX2=2和ML_RCUT2=4可能会导致更好的拟合结果。

准确性

力场的可实现准确性取决于许多因素,例如物种、温度、压力、电子收敛、机器学习方法等。在我们实现的核岭回归中,随着本地参考构型数量的增加,力场的准确性也会提高。这种增加并非是线性的,同时计算成本也会线性增加。在生成机器学习力场时,总是存在准确性和效率之间的权衡。

以下是一些经验指南:

对于给定的结构,随着温度和压力的增加,误差也会增加。因此,力场不应该在与目标条件相距太远的条件下进行训练。例如,对于在 300 K 下的生产运行,最好是在这个温度以上(450-500 K)学习,以捕获可能在生产运行中出现的更多结构,但是在比如 1000 K 下学习同一相位并不有益,因为这可能会降低力场的准确性。
液体通常需要更多的训练结构和本地参考构型才能达到与固体类似的准确性。要达到大约 30 meV/埃的误差,液体通常需要 2000-4000 个本地参考构型,而对于简单的周期体积系统,500-1000 个参考构型可能就足够了。
一般来说,能量的拟合误差应该小于 1 meV/原子,而在 300-1000 K 之间的温度下,力的误差应该在 30-100 meV/埃之间。略高于这些值的错误可能是可以接受的,但是这些计算应该仔细检查准确性。

准确的力场:
控制学习和采样的默认参数被选择为在准确性和效率之间提供良好的权衡。特别是,ML_EPS_LOW 的默认设置倾向于在稀疏化步骤中去除本地参考构型,从而限制了准确性。然而,进一步降低 ML_EPS_LOW 至 1.0E-11 以下的值并不会提高准确性,因为在贝叶斯回归中求解的正则化正规方程的条件数大约与在稀疏化过程中考虑的 Gram 矩阵的条件数的平方成正比(见此处)。因此,如果 Gram 矩阵的条件数为 1E9,那么正规方程的条件数就为 1E18,这意味着在解正规方程时会发生精度损失。

要获得保留更多本地参考构型的高度准确的力场,必须使用以下两步过程:

首先,进行完全的即时学习:

ML_IALGO_LINREG=1; ML_SION1=0.3; ML_MRB2=12
这可以由许多不同的训练步骤组成,包括所有所需的结构。将 ML_MRB1 从 8 增加到 12,并将 ML_SION1 从 0.5 减少到 0.3,可以将 Gram 矩阵的条件数提高约 10 倍,并允许稀疏化步骤保留更多本地参考构型(通常约 2 倍)。当然,这会在一定程度上减慢力场计算的速度。

如果无法进行完全的重新训练,还可以尝试仅增加本地参考计算的数量,就像上面描述的那样,通过使用 ML_MODE=SELECT 并选择一个为 ML_CTIFOR 值,以获得令人满意的本地参考构型数量。

其次,使用 ML_MODE=REFIT 对力场进行重新调整。

使用 SVD 而不是求解正则化正规方程可以避免问题的平方化,因此设计矩阵的条件数而不是它的平方变得重要。根据我们的经验,使用默认值 ML_SION1=0.5 进行 SVD 调整总是会提高力场的准确性。

动态调节参数

如果选择了太多或太少的训练结构和本地参考配置,可以调整一些动态参数(关于学习和阈值算法的概述,请参考这里):

ML_CTIFOR:为每个原子的贝叶斯力误差定义学习阈值。在继续运行中,它可以设置为先前运行的ML_CTIFOR的最后一个值。这样可以跳过计算开始时不必要的采样。然而,当从一个结构转移到另一个结构时,此标记应该非常小心设置。ML_CTIFOR取决于物种和系统。例如,低对称结构,比如液体,通常比同一化合物的高对称固体具有更高的误差。如果首先学习液体,并且使用液体的最后一个ML_CTIFOR用于对应的固体,则此ML_CTIFOR对于固体而言太大,所有预测的错误都将低于阈值。因此,在固体上不会进行任何学习。在这种情况下,最好从ML_CTIFOR的默认值开始。ML_CTIFOR的典型可达值约为0.02在300-500 K左右,约为0.06在1000-2000 K左右,因此取决于温度,也取决于系统。

ML_CX:它涉及阈值的计算,ML_CTIFOR =(历史上存储的贝叶斯错误的平均值)*(1.0 + ML_CX)。此标记影响选择训练结构和本地参考配置的频率。ML_CX的正值导致更少的采样(因此更少的自始至终的计算),负值导致相反的结果。ML_CX的典型值介于-0.3和0之间。对于使用加热的训练运行,默认通常会导致平衡良好的机器学习力场。当在固定温度下进行训练时,通常希望将ML_CX减小至-0.1,增加第一性原理计算的数量,从而增加训练集的规模(默认值可能导致训练数据太少)。

ML_MHIS:设置用于更新ML_CTIFOR的先前贝叶斯错误数量(从ML_ICRITERIA的默认学习步骤)。如果在初始阶段之后,阈值更新之间出现贝叶斯错误的强烈变化,并且每次更新后阈值也会发生强烈变化,则可以降低此标记的默认值10。

ML_SCLC_CTIFOR:仅在选择本地参考配置时缩放ML_CTIFOR。与ML_CX相比,此标记不会影响采样的频率(自始至终的计算)。较小的值意味着选择更多的本地参考配置;较大的值意味着选择更少的本地参考配置。

ML_EPS_LOW:控制选定的贝叶斯错误估计本地参考配置数量的稀疏化。增加ML_EPS_LOW会增加删除的本地参考配置数量,减少则相反。此标记也不会影响学习频率,因为在选定新结构的本地参考配置之后才执行稀疏化。我们不建议将阈值增加到大于1E-7的值。在该值以下,此标记可以很好地控制本地参考配置的数量,但是对于多组分系统,稀疏化算法往往会导致不同物种的本地参考配置数量出现明显不平衡。

ML_LBASIS_DISCARD:控制在任何物种的最大本地参考配置数量ML_MB达到之后是否继续计算。先前的默认行为是ML_LBASIS_DISCARD=.FALSE.:当任何物种的本地参考配置数量达到ML_MB时,计算将停止并要求增加ML_MB。在多组分系统中,对于一种物种,稀疏表示很快超过ML_MB,而其他物种的本地参考配置尚未被确定地描述,并且仍远低于限制ML_MB。因此,目前的默认值是ML_LBASIS_DISCARD=.TRUE.:在这种情况下,代码在达到阈值时处置本地参考配置。它是根据物种而不同的。

实时学习监控

你的学习监控可以分为两部分:

分子动力学/系综相关数量:

通过视觉方式监测结构。这意味着查看带有结构/轨迹查看器的CONTCAR或XDATCAR文件。很多时候,当出现问题时,可以立即追溯到不希望或非物理形变。

OUTCAR、XDATCAR和CONTCAR文件中的体积和晶格参数。确认平均体积保持在期望范围内是很重要的。在恒温恒压运行中,如果平均体积随时间发生强烈变化,表明可能存在相变或未适当平衡系统。特别麻烦的是在单个VASP运行期间发生强烈的剪切:由于VASP保持平面波基组固定并最初使用球形截断球,截断球实际上变成一个椭球。也就是说,截断球在某些倒易格子方向上变小。在单次运行中,晶格矢量的变化超过10%必须避免。相关的数据文件(ML_AB)不适合继续训练(将你的计算分批进行)。

OUTCAR和OSZICAR文件中的温度和压力。计算开始时温度和压力与期望值存在较大偏差,表明起始位置未适当平衡。如果期望特征发生强烈振荡,可以使用块平均值来监测它们(有关块平均值的更多信息,请参见下文中的“应用”)。
成对关联函数(PCDAT)。

ML_LOGFILE文件中的机器学习特定量:

每核所需内存估计。这在分配之前写在ML_LOGFILE的开头(见这里)。非常重要的一点是,如果所需内存超过物理可用内存,计算不会立即在静态数组分配时崩溃,因为许多系统使用懒惰分配。在内存不足之前,计算可能运行很长时间。因此,必须在启动后始终检查内存估计。
状态:显示每个分子动力学步骤发生的情况。当状态为“学习/关键”时,状态“力场”被更新。从一开始就经常监测这个变量(在ML_LOGFILE.1中搜索“状态”ML_LOGFILE.1|grep -E ‘learning|critical’|grep -v“#”)。如果经过50次迭代后计算仍然在每步更新“力场”,这表明计算中有严重问题。如果计算在几步后停止学习并且以后仅进行力场步骤,那么将不会得到有用的力场。在理想的学习中,力场更新频率一开始很高,然后持续降低,直到算法只是间歇性地学习。需要注意的是,由于贝叶斯错误的近似预测,学习频率永远不会降到零。如果在分子动力学运行的后期阶段学习频率突然增加,通常表示正在探索当前力场未知的新相空间。但在训练结束时学习步骤的突然增加也可能表明系统发生了不希望的变形,这需要仔细研究。

LCONF:每个学习步骤的本地配置数。

ERR:关于从头计算数据对于所有训练结构到当前分子动力学步骤的预测能量、力和应力
${\displaystyle \Delta O={\sqrt {\sum \limits {N}(O{\mathrm {AI} }-O_{\mathrm {MLFF} })^{2}/N}}}$. 这里
N遍历所有训练结构的能量,逐元素遍历每个训练结构,乘以每个结构中每个原子的个数乘以三个笛卡尔方向的力,逐元素遍历每个训练结构,乘以张量的九个成分的每个张量组分力。

BEEF:能量、力和应力的估计贝叶斯错误(列3-5)。力的最大贝叶斯误差ML_CTIFOR的当前阈值在列6上。

THRUPD:ML_CTIFOR的更新。

THRHIST:用于ML_CTIFOR的贝叶斯错误历史。

力的真实误差(ERR的第4列)、贝叶斯误差(BEEF的第4列)和阈值(BEEF的第6列)的典型演变如下所示:

ICONST

在ICONST文件中定义了几何参数,然后在分子动力学模拟中进行监控或控制。例如,两个位置之间的距离可以通过偏差势的作用来约束或影响。最后,VASP将输出写入REPORT文件。

In case of primitive coordinates

flag = R: interatomic distance between atoms item(1) and item(2).

flag = A: angle defined by atoms item(1), item(2) and item(3) (with the atom item(2) being the apex).

flag = T: torsional angle defined by atoms item(1), item(2), item(3) and item(4).

flag = M: distance between atom item(1) and the center of bond between atoms item(2) and item(3).

flag = B: distance between the center of bond between atoms item(1) and item(2) and the center of bond between atoms item(3) and item(4)

flag = P: ratio of length of the bond between atoms item(1) and item(2) and the length of the bond between atoms item(3) and item(4)

flag = W: function
${\displaystyle {\frac {1-\left(R/c\right)^{M}}{1-\left(R/c\right)^{N}}}}$ wit with
𝑅 being the bond length (in Å) between the atoms item(1) and item(2),
𝑐 is the reference bond length specified as item(3), and the exponents 𝑀 and 𝑁 are defined as item(4) and item(5), respectively.

flag = X, Y, and Z: fractional (direct) coordinates linked with the lattice vectors
𝑎, 𝑏, and 𝑐.

flag = cX, cY, and cZ: Cartesian coordinates
𝑥, 𝑦, and 𝑧.

flag = LR: length of lattice vector item(1)

flag = LA: angle between lattice vectors item(1) and item(2)

flag = LV: cell volume (no item(i) is defined in this case)

complex coordinates

flag = S: simple linear combination of primitive coordinates, i.e., $\left(\xi =\sum { {i=1} }^{ {M} }c{i},q_{i}\right)$.

flag = C: norm of the vector of primitive coordinates, which reads
$\left(\xi ={\sqrt {\sum { {i=1} }^{ {M} },(c{i},q_{i})^{2}}}\right)$.

flag = D: coordination number[1], i.e.,
$\left(\xi =\sum { {i=1} }^{ {M} }{\frac {1-\left(q{ {i} }/c_{ {i} }\right)^{9} }{1-\left(q_{ {i} }/c_{ {i} }\right)^{ {14} }}}\right)$.

flag = IS: path-based coordinate[2] measuring progress along discretized path represented by
${\displaystyle {\tilde {q}}(j)}$ predefined in file IRCCAR, i.e.,
${\displaystyle \xi ={\frac {1}{N-1}}{\frac {\sum {i=1}^{N}(i-1)\exp \left(-\sum {j=1}^{M}c{j}(q{j}-{\tilde {q}}{j}(i))^{2}\right)}{\sum {i=1}^{N}\exp \left(-\sum {j=1}^{M}c{j}(q{j}-{\tilde {q}}{j}(i))^{2}\right)}}}$

flag = IZ: path-based coordinate[2] measuring orthogonal distance from the path ${\displaystyle {\tilde {q}}}$ predefined in file IRCCAR, i.e.,
${\displaystyle \xi =-{\frac {1}{c_{1}}}\log \sum _{i=1}^{N}\exp \left(-\sum {j=1}^{M}c{j}(q-{\tilde {q}}(i))^{2}\right)}$ with 𝑁 as defined above The complex coordinates are functions defined in the space spanned by the primitive coordinates.

Mind: 所有复杂坐标都必须在最后一个基本坐标之后定义。一旦定义了复杂坐标,基本坐标只是它们定义的基础,它们的状态就会被忽略。

Settings for item(i)

它取决于标志的设置。在大多数情况下,item(i)是一个整数,指定原子的位置或晶格矢量在POSCAR文件中的位置。请注意,需要两个原子来定义键长,需要三个原子来定义键角等等。在标志W的特殊情况下,还通过item(i)定义一些额外的参数,即参考键长(通常是一个浮点数)和用于定义的指数(整数)。请查看相应标志的描述信息。

Settings for status

status = 0: the coordinate is constrained.

status = 4: the coordinate is affected by a Fermi-type step function

status = 5: the coordinate defines the collective variable in metadynamics

status = 7: the coordinate is monitored

status = 8: the coordinate is affected by a harmonic potential

例子1:

1
2
3
R 1 6 0
R 1 5 0
S 1 -1 0

第一行代表原子1和6的距离,末尾0代表状态为约束。同样第二行代表原子1和5的距离,状态约束。

第三行代表复合坐标调节,S代表原始坐标的简单结合;后面代表两个键长的差值。

无论复合坐标调节何时定义都要以原始坐标为基础,因此尽管键长状态是0,但它受第三行控制。假如要固定第一个键长和复合坐标调节,应该设置为例2。

例子2:

1
2
3
4
R 1 6 0
R 1 5 0
S 1 -1 0
S 1 0 0

如果1-6距离是1.1 Å,1-5是1.5 Å,可以用两种方式调节。

(1) 用复杂调节参数D

1
2
3
R 1 6 0
R 1 5 0
D 1.1 1.5 0

在这种情况下,出现在定义 D 的公式的分子和分母中的指数分别固定为值 9 和 14。

(2) 使用 W 原始和 S 复杂坐标来固定相同的配位数

1
2
3
W 1 6 1.1 9 14 0
W 1 5 1.5 9 14 0
S 1 1 0

这种格式的优势在于,可以为每个距离单独设置系数 M 和 N (请参阅上面 W 的定义)。此外,这种格式还允许简单直观地定义多个配位数的按比例总和和/或差异,只需通过与 S 相关联的系数的合适选择即可,这些系数可以是正、负或零。

例子3:约束体积或形状

  1. 固定体积变形状
    1
    LV 0
  2. 固定基矢角度变长度
    1
    2
    3
    LA 1 2 0
    LA 1 3 0
    LA 2 3 0
  3. 固定形状立方晶系变体积

Note that the S type constraints involving the lengths of the lattice vectors (𝑎𝑖−𝑎𝑗=0) are chosen so as to preserve ratios 𝑎1:𝑎2:𝑎3=1:1:1, as required by the cubic shape.

1
2
3
4
5
6
7
8
9
10
11
12
LA 1 2 0
LA 1 3 0
LA 2 3 0
LR 1 0
LR 2 0
LR 3 0
S 1 0 0 0 0 0 0
S 0 1 0 0 0 0 0
S 0 0 1 0 0 0 0
S 0 0 0 1 -1 0 0
S 0 0 0 1 0 -1 0
S 0 0 0 0 1 -1 0
  1. 固定单斜晶系变体积

Here, in order to fix ratios between the lengths of the lattice vectors (𝑎1:𝑎2:𝑎3), we define the constraints of the form 𝑐𝑖∗𝑎𝑖+𝑐𝑗∗𝑎𝑗=0. For instance, if the cell vectors are such that the relative proportions of their lengths are 𝑎1:𝑎2:𝑎3=1:1.5:2, the following ICONST can be used:

1
2
3
4
5
6
7
8
9
10
11
12
LA 1 2 0
LA 1 3 0
LA 2 3 0
LR 1 0
LR 2 0
LR 3 0
S 1 0 0 0 0 0 0
S 0 1 0 0 0 0 0
S 0 0 1 0 0 0 0
S 0 0 0 1.5 -1.0 0.0 0
S 0 0 0 2.0 0.0 -1.0 0
S 0 0 0 0.0 4.0 -3.0 0

REPORT

输出文件REPORT包含有关MD运行的信息,例如模拟中使用的参数列表,受控几何参数的值,与热浴(Andersen热浴)的碰撞次数,计算自由能梯度所需的数量等。

监控几何参数

仅适用NVT系综。在ICONST文件中,状态为7的几何参数在MD模拟期间进行监控。相应数值在每个MD步骤之后的Monit_coord字符串后的行中写入REPORT文件。

有时,如果所有监控参数的数值大于预定义的上限和/或下限,终止模拟是可取的。用户可以通过VALUE_MAX和VALUE_MIN标签设置这些限制。

在MD运行期间监控几何参数:

  • 设置标准的MD相关标签:IBRION=0,TEBEG,POTIM和NSW
  • 设置MDALGO=2,并选择适当的SMASS设置
  • 在ICONST文件中定义几何约束,并将受约束坐标的状态参数设置为7
  • 可选地,通过VALUE_MAX和VALUE_MIN标签分别设置坐标的上限和/或下限。

Metadynamics

仅适用NVT系综。
要运行带有Andersen热浴的元动力学,需要做到:

  • 设置标准的分子动力学相关标签:IBRION=0,TEBEG,POTIM和NSW。
  • 设置MDALGO=1(或在VASP 5.x中为MDALGO=11),并选择适当的ANDERSEN_PROB设置。
  • 设置参数HILLS_H,HILLS_W和HILLS_BIN。
  • 在ICONST文件中定义集体变量,并将集体变量的STATUS参数设置为5。
  • 如果需要,在PENALTYPOT文件中定义偏置势。
  • 实际的时间相关偏置势被写入HILLSPOT文件,在添加新的高斯函数后进行更新。在模拟开始时,VASP尝试从PENALTYPOT文件中读取初始偏置势。要继续进行元动力学运行,将HILLSPOT复制到PENALTYPOT中。每个MD步骤的所有集体变量的值都列在REPORT文件中,在字符串“Metadynamics”之后检查这些行。

从头算分子动力学(ab initio molecular dYnamics, AIMD),又称为第一性原理分子动力学,为研究电子与原子核相互耦合系统的力学进动过程的理论方法。AIMD是在早期经验力场分子动力学基础上发展起来的理论方法。经验力场分子动力学中,针对原子核之间相互作用,均采用经验性的力场,这种力场往往是对相互作用,基于这些相互作用势场好处是计算量小,能够模拟的体系较大,模拟时长也比较长,统计数据也较多。

最初的AIMD为理想的Born-Oppenheimer分子动力学(BOMD),该理论将原子核-电子耦合体系的运动问题拆分为电子结构和分子动力学两部分,用密度泛函(DFT)等方法对特定原子核构型下的电子结构进行计算,得到K-S轨道及能量,在此基础上得到理想B-O势能面上原子核感受的势能和力,进而用经典力学来考察原子核在Born-Oppenheimer势能面上的运动。

为解决理想的BOMD所遇到计算瓶颈的问题,Reberto Car和Michele Parrinello于1985年提出了一种近似的BOMD方法- Car-Parrinello MD(简称CPMD)(Car, R., & Parrinello, M,1985)。该方法首次使用了一个扩展的Lagrangian量来描述电子-原子核耦合体系的动力学问题,Lagrangian量引入了虚拟电子质量u,基于这个Lagrangian量可给出运动方程,通过原子核的经典运动来近似更新电子波函数,而不再需要每一步通过矩阵对角化对电子结构进行SCF计算,简化了电子结构计算,大幅降低了计算成本,使得AIMD在技术上首次具备了可操作性,开创了近几十年AIMD模拟的时代。

第一性原理分子动力学(AIMD)结果分析

与经典分子动力学不同,第一性原理分子动力学不需要提供力场参数,只需要提供原子初始结构,就能根据电子波函数正交化产生的虚拟力,求解牛顿运动方程。在运行优化任务时,VASP生成的XDATCAR记录的是优化步骤的离子构型;在运行AIMD任务时,记录的就是运动轨迹。而现阶段读取XDATCAR轨迹分析性质的后处理软件并不多,能读取的兼容性也并不好。__VASPKIT0.72版本之后支持了将XDATCAR转换成通用的多帧PDB文件的功能(504)以便可视化并进行后处理分析__。但是并没有提供后处理分析接口,因此我们开发了一个Python脚本XDATCAR_toolkit.py,除了实现了选择一定范围内的帧数转换成PDB文件的功能,还可以提取分子动力学模拟过程中的能量,温度并做出变化趋势图。这对判断动力学是否平衡很有帮助。另外本脚本预留了接口,可以调用读取每一帧的晶格信息和原子坐标,以便进行后续扩展编程。此脚本需要安装了numpy包的python环境,以及matplotlib包以便于画图。

在得到通用轨迹PDB文件后,就可以利用现用的分子动力学后处理软件进行处理分析,比如VMD,MDtraj,MD Analysis, Pymol等。__本教程将演示通过VMD和MD Analysis软件包分析RDF(径向分布函数)和RMSD(均方根偏差)__,前者可以用来分析结构性质,后者对判断结构是否稳定以及模拟是否平衡很有帮助。

将XDATCAR转换成PDB文件
以VASP官网中单个水分子的AIMD模拟为例。模拟的输入文件如下,模拟的步长是0.5fs,模拟步数1000步,模拟时间500fs。脚本和测试例子可以在Github仓库(https://github.com/tamaswells/VASP_script/tree/master/XDATCAR_tookit)下载。

图1. 模拟的盒子
INCAR

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
PREC = Normal    ! standard precision 
ENMAX = 400 ! cutoff should be set manually
ISMEAR = 0 ; SIGMA = 0.1

ISYM = 0 ! strongly recommened for MD
IBRION = 0 ! molecular dynamics
NSW = 1000 ! 1000 steps
POTIM = 0.5 ! timestep 0.5 fs

SMASS = -3 ! Nose Hoover thermostat
TEBEG = 2000 ; TEEND = 2000 ! temperature

NBANDS = 8

POSCAR

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
H2O _2
0.52918 ! scaling parameter
12 0 0
0 12 0
0 0 12
1 2
select
cart
0.00 0.00 0.00 T T F
1.10 -1.43 0.00 T T F
1.10 1.43 0.00 T T F

KPOINTS

{.line-numbers}
1
2
3
4
Gamma-point only
1 ! one k-point
rec ! in units of the reciprocal lattice vector
0 0 0 1 ! 3 coordinates and weight

模拟完成后将XDATCAR_toolkit.py上传到文件夹中(或者置于环境变量的路径文件夹中并赋予可执行权限即可直接调用命令XDATCAR_toolkit.py运行脚本),在shell环境中运行以下命令:

python XDATCAR_toolkit.py -p -t 0.5 --pbc
即可将XDATCAR的全部帧也就是0~499.5fs的轨迹转化成PDB格式。其中-p用于开启PDB转换功能,-t 0.5用于指定时间步为0.5fs,–pbc用于获取基于第一帧演变的连续轨迹。

1
2
3
4
5
6
Now reading vasp MD energies and temperature.
Now reading vasp XDATCAR.
Total frames 1000, NpT is False
Finish reading XDATCAR.
Selected time-range:0.0~499.5fs
[debug] Now entering function plotfigure.....

运行完成后,将会在文件夹内生成Temperature.dat,Energy.dat,ENERGY.png和XDATCAR.pdb四个文件,前面两个分别为温度和能量随着模拟时间的的变化数据,第三个是使用matplotlib绘制的趋势图(如下图),最后一个是转换得到的轨迹PDB文件,可以用于可视化轨迹,亦可用于后处理分析。

-b参数用于指定转换从哪一帧开始,-e参数用于指定转换到哪一帧结束。经刘锦程博士建议,增加一个–pbc的选项,用于处理周期性获取连续的轨迹。当分子穿过盒子边界时,记录真实的位置坐标(尽管它出了边界)而不是从盒子另一边穿入的ghost原子的坐标。这对于分析与时间相关性的量(比如RMSD)很有帮助。所谓连续指的是后面的轨迹都是从第一帧演变得到的真实坐标,但是并不能保证第一帧的分子是完整的,由于周期性的缘故,第一帧内摆放的分子可能分处于盒子两侧。李继存老师有篇博文(http://jerkwin.github.io/2016/05/31/GROMACS%E8%BD%A8%E8%BF%B9%E5%91%A8%E6%9C%9F%E6%80%A7%E8%BE%B9%E7%95%8C%E6%9D%A1%E4%BB%B6%E7%9A%84%E5%A4%84%E7%90%86/)讲的很明白,可以参考。如果发现第一帧内分子不完整,可以通过添加`-i 1参数将分子向第一个原子靠近平移以获得完整的分子。如果发现不理想,可以通过调整-i`的参数获得完整的分子。

图2. 温度和系统能量的变化趋势图
RDF径向分布函数分析

得到PDB文件后,可以使用VMD,MD Analysis等分子动力学后处理软件进行分析。

使用VMD分析工具分析

打开VMD,将PDB文件拖入显示窗口,在主菜单VMD Main中选择

Extensions-Analysis-Radial Pair Distribution Function g(r),选择分析H(type H)在O(type O)周围的概率分布。值得注意的是分析RDF时,横坐标也就是max r不能超过盒子最小边长的一半,也就是得满足最小映像约定。如图4所示,在计算RDF时,如果max r的取值大于盒子最小边长的一半,就有可能重复算到一个粒子和它的映像粒子,这使得程序的周期性判断失准。将生成的dat文件的第一列和第二列作图即可得到RDF图。

图3. VMD中计算RDF

图4. 最小映像约定示意图

使用 MD Analysis分析 RDF

MD Analysis是一个成熟的分子动力学后处理软件,使用Python编写,开源。其教程不仅步骤详细还会给出背景理论知识。可以通过conda或者pip工具在线安装。

1
2
3
4
conda config --add channels conda-forge
conda install mdanalysis
#or
pip install --upgrade MDAnalysis

RDF分析的介绍和使用方法在网页(https://www.mdanalysis.org/docs/documentation_pages/analysis/rdf.html#radial-distribution-functions-mdanalysis-analysis-rdf)上查看。使用以下的脚本得到在O原子周围找到H原子的概率,并调用`matplotlib`绘制RDF图。在1.0 Å
处出现一个尖峰,也就是对应了O-H键的平衡键长(0.96$Å$)。

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import MDAnalysis
import MDAnalysis.analysis.rdf
import matplotlib.pyplot as plt

u = MDAnalysis.Universe('XDATCAR.pdb', permissive=True)
g1= u.select_atoms('type O')
g2= u.select_atoms('type H')
rdf = MDAnalysis.analysis.rdf.InterRDF(g1,g2,nbins=75, range=(0.0, min(u.dimensions[:3])/2.0))

rdf.run()

fig = plt.figure(figsize=(5,4))
ax = fig.add_subplot(111)
ax.plot(rdf.bins, rdf.rdf, 'k-', label="rdf")

ax.legend(loc="best")
ax.set_xlabel(r"Distance ($\AA$)")
ax.set_ylabel(r"RDF")
fig.savefig("RDF_all.png")
#plt.show()

图5. RDF_O_H
RMSD均方根偏差分析

VMD分析RMSD

确保使用了-pbc参数以获取连续的轨迹,将生成的XDATCAR.pdb文件拖入显示窗口。如图6右所示,第一帧内水的三个原子不在同一个镜像内,分子不完整。在进行RMSD分析时,尽管轨迹是连续的,但是在对齐分子时就会出现问题。因此在本例中需要选择第一个原子作为中心将分子平移完整,在图6左中,分子已经在同一个镜像中了。

python XDATCAR_toolkit.py -p -t 0.5 --pbc -i 1

图6. 完整和不完整的水分子
将重新生成的PDB文件拖入显示窗口,在主菜单VMD Main中选择Extensions-Analysis-Analysis-RMSD Trajectory Tool,在计算RMSD前必须先做Align(对齐),这会使得每一帧结构进行平移、旋转来与参考帧的结构尽可能贴近,从而使得RMSD最小化。刘锦程提到研究生物法分子的RMSD时需要对齐操作,而研究小分子时不需要对齐分子。

图7. VMD中计算RMSD

把左上角文本框里的默认的Protein改成all(代表所有原子都纳入考虑),然后把noh复选框的勾去掉(否则将忽略氢原子)。然后点右上角的ALIGN按钮,此时所有帧的结构就已经对齐了。本例中演示以模拟的第一帧为参考,分析氧原子位置的均方根偏差。因此在Reference mol那里选top作为参考结构,左上角文本框由all改为type O(代表计算O原子的RMSD),然后勾上Plot复选框,最后点击RMSD按钮即可得到O原子的RMSD图。在File菜单栏可以选择导出dat数据。

图8. VMD中未对齐轨迹计算的RMSD

图9. VMD中对齐了轨迹后计算的RMSD

使用 MD Analysis分析 RMSD

RMSD分析的介绍和使用方法在网页(https://www.mdanalysis.org/docs/documentation_pages/analysis/rms.html?highlight=average)上查看。

使用以下的脚本可以分别得到所有原子,氢原子,氧原子的RMSD,并调用matplotlib绘制RMSD图。网页中有一段话(Note If you use trajectory data from simulations performed under periodic boundary conditions then you must make your molecules whole before performing RMSD calculations so that the centers of mass of the selected and reference structure are properly superimposed.)也就是在计算RMSD的时候选择的分子必须是完整的,不能分处于盒子的两边。这与我们之前的描述是一致的。MD Analysis默认对齐了分子。

使用以下脚本可以绘制对齐了轨迹后所有原子,氧原子和氢原子的RMSD。

{.line-numbers}
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
import MDAnalysis
import MDAnalysis.analysis.rms
import matplotlib.pyplot as plt

u = MDAnalysis.Universe('XDATCAR.pdb', permissive=True)
ref = MDAnalysis.Universe('XDATCAR.pdb', permissive=True) # reference (with the default ref_frame=0)
ref.trajectory[0] #use first frame as reference
R = MDAnalysis.analysis.rms.RMSD(u, ref,
select="all", # superimpose on whole backbone of all atoms # align based on all atoms
groupselections=["type H","type O"],
filename="rmsd_all.dat",center=True)#, # CORE
timestep=0.0005 #0.5fs from fs to ps as Reader has no dt information, set to 1.0 ps
R.run()
rmsd = R.rmsd.T # transpose makes it easier for plotting
time = rmsd[1]*timestep

fig = plt.figure(figsize=(5,4))
ax = fig.add_subplot(111)
ax.plot(time, rmsd[2], 'k-', label="all")
ax.plot(time, rmsd[3], 'r--', label="type H")
ax.plot(time, rmsd[4], 'b--', label="type O")
ax.legend(loc="best")
ax.set_xlabel("time (ps)")
ax.set_ylabel(r"RMSD ($\AA$)")
fig.savefig("rmsd_md_analysis.png")

应用python工具pymatgen,

可以直接得到MSD,diffusion,donductivity。

得到XDATCAR后,需要首先配置pymatgen。
需要用到conda命令,windows:可以安装anaconda3,通过spyder启动。
进入anaconda prompt中启动中断,配置conda environment:

1
2
conda create –name my_pymatgen python
activate my_pymatgen

linux环境下一个比较好的选择是安装miniconda3
wget https://repo.anaconda.com/minico … -Windows-x86_64.exe

bash Miniconda3-latest-linux-x86_64.sh
如果原来在bashrc中配置了anaconda,则注释掉,重启terminal。
与windows下相同,需要设置一个pymatgen环境。

1
2
conda create –name my_pymatgen
source activate my_pymatgen

在my_pymatgen环境下安装 pymatgen:

conda install --channel conda-forge pymatgen

安装好之后运行建立如下test.py脚本, 可以得到结果:

{.line-numbers}
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
import os
from pymatgen.core.trajectory import Trajectory
from pymatgen.io.vasp.outputs import Xdatcar
from pymatgen import Structure
from pymatgen.analysis.diffusion_analyzer import DiffusionAnalyzer
import numpy as np
import pickle

# 这一步是读取 XDATCAR,得到一系列结构信息
traj = Trajectory.from_file('XDATCAR')

# 这一步是实例化 DiffusionAnalyzer 的类
# 并用 from_structures 方法初始化这个类; 300 是温度,1POTIM 的time step,1000是间隔步数
# 间隔步数(step_skip)不太容易理解,但是根据官方教程(这里具体怎么回事我不太清楚,好像potim*step_skip需要小于10001000NSW值,这是我没彻底弄清楚的地方):
# dt = timesteps * self.time_step * self.step_skip

diff = DiffusionAnalyzer.from_structures(traj,'Li',300,1,1000)

# 可以用内置的 plot_msd 方法画出 MSD 图像
# 有些终端不能显示图像,这时候可以调用 export_msdt() 方法,得到数据后再自己作图
diff.plot_msd()
diff.export_msdt("write_msd")
# 接下来直接得到 离子迁移率, 单位是 mS/cm,diffusity单位是 cm^2/S

C = diff.conductivity
D = diff.diffusivity
with open('result.dat','w') as f:
f.write('# AIMD result for Li-ion\n')
f.write('temp\conductivity\diffusivity\n')
f.write('%d\t%.2f %.10f' %(300,C,D))

在1.dat中是msd,conductivity和diffusivity会直接输出在result.dat中,模拟石墨烯表面Li的MD(excessive state)结果diffusivity为2*10-7 cm^2/S,我觉得算出diffusivity后自己求conductivity比较好,请问应该怎么求?与文件对比,基本吻合(J. Phys. Chem. Lett. 2010, 1, 1176–1180;https://pubs.acs.org/doi/10.1021/jp910134u)。
其它不对的地方,欢迎批评指正。
参考:
https://pymatgen.org/installation.html
https://www.bigbrosci.com/2020/09/08/A18/

VTST的脚本里有一个xdat2xyz.pl,可以直接把XDATCAR转化成movie.xyz文件。xdatcar可以通过ase转换成ms的xtd,也可以转ext-xyz,理论上支持xyz格式的程序也能打开。ase convert xdatcar xxx.xtd(注意会生成隐藏文件xxx.arc,如果要移动xtd,应该要使两个文件在相同的目录)。

事实上,有xtd格式的话,如果你有MS的版权,有些针对xtd格式的分析其实可以直接在MS里面做。arc文件跟着xtd一块拷贝到相同目录。

离子的电导率

Pymatgen 是 python materials genomics 的缩写,它是一款基于 python 的、开源的、强大的材料分析软件(https://pymatgen.org/)。

Pymatgen 包含一系列能够表示元素(Element)、位点(Site)、分子(Molecule)、和结构(Structure)的类(Class)。它具有为很多计算软件提供前处理和后处理的能力。这些计算软件包括VASP,ABINIT,exciting,FEFF,QCHEM,LAMMPS,ADF,AIIDA,ASE,Gaussian,Lobster,Phonopy,Shengbte,Pwscf,和Zeo++等等。它能实现科研狗的众多后处理需求,包括生成相图(Phase diagram)和布拜图(Pourbaix diagrams),分析态密度和能带等等。

Pymatgen 还提供了很多数据库(Materials Project REST API,Crystallography Open Database,and other external data sources)的接口,方便大家从数据库中查询结构和其他数据。

以下是Pymatgen官网提供的后处理的例子:

Top: (left) Phase and (right) Pourbaix diagram from the Materials API. Bottom left: Calculated bandstructure plot using pymatgen’s parsing and plotting utilities. Bottom right: Arrhenius plot using pymatgen’s DiffusionAnalyzer.

本文就介绍一下如何使用 Pymatgen 的 DiffusionAnalyzer 类去计算锂离子固态电解质中锂离子电导率。

计算离子电导率的理论与公式

目前,比较准确的计算离子电导率的方法是先用NVT系综第一性原理分子动力学(AIMD,ab initio molecular dynamics)模拟材料中离子在不同温度下的运动,然后计算出离子的平均(average)均方位移(MSD,mean square displacement),再计算出自扩散系数(D
,self-diffusion coefficient),最后求得离子在某温度下的电导率(
,conductivity)。

如何进行AIMD计算

AIMD计算通常非常耗时,所以,为了减少计算成本,我们可以适当放宽计算精度。如果用 VASP 进行计算,具体的,大家可以

采用较小的截断能。氧化物用 400 eV,硫化物用 280 eV,硒化物用 270 eV
采用Gamma点作为K点设置,并使用gam版本的 VASP 进行计算
采用单胞计算,如果材料的单胞包含比较多的原子
采用合适的步长,比如2 fs,即 POTIM = 2
后处理的基本公式
一旦AIMD计算完成,大家就可以着手计算离子电导率了。本文首先先介绍以下计算过程中使用的公式,方便有兴趣的同学自己开发脚本。

平均均方位移(average MSD)可以通过以下公式计算:

是第
个离子在
时刻的位移。

自扩散系数(
)可以通过以下公式计算:

是离子在材料中的扩散维度(一般地,
),
是离子扩散的时间。

最后,离子电导率(
)可以这样计算:

是材料中的离子密度,
是元电荷,
是离子的价态,
是玻尔兹曼常数,
是温度。

电导率计算的例子
现在我们通过一个 Li_Sn_S 材料的例子来详细了解一下整个计算和处理的过程。该材料的结构显示如下:

本例中采用单胞做计算,INCAR 设置如下:

[test@ln0%tianhe2 li_sn_s]$ vi INCAR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ISTART = 0
ICHARG = 2
IBRION = 0
ISIF = 2
NPAR = 8
NSW = 30000
TEBEG = 900 #还要设置成 1500K 等等
PREC = N
POTIM = 2
SMASS = 0.0
NELMIN = 4
LWAVE = F
LCHARG = F
IALGO = 48
LREAL = A

AIMD 计算结束之后会得到 XDATCAR 文件。很多时候,由于超算的时间限制,一个完整的AIMD计算需要提交两三次,从而产生两三个 XDATCAR 文件,这时,我们只要把它们按顺序通过 cat 命令合并在一起就行。例如我们有三个 XDATCAR 文件,分别命名成 XDATCAR01,XDATCAR02,和 XDATCAR03。

[test@ln0%tianhe2 li_sn_s]$ cat XDATCAR01 XDATCAR02 XDATCAR03 > XDATCAR
新得到的XDATCAR文件,注意删掉重复的与晶格信息相关的行,一般续算的次数也不多,在使用上面命令的时候,手动把XDATCAR02, XDATCAR03 中的删除即可。

Pymatgen 大显身手
安装pymatgen
首先让我们安装 pyamtgen,推荐大家参考官网,使用 anaconda 安装,否则会出现问题。安装好了anaconda之后,不管是 linux 还是 windows, 安装 pyamtgen 的指令是一样的。下面以吕梁天河超算为例:

[test@ln0%tianhe2 li_sn_s]$ conda install –channel conda-forge pymatgen
安装完成后,我们可以试着运行 python,导入 Pyamtgen 模块,如果像下面一样没有出错,就是安装成功了。

1
2
3
4
5
6
[test@ln0%tianhe2 li_sn_s]$ python
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymatgen
>>>

查看 DiffusionAnalyzer 的类
大家可以通过官方文档(https://pymatgen.org/pymatgen.analysis.diffusion_analyzer.html)查看接下来要使用的类,熟悉一下代码的用法。

1
2
3
4
class DiffusionAnalyzer(MSONable):
def __init__(self, structure, displacements, specie, temperature,
time_step, step_skip, smoothed="max", min_obs=30,
avg_nsteps=1000, lattices=None):

这段代码显示,运行这个类需要一系列的输入信息,包括材料结构(structure),位移(displacements),要研究的离子(specie),温度(temperature)等等。

但是这个类提供了很多方法让大家可以通过读取 XDATCAR 或者 vasprun 文件的方式来实例化,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
@classmethod
def from_structures(cls, structures, specie, temperature,
time_step, step_skip, initial_disp=None,
initial_structure=None, **kwargs):
"""
Convenient constructor that takes in a list of Structure objects to
perform diffusion analysis.
Args:
structures ([Structure]): list of Structure objects (must be
ordered in sequence of run). E.g., you may have performed
sequential VASP runs to obtain sufficient statistics.
... ...
"""

好了,废话不多说,直接上代码,开始进行后处理。

代码示例
新建一个文件,名字为li_conductivity.py

‘’’
分析AIMD结果,计算MSD 和 conductivity
‘’’

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
import os
from pymatgen.core.trajectory import Trajectory
from pymatgen.io.vasp.outputs import Xdatcar
from pymatgen import Structure
from pymatgen.analysis.diffusion_analyzer import DiffusionAnalyzer
import numpy as np
import pickle

# 这一步是读取 XDATCAR,得到一系列结构信息
traj = Trajectory.from_file('XDATCAR')

# 这一步是实例化 DiffusionAnalyzer 的类
# 并用 from_structures 方法初始化这个类; 900 是温度,2 是POTIM 的值,1是间隔步数
# 间隔步数(step_skip)不太容易理解,但是根据官方教程:
# dt = timesteps * self.time_step * self.step_skip

diff = DiffusionAnalyzer.from_structures(traj,'Li',900,2,1)

# 可以用内置的 plot_msd 方法画出 MSD 图像
# 有些终端不能显示图像,这时候可以调用 export_msdt() 方法,得到数据后再自己作图
diff.plot_msd()

# 接下来直接得到 离子迁移率, 单位是 mS/cm
C = diff.conductivity

with open('result.dat','w') as f:
f.write('# AIMD result for Li-ion\n')
f.write('temp\tconductivity\n')
f.write('%d\t%.2f\n' %(900,C))

在终端运行该文件

1
[test@ln0%tianhe2 li_sn_s]$ python li_conductivity.py

一段时间后就会得到MSD图像和离子电导率

1
2
3
4
5
[test@ln0%tianhe2 li_sn_s]$ vi result.dat

# AIMD result for Li-ion
temp conductivity
900 884.05

可见,该材料在 900K 时的锂离子电导率为 884.05 mS/cm。

例子下载:
链接:https://pan.baidu.com/s/1WGzOVJBoe6Ym8mvR1uWanA
提取码:jhc5

思考
简短几行代码就可以计算出离子电导率,那么如何得出材料在300K下的电导率呢?
如何计算离子在材料中的迁移势垒?
如何可视化离子在材料中的扩散路径?

如何使用 Pymatgen 可视化离子的迁移概率密度。

先举个例子,

在“Design principles for solid-state lithium superionic conductors”一文中(Wang et al., Nature Materials 2015, 14 , 1026–1031. ),作者用Ab Initio Molecular Dynamic (AIMD)计算了Li 离子在Li$\mathrm{_1}\mathrm{_2},
\mathrm{_7}
\mathrm{_3}
\mathrm{_1}$$\mathrm{_1},
\mathrm{_2},和
\mathrm{_4}
\mathrm{_4}$ 四种材料中的迁移概率密度(Probability Density),结果如下图所示:

从图中可以看出Li离子在图a所示材料中主要沿c轴方向的通道迁移,而且由于这个通道连通得比较好,Li离子的迁移势垒会比较低(0.220.25 eV)。
Li离子在图b所示的材料的迁移路径形成了一个三维网格,而且由于这个概率密度比图b中的概率密度分布得更加均匀,Li离子的迁移势垒更低(0.18
0.19 eV)。
图b所示的材料就完全不行了,因为Li离子的概率密度仅分布在特定的位点附近,说明离子不能有效地移动。
Li离子在图d所示材料中也存在迁移局域化的行为。
作者总结说 “A general principle for the design of Li-ion conductors with low activation energy can be distilled from the above findings: all of the sites within the diffusion network should be energetically close to equivalent, with large channels connecting them.”
那么我们如何在自己的计算中画出这样的图呢?Pymatgen 举手说,它可以帮忙!

但是在开始之前,我们要安装Pymatgen的插件:Pymatgen-diffusion(https://github.com/materialsvirtuallab/pymatgen-diffusion)。

安装 Pymatgen-diffusion
推荐大家使用最新版的Anaconda安装Pymatgen及其插件。点击上面的链接,进入官网后,点击最新版本链接,

我们可以下载.zip文件,

下载完成后,大家可以解压这个文件,得到 pymatgen-diffusion-2019.8.18文件夹。

我们把其中的 pymatgen_diffusion 文件夹放到 Anaconda的site-packages文件夹下,路径是 Windows 系统:……\Anaconda\Lib\site-packages;Linux系统:……/anaconda3/lib/pythonx.x/site-packages,就算安装好了。

接下来我们可以启动python,导入这个模块,如果不报错就没有问题了。

1
2
3
4
5
6
[test@ln0%tianhe2 li_sn_s]$ python
Python 3.8.3 (default, Jul 2 2020, 16:21:59)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymatgen_diffusion
>>>

学习用法
我们可以在其github网站上通过例子学习这个模块的用法。

点击打开 probbility_analysis.ipynb 文件。

其内容如下(有所删减):如果不想看的话可直接查看 开始作图 部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pymatgen.analysis.diffusion_analyzer import DiffusionAnalyzer
from pymatgen_diffusion.aimd.pathway import ProbabilityDensityAnalysis
import json

#ProbabilityDensityAnalysis object
filename="/Users/iekhengchu/repos/pymatgen-diffusion/pymatgen_diffusion/aimd/tests/cNa3PS4_pda.json"

data = json.load(open("../pymatgen_diffusion/aimd/tests/cNa3PS4_pda.json", "r"))
diff_analyzer = DiffusionAnalyzer.from_dict(data) # 初始化DiffusionAnalyzer类

pda = ProbabilityDensityAnalysis.from_diffusion_analyzer(diff_analyzer, interval=0.5,
species=("Na", "Li")) #可以指定离子
#Save probability distribution to a CHGCAR-like file
pda.to_chgcar(filename="CHGCAR_new2.vasp") #保存概率密度文件

开始作图
代码(test.py)如下:

1
2
3
4
5
6
7
8
9
from pymatgen_diffusion.aimd.pathway import ProbabilityDensityAnalysis
from pymatgen.core.trajectory import Trajectory
from pymatgen.io.vasp.outputs import Xdatcar
from pymatgen.analysis.diffusion_analyzer import DiffusionAnalyzer

traj = Trajectory.from_file('XDATCAR')
diff = DiffusionAnalyzer.from_structures(traj,'Li',900,2,1)
pda = ProbabilityDensityAnalysis.from_diffusion_analyzer(diff,interval=0.5,species=("Li"))
pda.to_chgcar(filename="pda.vasp") #保存概率密度文件

此处理过程大概耗时8分钟,因机器而异。

在VESTA中可视化

介电常数

首先进行结构优化,参考官网: https://www.vasp.at/wiki/index.php/Dielectric_properties_of_SiC

静态介电常数:

方法1:DFPT方法;

{.line-numbers}
1
2
3
4
5
IBRION = 8
NSW=1
LEPSILON = .TRUE.
LRPA=.TRUE.#RPA考虑局域场效应,默认关闭,即IP近似
LPEAD=.TRUE.#有限差分法

方法2:Response to finite electric fields

{.line-numbers}
1
2
3
4
5
LCALCEPS = .TRUE.
IBRION=6
NFREE=2
ISMEAR = 0
SIGMA = 0.01

在OUTCAR中抓取:

STATIC DIELECTRIC TENSOR (including local field effects in DFT)``` 电子贡献或者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```MACROSCOPIC STATIC DIELECTRIC TENSOR (including local field effects in RPA (Hartree))```
```MACROSCOPIC STATIC DIELECTRIC TENSOR IONIC CONTRIBUTION``` 离子贡献
```BORN EFFECTIVE CHARGES (in e, cummulative output)```
```ELASTIC MODULI IONIC CONTR (kBar)```
```PIEZOELECTRIC TENSOR IONIC CONTR for field in x, y, z (C/m^2)```
### 频率依赖介电函数:读取WAVECAR
IPA:
```javascript {.line-numbers}
ALGO = Exact
NBANDS = 64
LOPTICS = .TRUE.
CSHIFT = 0.100
NEDOS = 2000
#and you might try with the following
#LPEAD = .TRUE.

frequency dependent IMAGINARY DIELECTRIC FUNCTION (independent particle, no local field effects)
and
frequency dependent REAL DIELECTRIC FUNCTION (independent particle, no local field effects)

Note:对于光学性质的计算,也就是计算材料的介电函数,需要足够多的空带和致密的K网格点,使其达到非常好的收敛状态,我们才可以得到合理的光学性质;因此通常计算中,一般设置NBANDS为默认值(可在自洽的OUTCAR中以关键字NBANDS查找到)的2-3倍,K网格点为自洽值或适当增加。
使用optics.sh脚本得到介电函数的实部和虚部

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
# extract image and real parts of dielectric function from vasprun.xml
awk 'BEGIN{i=1} /<imag>/,\
/<\/imag>/ \
{a[i]=$2 ; b[i]=$3 ; c[i]=$4; d[i]=$5 ; e[i]=$6 ; f[i]=$7; g[i]=$8; i=i+1} \
END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml > IMAG.in
#awk 'BEGIN{i=1} /imag/,\
# /\/imag/ \
# {a[i]=$2 ; b[i]=$3 ; c[i]=$4; d[i]=$5 ; e[i]=$6 ; f[i]=$7; g[i]=$8; i=i+1} \
# END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml > IMAG.in
awk 'BEGIN{i=1} /<real>/,\
/<\/real>/ \
{a[i]=$2 ; b[i]=$3 ; c[i]=$4; d[i]=$5 ; e[i]=$6 ; f[i]=$7; g[i]=$8; i=i+1} \
END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml > REAL.in

vaspkit处理:
vaspkit-task 711

压电常数

上面计算完介电常数后,一般正交晶系。
grep "PIEZOELECTRIC TENSOR IONIC CONTR for field in x, y, z (C/m^2)" OUTCAR -A10
&
grep "PIEZOELECTRIC TENSOR for field in x, y, z (C/m^2)" OUTCAR -A10

极化强度

  1. 极化强度计算
    首先选取极化相FE(PhaseB, P, 铁电相)和参考相NP(PhaseA, P=0, 中心对称相),分别以下列INCAR计算,
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     SYSTEM = FE
    ENCUT = 600 #铁电极化计算建议设置高精度
    EDIFF = 1E-6
    IBRION = -1
    POTIM = 0.3
    NSW = 0
    EDIFFG = -5E-3
    ISMEAR = 0
    SIGMA = 0.05
    PREC = Accurate
    ISIF = 2
    #NPAR = 4
    LWAVE = .FALSE.
    LCHARG = .FALSE.
    LREAL = .FALSE.
    LDIPOL = .T.
    DIPOL = 0.2 0.2 0.2 #不要设置在原子及迁移路径上,设置在真空层的一边/质心
    LCALCPOL = .TRUE. #计算铁电极化开关
    IPEAD=4
    LPEAD=.True.
  2. 收集结果:grep “Total electronic dipole momen” OUTCAR & grep “Ionic dipole moment” OUTCAR,离子与电子相加即可,然后用NP相-铁电相即可得到极化强度P,注意单位换算。
    首先要理清数据单位。VASP 计算得到的 dipole moment 的单位是 e*Å,它与库仑之间换算为:
    $1e = 1.602176634 * 10^{-19} C$
    $1Å = 10^{-10} m$
    三维体系的极化强度: 极化值除以体积。单位为 $e/Å^2$;二维体系的极化强度:极化值除以面积。单位为 e/Å。

Note:

在铁电极化计算过程中经常会出现参考相为非半导体的情况,这种情况下可以:①镜像法:以FE以NP为参照中心,建立一个-FE相(PhaseB’, 即铁电极化方向相反)。然后按照上述方法计算极化,再以FE相的极化-(-FE相)的极化值,然后除以2即得到极化强度。可以理解为1-(-1)=2,2/2=1;②线性插值法:在FE和NP相中间插入一系列中间过渡相(0%(FE),10%,20%,30%….100%(NP)),计算它们的极化,然后可以用Origin做拟合,100%时即为NP相的极化。(100%-0%)则是极化强度P。

线性插值法计算极化强度

原文链接:

https://www.cnblogs.com/ghzhan/articles/16305679.html

BaTiO3 是钙钛矿结构,它的铁电相结构和中心对称结构如图所示0401,属于四方晶系。

  1. 先构造 BaTiO3 两种极化方向的晶格结构,并用 VASP 进行结构优化得到 CONTCAR;

  2. 将上一步优化后的两个结构分别放入创建好的 ini, fin 文件夹。利用 NEB 的 nebmake.pl 命令产生这两种极化方向的中间过渡结构 (vtst下载地址: Download — Transition State Tools for VASP (utexas.edu)),具体命令为:

    nebmake.pl ini/CONTCAR fin/CONTCAR 32

    这里的 ‘32’ 是表示产生中间过渡的 32 种结构。执行上述命令后,当前文件夹下会产生 00, 01, 02, …, 33 个文件夹,每个文件夹下有一个 POSCAR 文件。

  3. 对每个文件夹的结构进行一次 VASP 自洽运算,INCAR 文件里面需要额外设置 DIPOL 和 LCALPOL 参数。

    DIPOL 参数可以选取任一坐标,但是保证同一体系采用相同值。

    LCALPOL 参数是打开 极化运算。

    INCAR 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SYSTEM=BaTiO3
    ISTART =0
    ICHARG =2
    PREC =Accurate
    ENCUT =520
    EDIFF =0.1E-07
    ISMEAR = 0
    LWAVE=.FALSE.
    LCHARG = .FALSE.
    NELM = 200
    DIPOL = 0.5 0.5 0.5
    LCALCPOL=.TRUE
  4. 计算完成后运行命令:

    1
    2
    3
    grep 'dipole moment' OUTCAR|rev| awk '{printf ("%s ", $4)}'|rev|awk '{printf ("%f\n", $1+$2)}' >> ../dipole_c.dat

    grep 'free energy TOTEN' OUTCAR | awk '{printf ("%s\n",$5)}' >> ../energy.dat

    这里通过 grep 命令产生的 dipole_c.dat 文件记录的是沿着 c 方向的极化值,这是因为 BaTiO3 是沿着 c 方向极化的。对于具体的情况需要自行修改。

  5. 处理和分析数据。

    首先要理清数据单位。VASP 计算得到的 dipole moment 的单位是 e*Å,它与库仑之间换算为:

    $1e = 1.602176634 * 10^{-19} C$

    $1Å = 10^{-10} m$

    三维体系的极化强度: 极化值除以体积。单位为 e/Å2;二维体系的极化强度:极化值除以面积。单位为 e/Å。

    在这个例子中,BaTiO3 的体积为 64.3586 Å3。接下来,我们来处理数据。用energy.dat 文件 (单位为 eV),这样,我们就得到每个中间结构 (image) 的总能:0402
    用dipole_c.dat 文件 (单位: e*Å):不同 image 的极化值如图所示0403
    可以发现,该极化强度不是连续的,这是和选取的原胞有关,需要考虑极化量子的影响。BaTiO3 沿着 c 方向极化,所以需要对该极化值加减整数倍的 c 方向的晶格常数。这样我们得到下图:0404

    选取最靠近中间极化强度为 0 的那条曲线,即为 BaTiO3 的极化强度曲线:0405

    除以体积并进行简单的单位换算后为:0406
    另外,我们也可以绘制极化值 P 与能量 E 曲线0407
    因此, BaTiO3 的极化强度大约为 0.248 C/m2,与文献中的实验结果 0.26 C/m2 吻合。(Physical Review, 99(4), 1161–1165, 1955 )

    拟合 Landau-Ginzburg 公式

    $E= \sum_{i} A/2 * P_i^2 + B/4 * P_i^4 + C/6 * P_i^6 + D/2 * \sum_{i,j}(P_i-P_j)^2$

拟合该多项式曲线,得到

$E = 6062.434883706029P^6 + 2437.756598493882P^4 + -340.5806845162749*P^2 + 10.339600058315137$
其中参数 A, B, C 分别为

$A = -0.68116 eV *(m^2/C)^2
B = 9.75103 eV *(m^2/C)^4
C = 36.37461 eV *(m^2/C)^6$
0408

  1. 绘制能量曲线的脚本
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with open('energy.dat','r') as f:
    content = f.readlines()
    res = [float(i.strip('\n')) for i in content]
    minres = min(res)
    res = [1e3*(i-minres) for i in res]
    import matplotlib.pyplot as plt
    plt.figure()
    plt.plot(res,'b.-')
    plt.xlabel('displacement')
    plt.ylabel('Energy ($meV$)')
    plt.show()

绘制dipole曲线,以及考虑极化量子的脚本:

{.line-numbers}
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
with open('dipole_c.dat','r') as f:
content = f.readlines()
res = [float(i.strip('\n')) for i in content]

import matplotlib.pyplot as plt
plt.figure()
plt.xlabel('displacement')
plt.ylabel('Polarization ($e*{\AA}$)')
plt.xlim([0,32])
plt.plot(res,'r.')


### 考虑极化量子
c = 4.0335000000000001
tmp = []
N = 20
for j in range(N):
start = -N/2+j
tmp1 = [i+start*c for i in res]
# print(tmp1[0])
tmp.append(tmp1)
plt.figure()
for i in tmp:
plt.plot(i,'.')

#plt.ylim([-2,2])
plt.xlabel('displacement')
plt.ylabel('Polarization ($e*{\AA}$)')
plt.xlim([0,32])

### 单位换算
P = [-1.1965400000000006, -1.1288099999999996, -1.060039999999999, -0.990219999999999, -0.9193599999999993, -0.8474299999999992, -0.7744599999999995, -0.7004900000000003, -0.6255299999999995, -0.5496499999999997, -0.4728999999999992, -0.3953799999999994, -0.31716999999999906, -0.2384000000000004, -0.1591799999999992,-0.11827, 0.0, 0.11827, 0.1591799999999992, 0.2384000000000004, 0.31716999999999906, 0.3953799999999994, 0.4728999999999992, 0.5496499999999997, 0.6255299999999995, 0.7004900000000003, 0.7744599999999995, 0.8474299999999992, 0.9193599999999993, 0.990219999999999, 1.060039999999999, 1.1288099999999996, 1.1965400000000006]
plt.figure()
P = [i*0.248945227832799346 for i in P]
plt.xlabel('displacement')
plt.ylabel('Polarization ($C/m^2$)')
plt.xlim([0,32])
plt.plot(P,'r.')
plt.show()

绘制极化值 P 与能量 E 曲线的脚本:

{.line-numbers}
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
E = [0.0035557599999975764, 0.0016252999999935014, 0.0004821100000000911, 0.0, 5.983999999870093e-05, 0.0005505999999968481, 0.0013690299999993272, 0.0024182999999950994, 0.003608839999998281, 0.004859239999994713, 0.006096989999996083, 0.007258279999994954, 0.008287759999994648, 0.009138139999997463, 0.00977216999999797, 0.010162939999993625, 0.010294929999993485, 0.010162939999993625, 0.00977216999999797, 0.009138139999997463, 0.008287759999994648, 0.007258279999994954, 0.006096989999996083, 0.004859239999994713, 0.003608839999998281, 0.0024182999999950994, 0.0013690299999993272, 0.0005505999999968481, 5.983999999870093e-05, 0.0, 0.0004821100000000911, 0.0016252999999935014, 0.0035557599999975764]
P = [-1.1965400000000006, -1.1288099999999996, -1.060039999999999, -0.990219999999999, -0.9193599999999993, -0.8474299999999992, -0.7744599999999995, -0.7004900000000003, -0.6255299999999995, -0.5496499999999997, -0.4728999999999992, -0.3953799999999994, -0.31716999999999906, -0.2384000000000004, -0.1591799999999992,-0.11827, 0.0, 0.11827, 0.1591799999999992, 0.2384000000000004, 0.31716999999999906, 0.3953799999999994, 0.4728999999999992, 0.5496499999999997, 0.6255299999999995, 0.7004900000000003, 0.7744599999999995, 0.8474299999999992, 0.9193599999999993, 0.990219999999999, 1.060039999999999, 1.1288099999999996, 1.1965400000000006]
import matplotlib.pyplot as plt
import numpy as np

E = [1e3*i for i in E]
P = [i*0.248945227832799346 for i in P]

plt.figure()
plt.plot(P,E,'b.-')
plt.xlabel('Polarization ($C/m^2$)')
plt.ylabel('Energy ($meV$)')

f1 = np.polyfit(P, E, 6)
poly = ''
for i in range(len(f1)):
poly += '{}*x^{} + '.format(f1[i],len(f1)-i-1)
print(poly)

x = [ -0.35+0.7*i/99 for i in range(100)]
Eval = np.polyval(f1,x)
plt.figure()
plt.plot(x,Eval,'b')
plt.plot(P,E,'r*')
plt.xlabel('Polarization ($C/m^2$)')
plt.ylabel('Energy ($meV$)')
plt.show()

拉曼计算

VASP中计算拉曼谱主要使用vasp_raman.py这个脚本,见github:
https://github.com/raman-sc/VASP

使用raman-sc有几个注意的地方:https://zhuanlan.zhihu.com/p/354651066

作者这里提供了一个算例。供大家参考链接:https://pan.baidu.com/s/1dTCP_0bRcRo0uIy0rBGttQ
提取码:4vp8

  1. 这个代码已经年代久远,使用python2写的,对大部分新学vasp的同学来说可能装的anaconda3,既使用的是python3,与python2代码是不兼容的,作者这里对vasp_raman.py进行了改写,方便python3环境运行这段代码。下载见附件。
  2. raman.sub既提交代码的脚本,需要根据自己的软件环境进行更改,我这里给出我的提交脚本供大家参考:
    export VASP_RAMAN_RUN=’mpirun -np 64 /public/home/wangxiaohui/vasp/vasp.5.4.4/bin/vasp_std &> job.out ‘意思是运行vasp的命令,找一下vasp_std所在路径

python /public/home/wangxiaohui/WORKSPACE/Ti3C2Li2/raman/zhenraman/vasp_raman.py > vasp_raman.out这里是运行raman.py代码的意思,既raman.py代码所在路径

  1. 查看raman.py代码内容得知,POSCAR.phon和OUTCAR.phon是前一步计算的结果文件,不要被作者的例子给坑了。并且POSCAR.phon,OUTCAR.phon和INCAR等文件放在同一个文件夹下。

按照脚本VASP需要计算两步:

第一步,计算Gamma点声子。用有限位移方法或者DFPT方法。

第一步结束后,执行,

cp POSCAR POSCAR.phon

cp OUTCAR OUTCAR.phon

第二步,计算宏观介电常数的导数。用vasp_raman.py 脚本。

DFPT: LEPSILON=.TRUE.

频率依赖的介电矩阵: LOPTICS=.TRUE.

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
#PBS -l select=1:ncpus=32:mpiprocs=32
#PBS -l walltime=01:00:00
#PBS -q debug
#PBS -j oe
#PBS -N Example
#PBS -V

cd $PBS_O_WORKDIR

ulimit -s unlimited # remove limit on stack size

export VASP_RAMAN_RUN='mpirun -n 12 /u/afonari/vasp.5.3.2/vasp.5.3/vasp &> job.out' #a按照自己路径更改
export VASP_RAMAN_PARAMS='01_10_2_0.01' #b按照自己材料更改

python27 vasp_raman.py > vasp_raman.out

a. VASP_RAMAN_RUN设置调用VASP的命令

b. VASP_RAMAN_PARAMS=01_10_2_0.01

1
2
3
4
FIRST_MODE - 整数, 第一个计算的振动模
LAST-MODE - 整数, 最后一个计算的振动模
NDERIV - 整数, 有限位移的策略选择,目前只有2这一种选择
STEPSIZE - 浮点数, 有限位移步长,单位是Angstroms,一般选默认就可以

注意:以上这种设置格式允许我们并行计算大体系拉曼,我们可以在计算大体系的时候将Γ点的振动频率分为很多段分别计算,这样会大大提高我们计算大体系的效率。

在多段计算的时候。具体细节上要把每一段计算的OUTCAR.000n.-1.out和OUTCAR.000n.-1.out文件拷贝到同一个文件夹下,然后注释掉vasp_raman.py脚本中的运行VASP的命令。运行python2.7 vasp_raman.py > vasp_raman.out 即可得到整段的数据。

vasp_raman.py文件中执行VASP的行为331行:

1
2
3
else: # run VASP here
print "[__main__]: Running VASP..."
os.system(VASP_RAMAN_RUN) #注释掉这一行

加展宽

使用脚本broaden.py给出展宽谱,可以选择洛伦兹线型或者高斯线型。

$ python2 broaden.py result.txt
生成result.txt-broaden.dat文件,画图即可。

需要注意的是,broaden.py的第23和24行分别代表频率和强度所在列。其设置文件中对应的列。

cm1 = hw[:,1]
int1 = hw[:,2]

红外谱计算

  1. 红外谱主要是因为振动模在振动前后偶极矩发生变化,从而产生后外吸收。在振动过程中引起偶极矩改变的振动都具有红外活性。

  2. 根据上述原理,我们首先需要在计算过程中计算Gamma点的振动模,其次,我们需要计算伯恩有效电荷。

有限位移方法INCAR关键参数:

IBRION = 5
NWRITE = 3
POTIM = 0.015
LEPSILON = .TRUE
DFPT方法INCAR关键参数:

IBRION = 7
NWRITE = 3
NSW = 1
LEPSILON = .TRUE.
NELMIN=6

另外,建议进行k点测试直到伯恩有效常数收敛。

  1. 后处理

    计算得到OUTCAR,然后文件夹下运行脚本。运行结果如下:

sh IR.sh

上面的振动模和活性是归一化以后的结果,也就是运行结果intensities/results/results.txt的内容。文件intensities/results/exact.res.txt是归一化之前的内容。

  1. 展宽

使用脚本broaden.py给出展宽谱,可以选择洛伦兹线型或者高斯线型。

$ python2 broaden.py result.txt
生成result.txt-broaden.dat文件,画图即可。

弹性常数

基本概念

弹性常数描述了晶体对外加应变的响应的刚度。在材料的线性变形范围内(应变较小的情况下),体系的应力与应变满足胡克定律。也就是说,对于足够的小的变形,应力与应变成正比,即应力分量(S)是应变分量(E)的线性函数,三维材料的弹性刚度常数矩阵是6×6的。公式中Cij就是我们通常所说的弹性常数。因为刚度矩阵是对称矩阵,因此,弹性常数的独立张量元数目至多只有21个。对不同的晶系的晶体,因为对称性的关系,其独立的弹性常数是确定的。因此,晶系的对称性越高,独立的张量元数目越少。
立方晶系 ——只有3个独立矩阵元(C11,C12,C44)
六角晶系 ——有5个独立矩阵元(C11,C12,C13,C33,C44)
三角晶系
a) 32,3m,-32/m——有6个独立矩阵元(C11,C12,C13,C14,C33,C44)
b) 3,-3,——有8个独立矩阵元(C11,C12,C13,C14,C15,C33,C44,C45)
四方晶系
a) 422,4mm,-42m,4/mmm——有6个独立矩阵元(C11,C12,C13,C33,C44,C66)
b) 4,-4,4/m——有7个独立矩阵元(C11,C12,C13,C16,C33,C44,C66)
正交晶系 ——有9个独立矩阵元(C11,C12,C13,C22,C23,C33,C44,C55,C66)
单斜晶系 ——有13个独立矩阵元
三斜晶系 ——有21个独立矩阵元

计算过程

采用第一性原理计算弹性常数有两种方法,第一种方法是应力-应变方法, 即通过给结构施加不同应变,分别计算出所对应的应力大小,然后利用公式(1)拟合得到一次项系数,从而得到。第二种方法是能量-应变方法, 即通过给结构施加不同应变后计算出体系总能相对于基态能量变化(应变能),再利用公式(2)进行二次多项式拟合,其中二次多项式系数是晶体的某个弹性常数或者弹性常数组合。第一种方法优点是每进行一次计算可一次得到六个独立分量,缺点是为了得到准确的应力大小,必须选择更高的截断能和更密集的K格点。在同样的精度下,能量-应变法相比应力-应变方法要求的截断能和K点数目相对较少,缺点是计算应变数目有所增加。VASPKIT中弹性常数计算基于能量-应变法,目前不支持三斜晶系。
一般计算弹性常数我们可以采用应变应力或者应变能量关系,进行拟合。或者可以直接通过VASP直接计算。

方法一:

首先介绍直接用VASP在输入文件中添加参数进行计算的方法。

  1. 当然首先要进行结构优化,

  2. 在INCAR中添加关键参数,进行弹性常数的计算

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    NSW=1
    EDIFFG=-1e-3
    ISIF=3
    IBRION=6 #计算弹性常数
    POTIM=0.015
    NFREE = 4
  3. 计算完成后可以查看OUTCAR得到弹性刚度矩阵。或者可以利用VASPKIT直接得到弹性常数。
    请注意OUTCAR中的刚度矩阵是未经过处理的刚度矩阵,二维材料需要乘以C轴长度的0.01,还需要了解Voigt简标,11>1 22>2 33>3 23>4 13>5 12>6。然后我们通过Origin等工具绘图即可得到材料的杨氏模量,泊松比等力学性质。

方法二:

VASPKIT和VASP计算晶体的弹性常数具体计算步骤分为:

  1. 准备优化彻底的POSCAR文件,注意通常采用标准的惯用原胞计算弹性常数,如果不确信POSCAR文件中是否是标准的惯用原胞,可以用vaspkit-603/604生成标准结构;

  2. 运行vaspkit 选择102生成KPOINTS,由于计算弹性常数对K-mesh要求很高,因此对于半导体(金属体)体系,生成K点的精度应不小于 0.03(0.02)×2π {\AA}^{-1}

  3. INCAR参考设置如下;

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Global Parameters
    ISTART = 0
    LREAL = F
    PREC = High (截断能设置默认值1.5-2倍)
    LWAVE = F
    LCHARG = F
    ADDGRID= .TRUE.
    Electronic Relaxation
    ISMEAR = 0
    SIGMA = 0.05
    NELM = 40
    NELMIN = 4
    EDIFF = 1E-08
    Ionic Relaxation
    NELMIN = 6
    NSW = 100
    IBRION = 2
    ISIF = 2 (切记选择2,如果选择3会把施加应变后原胞重新优化成平衡原胞)
    EDIFFG = -1E-02
  4. 准备VPKIT.in文件并设置第一行为1(预处理);运行vaspkit并选择201, 将生成用于计算弹性常数文件;

    {.line-numbers}
    1
    2
    3
    4
    1                    ! 设置1将产生计算弹性常数的输入文件,2则计算弹性常数
    3D ! 2D为二维体系,3D为三维体系
    7 ! 7个应变
    -0.015 -0.010 -0.005 0.000 0.005 0.010 0.015 ! 应变变化范围
  5. 批量提交vasp作业;
    总计有9个大文件夹,分别以该空间群所需要的独立弹性常数来命名;在每个大文件夹内则是以应变强度命名的实际计算执行的文件夹,文件夹的数量可根据预处理的VPKIT.in文件的最后一行的应变设置来更改。在每一个应变文件夹内则是施加了应变的POSCAR和事先准备好的INCAR、KPOINTS和POTCAR文件的链接,可直接进行vasp计算。
    这里通过一个简单的两重for循环命令依次序完成所需要的计算任务。
    脚本 :

    {.line-numbers}
    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
    #!/bin/bash
    path=`pwd`
    #记录当前文件夹位置并定义到变量 path中,称为初始目录
    pwd
    for cij in `ls -F | grep /$`
    #ls -F| grep /$ 命令为返回当前文件夹中所有子目录
    #将所有子目录添加到变量cij中,并准备进行for循环
    do
    cd ${path}/$cij
    #进入cij变量所代表的子目录中
    pwd
    for s in strain_*
    #将cij代表的子目录中所有strain文件夹添加到变量s中
    #此部添加变量s的方式可更改为添加变量cij的方式,但不建议这么做
    do
    cd ${path}/$cij/$s
    #进入初始目录下变量cij和变量s组成的目录,由于for循环的设置,将遍历所有可计算的strain文件夹
    pwd
    mpirun -np 16 vasp_std
    #执行vasp计算
    cd ${path}
    #返回初始目录
    pwd
    done
    done
  6. 再次修改VPKIT.in文件中第一行为2(后处理),然后再次运行vaspkit并选择201,得到以下结果;

  7. 如果在计算弹性常数时希望强制固定某个体系的空间群,可在SYMMETRY.in文件第二行设置空间群,这样晶系将通过指定空间群判断并计算相应的独立弹性常数,这对于掺杂或者合金体系比较有用。

根据弹性常数计算和三维可视化材料力学量

首先利用VASPKIT-204命令得到体弹性模量、杨氏模量、剪切模量及泊松比随角度的依赖关系,具体算法可参考文献【J. Phys. Condens. Matter, 28, 275201 (2016)和Comput. Phys. Commun. 181, 2102–2115 (2010)】。接下来我们以某单斜体系的弹性常数为例来演示如何进行材料力学量三维可视化。

  • 第一步新建ELASTIC_TENSOR.in并输入6x6弹性常数矩阵,注意第一行是注释行不可省略。如果是二维体系,则输入文件为ELASTIC_TENSOR_2D.in,注意二维体系弹性常数矩阵大小为3x3。
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    # comment line (in GPa)
    228.38 85.741 81.503 0 -0.737 0
    85.741 217.47 94.201 0 -20.213 0
    81.503 94.201 178.81 0 -9.472 0
    0 0 0 35.094 0 -17.851
    -0.737 -20.213 -9.472 0 37.778 0
    0 0 0 -17.851 0 42.708
  • 第二步运行VASPKIT 204命令得到MECHANICS_3D.dat
    打开MECHANICS_3D.dat可看到第一行给出了每一列数据所代表的物理量,第二行给出了球坐标系下分别划分仰角θ∈[0,180]和方位角ϕ∈[0,360]的格点大小。
  • 第三步从vaspkit/examples/angular_dependent_mechanics (VASPKIT ver. >= 1.3.2)文件夹中拷贝mechanics_3d_plot_matlab.m到当前目录,调用Matlab软件运行该脚本,得到以下信息.
    如果我们想可视化杨氏模量,则输入2回车即可得到。
  • 另外,以下两个软件也可以实现材料力学量三维可视化。
    Elate
    ElasticPOST

介绍

ALAMODE中非谐声子计算部分采用了自洽声子计算方法。

具体教程:https://alamode.readthedocs.io/en/latest/anphondir/formalism_anphon.html#self-consistent-phonon-scph-calculation

https://www.bilibili.com/video/BV1mv411M7W7/?spm_id_from=333.999.0.0&vd_source=17084cc867ff3bb86398ff1a79b443f2

TDEP 是其采用技术Temperature dependent effective potential的缩写。
下面是开发者的网站,但是并不能下载到源代码。http://ollehellman.github.io/page/index.html好消息是第一性原理计算软件ABINIT中集成了TDEP方法,官网user guide>a-TDEP。需要研究的可以自行研究。ABINIT官网:https://www.abinit.org/

Dynaphopy 是采用了一种基于AIMD(第一性原理分子动力学)的杂化方法的python程序包:http://abelcarreras.github.io/DynaPhoPy/index.html
文中给出了参考文献,需要的自行下载。

ALAMODE

安装

https://alamode.readthedocs.io/en/latest/index.html#

ALAMODE计算Si简谐声子谱

1、利用ALM计算displacement patterns

优化后的超胞结构重命名POSCAR.orig,准备输入文件si_alm.in

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
&general
PREFIX = si222
MODE = suggest
NAT = 64; NKD = 1
KD = Si
/

&interaction
NORDER = 1 # 1: harmonic, 2: cubic, ..
/

&cell
20.406 # factor in Bohr unit
1.0 0.0 0.0 # a1
0.0 1.0 0.0 # a2
0.0 0.0 1.0 # a3
/

&cutoff
Si-Si None
/

&position
1 0.0000000000000000 0.0000000000000000 0.0000000000000000
1 0.0000000000000000 0.0000000000000000 0.5000000000000000
1 0.0000000000000000 0.2500000000000000 0.2500000000000000
1 0.0000000000000000 0.2500000000000000 0.7500000000000000
1 0.0000000000000000 0.5000000000000000 0.0000000000000000
1 0.0000000000000000 0.5000000000000000 0.5000000000000000
1 0.0000000000000000 0.7500000000000000 0.2500000000000000

晶格常数替代为自己的超胞结构。

运行ALM: alm si_alm.in > si_alm.log1,将会生成si222.pattern_HARMONIC文件,包含坐标信息。对于Si只有一个displacement patterns。

2、计算原子间力

在此之前要确定位移的大小,一般简谐0.01-0.04,0.01大多可以。运行python displace.py --VASP=POSCAR.orig --mag=0.01 -pf si222.pattern_HARMONIC

之后对每个结构提交计算,脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# Assume we have 20 displaced configurations for QE [disp01.pw.in,..., disp20.pw.in].

for ((i=1;i<=20;i++))
do
num=`echo $i | awk '{printf("%02d",$1)}'`
mkdir ${num}
cd ${num}
cp ../disp${num}.pw.in .
pw.x < disp${num}.pw.in > disp${num}.pw.out
cd ../
done

计算完成后,提取信息:python extract.py --VASP=POSCAR.orig vasprun*.xml > DFSET_harmonic,生成DFSET_harmonic文件。

3、拟合力常数

修改1中的 si_alm.in

1
2
3
4
5
6
7
8
9
10
&general
PREFIX = si222
MODE = optimize # <-- here
NAT = 64; NKD = 1
KD = Si
/

&optimize
DFSET = DFSET_harmonic
/

运行alm si_alm.in > si_alm.log2,生成si222.fcs and si222.xml

4、计算声子谱和DOS

准备si_phband.in文件,结构中用晶胞结构,注意&cell中单位是Bohr,具体可设置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&general
  PREFIX = si
  MODE   = phonons
  FCSXML = si.xml

  NKD = 1; KD = Si
  MASS = 28.085
/

&cell
  10.184247326051628 
  0.0000000000000000    0.5071343999939496    0.5071343999939496
  0.5071343999939496    0.0000000000000000    0.5071343999939496
  0.5071343999939496    0.5071343999939496    0.0000000000000000
/

&kpoint
  1   # KPMODE = 1: line mode
  G 0.0 0.0 0.0 X 0.5 0.5 0.0 51
  X 0.5 0.5 1.0 G 0.0 0.0 0.0 51
  G 0.0 0.0 0.0 L 0.5 0.5 0.5 51
/

执行anphon si_phband.in > si_phband.log会产生si.bands文件,可以用plotband.py脚本画图。执行python plotband.py si.bands得到

准备si_phdos.in文件,结构中用晶胞结构,注意&cell中单位是Bohr,具体可设置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&general
  PREFIX = si
  MODE   = phonons
  FCSXML = si.xml

  NKD = 1; KD = Si
  MASS = 28.085
/

&cell
  10.184247326051628 
  0.0000000000000000    0.5071343999939496    0.5071343999939496
  0.5071343999939496    0.0000000000000000    0.5071343999939496
  0.5071343999939496    0.5071343999939496    0.0000000000000000
/

&kpoint
  2   # KPMODE = 2: uniform mesh mode
  20 20 20
/

执行anphon si_phdos.in > si_phdos.log会产生si.dos文件,可以用plotdos.py脚本画图。执行python plotdos.py –emax 550 –nokey si.dos得到

5. 估算对热导率的立方IFCs(非简谐IFCs)

这里计算非简谐IFCs,我们把si_alm1.in复制为si_alm3.in,将NORDER = 1改为NORDER = 2.我们还要注意这里考虑计算三阶力常数,所以&cutoff下的参数我们要再指定个截止半径,一般要求略大于第二近邻的距离(可以从si_alm1.log查看,如下图)。当然你接着用None也行,这样可能大大增加参数的数量,从而增加计算成本。

运行alm si_alm3.in > si_alm3.log,可以看到多了si_cubic.相关文件。运行python displace.py –OpenMX=Si.dat –mag=0.04 -pf si_cubic.pattern_ANHARM3,可见产生了disp01.dat到disp11.dat11个OpenMX输入文件,我们准备shell脚本批量提交,shell脚本命名为pbs.sh,具体为

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

for ((i=1;i<=11;i++))
do
    num=`echo $i | awk '{printf("%02d",$1)}'`
    mkdir ${num}
    cd ${num}
    cp ../disp${num}.dat .
    cp disp${num}.dat Si.dat
    cp ../openmx.pbs .
    qsub openmx.pbs
    cd ../
done

总结

简谐计算步骤

  1. 输入文件: 优化后的超胞结构重命名POSCAR.orig,准备输入文件si_alm.in(其中mode:suggest);输出:si222.pattern_HARMONIC文件,包含坐标信息。
  2. displace.py对上面的.pattern文件处理,得到随机位移结构;对随机位移机构进行力的计算,生成不同vasprun.xml;extract.py处理上面vasprun.xml,生成DFSET_harmonic文件。
  3. 力常数拟合输入文件:DFSET_harmonic文件,修改1中的 si_alm.in,其中mode改成opt, 添加下面;生成si222.fcs and si222.xml
    1
    2
    3
    &optimize
    DFSET = DFSET_harmonic
    /
  4. 后处理输入文件:准备phband.in文件,修改MODE   = phonons
      FCSXML = si.xml;修改kmesh格式可得到声子谱、态密度、热性质等。

非谐计算

  1. 准备简谐计算得到的si222.fcs and si222.xml,AIMD得到的vasprun.xml,超胞结构。
  2. displace.py 对AIMD的vasprun.xml处理,得到随机结构;对随机位移机构进行力的计算,生成不同vasprun.xml;extract.py处理上面vasprun.xml,生成DFSET_AIMD_random文件。
  3. Cross validation (CV):alm_cv.in文件中添加简谐力常数 FC2XML = ../harmonic.xml,添加高阶力常数部分标签和cv相关标签,mode = cv;得到*cvset文件;python3 cvscore.py *cvset > si222.cvscore得到Minimum cvscore
  4. 拟合力常数输入文件:alm_opt.in中mode=opt;修改cv相关标签;生成高阶力常数cv.fcs and cv.xml.在这一步alm 的输入文件&general 部分加入 FC3_SHENGBTE=1、 FC4_SHENGBTE=1可输出ShengBTE格式的输入文件。
  5. SCPH计算:scph.in文件中修改MODE=SCPH和温度标签;添加&scph模块,见上面例子。anphon scph.in > scph.log提交,查看收敛:grep “conv” scph.log。生成输出文件:.scph_dymat、.scph_dfc2、.scph_bands。对.scph_dfc2处理得到有效二阶力常数文件,用于后续计算。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >dfc2
    DFC2--a generator of renormalized harmonic FCs from SCPH outputs.
    XML file containing original Fc2 : STo222.xml
    Output xml filename with anharmonic correction : ST0222_SCPH2-2_300K.xml
    FC2 correction file fromSCPH calculation :STo_scph2-2.scph_dfc2
    Target temperature : 300


    New XML file STo222_SCPH2-2_300K.xml was created successfully.

Alamode计算高温声子色散

Anharmonic Phonons (self-consistent phonon theory)
主要使用alamode软件。 版本:alamode-1.1.0

输入文件

1
2
3
4
5
6
7
vasprun.xml #分子动力学输出文件
Dfile #包含原子的力和位移
extract_disp.py #选取结构,并计算位移
extract_force.py #选取结构,并获得受力
PPOSCAR #初始超胞
alm.in #提取力常数的输入文件
anphono.in #计算声子谱的输入文件
  1. 从分子动力学数据中选取一定数量的结构,并提取它们的力和计算与初始状态相比的位移,输出到Dfile文件当中

python extract_disp.py
#运行后根据提示输入开始的步数和间隔步数
#例如总共1000步,从第一步开始提取,每间隔五步提取一次
#得到disp.dat

python extract_force.py

方法同上得到force.dat
将disp.dat和force.dat文件按如下形式合并到一起

1
2
3
4
disp1x  disp1y  disp1z   force1x  force1y  force1z
......
......
dispNx dispNy dispNz forceNx forceNy forceNz
  1. 获取力常数

提取四阶力常数的alm.in文件如下(使用LASSO方法):

二阶力常数可以通过有限位移法提取(详见官网手册)

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
&general
PREFIX = ThO2_ENET
MODE = optimize
NAT = 81; NKD = 2
KD = Th O
# PRINTSYM=1
/

&interaction
NORDER = 5 # 1: harmonic, 2: cubic, ..
NBODY = 2 3 3 2 2
/

&cell
1 # factor in Bohr unit
0.0000000000000 15.919498944104 15.919498944104
15.919498944104 0.0000000000000 15.919498944104
15.919498944104 15.919498944104 0.0000000000000
/

&optimize
LMODEL= enet
FC2XML = ThO2_2nd.xml
DFSET=ThO2_dffile

CV = 0
L1_RATIO = 1.0
L1_ALPHA = 1.0e-06
CV_MINALPHA = 1.0e-6
CV_MAXALPHA = 0.02
CV_NALPHA = 100

STANDARDIZE = 1
CONV_TOL = 1.0e-9
/

&cutoff
*-* None None 12.0 12.0 12.0
/

&position
1 0.0000000000000000 0.0000000000000000 0.0000000000000000
1 0.3333333333333333 0.0000000000000000 0.0000000000000000
..................

注意晶格常数单位的转换 $1 Bohr= 0.529177208 Angstrom$

在终端运行:

bash
alm alm.in > alm.log
得到Nb.xml

  1. Anharmonic Phonon

anphono.in输入文件如下:

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
&general
PREFIX =scph
MODE = SCPH
FCSXML =Nb.xml #forceconstant file

NKD = 1; KD = Nb
MASS = 92.90638

#NONANALYTIC = 0; BORNINFO = PbTe.born

TMIN = 0; TMAX = 300; DT = 100 #Temperature and step
/

&scph
KMESH_SCPH = 6 6 6
KMESH_INTERPOLATE = 6 6 6

SELF_OFFDIAG = 0
RESTART_SCPH = 0

MIXALPHA = 0.1
MAXITER = 500
TOL_SCPH = 1.0e-10
/

&cell ## primitive cell is best
6.2507550151332
-0.5 0.5 0.5
0.5 -0.5 0.5
0.5 0.5 -0.5
/

&kpoint
1 # KPMODE = 1: get phonon band 2: get others properties
G 0.0 0.0 0.0 H 0.5 -0.5 0.5 201
H 0.5 -0.5 0.5 P 0.25 0.25 0.25 201
P 0.25 0.25 0.25 G 0.0 0.0 0.0 201
G 0.0 0.0 0.0 N 0.0 0.0 0.5 201
/

在终端运行:

anphon anphono.in > anphono.log
得到scph.scph_bands,里面有不同温度下的声子谱

  1. 进入安装目录下的tools文件夹:make Makefile,编译df2c。
    1
    2
    3
    4
    5
    6
    [scf1355@ln151%nc-l ah]$ ~/soft/alamode/tools/dfc2 
    DFC2 -- a generator of renormalized harmonic FCs from SCPH outputs.
    XML file containing original FC2 : crte2-442.xml
    Output xml filename with anharmonic correction : crte2-new.xml
    FC2 correction file from SCPH calculation : crte2-442.scph_dfc2
    Target temperature : 300

输出crte2-new.xml.利用https://github.com/ttadano/alamode/discussions/192 中提到的脚本转换成phonopy格式。此时的力常数文件由于对称性数量不匹配,利用phonopy读取并写出FULL_FORCE_CONSTANTS。

Alamode_to_ShengBTE

Alamode计算热导率步骤

  1. 所有的计算都是基于密度泛函软件 VASP 来进行的。
  2. 首先利用第一性原理的密度泛函对晶体结构进行优化,弛豫出稳定的晶格结构,然后利用密度泛函微扰理论计算出波恩有效电荷和静态介电张量,以便用于后续求解动力学矩阵的非解析部分。
  3. 随后为了获得更加精准的二阶力常数,通过差分位移的方法生成微扰结构,后利用静态密度泛函理论计算出力和位移信息,再利用最小二乘法得到所需要的二阶力常数。
  4. 对于高阶力常数,本文利用分子动力学模拟得到 80 个准随机结构,对每个准随机结构的原子施加随机方向的微小位移,以便得到更加随机的结构,最后利用最小绝对收缩和选择算子的方法得到高阶力常数。
  5. 结合上述已经得到的介电张量、波恩有效电荷、二阶力常数和三阶力常数作为输入,最后通过ShengBTE声子玻尔兹曼输运方程求得简谐近似下晶格热导率、声子群速度、 声子散射率等热输运系数。
  6. 结合介电张量、波恩有效电荷、二阶力常数和四阶力常数作为输入进行自洽声子理论的计算,这将得到与温度相关的非谐动力学矩阵,对其进行傅里叶变换得到与温度相关的有效二阶力常数,用有效二阶力常数代替上述的二阶力常数,在此基础上求解声子玻尔兹曼输运方程求得自洽声子理论下晶格热导率、声子群速度、声子散射率等热输运系数。
  7. 在简谐近似下存在虚频,与实验观察到的稳定性不一致。因此,传统的基于简谐原子间力常数的玻尔兹曼输运方程解的结果不再有效,并且非谐效应在足够大的位移振幅内变得显著。在 ALAMODE 软件包中,通过有限位移法在 2×2×2 超胞中获得简谐原子间力常数 (IFCs) ,位移大小设置为 0.01Å。
    随后,通过压缩感知晶格动力学方法训练三阶和四阶力常数。具体来说,本文首先模拟了在 300 K、时间步长为 2fs 的 4000 步的从头算分子动力学,得到了 80 个快照。为了得到准随机结构, 本文将到得到快照中的原子向随机方向移动 0.1 Å。随后,本文将获得的准随机结构在 4×4×4 的 k 点网格中进行了静态 DFT 计算,以计算 Hellmann–Feynman 力。最终,利用得到的 80 个准随机结构的位移和力组成的数据集通过最小绝对收缩和选择算子 (least absolute shrinkage and selection operator,简称 LASSO)方法训练出非谐力常数。
    在计算中本文考虑了超胞内的所有原子间最近邻相互作用来计算简谐和三阶力常数,四阶力常数只考虑了第五最近邻内的相互作用,由于五阶和六阶力常数 对结果的影响很小,因此只考虑了次近邻相互作用。
    本文根据 ALAMODE 软件包中采用的 SCP 理论,利用获得的简谐和非谐力常数来计算非谐声子频率。
    声子玻尔兹曼输运方程的解是通过 ShengBTE 的修订版 FourPhonon 软件包来实现的,并建立了具有高斯涂抹 (scale broad 参数为 0.05) 的 18×18×18 的 q 点网格来模拟相关积分和声子波矢量。此外,在计算中得到了大约 2.3×105 个三声子过程和 1.2×109 个四声子过程。因此,对于三声子散射,本文采用迭代方案来求解玻尔兹曼输运方程,而通过单模弛豫时间近似(SMRTA) 来处理四声子散射过程,这是因为计算成本巨大。

步骤分析

  • 上面第3步,利用alm来算大概分为三步,mode设为suggest产生随机位移,vasp求力和能量,mode设为opt拟合二阶力常数即可。alm模块
  • 上面第4步,利用AIMD产生随机位移,vasp求力和能量,压缩感知晶格动力学方法训练三阶和四阶力常数mode设为cv,随后mode设为opt拟合高阶力常数,alm模块。最后mode设为SCPH获得变温声子谱和有效二阶力常数,anphon模块。后续运行dfc2模块生成指定温度的有效二阶力常数,用https://github.com/ttadano/alamode/discussions/192 中提到的脚本转换成phonopy格式。
  • 上面第5步,为了产生ShengBTE的力常数输入文件,在拟合高阶力常数时,alm 的输入文件&general 部分加入 FC3_SHENGBTE=1、 FC4_SHENGBTE=1即可。如果简谐声子谱有虚频,上面的有效二阶力常数也需要,即第7步所述。
  • 上面第6步见ShengBTE教程3.2节。
  • Alamode可以得到的结果包括格林艾森常数、声子群速度、三声子相空间、热导率原子贡献率和元素、变温声子谱和态密度、MSD、可视化振动模式、QHA等,anphon模块

Alamode 连接 shengBTE

首先,github上安装最新版本的develop branches 或 feature/shengbte_4ph branches

[3rd 4th IFCs]

拟合力常数时,alm 的输入文件&general 部分加入 FC3_SHENGBTE=1、 FC4_SHENGBTE=1即可。


&general

PREFIX = BN-1000

MODE = opt

NAT = 128

NKD = 2; KD = B N

TOLERANCE = 1.0e-3

FC3_SHENGBTE=1

FC4_SHENGBTE=1

/


Note:输出的文件名为:FORCE_CONSTANT_3RD、FORCE_CONSTANT_4TH,和ShengBTE的文件名差一个S,FORCE_CONSTANTS_3RD、FORCE_CONSTANTS_4TH

[2nd IFCs]

首先通过QE的DFPT计算一个不含SCP的二阶力常数,BN.ifc2。

做SCPH计算,会生成计算温度点的二阶力常数SCP等效修正部分,例如BN.scph_dfc2(仅考虑四声子散射对重整化的影响),若进一步考虑三声子散射的重整化作用,文件名为BN.scph+bubble(0)_dfc2。

alamode/tools/scph_to_qefc.py 可以将SCP的修正部分与QE计算的二阶力常数相加,得到指定温度重整化后的二阶力常数。

Usage:

python scph_to_qefc.py original_QEfc2 scph_fc2_correction temperature > scp_fc2

python scph_to_qefc.py BN.ifc2 BN.scph_dfc2 1000 > espresso.ifc2

Authors and references

Weizhe Yuan yuanwz@stu.hit.edn.cn

注意的问题

  1. The accuracy of the anharmonic force constants can be checked by increasing the size of the training dataset. If the physical properties, such as thermal conductivity and free energy, change significantly with the size of the training dataset, it indicates that the training is insufficient. If the change is minor, your force constants may be OK.

  2. 报错:Warning: The following force constant doesn’t exist in the original file:
    You can neglect this warning as long as the correction term (the last column) is small.
    This warning is raised when the absolute value of the correction is larger than 1.0e-10 and the corresponding force constant does not exist in the original FCSXML file. In your case, the correction term is only slightly above the tolerance. So, it should not cause any problems hopefully.
    When the correction term is much larger than 1.0e-10, this warning indicates a possible error in the inputs. Likely errors are the input structure is not fully symmetrized, or the numerical digits of lattice vectors and fractional coordinates are insufficient.
    the given KMESH_INTERPOLATE is not commensurate with the supercell size of the original FCSXML.

  3. In the current implementation of alamode, only the former choice,
    renormalized 2FCs + conventional (old) 3FCs,
    is supported. Another possible choice may be
    renormalized 2FCs + renormalized 3FCs,
    but it is not supported within alamode yet.
    When MODE = RTA, the anphon code only reads the 2FCs and 3FCs from given XML files. By contrast, when MODE = SCPH, the code additionally reads the 4FCs because they are necessary to compute the renormalized 2FCs based on the self-consistent phonon theory.
    Therefore, the second combination of
    renormalized 2FCs + high order FCs using SCPH
    is not possible.

  4. I performed the SCPH calculation. It is not converged at low temperatures (0K, 100K, 200K), while it achieved convergence at high temperatures (300~1200K).A potential solution is to use a smaller MIXALPHA and a smaller DT.

  5. I would like to use second-order, third-order, and fourth-order force constants to obtain anharmonic potentials and calculate the potential energy as a function of atomic displacement. My goal is to generate a plot similar to the one in the paper “Orbitally driven giant phonon anharmonicity in SnSe” (Nature Phys. 2015).Please use https://github.com/ttadano/alamode/blob/develop/tools/calcpes.py.

  6. now that I have obtained the renormalized force constant file xxx.xml at a finite temperature, I now want to convert the renormalized force constant file directly to FORCE_CONSTANS

  7. How to convert a second-order force constant matrix obtained by almode to FORCE_CONSTANTS in phonopy format?

    python convert.py alamode.xml > FORCE_CONSTANTS

Could you give me some suggestion? How shoud I covert this with phonopy?

FULL_FORCE_CONSTANTS = .TRUE.
WRITE_FORCE_CONSTANTS = .TRUE.
Note: the old FORCE_CONSTANTS will be overwrited

  1. How small the fitting error should be?

It depends on the Taylor expansion potential and displacement magnitude you choose.
In the standard harmonic calculation where –mag=0.01 is used in displace.py and the all harmonic interactions are considered (cutoff = None), the fitting error is usually less than 5% (~1–2% in most cases).
In the calculation of third-order force constants with –mag=0.04, the fitting error should be small as well. Indeed, in many cases, we obtain much smaller fitting errors (< 1%) than the harmonic case.
In the temperature-dependent effective potential method, we try to fit the harmonic potential to the displacement-force datasets sampled by ab initio molecular dynamics at finite temperature. Therefore, the fitting error tends to be much larger (> 10%).

dynaphopy

  1. 简谐声子谱的计算。
    dynaphopy的非谐修正是在phonopy的力常数基础上进行的,需要先进行0k声子谱的计算。
    结构优化的INCAR,力的收敛标准是E-3,大部分的文献也是在这个精度范围内。结构优化的结构是单胞,10个原子。
    这是phonopy计算的声子谱,计算的结构为222的超胞,80个原子,在gmma点和X点有很强的虚频。这个虚频即使提高收敛精度和扩大超胞也是无法消除的。
  2. AIMD计算
    dynaphopy通过读取AIMD的计算结构进行拟合(说法不准确),需要预先准备AIMD的outcar或xdatcar。
    AIMD的计算设置,基本参考dynaphopy的example中的设置,详细的参数涵义,都有教程介绍。
    这里只是采用了3000步的计算,步长是2fs,能量的收敛精度是E-6,不算太高。同样是采用80个原子的超胞。大部分做非谐计算的文献,所采用的都是在80-160原子数范围内的超胞,步长多是1-2fs,总步数大概是3000-6000,总的时长是5ps-10ps。从下面的非谐声子谱结果来看,这个设置对于非谐计算是合适的?
  3. dynaphopy非谐声子谱计算。
    dynaphopy的官网如下:Dynaphopy (abelcarreras.github.io)。
    将结构优化的原始晶胞POSCAR,phonopy输出的力常数,和AIMD的OUTCAR放在一个文件夹内。
    设置dynaphopy的输入文件input如下:分别是输入结构文件,力常数文件,原胞和超胞与POSCAR的关系设置,band是声子谱的高对称点路径,设置方式和vasp计算PBE能带一致。
    然后输入dynaphopy input OUTCAR -i,进入下的界面,选择6,进入非谐声子谱计算,再选择1,可以同时输出简谐声子谱和非简谐声子谱,此时会对peak进行拟合。拟合结束后,会输出声子谱。
    一开始使用默认设置,输出的声子谱,可以看到高温声子谱虚频加重了。从@get-it 大佬处了解到,dynaphopy默认使用最大熵方法拟合,效果可能不如fftw有效。于是小弟将拟合方式改为fftw,通过指令dynaphopy input OUTCAR -i -psm 3,采用快速傅里叶变换拟合。得到300k下的声子谱,可以看到,原来gamma点和X点的虚频,已经被成功消除了。而实验上,这个材料在室温下肯定是稳定的。

当然,如果想要得到更准确的声子谱,需要提高优化精度,采用更大的超胞计算力常数,AIMD需要更多的步数和更小的步长,比如dynaphopy的例子是采用0.7 fs,跑200000步。如果只是想得到一个比较合理的声子谱,适当降低精度是没问题的。比如这个计算,在24核的机器上,结构优化用时不到3小时,dfpt计算1小时,AIMD计算14小时,差不多用时一天,能够得到一个比较合适的声子谱。如果提高精度,计算用时可能会提升数倍,但是声子谱的提升可能并不会太明显。

MC-电声耦合

需要vasp6.0之后的版本,INCAR开启

PHON_LMC = .TRUE.
IBRION = 6

全MC采样

  • 标签PHON_NSTRUCT设置由于MC抽样而生成的结构的数量。应该监视观测值相对于这个数量的收敛。

  • 标签TEBEG=0也是需要的,用于选择运行抽样的温度。

  • 另外,PHON_LBOSE可以设置为.TRUE.或.FALSE. (默认PHON_LBOSE=.TRUE.),分别选择玻色-爱因斯坦统计或麦克斯韦-玻尔兹曼统计。

0K的一个INCAR文件如下:

1
2
3
4
5
6
7
8
System = DEFAULT
PREC = Accurate
ISMEAR = 0; SIGMA = 0.1;
IBRION = 6

PHON_LMC = .TRUE.
PHON_NSTRUCT = 100
TEBEG = 0.0

随后生成Wycoff positions畸变的许多POSCAR,输出为POSCAR.TEBEG.NUMBER

ZG configuration即时采样(one-shot)

这种方法仅使用单一的扭曲结构,因此比完全的MC抽样快上几个数量级,同时保持了与收敛的超晶胞尺寸的完全MC抽样非常接近的准确性。例如,我们展示了对于带隙的零点重整化,准确度在ZG配置和完全MC抽样之间在5毫电子伏特之内。因此,我们建议优先使用这种方法,当很难实现超晶胞尺寸的收敛或者5毫电子伏特的精度已经足够时。

  1. 输入
    要选择ZG配置,必须在INCAR文件中设置PHON_NSTRUCT=0。不同温度的数量和温度列表(以K为单位)必须使用标签PHON_NTLISTPHON_TLIST,在INCAR文件中分别提供。一个示例如下:
    1
    2
    PHON_NTLIST = 4
    PHON_TLIST = 0.0 100.0 200.0 350.0

给出了一个温度范围为0-700K(步长为100K)的示例INCAR文件:

1
2
3
4
5
6
7
8
System = DEFAULT
PREC = Accurate
ISMEAR = 0; SIGMA = 0.1;
IBRION = 6
PHON_NTLIST = 8
PHON_TLIST = 0.0 100.0 200.0 300.0 400.0 500.0 600.0 700.0
PHON_NSTRUCT = 0
PHON_LMC = .TRUE.
  1. 输出

类似于MC抽样,ZG配置方法会产生多个具有不同扭曲Wycoff位置但不变的布里渊矩阵的POSCAR文件。这些文件被标记为

POSCAR.TEMP
其中TEMP遍历由PHON_TLIST定义的所有温度。

one-shot例子(金刚石带隙重整化)

输入文件

INCAR:

1
2
3
4
5
6
7
8
9
10
11
general:
System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1;
IBRION = 6 #获得动力学矩阵声子计算
PHON_LMC = .TRUE. #开启电声耦合计算
PHON_NSTRUCT = 0 #选择one-shot方法
PHON_NTLIST = 1 #温度点个数
PHON_TLIST = 0.0 #对应温度

准备优化后的结构,需要扩胞,以保证声子准确。KPOINTS、POTCAR根据POSCAR调整。

计算

一、获得结构

按照超胞结构和上面的INCAR提交任务,结束后获得OUTCAR。
执行: cp OUTCAR OUTCAR.init
新的畸变后的结构输出为POSCAR.T=0.

二、计算特定位移畸变结构的电子能级

cp POSCAR.T=0. POSCAR

INCAR 修改为

1
2
3
4
5
 System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1 #去掉PHON_标签

执行计算,完成后cp OUTCAR OUTCAR.T=0.

三、 提取ZPR

具有特殊位移的带隙减去没有特殊位移的带隙,就可以得到零点带隙重整的值。带隙保存在OUTCAR文件里。

执行例子中的脚本:bash extract_zpr.sh,
脚本内容:

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
#!/bin/bash 

i="OUTCAR.T=0."
j="OUTCAR.init"

homo1=`awk '/NELECT/ {print $3/2}' $i`
homo2=`awk '/NELECT/ {print $3/2-1}' $i`
homo3=`awk '/NELECT/ {print $3/2-2}' $i`
lumo1=`awk '/NELECT/ {print $3/2+var+1}' $i`
lumo2=`awk '/NELECT/ {print $3/2+var+2}' $i`
lumo3=`awk '/NELECT/ {print $3/2+var+3}' $i`
lumo4=`awk '/NELECT/ {print $3/2+var+4}' $i`
lumo5=`awk '/NELECT/ {print $3/2+var+5}' $i`
lumo6=`awk '/NELECT/ {print $3/2+var+6}' $i`
e1a=`grep " $homo1 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1b=`grep " $homo2 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1c=`grep " $homo3 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e2a=`grep " $lumo1 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2b=`grep " $lumo2 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2c=`grep " $lumo3 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2d=`grep " $lumo4 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2e=`grep " $lumo5 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2f=`grep " $lumo6 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`

homo_ref=`awk '/NELECT/ {print $3/2}' $j`
lumo_ref=`awk '/NELECT/ {print $3/2+var+1}' $j`

h_ref=`grep " $homo_ref " $j | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
l_ref=`grep " $lumo_ref " $j | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`

echo "The band gap (in eV) without zero-point vibrations is:"
echo "$h_ref $l_ref" |awk '{print ($2-$1)}'
echo "The band gap (in eV) including zero-point vibrations is:"
echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f" |awk '{print (($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)}'
echo "The zero-point renormalization of the band gap (in eV) is:"
echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f $h_ref $l_ref" |awk '{print (($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)-($11-$10)}'

输出如下:

1
2
3
4
5
6
The band gap (in eV) without zero-point vibrations is:
4.4049
The band gap (in eV) including zero-point vibrations is:
4.05102
The zero-point renormalization of the band gap (in eV) is:
-0.353883

精度

精度取决于超胞大小。超胞越大越准确。

温度依赖的带隙计算

输入文件

INCAR:

1
2
3
4
5
6
7
8
9
10
 System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1;
IBRION = 6 #获得动力学矩阵声子计算
PHON_LMC = .TRUE. #开启电声耦合计算
PHON_NSTRUCT = 0 #选择one-shot方法
PHON_NTLIST = 8 #温度个数
PHON_TLIST = 0.0 100.0 200.0 300.0 400.0 500.0 600.0 700.0

准备优化后的结构,需要扩胞,以保证声子准确。KPOINTS、POTCAR根据POSCAR调整。

计算

一、 获取特定位移的结构

按照超胞结构和上面的INCAR提交任务,结束后获得OUTCAR。
执行: cp OUTCAR OUTCAR.init
新的畸变后的结构输出为POSCAR.T=0. ~ POSCAR.T=700.

二、计算特定位移畸变结构的电子能级
cp POSCAR.T=0. POSCAR

INCAR 修改为

1
2
3
4
5
 System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1 #去掉PHON_标签

对每个温度下的结构执行计算。可通过脚本run_temperature.sh批量提交。
脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# please enter your executable path here
vasp_exec=./vasp_gam

#please enter the number of processors used for VASP here
np=8


for i in 0 100 200 300 400 500 600 700
do
cp POSCAR.T\=$i. POSCAR
mpirun -np $np $vasp_exec
mv OUTCAR OUTCAR.T\=$i
done

三、 分析OUTCAR

利用脚本extract_temp.sh

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
!/bin/bash 

if [ -f gap_vs_temp.dat ]
then
rm gap_vs_temp.dat
fi

touch gap_vs_temp.dat
counter=0

for temp in 0 100 200 300 400 500 600 700
do
i="OUTCAR.T=$temp"

homo1=`awk '/NELECT/ {print $3/2}' $i`
homo2=`awk '/NELECT/ {print $3/2-1}' $i`
homo3=`awk '/NELECT/ {print $3/2-2}' $i`
lumo1=`awk '/NELECT/ {print $3/2+var+1}' $i`
lumo2=`awk '/NELECT/ {print $3/2+var+2}' $i`
lumo3=`awk '/NELECT/ {print $3/2+var+3}' $i`
lumo4=`awk '/NELECT/ {print $3/2+var+4}' $i`
lumo5=`awk '/NELECT/ {print $3/2+var+5}' $i`
lumo6=`awk '/NELECT/ {print $3/2+var+6}' $i`
e1a=`grep "^ $homo1 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1b=`grep "^ $homo2 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1c=`grep "^ $homo3 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e2a=`grep "^ $lumo1 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2b=`grep "^ $lumo2 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2c=`grep "^ $lumo3 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2d=`grep "^ $lumo4 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2e=`grep "^ $lumo5 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2f=`grep "^ $lumo6 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`

if [ $temp -eq "0" ]
then
ref=`echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f" |awk '{print (($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)}'`
fi

echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f $temp $ref" |awk '{print $10,(($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)-$11}' >> gap_vs_temp.dat
done

运行脚本后生成gap_vs_temp.dat文件,画图即可。

gnuplot画图:
gnuplot -e "set terminal jpeg;set xlabel 'T (K)'; set ylabel 'band gap'; set style data lines; plot 'gap_vs_temp.dat', 'C_exp_points_offset0.dat' w circles, 'C_exp_fit_offset0.dat'" > gap_vs_temp.jpg

包含体积效应的温度依赖带隙

仅考虑温度效应会低估带隙,要考虑体积效应。

一、准简谐近似方法获得体积变化

三个脚本:

1
2
3
quasi_harm_4x4x4_diamond_create_pos_and_run_vasp.sh
quasi_harm_4x4x4_diamond_make_energy_vs_volume_plots.sh
quasi_harm_4x4x4_diamond_obtain_fitting.sh

对超胞结构创建不同体积的结构进行体积-能量计算:

运行脚本:quasi_harm_4x4x4_diamond_create_pos_and_run_vasp.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash

# please enter your executable path here
vasp_exec=./vasp_gam

#please enter the number of processors used for VASP here
np=8

cp INCAR.qh INCAR

for i in 6.13521592 6.27789536 6.4205748 6.56325424 6.70593368 6.84861312 6.99129256 7.133972 7.27665144 7.41933088 7.56201032 7.70468976 7.8473692 7.99004864 8.13272808
do
sed "s/7.13397200/${i}/g" POSCAR.4x4x4 > POSCAR_$i
cp POSCAR_$i POSCAR
mpirun -np 8 $vasp_exec

mv OUTCAR OUTCAR_$i
done

该脚本创建15个POSCAR,体积每步变化2%,运行脚本quasi_harm_4x4x4_diamond_create_pos_and_run_vasp.sh提交计算。

二、计算完成后运行quasi_harm_4x4x4_diamond_make_energy_vs_volume_plots.sh数据处理。
脚本内容:

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash

bandshift=0
gwrun=-1
dgbd=-1
val=-1
con=-1
gwldadiff=-1
test=-1
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
esac
shift
done

if [ -f "helpscript.perl" ]; then
rm helpscript.perl
fi


cat > helpscript.perl <<EOF
#!/bin/perl

use strict;
use warnings;

my \$zahler=0;
my @entropy=0;
my \$ezp=0;
my \$fhelmholtz=0;
my \$uenergy;
my \$kboltzmann=8.6173303*10**(-5.0);
my \$ntemp=8;
my \$tmax=700;
my \$tmin=0;
my \$tstep=100;
for (my \$itemp=1;\$itemp<=\$ntemp;\$itemp++)
{
\$entropy[\$itemp]=0;
}
while (<>)
{
chomp;
\$_=~s/^/ /;
my @help=split(/[\t,\s]+/);
\$zahler=\$zahler+1;
if (\$zahler == 1) {\$uenergy=\$help[1];}
else
{
my \$homega=\$help[2]/1000;
\$ezp=\$ezp+\$homega*0.5;
for (my \$itemp=1;\$itemp<=\$ntemp;\$itemp++)
{
my \$temp=(\$itemp-1)*\$tstep+\$tmin;
my \$kbt=\$kboltzmann*\$temp;
if (\$temp < 0.0000001)
{
}
else
{
\$entropy[\$itemp]=\$entropy[\$itemp]-\$kboltzmann*log(1-exp(-\$homega/\$kbt));
\$entropy[\$itemp]=\$entropy[\$itemp]+\$kboltzmann*\$homega/\$kbt*(1/(exp(\$homega/\$kbt)-1));
}
}
}
last if eof;
}

\$ezp=\$ezp; #/ \$zahler;

for (my \$itemp=1;\$itemp<=\$ntemp;\$itemp++)
{
my \$temp=(\$itemp-1)*\$tstep+\$tmin;

\$entropy[\$itemp]=\$entropy[\$itemp]; # / \$zahler;
\$fhelmholtz=\$uenergy+\$ezp-\$temp*\$entropy[\$itemp];
printf ("%15.8e %15.8e\n",\$temp,\$fhelmholtz);
}
printf ("#NOTEMP %15.8e\n",\$uenergy);
EOF

rm OUTTEMP*
first=0
for i in OUTCAR_*; do

echo "Starting $i"
v2=${i##OUTCAR_}
if [ -f "helpfile.help" ]; then
rm helpfile.help
fi
touch helpfile.help
cp OUTCAR_$v2 OUTCAR
awk '/free energy/' OUTCAR | tail -n 1| awk '{print $5}' >> helpfile.help
awk '/[0-9]* f .* THz/ {print $1,$10}' OUTCAR >> helpfile.help
awk '/[0-9]* f.i.*THz/ {print $1,$9}' OUTCAR >> helpfile.help
volume=`awk '/volume of cell/ {print $5}' OUTCAR | tail -n 1`

perl helpscript.perl helpfile.help > hhhhelp.txt

runcount=0
while read line; do
runcount=$((runcount+1))
if [[ $first -eq 0 ]]; then
echo $line | awk -v var="$volume" '{print var,$2,$1}' > OUTTEMP_$runcount
else
echo $line | awk -v var="$volume" '{print var,$2}' >> OUTTEMP_$runcount
fi
done < ./hhhhelp.txt

first=1
done

for i in OUTTEMP_*; do
v2=${i##OUTTEMP_}
mv OUTTEMP_$v2 OUTHELP
sort -n -k 1 OUTHELP > OUTTEMP_$v2
done

rm helpfile.help
rm helpscript.perl
rm hhhhelp.txt
rm OUTHELP

自由能曲线保存在OUTTEMP_*.

运行脚本quasi_harm_4x4x4_diamond_obtain_fitting.sh获得温度-体积关系。
脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

for i in OUTTEMP_*
do
cp $i OUTTEMP.current
#extract temperature
temp=`head -n 1 OUTTEMP.current|awk '{print $3}'`
#do fitting
gnuplot -e "E(V)=E0+9.0/8.0*B0*V0*((V0/V)**(2.0/3.0)-1)**2 + 9.0/16.0*B0*\
(B0P-4)*V0*((V0/V)**(2.0/3.0)-1.0)**3.0 + R*((V0/V)**(2.0/3.0)-1.0)**4.0;\
B0P = 1;B0 = 1;V0 = 720;E0 = -1150;R = -1.0;fit E(x) 'OUTTEMP.current' u 1:2 via B0P,B0,V0,E0,R" &> suppress_output
#extract volume from fit
a=`grep "V0" fit.log|grep "=" |tail -n 1|awk '{print ($3/2.0)**(1.0/3.0)}'`
#print temperature and volume to
echo "temperature: $temp, a_latt: $a"
done

rm suppress_output
rm OUTTEMP.current

输出如下:

1
2
3
4
5
6
7
8
9
temperature: 0.00000000e+00, a_latt: 7.18012
temperature: 1.00000000e+02, a_latt: 7.18014
temperature: 2.00000000e+02, a_latt: 7.18064
temperature: 3.00000000e+02, a_latt: 7.18267
temperature: 4.00000000e+02, a_latt: 7.18613
temperature: 5.00000000e+02, a_latt: 7.19037
temperature: 6.00000000e+02, a_latt: 7.19493
temperature: 7.00000000e+02, a_latt: 7.19959
temperature: #NOTEMP, a_latt: 7.15218

三、 最后将QHA获得的晶胞参数,替换掉POSCAR.T=* files中的晶胞参数。再次运行run_temperature.shextract_temp.sh.获得数据画图。

  • 通过添加体积效应,与实验获得了更好的一致性。在这个教程中,我们只使用了一个4x4x4的单元格,因为更大的单元格已经相当耗时,但对于收敛的5x5x5单元格,两条曲线都应该与实验相比略有变差。由于在本例中使用的PBE无法充分描述电子交换和相关性,因此预计实验与理论之间会有差异。为了获得真正的优异一致性,需要使用GW近似方法

  • 严格来说,将体积效应添加到电子-声子相互作用的正确方法是首先为每个温度更改体积,然后为该温度计算电子-声子相互作用。在这个教程和参考文献[5]中,我们是反过来做的。因此,电子-声子相互作用只需要计算一次。在参考文献[5]中,我们观察到这两种方法给出了非常相似的结果。

0%