跳转至

第18章 OpenFOAM® 与 uFVM 中的边界条件(Boundary Conditions in OpenFOAM® and uFVM)

作者

本章由 F. Moukalled、L. Mangani 和 M. Darwish 合著。本章是 Ch 7 实现章节的"边界条件专项" —— 详细展开 OpenFOAM fvPatchField 的 5 大核心函数、目录结构、以及"如何添加新边界条件"的完整流程。Ch 4 / Ch 5 给出边界条件的数学(Dirichlet / Neumann / Robin),本章给出具体的代码实现。

内容概述

本章 25 页篇幅是全书 20 章中"最工程"的一章,直接面向"如何在 OpenFOAM / uFVM 中实现自定义边界条件"。对工业 CFD 开发者而言,本章是 OpenFOAM 自定义 BC 开发的"金标准"参考。

§18.1 OpenFOAM 中的边界条件 —— OpenFOAM 边界条件存储在 src/finiteVolume/fields/fvPatchFields/ 目录下,按 4 大类组织:

目录 含义 例子
basic/ 基本数学边界条件 fixedValue(Dirichlet)、zeroGradientfixedGradient(Neumann)、mixed(Robin)
constraint/ 几何约束边界条件 cyclic(周期性)、symmetryPlaneempty(2D 模拟)、cyclicAMI(非一致周期性)
derived/ 物理专用边界条件(继承 basic) inletOutletoutletInlettotalPressuretotalTemperaturenoSlipslipfreestream
fvPatchField/ 抽象基类 fvPatchField<Type>
  • basic/ 目录 —— 实现"基本数学"边界条件,是所有具体物理 BC 的基类
  • constraint/ 目录 —— 实现"几何约束"BC,通过特殊的 coupled 机制让两个 patch 共享 cell 邻接关系
  • derived/ 目录 —— 实现"物理专用"BC,全部继承自 basic/,通过 updateCoeffs 等钩子函数重写 BC 计算逻辑
  • fvPatchField/ 目录 —— fvPatchField<Type> 抽象基类,定义 5 大核心接口

§18.2 边界条件定制 —— 编写新边界条件需要实现的 5 大函数:

函数 作用
updateCoeffs 显式更新边界面形心值
valueInternalCoeffs 返回内部系数(用于线性系统组装)
valueBoundaryCoeffs 返回边界系数(用于线性系统组装)
gradientInternalCoeffs 内部系数(梯度形式)
gradientBoundaryCoeffs 边界系数(梯度形式)

通过 valueInternalCoeffs + valueBoundaryCoeffsgradientInternalCoeffs + gradientBoundaryCoeffs,边界条件被编码为对线性系统 \(\mathbf{A} \mathbf{x} = \mathbf{b}\)\(\mathbf{A}\)\(\mathbf{b}\) 的修改。这是 FVM 离散化与 OpenFOAM 边界条件实现之间的"接口协议"。

  • Example:totalTemperature(Listing 18.3)—— 总温 \(T_0\) 边界条件。在 updateCoeffs 中,根据给定的 \(T_0\) 和邻接内部 cell 的速度 \(U\),按

$\(T = T_0 - \frac{(\gamma - 1) U^2}{2 \gamma R}\)$

计算静温 \(T\),并通过 operator== 赋值给 patch。这是可压缩流边界条件的"标准实现模式"。

  • Example:fixedMeanValue(Listing 18.4)—— 平均值边界条件。把 patch 的所有面设为同一平均值(基于内部 cell 形心值的平均 + 用户给定的"目标值")。这种"全局约束"BC 在某些工程问题(如周期性流动强制质量守恒)中非常有用。

§18.3 无滑移壁面边界条件 —— 以 noSlip 为例展示 Dirichlet 型边界条件在 OpenFOAM 中的实现。

  • 关键点noSlip 实际上是 fixedValue<vector> 的特化,固定 \(\mathbf{U} = 0\)
  • 与 OpenFOAM 默认的 fixedValue 区别fixedValue 是基类,noSlip 是派生类,提供更明确的物理意义。noSlip 通常还处理"温度"(noSlip 派生为 zeroGradient)和"压力"(noSlip 派生为 zeroGradient)等其他变量,构成"多变量 BC 组"。

  • cyclicAMI (Arbitrary Mesh Interface) —— 用于两个不同网格的 patch 之间的非一致周期性插值,常用于旋转机械(转子-静子交界面)。

  • processor (并行分解边界) —— 在并行计算中,相邻子域的 patch 通过 processor BC 交换数据,是 OpenFOAM 并行计算的"接口协议"。

§18.4 uFVM 中的边界条件 —— 与 OpenFOAM 对应,uFVM 通过 cfdBoundary 抽象类实现。

  • cfdBoundary —— 抽象基类,定义 5 大接口
  • cfdDirichletBoundary —— 实现 fixedValue 类型
  • cfdNeumannBoundary —— 实现 fixedGradient / zeroGradient 类型
  • cfdRobinBoundary —— 实现 mixed 类型

uFVM 的实现比 OpenFOAM 简单(无 C++ 模板),更适合教学。

§18.5 计算指针 —— OpenFOAM 边界条件类层次结构图 + 完整代码示例。

  • fixedValueFvPatchField<T> 关键代码
template<class Type>
class fixedValueFvPatchField
:
    public fvPatchField<Type>
{
public:
    //- 构造函数
    fixedValueFvPatchField
    (
        const fvPatch& p,
        const DimensionedField<Type, volMesh>& iF
    )
    :
        fvPatchField<Type>(p, iF)
    {}

    //- value 形式 - 内部系数
    virtual tmp<Field<Type>> valueInternalCoeffs
    (
        const tmp<scalarField>&
    ) const
    {
        return tmp<Field<Type>>
        (
            new Field<Type>(this->size(), pTraits<Type>::zero)
        );
    }

    //- value 形式 - 边界系数
    virtual tmp<Field<Type>> valueBoundaryCoeffs
    (
        const tmp<scalarField>&
    ) const
    {
        return *this;  // 直接返回边界值
    }
};

这一实现展示了 OpenFOAM 边界条件的"小而精"设计 —— valueInternalCoeffs 返回 0(不影响内部 cell),valueBoundaryCoeffs 返回边界值(直接进入右端项)。

§18.6 闭包 —— 总结边界条件的设计模式与扩展方法。

核心方程与概念

  • 5 大边界条件函数(OpenFOAM fvPatchField<T> 基类)
// 1. 显式更新边界面形心值
virtual void updateCoeffs();

// 2. value 形式 - 内部系数(影响相邻 cell 的对角元素)
virtual tmp<Field<Type>> valueInternalCoeffs
(
    const tmp<scalarField>&
) const;

// 3. value 形式 - 边界系数(影响右端项)
virtual tmp<Field<Type>> valueBoundaryCoeffs
(
    const tmp<scalarField>&
) const;

// 4. gradient 形式 - 内部系数
virtual tmp<Field<Type>> gradientInternalCoeffs() const;

// 5. gradient 形式 - 边界系数
virtual tmp<Field<Type>> gradientBoundaryCoeffs() const;
  • fixedValue (Dirichlet) 边界条件的实现

$\(\phi_b = \phi_{\text{prescribed}}\)$

修改 \(\mathbf{b}\)\(b_C \mathrel{+}= a_C \phi_b\)(把 \(\phi\) 的规定值移至右端项),保持 \(a_C\) 不变。

  • zeroGradient (Neumann 0) 边界条件

$\(\left. \frac{\partial \phi}{\partial n} \right|_b = 0\)$

对线性系统无修改(\(a_C, b_C\) 都不变)。

  • fixedGradient (Neumann) 边界条件

$\(\left. \frac{\partial \phi}{\partial n} \right|_b = g_{\text{prescribed}}\)$

修改 \(b_C\)\(b_C \mathrel{+}= \Gamma S_f g_{\text{prescribed}}\)(通量项加到右端项)。

  • mixed (Robin) 边界条件

$\(\alpha \phi_b + \beta \left. \frac{\partial \phi}{\partial n} \right|_b = \gamma\)$

同时修改 \(a_C, b_C\)

  • cyclic(周期性) —— 把"配对"两个 patch 的 cell 视为内部 cell,按"内部 cell + 内部 cell"方式组装。
  • cyclicAMI(Arbitrary Mesh Interface) —— 两个 patch 网格不严格匹配时的周期性边界(如旋转机械转子-静子交界面),需要额外的插值权重。

§18 实现的工业级自定义 BC 案例

工业上 50% 以上的 OpenFOAM 二次开发都是"自定义 BC"。以下是几个典型工业场景:

  • 共轭传热 (CHT) —— 多个区域网格(流体 + 固体),在交界面上需要双向耦合温度场。OpenFOAM 通过 compressible::turbulentTemperatureCoupledBaffleMixed 实现,原理是通过 coupled 基类让两个 patch 共享邻接关系,温度 + 热流在迭代中相互传递。
  • 风机 / 风扇特性曲线 —— 通过实测的"压升-流量"曲线定义风扇行为。OpenFOAM 的 fan BC 在 updateCoeffs 中查表计算压升。
  • 大气边界层 (ABL) 入口 —— 风电 CFD 模拟中,需要在入口生成具有特定风切变(风速随高度变化)和湍流强度剖面的合成湍流。OpenFOAM 的 atmBoundaryLayerInletK / atmBoundaryLayerInletEpsilon 通过对数风廓线 + 经验湍流强度公式实现。
  • 多孔介质跳跃 —— 过滤器、穿孔板、冷却填料等多孔介质。OpenFOAM 的 porousBafflePressure 通过 Darcy-Forchheimer 方程实现压降-速度关系。

这些自定义 BC 的实现模式都遵循本章给出的 5 大函数框架 + 继承 basic/derived/ 中的某个类。

关键结论

  1. OpenFOAM 边界条件的 4 大类组织 —— basic(数学)、constraint(几何)、derived(物理)、fvPatchField(基类)。这种"继承层次"是面向对象设计的典范。
  2. 5 大核心函数是边界条件"编码为线性系统修改"的桥梁 —— 通过 valueInternalCoeffs / valueBoundaryCoeffs 把 Dirichlet 条件编码为 \(\mathbf{A}, \mathbf{b}\) 的修改。
  3. uFVM 与 OpenFOAM 在边界条件上高度同构 —— 同样是"基类 + 派生"结构。
  4. 编写自定义边界条件的流程 —— 继承 fixedValuefixedGradient,重写 updateCoeffs 即可。
  5. totalTemperature / totalPressure / inletOutlet 等物理专用边界条件是工业 CFD 用户的"日常工具"。

挑战和开放性问题

  1. 耦合边界条件 (Coupled Boundary) —— 两个 patch 之间的物理量耦合(如共轭传热、流-固耦合),需要 coupled 基类支持。
  2. 波导边界条件 (Wave Transmissive) —— 用于外流问题(声波、激波传出),通过 Riemann 不变量实现。
  3. 多孔介质跳跃条件 (Porous Jump) —— 过滤器、穿孔板等多孔介质的"压降-速度"关系。
  4. 大气边界层入口 (ABL Inlet) —— 风电 CFD 的关键,包含风切变、湍流强度剖面。
  5. 机器学习辅助的边界条件 —— 现代研究用 NN 替代经验公式,本书未涉及。

个人反思与批判性分析

本章是 FVM 边界条件"实现细节"章节,25 页篇幅对 OpenFOAM 自定义边界条件开发者是"必备参考"。从写作特点看:

  • 5 大核心函数的详细解释 —— 给出每个函数的作用、调用时机、对线性系统的影响。这是 OpenFOAM 自定义 BC 开发的"金标准"。
  • 完整代码示例 —— totalTemperature(Listing 18.3)的 updateCoeffs 完整展示,读者可以直接照写。
  • 4 大类边界条件的目录结构 —— 帮助读者快速定位特定 BC 的源代码位置。
  • 从 Ch 5 数学公式到 Ch 18 C++ 实现的完整链路 —— 作者把 Ch 5 的"边界条件对 \(a_C, a_F, b_C\) 的修改规则"映射到 OpenFOAM 的 5 大核心函数,这是 FVM 离散化理论的"代码化"。

但本章也存在以下不足:

  • valueInternalCoeffs / valueBoundaryCoeffs 的推导 仅在 Ch 5 给出数学形式,本章未详细给出"如何从数学公式到 C++ 函数实现"的完整链路。读者需要参考 OpenFOAM 源码 fixedValueFvPatchField.C 自行理解。Ch 5 给出的是"对 \(a_C\)\(\Gamma S_f / d\)、对 \(b_C\)\(\Gamma S_f / d \cdot \phi_b\)"的数学操作,对应到 C++ 即"valueInternalCoeffs 返回 \(a_C\) 的增量、valueBoundaryCoeffs 返回 \(\phi_b\) 倍的 \(a_C\) 增量"。
  • 多孔介质、wave-transmissive 等高级边界条件 仅简略提及,未深入。
  • 大涡模拟 (LES) 的"周期性"边界条件(入口-出口湍流生成)未展开。LES 入口需要合成湍流(synthetic turbulence generation),如 turbulentInlet BC 基于谱方法或涡方法生成满足目标湍流强度/尺度的速度场。
  • 共轭传热 (CHT) 的耦合边界 未展开。CHT 在多区域网格上需要特殊的"patch-to-patch coupling",通过 coupled 基类实现两个 patch 之间的物理量传递(如温度、压力)。
  • 动网格边界条件movingWallVelocityfixedNormal 等)未深入。OpenFOAM 的 dynamicMotionSolverFvMesh 需要专门的动网格 BC。
  • 机器学习辅助的边界条件 是 2020 年后的研究热点,本书未涉及(出版年代限制)。

总体而言,本章是"工程实现细节"章节,与 OpenFOAM 官方文档的边界条件部分形成对标。Moukalled 的优势在于"理论(5 大函数) + 代码(具体示例) + 设计模式(继承层次)"三位一体

对需要进入 OpenFOAM 二次开发的读者,本章 + OpenFOAM 源码 src/finiteVolume/fields/fvPatchFields/ 是必备参考。工业上常见的自定义 BC 包括:

  • 共轭传热 (CHT) —— compressible::turbulentTemperatureCoupledBaffleMixed
  • 多孔介质 (Porous Media) —— porousBafflePressurefixedFluxPressure
  • 风机 / 风扇 (Fan / Blower) —— fantabulatedAcceleration
  • 大气边界层入口 (ABL Inlet) —— atmBoundaryLayerInletEpsilon / atmBoundaryLayerInletK
  • Open 边界 (Outflow) —— advectivewaveTransmissive
  • 动网格 (Moving Mesh) —— movingWallVelocityfixedNormalSlip

这些自定义 BC 都可以通过"继承 basic/derived/ 中的某个类 + 重写 updateCoeffs"实现。本章给出的 5 大函数框架是所有自定义 BC 的"金标准"。

重要参考文献

  • [X1] OpenFOAM Foundation (2014) The Open Source CFD Toolbox — Programmer's Guide. (OpenFOAM 边界条件类的原始设计文档)
  • [X2] OpenFOAM Foundation (2014) OpenFOAM: The Open Source CFD Toolbox — User Guide. (OpenFOAM 边界条件使用文档)
  • [X3] Jasak H. (1996) Error Analysis and Estimation for the Finite Volume Method with Applications to Fluid Flows. PhD Thesis, Imperial College. (OpenFOAM 早期开发者的博士论文)
  • [X4] Moukalled F., Mangani L., Darwish M. (2016) uFVM source code. https://feaweb.aub.edu.lb/research/cfd. (uFVM 教学代码)
  • [X5] Versteeg H.K., Malalasekera W. (2007) An Introduction to Computational Fluid Dynamics: The Finite Volume Method, 2nd Edition. Pearson.
  • [X6] Patankar S.V. (1980) Numerical Heat Transfer and Fluid Flow. Hemisphere.
  • [X7] Ferziger J.H., Perić M. (2002) Computational Methods for Fluid Dynamics, 3rd Edition. Springer.
  • [X8] Weller H.G., Tabor G., Jasak H., Fureby C. (1998) A tensorial approach to computational continuum mechanics using object-oriented techniques. Computers in Physics, 12(6): 620-631. (OpenFOAM 早期论文,介绍面向对象的 FVM 实现)
  • [X9] Karki K.C., Patankar S.V. (1989) Pressure based calculation procedure for viscous flows at all speeds in arbitrary configurations. AIAA Journal, 27(9): 1167-1174. (SIMPLE 扩展到可压缩流)
  • [X10] Menter F.R. (1994) Two-equation eddy-viscosity turbulence models for engineering applications. AIAA Journal, 32(8): 1598-1605. (SST 湍流模型)