6.8 KiB
6.8 KiB
OpticsFEM 二维到三维扩展工作总结
一阶 Nedelec 边元 · 散射问题与本征频率问题仿真
西安电子科技大学 · 合作课题 · 2026年6月
一、项目背景与目标
原有 OpticsFEM 程序基于二维三角形网格与一阶 Nedelec 边元,通过 JSON 配置驱动,支持 FemType 0–3(2D 本征模式、本征频率、散射等)。
本次工作目标:
- 在保持模块化架构(mesh / material / phy / kernel / solver / post)的前提下,扩展至 三维四面体网格;
- 实现 三维一阶散射问题(SBC 散射边界条件)的完整 C++ 仿真;
- 实现 三维一阶本征频率问题 的矩阵组装,并与 MATLAB 参考代码数值对齐;
- 对标 MATLAB 目录:
matlab 3D一阶散射问题、matlab 3D一阶本征问题/3D一阶本征问题2。
算例模型: SBC 立方体散射结构,共用网格 SBCmesh.dat,双介质 εr = 1.0 / 1.5,参考波长 λ₀ = 0.8 m。
二、软件架构(OpticsFEM3D)
Test_Main.cpp
└── FEM_Interface.cpp(FemType 路由)
├── mesh/Mesh_3D ← SBCmesh.dat
├── material / phy ← JSON 材料与边界
├── kernel ← 矩阵组装
├── solver ← 求解接口层
├── complexsolver.exe ← 复数稀疏线性求解(散射)
└── post ← 电场重构与输出
| 构建目录 | 用途 | 配置文件 |
|---|---|---|
scat3D/ |
FemType=4 散射 | sbc3d.json |
eigen3D/ |
FemType=5 本征 | eigen3d.json |
三、二维与三维扩展对照
| 维度 | FemType | 问题类型 | 网格类 | 控制方程 | C++ 状态 |
|---|---|---|---|---|---|
| 2D | 0 / 1 | 本征模式 / 频率 | Mesh_2D |
A·x = λ·B·x | 遗留接口 |
| 2D | 2 / 3 | 散射 | Mesh_2D |
A·x = b | 遗留接口 |
| 3D | 4 | 一阶散射 SBC | Mesh_3D |
A·x = b | 完整闭环 |
| 3D | 5 | 一阶本征频率 | Mesh_3D |
A·x = λ·B·x | 组装+导出 |
四、三维散射问题(FemType = 4)
4.1 物理与方程
- 时谐麦克斯韦方程,一阶 Nedelec 边元离散;
- 线性系统:A·x = b
- A = curl-curl 刚度 − k₀²ε 质量项 + SBC 出射边界贡献;
- b 来自入射边界 assembly_inc。
4.2 与 MATLAB 流程对齐
| 步骤 | MATLAB | C++ |
|---|---|---|
| 体积分 | assembly_equ |
Assemble_WaveEquation |
| 出射 SBC | assembly_out |
Assemble_SBC |
| 入射激励 | assembly_inc |
Assemble_SBC(入射项) |
| 求解 | solver.A \ solver.b |
complexsolver.exe |
| 后处理 | get_ele2 |
Post_3D_Scatter::GetElectric |
4.3 主要新增代码
kernel/Assemble_Scatter_Equation.cpp— 3D 四面体体积积分kernel/Assemble_Scatter_3D_Boundary.cpp— SBC、PEC/ELE 边界kernel/Assemble_kernel.cpp—OpticsFEM_3D_Scatter总控complex/complexsolver.cpp— Eigen SparseLU 复数求解器post/Post_CalEletric.cpp— 3D 电场重构
4.4 运行与验证
cmake -B scat3D -G "Visual Studio 18 2026" -A x64
cmake --build scat3D --config Release
Copy-Item sbc3d.json, SBCmesh.dat scat3D\Release\
cd scat3D\Release
.\OpticsFEM.exe
- 返回码:
OpticsFEM_All returned 4 - 求解规模:n ≈ 43632,nnz ≈ 696k
- 残差:|r| ≈ 6.2×10⁻¹³(SparseLU)
- 输出:
OutFile/normE、Ex、Ey、Ez - 可与 COMSOL 在 z=0.5 m 切面对比(
compare/compare_normE_zslice.m)
五、三维本征频率问题(FemType = 5)
5.1 物理与方程
- 广义本征问题:A·x = λ·B·x
- A = curl-curl(刚度矩阵);
- B = ε 质量矩阵;
- λ = k₀²,与本征频率相关。
5.2 边界条件
- 全 PMC(
BoundaryFlag全 0),与 MATLAB3D一阶本征问题2一致。
5.3 与 MATLAB 流程对齐
| 步骤 | MATLAB | C++ |
|---|---|---|
| 体积分 A/B | assembly_equ |
Assemble_WaveEquation |
| 矩阵导出 | export_ab_matrix |
Test_OutputMatrix |
| 求解 | eigs(A,B,...) |
待接入 C++ |
| 后处理 | get_ele |
Post_3D_EigenFreq 待实现 |
5.4 主要新增代码
kernel/Assemble_EigenFreq_Equation.cpp— 3D A/B 体积分kernel/Assemble_EigenFreq_Boundary.cpp— PEC/PBC 边界kernel/Assemble_kernel.cpp—OpticsFEM_3D_EigenFreq
5.5 运行与验证
cmake -B eigen3D -G "Visual Studio 18 2026" -A x64
cmake --build eigen3D --config Release
# Test_Main.cpp 改为读取 eigen3d.json 后重新编译
Copy-Item eigen3d.json, SBCmesh.dat eigen3D\Release\
cd eigen3D\Release
.\OpticsFEM.exe
- 返回码:
OpticsFEM_All returned 5 - 输出:
OutFile/Ai,Aj,Av、Bi,Bj,Bv(COO 格式,0-based) - 验证结果: C++ 导出的
Av.txt等与 MATLABOutFile逐行一致(约 1.29×10⁶ 非零元)
六、求解器体系
| 组件 | 角色 |
|---|---|
solver/Solver_Interface.cpp |
上层 C++ 类(Solver_LdaDom 等) |
solver/interface.cpp |
矩阵 ↔ .dat 文件 ↔ 启动外部 exe |
complex/complexsolver.exe |
散射实际数值求解(Eigen SparseLU) |
solver/eigen_solver.cpp |
2D 本征外部求解器桥接(仓库未含二进制) |
MATLAB eigs |
3D 本征当前验证与求解手段 |
七、完成情况汇总
已完成
| 项目 | 散射 (FemType=4) | 本征 (FemType=5) |
|---|---|---|
| 3D 网格读取 | ✅ Mesh_3D + SBCmesh.dat | ✅ |
| 体积分组装 | ✅ | ✅ A + B |
| 边界处理 | ✅ SBC + PEC | ✅ PMC |
| 线性/本征求解 | ✅ complexsolver | ⚠️ MATLAB eigs |
| 后处理输出 | ✅ normE/Ex/Ey/Ez | ⚠️ 仅矩阵导出 |
| 文档与构建 | ✅ README + scat3D | ✅ eigen3D |
| 数值验证 | ✅ 残差 + COMSOL 脚本 | ✅ 矩阵与 MATLAB 一致 |
待完成
- FemType=5:
Run()接入Solver_EigenFreq,Post_3D_EigenFreq场重构 - PBC、二阶基、更多边界类型(MATLAB 中已有,C++ 待扩展)
Test_Main.cpp支持命令行指定 JSON,避免每次改代码重编译
八、总结
本次工作将 OpticsFEM 从 2D 一阶边元 成功扩展至 3D 四面体一阶 Nedelec,新增 FemType 4(散射) 与 5(本征频率):
- 散射问题 已实现 C++ 端到端仿真(组装 → complexsolver → 后处理),数值可靠;
- 本征问题 已完成与 MATLAB 严格对齐的 A/B 矩阵组装与导出,为后续 C++ 本征求解器接入打下基础;
- 工程上采用 双构建目录、CMake 集成 complexsolver、完整 README 与 COMSOL 对比工具,便于协作与验收。
配套 PPT:OpticsFEM_2D_to_3D_Summary.pptx(同目录,运行 python generate_summary_ppt.py 可重新生成)