CAE 前处理-求解流水线 — 架构设想 / An Architectural Design for a CAE Preprocessing-to-Solver Pipeline
日期:2026-05-15 标签:#课程项目 #架构 #OCC #VTK #GMSH #CalculiX 前置知识:有限元基础、前处理与后处理、求解器基础
1. 项目目标
实现一个最小可运行的 CAE 仿真流水线:
几何建模 (OCC)
↓
几何可视化 (VTK)
↓
网格划分 (GMSH API)
↓
求解 (CalculiX)
↓
结果可视化 (VTK)2. 整体架构
┌────────────────────────────────────────────────────────────────────────────┐
│ 主程序 (Python / C++) │
├────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌─────────┐ │
│ │ 几何模块 │ → │ 网格模块 │ → │ 求解模块 │ → │可视化模块│ │
│ │ (OCC) │ │ (GMSH) │ │ (CalculiX) │ │ (VTK) │ │
│ │ │ │ │ │ │ │ │ │
│ │ · 建模 │ │ · 网格生成 │ │ · 调用求解器│ │ · 几何 │ │
│ │ · 布尔运算 │ │ · 质量检查 │ │ · 读取结果 │ │ · 网格 │ │
│ │ · STEP导入 │ │ · 格式转换 │ │ · 结果输出 │ │ · 云图 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └────┬────┘ │
│ ↓ ↓ ↓ ↓ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌─────────┐ │
│ │ 几何数据 │ │ 网格数据 │ │ 结果数据 │ │ 图形窗口│ │
│ │ (B-Rep) │ │ (.msh) │ │ (.frd) │ │ 截图 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └─────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────────┘3. 各模块设计
3.1 几何模块 (OCC)
输入: STEP / IGES 文件 或 代码创建几何
处理: B-Rep 数据结构管理、布尔运算、几何修复
输出: TopoDS_Shape(几何对象)核心功能:
- 导入 STEP / IGES 格式几何
- 创建基本几何体(长方体、圆柱、球等)
- 布尔运算(合并、相减、相交)
- 导出几何供 VTK 显示
- 导出几何供 GMSH 网格划分
3.2 网格模块 (GMSH)
输入: OCC TopoDS_Shape
处理: 设置网格参数 → 调用 GMSH API 生成网格
输出: .msh 文件(节点 + 单元)核心功能:
- 全局网格尺寸控制(最小/最大单元尺寸)
- 局部网格加密(关键区域细化)
- 支持四面体和六面体网格
- 网格质量检查(长宽比、歪斜度)
- 导出为 CalculiX 可读的 .inp 文件
网格参数:
┌─────────────────────────────────────────────────────────────────┐
│ 网格控制参数 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 全局控制 │
│ ├── 最小单元尺寸 → 控制整体网格密度 │
│ └── 最大单元尺寸 → 防止单元过大 │
│ │
│ 局部控制 │
│ ├── 点控制 → 指定点附近网格加密 │
│ ├── 线控制 → 边缘处网格细化 │
│ └── 面控制 → 曲面精度控制 │
│ │
│ 算法选择 │
│ ├── 四面体:Delaunay(自动生成,适合复杂几何) │
│ └── 六面体:映射法 / 多块法(精度高,适合规则几何) │
│ │
└─────────────────────────────────────────────────────────────────┘3.3 求解模块 (CalculiX)
输入: 网格数据 + 材料 + 边界条件
处理: 生成 .inp 文件 → 调用 CalculiX 求解器
输出: .frd 结果文件(位移、应力、应变)核心功能:
- 写入 INP 输入文件(节点、单元、材料、分析步)
- 材料定义(弹性模量、泊松比、密度)
- 边界条件设置(固定约束、对称约束、集中载荷、分布载荷)
- 调用 CalculiX 求解器(ccx)
- 读取 .frd 结果文件
INP 文件结构:
┌─────────────────────────────────────────────────────────────────┐
│ CalculiX INP 文件结构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ *HEADING ← 文件标题 │
│ 静态结构分析示例 │
│ │
│ *NODE ← 节点定义 │
│ 节点编号, x, y, z │
│ │
│ *ELEMENT ← 单元定义(类型:四面体 / 六面体) │
│ 单元编号, 节点列表 │
│ │
│ *MATERIAL ← 材料定义 │
│ *ELASTIC ← 线弹性(E, ν) │
│ *DENSITY ← 密度 │
│ │
│ *BOUNDARY ← 边界条件(固定 / 对称 / 销约束) │
│ *CLOAD / *DLOAD ← 载荷(集中力 / 分布力) │
│ │
│ *STEP ← 分析步 │
│ *STATIC ← 静力分析 │
│ *OUTPUT ← 输出控制 │
│ *END STEP │
│ │
└─────────────────────────────────────────────────────────────────┘3.4 可视化模块 (VTK)
输入: 几何数据 / 网格数据 / CalculiX 结果
处理: VTK 数据结构构建 → 渲染管线
输出: 图形窗口 / 截图 / .vtu 文件核心功能:
- 几何显示(线框 / 实体渲染)
- 网格显示(节点、单元、局部加密效果)
- 结果云图(应力、应变、位移)
- 变形叠加显示(将变形后形状叠加在原始形状上)
- 导出 .vtu 文件(可用 ParaView 打开)
4. 数据流总览
┌──────────────────────────────────────────────────────────────────────────────┐
│ 数据流总览 │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ STEP 文件 │ .stp / .step │
│ └──────┬───────┘ │
│ │ OCC 导入 │
│ ↓ │
│ ┌──────────────┐ GMSH API ┌──────────────┐ │
│ │ OCC 几何 │ ───────────→ │ 网格数据 │ .msh │
│ │ TopoDS_Shape│ │ 节点 + 单元 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ VTK 渲染 │ 格式转换 │
│ ↓ ↓ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 几何可视化 │ │ CalculiX │ │
│ │ 图形窗口 │ │ .inp 输入 │ │
│ └──────────────┘ └──────┬───────┘ │
│ │ │
│ │ CalculiX 求解 │
│ ↓ │
│ ┌──────────────┐ │
│ │ CalculiX │ │
│ │ .frd 结果 │ │
│ └──────┬───────┘ │
│ │ │
│ ↓ │
│ ┌──────────────┐ │
│ │ VTK 结果云图 │ │
│ │ 图形窗口 │ │
│ └──────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘5. 工具链汇总
┌────────────────────────────────────────────────────────────────────────────────┐
│ 工具链选型 │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 阶段 工具 接口 输出格式 │
│ ──────────────── ──────────────── ──────────────── ──────────────── │
│ │
│ 几何建模 OpenCASCADE C++ / Python TopoDS_Shape │
│ 几何可视化 VTK C++ / Python 图形窗口 │
│ 网格划分 GMSH C++ / Python / CLI .msh │
│ 求解器 CalculiX CLI (ccx) .frd │
│ 结果可视化 VTK / ParaView C++ / Python .vtu / 图形窗口 │
│ │
└────────────────────────────────────────────────────────────────────────────────┘6. 选型理由
┌────────────────────────────────────────────────────────────────────────────────┐
│ 技术选型理由 │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ OpenCASCADE (OCC) │
│ ├── 开源免费,学术和教育使用无限制 │
│ ├── B-Rep 数据结构完整 │
│ ├── 布尔运算成熟稳定 │
│ └── 原生支持 STEP / IGES 导入 │
│ │
│ VTK │
│ ├── 开源、跨平台 │
│ ├── 与 OCC 和 GMSH 集成良好 │
│ ├── 结果云图、变形显示功能成熟 │
│ └── 可导出 .vtu 用 ParaView 进一步分析 │
│ │
│ GMSH │
│ ├── 开源免费,内置 Python API,使用门槛低 │
│ ├── 支持 2D / 3D 四面体和六面体网格 │
│ ├── 与 OCC 几何无缝衔接 │
│ └── 可通过 API 精确控制网格参数 │
│ │
│ CalculiX │
│ ├── 开源免费,支持线性静力、非线性、模态、热分析 │
│ ├── 读取 INP 格式,与 GMSH 输出兼容 │
│ ├── 输出 .frd 可被 VTK 直接读取 │
│ └── 命令行运行,无需 GUI,学习成本低 │
│ │
└────────────────────────────────────────────────────────────────────────────────┘7. 集成难点与解决方案
┌────────────────────────────────────────────────────────────────────────────────┐
│ 集成难点与解决方案 │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 难点 1:OCC → GMSH 几何传递 │
│ ──────────────────────────────────────────────────────────────────────── │
│ 问题:GMSH 和 OCC 各自维护独立的几何表示,OCC 的 B-Rep 几何无法直接传给 │
│ GMSH,需要通过中间格式中转。 │
│ 解决: │
│ ├── 方案 A:STEP 中间文件(通用但有精度损失) │
│ │ OCC 导出 .step → GMSH 读取 .step │
│ ├── 方案 B:OCC → GMSH OCC 插件(GMSH 内置,质量保留好) │
│ │ gmsh::occ::importShapes() 直接读取 OCC 几何 │
│ └── 推荐:方案 B,通过 GMSH 的内置 OCC 模块直接操作几何,避免精度损失 │
│ │
│ 难点 2:GMSH → CalculiX 格式转换 │
│ ──────────────────────────────────────────────────────────────────────── │
│ 问题:GMSH 输出 .msh,CalculiX 读取 .inp,两者格式不同。 │
│ 解决: │
│ ├── 方案 A:GMSH 直接导出 INP 格式 │
│ │ gmsh::write("model.inp") → 需手动补充材料/边界条件 │
│ ├── 方案 B:GMSH 输出 .msh,自行写脚本转换为 .inp(灵活但工作量大) │
│ └── 推荐:方案 A,GMSH 原生支持 INP 导出,只需补充材料卡片和边界条件 │
│ │
│ 难点 3:CalculiX → VTK 结果读取 │
│ ──────────────────────────────────────────────────────────────────────── │
│ 问题:CalculiX 输出 .frd(文本格式),VTK 原生不支持直接读取。 │
│ 解决: │
│ ├── 方案 A:自行解析 .frd 文件,手动构建 VTK 数据结构 │
│ │ (工程量中等,结果数据字段需要逐一对应) │
│ ├── 方案 B:ccx 输出 .vtu(需 GMSH 后处理管道,工作流复杂) │
│ └── 推荐:方案 A,.frd 格式简单,节点结果 + 单元结果可按行解析,代码量可控 │
│ │
│ 难点 4:多语言 / 多库环境整合 │
│ ──────────────────────────────────────────────────────────────────────── │
│ 问题:OCC、VTK、GMSH 均为 C++ 库,编译依赖复杂,版本冲突风险高。 │
│ 解决: │
│ ├── 方案 A:纯 C++ 项目(性能最优,但 CMake 编译配置复杂) │
│ ├── 方案 B:Python 主程序(使用 OCC、gmsh、vtk 的 Python 绑定) │
│ │ 安装:pip install oce gmsh pyvista │
│ │ 优势:语法简洁、调试方便、模块解耦容易 │
│ └── 推荐:方案 B,适合课程项目开发周期短的场景,性能瓶颈暂不突出 │
│ │
│ 难点 5:CAD 几何质量(课程项目高频踩坑) │
│ ──────────────────────────────────────────────────────────────────────── │
│ 问题:从 CAD 导入的几何常有破面、裂缝、重叠面,导致网格生成失败。 │
│ 解决: │
│ ├── OCC 几何诊断:BRepAlgoAPI::ShapeAnalysis::CheckSolid() │
│ ├── OCC 几何修复:BRepBuilderAPI_MakeSolid + BRepTools::SameParameter() │
│ └── GMSH 兜底:启用几何修复选项 gmsh::option::setNumber("Geometry.Tolerance", 1e-3) │
│ │
└────────────────────────────────────────────────────────────────────────────────┘8. 集成接口汇总
┌────────────────────────────────────────────────────────────────────────────────┐
│ 接口对接矩阵 │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 环节 接口方式 关键问题 推荐方案 │
│ ────────────── ──────────────── ──────────────────── ────────────────── │
│ │
│ OCC → GMSH GMSH OCC 模块 几何精度损失 occ::importShapes() │
│ GMSH → CalculiX INP 文件写入 字段映射完整性 write() + 手动补卡 │
│ CalculiX → VTK .frd 解析 行格式解析 字符串解析 + VTK API │
│ OCC → VTK STEP 中转 / BREP 拓扑丢失 BREP → Poly 数据 │
│ │
└────────────────────────────────────────────────────────────────────────────────┘9. 局限性说明
本架构作为课程项目基线,以下内容属于进阶扩展方向:
┌────────────────────────────────────────────────────────────────────────────────┐
│ 超出本期范围 │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ · 复杂边界条件(接触分析、螺栓预紧) │
│ · 多物理场耦合(热-结构耦合、流-固耦合) │
│ · 网格自适应加密 │
│ · 分布式并行计算 │
│ · CAD 几何清理(破面修复、特征简化) │
│ · 拓扑优化 │
│ │
└────────────────────────────────────────────────────────────────────────────────┘10. 快速参考
┌────────────────────────────────────────────────────────────────────────────────┐
│ 快速参考卡片 │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ OCC 负责:几何建模 + 布尔运算 + 格式导入 关键词:B-Rep、STEP │
│ GMSH 负责:网格生成 + 质量检查 + 格式导出 关键词:.msh、四面体 │
│ VTK 负责:几何显示 + 网格显示 + 结果云图 关键词:渲染、云图 │
│ CCX 负责:结构 / 热求解 关键词:.inp、.frd │
│ │
│ 数据链路: │
│ .step → (OCC) → 几何对象 → (GMSH) → .msh → (CCX) → .frd → (VTK) → 云图 │
│ │
└────────────────────────────────────────────────────────────────────────────────┘11. 参考资料
- OCC 文档:https://dev.opencascade.org/doc/overview/html/
- GMSH:https://gmsh.info/
- CalculiX:http://www.calculix.de/
- VTK:https://vtk.org/
学习状态:架构设计完成