ASE使用笔记(1)

2024-02-27 16:08
文章标签 使用 笔记 ase

本文主要是介绍ASE使用笔记(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ASE使用笔记(1

    • 写在前面
    • 关于安装ASE
    • ASE的简介
    • 官网的第一个demo
    • 关于ASE调用其他第一原理计算软件如VASP
    • 对于材料结构上的操控(感觉还是和吸附有点像)
    • 旋转操作
    • CIF和XYZ,POSCAR的转换
    • 总结

ASE(Atomic Simulation Environment) is a set of tools and Python modules for setting up, manipulating, running, visualizing and analyzing atomistic simulations. The code is freely available under the GNU LGPL license.

写在前面

作为一个刚刚由机器学习转入第一原理的人,对一些物理图像还是不怎么清晰的,但是,工欲善其事必先利其器,既然要做DFT相关的事情了,把和DFT相关的这些Python lib琢磨一下,应该会提高后期工作的效率。

关于安装ASE

pip install 即可,中间遇到的报错如VC++14之类的问题可以网上搜索解决办法进行规避or下载提示需要的VC++14,很多与和第一原理做接口的Python库都需要这个(如Pymatgen也遇到了这样的问题)
对于VC++14的下载:复制这段内容后打开百度网盘手机App,操作更方便哦
链接:https://pan.baidu.com/s/1I0OTvHfeNhaqrnY_nCqfyQ 提取码:8n85
官网链接:https://wiki.fysik.dtu.dk/ase/index.html

ASE的简介

官网解释的很清楚了,不再赘述。

官网的第一个demo

计算吸附能,氮气分子在铜板板上的
本笔记是在Jupyter Notebook的IPython环境下运行的。

#### 如何得到一个氮气分子
from ase import Atoms
d = 1.10
molecule = Atoms('2N', positions=[(0., 0., 0.), (0., 0., d)])
#### 如何得到铜板板
from ase.build import fcc111
slab = fcc111('Cu', size=(4,4,2), vacuum=10.0)#### 使用effective medium theory (EMT) calculator(有效介质理论)
from ase.calculators.emt import EMT
slab.calc = EMT()
molecule.calc = EMT()
#### 得到各自体系的孤立能量
e_slab = slab.get_potential_energy()
e_N2 = molecule.get_potential_energy()
#### 结构优化,这个例子是在on-top位置的
h = 1.85
add_adsorbate(slab, molecule, h, 'ontop')#### 固定(fix)铜板板是不能动的,只有N可以调整
from ase.constraints import FixAtoms
constraint = FixAtoms(mask=[a.symbol != 'N' for a in slab])
slab.set_constraint(constraint)
#### 设置受力收敛标准为0.005
from ase.optimize import QuasiNewton
dyn = QuasiNewton(slab, trajectory='N2Cu.traj')
dyn.run(fmax=0.00005)
                Step[ FC]     Time          Energy          fmax
*Force-consistent energies used in optimization.
BFGSLineSearch:    0[  0] 14:33:13       11.689927*       1.0797
BFGSLineSearch:    1[  2] 14:33:13       11.670814*       0.4090
BFGSLineSearch:    2[  4] 14:33:13       11.625880*       0.0409
BFGSLineSearch:    3[  6] 14:33:13       11.625228*       0.0309
BFGSLineSearch:    4[  7] 14:33:13       11.625212*       0.0039
BFGSLineSearch:    5[  8] 14:33:13       11.625212*       0.0000
## 把结构信息存储和读取
from ase.io import write
write('slab.xyz', slab)
from ase.io import read
slab_from_file = read('slab.xyz')
## 结构的可视化
from ase.visualize import view
view(slab)

结构的可视化

## 分子动力学,但是他的温度设置是如何的没有仔细看
from ase.md.verlet import VelocityVerlet
from ase import units
dyn = VelocityVerlet(molecule, dt=1.0 * units.fs)
for i in range(100):pot = molecule.get_potential_energy()kin = molecule.get_kinetic_energy()print('%2d: %.5f eV, %.5f eV, %.5f eV' % (i, pot + kin, pot, kin))dyn.run(steps=20)
0: 0.45841 eV, 0.32004 eV, 0.13837 eV1: 0.45945 eV, 0.41613 eV, 0.04332 eV2: 0.45790 eV, 0.31736 eV, 0.14054 eV3: 0.45831 eV, 0.34529 eV, 0.11302 eV4: 0.45924 eV, 0.39462 eV, 0.06462 eV5: 0.45870 eV, 0.34393 eV, 0.11477 eV6: 0.45933 eV, 0.40648 eV, 0.05285 eV7: 0.45741 eV, 0.27477 eV, 0.18264 eV8: 0.45975 eV, 0.44898 eV, 0.01077 eV9: 0.45782 eV, 0.27953 eV, 0.17828 eV
10: 0.46031 eV, 0.45943 eV, 0.00088 eV
11: 0.45762 eV, 0.26915 eV, 0.18847 eV
12: 0.45981 eV, 0.45633 eV, 0.00348 eV
13: 0.45737 eV, 0.26596 eV, 0.19141 eV
14: 0.45971 eV, 0.42801 eV, 0.03171 eV
15: 0.45845 eV, 0.32330 eV, 0.13515 eV
16: 0.45943 eV, 0.41328 eV, 0.04615 eV
17: 0.45795 eV, 0.32109 eV, 0.13686 eV
18: 0.45825 eV, 0.34118 eV, 0.11707 eV
19: 0.45928 eV, 0.39782 eV, 0.06146 eV
20: 0.45866 eV, 0.34048 eV, 0.11818 eV
21: 0.45939 eV, 0.41026 eV, 0.04913 eV
22: 0.45740 eV, 0.27294 eV, 0.18446 eV
23: 0.45976 eV, 0.45045 eV, 0.00931 eV
24: 0.45778 eV, 0.27753 eV, 0.18025 eV
25: 0.46032 eV, 0.45992 eV, 0.00040 eV
26: 0.45765 eV, 0.27054 eV, 0.18711 eV
27: 0.45981 eV, 0.45540 eV, 0.00441 eV
28: 0.45737 eV, 0.26702 eV, 0.19035 eV
29: 0.45965 eV, 0.42475 eV, 0.03491 eV
30: 0.45849 eV, 0.32661 eV, 0.13188 eV
31: 0.45940 eV, 0.41036 eV, 0.04903 eV
32: 0.45801 eV, 0.32490 eV, 0.13311 eV
33: 0.45819 eV, 0.33711 eV, 0.12107 eV
34: 0.45931 eV, 0.40097 eV, 0.05834 eV
35: 0.45862 eV, 0.33705 eV, 0.12157 eV
36: 0.45946 eV, 0.41395 eV, 0.04551 eV
37: 0.45739 eV, 0.27126 eV, 0.18612 eV
38: 0.45978 eV, 0.45182 eV, 0.00795 eV
39: 0.45775 eV, 0.27564 eV, 0.18211 eV
40: 0.46032 eV, 0.46022 eV, 0.00010 eV
41: 0.45768 eV, 0.27206 eV, 0.18562 eV
42: 0.45980 eV, 0.45435 eV, 0.00544 eV
43: 0.45737 eV, 0.26823 eV, 0.18914 eV
44: 0.45959 eV, 0.42137 eV, 0.03822 eV
45: 0.45853 eV, 0.32995 eV, 0.12858 eV
46: 0.45937 eV, 0.40739 eV, 0.05198 eV
47: 0.45806 eV, 0.32878 eV, 0.12928 eV
48: 0.45813 eV, 0.33310 eV, 0.12503 eV
49: 0.45934 eV, 0.40406 eV, 0.05527 eV
50: 0.45858 eV, 0.33364 eV, 0.12494 eV
51: 0.45952 eV, 0.41755 eV, 0.04197 eV
52: 0.45738 eV, 0.26973 eV, 0.18765 eV
53: 0.45979 eV, 0.45309 eV, 0.00670 eV
54: 0.45772 eV, 0.27386 eV, 0.18385 eV
55: 0.46032 eV, 0.46032 eV, 0.00000 eV
56: 0.45771 eV, 0.27370 eV, 0.18401 eV
57: 0.45979 eV, 0.45320 eV, 0.00658 eV
58: 0.45738 eV, 0.26960 eV, 0.18778 eV
59: 0.45953 eV, 0.41788 eV, 0.04164 eV
60: 0.45857 eV, 0.33332 eV, 0.12525 eV
61: 0.45934 eV, 0.40435 eV, 0.05499 eV
62: 0.45812 eV, 0.33273 eV, 0.12539 eV
63: 0.45807 eV, 0.32915 eV, 0.12892 eV
64: 0.45937 eV, 0.40710 eV, 0.05226 eV
65: 0.45854 eV, 0.33026 eV, 0.12827 eV
66: 0.45959 eV, 0.42105 eV, 0.03854 eV
67: 0.45737 eV, 0.26835 eV, 0.18902 eV
68: 0.45980 eV, 0.45425 eV, 0.00555 eV
69: 0.45768 eV, 0.27221 eV, 0.18548 eV
70: 0.46032 eV, 0.46024 eV, 0.00009 eV
71: 0.45775 eV, 0.27547 eV, 0.18228 eV
72: 0.45978 eV, 0.45195 eV, 0.00783 eV
73: 0.45739 eV, 0.27111 eV, 0.18627 eV
74: 0.45946 eV, 0.41429 eV, 0.04517 eV
75: 0.45861 eV, 0.33673 eV, 0.12189 eV
76: 0.45931 eV, 0.40126 eV, 0.05805 eV
77: 0.45818 eV, 0.33673 eV, 0.12145 eV
78: 0.45801 eV, 0.32526 eV, 0.13275 eV
79: 0.45939 eV, 0.41009 eV, 0.04931 eV
80: 0.45849 eV, 0.32692 eV, 0.13158 eV
81: 0.45965 eV, 0.42444 eV, 0.03521 eV
82: 0.45737 eV, 0.26713 eV, 0.19024 eV
83: 0.45981 eV, 0.45530 eV, 0.00450 eV
84: 0.45765 eV, 0.27068 eV, 0.18698 eV
85: 0.46032 eV, 0.45996 eV, 0.00036 eV
86: 0.45778 eV, 0.27735 eV, 0.18043 eV
87: 0.45976 eV, 0.45058 eV, 0.00918 eV
88: 0.45740 eV, 0.27278 eV, 0.18462 eV
89: 0.45940 eV, 0.41061 eV, 0.04879 eV
90: 0.45865 eV, 0.34016 eV, 0.11850 eV
91: 0.45928 eV, 0.39811 eV, 0.06116 eV
92: 0.45824 eV, 0.34079 eV, 0.11745 eV
93: 0.45796 eV, 0.32145 eV, 0.13651 eV
94: 0.45942 eV, 0.41301 eV, 0.04641 eV
95: 0.45845 eV, 0.32361 eV, 0.13484 eV
96: 0.45971 eV, 0.42771 eV, 0.03200 eV
97: 0.45737 eV, 0.26605 eV, 0.19132 eV
98: 0.45981 eV, 0.45625 eV, 0.00356 eV
99: 0.45762 eV, 0.26927 eV, 0.18835 eV

关于分子的一些优化和计算,本人不研究非周期体系,有时间了可以看一下

关于ASE调用其他第一原理计算软件如VASP

$ export ASE_VASP_COMMAND="mpiexec $HOME/vasp/bin/vasp_std"   ##可执行路径
$ export VASP_PP_PATH=$HOME/vasp/mypps   ##yanshiPP
$ export ASE_VASP_VDW=$HOME/<path-to-vdw_kernel.bindat-folder>  ##vdw文件路径
from ase.build import molecule
atoms = molecule('N2')    ## 这里还是拿个氮气作为例子
atoms.center(vacuum=5)
from ase.calculators.vasp import Vasp2calc = Vasp2(xc='pbe',  # Select exchange-correlation functionalencut=520, # Plane-wave cutoffkpts=(1, 1, 1)) # k-pointsatoms.calc = calc
en = atoms.get_potential_energy()  # This call will start the calculation
print('Potential energy: {:.2f} eV'.format(en))Potential energy: -16.59 eV

对于材料结构上的操控(感觉还是和吸附有点像)

from math import sqrt
from ase import Atoms
a = 3.55
atoms = Atoms('Ni4',cell=[sqrt(2) * a, sqrt(2) * a, 1.0, 90, 90, 120],pbc=(1, 1, 0),scaled_positions=[(0, 0, 0),(0.5, 0, 0),(0, 0.5, 0),(0.5, 0.5, 0)])
atoms.center(vacuum=5.0, axis=2)
atoms.cell
Cell([[5.020458146424487, 0.0, 0.0], [-2.5102290732122423, 4.347844293440141, 0.0], [0.0, 0.0, 10.0]])
atoms.positions
array([[ 0.        ,  0.        ,  5.        ],[ 2.51022907,  0.        ,  5.        ],[-1.25511454,  2.17392215,  5.        ],[ 1.25511454,  2.17392215,  5.        ]])

行吧,和POSCAR基本吻合

from ase.visualize import view
atoms.write('slab.xyz')
view(atoms)

在这里插入图片描述

还可以看看扩胞后的,在命令行上使用的话需要输入

ase gui -r 3,3,2 slab.xyz

当然,我这个环境需要在命令行前加入一个感叹号

!ase gui -r 3,3,2 slab.xyz   ## 扩胞查看
## 如果加点东西进去(先加个原子进去)
h = 1.9
relative = (1 / 6, 1 / 6, 0.5)
absolute = np.dot(relative, atoms.cell) + (0, 0, h)
atoms.append('Ag')
atoms.positions[-1] = absolute
view(atoms)

在这里插入图片描述

## 创建了一个水分子进来
import numpy as np
from ase import Atoms
p = np.array([[0.27802511, -0.07732213, 13.46649107],[0.91833251, -1.02565868, 13.41456626],[0.91865997, 0.87076761, 13.41228287],[1.85572027, 2.37336781, 13.56440907],[3.13987926, 2.3633134, 13.4327577],[1.77566079, 2.37150862, 14.66528237],[4.52240322, 2.35264513, 13.37435864],[5.16892729, 1.40357034, 13.42661052],[5.15567324, 3.30068395, 13.4305779],[6.10183518, -0.0738656, 13.27945071],[7.3856151, -0.07438536, 13.40814585],[6.01881192, -0.08627583, 12.1789428]])
c = np.array([[8.490373, 0., 0.],[0., 4.901919, 0.],[0., 0., 26.93236]])
W = Atoms('4(OH2)', positions=p, cell=c, pbc=[1, 1, 0])
W.write('WL.traj')

在这里插入图片描述

旋转操作

W.rotate(90, 'z', center=(0, 0, 0))
view(W)
W.wrap()
###########The wrap() method only works if periodic boundary conditions are enabled. We have a 2 percent lattice mismatch between Ni(111) and the water, so we scale the water in the plane to match the cell of the slab. The argument scale_atoms=True indicates that the atomic positions should be scaled with the unit cell. The default is scale_atoms=False indicating that the cartesian coordinates remain the same when the cell is changed
W.set_cell(slab.cell, scale_atoms=True)
zmin = W.positions[:, 2].min()
zmax = slab.positions[:, 2].max()
W.positions += (0, 0, zmax - zmin + 1.5)
interface = slab + W
interface.center(vacuum=6, axis=2)
interface.write('NiH2O.traj')
view(interface)

在这里插入图片描述

CIF和XYZ,POSCAR的转换

ASE的这个功能已经被Pymatgen整合了,两者用起来都很方便。
拿出你的一个cif文件,我这个从MP里直接下载了个钙钛矿。

f = open('TiPbO3.cif', 'r')
print(f.read())
# generated using pymatgen
data_TiPbO3
_symmetry_space_group_name_H-M   'P 1'
_cell_length_a   3.86121500
_cell_length_b   3.86121500
_cell_length_c   4.62706100
_cell_angle_alpha   90.00000000
_cell_angle_beta   90.00000000
_cell_angle_gamma   90.00000000
_symmetry_Int_Tables_number   1
_chemical_formula_structural   TiPbO3
_chemical_formula_sum   'Ti1 Pb1 O3'
_cell_volume   68.98476581
_cell_formula_units_Z   1
loop__symmetry_equiv_pos_site_id_symmetry_equiv_pos_as_xyz1  'x, y, z'
loop__atom_site_type_symbol_atom_site_label_atom_site_symmetry_multiplicity_atom_site_fract_x_atom_site_fract_y_atom_site_fract_z_atom_site_occupancyTi  Ti0  1  0.50000000  0.50000000  0.52092300  1Pb  Pb1  1  0.00000000  0.00000000  0.96921200  1O  O2  1  0.50000000  0.50000000  0.14244900  1O  O3  1  0.00000000  0.50000000  0.62665800  1O  O4  1  0.50000000  0.00000000  0.62665800  1
import warnings
warnings.filterwarnings("ignore")
!ase gui TiPbO3.cif -o POSCAR  ##这个参数 -o表示out 即输出为什么
f = open('POSCAR', 'r')
print(f.read())
Ti Pb  O 1.00000000000000003.8612150000000001    0.0000000000000000    0.00000000000000000.0000000000000000    3.8612150000000001    0.00000000000000000.0000000000000000    0.0000000000000000    4.62706100000000031   1   3
Cartesian1.9306075000000000  1.9306075000000000  2.41034249730300010.0000000000000000  0.0000000000000000  4.48460304593200031.9306075000000000  1.9306075000000000  0.65912021238900000.0000000000000000  1.9306075000000000  2.89958479213800051.9306075000000000  0.0000000000000000  2.8995847921380005

发现这个POSCAR和我要的版本不一样,我的vasp是5.4.4,后来发现大师兄的一个博客提到了这个东西是需要去修改ASE的源代码的,大师兄的博客连接https://www.bigbrosci.com/2020/08/31/A17/
1) 找到ASE的安装目录,打开 ase/io 目录下的vasp5.py 文件;

2) 将vasp.py中vasp5 = False 全部改为vasp5 = True;

3) 保存vasp.py 即可。

大师兄牛皮,解决问题。

总结

结合前面这堆操作,做吸附储氢,电池什么的伙伴们可以通过ASE来搭建输入的POSCAR文件了,下一篇主要来讨论下怎么使用ASE来扩胞和搭建自己需要的掺杂体系的POSCAR吧。

这篇关于ASE使用笔记(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/752947

相关文章

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经