Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
ASE-ABACUS接口使用方法介绍
ASE
ABACUS
ABACUS使用教程
ASEABACUSABACUS使用教程
量子御坂
发布于 2023-09-19
推荐镜像 :Basic Image:bohrium-notebook:2023-04-07
推荐机型 :c2_m4_cpu
赞 1
2
10
ASE-ABACUS接口使用方法介绍
安装ASE-ABACUS接口
通过 ASE 可视化 STRU 文件
通过 ASE 生成与转换 STRU 文件
1 CIF 转 STRU
2 STRU 转 CIF
3 POSCAR 转 STRU
4 STRU 转 POSCAR
5 STRU到其他结构格式的转换
通过ASE调用ABACUS进行计算
1. 设置环境变量
2. 加入ABACUS计算器
3. 基于已有STRU文件开始计算
通过ASE读取ABACUS计算轨迹
ASE-ABACUS 做 NEB 计算

ASE-ABACUS接口使用方法介绍

代码
文本

©️ Copyright 2023 @ Authors
作者:量子御坂 *** 📨
日期:2023-09-19
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
快速开始:点击上方的 开始连接 按钮,选择 bohrium-notebook:2023-05-31 镜像 和任意配置机型即可开始。

代码
文本

通过ASE-ABACUS接口,你可以做到

  1. 通过ASE可视化STRU文件
  2. 通过ASE生成与转换STRU文件
  3. 通过ASE调用ABACUS进行计算
  4. 通过ASE读取ABACUS计算结果

让我们开始吧!

哦对了,开始之前你可能需要自己准备一个STRU文件,或者,也可以让ASE帮你生成哦

代码
文本

安装ASE-ABACUS接口

如下操作将在目前的python环境中安装ASE和ASE-ABACUS接口。

代码
文本
[ ]
git clone https://gitlab.com/1041176461/ase-abacus.git
cd ase-abacus
python3 setup.py install
代码
文本

通过 ASE 可视化 STRU 文件

ASE-ABACUS接口的第一个用处即为用于ABACUS计算的STRU文件的快速可视化。这一点可以通过ASE的visualier模块来快速实现。以下模块实现了一个简单的可视化函数,用于可视化STRU文件。

代码
文本
[1]
from ase.io import read
from ase.visualize import view
from pathlib import Path
import sys

def get_stru(inputfile=""):
cs_atoms = None
if inputfile:
cs_stru = Path(inputfile)
cs_atoms = read(cs_stru, format="abacus")
else:
cs_atoms = read("STRU", format="abacus")
return cs_atoms

cs_atoms = get_stru()
view(cs_atoms)
<Popen: returncode: None args: ['/home/james/apps/anaconda3/envs/ase/bin/pyt...>
代码
文本

除了脚本之外,基于命令行有一个更简单的办法来可视化STRU文件。即通过ASE的GUI模块来实现。

代码
文本
[ ]
! ase -T gui STRU
代码
文本

通过 ASE 生成与转换 STRU 文件

ASE-ABACUS接口的一个关键用处就是从转cif,POSCAR,xyz等格式的结构文件转化为ABACUS的STRU格式文件,或者是反向的转换。当然这个过程也可以通过vaspkit开发组目前正在开发的ATOMKIT软件来实现,这是一个正在快速迭代中的跨平台建模与结构转换脚本,截止目前其最新版本为0.6.1。

ABACUS开发组更推荐采用ASE-ABACUS接口来进行操作

代码
文本

1 CIF 转 STRU

从CIF文件中读取结构信息并生成用于ABACUS计算的输入文件往往是计算开展的第一步,操作方法如下:

注意:这里的ppbasis变量只是将赝势和轨道基组文件指定到STRU文件内,并没有真正生成所需的赝势和轨道基组文件,ABACUS实际运行时会到INPUT里面以及环境变量里面去找对应的赝势和轨道基组文件。

注意:赝势和轨道基组文件是从已经设置好的环境变量对应的位置复制过来的(简单想想就知道也不可能是ASE-ABACUS接口自己生成的),所以在生成赝势和轨道基组文件的时候需要指定之前所述的环境变量

代码
文本
[3]
from ase.io import read, write
from pathlib import Path

cs_dir = './'
cs_vasp = Path(cs_dir, 'AMS_DATA-92.cif')
cs_atoms = read(cs_vasp, format='cif')
cs_stru = Path(cs_dir, 'STRU')
pp = {'Si':'Si_ONCV_PBE-1.0.upf','O':'O_ONCV_PBE-1.0.upf'}
basis = {'Si':'Si_gga_8au_100Ry_2s2p1d.orb','O':'O_gga_7au_100Ry_2s2p1d.orb'}
write(cs_stru, cs_atoms, format='abacus', pp=pp, basis=basis)
代码
文本

2 STRU 转 CIF

计算完毕的STRU文件需要转换成CIF文件,然后才能被VESTA等建模软件读取。转换方法如下:

代码
文本
[4]
from ase.io import read, write
from pathlib import Path

cs_dir = './'
cs_stru = Path(cs_dir, 'STRU')
cs_atoms= read( cs_stru, format='abacus')
cs_vasp = Path(cs_dir, 'STRU.cif')
write(cs_vasp, cs_atoms, format='cif')
代码
文本

3 POSCAR 转 STRU

VASP计算所得的POSCAR可以通过ASE-ABACUS接口快速地转换成ABACUS计算所需的STRU文件

代码
文本
[ ]
from ase.io import read, write
from pathlib import Path

cs_dir = './'
cs_vasp = Path(cs_dir, 'POSCAR')
cs_atoms = read(cs_vasp, format='vasp')
cs_stru = Path(cs_dir, 'STRU')
pp = {'Al':'Al_ONCV_PBE-1.0.upf'}
basis = {'Al':'Al_gga_8au_100Ry_2s2p1d.orb'}
# 如果要设置磁矩,有两个办法
# 1. 直接添加代码,对各原子设置磁矩
# cs_atoms.set_initial_magnetic_moments([1.0,1.0,1.0,1.0])
# 2. 设置每个原子每个方向的磁矩,此处需要使用二维数组、
# cs_atoms.set_initial_magnetic_moments([[1.0,1.0,1.0],[1.0,1.0,2.0],[1.0,1.0,3.0],[1.0,1.0,4.0]])
write(cs_stru, cs_atoms, format='abacus', pp=pp, basis=basis)
代码
文本

4 STRU 转 POSCAR

同样,逆过程也是可以进行的

代码
文本
[ ]
from ase.io import read, write
from pathlib import Path
from ase.calculators.abacus import Abacus

cs_dir = './'
cs_stru = Path(cs_dir, 'STRU')
cs_atoms= read(cs_stru, format='abacus')
cs_vasp = Path(cs_dir, 'POSCAR')
write(cs_vasp, cs_atoms, format='vasp')
代码
文本

容易发现,CIF/POSCAR 与 STRU 格式的互换是需要在脚本里面指定很多细节变量的,包括结构类型,STRU文件的赝势、基组,以及设置磁矩等。如果是日常的格式转换的话,可以通过将这些变量全部抽离前置,或者是用一个workflow组织起各个小脚本来解决。

实际上,这种重复造轮子的任务是没有太大必要的,ATOMKIT软件可以更好地进行结构转换。

但ASE有它独有的优势,比如我们可以通过读入POSCAR之后调用ABACUS进行计算,或者是,我们可以直接读入ABACUS的输出文件,来读取ABACUS计算的结果。

代码
文本

5 STRU到其他结构格式的转换

ASE支持的结构格式多种多样,具体可参照ase.io-module。工作流程与上面的例子类似,都是先用ase.io.read读入结构(或者多帧结构),再用ase.io.write输出目标结构即可。

这些格式转换也大多可以通过ATOMKIT完成

代码
文本

通过ASE调用ABACUS进行计算

生成了STRU文件之后,只需要KPT和INPUT文件,就可以应用ABACUS进行计算了, 可以通过ASE-ABACUS接口,即ase.calculators.abacus模块来调用ABACUS进行计算, 具体操作如下:

代码
文本

1. 设置环境变量

ABACUS支持模守恒赝势,并支持两种基组:PW(平面波基组)和LCAO(数值原子轨道基组),赝势和轨道基组文件的存放方式可以通过环境变量设置,分别为ABACUS_PP_PATHABACUS_ORBITAL_PATH,设置方法如下:

如果只做PW计算,可以不用设置ABACUS_ORBITAL_PATH

代码
文本
[ ]
#PP=${HOME}/pseudopotentials
#ORB=${HOME}/orbitals
# in shell
# PP=/home/james/example/PP
# ORB=/home/james/example/ORB
# export ABACUS_PP_PATH=${PP}
# export ABACUS_ORBITAL_PATH=${ORB}
# in python
import os
os.environ['ABACUS_PP_PATH'] = '/home/james/example/PP'
os.environ['ABACUS_ORBITAL_PATH'] = '/home/james/example/ORB'
print(os.environ.get('ABACUS_PP_PATH'))
print(os.environ.get('ABACUS_ORBITAL_PATH'))
/home/james/example/PP
/home/james/example/ORB
代码
文本

2. 加入ABACUS计算器

ASE通过ase.calculators调用外部软件作为计算器进行计算,在python中引入ABACUS接口的方式为:

代码
文本
[ ]
from ase.calculators.abacus import Abacus
代码
文本

3. 基于已有STRU文件开始计算

代码
文本

以下是一个读取已有STRU文件,通过ABACUS进行SCF计算, 并基于ASE的优化器进行结构优化计算的示例脚本

代码
文本
[ ]
# read STRU file, generate INCAR and KPT file
# run optimization jobs
import os
from ase.optimize import QuasiNewton, BFGS, LBFGS, FIRE, GPMin
from ase.io import read
from ase.calculators.abacus import Abacus, AbacusProfile

# setting
stru = read('STRU', format='abacus')
optimizer = QuasiNewton
mpi = 1
omp = 16
abacus = 'abacus'
pseudo_dir = "/home/james/example/PP"
basis_dir = "/home/james/example/ORB"
pp = {"Pt": "Pt_ONCV_PBE-1.0.upf"}
basis = {"Pt": "Pt_gga_7au_100Ry_4s4p1d.orb"}
kpts = [3, 3, 1] # KPT setting (will be generate next)
# INPUT setting
parameters = {
'calculation': 'scf',
'basis_type': 'lcao',
'ks_solver': 'genelpa',
'vdw_method': 'd3_bj',
'nspin' : 2,
'xc': 'pbe',
'ecutwfc': 100,
'kpts': kpts,
'pp': pp,
'basis': basis,
'pseudo_dir': pseudo_dir,
'basis_dir': basis_dir,
'smearing_method': 'mp',
'smearing_sigma': 0.008,
'mixing_type': 'pulay',
'mixing_beta': 0.2,
'mixing_gg0': 1.5,
'scf_thr': 1e-6,
'cal_force': 1,
'cal_stress': 1,
'out_stru': 1,
'out_chg': 0,
'out_bandgap': 0,
'efield_flag': 0,
'dip_cor_flag': 0,
'efield_dir': 2,
}

# running
os.environ['OMP_NUM_THREADS'] = f'{omp}'
profile = AbacusProfile(
argv=['mpirun', '-np', f'{mpi}', abacus])
stru.calc = Abacus(profile=profile, directory="OUT",
**parameters)

qn = optimizer(stru, trajectory='opt.traj')
qn.run(fmax=0.05)
代码
文本

通过ASE读取ABACUS计算轨迹

ASE也可以读取ABACUS的计算结果,即计算所得的running*.log文件,并将其转化为含有结构,能量,力和维里的文件格式,便于可视化与用于机器学习势函数训练。

代码
文本

以下是一个读取ABACUS计算结果并将其转换为extxyz格式的例子。extxyz即extended xyz格式文件,是ASE最推荐的文件格式,它可以在存储结构的同时存储其能量、力和维里的计算结果。

代码
文本
[ ]
from ase.io import read, write
from pathlib import Path
from ase.calculators.abacus import Abacus

cs_dir = './OUT.ABACUS/'
cs_stru = Path(cs_dir, 'running_relax.log')
cs_atoms= read(cs_stru, format='abacus-out')
cs_vasp = Path(cs_dir, 'relax_traj.extxyz')
write(cs_vasp, cs_atoms, format='extxyz')
代码
文本

ASE-ABACUS 做 NEB 计算

代码
文本

回顾利用ASE进行NEB计算的基本思路:

  1. 初始化NEB链的初末态,并优化
  2. 给出NEB链的中间态插值初猜
  3. 进行迭代的NEB链优化计算

ASE-ABACUS进行NEB计算的思路也是类似的。

具体内容我们放到下期Notebook吧

代码
文本
ASE
ABACUS
ABACUS使用教程
ASEABACUSABACUS使用教程
已赞1
本文被以下合集收录
计算材料学学习材料合集
Letian
更新于 2024-09-07
20 篇36 人关注
ABACUS
bohr9d1500
更新于 2024-05-18
14 篇5 人关注
推荐阅读
公开
快速上手使用ABACUS + DP-GEN | init_bulk/run
ABACUSABACUS使用教程dpgen
ABACUSABACUS使用教程dpgen
AISI 胡钰铂
更新于 2024-06-18
2 转存文件1 评论
公开
一键配置编译ABACUS | toolchain 脚本的使用
ABACUSABACUS使用教程
ABACUSABACUS使用教程
量子御坂
发布于 2023-09-01
9 赞2 转存文件9 评论
评论
 git clone https://gi...

上官影

12-13 02:58
好像最后一行这种安装命令不太推荐了,可以用pip install . 实现

量子御坂

作者
12-22 22:22
回复 上官影 是这样的,更推荐pip install .

zhaojianguo

03-18 07:53
为什么安装上了无法识别'abacus'格式
评论
 # read STRU file, ge...

量子御坂

作者
12-22 22:23
这里的相关INPUT参数属于老版ABACUS的推荐参数,新版并不推荐
评论