我们开发了一个用于读取SRIM原始数据的Python类,该类可以完成数据的读取,数据存储,dpa计算,以及快速图形绘制。
声明:该代码虽然作者已经通过网络数据等验证,但作者不对其正确性做任何保证,使用前请务必测试并检查代码。
在使用该代码之前,请配置相关的python环境。建议将该模块保存为.py文件,测试并检查后通过在使用jupyter notebook调用。
python
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib
import re
class Damage:
def __init__(self, file_path, phi, atom_dens):
"""
参数
----
file_path : SRIM VACANCY.txt 文件路径
phi : 注量 (ions/cm^2)
atom_dens : 材料原子密度 (atoms/cm^3)
"""
self.file_path = file_path
self.phi = phi
self.atom_dens = atom_dens
self._set_fonts()
# ---------------- 字体配置 ----------------
@staticmethod
def _set_fonts():
matplotlib.rcParams['font.sans-serif'] = [
'PingFang SC', # macOS 默认中文字体,应排第一
'Arial Unicode MS',
'SimHei', # Windows 字体,保留备用
'Microsoft YaHei',
'Noto Sans CJK SC'
]
matplotlib.rcParams['axes.unicode_minus'] = False
def read_vacancy_file(self):
"""
从 SRIM VACANCY 文件中提取
深度、离子产生空位、反冲产生空位
并映射为固定中文列名:
深度_埃、离子空位、反冲空位
"""
headers = None
data = []
header_count = 0
with open(self.file_path, 'r') as f:
for line in f:
parts = line.strip().split()
# 第1行包含 "TARGET VACANCIES" 等文字,跳过
if header_count == 0 and "DEPTH" in line:
header_count = 1
continue
# 第2行是 SRIM 通用列名,例如 (Ang.) IONS RECOILS
if header_count == 1:
headers = parts
header_count = 2
continue
# 第3行是分隔线
if header_count == 2 and re.match(r'^[-]+', line.strip()):
header_count = 3
continue
# 数据区
if header_count == 3 and re.match(r'^[\d.Ee+-]', line.strip()):
data.append([float(x) for x in parts])
elif header_count == 3 and len(data) > 0: # 数据结束
break
df = pd.DataFrame(data, columns=headers)
# ===== 固定中文列名映射 =====
df.rename(columns={
df.columns[0]: '深度_埃',
df.columns[1]: '离子空位',
df.columns[2]: '反冲空位'
}, inplace=True)
return df
# ===============================
# 计算 DPA (Damage Per Atom)
# ===============================
def get_dpa(self):
df = self.read_vacancy_file()
depth = df['深度_埃'].to_numpy()
v1 = df['离子空位'].to_numpy()
v2 = df['反冲空位'].to_numpy()
# SRIM 单位:Vac / (Å · ion)
# DPA = Φ × (Vac / atom dens)
dpa = self.phi * (v1 + v2) * 1e8 / self.atom_dens
return {"depth": depth, "dpa": dpa}
# ===============================
# 绘制 DPA 深度分布
# ===============================
def plot_dpa(self):
data = self.get_dpa()
plt.figure(figsize=(6, 4))
plt.plot(data["depth"], data["dpa"])
plt.title("损伤分布深度曲线 DPA(depth)")
plt.xlabel("深度 (Å)")
plt.ylabel("损伤量 (DPA)")
plt.grid(True, alpha=0.4)
plt.tight_layout()
plt.show()
接下来就可以通过模块导入的方式进行调用了。
python
from damge import Damage
#%%
f = r"D:\SRIM_output\VACANCY.txt"
#%%
a = Damage(f,phi=2.5e13,atom_dens=9.241E22)
#%%
a.plot_dpa()
通过创建Damage类的实例,传入通亮phi和原子密度,以及VACANCY.txt文件的路径,就可以使用类中的方法获得df数据,dpa计算结果以及快速绘图等操作。