OpenFOAM并行计算

分类:解析 | 综合版 2026-04-06
CAE visualization for openfoam parallel theory - technical simulation diagram
OpenFOAM并行计算

OpenFOAM并行计算的理论基础

概述

🧑‍🎓

老师!今天要讲OpenFOAM并行计算是吧?这是什么东西呢?


🎓

scotch、hierarchical、simple等decomposePar字典的区域分割和MPI并行执行的设置方法。可扩展性的优化和负载均衡。


🧑‍🎓

听到这里,并且为什么很重要,终于理解了!


控制方程


🎓

用公式来表示就像这样。


$$S_p = \frac{T_1}{T_p}, \quad E_p = \frac{S_p}{p}$$

🧑‍🎓

嗯,只看公式有点不理解…这表示什么呢?


🎓

Amdahl定律:



$$S_p = \frac{1}{(1-f) + f/p}$$

理论基础

🧑‍🎓

"理论基础"我听过,但可能没有真正理解…


🎓

OpenFOAM并行计算的数值解法基于有限体积法(FVM)或有限元素法(FEM)。作为开源软件,最大优势是能在源代码级验证和修改离散化方案和收敛判定逻辑,这些在商业求解器中是黑盒操作。通过社区的持续改进和bug修复来保证品质。


🧑‍🎓

啊~并行计算的数值解法的话,太有意思了!请继续讲。


许可和使用条件

🧑‍🎓

接下来是"许可和使用条件"吧!这是什么内容呢?


🎓

开源许可证(GPL、LGPL、Apache、BSD等)的种类因改变代码的公开义务和商业使用的限制而异。建议在项目使用前确认许可条件,与公司法务部门进行事前协商。派生作品的处理和双重许可的可能性也需检查。


🧑‍🎓

啊~开源许可证的话,太有意思了!请继续讲。


数值解法的理论背景

🧑‍🎓

接下来是"数值解法的理论背景"吧!这是什么内容呢?


🎓

解说开源CAE工具实现的数值解法的理论基础。



有限元素法(FEM)的变分原理

🧑‍🎓

请讲解"有限元素法"!


🎓

结构解析的基础——最小势能原理:



$$ \Pi(\mathbf{u}) = \frac{1}{2} \int_{\Omega} \boldsymbol{\sigma} : \boldsymbol{\varepsilon} \, d\Omega - \int_{\Omega} \mathbf{f} \cdot \mathbf{u} \, d\Omega - \int_{\Gamma_t} \mathbf{t} \cdot \mathbf{u} \, d\Gamma $$


🎓

使 $\Pi$ 临界的位移场 $\mathbf{u}$ 就是平衡解。CalculiX和Code_Aster实现了基于这个变分原理的Galerkin法。




有限体积法(FVM)的保存律

🧑‍🎓

请讲解"有限体积法"!


🎓

OpenFOAM采用的FVM基于控制体积的积分保存律:



$$ \frac{\partial}{\partial t} \int_{V} \rho \phi \, dV + \oint_{S} \rho \phi \mathbf{u} \cdot d\mathbf{S} = \oint_{S} \Gamma \nabla \phi \cdot d\mathbf{S} + \int_{V} S_\phi \, dV $$


🎓

将这个积分形式应用到各个控制体积,对面上的通量进行数值评估从而得到离散方程。



许可和品质保证

🧑‍🎓

请讲解"许可和品质保证"!


🎓

开源CAE因为源代码公开,第三方能验证算法。另一方面,由于没有像商业工具那样的供应商支持,用户社区和论坛的信息共享很重要。


🧑‍🎓

啊~开源的话,太有意思了!请继续讲。


适用条件和注意事项

🧑‍🎓

"适用条件和注意事项"我听过,但可能没有真正理解…


🎓
  • OSS工具的结果必须用已知的基准问题进行验证
  • 注意版本间的不兼容性(特别是OpenFOAM fork间的差异)
  • 建议与商业工具的结果比较来确认OSS的精度
  • 文档不足时,需要直接查看源代码

  • 🧑‍🎓

    等等,工具的结果是,意思是这种情况也能用吗?


    无量纲参数和支配性尺度

    🧑‍🎓

    "无量纲参数和支配性尺度"我听过,但可能没有真正理解…


    🎓

    对解析对象主要物理现象的无量纲参数的理解是适当模型选择和参数设置的基础。


    🎓
    • Peclet数 Pe:对流和扩散的相对重要性。Pe >> 1时对流支配(需要稳定化方法)
    • Reynolds数 Re:惯性力和粘性力的比。流体问题的基本参数
    • Biot数 Bi:内部传导和表面对流的比。Bi < 0.1时可用集中热容法
    • Courant数 CFL:数值稳定性指标。显式法需 CFL ≤ 1

    • 🧑‍🎓

      啊,这样!解析对象的物理现象是这么一回事啊。



      量纲分析验证

      🧑‍🎓

      请讲解"量纲分析验证"!


      🎓

      对解析结果的阶数估计,基于Buckingham Π定理的量纲分析很有效。用代表长度 $L$、代表速度 $U$、代表时间 $T = L/U$ 来事前推定各物理量的阶,确认解析结果的合理性。



      边界条件的分类和数学特征

      🧑‍🎓

      边界条件嘛,我听说设错了会全部完蛋…


      种类数学表达物理意义例子
      Dirichlet条件$u = u_0$ on $\Gamma_D$变量值的指定固定壁、温度指定
      Neumann条件$\partial u/\partial n = g$ on $\Gamma_N$梯度(通量)的指定热流束、力
      Robin条件$\alpha u + \beta \partial u/\partial n = h$变量和梯度的线性组合对流换热
      周期边界条件$u(x) = u(x+L)$空间周期性单元胞分析
      🎓

      适当的边界条件选择与解的唯一性和物理合理性直接相关。不足的边界条件会导致适定问题,过多的边界条件会产生矛盾。



      🧑‍🎓

      OpenFOAM并行计算的整体想法我理解了!明天开始就实际应用看看。


      🎓

      嗯,状态不错!实际上手操作才是最好的学习。有不懂的随时问。


      Coffee Break 杂谈

      区域分割法(DD法)的数学背景——与Schwarz交替法的关系

      OpenFOAM的并行计算基于scotch或metis的区域分割(Domain Decomposition),这个方法的数学起源于19世纪Hermann Amandus Schwarz提出的"Schwarz交替法"。通过在重叠区域交替求解PDE并在边界交换信息直到收敛的思想。现代并行CFD一般用非重叠区域分割,但通过处理processor之间的"ghost(halo)cell"来虚拟实现物理上的重叠信息交换。OpenFOAM处理的procBoundary就是这个ghost cell交换的实现。分散内存并行的效率取决于"通信与计算的比",为了减少这个比值,scotch通过优化区域形状使其接近球形。

      OpenFOAM并行计算的数值计算方法

      数值方法的详细

      🧑‍🎓

      具体怎样用算法来求解OpenFOAM并行计算呢?


      🎓

      解说OpenFOAM并行计算的数值解法和实现的要点。


      🧑‍🎓

      那么并行计算的数值解法弄懂了的话,基本上就没问题了?


      编译和构建

      🧑‍🎓

      "编译和构建"我听过,但可能没有真正理解…


      🎓

      从源代码编译需要用CMake或专用构建系统(OpenFOAM的wmake等)。依赖库(MPIPETSc、BLAS/LAPACK等)的恰当版本管理很重要。Linux环境推荐,但用WSL2或Docker容器也可在Windows上构建。


      🧑‍🎓

      也就是说源代码的部分手工省略的话,以后会被打脸吧。记住了!


      输入文件的构成

      🧑‍🎓

      跨越不同软件间传输数据的注意点有吗?


      🎓

      理解case文件的结构和主要参数设置是实现的第一步。字典文件(dict)和命令文件的格式各软件固有,从官方教程模板编辑效率最高。



      脚本自动化

      🧑‍🎓

      "脚本自动化"我听过,但可能没有真正理解…


      🎓

      用Python或Bash脚本自动化参数研究是提高生产力的关键。也应考虑使用PyFoam或cfMesh之类的包装工具。



      调试和开发环境


      🎓

      GDB、Valgrind、AddressSanitizer进行内存泄漏检测和调试很有效。利用IDE(VSCode、CLion)的远程调试功能,构建高效的开发环境。引入单元测试框架(Google Test、pytest),自动化回归测试。



      求解器设置和算法

      🧑‍🎓

      想更详细地了解计算背后发生了什么!



      OpenFOAM求解器选择指南

      🧑‍🎓

      求解器选择指南,具体是什么意思?


      求解器用途方程系
      simpleFoam定常不可压缩乱流SIMPLE
      pimpleFoam非定常不可压缩PIMPLE (PISO+SIMPLE)
      interFoam两相流(VOF)MULES
      rhoSimpleFoam定常可压缩SIMPLE
      buoyantSimpleFoam自然对流SIMPLE+Boussinesq
      reactingFoam燃烧PIMPLE+化学反应

      CalculiX输入文件结构

      🧑‍🎓

      输入文件结构,具体是什么意思?


      🎓

      ```

      *NODE


      🎓

      1, 0.0, 0.0, 0.0

      ...


      🎓

      *ELEMENT, TYPE=C3D8

      1, 1, 2, 3, 4, 5, 6, 7, 8


      🎓

      ...

      *MATERIAL, NAME=STEEL


      🎓

      *ELASTIC

      210000., 0.3


      🎓

      *DENSITY

      7.85e-9


      🎓

      *STATIC


      🎓

      *BOUNDARY

      1, 1, 3


      🎓

      *CLOAD

      100, 2, 1000.


      🎓

      *END STEP

      ```


      🧑‍🎓

      啊,这样!求解器选择指南是这么一回事啊。



      Code_Aster命令文件结构

      🧑‍🎓

      接下来是命令文件结构的话题。什么内容?


      🎓

      ```

      DEBUT()


      🎓

      MAIL = LIRE_MAILLAGE()

      MODELE = AFFE_MODELE(MAILLAGE=MAIL, ...)


      🎓

      RESULT = MECA_STATIQUE(MODELE=MODELE, ...)

      FIN()


      🎓

      ```




      离散化方案的选择

      🧑‍🎓

      请讲解"离散化方案的选择"!


      🎓

      OpenFOAM的离散化方案在 `fvSchemes` 文件中设定。对流项的离散化对精度和稳定性影响很大:


      🧑‍🎓

      听到这里,求解器选择指南为什么重要,终于理解了!


      🎓
      • upwind:1阶精度,稳定但数值扩散大
      • linearUpwind:2阶精度,有限制
      • limitedLinear:2阶精度,TVD限制
      • LUST:混合方案,LES推荐


      • 误差评估和精度验证

        🧑‍🎓

        "误差评估和精度验证"我听过,但可能没有真正理解…



        离散化误差的评估

        🧑‍🎓

        离散化误差的评估,具体是什么意思?


        🎓

        用Richardson外推法进行离散化误差的推定:



        $$ f_{\text{exact}} \approx f_h + \frac{f_h - f_{2h}}{r^p - 1} $$


        🎓

        这里 $f_h$ 是网格宽度 $h$ 的解,$r$ 是网格比,$p$ 是离散化的阶数。




        GCI(Grid Convergence Index)

        🧑‍🎓

        请讲解"GCI"!


        🎓

        基于ASME V&V 20-2009的网格收敛性定量评估:


        🧑‍🎓

        听到这里,离散化误差的评估为什么重要,终于理解了!


        🎓

        用公式来表示就像这样。


        $$ GCI_{\text{fine}} = \frac{F_s |\varepsilon|}{r^p - 1} $$

        🧑‍🎓

        嗯,只看公式有点不理解…这表示什么呢?


        🎓

        安全系数 $F_s = 1.25$(3水平以上的网格比较时)。GCI < 5% 作为收敛目标。


        🧑‍🎓

        前辈说"离散化误差的评估一定要好好做",现在理解了。



        验证基准问题

        🧑‍🎓

        请讲解"验证基准问题"!


        🎓

        为了确保分析结果的可信性,建议与以下基准问题比较:


        领域基准参考解
        结构补片测试一致应力场的再现
        结构Scordelis-Lo屋顶参考位移
        流体驱动腔流Ghia et al. (1982)
        1D解析解$T(x) = T_0 + (T_1-T_0)x/L$

        高速化方法

        🧑‍🎓

        老师,请讲解"高速化方法"!


        🎓
        • 多网格(AMG)前处理:大规模问题的可扩展性提升
        • GPU并行化:矩阵-向量积的GPU卸载
        • 区域分割法:MPI并行的分散内存计算
        • 约简基方法(ROM:参数研究的高速化


        • 🧑‍🎓

          OpenFOAM并行计算的整体想法我理解了!明天开始就实际应用看看。


          🎓

          嗯,状态不错!实际上手操作才是最好的学习。有不懂的随时问。


          Coffee Break 杂谈

          scotch和metis的差异与OpenFOAM默认设置的意图

          OpenFOAM的decomposePar字典可选择scotch、metis、simple、hierarchical等多种区域分割法。默认的scotch用Graph分割算法,优化处理器间的"接口面积"(=通信量)最小化。而metis是古典的多阶段二分割算法,在大规模网格上的分割品质往往不如scotch。实务上关键点是"分割数是否与CPU核心数一致"。用128核计算却写了numberOfSubdomains 64的话,全核不被使用,某些rank会分配2个网格导致MPI通信混乱。分解器执行后应确认processor*/目录数与核心数相符。

          OpenFOAM并行计算的实务应用

          实践指南

          🧑‍🎓

          老师,请讲解"实践指南"!


          🎓

          解说实务中活用OpenFOAM并行计算的分析步骤和最佳实践。


          🧑‍🎓

          老师的讲解很清楚!并行计算活用的疑惑消除了。


          解析流程

          🧑‍🎓

          从最初的一步开始教我!该从何处开始?


          🎓

          1. 几何体准备:CAD数据导入和清理(推荐STL/STEP格式)

          2. 网格生成:单元类型和尺寸的恰当选择,边界层网格的设置


          🎓

          3. 物理模型设置:材料特性·边界条件·初始条件的定义和单位系的确认

          4. 求解器执行:残差收敛的监视和日志文件中的进度确认


          🎓

          5. 后处理·验证:用ParaView等进行结果可视化和物理合理性确认



          最佳实践

          🧑‍🎓

          老师,请讲解"最佳实践"!


          🎓
          • 从官方教程案例出发建立问题,逐步积累知识
          • 用版本管理(Git)跟踪case文件的变更,确保再现性
          • 网格独立性的确认(3阶以上网格密度的对比验证)
          • 与实验值或解析解进行验证(V&V)必须实施,保证结果可信性

          • 🧑‍🎓

            啊~官方教程案例的话,太有意思了!请继续讲。


            品质保证和文档化

            🧑‍🎓

            实务中用OpenFOAM并行计算时,最要注意的是什么?


            🎓

            系统地文档化分析条件、网格设置、物理模型选择根据、验证结果。制定分析操作手册(SOP),推进团队内知识共享和工作标准化。建立分析结果审查流程,组织上管理品质。



            实务教程

            🧑‍🎓

            实务中用OpenFOAM并行计算时,最要注意的是什么?



            OpenFOAM基本执行步骤

            🧑‍🎓

            接下来是基本执行步骤的话题。什么内容?


            🎓

            ```

            # 1. 案例目录的创建


            🎓

            mkdir -p myCase/{0,constant,system}


            🎓

            blockMesh # 结构网格


            🎓

            # 或

            snappyHexMesh -overwrite # 非结构网格(STL形状输入)


            🎓

            # 3. 网格品质确认

            checkMesh


            🎓

            # 4. 初始·边界条件的设置

            # 0/ 目录内置放 U, p, k, omega 等


            🎓

            # 5. 求解器执行

            simpleFoam > log.simpleFoam 2>&1 &


            🎓

            # 6. 残差监视

            foamMonitor -l postProcessing/residuals/0/residuals.dat


            🎓

            paraFoam # 用ParaView可视化


            🎓

            ```


            🧑‍🎓

            啊,这样!基本执行步骤是这么一回事啊。



            CalculiX基本执行步骤

            🧑‍🎓

            接下来是基本执行步骤的话题。什么内容?


            🎓

            ```

            # 1. 网格生成(用Gmsh等创建,以.inp格式输出)


            🎓

            gmsh model.geo -3 -format inp -o model.inp



            🎓

            # 2. CalculiX执行

            ccx model


            🎓

            # 3. 结果确认

            cgx model.frd # 用CalculiX GraphiX可视化


            🎓

            ```


            🧑‍🎓

            听到这里,基本执行步骤为什么重要,终于理解了!



            网格品质基准

            🧑‍🎓

            请讲解"网格品质基准"!


            指标OpenFOAM推荐值CalculiX推荐值
            纵横比< 20< 5
            非直交性< 65° (警告) / < 70° (错误)
            偏斜度< 4< 0.8
            y+ (壁面)30-300 (壁函数) / < 1 (壁解析)

            并行计算的设置

            🧑‍🎓

            并行计算的设置,具体是什么意思?


            🎓

            ```

            # OpenFOAM:区域分割


            🎓

            decomposePar -method scotch

            mpirun -np 8 simpleFoam -parallel > log 2>&1


            🎓

            reconstructPar

            ```



            项目管理和工作流自动化

            🧑‍🎓

            想大概了解一下整体流程,各步骤分别讲一下?



            推荐的目录结构

            🧑‍🎓

            接下来是推荐的目录结构的话题。什么内容?


            🎓

            ```

            project/


            🎓

            ├── cad/ # CAD模型

            ├── mesh/ # 网格文件


            🎓

            ├── setup/ # 分析设置文件

            ├── results/ # 计算结果


            🎓

            │ ├── case01/

            │ ├── case02/


            🎓

            │ └── ...

            ├── postprocess/ # 后处理脚本·图像


            🎓

            ├── report/ # 报告

            └── validation/ # 验证数据


            🎓

            ```



            自动化脚本的活用

            🧑‍🎓

            接下来是自动化脚本的活用的话题。什么内容?


            🎓

            参数研究和网格收敛性确认可用Python脚本自动化,大幅提高再现性和效率。


            🧑‍🎓

            那么目录结构的准的话,基本上就没问题了?



            审查检查清单

            🧑‍🎓

            请讲解"审查检查清单"!


            🎓

            1. 输入数据:材料常数的单位系、CAD的尺寸精度、网格品质指标

            2. 边界条件:物理合理性、过约束/欠约束的检查


            🎓

            3. 求解器设置:收敛判定基准、时间步、输出频率

            4. 结果验证:力的平衡、能量平衡、与理论解的比较


            🎓

            5. 敏感度分析网格依赖性、边界条件的影响、材料参数的不确定性


            🧑‍🎓

            也就是说目录结构的准的部分手工省略的话,以后会被打脸吧。记住了!


            报告书制作的要点

            🧑‍🎓

            老师,请讲解"报告书制作的要点"!


            🎓
            • 以再现可能的级别记述分析条件(网格、材料、边界条件
            • 明示网格收敛性的确认结果
            • 定量记述结果的不确定性(网格误差、模型误差、输入数据误差)
            • 附加已知基准问题或实验数据的比较结果


            • 🧑‍🎓

              OpenFOAM并行计算的整体想法我理解了!明天开始就实际应用看看。


              🎓

              嗯,状态不错!实际上手操作才是最好的学习。有不懂的随时问。


              Coffee Break 杂谈

              mpirun的参数不懂——OpenFOAM并行启动命令的读法

              用OpenFOAM并行运算时打 `mpirun -np 8 simpleFoam -parallel` 这条命令,但不理解各要素的人很容易掉坑。`-np 8` 是MPI rank的数(处理器数),需与decomposePar字典的numberOfSubdomains一致。在集群环境下需传入hostfile或machinefile来指定节点,比如 `mpirun --hostfile hosts -np 32 icoFoam -parallel`。在HPC环境(SLURM/PBS)常用srun或mpiexec而不是mpirun,作业脚本的写法因环境而异。"明明在跑但其实单核"的失败用htop目视CPU使用率就能防止。

              OpenFOAM并行计算的软件比较

              商业工具的比较

              🧑‍🎓

              那做OpenFOAM并行计算有什么软件能用呢?


              🎓

              对OpenFOAM并行计算进行同等功能的商业工具比较。



              比较表

              🧑‍🎓

              预算和时间都有限,哪个成本效益最好?


              视点开源软件商业求解器
              成本免费(人工费必需)年间数百万日元~
              支持社区/付费支持官方技术支持
              GUI有限(需单独工具)综合GUI操作性良好
              验证用户承担V&V供应商方验证完毕
              定制性源代码改变自由API/UDF有限
              学习成本高(文档分散)低(体系化培训)

              选型指南

              🧑‍🎓

              究竟怎么选,判断基准教一下?


              🎓

              教育·研究用途OSS最优。量产设计流程中商业工具的支持体系和GUI操作性生产力更占优。混合运用(OSS进行手法开发·验证→商业工具量产展开)也是很多企业采用的有效战略。



              迁移战略

              🧑‍🎓

              "迁移战略"我听过,但可能没有真正理解…


              🎓

              从商业求解器往OSS迁移或反向迁移时,需事前制定输入文件格式变换工具、结果比较验证手段、教育培训计划。分阶段迁移(先从部分解析开始)是现实的做法。设定OSS和商业的并行运用期,降低风险。



              OSS工具 vs 商业工具比较

              🧑‍🎓

              做OpenFOAM并行计算有什么软件能用呢?


              项目OpenFOAMAnsys FluentCOMSOL
              初期成本免费数百万日元/年数百万日元/年
              源代码公开(GPL)非公开非公开
              GUI无(文本基)充实充实
              网格工具snappyHexMeshFluent MeshingCOMSOL内置
              并行可扩展性优秀(数千核)优秀中等
              支持社区官方支持官方支持
              多物理有限
              定制性◎(C++扩展)△(UDF)△(Java API)
              项目CalculiXAbaqusAnsys Mechanical
              初期成本免费数百万日元/年数百万日元/年
              输入互换性Abaqus兼容
              非线性解析
              接触解析
              动解析
              GUICGX(有限)CAE(充实)Workbench

              导入判断的基准

              🧑‍🎓

              导入判断的基准,具体是什么意思?


              🎓
              • 预算严紧:以OSS为基础,必要时并用商业工具
              • 品质保证必需:活用商业工具的V&V文档·认证对应
              • 自定义物理模型:需改变源代码则只能用OSS
              • 团队教育成本:GUI型商业工具学习快

              • 🧑‍🎓

                等等,初期成本是,意思是这种情况也能用吗?


                许可形态和总所有成本(TCO)

                🧑‍🎓

                "许可形态和总所有成本(TCO)"我听过,但可能没有真正理解…



                商业工具的成本结构

                🧑‍🎓

                商业工具的成本结构,具体是什么意思?


                项目年额目安备考
                节点锁定许可100-500万日元固定到1台PC
                浮动许可150-800万日元网络内共享
                HPC令牌50-300万日元并行核心数按量计费
                支持·维护许可的15-25%版本升级含
                培训30-80万日元/课程初期导入时必需

                TCO比较的要点

                🧑‍🎓

                比较的要点,具体是什么意思?


                🎓
                • 初期导入成本(许可 + 硬件 + 培训)
                • 年间维持成本(维护 + HPC利用费 + 人工费)
                • 可扩展性(用户增加时许可追加成本)
                • 云迁移时的许可可携带性


                • 供应商的技术支持比较

                  🧑‍🎓

                  请讲解"供应商的技术支持比较"!


                  🎓
                  • Tier 1(大型供应商):24小时对应、专任工程师、自定义开发支持
                  • Tier 2(中堅供应商):营业时间内对应、邮件/电话支持
                  • OSS:社区论坛、Stack Overflow、GitHub Issues


                  • 导入流程和迁移战略

                    🧑‍🎓

                    老师,请讲解"导入流程和迁移战略"!



                    供应商选定的步骤

                    🧑‍🎓

                    请讲解"供应商选定的步骤"!


                    🎓

                    1. 需求定义:明确所需解析功能、规模、精度要求

                    2. 候选清单制作:筛选3-5家