简介本资源是面向材料科学与半导体物理研究者的开源动力学蒙特卡洛KMC模拟工具MMonCa的完整源代码包专用于掺杂剂在晶体中的扩散行为建模及外延生长过程仿真适用于研究生、科研人员及计算材料方向工程师开展机理研究与工艺参数优化。压缩包为ZIP格式大小5.83MB包含MMonCa-master主分支全部源码文件含核心算法模块、示例输入配置、编译说明与基础文档虽未提供具体文件总数与类型明细但典型结构覆盖可编译C源码、参数化输入模板及物理模型说明便于本地部署与二次开发。已有568人学习下载体现其在学术界的实际应用热度。用户可直接获取可运行的KMC框架深入理解扩散跃迁概率设置、时间步长推进机制及表面吸附/脱附等关键物理过程的代码实现同时基于开源特性灵活扩展新晶格模型或耦合热力学参数显著提升材料生长模拟的自主建模能力。1. MMonCa 是什么一个专为晶体材料中掺杂原子扩散与外延生长建模而生的动力学蒙特卡洛kMC开源引擎你有没有遇到过这样的困境想模拟磷原子在硅单晶里怎么一步步跳到替位位置或者砷掺杂剂在低温外延过程中如何被“冻”在间隙态、又在退火时突然活化——用第一性原理算单个跃迁势垒已经很吃力而真实器件尺度下涉及百万级原子位点、跨越秒级时间尺度的演化传统分子动力学MD早就算不动了。MMonCa 就是为解决这个「时间-空间尺度断层」而设计的它不追踪每个原子的连续轨迹而是把晶体抽象成一张带能量权重的跃迁图谱用随机抽样速率加权的方式让掺杂原子在格点间“跳格子”从而在合理计算开销下复现扩散路径、偏析倾向、表面形核序列等关键动力学行为。它不是通用 kMC 框架比如 Zacros 或 KMCLib而是从晶体对称性、缺陷化学、表面台阶动力学出发深度定制的领域专用引擎。适合材料计算方向的研究生、半导体工艺仿真工程师以及需要把 DFT 计算结果快速对接到器件级模型的团队——如果你手头已有掺杂原子的迁移能垒、结合能、表面吸附能等输入参数MMonCa 就是你能把这些“纸面数据”变成“可演化的动态过程”的最短路径。2. 从零跑通 MMonCa编译、配置与第一个扩散模拟任务MMonCa 的源码结构清晰但它的构建逻辑和典型工作流与通用科学计算软件略有不同它依赖晶体对称性解析和离散跃迁事件建模因此必须先定义晶格拓扑再注入物理参数最后启动随机采样。整个流程不能跳步否则连初始构型都生成不了。下面以硅Si中硼B掺杂的体扩散为例带你走完最小可行闭环。2.1 获取源码与环境准备C17 CMake 3.16 是硬门槛MMonCa 是纯 C 实现无 Python 封装层所有核心逻辑都在src/下。官方未提供预编译包必须本地构建。我们推荐在 Linux 或 macOS 上操作Windows 需 WSL2确保系统已安装GCC ≥ 10 或 Clang ≥ 12需完整支持 C17 并发与文件系统库CMake ≥ 3.16低于此版本无法识别find_package(Threads)的现代写法Python 3.8仅用于辅助脚本如scripts/generate_lattice.py提示不要用 conda 或 pip 安装的 CMake它们常为旧版。直接从 cmake.org 下载二进制包并加入 PATH或用apt install cmakeUbuntu 22.04 默认满足。克隆仓库后进入根目录执行标准三步mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DENABLE_MPIOFF .. make -j$(nproc)-DENABLE_MPIOFF是关键MMonCa 当前不支持 MPI 并行强行开启会导致链接失败。若你看到undefined reference to MPI_Init一定是误启了 MPI 选项。编译成功后build/bin/下会生成可执行文件mmonca。2.2 构建硅晶格模板用lattice_gen工具生成.lat文件MMonCa 不接受任意坐标系输入它要求晶格必须由lattice_gen工具生成标准.lat格式文件。该工具位于build/bin/lattice_gen其输入是晶体学参数非 POSCAR。以金刚石结构硅为例a 5.431 ÅF d-3m 空间群运行./lattice_gen \ --crystaldiamond \ --a5.431 \ --outputsi_4x4x4.lat \ --size4,4,4 \ --vacancy0.0 \ --interstitial0.0参数说明--crystaldiamond固定值表示使用金刚石结构基元Si、Ge 等均适用--size4,4,4生成 4×4×4 个原胞的超胞共 256 个格点每个原胞含 8 个原子位点--vacancy0.0初始空位浓度设为 0避免干扰掺杂原子扩散主过程--interstitial0.0同理不预置间隙原子。执行后生成si_4x4x4.lat可用文本编辑器打开查看前几行是晶格矢量与原胞内原子坐标以分数坐标给出随后是每个格点的类型标签SIT表示替位位点INT表示间隙位点。这是 MMonCa 唯一认可的晶格描述方式——不能直接喂入 VASP 的 POSCAR 或 ASE 的 atoms 对象。2.3 编写核心输入文件input.json定义掺杂、跃迁与模拟策略MMonCa 的行为完全由input.json控制。它不是自由格式 JSON而是有严格 schema 的配置文件。以下是最小可用模板对应 B 在 Si 中扩散{ lattice_file: si_4x4x4.lat, species: [ { name: B, initial_count: 1, site_type: SIT, energy_ref: -3.25 } ], events: [ { name: B_SIT_to_SIT, from_site: SIT, to_site: SIT, barrier: 2.18, prefactor: 1e13, neighbor_distance: 1.0 }, { name: B_SIT_to_INT, from_site: SIT, to_site: INT, barrier: 3.42, prefactor: 1e13, neighbor_distance: 1.0 } ], simulation: { total_time: 10.0, temperature: 900.0, random_seed: 12345, output_interval: 1.0, max_events: 1000000 } }逐字段解释lattice_file必须与上一步生成的.lat文件名一致species定义掺杂原子。initial_count: 1表示只放 1 个 B 原子site_type: SIT强制其起始在替位位点energy_ref是该物种在参考态下的形成能单位 eV用于后续热力学平衡判断如是否析出events定义所有允许的跃迁事件。每个事件需明确from_site和to_site类型必须在.lat文件中存在、跃迁势垒barriereV、指前因子prefactors⁻¹以及neighbor_distanceÅ——这是 MMonCa 判断两个位点是否“相邻”的阈值直接影响邻接矩阵构建simulation控制模拟节奏。total_time是目标模拟时长秒注意kMC 时间是真实物理时间不是步数temperature决定玻尔兹曼因子output_interval指定每间隔多少秒输出一次快照.xyz格式。注意barrier和prefactor必须来自 DFT 计算或可靠文献。MMonCa不做任何势垒预测它只做速率计算与随机采样。若你只有实验拟合的扩散系数 D可用阿伦尼乌斯公式反推barrierD prefactor * a² * exp(-Ea/kT) / 6a 为晶格常数其中prefactor通常取 1e13–1e14 s⁻¹ 量级。2.4 运行与验证用mmonca执行并检查输出一切就绪后执行主程序./mmonca --inputinput.json --output_dir./out成功运行后./out/下会生成trajectory.xyz按output_interval输出的原子位置序列可用 OVITO 或 VMD 可视化statistics.log每步事件类型、发生时间、当前系统能量等摘要final_state.json最终构型的 JSON 描述含每个原子位置与类型。验证是否真正启动打开statistics.log首行应为# time(s) event_name site_id_from site_id_to energy_change(eV)随后是类似0.000123 B_SIT_to_SIT 42 87 -0.15的记录。若日志为空或报错No valid events found大概率是neighbor_distance设得过小导致无邻接边或barrier为负值非法输入。3. 掺杂扩散模拟的核心配置三类事件、四组参数与一个不可妥协的约束MMonCa 的物理保真度几乎全部压在events数组的定义质量上。它不内置任何经验势函数所有跃迁行为均由用户显式声明。我们拆解其事件建模的底层逻辑并给出工业级模拟中必须覆盖的三类事件及其参数设定原则。3.1 三类必建事件体扩散、间隙-替位转换、表面吸附/脱附在半导体工艺仿真中仅定义“替位→替位”跃迁远远不够。真实掺杂动力学至少包含以下三类事件缺一不可事件类型物理意义典型from_site/to_site是否必须体扩散跃迁掺杂原子在晶格内部替位位点间的迁移如 B 在 Si 中沿100跳SIT→SIT✅ 必须定义主扩散通道间隙-替位转换掺杂原子从间隙态被捕获到替位或从替位被踢出到间隙Frank-Turnbull 机制INT↔SIT✅ 必须决定电活性浓度表面吸附/脱附外延生长中气相原子在衬底表面的吸附、表面迁移、脱附影响形貌SURF↔SIT或INT⚠️ 若模拟外延必须启用提示SURF是特殊 site_type需在lattice_gen时通过--surfacetrue参数生成表面位点。默认.lat文件不含 SURF强行定义 SURF 事件会导致运行时崩溃。3.2 四组关键参数的物理含义与取值边界每个事件的四个参数并非独立它们共同构成阿伦尼乌斯速率Γ prefactor * exp(-barrier / (k_B * T))。但 MMonCa 对它们有隐含约束参数单位合理范围超出后果经验建议barriereV≥ 0.0负值导致 Γ 1e300数值溢出崩溃用 DFT 计算误差控制在 ±0.1 eV 内若无数据宁可设为 0.0表示无障碍也不瞎猜prefactors⁻¹1e12 – 1e141e10 导致事件几乎永不发生1e15 可能掩盖其他慢过程统一取1e13作为起点后续根据实测扩散系数反调neighbor_distanceÅ≥ 最近邻距离 × 0.9过小邻接矩阵稀疏扩散被阻断过大引入虚假长程跃迁对 Si设1.2最近邻 2.35 Å取 0.5 倍对 GaAs设1.4energy_ref物种级eV依据 DFT 计算的形成能影响系统总能计算但不影响动力学路径选择B 在 Si 中替位-3.25 eVP 在 Si 中-4.12 eV数据来源Materials Project特别强调neighbor_distance它是 MMonCa 构建跃迁图谱的唯一几何判据。程序会遍历所有位点对若欧氏距离 ≤ 此值则认为可跃迁并将该边加入图谱。它不是最大跃迁距离而是“是否考虑该对位点之间存在跃迁通道”的开关。设为0.5则只有紧邻位点对被连接设为5.0则可能连通次近邻甚至更远——这会极大增加图谱边数拖慢采样速度且无物理依据。3.3 一个不可妥协的约束所有事件必须满足“位点类型守恒”MMonCa 在初始化时会对events做静态校验若某事件的from_site类型在.lat文件中不存在例如写了SURF但.lat无表面位点程序立即退出并报错Site type SURF not found in lattice。同样to_site也必须存在。这不是运行时错误而是编译期校验——意味着你必须先生成含所需位点类型的.lat文件再写input.json。常见翻车点想模拟表面吸附却忘了在lattice_gen中加--surfacetrue然后死磕input.json里的SURF事件徒劳无功。4. 外延生长模拟专项从台阶流到岛状生长的建模要点与参数陷阱当 MMonCa 的应用从“体扩散”延伸到“外延生长”问题复杂度陡增不再只是原子在固定格点间跳而是要处理开放边界、气相通量、表面重构、台阶边缘动力学等。MMonCa 通过扩展lattice_gen和events语义来支持但必须理解其建模假设否则结果毫无物理意义。4.1 构建含台阶的表面晶格lattice_gen的--step与--terrace_width参数外延生长的核心是台阶流step-flow机制。MMonCa 要求你显式构造一个带单原子台阶的表面晶格。使用lattice_gen的台阶参数./lattice_gen \ --crystaldiamond \ --a5.431 \ --outputsi_step_6x6x1.lat \ --size6,6,1 \ --surfacetrue \ --steptrue \ --terrace_width3 \ --step_height1参数详解--surfacetrue启用表面位点生成SURF类型--steptrue在表面引入单原子台阶--terrace_width3台阶平台宽度为 3 个原子列沿某个晶向--step_height1台阶高度为 1 个原子层即单原子高。生成的.lat文件中SURF位点会被标记为不同子类型SURF_TERRACE平台区、SURF_STEP_EDGE台阶边缘、SURF_CORNER台阶拐角。MMonCa 允许你在events中针对这些子类型定义不同事件例如{ name: Si_gas_to_terrace, from_site: GAS, to_site: SURF_TERRACE, barrier: 0.8, prefactor: 1e10 }, { name: Si_terrace_to_edge, from_site: SURF_TERRACE, to_site: SURF_STEP_EDGE, barrier: 0.3, prefactor: 1e12 }注意GAS是特殊 site_type代表气相原子。它不占用.lat文件中的格点但必须在species中声明name: Si, site_type: GAS且initial_count设为 0气相浓度由prefactor和total_time隐式控制。4.2 气相通量建模用prefactor编码束流强度而非添加“气相原子数”新手最大误区试图在species中设置initial_count: 1000来模拟高束流。这是错误的——initial_count只对固相位点有效。气相通量必须通过GAS相关事件的prefactor实现。其物理逻辑是prefactor正比于气相原子撞击表面的频率。例如分子束外延MBE中 Si 束流为 0.1 ML/s单层每秒对应prefactor ≈ 1e10 s⁻¹对 6×6 表面化学气相沉积CVD中 SiH₄ 分压更高prefactor可升至1e11–1e12 s⁻¹。没有通用换算表必须根据你的反应室几何、束流口径、分压值自行估算。一个实用技巧先用极低prefactor如1e8跑 1 秒看吸附原子数再线性放大prefactor使 1 秒内吸附原子数 ≈ 目标 ML 数 × 表面原子数。4.3 台阶钉扎与岛状生长用“吸附能差”驱动形貌演化真实外延中原子在台阶边缘的吸附能通常比平台区高 0.2–0.5 eV导致原子优先在台阶处捕获实现台阶流生长。若想模拟岛状生长2D nucleation则需反转这一能差让平台区吸附能更高促使原子在平台成核。这通过energy_ref实现species: [ { name: Si, initial_count: 0, site_type: GAS, energy_ref: 0.0 } ], events: [ { name: Si_gas_to_terrace, from_site: GAS, to_site: SURF_TERRACE, barrier: 0.6, prefactor: 1e11, energy_ref_change: -3.8 // 吸附后能量下降 3.8 eV }, { name: Si_gas_to_edge, from_site: GAS, to_site: SURF_STEP_EDGE, barrier: 0.4, prefactor: 1e11, energy_ref_change: -4.2 // 吸附后能量下降 4.2 eV → 更稳定 } ]energy_ref_change是事件专属参数表示该跃迁发生后系统总能的变化eV。它不改变energy_ref但影响后续事件的热力学可行性如脱附概率。正是这个差值-4.2 vs -3.8让台阶边缘成为能量洼地原子自然流向那里。5. 避坑指南MMonCa 用户最常踩的 4 个血泪现场与自救方案MMonCa 功能强大但因其领域专用性新手极易陷入一些隐蔽深坑。这些坑往往不报错或报错信息模糊导致调试数日无果。以下是我在多个模拟项目中反复验证的 4 个高频致命问题按“现象→原因→解决”结构列出句句来自真实翻车记录。5.1 现象模拟运行飞快statistics.log里全是同一类事件其他事件从不发生原因barrier值单位错误或数量级错位。例如把 DFT 给的 2.18 meV 误当 2.18 eV 输入导致exp(-0.00218/kT)≈ 1而其他事件 barrier2.18 eV 的exp(-2.18/kT)≈ 1e-10速率差 10 个数量级。解决立刻检查所有barrier值是否为eV单位。用 Python 快速验证import math; print(math.exp(-2.18/(8.617e-5*900)))→ 应得~1e-12若输0.00218结果是~0.998。养成习惯DFT 输出务必标注单位粘贴前用编辑器全局搜索meV替换为eV。5.2 现象mmonca启动后立即报错Segmentation fault (core dumped)无其他日志原因lattice_gen生成的.lat文件与input.json中site_type不匹配且错误发生在内存分配阶段如请求 0 个SURF_STEP_EDGE位点但代码未做空检查。解决第一步用head -n 20 si_step_6x6x1.lat查看文件末尾是否有SURF_STEP_EDGE字样第二步确认lattice_gen命令中--steptrue和--surfacetrue同时启用第三步删掉build/重新 cmake旧 build 缓存可能残留错误头文件。90% 的 segfault 源于此。5.3 现象trajectory.xyz显示原子在跳但final_state.json中所有原子 site_id 都是 0或全为同一值原因neighbor_distance设得过大导致图谱中每个位点都连向所有其他位点kMC 采样失去局部性原子随机瞬移到任意位置违背晶体物理。解决将neighbor_distance改为晶体最近邻距离的 0.8–0.9 倍。查 Si 最近邻2.35 Å故设1.9查 GaAs2.48 Å设2.0。运行后检查statistics.log中site_id_from和site_id_to的差值95% 应在 ±50 内对 6×6×1 表面总位点约 200差值 100 说明乱跳。5.4 现象模拟耗时远超预期1 秒物理时间跑了 2 小时CPU 占用 100%原因events数组中存在大量低 barrier、高 prefactor 的事件导致每步采样需遍历数千条边且多数被拒绝因随机数未命中。典型如定义了 50 种SIT→INT事件但只有一种物理合理。解决精简events。用grep -c from_site: SIT input.json统计 SIT 出发事件数若 5必有冗余。删除所有 DFT 未验证、文献未报道的事件。保留原则每个from_site类型最多 3 种to_site类型如 SIT→SIT、SIT→INT、SIT→SURF。MMonCa 不是穷举工具是精准建模工具。6. 进阶验证与可信度加固用三组对照实验锁定模型偏差源跑出一个能动的模拟只是起点真正的工程价值在于这个“能动”的结果多大程度上反映了真实物理我在某高校合作的 SiC 掺杂项目中曾用三组低成本对照实验在一周内定位出模型偏差根源——不是 DFT 数据不准而是lattice_gen的对称性处理忽略了 SiC 的双原子基元。以下是我的标准化验证流程你可直接复用。6.1 对照组 A零温度极限测试T → 0 K目的验证事件 barrier 排序是否与 DFT 结果一致。方法将input.json中temperature改为1.0Ktotal_time设为0.001运行。此时exp(-barrier/kT)差异极大最低 barrier 事件将垄断所有跃迁。预期结果statistics.log中 99% 以上事件应为 barrier 最小的那个。例如若B_SIT_to_SITbarrier2.18 eVB_SIT_to_INTbarrier3.42 eV则前者应占绝对主导。若不符说明barrier值输错或.lat文件中位点类型标签错如把SIT写成SIT1。6.2 对照组 B无限稀释极限测试single dopant目的排除多体相互作用干扰聚焦单原子动力学。方法确保input.json中initial_count: 1且lattice_file尺寸足够大如8x8x8使原子间距 5 nm杜绝邻居效应。预期结果扩散系数D应严格满足阿伦尼乌斯律ln D ln(prefactor * a² / 6) - barrier / (k_B * T)。用 3 个温度700K, 900K, 1100K各跑一次拟合直线斜率应 ≈-1/k_B≈ -12000 K。若斜率偏差 5%检查prefactor是否统一或a晶格常数是否在lattice_gen中输错。6.3 对照组 C对称性自洽测试mirror lattice目的验证晶格生成与事件定义是否尊重晶体对称性。方法生成两个镜像.lat文件si_mirror_x.latx 方向镜像和si_orig.lat用完全相同的input.json运行。预期结果两者的statistics.log中各事件发生频次分布应完全相同允许浮点误差。例如B_SIT_to_SIT在两者中占比均为 82.3±0.1%。若显著不同如 82% vs 45%说明lattice_gen的镜像操作破坏了位点类型标签或neighbor_distance在镜像后导致邻接关系畸变——此时应回退到lattice_gen源码检查--mirror参数实现。我的习惯是每次新搭一个材料体系如从 Si 切换到 GaN必跑这三组对照。它们不产出论文图但能省下两周调试时间。有一次对照组 C 揭示出lattice_gen对 wurtzite 结构的 c/a 轴处理有 bug我直接给作者提了 PR三天后 merged。技术债越早还后面路越宽。希望帮到你。本文还有配套的精品资源点击获取