量纲系统与 dimensioned 类型:工程设置与诊断验证
梳理七指数 dimensionSet 的顺序与含义,给出不可压与可压两套常用场的量纲向量表,说明 dimensionedScalar 的构造方式与运动学压力/静压的取舍,并用粘度与导热系数两例完成量纲闭合的手算核对。
量纲系统与 dimensioned 类型:工程设置与诊断验证
OpenFOAM 把每个物理量都写成"数值 + 七指数向量"的 dimensioned 类型,求解器在运行时对加减、乘除、比较逐项校验量纲。这意味着写错量纲不会被静默接受,而是立刻中止;也意味着只要量纲向量写对,物性单位就从"记得住"变成"推导得出"。量纲错误有两种表现:一种在启动阶段就被拦下,另一种一路算完却给出量级离谱的结果。前者只需读报错里的七元组,后者要靠量级比对与无量纲数交叉验证。
七个指数的固定顺序
任一物理量的量纲写作
依次为质量、长度、时间、温度、物质的量、电流、发光强度,对应字典中的 dimensions [a b c d e f g]。全部无量纲写作 [0 0 0 0 0 0 0]。这个顺序不能重排:把速度写成 [1 -1 0 0 0 0 0] 是把米每秒误当成千克每米,求解器不会替你猜。
常见误区是把"量纲"和"单位"混为一谈。量纲是物理量的类型,单位是数值的刻度。速度的量纲固定为 ,用 还是 只是数值缩放;OpenFOAM 内部统一按 SI 解释数值,因此字典里写 1.5 就意味着 。
常用场的量纲向量对照
表中最容易写错的是 kappa。它等于 ,即 [1 1 -3 -1 0 0 0],长度指数是正的 1,容易被误写成 [1 -1 -3 -1 0 0 0]。
| 物理量 | 典型单位 | dimensions |
|---|---|---|
| 速度 U | m/s | [0 1 -1 0 0 0 0] |
| 密度 rho | kg/m^3 | [1 -3 0 0 0 0 0] |
| 动力粘度 mu | Pa·s | [1 -1 -1 0 0 0 0] |
| 运动粘度 nu | m^2/s | [0 2 -1 0 0 0 0] |
| 运动学压力 p/rho | m^2/s^2 | [0 2 -2 0 0 0 0] |
| 静压 p | Pa | [1 -1 -2 0 0 0 0] |
| 湍动能 k | m^2/s^2 | [0 2 -2 0 0 0 0] |
| 湍流耗散率 epsilon | m^2/s^3 | [0 2 -3 0 0 0 0] |
| 比热容 Cp | J/(kg·K) | [0 2 -2 -1 0 0 0] |
| 导热系数 kappa | W/(m·K) | [1 1 -3 -1 0 0 0] |
| 温度 T | K | [0 0 0 1 0 0 0] |
用两条乘积关系做量纲闭合
动力粘度由密度与运动粘度相乘得到:
指数逐项相加:,正是 。数值上取 的水,、,得 ,与手册值 一致。
导热系数可由比热容与普朗特数反推:
指数相加 。数值上取 、,得 ,与 水的实测值 吻合。这两次核对说明:量纲向量写对之后,物性数值之间也必须自洽,否则模型会用一组互相矛盾的参数推进。
dimensionedScalar 的构造与预定义集合
在 C++ 源码或 #codeStream 中构造带量纲常数有两种写法:
// 用预定义 dimensionSet 常量,可读性最好
dimensionedScalar nu("nu", dimViscosity, 1.5e-5);
dimensionedScalar rhoRef("rhoRef", dimDensity, 998.2);
// 直接用 dimensionSet 构造,适合自定义组合量
dimensionedScalar kappaEff
(
"kappaEff",
dimensionSet(1, 1, -3, -1, 0, 0, 0),
0.598
);
dimensionSet 的构造函数参数顺序与字典中一致,依次是 7 个整数指数,最后可跟一个缩放因子(默认 1)。预定义常量覆盖了绝大多数场景:dimless、dimVelocity、dimAcceleration、dimPressure、dimKinematicPressure、dimViscosity、dimDynamicViscosity、dimDensity、dimForce、dimEnergy、dimPower、dimTurbulentKineticEnergy、dimTurbulentDissipation、dimSpecificHeatCapacity、dimThermalConductivity。用预定义常量而不是手写七元组,能在编译期避免指数位置写错。
不可压与可压两套压力
不可压模块把压力当作运动学量求解,字典中 p 的量纲是 [0 2 -2 0 0 0 0],单位 ,物理含义是静压除以密度。可压模块求解绝对压力,量纲 [1 -1 -2 0 0 0 0],单位 。两者不能互换:把可压算例的 0/p 拿到不可压算例里用,量纲检查会在读场阶段直接失败。
换算关系为 。取 、运动学压力 ,静压为 。反过来,若一个不可压算例报告 ,那是把静压填进了运动学压力的位置,量纲虽未报错(因为都是数值),但物理量级偏大约 倍,动量方程会立刻发散。
故障模式与判定试验
| 现象 | 根因 | 判定试验 |
|---|---|---|
启动报 Different dimensions 并列出两组七元组 |
场文件量纲与方程期望不符 | 逐项相减,确认是哪一个指数不同 |
报 wrong token type - expected dimensionSet |
dimensions 后缺少方括号或写成 (...) |
检查该行是否为 dimensions [0 2 -1 0 0 0 0]; |
| 压力数量级偏大 以上 | 把静压填入运动学压力场 | 用 反算,量级应回到 内 |
温度场量纲写成 [0 0 0 0 0 0 0] |
误用 dimless |
改为 [0 0 0 1 0 0 0],热物性模型才能读取 |
| 自定义源项一加入就报量纲错 | 源项量纲与方程因变量不匹配 | 用因变量量纲除以时间量纲,反推源项应取的指数 |
报 Different dimensions 并列出两组七元组 |
操作数或被赋值对象量纲不符 | 逐项相减,差值集中在质量与时间项即为压力约定错用 |
报 wrong token type - expected dimensionSet |
dimensions 未用方括号包裹 |
检查该行语法,应为 dimensions [0 2 -1 0 0 0 0]; |
| 压力场极值达 以上 | 绝对压力填入运动学压力场 | 用 估动压,压力波动应同量级 |
| 由物性反算的 偏离设计值 1000 倍 | 长度或粘度单位错用(mm 当 m、mPa·s 当 Pa·s) | 用 重算,并核对单位标注 |
| 温度结果比能量平衡预测高数倍 | 数值与单位不匹配 | 用 反算并比对 |
诊断量级偏差的验证计算
一次真实的量级排查:某可压算例的出口温度报告 ,入口 ,比热 ,流量 ,加热功率设计值 。由能量平衡,温升应为
预测出口温度 ,与报告的 相差 ,相对偏差 。这说明热物性、流量与能量源项的量纲与数值彼此自洽。若实测出口为 ,温升 接近计算值的 3.6 倍,最可能的解释是 被填成了 的千分之一或流量单位错用,而不是湍流模型的问题。
报错里的两个七元组就是全部证据
量纲不一致时求解器抛出的错误通常长这样:
--> FOAM FATAL ERROR:
Different dimensions
dimensions : [1 -1 -2 0 0 0 0] != [0 2 -2 0 0 0 0]
左值是当前对象声明的量纲,右值是方程或另一操作数期望的量纲。把两个七元组逐项相减得 [1 -3 0 0 0 0 0],差值只落在质量与时间两项上,说明这是"静压 Pa"与"运动学压力 "的混淆,而不是温度或电流指数写错。逐项相减比盯着两组数字看快得多,因为它把差异压缩到具体几个指数。
另一类错误是格式问题而非物理问题:wrong token type - expected dimensionSet, found word 说明 dimensions 后面跟的不是方括号包裹的整数序列,常见原因是写成了 dimensions (0 2 -1 0 0 0 0); 或漏了分号。
压力约定错用靠换算比判定
不可压模块求解 ,可压模块求解绝对压力 。两者的换算关系是
若一个不可压算例在出口报告 ,取 ,对应静压 。这个量级可以用动压独立校验:来流 时动压 ,对应运动学动压 。若出口的 达到 量级,或压力场数值直接等于 ,那就是把绝对压力填进了运动学压力场,量级偏离约 倍,动量方程会在数步内发散。
判定试验:用 postProcess -func 'fieldMinMax(p)' 导出压力极值,与 比较。不可压算例的压力波动应落在动压的同一量级内,超出两个数量级即为约定错用。
无量纲数把量纲自洽变成可核对等式
量纲正确的一组物性必须能还原出预期的无量纲数。雷诺数与欧拉数分别为
取 、、、,得 。若把 错填成 (把 当 用), 会变成 ,从湍流直接跳到完全不符合物理的范围;若把长度单位从毫米误当米, 差 1000 倍, 同样差 1000 倍。因此把 当作量纲自洽的"指纹",比逐个检查物性文件快。
用白金汉定理还能预先算出独立无量纲数的个数:对不可压等温流动,相关量有 、、、、 共 5 个,基本量纲 3 个,独立无量纲数 个,正好对应 与 。若你的设置里出现第 3 个独立无量纲数,说明多引入了一个未被方程使用的参数,通常是单位不一致的信号。
源项量纲闭合的检验步骤
自定义源项最容易出错,因为它不经过标准场的量纲检查。以湍动能方程的耗散源项为例,因变量 的量纲是 ,方程整体量纲为 除以时间,即 ,与 相同。因此源项必须具有相同量纲;若写成 即 [1 -1 -3 0 0 0 0],就多了质量指数、少了长度指数,运行时会报 Different dimensions。
检验方法是把源项表达式中每个因子展开成七元组相加,看结果是否等于因变量量纲除以时间。这一步可以在纸面上完成,不需要运行求解器。
参考资料
- OpenFOAM Foundation, OpenFOAM User Guide, v14, Section “Dimensional units and dimensioned types”.
- OpenFOAM Foundation, OpenFOAM Programmer’s Guide, v14, Chapter “Primitive types: dimensionSet”.
- BIPM, Le Système international d’unités (SI), 9th ed., 2019.
- ISO, ISO 80000-1:2009 Quantities and units — Part 1: General, International Organization for Standardization, 2009.
- I. Mills, T. Cvitaš, K. Homann, N. Kallay, K. Kuchitsu, Quantities, Units and Symbols in Physical Chemistry, 3rd ed., RSC Publishing, 2007.
- F. P. Incropera, D. P. DeWitt, T. L. Bergman, A. S. Lavine, Fundamentals of Heat and Mass Transfer, 6th ed., Wiley, 2007.
- E. Buckingham, “On physically similar systems; illustrations of the use of dimensional equations”, Physical Review, 4(4):345–376, 1914.