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

189 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.cpp``OpticsFEM_3D_Scatter` 总控
- `complex/complexsolver.cpp` — Eigen SparseLU 复数求解器
- `post/Post_CalEletric.cpp` — 3D 电场重构
### 4.4 运行与验证
```powershell
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/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与 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.cpp``OpticsFEM_3D_EigenFreq`
### 5.5 运行与验证
```powershell
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` 等与 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=5`Run()` 接入 `Solver_EigenFreq``Post_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 对比工具,便于协作与验收。
---
*配套 PPT`OpticsFEM_2D_to_3D_Summary.pptx`(同目录,运行 `python generate_summary_ppt.py` 可重新生成)*