# OpticsFEM3D

三维矢量有限元光学电磁仿真程序（一阶 Nedelec 边元）。

## 支持的问题类型

| FemType | 说明 | 网格 | 状态 |
|---------|------|------|------|
| 0–3 | 二维问题（本征/散射） | `Mesh_2D` | 遗留接口，与 2D 版相同 |
| **4** | **三维一阶散射（SBC）** | **`Mesh_3D`** | **完整：组装 → 求解 → 后处理** |
| **5** | **三维一阶本征频率** | **`Mesh_3D`** | **组装 + A/B 矩阵导出（Run/Post 待接）** |

三维主算例共用网格 **`SBCmesh.dat`**，散射与本征分别使用 `sbc3d.json`、`eigen3d.json`。

## 推荐构建目录

为避免散射与本征互相覆盖 exe 和 OutFile，建议使用**两个独立 CMake 构建目录**：

| 目录 | 用途 | 配置文件 |
|------|------|----------|
| `scat3D/` | FemType=4 散射 | `sbc3d.json` |
| `eigen3D/` | FemType=5 本征频率 | `eigen3d.json` |

旧目录 `build/`、`build1/` 为早期本地构建，可保留或删除，**不必上传 Git**。

## 环境

- Windows 10/11 x64
- Visual Studio 2026（18），工作负载：使用 C++ 的桌面开发
- CMake ≥ 3.8（随 VS 安装）

若 `cmake` 不在 PATH 中：

```powershell
$env:Path += ";C:\Program Files\Microsoft Visual Studio\18\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin"
```

## 编译

```powershell
cd "3D opticsfem-master"

# 散射（FemType=4）
cmake -B scat3D -G "Visual Studio 18 2026" -A x64
cmake --build scat3D --config Release

# 本征频率（FemType=5）
cmake -B eigen3D -G "Visual Studio 18 2026" -A x64
cmake --build eigen3D --config Release
```

产物（每个构建目录各一份）：

- `scat3D/Release/OpticsFEM.exe` 或 `eigen3D/Release/OpticsFEM.exe`
- `*/Release/complex/complexsolver.exe`（FemType=4 散射求解必需，CMake 自动编译）

## 运行散射算例（FemType = 4）

1. 修改 `test/Test_Main.cpp`，确保读取 `sbc3d.json`（当前默认），重新编译 `scat3D`。
2. 部署输入文件：

```powershell
Copy-Item sbc3d.json, SBCmesh.dat -Destination scat3D\Release\
cd scat3D\Release
.\OpticsFEM.exe
```

3. 控制台应打印 `OpticsFEM_All returned 4`。
4. 结果在 `OutFile/`：`Ex`、`Ey`、`Ez`、`normE`。

## 运行本征频率算例（FemType = 5）

1. 修改 `test/Test_Main.cpp` 中 JSON 文件名为 `eigen3d.json`，重新编译 `eigen3D`。
2. 部署输入文件：

```powershell
Copy-Item eigen3d.json, SBCmesh.dat -Destination eigen3D\Release\
cd eigen3D\Release
.\OpticsFEM.exe
```

3. 控制台应打印 `OpticsFEM_All returned 5`。
4. 当前输出 `OutFile/` 下 A/B 稀疏矩阵 COO：`Ai/Aj/Av`、`Bi/Bj/Bv`（0-based），供与 MATLAB `eigs(A,B)` 对比验证。

> **说明**：FemType=5 的 `Run()`（特征值求解）与 `Post()`（场重构）尚未接入主流程；矩阵组装与边界处理已完成。

## 输入文件

| 文件 | FemType | 说明 |
|------|---------|------|
| `sbc3d.json` | 4 | 散射配置，含 `sbc` 边界块与 `lambda` |
| `eigen3d.json` | 5 | 本征频率配置，含 `NbrMode`、`searchValue` 等 |
| `SBCmesh.dat` | 4 / 5 | 三维四面体网格（顶点、四面体、边、三角边界等） |

## 物理形式简述

| 问题 | 方程形式 | 矩阵 |
|------|----------|------|
| 散射 (4) | **A·x = b**（给定 λ/k₀） | A = curl-curl − k₀²ε + SBC；b 来自入射边界 |
| 本征 (5) | **A·x = λ·B·x** | A = curl-curl（刚度）；B = ε·质量 |

体积分核函数相同，散射将刚度与质量合并进 A 并加边界激励；本征拆成 A、B 求特征值。

## 详细文档

- [OpticsFEM_完整使用说明与代码介绍.md](./OpticsFEM_完整使用说明与代码介绍.md) — 模块说明、JSON 字段、FemType=4/5 专章
- [compare/README.md](./compare/README.md) — 与 COMSOL 的 normE 切面对比（散射）

## 仓库说明

- 仅上传**源码**与算例 JSON；`scat3D/`、`eigen3D/`、`build/`、`build1/` 为本地 CMake 产物，不上传。
- FemType=4 的 `complexsolver.exe` 由 CMake 从 `complex/complexsolver.cpp` 编译，无需单独 PETSc 版求解器。
