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

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

---

## 一、项目背景与目标

原有 **OpticsFEM** 程序基于二维三角形网格与一阶 Nedelec 边元，通过 JSON 配置驱动，支持 FemType 0–3（2D 本征模式、本征频率、散射等）。

**本次工作目标：**

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.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 运行与验证

```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 ≈ 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），与 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` 可重新生成）*
