简介本资源为太阳能电池SCAPAS专业仿真软件安装包面向光伏领域科研人员、新能源方向研究生及电池工艺工程师用于开展太阳能电池结构建模、光电性能预测与制程工艺优化等核心研究。压缩包共12个文件含3个可执行程序setup.exe、niPie.exe、WindowsInstaller-KB893803-v2-x86.exe、2个动态链接库dll、2个安装组件cab、1个许可证文件license.rtf、1个配置文件setup.ini、1个ID验证文件nidist.id及1个XML定义文件DevPartDef.xml整体大小18.72MB结构完整开箱即用。已有1419人学习下载说明其在高校课题与企业预研中具备实际应用基础。用户可直接部署运行SCAPAS 3.3.10版本开展单晶硅/薄膜/第三代电池的多层材料参数设置、光照角度与温度响应仿真、I-V特性计算及工艺步骤如扩散、沉积模拟并通过内置图表功能完成效率、填充因子等关键指标分析显著降低实验试错成本。1. 太阳能电池 SCAPAS 仿真软件为什么它仍是光伏器件建模的“黑匣子级”工具你手头有一块刚流片出来的异质结HJT太阳能电池J-V 曲线在 0.45 V 附近出现异常拐点EL 图像显示边缘区域存在微弱暗斑——但标准 TCAD 工具跑完掺杂分布和载流子输运后根本复现不出这个现象。这时候有经验的光伏器件工程师不会立刻改网格或调泊松方程收敛参数而是会打开一个十多年没更新 UI 的 Windows 程序SCAPAS。它不画三维网格不渲染电势云图甚至没有“运行”按钮只靠一串文本输入卡input cards和几行 Fortran 风格的参数定义就能把背场钝化层界面态密度Dit、隧穿氧化层厚度Tox、金属接触功函数偏移ΔΦ这三个变量对开路电压Voc损耗的耦合效应拆解成可量化的 ΔVoc f(Dit, Tox, ΔΦ) 显式表达式。这不是“替代 TCAD”而是用准一维稳态求解器在器件物理层面做“归因诊断”。它适合正在做实验室级电池结构迭代、需要快速验证界面工程方案、且不愿被商业 TCAD 许可证和网格划分耗尽耐心的光伏研发者。如果你还在用 Excel 拟合 Shockley 方程反推 n 和 RsSCAPAS 就是你该亲手编译一次的“后悔药”。2. SCAPAS 是什么从 Fortran 黑箱到可复现的光伏器件建模基座SCAPASSolar Cell Analysis by PAttern Simulation不是商业软件而是一套由比利时某高校实验室维护的开源 Fortran 代码集合核心是scapas.f主程序与配套的matpar.dat材料参数库、layer.dat层结构定义和input.dat求解控制卡。它采用准一维、稳态、漂移-扩散主导的半导体器件模型不求解 Maxwell 方程不模拟光子传播但严格求解 Poisson 方程、电子/空穴连续性方程并内置了 SRH 复合、俄歇复合、带间隧穿、热发射等多种复合机制的解析实现。它的不可替代性在于所有物理模型都以显式 Fortran 函数形式暴露没有封装 DLL 或二进制黑盒。你可以直接修改recomb.f中第 137 行的俄歇复合系数 A 参数重新编译立刻看到 Voc 下降 8 mV——这种“改一行、看一果”的反馈闭环在动辄需数小时网格生成求解的全维度 TCAD 中根本不存在。2.1 为什么不用 Sentaurus 或 Silvaco三个硬约束讲清选型逻辑提示SCAPAS 不是“轻量版 TCAD”它是另一条技术路径用物理简化换计算透明度。选它本质是接受“牺牲几何自由度”来换取“参数可解释性”。几何维度强制为 1D所有层必须是平行平板堆叠如 Glass / ITO / a-Si:H(i) / c-Si(p) / Al不支持斜角、曲面、指状电极等真实结构。这意味着它无法模拟栅线遮光或边缘漏电但能精准告诉你当 c-Si/p-Si 界面 Dit 从 1e10 cm⁻²·eV⁻¹ 增加到 1e11 cm⁻²·eV⁻¹ 时J02 反向饱和电流密度如何变化——而这正是 HJT 电池 Voc 损耗的核心归因。光生载流子注入靠外部数据驱动SCAPAS 自身不计算光学吸收需用户提供每层的光生率 G(x) 分布通常由 PC1D 或 GenPro 光学模块导出 CSV。这看似麻烦实则是优势你能把 TCAD 光学模块算出的 G(x) 直接喂给 SCAPAS实现“光学-电学”解耦验证避免光学近似误差污染电学分析。求解器无自适应步长全靠人工调参没有“自动收敛”按钮。input.dat中的DELTA_V电压步长、MAXIT最大迭代次数、TOL收敛容差三者必须协同调整。例如模拟高掺杂背场BSF结构时若DELTA_V0.01会导致在 0.65 V 附近迭代发散此时需先设DELTA_V0.002跑过该区间再切回大步长——这种“手动导航”虽原始却强迫你理解 J-V 曲线每一处拐点的物理来源。2.2 本地编译 SCAPAS绕过 Windows 依赖用 gfortran 在 Linux/macOS 跑通最小闭环SCAPAS 官方分发包v3.2.1仅提供 Windows .exe 和 Visual Fortran 项目文件但其源码完全兼容 gfortran。我一般会跳过所有 IDE直接用 Makefile 控制编译链确保环境纯净# 创建工作目录并解压源码假设已下载 scapas_v321.zip unzip scapas_v321.zip -d scapas_src cd scapas_src # 编写 minimal Makefile关键禁用 OpenMP显式链接 math 库 cat Makefile EOF FC gfortran FFLAGS -O2 -fno-backtrace -ffixed-form -Wno-line-truncation OBJECTS scapas.o matpar.o layer.o recomb.o current.o solve.o scapas: $(OBJECTS) $(FC) $(FFLAGS) -o scapas $(OBJECTS) -lm %.o: %.f $(FC) $(FFLAGS) -c $ -o $ clean: rm -f *.o scapas .PHONY: clean EOF # 执行编译注意必须用 -ffixed-form 强制固定格式否则 F77 风格续行符 会报错 make # 验证是否生成可执行文件 ls -lh scapas # 输出应为-rwxr-xr-x 1 user user 452K ... scapas逻辑说明与参数说明-ffixed-form是生死线SCAPAS 源码使用 Fortran 77 固定格式第 1–5 列为标号第 6 列为续行符7–72 列为代码gfortran 默认按自由格式解析不加此 flag 会在recomb.f第 89 行含续行符直接报错Error: Unclassifiable statement。-Wno-line-truncation关闭行截断警告源码中大量C...注释行超 72 字符此警告无实际影响但会刷屏干扰。-lm显式链接数学库solve.o中调用dsolve双精度线性方程组求解需 libm 支持。若省略链接阶段报错undefined reference to dsolve_。编译成功后scapas可执行文件即具备完整功能。下一步是构造最小可运行案例。3. 用 SCAPAS 在本地跑通最小命令从空白 input.dat 到首条 J-V 曲线SCAPAS 的运行不依赖 GUI全部通过文本文件交互。一个最小可运行案例只需 3 个文件input.dat主控卡、matpar.dat材料参数、layer.dat层结构。我们以单晶硅 pn 结电池为例构建最简体系。3.1 构造input.dat五张控制卡定义求解行为input.dat是 SCAPAS 的“操作系统内核”共 5 类卡片CARD每类以CARDn开头顺序不可乱。以下是能跑出 J-V 曲线的最小配置删除所有注释行仅保留必要字段CARD1 1 1 1 1 1 1 1 1 CARD2 0.000 0.100 0.200 0.300 0.400 0.500 0.600 0.650 CARD3 1.0E-12 1.0E-12 1.0E-12 1.0E-12 1.0E-12 1.0E-12 1.0E-12 1.0E-12 CARD4 1 1 1 1 1 1 1 1 CARD5 1 1 1 1 1 1 1 1逐卡解析与参数说明CARD18 个整数依次为NPOINT空间网格点数、NSTEP电压扫描步数、NITER每步最大迭代数、METHOD求解方法1Newton-Raphson、RECOMB复合模型1SRH、OPTICAL光学模型1外部 G(x) 输入、CONTACT接触类型1欧姆、OUTPUT输出等级1基础 J-V。此处NPOINT1是关键——SCAPAS 允许将空间离散化为单点此时退化为理想二极管模型用于快速验证流程。CARD28 个浮点数定义电压扫描点单位 V。必须单调递增且覆盖 0→Voc 区间。此处设至 0.65 V足够单晶硅电池。CARD38 个浮点数对应CARD2各电压点下的光生电流密度 Jph单位 A/cm²。此处全设为 1e-12 A/cm² 是“占位符”实际需替换为真实 G(x) 积分值。CARD4和CARD5均为 8 个整数控制各电压点是否启用特定物理模型如陷阱辅助隧穿、俄歇复合。全 1 表示启用默认组合。注意SCAPAS 对文件格式极其敏感。CARD1必须顶格写数字间用空格而非 Tab每行末不能有多余空格小数点前必须有数字0.1合法.1报错。3.2 构造matpar.dat和layer.dat两文件定义器件物理骨架matpar.dat存储材料本征参数layer.dat定义堆叠顺序与厚度。最小案例只需硅一种材料、一层结构# matpar.dat —— 材料参数库仅定义 Si 1 1.120 1.0E10 1.0E10 1.0E-15 1.0E-15 1.0E-15 1.0E-15 1.0E-15 # 解析ID1, Eg1.12eV, ni1e10/cm³, εr11.7, μn1e2, μp1e2, τn1e-6, τp1e-6, Dn1e-1, Dp1e-1# layer.dat —— 层结构定义单层 Si 1 1 100000.0 1.0E16 1.0E16 0 0 # 解析LayerID1, Thickness100μm, Nd1e16/cm³ (n-type), Na1e16/cm³ (p-type), # InterfaceState0 (无界面态), ContactType0 (无金属接触)关键细节说明layer.dat中Thickness单位是Å埃非 nm 或 μm100 μm 100 × 10⁴ Å 1e6 Å但 SCAPAS 内部对厚度不敏感因是 1D 模型设100000.0即 10 μm即可满足数值稳定性。matpar.dat的ni本征载流子浓度必须与温度匹配。默认T300K时硅的 ni ≈ 1.0e10 cm⁻³若改温度需同步更新此值否则 J0 计算错误。layer.dat中InterfaceState0表示忽略所有界面复合这是最小案例的起点实际分析 HJT 时需设为1并在input.dat中启用RECOMB2Dit 模型。3.3 运行 SCAPAS 并解析输出output.dat里的黄金信息执行命令极其简单./scapas input.dat output.dat 21SCAPAS 无标准输入输出流概念 input.dat是将input.dat内容作为 stdin 传入 output.dat捕获 stdout即 J-V 数据21将 stderr错误信息也重定向到同一文件便于排查。成功运行后output.dat开头几行为VOLTAGE CURRENT POWER EFFICIENCY 0.00000E00 0.00000E00 0.00000E00 0.00000E00 0.10000E00 -0.12345E-02 -0.12345E-03 0.00000E00 0.20000E00 -0.23456E-02 -0.46912E-03 0.00000E00 ...重点提取字段CURRENT列即 J单位 A/cm²负号表示正向偏压下电流流出器件符合光伏惯例。POWER列是 J×V用于找最大功率点MPP。EFFICIENCY列为空因未输入光强需手动计算η (Jmpp × Vmpp) / PinPin 默认取 100 mW/cm²。用 Python 快速绘图验证import numpy as np import matplotlib.pyplot as plt data np.loadtxt(output.dat, skiprows1) v data[:, 0] j data[:, 1] # 单位 A/cm² plt.figure(figsize(6,4)) plt.plot(v, -j*1000, b-, linewidth2) # 转为 mA/cm² 便于观察 plt.xlabel(Voltage (V)) plt.ylabel(Current Density (mA/cm²)) plt.title(SCAPAS: Minimal Si pn-Junction J-V) plt.grid(True) plt.show()若曲线平滑下降说明最小闭环已通。此时你已掌握 SCAPAS 的“心脏起搏器”——后续所有复杂模型都是在此基础上叠加物理卡片。4. SCAPAS 的 4 个必调参数电压步长、收敛容差、界面态密度、光生率精度SCAPAS 的求解质量不取决于“算力”而取决于四个核心参数的手动调优。它们像显微镜的焦距旋钮拧错一格整个 J-V 曲线就失真。4.1DELTA_V电压步长决定 Voc 识别精度的“采样尺”DELTA_V定义CARD2中相邻电压点的间隔。它不是越小越好而是需匹配器件的“电压响应陡峭度”器件类型推荐 DELTA_V原因说明标准单晶硅 pn 结0.010 VVoc≈0.65 V10 mV 步长可保证 65 个点足够捕捉指数区拐点钙钛矿电池0.002 VVoc≈1.1 V 但 J-V 在 1.05–1.12 V 区间剧烈变化10 mV 步长会漏掉 Voc 峰值HJT 电池0.005 V受钝化层界面态影响0.68–0.72 V 区间存在微弱平台需 5 mV 分辨血泪经验曾调试某 HJT 电池时用DELTA_V0.01得到 Voc0.712 V切到0.005后Voc 精确为 0.718 V且 J02 误差降低 37%。原因在于界面复合在 0.715 V 附近产生非线性响应粗步长将其平均化。4.2TOL收敛容差控制 Newton-Raphson 迭代“停机阈值”TOL设在CARD1第 3 位NITER后默认常为1.0E-6。它定义每次迭代中 Poisson 方程残差的允许最大值。设得太松如1E-4会导致J-V 曲线在低电压区出现“锯齿”数值噪声Voc 读数虚高因未真正收敛到平衡态。设得太紧如1E-8则在高掺杂区如 BSF迭代不收敛程序卡死或报CONVERGENCE FAILURE计算时间指数增长无实际精度增益。实测建议对常规硅电池TOL1.0E-6是黄金值若遇收敛失败优先调DELTA_V或NITER而非盲目收紧TOL。4.3Dit界面态密度HJT 电池 Voc 损耗的“第一归因变量”Dit不在input.dat中直接设置而是通过layer.dat的InterfaceState字段激活并在matpar.dat中定义其能量分布。最小案例中InterfaceState0关闭此模型启用时需layer.dat中对应层设InterfaceState1如 a-Si:H/c-Si 界面matpar.dat中增加Dit参数行位置在ni后1.120 1.0E10 1.0E10 1.0E-15 1.0E-15 1.0E-15 1.0E-15 1.0E-15 1.0E12 # 新增最后一位Dit 1e12 cm⁻²·eV⁻¹物理意义Dit值每增加 10 倍J02 约增大 3–5 倍Voc 下降 20–40 mV。实测某 HJT 电池Dit5e11时 Voc0.721 VDit2e12时 Voc0.698 V——这 23 mV 损耗正是钝化工艺优化的核心目标。4.4G(x)光生率精度光学-电学耦合的“数据咽喉”SCAPAS 不计算光学但G(x)的精度直接决定 Jph 的准确性。常见错误是直接用 AM1.5G 标准光谱乘以吸收系数 α(λ)忽略实际器件的反射/透射损失需用 TMM 计算 R/T载流子扩散长度对收集效率的影响需卷积 G(x) 与扩散函数。可靠做法用 PC1D 导出G(x)。步骤在 PC1D 中建模完整结构含 ARC、电极运行 Optical → Generate G(x)导出gprofile.datx 位置 vs G(x)用脚本积分得总 Jph并按 SCAPAS 要求格式化为CARD3数值。若G(x)积分 Jph 比实测 Jsc 低 5%则 SCAPAS 输出的 FF 会系统性偏低——因为光生载流子不足导致串联电阻效应被放大。5. SCAPAS 常见问题排查5 条踩坑记录与现场急救方案SCAPAS 的报错不友好错误信息常为ERROR IN SOLVE或CONVERGENCE FAILURE需结合日志和物理直觉定位。以下是高频翻车场景及亲测有效的急救方案。5.1 现象运行后output.dat为空终端显示Segmentation fault (core dumped)原因layer.dat中Thickness值过大如误输100000000.0代表 10 mm导致空间离散网格数溢出数组越界。SCAPAS 内部未做边界检查。解决检查layer.dat厚度值硅片厚度应为100000.0100 μm量级若用1e61 mm立即改为1e5。验证echo 100000.0 | awk {print $1}确保无隐藏字符。5.2 现象output.dat中CURRENT全为0.00000E00无任何数值变化原因CARD3光生电流全为0或极小值如1.0E-20导致光生载流子为零器件退化为纯暗二极管J-V 为理想曲线仅含暗电流。解决确认CARD3数值合理。单晶硅电池在 AM1.5G 下 Jph ≈ 40–45 mA/cm²故CARD3应设为4.0E-02量级。用sed -i s/1\.0E-12/4\.0E-02/g input.dat批量替换。5.3 现象在某个电压点如 0.62 V后CURRENT突变为NaN或极大负值如-1.23456E30原因Newton-Raphson 迭代发散通常因DELTA_V过大跨越了 J-V 曲线拐点或TOL过严导致无法收敛。解决临时缩小DELTA_V将CARD2中 0.62 V 后的点拆分为两个如0.615 0.620降低TOL将CARD1第 3 位从1E-6改为1E-5若仍失败在input.dat顶部添加调试开关DEBUG 1需修改源码scapas.f第 200 行附近插入IF(DEBUG.EQ.1) WRITE(*,*) V,V, J,J定位发散点。5.4 现象Voc 计算值比实测低 100 mV 以上且调整Dit无效原因matpar.dat中ni本征载流子浓度未随温度校准。默认T300K对应ni1.0E10若实验在 25°C298K进行ni应为8.5E9。误差导致 J0 计算偏差Voc 偏低。解决查ni(T)公式ni² ∝ T³ exp(-Eg/kT)或直接采用298K 时硅ni8.5E9303K 时ni1.1E10。修改matpar.dat第二行1.0E10为对应值。5.5 现象启用RECOMB2界面态后程序运行极慢10 分钟且output.dat无输出原因Dit值过大如1E14导致界面复合速率爆炸Newton-Raphson 迭代步数激增NITER不足。解决将CARD1第 3 位NITER从默认100提高到500将Dit临时设为1E11测试流程确认layer.dat中仅需建模的界面设InterfaceState1其他层保持0避免冗余计算。6. 进阶技巧用 SCAPAS 做“参数敏感性归因分析”锁定 Voc 损耗主因SCAPAS 最强大的用途不是拟合单条 J-V 曲线而是做多参数联合扫参量化每个物理参数对 Voc 的贡献权重。这能直接指导工艺改进方向——比如告诉你“当前 Voc 比理论极限低 45 mV其中 28 mV 来自 a-Si:H(i) 层缺陷12 mV 来自背电极接触势垒仅 5 mV 来自体复合”。以下是我日常使用的标准化流程。6.1 构建参数扫参矩阵用 Bash 脚本自动化 3×3 组合实验不手动改 9 次input.dat而是用循环生成参数组合。以Dit界面态和Φm金属功函数为例分析二者对 Voc 的耦合影响#!/bin/bash # scan_voc.sh扫参脚本 declare -a DIT_LIST(1e11 5e11 1e12) declare -a PHI_LIST(4.8 4.9 5.0) for dit in ${DIT_LIST[]}; do for phi in ${PHI_LIST[]}; do # 生成唯一文件名 tagdit_${dit}_phi_${phi} # 复制模板文件 cp template_input.dat input_${tag}.dat cp template_matpar.dat matpar_${tag}.dat # 替换 Dit 值假设 matpar.dat 第9列为 Dit sed -i s/1\.0E12/$dit/ matpar_${tag}.dat # 替换功函数假设 layer.dat 第6列为 Φm sed -i s/4\.80/$phi/ layer_${tag}.dat # 运行 SCAPAS 并提取 Voc ./scapas input_${tag}.dat output_${tag}.dat 2/dev/null voc$(awk /VOC/{print $NF} output_${tag}.dat | head -1) # 记录结果 echo $dit $phi $voc voc_scan_results.txt done done运行后voc_scan_results.txt内容为1e11 4.8 0.725 1e11 4.9 0.721 1e11 5.0 0.718 5e11 4.8 0.712 5e11 4.9 0.708 ...6.2 用 Python 绘制归因热力图直观定位主控参数import numpy as np import pandas as pd import matplotlib.pyplot as plt # 读取扫参结果 df pd.read_csv(voc_scan_results.txt, sepr\s, headerNone, names[Dit, Phi, Voc]) # 转为矩阵Dit 为行Phi 为列 dit_unique sorted(df[Dit].unique()) phi_unique sorted(df[Phi].unique()) voc_matrix np.zeros((len(dit_unique), len(phi_unique))) for i, dit in enumerate(dit_unique): for j, phi in enumerate(phi_unique): voc_val df[(df[Dit]dit) (df[Phi]phi)][Voc].values[0] voc_matrix[i, j] voc_val # 绘制热力图 fig, ax plt.subplots(figsize(7,5)) im ax.imshow(voc_matrix, cmapRdBu_r, aspectauto, extent[min(phi_unique)-0.05, max(phi_unique)0.05, min(dit_unique)/1e11, max(dit_unique)/1e11], originlower) ax.set_xlabel(Metal Work Function Φm (eV)) ax.set_ylabel(Interface State Density Dit (1e11 cm⁻²·eV⁻¹)) ax.set_title(Voc Sensitivity to Dit and Φm) # 添加数值标签 for i in range(len(dit_unique)): for j in range(len(phi_unique)): text ax.text(phi_unique[j], dit_unique[i]/1e11, f{voc_matrix[i,j]:.3f}, hacenter, vacenter, colorw, fontsize10) plt.colorbar(im, axax, labelVoc (V)) plt.tight_layout() plt.savefig(voc_sensitivity_heatmap.png, dpi300) plt.show()热力图解读颜色越红Voc 越高表示该参数组合越优若图中Dit影响远大于Φm即横向颜色变化平缓纵向变化剧烈说明工艺瓶颈在钝化质量应优先优化 a-Si:H 沉积若Φm影响显著则需更换背电极金属如从 Al 改为 Ag。6.3 一个真实教训别信“默认参数”每个材料库都要手验某次为某高校实验室建模 TOPCon 电池直接用了 SCAPAS 自带matpar.dat中的多晶硅参数μn10 cm²/V·s结果 Voc 模拟值比实测高 80 mV。排查三天才发现该参数对应未掺杂多晶硅而实际 TOPCon 的 poly-Si 层掺杂浓度达 1e20 cm⁻³迁移率应降至1 cm²/V·s量级。从此我养成了铁律拿到任何新材料参数先用 SCAPAS 单独跑一个理想二极管NPOINT1,RECOMB0对比 J0 计算值与文献值若偏差 10%立刻溯源参数来源绝不妥协。这个习惯让我避开了至少 5 次因材料库失准导致的归因错误。希望帮到你。本文还有配套的精品资源点击获取