第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)、zeroGradient、fixedGradient(Neumann)、mixed(Robin) |
constraint/ |
几何约束边界条件 | cyclic(周期性)、symmetryPlane、empty(2D 模拟)、cyclicAMI(非一致周期性) |
derived/ |
物理专用边界条件(继承 basic) | inletOutlet、outletInlet、totalPressure、totalTemperature、noSlip、slip、freestream 等 |
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 + valueBoundaryCoeffs 或 gradientInternalCoeffs + 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 通过processorBC 交换数据,是 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 的
fanBC 在updateCoeffs中查表计算压升。 - 大气边界层 (ABL) 入口 —— 风电 CFD 模拟中,需要在入口生成具有特定风切变(风速随高度变化)和湍流强度剖面的合成湍流。OpenFOAM 的
atmBoundaryLayerInletK/atmBoundaryLayerInletEpsilon通过对数风廓线 + 经验湍流强度公式实现。 - 多孔介质跳跃 —— 过滤器、穿孔板、冷却填料等多孔介质。OpenFOAM 的
porousBafflePressure通过 Darcy-Forchheimer 方程实现压降-速度关系。
这些自定义 BC 的实现模式都遵循本章给出的 5 大函数框架 + 继承 basic/ 或 derived/ 中的某个类。
关键结论
- OpenFOAM 边界条件的 4 大类组织 —— basic(数学)、constraint(几何)、derived(物理)、fvPatchField(基类)。这种"继承层次"是面向对象设计的典范。
- 5 大核心函数是边界条件"编码为线性系统修改"的桥梁 —— 通过
valueInternalCoeffs / valueBoundaryCoeffs把 Dirichlet 条件编码为 \(\mathbf{A}, \mathbf{b}\) 的修改。 - uFVM 与 OpenFOAM 在边界条件上高度同构 —— 同样是"基类 + 派生"结构。
- 编写自定义边界条件的流程 —— 继承
fixedValue或fixedGradient,重写updateCoeffs即可。 totalTemperature/totalPressure/inletOutlet等物理专用边界条件是工业 CFD 用户的"日常工具"。
挑战和开放性问题
- 耦合边界条件 (Coupled Boundary) —— 两个 patch 之间的物理量耦合(如共轭传热、流-固耦合),需要
coupled基类支持。 - 波导边界条件 (Wave Transmissive) —— 用于外流问题(声波、激波传出),通过 Riemann 不变量实现。
- 多孔介质跳跃条件 (Porous Jump) —— 过滤器、穿孔板等多孔介质的"压降-速度"关系。
- 大气边界层入口 (ABL Inlet) —— 风电 CFD 的关键,包含风切变、湍流强度剖面。
- 机器学习辅助的边界条件 —— 现代研究用 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),如
turbulentInletBC 基于谱方法或涡方法生成满足目标湍流强度/尺度的速度场。 - 共轭传热 (CHT) 的耦合边界 未展开。CHT 在多区域网格上需要特殊的"patch-to-patch coupling",通过
coupled基类实现两个 patch 之间的物理量传递(如温度、压力)。 - 动网格边界条件(
movingWallVelocity、fixedNormal等)未深入。OpenFOAM 的dynamicMotionSolverFvMesh需要专门的动网格 BC。 - 机器学习辅助的边界条件 是 2020 年后的研究热点,本书未涉及(出版年代限制)。
总体而言,本章是"工程实现细节"章节,与 OpenFOAM 官方文档的边界条件部分形成对标。Moukalled 的优势在于"理论(5 大函数) + 代码(具体示例) + 设计模式(继承层次)"三位一体。
对需要进入 OpenFOAM 二次开发的读者,本章 + OpenFOAM 源码 src/finiteVolume/fields/fvPatchFields/ 是必备参考。工业上常见的自定义 BC 包括:
- 共轭传热 (CHT) ——
compressible::turbulentTemperatureCoupledBaffleMixed - 多孔介质 (Porous Media) ——
porousBafflePressure、fixedFluxPressure - 风机 / 风扇 (Fan / Blower) ——
fan、tabulatedAcceleration - 大气边界层入口 (ABL Inlet) ——
atmBoundaryLayerInletEpsilon/atmBoundaryLayerInletK - Open 边界 (Outflow) ——
advective、waveTransmissive - 动网格 (Moving Mesh) ——
movingWallVelocity、fixedNormalSlip
这些自定义 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 湍流模型)