ABACUS 原子算筹

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4064|回复: 1

ABACUS ASE接口使用技巧(持更

[复制链接]

4

主题

4

帖子

446

积分

中级会员

Rank: 3Rank: 3

积分
446
发表于 2022-12-5 19:40:51 | 显示全部楼层 |阅读模式
本帖最后由 jiyy 于 2023-1-28 17:48 编辑

ASE 是一个用来构建模型、进行可视化以及后处理分析的Python工具包。 ABACUS 提供了相应的接口(https://gitlab.com/1041176461/ase-abacus),使 ASE 可以对 ABACUS 的输入输出进行分析,并调用 ABACUS 为Calculator进行计算。

本贴主要用于记录我用过的一些方法 (欢迎补充!!!)

1. 文件处理

之前 HongriTianqi 已经介绍了如何把cif文件转换为STRU文件 (详见:怎样把cif文件转换为STRU文件?)。我们也可以采用相同的方式读取ABACUS的running_*log文件,只需要修改format参数为"abacus-out"即可,例如:
  1. from ase.io import read
  2. atoms = read("running_scf.log", format='abacus-out')
复制代码
这个方法对于分析MD结果有比较大的帮助(详见:https://gitlab.com/1041176461/ase-abacus/-/issues/3),接口还支持读取MD续算后的running_md.log

2. 能带计算

(1)调用ABACUS calculator做SCF计算,输出电荷密度:

  1. from ase.calculators.abacus import Abacus, AbacusProfile
  2. from ase.build import bulk

  3. Si = bulk('Si')
  4. pp = {'Si':'Si_ONCV_PBE-1.0.upf'}
  5. pseudo_dir = r'/home/jiyy/potential/SG15/SG15_upf'
  6. basis_dir = r'/home/jiyy/GD_orb/dpsi-T-S'
  7. basis = {'Si':'dpsi_Si.dat'}
  8. kpts = {'size': [6, 6, 6], 'gamma': True}
  9. parameters = {
  10.    'xc': 'pbe',
  11.    'ecutwfc': 100,
  12.    'smearing_method': 'gaussian',
  13.    'smearing_sigma': 0.01,
  14.    'basis_type': 'lcao',
  15.    'ks_solver': 'genelpa',
  16.    'mixing_type': 'pulay',
  17.    'scf_thr': 1e-8,
  18.    'out_chg': 1,
  19.    'calculation': 'scf',
  20. }

  21. profile = AbacusProfile(argv=['mpirun', '-n', '8', 'abacus'])
  22. calc = Abacus(profile=profile, pp=pp, pseudo_dir=pseudo_dir, basis=basis, basis_dir=basis_dir, kpts=kpts, **parameters)
  23. Si.calc = calc
  24. Si.get_potential_energy()
复制代码
(2)获取SCF计算得到的Fermi能级,并生成高对称路径
  1. fermi_level = calc.get_fermi_level()  # 读取Fermi能级
  2. kpath = Si.cell.bandpath(npoints=100) # 生成高对称路径,总共100个k点
复制代码
(3)调用ABACUS calculator做NSCF
  1. parameters.update({'calculation': 'nscf', 'init_chg': 'file', 'out_chg': 0, 'out_band': 1})  # 更新参数做能带计算
复制代码
(4)画能带
  1. bs = BandStructure(path=kpath, energies=energies, reference=fermi_level) # 传入高对称路径,本征值,费米能
  2. bsp = bs.subtract_reference() # 减去费米能
  3. bsp.plot(emin=-6, emax=6, filename='band.png') # 画图
复制代码




3. 构建分子模型

ABACUS做分子计算需要人为构建真空层,接口提供了两种方法来构建真空层

(1)atoms.center(vacuum=None, axis=(0, 1, 2), about=None)

这个方法可以将atoms放置于Cell的中心位置,用户可以指定任意x, y, z方向上的真空层大小
  1. from ase.build import molecule
复制代码
由该方法得到的STRU如下:
  1. ATOMIC_SPECIES
  2. H   1.008         H_ONCV_PBE-1.0.upf

  3. NUMERICAL_ORBITAL
  4. dpsi_H.dat

  5. LATTICE_CONSTANT
  6. 1.8897261258369282

  7. LATTICE_VECTORS
  8. 30.000000000      0.0000000000      0.0000000000      
  9. 0.0000000000      30.000000000      0.0000000000      
  10. 0.0000000000      0.0000000000      30.737166000      

  11. ATOMIC_POSITIONS
  12. Direct

  13. H
  14. 0.0000000000
  15. 2
  16. 0.5000000000 0.5000000000 0.5119910000 1 1 1
  17. 0.5000000000 0.5000000000 0.4880090000 1 1 1
复制代码
(2)atoms.set_cell(cell, scale_atoms=False, apply_constraint=True)

这个方法相当于直接在STRU文件中修改LATTICE_VECTORS。
  1. import numpy as np
复制代码

得到的分子可能会处于Cell的边界,此时HR/SR矩阵会分配到不同的cells,而不是集中在(0, 0, 0) cell,但并不影响基于HR/SR矩阵得到的计算结果。

由该方法得到的STRU如下:
  1. ATOMIC_SPECIES
  2. H   1.008         H_ONCV_PBE-1.0.upf

  3. NUMERICAL_ORBITAL
  4. dpsi_H.dat

  5. LATTICE_CONSTANT
  6. 1.8897261258369282

  7. LATTICE_VECTORS
  8. 30.000000000      0.0000000000      0.0000000000      
  9. 0.0000000000      30.000000000      0.0000000000      
  10. 0.0000000000      0.0000000000      30.000000000      

  11. ATOMIC_POSITIONS
  12. Direct

  13. H
  14. 0.0000000000
  15. 2
  16. 0.5000000000 0.5000000000 0.5245720000 1 1 1
  17. 0.5000000000 0.5000000000 0.5000000000 1 1 1
复制代码

4. 基组的Delta测试
假设有C的SZ,DZP,TZDP,QZTP基组,用接口可以计算彼此之间的Delta值
  1. import json
  2. from pathlib import Path

  3. from ase.collections import dcdft
  4. from ase.calculators.abacus import Abacus, AbacusProfile
  5. from ase.io import Trajectory, read
  6. from ase.eos import EquationOfState as EOS
  7. from ase.units import kJ
  8. from ase.utils.deltacodesdft import delta

  9. # 计算七个能量点,并保存至traj文件
  10. def cal_EOS(symbol, parameters, labels):
  11.     for label, orb in labels.items():
  12.         traj = Trajectory(f'{symbol}-{label}.traj', 'w')
  13.         if label == 'PW':
  14.             parameters.update({
  15.                 'basis_type': 'pw',
  16.                 'ks_solver': 'cg',
  17.             })
  18.         else:
  19.             basis_dir = f"/home/jiyy/Orb/Gen/C/Orbital_C_{label}"
  20.             basis = {symbol: orb}
  21.             parameters.update({
  22.                 'basis_type': 'lcao',
  23.                 'ks_solver': 'genelpa',
  24.                 'basis': basis,
  25.                 'basis_dir': basis_dir
  26.             })
  27.         for s in range(94, 108, 2):
  28.             atoms = dcdft[symbol]
  29.             atoms.set_cell(atoms.cell * (s / 100)**(1 / 3), scale_atoms=True)
  30.             atoms.calc = Abacus(profile=profile, directory=f'{symbol}-{label}',
  31.                                 scaled=False, **parameters)
  32.             atoms.get_potential_energy()
  33.             traj.write(atoms)

  34. #读取traj文件,用Birch-Murnaghan公式拟合体积模量
  35. def fit(symbol, label):
  36.     V = []
  37.     E = []
  38.     for atoms in read(f'{symbol}-{label}.traj@:'):
  39.         V.append(atoms.get_volume() / len(atoms))
  40.         E.append(atoms.get_potential_energy() / len(atoms))
  41.     eos = EOS(V, E, 'birchmurnaghan')
  42.     eos.fit(warn=False)
  43.     e0, B, Bp, v0 = eos.eos_parameters
  44.     return e0, v0, B, Bp

  45. # 将基组结果和Wien2K数据保存到json文件
  46. def save_json(symbol):
  47.     data = {f'{symbol}': {}}
  48.     labels = []
  49.     for path in Path().glob('*.traj'):
  50.         filename = path.stem
  51.         symbol, label = filename.split('-')
  52.         labels.append(label)
  53.         e0, v0, B, Bp = fit(symbol, label)
  54.         sub_data = {f'{label}': {
  55.             'volume': v0,
  56.             'B': B * 1e24 / kJ,
  57.             'Bp': Bp
  58.         }}
  59.         data[symbol].update(sub_data)

  60.     data[symbol]['wien2k'] = {
  61.         'volume': dcdft.data[symbol]['wien2k_volume'],
  62.         'B': dcdft.data[symbol]['wien2k_B'],
  63.         'Bp': dcdft.data[symbol]['wien2k_Bp'],
  64.     }

  65.     with open(f'{symbol}.json', 'w') as fp:
  66.         json.dump(data, fp)


  67. def get_tuple(data, label):
  68.     return (data[label]['volume'], data[label]['B'], data[label]['Bp'])


  69. if __name__ == "__main__":
  70.     import sys
  71.     xc = sys.argv[1]
  72.     mpi = sys.argv[2]
  73.     omp = sys.argv[3]

  74.     profile = AbacusProfile(
  75.         argv=['mpirun', '-env', f'OMP_NUM_THREADS={omp}', '-n', f'{mpi}', '/home/jiyy/software/ABACUS/abacus-develop-2.3.5/bin/abacus'])

  76.     symbol = 'C'
  77.     pp = {"C": "C_ONCV_PBE-1.0.upf"}
  78.     pseudo_dir = "/home/jiyy/PP/SG15"
  79.     kpts = [8, 8, 8]
  80.     parameters = {
  81.         'xc': f'{xc}',
  82.         'ecutwfc': 100,
  83.         'smearing_method': 'gaussian',
  84.         'smearing_sigma': 0.01,
  85.         'mixing_type': 'pulay',
  86.         'scf_thr': 1e-8,
  87.         'out_chg': 1,
  88.         'kpts': kpts,
  89.         'pp': pp,
  90.         'pseudo_dir': pseudo_dir,
  91.     }
  92.     labels = {'PW': '',
  93.               'Z': 'C_gga_8au_100Ry_1s1p.orb',
  94.               'DZP': 'C_gga_8au_100Ry_2s2p1d.orb',
  95.               'TZDP': 'C_gga_8au_100Ry_3s3p2d.orb',
  96.               'QZTP': 'C_gga_8au_100Ry_4s4p3d.orb',
  97.               }
  98.     cal_EOS(symbol, parameters, labels)
  99.     save_json(symbol)

  100. # 计算彼此delta值
  101.     with open(f'{symbol}.json', 'r') as fp:
  102.         data = json.load(fp)[symbol]
  103.     pw = get_tuple(data, 'PW')
  104.     wien2k = get_tuple(data, 'wien2k')
  105.     z = get_tuple(data, 'Z')
  106.     dzp = get_tuple(data, 'DZP')
  107.     tzdp = get_tuple(data, 'TZDP')
  108.     qztp = get_tuple(data, 'QZTP')
  109.     delta_data = {
  110.         'pw-wien2k': delta(*pw, *wien2k),
  111.         'z-pw': delta(*z, *pw),
  112.         'dzp-pw': delta(*dzp, *pw),
  113.         'tzdp': delta(*tzdp, *pw),
  114.         'qztp': delta(*qztp, *pw)
  115.     }
  116.     with open(f'delta-{symbol}.json', 'w') as fp:
  117.         json.dump(delta_data, fp)
复制代码
delta-C.json:
  1. {"pw-wien2k": 0.3519292445820627, "z-pw": 6.826961630421406, "dzp-pw": 0.0590395574697385, "tzdp": 0.026290147268529143, "qztp": 0.04396233617693006}
复制代码






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

3

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2023-11-27 18:52:16 | 显示全部楼层
在AISI发现很多小伙伴不知道ASE是有GUI的(当然其实最开始我也不知道),所以借着这个板块说一下基于ASE-ABACUS接口进行ABACUS计算结构的可视化
ASE的GUI可以在命令行直接调用。当然也可以在代码写,对应模块为 ase.visualize.view()。
在Window的Anaconda Prompt(如果python环境由conda管理),mac, WSL2, Linux的终端上都可以借助ASE完成对ABACUS输入结构和输出结构的可视化。后两者由于对tkinker可视化库的支持缺失,可能需要安装一些依赖组件,如
  1. sudo apt-get install libreadline-dev
复制代码
比如,如下MgO结构是一个STRU文件:
  1. ATOMIC_SPECIES
  2. Mg 24.305 Mg_ONCV_PBE-1.0.upf
  3. O  15.999 O_ONCV_PBE-1.0.upf

  4. NUMERICAL_ORBITAL
  5. Mg_gga_8au_100Ry_4s2p1d.orb
  6. O_gga_8au_100Ry_2s2p1d.orb

  7. LATTICE_CONSTANT
  8. 1.8897259886    # 1.8897259886 Bohr = 1.0 Angstrom

  9. LATTICE_VECTORS
  10. 4.27957 0.00000 0.00000
  11. 0.00000 4.27957 0.00000
  12. 0.00000 0.00000 4.27957

  13. ATOMIC_POSITIONS
  14. Direct
  15. Mg
  16. 0.0
  17. 4
  18. 0.0 0.0 0.0 1 1 1
  19. 0.0 0.5 0.5 1 1 1
  20. 0.5 0.0 0.5 1 1 1
  21. 0.5 0.5 0.0 1 1 1

  22. O
  23. 0.0
  24. 4
  25. 0.5 0.0 0.0 1 1 1
  26. 0.5 0.5 0.5 1 1 1
  27. 0.0 0.0 0.5 1 1 1
  28. 0.0 0.5 0.0 1 1 1
复制代码
可以通过一行简单的命令可视化
  1. ase -T gui STRU
复制代码
我们就能直接看到可视化结果了


可以通过鼠标右键进行面外转动,通过shift+鼠标右键进行平移,鼠标左键选中原子,ctrl+鼠标左键可以选中多个原子,并随着选中的原子数目增多,逐步显示键长/键角/二面角。
可视化窗口还支持直接操作各种选项。

可视化一些更复杂的结构也完全没问题,比如ASE可视化一个三百原子的沸石分子筛体系


输入文件STRU可以可视化,输出文件running*.log当然也可以可视化。比如
  1. ase -T gui running_relax.log
复制代码



类似的方法也可以可视化ABACUS的MD轨迹,以及可视化ASE调用ABACUS进行NEB等计算的轨迹。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|ABACUS 原子算筹

GMT+8, 2024-11-21 16:49 , Processed in 0.017250 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表