ASE 使用
ASE 使用
介绍
-
atomic simulation environment (ASE):一系列用于设置、操作、运行、可视化及分析原子模拟的工具和 Python 模块
-
ASE 通过
Calculators
为不同的计算代码(DFT/MD)提供接口,Calculators
与核心Atoms
object 和 ASE 中的许多可用算法一起使用。
-
ASE 版本 Release notes:查看版本更新细节
-
注:ase 网站中的代码源码参数及注释与安装的 python package 源码会有不一致的地方,写脚本还是以 pacakge 的源码为准
1
2
3
4
5
6
from ase.atoms import Atoms
from ase.calculators.singlepoint import SinglePointCalculator
results={"energy": -7.0}
atoms.calc = SinglePointCalculator(atoms, **results)
atoms.get_potential_energy()
1
2
3
4
5
# ase rdf 计算
from ase.geometry.analysis import Analysis
# 添加 element 参数,可计算 partial rdf;默认计算 full rdf
rdf = Analysis(images=...).get_rdf()
ase 缺陷计算 寻找最优的超胞形状
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
# 添加真空层;单独使用该函数时,返回值为 None,即无效果
from ase.build import add_vacuum
# 优化器
from ase.optimize.lbfgs import LBFGS
from ase.optimize import QuasiNewton
from ase.constraints import FixAtoms
# 振动分析
from ase.vibrations import Vibrations
from ase.data import atomic_numbers
from ase.md.verlet import VelocityVerlet
from ase.units import fs
# 获取布拉维点阵
atoms.cell.get_bravais_lattice()
# 简易元素周期表绘制
# reference: https://wiki.fysik.dtu.dk/ase/gallery/gallery.html
from ase.utils.ptable import ptable
atoms = ptable()
atoms.write("ptable.png")
from ase.data import atomic_masses
# 固定平面
from ase.constraints import FixAtoms, FixedPlane
ase 没有直接计算弹性常数的模块
MAC版的ASE如何换轴的颜色 - 第一性原理 (First Principle) - 计算化学公社
interface 构建(较简单情况):Interface building - Manipulating atoms — ASE documentation
DOS、能带、EOS 计算:Crystals and band structure — ASE documentation
参考资料
ase 教程(内容较详细)
ase 进行 md 计算 package
弹性张量相关,ASE 接口:GitHub - jochym/Elastic: A module for ASE for elastic constants calculation.
ase tutorial
基于 PAW 和 ASE 的 DFT code
GPAW: DFT and beyond within the projector-augmented wave method — GPAW
ase 相关脚本案例
GitHub - AlexBoucherr/ASExVASP: A serie of script to perform calculations on VASP using the ASE
GitHub - jkitchin/dft-book: A book on modeling materials using VASP, ase and vasp
ase 结构 2D 和 3D 渲染
GitHub - superstar54/x3dase: X3D for Atomic Simulation Environment
ase.lattice 有生成 graphene 和 graphite modules
ase symmetry 教程(内容一般)
GitHub - ajjackson/ase-tutorial-symmetry: Tutorial notebook for symmetry features in ASE
表面吸附、EOS、弹性常数计算(ASE 中无计算弹性常数的模块和类)
GitHub - jochym/Elastic: A module for ASE for elastic constants calculation.
Calculation of elastic properties of crystals — Elastic v5.1.0 documentation
ase 模拟 md
ase 相关教程
安装
1
2
3
pip install ase # 安装
ase test # 测试;需安装 pytest
常用模块
1
2
3
4
5
from ase.cell import Cell
# cell 参数转换成 cell matrix
cell = Cell.fromcellpar([3.31, 3.31, 3.31, 90, 90, 90])
cell[:]
构型可视化
1
2
3
4
5
6
7
8
9
# 方式 1
from ase.visualize.plot import plot_atoms
plot_atoms(atoms)
# 方式 2
from ase.visualize import view
view(atoms, viewer="ngl")
nglview,可在 jupyter notebook 中可视化构型
1
pip install nglview
nglview 效果图:
crystal 构建
1
2
3
4
5
6
7
8
# 方式 1;最简单
from ase.build import bulk
# 方式 2
from ase.atoms import Atoms
# 方式 3
from ase.spacegroup import crystal
1
2
3
4
5
6
from ase.spacegroup import Spacegroup
spg = Spacegroup(152)
# 查看等同原子坐标
spg.equivalent_sites([0.4673, 0, 0.3333])
超胞
1
2
# 方式 1
supercell = atoms * (2, 2, 2)
db.select(sort)
中的 sort
为 含 key 的 str,含 -
时,降序
ase neb 方法:Nudged elastic band — ASE documentation
ase 相图绘制(2 维,3 维):Phase diagrams and Pourbaix diagrams — ASE documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from ase.build import sort
# 按照 chemical symbols 排序生成新的 Atoms object
sort(atoms)
# 固定原子
from ase.constraints import FixAtoms
atoms = ...
# 按照原子类型或 z 轴坐标进行固定
c = FixAtoms(mask=atoms.symbols == 'Cu')
c = FixAtoms(mask=atoms.positions[:, 2] < 1.0)
atoms.set_constraint(c)
Atomic Simulation Environment (ASE) 基础用法
1
2
3
4
5
6
7
8
9
10
11
# 执行 eos 计算,拟合体模量 B
from ase.eos import calculate_eos
from ase.units import kJ
from ase.atoms import Atoms
calc = ...
atoms: Atoms = ...
atoms.calc = calc
eos = calculate_eos(atoms, trajectory="XXX.traj")
v, e, B = eos.fit()
print(B / kJ * 1.0e24, "GPa")
CLI
开启 ase 补全(适用 bash,zsh 不行)
1
ase completion >> ~/.bashrc
1
2
3
4
5
6
7
8
# 列出 ase 可识别的构型文件格式
ase info --formats
# 列出 ase 的 calculators 以及是否被安装
# 3.22.1 与 3.23.0 版本的输出格式有区别
ase info --calculators
# 构型转换
ase convert -i vasp -o xyz -f -v POSCAR structure.xyz
1
2
3
4
5
6
7
# 查看 db 文件内容 推荐
ase db test.db
-L N # 只显示前 N 行
--offset N # 跳过前 N 行
--show-keys # 显示所有 keys
--show-values key1,key2,... # 显示 key 的值;value为数值时,只显示首尾值,如 energy_pa: [-9.18438289..-5.855563642]
ase.atoms
array methods of Atoms objects
Atom 和 Atoms 是 ASE 的两个基本 Object, Atoms 由 Atom 构成。 本质上 Atoms 是 Atom 的 list,可以使用标序的方式来查看 Atom
需添加 calculator 才能使用的 methods:Adding a calculator
1
2
3
4
5
6
7
8
9
10
# 属性
# 方法
get_XXX()
set_XXX()
# 需添加 calculator 才能使用的方法
get_potential_energy()
get_forces()
get_stress()
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
from ase.atoms import Atoms
from ase.formula import Formula
atoms: Atoms
# 常用属性和方法
# 化学式
formula = atoms.get_chemical_formula()
# 成分 {'Al': 5, 'Ti': 1}
composition = Formula(formula).count()
# 原子数
natoms = len(atoms)
# 元素种类数
nele = len(set(atoms.get_chemical_symbols()))
# 构型中某一元素的浓度
conc = atoms.get_chemical_symbols().count('Pd') / len(atoms)
# 删除 H 原子
del atoms[[atom.index for atom in atoms if atom.symbol == "H"]]
# 生成 slab 模型;在指定轴两端各添加真空层 vacuum 数值并使原子位点居中
center(vacuum=10.0, axis=2)
copy() # 拷贝
# 已施加 PBC 时,可将胞外原子移至胞内;下面的 wrap 参数同
wrap()
write() # 写入构型格式文件
# 分数坐标;wrap 参数默认为 True
get_scaled_positions()
# 笛卡尔坐标;wrap 参数默认为 False
get_positions()
positions
get_distance() # 两原子间的距离
get_distances() # 第 i 个原子与给定原子列表间的距离
ase.build
bulk
简单 bulk 模型构建 示例代码
1
2
3
4
5
6
7
8
from ase.build import bulk
# 原胞
primCell = bulk("Al", "fcc", a=4.05)
# 单胞 cubic=True
unitCell = bulk("Al", "fcc", a=4.05, cubic=True)
# 超胞
superCell = unitCell * (2, 2, 2)
surface
1
from ase.build import surface
简单 bulk 模型的表面构建 示例代码
ase.io
- 构型格式文件读入、写出
- 函数
read()
可自动识别文件格式;ase 中可识别的文件格式(部分格式只有read
或write
一个函数):File input and output — ASE documentation - 可以读取 gz 格式压缩文件,如 OUTCAR.gz
- ase 中读取 VASP OUTCAR 文件,写了一个 chunk 类?
写法一:在 write()
函数中的 format
参数指定文件格式
1
2
3
from ase.io import read, write
write(filename=..., images=..., format=...)
写法二:从 ase.io
中导入具体格式的模块及其函数
1
2
3
4
5
6
7
8
9
10
11
# LAMMPS data 格式
from ase.io.lammpsdata import read_lammps_data, write_lammps_data
# vasp 格式
from ase.io.vasp import read_vasp, write_vasp
# VASP 输出文件格式
from ase.io.vasp import read_vasp_out
# material studio xsd 格式
from ase.io.xsd import read_xsd, write_xsd
extxyz.py
源代码相关 warning:
1
2
/home/yangsl/src/miniconda3/envs/base_ysl/lib/python3.11/site-packages/ase/io/extxyz.py:1000: UserWarning: write_xyz() overwriting array "forces" present in atoms.arrays with stored results from calculator
warnings.warn('write_xyz() overwriting array "{0}" present '
ase.eos
获取平衡体积,能量和体模量
1
2
3
4
5
6
7
8
9
10
11
12
from ase.eos import EquationOfState
from ase.units import kJ
# murnaghan birch vinet
eos = EquationOfState(volumes, energies, eos="birchmurnaghan")
v0, e0, B = eos.fit()
print(f"v0 = {v0:.3f}")
print(f"e0 = {e0:.3f}")
print(f"B = {B / kJ * 1.0e24:.1f} GPa")
ax = eos.plot()
ax.set_title(label=None)
ase.db
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
from ase.db import connect
from ase.db.row import AtomsRow
db_fn = ...
db = connect(db_fn)
# 给 db 添加元数据
db.metadata = {...}
# 获取 db 文件中存储的结构数目
len(db)
db.count()
# 添加 selection 筛选条件
db.count("vasp_calc=Yes")
# 筛选 id<=5 的所有结构
# selection 可以是 id 或其他 AtomsRow 中的 key
# 注:字符与符号之间不能有空格
for row in db.select("id<=5"):
...
# 筛选 id>=5, id<=10 的所有结构
for row in db.select("id>=5, id<=10"):
...
# 单个 AtomsRow
# id 从 1 开始
row = db.get(id=10)
# 获取 AtomsRow 的 keys
print(row._keys)
# 获取 AtomsRow 的 key_value_pairs
print(row.key_value_pairs)
# 根据 key 获取 value
print(row.vasp_calc)
# 单个 Atoms
atoms_specific = db.get_atoms(id=10)
# 将 db 中的 AtomsRow 的结构和数据写入到其他 db 文件
db_output_fn = "..."
db_output = connect(db_output_fn)
for row in db.select("id<=10"):
key_value_pairs = row.key_value_pairs
data = row.data
# 将 AtomsRow 转化成 Atoms
atoms = row.toatoms()
db_output.write(atoms=atoms, key_value_pairs=key_value_pairs, data=data)
ase.calculators
effective medium theory (EMT)
1
2
3
4
5
6
7
8
9
from gpaw import GPAW
from ase.calculators.emt import EMT
atoms = ...
calc = GPAW(mode='lcao', basis='dzp', txt='gpaw.txt')
atoms.calc = calc
opt = BFGS(atoms, trajectory='opt.traj')
opt.run(fmax=0.05)
VASP
设置 VASP 执行命令和赝势路径
1
2
export ASE_VASP_COMMAND="mpirun path/vasp_std"
export VASP_PP_PATH=path/pp_path
或者在脚本中添加如下命令以设置相关环境变量
1
2
3
4
import os
os.environ["ASE_VASP_COMMAND"] = ...
os.environ["VASP_PP_PATH"] = ...
ASE VASP Calculator 赝势不同泛涵目录命名
1
2
3
4
5
LDA: $VASP_PP_PATH/potpaw/
PBE: $VASP_PP_PATH/potpaw_PBE/
PW91: $VASP_PP_PATH/potpaw_GGA/
# 查找元素 POTCAR 示例:potpaw_PBE/N/POTCAR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from ase.calculators.vasp import Vasp
calc = Vasp(
istart=0,
icharg=2,
encut=400,
ismear=1,
sigma=0.2,
lreal="Auto",
kpts=[5, 5, 5],
ivdw=12,
ediff=1e-05,
lwave=False,
lcharg=False,
)
LAMMPS
1
2
3
4
5
6
7
8
from ase.calculators.lammpsrun import LAMMPS
parameters = {
"pair_style": "meam/c",
"pair_coeff": ["* * library.meam Au Au.meam Au"],
}
files = ["library.meam", "Au.meam"]
calc = LAMMPS(parameters=parameters, files=files)
在 Pi 中用 ASE 的 VASP 的 Calculator
申请节点运算(不写提交脚本)
srun -p small -n 4 --pty /bin/bash
~/.bashrc
文件添加内容
1
2
3
4
5
6
7
8
9
module purge
module load intel-oneapi-compilers/2021.4.0
module load intel-oneapi-mpi/2021.4.0
module load intel-oneapi-mkl/2021.4.0
export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
export I_MPI_FABRICS=shm:ofi
export ASE_VASP_COMMAND="srun --mpi=pmi2 /lustre/home/acct-mseklt/mseklt/yangsl/bin/vasp_std"
1
python *.py
写提交脚本
~/.bashrc
文件添加内容
1
export ASE_VASP_COMMAND="srun --mpi=pmi2 /lustre/home/acct-mseklt/mseklt/yangsl/bin/vasp_std"
submit_ase.slurm
脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
#SBATCH -J vasp
#SBATCH -p small
#SBATCH -N 1
#SBATCH --ntasks-per-node=4
#SBATCH -o %j.out
#SBATCH -e %j.err
module purge
module load intel-oneapi-compilers/2021.4.0
module load intel-oneapi-mpi/2021.4.0
module load intel-oneapi-mkl/2021.4.0
export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
export I_MPI_FABRICS=shm:ofi
python python-file-name.py
sbatch submit_ase.slurm
在思源中用 ASE 的 VASP 的 Calculator
- 提交脚本(
ase-submit-sy.slurm
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#SBATCH -J ase
#SBATCH -p 64c512g
#SBATCH -N 1
#SBATCH --ntasks-per-node=2
#SBATCH --exclusive
#SBATCH -o %j.out
#SBATCH -e %j.err
module load vasp/5.4.4-intel-2021.4.0
ulimit -s unlimited
python python-file-name.py