1 Star 0 Fork 63

scramjetFoam / openFoamUserManual

forked from poplee / openFoamUserManual 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
9.Units_and_dimensions.md 10.53 KB
一键复制 编辑 原始数据 按行查看 历史
涂涂 提交于 2021-03-18 19:38 . update 9.Units_and_dimensions.md.

第II部分 关于OpenFOAM的一般回顾

9 单位和维度

这一部分讨论OpenFOAM中的物理单位(如米,秒等)和维度(如标量,矢量等)的处理方式。在OpenFOAM中,物理单位被称为dimensions,并且他们包含于dimensionSet类中。维度(即一个量是标量还是矢量)被隐式地处理成数据类型。数据类型scalar或者vector不需要进一步指定他们的维度。

9.1 单位检查

基本上,OpenFOAM使用国际单位制,简称SI单位制。不过,其他单位也可以被使用。在这种情况下,重要的是要记住,一些物理常数,例如通用气体常数,是以国际单位制存储的。因此,如果需要使用SI的其他单位,则需要调整这些值。

除了计算之外,OpenFOAM还会检查所有涉及的变量和常量的物理单位。对于场(如速度),或常数(如粘度),其单位必须被指定。单位在dimension set中定义。国际单位制中的单位被定义为SI基础单位的幂乘积。 $$ [Q] = kg^{\alpha} m^{\beta} s^{\gamma} K^{\delta} mol^{\epsilon} A^{\zeta} cd^{\eta} \tag{1} $$

dimension set中包含了式(1)中的指数形式,定义了需要的单位。根据dimension set,OpenFOAM可以执行单位检查。

dimensions  [0 1 -2 0 0 0 0];

表22: U的错误单位

--> FOAM FATAL ERROR :
incompatible dimensions for operation
[ U [0 1 -3 0 0 0 0] ] + [ U [0 1 -4 0 0 0 0] ]
From function checkMethod ( const fvMatrix < Type >& , const fvMatrix < Type >&)
in file / home / user / OpenFOAM / OpenFOAM -2.1. x / src / finiteVolume / lnInclude / fvMatrix . C at line
1316.
FOAM aborting

表23 求和时单位不匹配

表22显示了速度维度的错误定义,例如在文件0/U中用$m/{s^2}$代替$m/s$。由于数学运算不再有效,OpenFOAM识别出了这个错误的定义。表23显示了由具有不单位的两个被加数导致的相应错误消息。因此,OpenFOAM中止并显示这条错误消息。

9.1.1 关于基础单位的一条重要提示

在OpenFOAM和使用SI单位的出版物中的基础单位的设置顺序时不同的(比较式(2)和式(3))。OpenFOAM使用的基础单位顺序交换了前两项。正如[4,3]中的基础单位列表以米开始,随后是千克,OpenFOAM颠倒了这个顺序,即千克为第一个,米为第二个。并且第四、五和六个基础单位也出现在不同的位置。 $$ [Q]_{OpenFOAM} = kg^{\alpha} m^{\beta} s^{\gamma} K^{\delta} mol^{\epsilon} A^{\zeta} cd^{\eta} \tag{2} $$

$$ [Q]_{SI} = m^{\alpha} kg^{\beta} s^{\gamma} A^{\delta} K^{\epsilon} mol^{\zeta} cd^{\eta} \tag{3} $$

式(2)基于OpenFOAM的源码,见表24.式(3)基于[4,3]。

 //- Define an enumeration for the names of the dimension exponents
 enum dimensionType
 {
 MASS , // kilogram kg
 LENGTH , // metre m
 TIME , // second s
 TEMPERATURE , // Kelvin K
 MOLES , // mole mol
 CURRENT , // Ampere A
 L UM IN O US _ IN TE N SI TY // Candela Cd
 };

表24 dimensionSet.H文件中基础单位顺应的定义

改变基础单位顺序的原因可能是基于CFD的观点。对于涉及可压缩流、反应流和燃烧的流体动力学,OpenFOAM的基础单位中的前五个单位就足够了。

9.1.2 单位输入语法

表25显示了两相问题的其中一相的定义。注意前两个定义和第三个定义之间的区别。d的单位是由7个指数组成的完整集合定义的,而其他两个单位(rho和nu)仅由5个指数定义。显然,允许省略最后两个指数(candela和ampere)。

phaseb
{
rho  rho [ 1 -3 0 0 0 ] 1000;
nu  nu [ 0 2 -1 0 0 ] 1e -06;
d  d [ 0 1 0 0 0 0 0 ] 0.00048;
}

表25 单位定义

--> FOAM FATAL IO ERROR :
wrong token type - expected Scalar , found on line 22 the punctuation token ’] ’
file : / home / user / OpenFOAM / user -2.1. x / run / tw oPh ase Eul erFo am / bed / constant / t r a n s p or t P r o p e r ti e s ::
phaseb :: nu at line 22.
From function operator > >( Istream & , Scalar &)
in file lnInclude / Scalar . C at line 91.
FOAM exiting

表26 单位的错误定义

9.1.3 单位编程语法

OpenFOAM中的单个数字或这整个场不仅可以从文件中读取,还可以从现有的数据中计算得到,或者创造全新的,独立于现有数据的数据。让我们看看如何从编程的角度创造一个带单位的数据。在OpenFOAM中有带单位的数据类型和不带单位的数据类型,如scalar和dimensionedScalar两类。dimensionedScalar类型基本上式scalar加上dimensionSet。

计算带单位的量

计算出的场从涉及的运算和运算对象中继承他们的单位集(dimension set)。表27显示了根据速度场的平方创建了动能场K。新创建的场的名字是K,因为K作为参数传递给了构造函数。场K的单位来自于构造函数的第二个参数。因为对数值类型的所有数学操作都是对单位的镜像,所以对单位类型的任何数学操作不仅会产生数值结果,还会产生单位结果。在这种情况下,最终的单位是平方米每平方秒。

Info < < "Creating field kinetic energy K\n" << endl ;
volScalarField K ("K", 0.5* magSqr ( U ) ) ;

表27 计算动能场

计算带单位的量

当从零开始创建一个带单位的量时,需要明确地说明单位集。在表28中,单位集作为第二个参数明确地传递给了dimensionedScalar的构造函数。注意单位集中的五个参数的使用。由于最后两个SI单位(电流和发光强度)在流体动力学中几乎不需要,为了方便,仅在构造函数中定义五个参数即可。

dimensionedScalar foo("foo", dimensionSet (0 , 3 , 0 , 0 , 0) , scalar (1.0) )

表28 创造一个新的dimensionedScalar数据类型的变量

总是明确设置单位集的5个或7个指数会使代码严重膨胀,而没有任何好处。因此,dimensionSet中有许多全局常量。这些常量定义了最常见的单位集,并提供了非常方便的简写,如表29所示。

··· dimensionedScalar bar("bar", dimless , scalar (0.0) ) ··· 表29 创造一个新的dimensionedScalar数据类型的变量

由于对带单位的量的数值部分执行的所有数学运算也在单位集上执行,因此dimensionSet类也实现了相应的数学操作。我们可以使用这些单位和全局简写来定义我们的新的带单位的量的单位集。在表30中,我们没有必要计算速度的单位集,但是,这个表演示了单位集数学运算的使用。

dimensionedScalar baz ("baz", dimLength / dimTime , 42.0)

表30 创造一个新的dimensionedScalar数据类型的变量

9.2 维度

流体力学中的场量可以是标量,向量和张量。在OpenFOAM中有不同得数据类型来区分不同的维度。 volScalarField 即整个计算域中的标量场,例如压强。 可以使用如下方法定义压强场:volScalarField p volVectorField 即整个计算域中的向量场,例如速度。 可以使用如下方法定义速度场:volVectorField U volTensorField 整个计算域中的张量场,例如雷诺应力。 可以使用如下方法定义雷诺应力场:volTensorField $R_{ca}$ surfaceScalarField 定义在面(有限体积的单元面)上的标量场,例如通量。 可以使用如下方法定义通量场:surfaceScalarField phi dimensionedScalar 整个计算域中的一个标量常数(不是场量) 例如:dimensionedScalar nu

9.2.1 维度检查

正如上述所言,数据类型定义了一个数量的维度。数量的维度则定义了数量被输入时的语法。 表32展示了OpenFOAM的一个报错信息,此信息是由于标量值被输入为了一个向量(见表31)

dimensions [ 0 0 0 0 0 0 0 ];
internalField uniform ( 0 0 0 );
boundaryField
{
    inlet
    {
        type fixedValue ;
        value uniform 0;
    }

表31:$\alpha$的错误定义

--> FOAM FATAL IO ERROR :
wrong token type - expected Scalar , found on line 19 the punctuation token ’(’
file : / home / user / OpenFOAM /user -2.1. x/ run / twoPhaseEulerFoam / bed /0/ alpha :: internalField at line
19.
From function operator >>( Istream &, Scalar &)
in file lnInclude / Scalar .C at line 91.
FOAM exiting

表32:无效维度产生的报错信息

9.3 运动黏度 vs. 动力黏度

为了确定OpenFOAM使用了运动黏度 [Ns/m2=Pas]还是动力黏度[m2/s],我们只需看一下维度定义:

nu        nu [ 0 2 -1 0 0 0 0 ] 0.01;

表33:黏度的维度定义 黏度的类型主要是由使用的求解器(如,压缩或不可压缩)来决定。

9.4 误区:OpenFOAM中的压强

在可压缩和不可压缩求解器中,OpenFOAM的压强定义是不同的。可压缩求解器使用的是压强本身。不可压缩求解器使用的是修改后的压强。其原因在于,不可压缩求解其中密度为常量,因此不可压缩的动量方程除以了密度,并且为了完全消除密度,压力项使用了修改后的压强。 $$ \hat{p}=\frac p \rho \quad (4)$$ 由于以上原因,0/p文件中的内容将根据所使用的求解器而变化。可以通过压强的单位来判断。

9.4.1 不可压缩

不可压缩求解器的单位按公式(4)定义 $$ [\hat p]=\frac N {m^2} \cdot \frac {m^3} {kg}=N \frac m {kg}=\frac {kgm}{s^2} \cdot \frac m {kg} =\frac{m^2}{s^2} \quad (5) $$

dimensions [0 2 -2 0 0 0 0];

表34:压强单位——不可压缩

9.4.2 可压缩

在可压缩求解器中,压强单位是压强的物理单位: $$ [p]=\frac N {m^2}={ \frac {kgm} {s^2}} / {m^2}=\frac {kg} {m \cdot s^2} \quad (6) $$

dimensions [ 1 -1 -2 0 0 0 0 ];

表35:压强单位——可压缩

9.4.3 误区:不可压缩多相流问题中的压强

当用欧拉-欧拉方法求解一个多相问题时,每个相的动量方程都会被求解。在大多数情况下,我们假定在所有相中的压力都相等。由于这个原因不可压缩方程不能除以密度,因为每个相有不同的密度,因此,修改后的压强对于每个相是不同的。为了避免这个问题,不可压缩的欧拉-欧拉求解器,如bubbleFoam,twoPhaseEulerFoam或multiPhaseEulerFoam,像可压缩求解器一样使用物理压强。

1
https://gitee.com/wang-shang-free/openFoamUserManual.git
git@gitee.com:wang-shang-free/openFoamUserManual.git
wang-shang-free
openFoamUserManual
openFoamUserManual
master

搜索帮助