113 lines
4.0 KiB
Markdown
113 lines
4.0 KiB
Markdown
# 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 版求解器。
|