如何解决pymatgen调用DiffusionAnalyzer.from_dict报KeyError: 'displacements'问题
错误原因
KeyError: 'displacements'触发的核心原因是你读取的mp-1138_LiF.json文件缺少DiffusionAnalyzer.from_dict方法必须读取的displacements字段,常见触发场景有两种:
- 该json文件不是通过
DiffusionAnalyzer实例自带的to_dict()方法导出的标准序列化文件,仅保存了部分属性 - 导出json时使用的pymatgen版本与你当前运行环境的pymatgen版本不兼容,不同版本的
DiffusionAnalyzer序列化结构存在差异
解决方案
版本适配方案
如果你是从第三方获取的该json文件,先确认导出该文件对应的pymatgen版本,将本地环境的pymatgen回退到对应版本即可。你可以通过pip show pymatgen查看当前安装版本,再通过pip install pymatgen==对应版本号完成版本切换。重新生成DiffusionAnalyzer实例
如果无法匹配版本,直接从原始AIMD轨迹数据重新生成实例即可,示例代码如下:
from pymatgen.io.vasp import Vasprun from pymatgen.analysis.diffusion.analyzer import DiffusionAnalyzer from pymatgen.analysis.diffusion.aimd.van_hove import VanHoveAnalysis %matplotlib inline # 读取你的AIMD轨迹文件,按你的实际文件路径替换 vasprun = Vasprun("你的AIMD计算输出vasprun.xml路径") traj = vasprun.get_trajectory() # 按你实际的模拟参数填写对应值 diff_analyzer = DiffusionAnalyzer.from_trajectory( trajectory=traj, specie="Li", # 扩散物种 temperature=1000, # 模拟温度,单位K time_step=2, # 模拟步长,单位fs step_skip=50 # 跳过的初始平衡步数,避免未平衡数据干扰结果 ) # 后续范霍夫分析逻辑不变 vhfunc = VanHoveAnalysis( diffusion_analyzer=diff_analyzer, avg_nsteps=5, ngrid=101, rmax=10.0, step_skip=5, sigma=0.1, species = ["Li", "F"] ) vhfunc.get_3d_plot(mode="self") vhfunc.get_3d_plot(mode="distinct")
- 临时排查方案
你可以先运行print(data.keys())查看现有json文件包含的所有字段,确认是否存在其他版本的位移数据存储键名,或确认导出时是否仅保存了单物种的位移数据,再对应调整参数适配。
内容的提问来源于stack exchange,提问作者babak ab
相关产品推荐
相关产品推荐

