SRIM通过python计算dap

我们开发了一个用于读取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计算结果以及快速绘图等操作。

相关推荐
是一个Bug2 小时前
Java基础50道经典面试题(四)
java·windows·python
Slow菜鸟2 小时前
Java基础架构设计(三)| 通用响应与异常处理(分布式应用通用方案)
java·开发语言
吴佳浩2 小时前
Python入门指南(七) - YOLO检测API进阶实战
人工智能·后端·python
消失的旧时光-19432 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
wadesir2 小时前
Rust中的条件变量详解(使用Condvar的wait方法实现线程同步)
开发语言·算法·rust
tap.AI2 小时前
RAG系列(二)数据准备与向量索引
开发语言·人工智能
阿蒙Amon3 小时前
C#每日面试题-重写和重载的区别
开发语言·c#
是一个Bug3 小时前
Java基础20道经典面试题(二)
java·开发语言
Z_Easen3 小时前
Spring 之元编程
java·开发语言