工业软件基础与架构 / Industrial Software Fundamentals and Architecture
本模块先回答“工业软件解决什么问题”,再沿数据流拆解 CAD/CAE 平台,而不是从界面或某个商业产品入手。
基础架构的核心问题是如何让同一份工程语义安全地穿过多个表示。设计人员操作几何和参数,网格器生成离散拓扑,求解器消费矩阵或控制体,后处理读取场数据;如果模块只交换裸数组而没有单位、坐标系、实体身份和版本,错误就会在边界处悄悄扩散。
1. 领域模型是架构起点
工业软件首先描述领域对象,而不是按钮和数据库表。
典型对象包括:
- 几何体与拓扑实体;
- 网格节点、单元和集合;
- 材料与属性;
- 载荷、约束和工况;
- 分析步和求解配置;
- 场变量和历史结果;
- 文档版本和派生缓存。
每种对象需要定义身份、所有权、生命周期和不变量。
Domain Object
├─ stable identity
├─ semantic attributes
├─ ownership
├─ revision
├─ validation rules
└─ references to other objects如果对象只有数组下标作为身份,插入、删除和重排后引用会失效。 稳定 ID 用于跨模块、保存、撤销和后台任务关联。
2. 源数据与派生数据
源数据表达用户或外部系统确认的事实。 派生数据可以从源数据和算法重新生成。
常见派生数据包括:
- 空间索引;
- 邻接表;
- 网格质量指标;
- 求解矩阵;
- 后处理统计;
- 渲染 Buffer;
- 缩略图;
- 搜索索引。
source revision
-> algorithm version + parameters
-> derived artifact派生对象必须记录输入版本。 上游变化后,应失效或重新生成,不能继续冒充当前状态。
缓存丢失不应破坏工程文件。 如果一个对象无法重建,它就不只是缓存,需要进入正式数据模型。
3. 单位、坐标系与精度
数值缺少单位和坐标系时没有完整工程含义。
字段至少需要:
- 物理量类型;
- 单位;
- 坐标系;
- 分量顺序;
- 标量精度;
- 位置;
- 时间或分析步。
单位转换应发生在明确边界,并记录来源。 不能由界面显示字符串暗示内部单位。
局部坐标系需要原点、基向量和手性。 转换前要检查基向量是否有效、正交和可逆。
浮点比较使用领域容差。 容差不能在各模块中散落硬编码。
4. 文档与事务
Document 是工程状态的权威所有者。 View 只展示状态并发送用户意图。
User Intent
-> Command validation
-> transactional model change
-> revision increment
-> change notification
-> derived views rebuildCommand 封装一次可理解的业务操作。 它保存执行和撤销所需的数据,而不是直接保存临时 UI 对象。
事务保证修改全部成功或完全不生效。 导入或参数化建模失败时,不能留下半个 Part 或部分集合。
Dirty 状态绑定具体 Document revision。 后台保存旧 revision 成功,不能清除用户后续编辑产生的 dirty。
5. 文件读取
读取流程应先构造候选文档,成功后再切换当前文档。
open file
-> bounded parse
-> schema migration
-> semantic validation
-> build candidate Document
-> commit as current Document解析器防御:
- 超大数量;
- 整数溢出;
- 越界索引;
- 循环引用;
- 过深递归;
- 压缩炸弹;
- 非法编码;
- 截断数据。
错误应包含文件位置、对象 ID、字段和原因。 只返回“打开失败”会让用户和开发者都无法行动。
6. 文件保存
可靠保存使用临时文件和原子替换。
serialize revision N
-> temporary file
-> flush and validate
-> atomic replace
-> confirm revision N saved磁盘写满、权限失败或进程崩溃时,旧文件应保持可用。
格式需要 Schema 版本和迁移策略。 未知扩展数据应按协议保留或明确拒绝,不能静默丢失。
7. 长任务架构
导入、网格、求解和结果处理必须离开 GUI 主线程。
任务输入在启动时形成不可变快照,并携带 Document ID 和 revision。
submit task(revision N)
-> queued
-> running
-> progress / checkpoint
-> candidate result
-> revision check
-> commit or reject任务状态包括排队、运行、取消中、成功、失败和已取消。
取消是协作式协议。 任务在安全点检查请求并释放资源,不能粗暴终止线程。
关闭文档时先禁止新任务,再取消、等待和销毁。 第三方代码仍在运行时卸载模块会产生悬空代码引用。
8. GUI 与领域模型
GUI 控件不是领域数据所有者。 属性面板编辑的是 Command 草稿,确认后才进入 Document 事务。
Model/View 适合大表格和树。 View 通过索引访问 Model,不能复制百万行到独立 Widget 对象。
Selection 应使用稳定领域 ID。 排序、过滤或模型重置后,临时行号不能继续代表同一实体。
后台结果通过队列回到 GUI 线程提交。 Worker 不能直接访问 QWidget 或渲染 Context。
9. 渲染资源
Scene 和 GPU 资源是 Document 的派生表示。
Document revision
-> Scene generation
-> CPU render data
-> GPU buffers and textures
-> frame后台生成完成时检查 Scene generation。 旧场景结果不能覆盖用户已经切换的新文档或新显示模式。
GPU 资源通常必须在拥有 Context 的线程创建和释放。 关闭顺序需要先停止上传和绘制,再释放 Buffer,最后销毁 Context。
设备丢失后应能从 Document 重建场景。
10. 插件边界
插件适合独立格式、算法、求解器和后处理能力。 宿主与插件之间需要稳定接口和版本协商。
边界必须说明:
- ABI 和调用约定;
- 对象所有权;
- 字符串和容器编码;
- 错误传播;
- 线程与回调;
- 注册和卸载;
- 权限和隔离;
- 项目私有数据迁移。
领域数据由宿主持有。 插件卸载后不能留下函数指针、虚对象或活动任务。
11. Verification 与 Validation
Verification 检查软件是否正确实现模型和算法。 Validation 检查模型是否代表真实问题。
Verification 证据包括:
- 单元与属性测试;
- 解析解和制造解;
- 网格收敛;
- 守恒与残差;
- 串并行对照;
- 可信软件比较;
- Checkpoint 重启一致性。
Validation 需要实验、现场数据、适用域和不确定性。 求解器报告收敛不能替代 Validation。
12. 性能与规模
性能从数据流和端到端目标分析。
需要分项测量:
- 文件解析;
- 几何与网格;
- 组装与求解;
- 结果读取;
- CPU/GPU 数据上传;
- 交互帧时间;
- 保存与恢复;
- 峰值内存。
减少数据移动通常比微调少量算术指令更稳定。 局部加速必须回到完整工作流验证。
13. 测试分层
基础架构应具备:
- 领域规则单元测试;
- 文件格式往返测试;
- 坏文件与边界测试;
- 文档事务和撤销测试;
- 任务取消和关闭测试;
- 插件兼容测试;
- 数值 Verification;
- 大规模性能基准;
- 部署升级与回滚测试;
- 真实工程端到端测试。
测试产物记录软件、数据和环境版本。
文章地图
核心数据链
几何拓扑
→ 网格与集合
→ 材料 / 属性 / 载荷 / 约束
→ 求解输入与运行状态
→ 节点场 / 单元场 / 历史曲线
→ 可视化对象与报告每个环节都要同时考虑单位、坐标系、标识稳定性、版本兼容和错误诊断。工业软件的大量复杂度来自数据语义跨模块流动,而不只是数值算法本身。
数据对象与派生关系
参数与几何拓扑
-> 网格策略 -> Mesh revision
-> 工况映射 -> Analysis Model revision
-> 求解输入 -> Result revision
-> 表示缓存 -> Scene generation箭头后的对象通常是派生数据。上游变化后,下游不能继续被当作最新结果:几何面被删除时,绑定其上的压力载荷需要报告悬空引用;网格变化时,旧节点场不能按数组下标直接套用;模型已经编辑到 revision 8 时,后台 revision 7 的求解结果不能覆盖当前文档。显式版本和稳定领域 ID 是正确提交的基础。
模块边界应传递语义
文件格式模块负责语法、版本迁移和诊断,不应决定求解流程。文档模型拥有工程状态和撤销事务,视图只观察并发出用户意图。网格与求解 Kernel 适合使用紧凑 POD 数据,不应为百万节点创建 QObject。后处理维护字段位置、分量、精度和时间步,而不是只保存一块无类型浮点数组。
长任务通过任务服务或 Worker 执行,输入应在启动时形成不可变快照。取消是协作协议:任务在安全点检查停止请求、释放临时资源并报告终态。强行终止线程可能破坏文件、锁和第三方库状态。
从原型走向产品
原型可以把导入、计算和显示写在一个函数中,产品则需要应对坏文件、版本升级、超大模型、插件异常、磁盘不足和设备丢失。保存操作应先写临时文件、刷新并原子替换,失败时保留旧文件和 dirty 状态;加载操作应先校验并建立新文档,成功后再替换当前文档。
架构评审时应沿一条真实工作流追踪对象出生、所有权、版本和失败恢复,而不是只检查类图是否分层。能够回答“这个对象何时失效、谁能修改、后台结果如何提交”,才说明边界真正可执行。
完成标准
- 能解释 CAD、CAE、CAM、PLM 的职责边界;
- 能描述一次仿真的前处理—求解—后处理链路;
- 能区分几何、网格、模型、工况和结果数据;
- 能为模块选择稳定的数据接口和文件格式;
- 能画出桌面端、服务层、任务系统、求解器和存储的边界。
完成标准还包括:能为一次失败导入或取消求解描述恢复路径,能区分源数据和缓存,能说明 V&V 证据如何关联到软件版本与输入模型。