|
|
本帖最后由 卡开发发 于 2022-2-20 05:39 编辑
作者处理fix那个数组用的是list,然后在索引fix的时候用的是fix[i,sigma],但实际上list不允许这样索引(我用的是python3.7)。原作者之所以使用list的原因是因为在89行使用了list的append,解决办法也比较简单,在91行(也就是pos_a = np.array(tmp)的下一行)加入fix=np.array(fix)即可。
需要提醒的是,你的两个结构晶胞朝向不一样,这种情况很可能做不对,我测试了一下能运行起来,但结果肯定是不对的。
事实上从讨论角度来说,python的ase已经提供了idpp的插值方法,且提供了更多选项和可能,我根据官网的例子写了如下程序,但是选项和用户交互没有做完善,有人感兴趣可以稍作修改,例如增加argparse的输入等。做法不是唯一的,我仅仅提供一个套路思路。
idpp.py:- from ase import io
- from ase import build
- from ase.neb import NEB
- from ase.visualize import view
- import os
- #读取数据
- ##初始参数,此处只列出三个最基本的。
- ##对NEB.interpolate的参数可以再进行添加。
- ##nimages建议不要大于9,无法确定VTST怎样处理10以上的images。
- nimages=5
- POSCAR_ini='POSCAR_ini'
- POSCAR_fin='POSCAR_fin'
- #数据处理
- ##通过ase.io读取始末的POSCAR。
- initial=io.read(POSCAR_ini,format='vasp')
- final=io.read(POSCAR_fin,format='vasp')
- ##初始化image,其中放nimages个结构。
- images=[initial]
- ##将初始结构拷贝nimage-2次作为初始化,减2是因为两个端点单独设置。
- images+=[initial.copy() for i in range(nimages-2)]
- images+=[final]
- ##将多帧images转换为NEB对象。
- neb=NEB(images)
- ##对NEB对象中的images进行插值,方法使用idpp,其他参数可以按照
- ##https://wiki.fysik.dtu.dk/ase/ase/neb.html
- ##自行添加,请仔细阅读手册。
- ##最终NEB中的image将被更新。
- ##默认是迭代输出写入idpp.log以及轨迹写入idpp.traj。
- neb.interpolate()
- neb.idpp_interpolate()
- #输出结果
- ##按编号建立文件夹,没文件夹的建文件夹,有文件夹的跳过。
- [os.mkdir('%02d'%i) for i in range(len(images)) if not os.path.exists('%02d'%i)]
- ##到对应目录去写入POSCAR文件
- [io.write('%02d/POSCAR'%i,images[i]) for i in range(len(images))]
复制代码
|
|