大家好,我是飞鸟。
首先,超级感谢大家对上一篇 VESTA 教程的喜爱!
【科研绘图】VESTA中如何优雅地只显示特定原子周围的电荷密度?
看到后台暴增的关注和留言,我深切感受到了大家平时被“科研体力活”支配的恐惧。
上一篇我们解决了“空间可视化”的痛点,今天这篇,飞鸟带你玩点“硬核”的,解决大家做 DFT 计算时最头疼的数据提取问题。
做 VASP 计算的小伙伴肯定懂这种痛:
想象一下,你最近在跑一个复杂体系的表面吸附模型(比如我最近常跟 MOF 衍生碳电极、或者高熵体系打交道)。光是测试不同吸附位点、或者做截断能(ENCUT)和 K 点的收敛测试,随便一跑就是几十上百个文件夹。
你的常规操作是不是这样的:
test_1 文件夹。OUTCAR 或者 OSZICAR。grep "free energy"。Ctrl+C。Ctrl+V。眼睛看花了不说,只要中间手一抖抄错一个符号,后面的能量差值全错,心态直接原地爆炸💥。
拒绝机械劳动! 今天,我们用几行 Python 代码,让工具替我们把这一天的活儿在 3 秒钟内干完!
其实,提取数据无非就是“遍历文件夹 -> 找文件 -> 匹配关键词 -> 提取数字”。这正是 Python 最擅长的事情。
只需要用到我们最熟悉的几个基础库:os(处理路径)、pandas(处理数据表格)、matplotlib(画图)。
下面是飞鸟为大家准备的“拿来主义”模板代码,直接复制就能用!
假设你的测试任务都放在了名为 ENCUT_300, ENCUT_350, ENCUT_400... 这样的文件夹里。我们在这些文件夹的上一级目录新建一个 Python 脚本运行:
import osimport pandas as pdimport matplotlib.pyplot as plt# 1. 初始化列表,用来存我们要的数据data_list = []# 2. 遍历当前目录下的所有文件夹for folder in os.listdir('.'):if os.path.isdir(folder) and folder.startswith('ENCUT'): # 识别特定文件夹# 提取文件名中的变量(比如把 ENCUT_400 里的 400 提取出来作为 X 轴) encut_value = int(folder.split('_')[1]) outcar_path = os.path.join(folder, 'OUTCAR')# 3. 检查 OUTCAR 是否存在if os.path.exists(outcar_path):with open(outcar_path, 'r') as file: lines = file.readlines()# 从后往前找,提取最后一步的收敛能量for line in reversed(lines):if'free energy TOTEN'in line:# 提取这一行的能量数值 energy = float(line.split('=')[-1].strip().split()[0])# 将结果存入列表 data_list.append({'ENCUT': encut_value, 'Energy(eV)': energy})break# 找到就跳出循环# 4. 用 Pandas 转换成漂亮的数据表格,并按 ENCUT 排序df = pd.DataFrame(data_list)df = df.sort_values(by='ENCUT').reset_index(drop=True)# 打印出来看看结果print("提取的数据如下:")print(df)# 5. 用 Matplotlib 直接生成趋势图plt.figure(figsize=(8, 5))plt.plot(df['ENCUT'], df['Energy(eV)'], marker='o', linestyle='-', color='#1f77b4', linewidth=2)plt.title('Energy Convergence Test', fontsize=14, fontweight='bold')plt.xlabel('ENCUT (eV)', fontsize=12)plt.ylabel('Total Energy (eV)', fontsize=12)plt.grid(True, linestyle='--', alpha=0.6)plt.tight_layout()# 保存并显示图片plt.savefig('convergence_plot.png', dpi=300)plt.show()print("搞定!图片已保存为 convergence_plot.png")运行这段代码后,你会立刻得到两样东西:
第一样: 终端里直接打印出排列得整整齐齐的表格,你可以一键复制进论文的数据支撑文件里。第二样: 当前目录下自动生成了一张漂亮、带数据点和网格线的趋势图,直接就能拿去给导师汇报!
free energy TOTEN 换成你需要的关键词(比如力、磁矩、或者特定原子的坐标),代码依然完美运行。pandas 这个库非常强大,提取出来后,你可以直接在代码里让它计算相邻两项的能量差(df['dE'] = df['Energy(eV)'].diff()),连打开计算器的步骤都省了。把生命浪费在有价值的思考上,而不是无意义的 Ctrl+C/V 上。这才是我们掌握工具的意义!
今天的代码你看懂了吗?赶紧去你的服务器或者本地环境里跑跑看吧!如果遇到报错,或者有想提取却不知道怎么写正则匹配的复杂数据,欢迎在评论区留言交流👇
你想在下一篇推文中看到关于机器学习(ML)是如何辅助材料筛选的吗?(比如如何绕过海量的 DFT 计算直接预测结果?)如果要看的话,请在后台回复“想看”,我来为你准备干货!
点击阅读原文:加入讨论qq群|关注主页github有可直接下载开源脚本文件