XIAN-FEM-2026June/3D opticsfem-master/工作总结_2D到3D散射与本征问题.md

6.8 KiB
Raw Permalink Blame History

OpticsFEM 二维到三维扩展工作总结

一阶 Nedelec 边元 · 散射问题与本征频率问题仿真
西安电子科技大学 · 合作课题 · 2026年6月


一、项目背景与目标

原有 OpticsFEM 程序基于二维三角形网格与一阶 Nedelec 边元,通过 JSON 配置驱动,支持 FemType 032D 本征模式、本征频率、散射等)。

本次工作目标:

  1. 在保持模块化架构mesh / material / phy / kernel / solver / post的前提下扩展至 三维四面体网格
  2. 实现 三维一阶散射问题SBC 散射边界条件)的完整 C++ 仿真;
  3. 实现 三维一阶本征频率问题 的矩阵组装,并与 MATLAB 参考代码数值对齐;
  4. 对标 MATLAB 目录:matlab 3D一阶散射问题matlab 3D一阶本征问题/3D一阶本征问题2

算例模型: SBC 立方体散射结构,共用网格 SBCmesh.dat,双介质 εr = 1.0 / 1.5,参考波长 λ₀ = 0.8 m。


二、软件架构OpticsFEM3D

Test_Main.cpp
    └── FEM_Interface.cppFemType 路由)
            ├── 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.cppOpticsFEM_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 ≈ 43632nnz ≈ 696k
  • 残差:|r| ≈ 6.2×10⁻¹³SparseLU
  • 输出:OutFile/normEExEyEz
  • 可与 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 边界条件

  • 全 PMCBoundaryFlag 全 0与 MATLAB 3D一阶本征问题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.cppOpticsFEM_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,AvBi,Bj,BvCOO 格式0-based
  • 验证结果: C++ 导出的 Av.txt 等与 MATLAB OutFile 逐行一致(约 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=5Run() 接入 Solver_EigenFreqPost_3D_EigenFreq 场重构
  • PBC、二阶基、更多边界类型MATLAB 中已有C++ 待扩展)
  • Test_Main.cpp 支持命令行指定 JSON避免每次改代码重编译

八、总结

本次工作将 OpticsFEM 从 2D 一阶边元 成功扩展至 3D 四面体一阶 Nedelec,新增 FemType 4散射5本征频率

  1. 散射问题 已实现 C++ 端到端仿真(组装 → complexsolver → 后处理),数值可靠;
  2. 本征问题 已完成与 MATLAB 严格对齐的 A/B 矩阵组装与导出,为后续 C++ 本征求解器接入打下基础;
  3. 工程上采用 双构建目录CMake 集成 complexsolver、完整 README 与 COMSOL 对比工具,便于协作与验收。

配套 PPTOpticsFEM_2D_to_3D_Summary.pptx(同目录,运行 python generate_summary_ppt.py 可重新生成)