XIAN-FEM-2026June/OpticsFEM_LASPCEM_接口规范.md

19 KiB
Raw Blame History

OpticsFEM × LASPCEMDesign.em接口规范

项目 说明
版本 v0.1(草案)
日期 2026-06-02
适用范围 laspcem-case 五个 HFSS/LASPCEM 算例 → opticsfem-master 三维矢量 FEM
参考材料 C++代码后端-有限元接口.xmindC++有限元程序接口及对应页面设计.pdf二维有限元思维导图.xmindopticsfem-master/Interface/FEM_Interface.*测试数据集/*/case*.json

1. 目标与原则

1.1 目标

不改造 LASPCEM 前端与网格导出的前提下,复用其求解输入:

  • Design.em:物理模型、材料、边界、激励、频率(对应原「前端输入 JSON」角色
  • Design.em.mesh:二阶 Nedelec 四面体网格(对应原「网格 .dat / mesh.json」角色

由 OpticsFEM 侧新增 LASPCEM 适配层,将上述文件转换为内部统一的 OpticsFEM JSON + 网格文件,再走现有或规划中的 3D 求解流程。

1.2 设计原则(对齐既有思维导图 / PDF

原则 说明
单一 API 入口 延续 OpticsFEM_API::OpticsFEM_All(OpticsFEMData),对外仍为一个 DLL 接口
JSON 为内核语言 适配层输出符合 Phy/Material/Mesh/Solver 已实现的 JSON 字段;.em 不直接进入组装器
前后端解耦 页面 / 脚本只提交「案例目录 + 输入模式」;.em 解析在 C++ 适配模块完成
案例可回归 laspcem-case 五例为验收基线,逐例对比场分布或 S 参数(允许数值容差)

2. 现有 OpticsFEM 接口(基线)

2.1 调用约定

struct OpticsFEMData {
    double test1;
    double test2;
    char* data;   // UTF-8 JSON 字符串,单行或紧凑格式
};

class OpticsFEM_API {
public:
    static int OpticsFEM_All(OpticsFEMData data);
    int OpticsFEM_Test(OpticsFEMData data);
};

2.2 FemType 路由(二维,已实现)

FemType 问题类型 主要 JSON 依赖
0 本征模式 EigenMode NbrMode, searchValue, lambda0, …
1 本征频率 EigenFreq NbrMode, searchValue, EletricType, …
2 散射 Scatter lambda, sbc/port/pml/…
3 散射(按频率) freq, EletricType, …

读取链路(现状):

  1. json::parse(data.data)FemType, MeshFile
  2. Phy_WaveOpticsModel::Test_ReadData(str)
  3. MaterialLib::Test_ReadData(str)
  4. Mesh_2D::GetMesh(meshFile, str)仅 2D .dat

2.3 二维 JSON 核心字段(摘自 测试数据集 / Test_ReadData.cpp

公共

  • FemType, EletricType, NbrBoundary, BoundaryFlag[]
  • NbrDomain, matType[], epsilonrR/I, murR/I, sigma, chiheR/I, chiehR/I, n, k
  • MeshFile, OutFile

边界扩展(按 js.contains 可选)

  • sbc, ef, mag, scd, pbc, mpd, epd, bele, pml, port, beam

求解

  • 本征:NbrMode, searchType, searchValue, solverType, maxIterNum, tol, tolType, lambda0
  • 散射:lambdafreq

2.4 二维网格 .datMesh_2D::GetMesh

顺序读取关键字:NbrVertexVertexNbrEdgeEdgeNbrTriTriEdgeOfTriDomainOfTriNbrEdgesCoonOfEdgesDomainOfEdgesnormalCopyOfEdges → …

与 LASPCEM 无直接兼容3D 需单独定义 Mesh_3D 读入格式(见 §5


3. LASPCEM 输入文件规范

3.1 文件对与路径约定

每个算例在求解完成后,在 out/<工程名>/1_Result/ 下生成一对文件(推荐作为适配入口):

文件 角色
Design.em 前端 + 求解配置HOFEM 脚本)
Design.em.mesh 网格(由 mesh_filename 引用,须与 .em 同目录)

五例标准路径见 §7 案例对照表

说明:同目录下可能存在 .../1_Result/<工程>/1_Result/_cur 副本;默认使用顶层 1_Result,自适应加密后以日志 READING INPUT FILE... Design.em 所指路径为准。

3.2 Design.em 结构(章节)

章节 关键变量 用途
Physic & formulation physics, basis_functions, variational_order, geometrical_order 确认波动方程 + Nedelec 阶次
Geometry & Mesh geometry_units, mesh_format, mesh_filename 单位与网格文件名
Frequency Freq_distribution_num, Freq_distribution_type, Freq_distribution_info 频点扫描;type=4 为单频点
Material num_materials, material_name_i, permittivity_i, … 材料库
Boundary num_boundary_conditions, bound_mark_i, bound_type_i 面标记与 BC
Excitation num_*_excitations, general_*, lumped_*, exterior_* 波端口 / 集总 / 平面波
IIEE iiee_truncation_method, … 积分方程加速FEM027 等)

3.3 Design.em.mesh 结构ASCII二阶四面体

根据 FEM001 样例解析,格式草案如下:

<nVertex>
<nEdge>
<pad0>          # 样例为 0
<pad1>          # 样例为 0
<Vertex> × nVertex
    每行: x y z   (科学计数, geometry_units 一致, 样例为 mm)
<Tet> × nTet
    每行: v0 v1 v2 v3  e0 e1 e2 e3 e4 e5  0 0 0
          └─4 顶点索引(1-based)─┘ └─6 边索引─┘  └占位┘
  • variational_order = 2 时,每单元 6 条边 DOF与行内 6 个边号一致。
  • 后续可能还有三角面 / 边界标记块(需在适配器首版用 LASPCEM 日志或 Design_innerPartsIDs.dat 交叉验证)。

禁止假定与 project_*.dat 行格式相同;必须经 EmMeshImporter 转为 OpticsFEM 3D 网格§5.2)。


4. 适配架构

┌─────────────┐     ┌──────────────────┐     ┌─────────────────────┐
│ 前端/脚本    │────▶│ OpticsFEM_All     │────▶│ 3D FEM 内核          │
│ casePath    │     │ + LASPCEM 分支    │     │ (EigenMode/Freq/     │
│ InputMode   │     └────────┬─────────┘     │  Scatter 3D)         │
└─────────────┘              │               └─────────────────────┘
                             ▼
                    ┌──────────────────┐
                    │ LaspcemAdapter    │
                    │ · EmParser        │
                    │  · EmMeshImporter │
                    │  · EmToJson       │
                    └────────┬─────────┘
                             ▼
              ┌──────────────────────────────┐
              │ 内部: opticsfem_case.json   │
              │       mesh_3d.dat|json      │
              └──────────────────────────────┘

建议新增源文件:

  • opticsfem-master/Interface/LaspcemAdapter.h|.cpp
  • opticsfem-master/mesh/Mesh_3D_Laspcem.cpp(或扩展现有 Mesh_3D_Interface.cpp

5. OpticsFEM 侧扩展接口

5.1 对外 JSON 包装(调用 .em 时)

OpticsFEMData.data 中增加 包装对象(兼容原纯 JSON 调用):

{
  "InputMode": "laspcem",
  "CaseId": "FEM001_RecHorn",
  "EmPath": "Z:/.../laspcem-case/FEM001_RecHorn/out/FEM001-RectHorn/1_Result/Design.em",
  "WorkDir": "Z:/.../output/FEM001_run1",
  "OutFile": "./OutFile",
  "OverwriteConverted": false
}
字段 类型 必填 说明
InputMode string 固定 "laspcem";缺省或其它值走原 JSON 路径
EmPath string Design.em 绝对或相对路径
WorkDir string 转换产物目录;默认 EmPath 所在目录
CaseId string 五例 ID用于加载内置映射缺省值
OutFile string 结果输出目录(与原 API 一致)
OverwriteConverted bool 是否强制重新解析 .em

返回值扩展OpticsFEM_All

返回值 含义
0 失败
13 原 2D FemType 成功
10 LASPCEM → 3D 本征频率成功(规划)
11 LASPCEM → 3D 散射成功
12 仅完成转换,未求解(调试)

5.2 适配器输出:内部 opticsfem_case.json

适配器根据 Design.em 生成,字段 超集 于二维 JSON并增加 3D 专用项:

{
  "FemType": 11,
  "Dimension": 3,
  "InputSource": "laspcem",
  "SourceEm": "Design.em",
  "EletricType": 2,
  "ElementOrder": 2,
  "GeometryUnits": "mm",
  "NbrDomain": 3,
  "matType": [0, 0, 0],
  "epsilonrR": [1.0, 1.0, 1.0],
  "epsilonrI": [0.0, 0.0, 0.0],
  "murR": [1.0, 1.0, 0.999991],
  "murI": [0.0, 0.0, 0.0],
  "sigma": [0.0, 1e30, 5.8e7],
  "NbrBoundary": 6,
  "BoundaryFlag": [0, 1, 0, 0, 2, 7],
  "freq": 8.43e9,
  "MeshFile": "mesh_3d_converted.dat",
  "OutFile": "./OutFile",
  "laspcem": {
    "bound_map": [{"mark":0,"type":"NULL"}, {"mark":1,"type":"PEC"}],
    "excitations": {"waveport_general": 1}
  }
}

说明:

  • FemType: 11 为本文建议的 LASPCEM 3D 散射 专用路由(实现前可用 FemType: 2 + Dimension: 3 过渡)。
  • freq:由 Freq_distribution_info 首项MHz× 1e6 得到 Hz五例均为单频 Freq_distribution_type=4)。
  • laspcem 子对象存放 无法直接映射 的原始信息,供调试与后续扩展。

5.3 三维网格输出 mesh_3d_converted.dat(建议)

对齐 3d光学fem完整实现_f4164ab1.plan.md,采用关键字文本或 JSON

NbrVertex
<n>
Vertex
x y z
...
NbrEdge
<n>
Edge
i j
...
NbrTet
<n>
Tet
v1 v2 v3 v4
EdgeOfTet
e1 e2 e3 e4 e5 e6
DomainOfTet
<domainId per tet>
NbrTri
<n>
Tri
...
DomainOfTri
...
NormOfFace
nx ny nz

索引规则:

  • LASPCEM .mesh 若为 1-based,导入 OpticsFEM 时统一转为 0-based(与二维 DomainOfTri +1 逻辑相反,需在适配器文档与代码中固定一种约定并在五例测试中锁定)。

6. 字段映射规范

6.1 问题类型判定

LASPCEM 特征 OpticsFEM FemType 备注
physics = wave_equation + 端口/平面波激励 113D Scatter 五例均属此类
无激励 + 腔体本征(未在五例出现) 103D EigenFreq 预留
iiee_truncation_method = true 仍 FEM 主求解IIEE 仅加速 不单独改变 FemType

6.2 频率

Design.em OpticsFEM
Freq_distribution_type = {4} 单频 单频散射
Freq_distribution_info = { fMHz, fMHz, 1 } freq = fMHz × 1e6Hz
波长需求 lambda = c0 / freqc0 = 299792458 m/sSolver_LdaDom::GetSolver2 一致)

6.3 材料 material_name_imatType / 电磁参数

LASPCEM 条件 matType OpticsFEM 字段
Vacuum permittivity=1, 无损耗 0 epsilonrR=1, sigma=0
PEC electric_conductivity ≥ 1e20 或名称 PEC 0 sigma=1e30(或边界 PEC 处理)
各向同性介质 definition_type = Isotropic 0 epsilonrR, murR, sigma 或 Tanδ 换算
各向异性 definition_type = Anisotropic 2(对角)或 3(全张量,扩展) epsilonrR 取 3×3 对角;非对角项进 laspcem.anisotropic

Tanδ → 损耗epsilonrI = epsilonrR * tanδ(各向异性时对角元分别处理)。

域 ID:由 .mesh 单元块或 MESH/Design_innerPartsIDs.dat 提供;无域表时,按材料名绑定默认域序号(适配器配置表)。

6.4 边界 bound_typeBoundaryFlag

bound_type bound_mark BoundaryFlag OpticsFEM 结构
NULL m 不占用边界数组
PMC m 0 内置 PMC 列表
PEC m 1 内置 PEC 列表
ABC m 2 sbc(吸收边界,类型待定义)
FCBC m 7(扩展) 有限电导面;laspcem.fcbc={sigma,mur}
GEN m 8(扩展) 广义波端口;映射 portlaspcem.waveport
LPO m 9(扩展) 集总端口;laspcem.lumped={R,X,integ}

二维已有:0=PMC, 1=PEC, 2=SBC, 3=ELE, 4=PBC, 8=MAG, 9=SCD。三维 LASPCEM 扩展标志 79 需在 Phy_WaveOpticsModel::Test_ReadData 3D 分支中实现。

6.5 激励

LASPCEM 块 条件 OpticsFEM
num_waveport_excitations 第三项 > 0 general_* + bound_type=GEN portlaspcem.waveport.general
num_waveport 第四项 > 0 lumped_* + LPO laspcem.lumped(电阻、积分线坐标)
num_exterior_excitations 第一项 > 0 exterior_* 平面波 sbc 入射波 + bound_type=ABC
多入射角 exterior_type=Multiple FEM049 laspcem.exterior.scan[],首版可只取第一组角度

6.6 单元阶次

Design.em OpticsFEM
variational_order = 2 ElementOrder = 2,组装二阶 Nedelec20 DOF/四面体,见规划文档)
geometrical_order = 2 几何二阶映射到 Mesh_3D 高阶几何节点(可选)

7. 五案例对照表

统一入口目录:laspcem-case/<CaseId>/out/<Project>/1_Result/

CaseId Project Design.em / .mesh 频率 (GHz) 材料数 边界要点 激励要点 建议 OpticsFEM 路由
FEM001_RecHorn FEM001-RectHorn .../1_Result/Design.em 8.43 3Vacuum, PEC, copper PEC/PMC/ABC/FCBC/GEN 广义波端口 ×1 FemType 11, freq=8.43e9
FEM009_Patch_MetalSurface FEM009-Patch_MetalSurface 同上 2.80 4 FCBCGroiss SR 广义波端口 ×1 FemType 11
FEM013_MountPatch FEM013-MountPatch 同上 2.45 3含 FR4 LPO 集总波端口 ×1 FemType 11 + laspcem.lumped
FEM027_HalfAmygdala_FEIE FEM027_HalfAmygdala_FEIE 同上 0.30 2 ABC + IIEE/MLFMA 平面波 Single FemType 11 + sbc 平面波
FEM049_Anisotropic FEM049 同上 3.00 53 各向异性块) ABC 多角度平面波 Multiple FemType 11 + 各向异性材料

完整路径示例FEM001

Z:\home\项目文件\西电-合作\laspcem-case\FEM001_RecHorn\out\FEM001-RectHorn\1_Result\Design.em
Z:\home\项目文件\西电-合作\laspcem-case\FEM001_RecHorn\out\FEM001-RectHorn\1_Result\Design.em.mesh

页面设计PDF建议暴露字段

页面控件 绑定
算例选择下拉 CaseId 五选一 → 自动填充 EmPath
频率只读 解析 Freq_distribution_info
边界列表 解析 num_boundary_conditions
材料表 解析 num_materials
输出目录 OutFile
运行 调用 OpticsFEM_AllInputMode=laspcem

8. C++ 实现要点(与思维导图节点对应)

8.1 接口层 FEM_Interface.cpp

int OpticsFEM_API::OpticsFEM_All(OpticsFEMData data) {
    json js = json::parse(data.data);
    if (js.value("InputMode", "") == "laspcem") {
        LaspcemAdapter adapter;
        std::string jsonPath, meshPath;
        adapter.Convert(js.at("EmPath"), js.value("WorkDir", ""), jsonPath, meshPath);
        // 将 jsonPath 内容读回 data 或直接传内部结构
        return RunFromInternalJson(jsonPath, meshPath);
    }
    // 原有 FemType 03 逻辑
}

8.2 LaspcemAdapter::Convert 步骤

  1. 解析 Design.em(键值 + { ... } 数组块,#/-- 注释行忽略)
  2. 校验 mesh_filename 存在且为 Design.em.mesh
  3. EmMeshImporter::Load(mesh)Mesh_3D
  4. EmToJson::Build(em, meshMeta)opticsfem_case.json
  5. Mesh_3D::Export(mesh_3d_converted.dat)
  6. 写 manifestcase.converted.json(记录源路径、哈希、转换时间)

8.3 与二维思维导图差异

二维 LASPCEM 3D
三角网格 + 边 DOF 混合 纯四面体 Nedelec
Mesh_2D::GetMesh Mesh_3D::GetMeshFromLaspcem(新增)
TM/TE EletricType 固定 EletricType=2(全矢量)
无 IIEE iiee_* 记入 laspcem,首版可忽略

9. 错误码与日志

代码 场景
E001 EmPath 不存在
E002 Design.em.mesh 缺失
E003 .em 键缺失(如无 Freq_distribution_info
E004 网格段行数与声明不符
E005 不支持的 bound_type
E006 各向异性材料未实现
E007 FemType 3D 求解器未就绪

日志:转换阶段写 WorkDir/adapter.log;求解阶段沿用 _SolverPip_0.log 风格。


10. 验收与测试计划

步骤 内容
T1 五例 Convert() 成功,生成 opticsfem_case.json + mesh_3d_converted.dat
T2 网格守恒:顶点数、四面体数与 LASPCEM 一致
T3 材料/边界条数与 Design.em 一致
T4 FEM001 远场 / S 参数与 LASPCEM export/*.csv 对比(容差待定)
T5 FEM049 各向异性 ε 张量对角元与 .em 一致

11. 版本路线

版本 内容
v0.1 本文档 + 五例路径与映射表
v0.2 EmParser / EmMeshImporter 原型FEM001 网格贯通
v0.3 边界 GEN/LPO/平面波 + FEM013/FEM027
v0.4 各向异性 FEM049 + IIEE 忽略说明
v1.0 OpticsFEM_All 正式返回码 11页面联调

12. 附录 ADesign.em 键名索引(解析器必支持)

physics, basis_functions, variational_unknown, geometrical_order, variational_order,
geometry_units, mesh_format, mesh_filename,
Freq_distribution_num, Freq_distribution_type, Freq_distribution_info,
num_materials, material_name_*, definition_type_*, permittivity_*, permeability_*,
electric_loss_type_*, dielectric_loss_tangent_*, electric_conductivity_*,
num_boundary_conditions, bound_mark_*, bound_type_*, bound_conduc_*, bound_mur_*,
num_interior_excitations, num_exterior_excitations, num_waveport_excitations,
general_*, lumped_*, exterior_*,
iiee_truncation_method, iiee_truncation_aceleration, iiee_truncation_error

13. 附录 B测试数据集 命名对照

测试数据集 LASPCEM 五例
case1.json Design.em
project_3299_15.dat Design.em.mesh
mesh.json(辅助) MESH/Mesh_Statistics.dattetmaps.dat(可选校验)

文档结束。实现时以 opticsfem-master 源码与五例实文件为准;若 LASPCEM 升级导致 .mesh 增段,须同步修订 §3.3。