修改 CALYPSO 提取能量值的方式

CALYPSO 是基于粒子群优化算法的晶体结构预测程序,只根据材料的化学配比和给定的外界条件就可以寻找体系的基态及亚稳态结构。CALYPSO 在进行结构演化时需要调用其它结构弛豫软件,如 VASP 等。然而,在使用 VASP 对产生的结构进行弛豫时,必须指定 PSTRESS 参数(即使预测的不是高压相结构),这个参数对收敛性有一定的影响。另外,结构优化完毕后,CALYPSO 提取的是焓值,而不是能量值。CALYPSO 6.0 没有提供修改提取方式的参数,因此,如果想要在结构优化时不使用 PSTRESS 参数并提取能量值(而不是焓值)的话,需要自己手动修改源文件。

本文提供了一种方法,通过修改 calypso.x 自动生成的 getenth.py 文件来屏蔽应力校验,并直接提取结构优化后的能量值。此方法仅供学习使用。

修改方法

  1. CALYPSO 的主程序 calypso.x 在开始运行时会自动生成一些 Python 脚本文件,其中 getenth.py 文件的主要功能是从 OUTCAR 中提取焓值。用文本编辑器(如 vi、Visual Studio Code 等)打开 getenth.py 文件。
  2. 第 106 行的 enthalpy 函数是提取焓值的入口,运行时首先调用 pressure 函数校验外加应力,随后调用 outEnergy 函数提取焓值。原始的 enthalpy 函数如下所示。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def enthalpy(caldir):
    try:
    if pressure(caldir):
    e = outEnergy(caldir)
    else:
    e = 610612509
    except:
    e = 610612509
    # h = hardness()
    return e
  3. 改写第 106 行的 enthalpy 函数,删除应力校验。修改后的 enthalpy 函数如下所示。
    1
    2
    3
    4
    5
    6
    7
    def enthalpy(caldir):
    try:
    e = outEnergy(caldir)
    except:
    e = 610612509
    # h = hardness()
    return e
  4. 此时 getenth.py 会跳过应力校验,直接提取焓值。若想从 OUTCAR 中提取能量值而不是焓值,则需要进一步修改 outEnergy 函数。第 74 行的 outEnergy 函数提供了提取焓值的具体方法,脚本会从“enthalpy is TOTEN =”一行读取焓值。原始的 outEnergy 函数如下所示。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    def outEnergy(caldir):
    f = open(caldir + '/CONTCAR')
    for i in range(0, 6):
    line = f.readline()
    try:
    natom = sum(map(int, line.split()))
    except:
    line = f.readline()
    natom = sum(map(int, line.split()))
    f.close()
    osawk = '''awk '/enthalpy is TOTEN =/ {print $5}' ''' + caldir + '''/OUTCAR | tail -1'''
    b = os.popen(osawk).read()
    a = b[0:-1]
    try:
    e = float(a) / natom
    except:
    e = 610612509
    return e
  5. 改写第 74 行的 outEnergy 函数,从而让脚本从“energy without entropy=”一行读取能量值。修改后的 outEnergy 函数如下所示。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    def outEnergy(caldir):
    f = open(caldir + "/CONTCAR")
    for i in range(0, 6):
    line = f.readline()
    try:
    natom = sum(map(int, line.split()))
    except:
    line = f.readline()
    natom = sum(map(int, line.split()))
    f.close()
    osawk = '''awk '/energy without entropy=/ {print $4}' ''' + caldir + "/OUTCAR | tail -1"
    b = os.popen(osawk).read()
    a = b[0:-1]
    try:
    e = float(a)
    except:
    e = 610612509

    return e
  6. 修改完毕。结构弛豫完成后,CALYPSO 会调用修改后的 getenth.py 脚本直接提取能量值。
文章作者: 喵函数
文章链接: https://eigenmiao.site/2020/06/23/calypso-01/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 本征喵的小站