软件工程与计算流程 · Software Engineering & Workflow
仿真软件不是「把方程写进代码」这么简单。 这一部分更多讲:我是怎么理解现有软件、怎么设计自研代码的架构,以及一条完整的计算流程是如何搭起来的。
1. 软件调研与认识(Software Survey & Understanding)
在写任何一行自研代码之前,先搞清楚:别人已经做到了哪一步, 哪些是成熟的工程能力,哪些是空白,哪些是「需要但现有工具做得不够好」。
-
1.1 商业 CAE / CFD 软件认知
Abaqus / Ansys / LS-DYNA / Nastran / Radioss / HyperMesh 等,分别擅长:
非线性结构、多场耦合、冲击碰撞、优化设计、前处理等。
相关笔记: 结构有限元商业软件的功能定位与适用场景(个人笔记) -
1.2 开源软件生态
OpenFOAM / SU2 / Code_Saturne / CalculiX / Code_Aster 等,
它们分别适合用来当「工程工具」、「研究平台」还是「架构参考」。
相关笔记: 开源仿真 / CAE 软件调研(第一版) - 1.3 自己要做什么 & 不做什么 在仿真软件这个巨大的空间里, 划清我自己的关注边界:重点在 CFD 求解器和发动机相关应用, 不试图做一个「什么都做一点」但哪一块都很浅的平台。
2. 软件工程:从代码到架构(Software Engineering)
这一块更多是「写给工程师看的」,不是卖弄模式设计, 而是讲如何用有限的精力,把 CFD 这种复杂系统拆成可维护的代码。
-
2.1 代码基础(Code Basics)
- 现代 C++ 约定:命名、RAII、智能指针、error handling、日志与断言。
- 目录组织:
include/、src/、tests/、tools/等。 - 配置管理:CMake、vcpkg、编译选项、编译数据库(clangd / clang-tidy)。
-
2.2 架构设计(Architecture)
- 网格 / 物理模型 / 求解器 / IO 的解耦与依赖方向。
- 如何设计「插件式」的模型系统:湍流模型、多相模型、边界条件可插拔。
- 面向算例的配置系统:输入文件结构、命令行覆盖、默认参数策略。
-
2.3 质量保障(Quality & Reliability)
- 单元测试 / 回归测试:哪些函数值得测,哪些算例要固定下来。
- 算例库管理:把工程算例变成「资产」,而不是一次性脚本。
- 编码规范、代码评审、CI/CD:尤其是多人成本地长期维护的情况下。
-
2.4 与现有软件的协同(Interop)
- 网格格式适配:Fluent mesh、CGNS、SU2、VTK 等常见格式的读写。
- 后处理接口:VTK / Tecplot / ParaView 等开源/商用后处理工具。
- 在现有工程流程中「插进去」,而不是要求用户全部推倒重来。
3. 计算流程(Simulation Workflow)
计算流程这块,我习惯按「代码基础 → 高级流程 → HPC」三层来看, 而不是一上来就谈集群和超算。
-
3.1 基础流程:单算例跑通
- 从「网格 + 物理参数 + 控制参数(时间步长、迭代上限等)」到一次完整模拟; 中间需要哪些最基本的检查(残差、守恒量、简单场变量分布)。
- 日志设计:既能被人类看懂,又方便后续脚本/工具解析。
-
3.2 高级流程:复杂工况与批量计算
- 多载荷步、多工况:转速扫线、攻角扫线、温度工况组合等。
- restart / 热启动:长期计算如何从中间状态接着算。
- 参数扫描与自动化脚本:一套算例多参数跑,如何组织目录和结果。
-
3.3 HPC 流程:从单机到集群
- 作业脚本:Slurm 等队列系统下的
sbatch/srun脚本模板。 - 并行划分策略:按区域 / 按拓扑 / 按负载的不同划分方式。
- 性能分析:如何用简单的 profiling 手段看出瓶颈在哪一层(算子、通信、I/O)。
- 作业脚本:Slurm 等队列系统下的
4. 我的实践(My Practice)
目前在做的几条线,大致可以归结为:
- 自研可压缩 CFD 求解器的架构演化(从单文件原型到分层结构)。
- 在自研芯片上的部署:如何把矩阵求解 / 关键算子抽象出来,挂到硬件加速上。
- 围绕这些代码搭配测试体系、算例库、以及简单的 CI/CD 流程。