OpenFOAM编程指南
OpenFOAM编程指南
OpenFOAM编程指南
O p enFOA M编 程 指
指南南
OpenFOAM User Guide Chinese Edition
Christopher J. Greenshields 著
李东岳 译
2
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS
LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU
THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF
SUCH TERMS AND CONDITIONS.
1. Definitions
a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-
existing works, such as a translation, adaptation, derivative work, arrangement of
music or other alterations of a literary or artistic work, or phonogram or performance
and includes cinematographic adaptations or any other form in which the Work may
be recast, transformed, or adapted including in any form recognizably derived from
the original, except that a work that constitutes a Collection will not be considered an
Adaptation for the purpose of this License. For the avoidance of doubt, where the
Work is a musical work, performance or phonogram, the synchronization of the Work
in timed-relation with a moving image ("synching") will be considered an Adaptation
for the purpose of this License.
c. "Distribute" means to make available to the public the original and copies of the
Work through sale or other transfer of ownership.
d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work
under the terms of this License.
e. "Original Author" means, in the case of a literary or artistic work, the individual,
individuals, entity or entities who created the Work or if no individual or entity can be
identified, the publisher; and in addition (i) in the case of a performance the actors,
singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play
in, interpret or otherwise perform literary or artistic works or expressions of folklore;
(ii) in the case of a phonogram the producer being the person or legal entity who first
fixes the sounds of a performance or other sounds; and, (iii) in the case of
broadcasts, the organization that transmits the broadcast.
f. "Work" means the literary and/or artistic work offered under the terms of this License
including without limitation any production in the literary, scientific and artistic domain,
whatever may be the mode or form of its expression including digital form, such as a
book, pamphlet and other writing; a lecture, address, sermon or other work of the
same nature; a dramatic or dramatico-musical work; a choreographic work or
entertainment in dumb show; a musical composition with or without words; a
cinematographic work to which are assimilated works expressed by a process
analogous to cinematography; a work of drawing, painting, architecture, sculpture,
engraving or lithography; a photographic work to which are assimilated works
expressed by a process analogous to photography; a work of applied art; an
illustration, map, plan, sketch or three-dimensional work relative to geography,
topography, architecture or science; a performance; a broadcast; a phonogram; a
compilation of data to the extent it is protected as a copyrightable work; or a work
performed by a variety or circus performer to the extent it is not otherwise considered
a literary or artistic work.
g. "You" means an individual or entity exercising rights under this License who has not
previously violated the terms of this License with respect to the Work, or who has
received express permission from the Licensor to exercise rights under this License
despite a previous violation.
to the public by any means or process and the communication to the public of the
performances of the Work, including by public digital performance; to broadcast and
rebroadcast the Work by any means including signs, sounds or images.
i. "Reproduce" means to make copies of the Work by any means including without
limitation by sound or visual recordings and the right of fixation and reproducing
fixations of the Work, including storage of a protected performance or phonogram in
digital form or other electronic medium.
2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any
uses free from copyright or rights arising from limitations or exceptions that are provided for in
connection with the copyright protection under copyright law or other applicable laws.
3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants
You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable
copyright) license to exercise the rights in the Work as stated below:
a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to
Reproduce the Work as incorporated in the Collections; and,
The above rights may be exercised in all media and formats whether now known or hereafter
devised. The above rights include the right to make such modifications as are technically
necessary to exercise the rights in other media and formats, but otherwise you have no rights
to make Adaptations. Subject to 8(f), all rights not expressly granted by Licensor are hereby
reserved, including but not limited to the rights set forth in Section 4(d).
4. Restrictions. The license granted in Section 3 above is expressly made subject to and
limited by the following restrictions:
a. You may Distribute or Publicly Perform the Work only under the terms of this License.
You must include a copy of, or the Uniform Resource Identifier (URI) for, this License
with every copy of the Work You Distribute or Publicly Perform. You may not offer or
impose any terms on the Work that restrict the terms of this License or the ability of
the recipient of the Work to exercise the rights granted to that recipient under the
terms of the License. You may not sublicense the Work. You must keep intact all
notices that refer to this License and to the disclaimer of warranties with every copy of
the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform
the Work, You may not impose any effective technological measures on the Work
that restrict the ability of a recipient of the Work from You to exercise the rights
5
granted to that recipient under the terms of the License. This Section 4(a) applies to
the Work as incorporated in a Collection, but this does not require the Collection apart
from the Work itself to be made subject to the terms of this License. If You create a
Collection, upon notice from any Licensor You must, to the extent practicable, remove
from the Collection any credit as required by Section 4(c), as requested.
b. You may not exercise any of the rights granted to You in Section 3 above in any
manner that is primarily intended for or directed toward commercial advantage or
private monetary compensation. The exchange of the Work for other copyrighted
works by means of digital file-sharing or otherwise shall not be considered to be
intended for or directed toward commercial advantage or private monetary
compensation, provided there is no payment of any monetary compensation in
connection with the exchange of copyrighted works.
c. If You Distribute, or Publicly Perform the Work or Collections, You must, unless a
request has been made pursuant to Section 4(a), keep intact all copyright notices for
the Work and provide, reasonable to the medium or means You are utilizing: (i) the
name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the
Original Author and/or Licensor designate another party or parties (e.g., a sponsor
institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's
copyright notice, terms of service or by other reasonable means, the name of such
party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably
practicable, the URI, if any, that Licensor specifies to be associated with the Work,
unless such URI does not refer to the copyright notice or licensing information for the
Work. The credit required by this Section 4(c) may be implemented in any reasonable
manner; provided, however, that in the case of a Collection, at a minimum such credit
will appear, if a credit for all contributing authors of Collection appears, then as part of
these credits and in a manner at least as prominent as the credits for the other
contributing authors. For the avoidance of doubt, You may only use the credit
required by this Section for the purpose of attribution in the manner set out above
and, by exercising Your rights under this License, You may not implicitly or explicitly
assert or imply any connection with, sponsorship or endorsement by the Original
Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the
Work, without the separate, express prior written permission of the Original Author,
Licensor and/or Attribution Parties.
iii. Voluntary License Schemes. The Licensor reserves the right to collect
royalties, whether individually or, in the event that the Licensor is a member
of a collecting society that administers voluntary licensing schemes, via that
society, from any exercise by You of the rights granted under this License
that is for a purpose or use which is otherwise than noncommercial as
permitted under Section 4(b).
7. Termination
a. This License and the rights granted hereunder will terminate automatically upon any
breach by You of the terms of this License. Individuals or entities who have received
Collections from You under this License, however, will not have their licenses
7
terminated provided such individuals or entities remain in full compliance with those
licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
b. Subject to the above terms and conditions, the license granted here is perpetual (for
the duration of the applicable copyright in the Work). Notwithstanding the above,
Licensor reserves the right to release the Work under different license terms or to
stop distributing the Work at any time; provided, however that any such election will
not serve to withdraw this License (or any other license that has been, or is required
to be, granted under the terms of this License), and this License will continue in full
force and effect unless terminated as stated above.
8. Miscellaneous
a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor
offers to the recipient a license to the Work on the same terms and conditions as the
license granted to You under this License.
d. This License constitutes the entire agreement between the parties with respect to the
Work licensed here. There are no understandings, agreements or representations
with respect to the Work not specified here. Licensor shall not be bound by any
additional provisions that may appear in any communication from You. This License
may not be modified without the mutual written agreement of the Licensor and You.
e. The rights granted under, and the subject matter referenced, in this License were
drafted utilizing the terminology of the Berne Convention for the Protection of Literary
and Artistic Works (as amended on September 28, 1979), the Rome Convention of
1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971).
These rights and subject matter take effect in the relevant jurisdiction in which the
License terms are sought to be enforced according to the corresponding provisions of
the implementation of those treaty provisions in the applicable national law. If the
standard suite of rights granted under applicable copyright law includes additional
rights not granted under this License, such additional rights are deemed to be
included in the License; this License is not intended to restrict the license of any
rights under applicable law.
8
This OpenFOAM Programmer’s Guide, Chinese Edition is translated into Chinese by Dongyue
Li1(Chapter 1, 2), Xiangyu Gao2 (Chaper 3).
1
DYFLUID Studio, Torino, Piedmont, Italy, 10143. 2 Purdue University, West Lafayette, IN, USA, 47907
目录
License............................................................................................................................................ 2
第一章 ............................................................................................................................................ 11
1.1 坐标系统.......................................................................................................................... 11
1.2 张量.................................................................................................................................. 11
1.2.1 张量表示法 ........................................................................................................... 13
1.3 张量算术.......................................................................................................................... 13
1.3.1 内积....................................................................................................................... 14
1.3.2 双内积................................................................................................................... 15
1.3.3 两个三阶张量的三内积 ....................................................................................... 15
1.3.4 外积....................................................................................................................... 15
1.3.5 矢量的叉乘 ........................................................................................................... 15
1.3.6 其他张量操作 ....................................................................................................... 16
1.3.7 几何变形和单位张量 ........................................................................................... 16
1.3.8 张量等式............................................................................................................... 17
1.3.9 二阶张量算术 ....................................................................................................... 17
1.3.10 标量算术............................................................................................................. 18
1.4 OpenFOAM 张量类 ......................................................................................................... 19
1.4.1 OpenFOAM 张量操作........................................................................................... 19
1.5 量纲单位.......................................................................................................................... 21
第二章 ............................................................................................................................................ 23
2.1 微分算符.......................................................................................................................... 23
2.1.1 梯度....................................................................................................................... 23
2.1.2 散度....................................................................................................................... 24
2.1.3 旋度....................................................................................................................... 24
2.1.4 拉普拉斯............................................................................................................... 24
2.1.5 时间导数............................................................................................................... 24
2.2 离散简述.......................................................................................................................... 25
2.2.1 OpenFOAM 链表和场........................................................................................... 25
2.3 计算域离散...................................................................................................................... 25
2.3.1 定义 OpenFOAM 网格......................................................................................... 27
2.3.2 定义 geometricField.............................................................................................. 28
2.4 方程离散.......................................................................................................................... 29
2.4.1 拉普拉斯项 ........................................................................................................... 34
2.4.2 对流项................................................................................................................... 34
2.4.3 一阶时间导数 ....................................................................................................... 35
2.4.4 二阶时间导数项 ................................................................................................... 35
2.4.5 散度项................................................................................................................... 35
2.4.6 梯度项................................................................................................................... 36
2.4.7 梯度-梯度的平方 ................................................................................................. 37
2.4.8 旋度....................................................................................................................... 37
2.4.9 源项....................................................................................................................... 37
2.4.10 其他显性离散 ..................................................................................................... 37
10
2.5 时间离散.......................................................................................................................... 38
2.5.1 OpenFOAM 中时间离散的代码........................................................................... 39
2.6 边界条件.......................................................................................................................... 39
2.6.1 物理边界条件 ....................................................................................................... 40
第三章 ............................................................................................................................................ 41
3.1 圆柱绕流.......................................................................................................................... 41
3.1.1 问题阐述............................................................................................................... 42
3.1.2 potentialFoam 求解器的注意事项 ........................................................................ 43
3.1.3 网格的生成 ........................................................................................................... 43
3.1.4 边界条件和初始条件 ........................................................................................... 45
3.1.5 运行算例............................................................................................................... 46
3.2 稳态后向台阶湍流模拟 .................................................................................................. 49
3.2.1 问题阐述............................................................................................................... 49
3.2.2 网格的生成 ........................................................................................................... 50
3.2.3 边界条件和初始场 ............................................................................................... 53
3.2.4 求解器的控制参数 ............................................................................................... 53
3.2.5 运行算例和后处理 ............................................................................................... 54
3.3 前向台阶的超音速绕流 .................................................................................................. 54
3.3.1 问题阐述............................................................................................................... 54
3.3.2 网格生成............................................................................................................... 56
3.3.3 运行算例............................................................................................................... 57
3.3.4 练习....................................................................................................................... 57
3.4 高压水箱放水问题 .......................................................................................................... 58
3.4.1 问题阐述............................................................................................................... 58
3.4.2 网格的生成 ........................................................................................................... 59
3.4.3 准备运行算例 ....................................................................................................... 61
3.4.4 运行算例............................................................................................................... 62
3.4.5 细化网格来获得更精确解 ................................................................................... 63
3.5 磁流体问题...................................................................................................................... 63
3.5.1 问题阐述............................................................................................................... 64
3.5.2 网格的生成 ........................................................................................................... 65
3.5.3 运行算例............................................................................................................... 66
11
第一章
张量
这一章我们介绍张量和张量算术,以及他们在本手册中是如何进行表达的。然后我们解释张
量和张量算术如何在 OpenFOAM 中的实现。
1.1 坐标系统
OpenFOAM 主要用来解决连续介质问题,例如:固体应力分析、液体气体流动问题以及物
理材料的变形问题。因此,OpenFOAM 在三维空间和时间中处理用张量来进行描述的物理
问题。参见图 1.1,OpenFOAM 使用的坐标系统符合右手规则。建立于右手规则的坐标系符
合下述特征:三个坐标轴起源于 O 点,他们的名字为 Ox、Oy、Oz,当从 Oz 向上观测的时
候(O 点离观测者较近) ,从 Ox 上某点指向 Oy 上某点的圆弧为顺时针方向1。
图 1.1 右手规则坐标轴
1.2 张量
张量用来描述从属某一空间的实体,其遵循一定的数学法则。简要来说,张量就是和一系列
单位矢量相关的一系列的值;在 OpenFOAM 中,单位矢量𝒊𝒙 , 𝒊𝒚 , 𝒊𝒛和上文提及的符合右手规
则的坐标系相关。单位矢量是正交的,每个张量具有如下特征:
阶(秩)r:其为一个整数,表示分量的个数,例如我们可以这样表示:𝑑 𝑟 ;
在 OpenFOAM 1.x 中,我们默认设置为 3 维(d = 3)
,并提供 0 到 3 阶张量作为标
准张量,对张量进行扩展也非常容易。我们熟知 0 阶张量和 1 阶张量代表标量和矢
量,2 阶张量和 3 阶张量有些读者可能会感到有些陌生。为了文章的完整性我们把
他们都进行了描述;
0 阶标量:我们用 0 阶张量表示任何一个可以用单个数值表示的物理量,例如:质
量 m,体积 V,压力 p,粘度𝜇;
需要注意的是,我们通常将二阶张量称为张量,因为再往上的高阶张量非常罕见;
例如𝑇𝑖𝑗 = 𝑇𝑗𝑖 ,
对称 2 阶张量:对称张量指得是非对角元素关于对角元素是对称的。
在 这 种 情 况 下 , 只 有 6 个 独 立 元 素 ( 𝑇12 = 𝑇21 ,𝑇13 = 𝑇31 ,𝑇23 = 𝑇32 )。 在
OpenFOAM 中我们区分对称张量和非对称张量来节省内存。因为对称张量只需要
存储 6 个元素,非对称张量需要存储 9 个元素。大多数连续介质问题中的张量为对
称张量;
1.2.1 张量表示法
本书是一本关于连续介质计算力学的书籍,主要处理 3 维空间和时间的复杂偏微分方程组。
在开始后续章节之前我们很有必要了解一下张量的表示方法以防止在后续章节发生混乱。为
了很好的理解方程组,我们希望读者接受这样一个概念:张量是一个整体而不是一系列标量
的组合。另外,任何张量操作都是在这个整体上进行操作而不是对某个元素进行操作。
在本书下面的章节中,所有的张量(除了标量)我们都是用粗体,a。我们使用单一字
符来表示张量,这更加的表明张量本身是一个实体,并且这样表示张量非常简洁。这种表达
方式潜在的缺点就是张量的阶数并没有有效的表达。很明显,张量的阶数不能为 0。实际上,
由于我们很清楚的了解各个张量代表的物理量的实际意义,缺少张量阶数的这种表达方式也
不会对我们造成太大的麻烦。例如我们知道速度 U 的阶数为 1。
另外一个关于张量操作符的基本概念是张量和坐标系统的无关性。例如矢量 a 不管我
们从哪个角度来观测它都是矢量 a。这意味着张量和坐标系统无关。然而其他符号,例如𝑎𝑖 ,
它则和坐标系统有关,因为它表示的是张量的某个分量。这样的结果就是张量由一系列和坐
标系统有关的元素值来表示,这些元素值依赖于坐标系统。
正如 1.2 节所说,对于张量的索引符表达方式将贯彻全书,它的主要目的是为了将张量
运算拓展到其中的每个分量上。当使用索引符表示张量的时候,我们定义,如果在一项中某
个索引符出现了两次,则这一项表示元素(例如第 1、2、3 元素)的相加。例如:
𝑎𝑖 𝑏𝑖 = ∑3𝑖=1 𝑎𝑖 𝑏𝑖 = 𝑎1 𝑏1 + 𝑎2 𝑏2 + 𝑎3 𝑏3 (1.3)
利用简化的上述定义,在下面的章节中,∑ 将被省略。
1.3 张量算术
a − b = 𝑎𝑖 − 𝑏𝑖 = (𝑎1 − 𝑏1 , 𝑎2 − 𝑏2 , 𝑎3 − 𝑏3 ) (1.4)
张量 a 和标量 s 的乘法也是可交换的,即为将张量的每个元素都乘以标量,例如:
依据上述基本定义,在接下来章节中,我们讨论一阶张量的更为复杂的乘积操作。
14
1.3.1 内积
矢量 a 和矢量 b 的内积是可交换的,并且结果为一个标量 s:
s = 𝑎𝑖 𝑏𝑖 = 𝑎1 𝑏1 + 𝑎2 𝑏2 + 𝑎3 𝑏3 (1.7)
如果 T 是非对称张量,那么这个内积操作是非对称的,即𝐛 = 𝐚 ∙ 𝐓 = 𝐓 𝐓 ∙ 𝐚:
并且这种运算是不可交换的,例如:T ∙ S = (𝑆 𝑇 ∙ 𝑇 𝑇 )𝑇
同样,这个运算也是不可交换的,因此 T = P ∙ a 的元素为:
同样,这个运算也是不可交换的,因此 Q = P ∙ T 的元素为:
1.3.2 双内积
这个运算是不可交换的,因此 a = P : T 为:
1.3.3 两个三阶张量的三内积
1.3.4 外积
张量以及矢量的外积这样定义:
𝑎1 𝑏1 𝑎1 𝑏2 𝑎1 𝑏3
𝑇𝑖𝑗 = 𝑎𝑖 𝑏𝑗 = (𝑎2 𝑏1 𝑎2 𝑏2 𝑎2 𝑏3 ) (1.19)
𝑎3 𝑏1 𝑎3 𝑏2 𝑎3 𝑏3
同样这个运算为不可交换的,因此 P = T a 的结果为:
1.3.5 矢量的叉乘
其中𝑒𝑖𝑗𝑘 这样定义:
0 当两个索引符相同的时候
eijk = {+1 ijk 索引符为关于 123 的偶次序 (1.23)
−1 ijk 索引符为关于 123 的奇次序
其中偶次序为偶数次交换相邻检索符得到 123,231,312,奇次序为奇数次交换交换相邻检
索符得到 132,213,321。
1.3.6 其他张量操作
1.3.7 几何变形和单位张量
𝐚∗ = 𝐓 ∙ 𝐚 (1.25)
𝐒∗ = 𝐓 ∙ 𝐒 ∙ 𝐓 T (1.26)
单位张量定义为:它将某个张量变换为自己本身,即:
17
𝐚=𝐈∙𝐚 (1.27)
因此,单位张量为:
1 0 0
𝐈 = δij = (0 1 0) (1.28)
0 0 1
1.3.8 张量等式
下面我们来列举一下常用的张量等式,我们假定相关的导数都是存在且连续的。其中 s 表示
标量,a 表示矢量:
∇ ⋅ (∇ × 𝐚) = 0
∇ × (∇s) = 0
∇ ⋅ (s𝐚) = s∇ ⋅ 𝐚 + 𝐚 ⋅ ∇s
∇ × (s𝐚) = s∇ × 𝐚 + 𝐚 × ∇s
∇(𝐚 ⋅ 𝐛) = 𝐚 × (∇ × 𝐛) + 𝐛 × (∇ × 𝐚) + (𝐚 ⋅ ∇)𝐛 + (𝐛 ⋅ ∇)𝐚 (1.29)
∇ ⋅ (𝐚 × 𝐛) = 𝐛 ⋅ (∇ × 𝐚) − 𝐚 ⋅ (∇ × 𝐛)
∇ × (𝐚 × 𝐛) = 𝐚(∇ ⋅ 𝐛) − 𝐛(∇ ⋅ 𝐚) + (𝐛 ⋅ ∇)𝐚 − (𝐚 ⋅ ∇)𝐛
∇ × (∇ × 𝐚) = ∇(∇ ⋅ 𝐚) − ∇2 𝐚
(∇ × 𝐚) × 𝐚 = 𝐚 ⋅ (∇𝐚) − ∇(𝐚 ⋅ 𝐚)
了解下面这个𝑒 − 𝛿等式有助于用户对张量在标识符下的操作有更好的理解:
1.3.9 二阶张量算术
下面我们列举几个 2 阶张量的算法:
迹:张量的迹为标量(对角线元素的和) :
tr 𝐓 = 𝑇11 + 𝑇22 + 𝑇33 (1.32)
对角:由张量的对角线元素构成的矢量:
diag 𝐓 = (𝑇11 , 𝑇22 , 𝑇33 ) (1.33)
dev、hyd:每个二阶张量都可分解为 dev 部分(其迹为 0)和 hyd 部分(𝐓 = 𝑠𝐈,
s 为标量) :
18
1 1
⏟ − (tr 𝐓)𝐈 + ⏟(tr 𝐓)𝐈 = dev 𝐓 + hyd 𝐓
𝐓=𝐓
3 3
(1.34)
dev hyd
行列式:二阶张量的 det 这样计算:
𝑇11 𝑇12 𝑇13 𝑇11 (𝑇22 𝑇33 − 𝑇23 𝑇32 ) −
1
det 𝐓 = |𝑇21 𝑇22 𝑇23 | = 𝑇12 (𝑇21 𝑇33 − 𝑇23 𝑇31 ) + = 𝑒𝑖𝑗𝑘 𝑒𝑝𝑞𝑟 𝑇𝑖𝑝 𝑇𝑗𝑞 𝑇𝑘𝑟
6
(1.35)
𝑇31 𝑇32 𝑇33 𝑇13 (𝑇21 𝑇32 − 𝑇22 𝑇31 )
代数余子式:张量的余子式通常这样计算:对于公式 1.35 中的 3×3 行列式,删除
元素所在的行和列,剩下元素取2 × 2行列式,例如𝑇12 的余子式为:
𝑇 𝑇23
| 21 | = T21 𝑇33 − 𝑇23 𝑇31 (1.36)
𝑇31 𝑇33
代数余子式是带符号的余子式,符号这样计算:
+, 𝑖 + 𝑗为偶数
( (1.37)
−, 𝑖 + 𝑗为奇数
T 的代数余子式即为:
1
cof 𝐓 = 𝑒𝑗𝑘𝑟 𝑒𝑖𝑠𝑡 𝑇𝑠𝑘 𝑇𝑡𝑟 (1.38)
2
逆:张量的逆这样计算:
cof 𝐓T
inv 𝐓 = det 𝐓
(1.39)
霍奇对偶:张量的霍奇对偶这样计算:
∗ 𝐓 = (𝑇23 , −𝑇13 , 𝑇12 ) (1.40)
1.3.10 标量算术
Sign:
1 如果𝑠 ≥ 0
sgn (𝑠) = { (1.41)
−1 如果𝑠 < 0
Positive:
1 如果𝑠 ≥ 0
pos (𝑠) = { (1.42)
0 如果𝑠 < 0
Limit:
19
𝑠 如果𝑠 < n
limit (𝑠, 𝑛) = { (1.43)
0 如果𝑠 ≥ 0
阶数 名字 基本类 访问函数
0 标量 scalar
1 矢量 vector x(),y(),z()
2 张量 tensor xx(),xy(),xz()
在 OpenFOAM 中我们可以把张量:
1 2 3
T = (4 5 6) (1.44)
7 8 9
这样定义:
这会输出:
Txz = 3
加法 𝐚+𝐛 a+b
减法 𝐚−𝐛 a-b
20
乘以标量 𝒔𝐚 s*a
除以标量 𝐚∕𝒔 a/s
外积 a 和 b 的阶数≥ 1 𝐚𝐛 a*b
内积 a 和 b 的阶数≥ 1 𝐚⋅𝐛 a&b
双内积 a 和 b 的阶数≥ 2 𝐚∶𝐛 a && b
叉乘 a 和 b 的阶数= 1 𝐚×𝐛 a^b
𝟐
平方 𝐚 sqr(a)
模的平方 |𝐚|𝟐 magSqr(a)
模 |𝐚| mag(a)
𝒏
幂 n = 0,1,…,4 𝐚 pow(a,n)
元素均值 i = 0,1,…,N 𝑎̅𝒾 cmptAv(a)
元素最大值 i = 0,1,…,N max(𝑎𝒾 ) max(a)
元素最小值 i = 0,1,…,N min(𝑎𝒾 ) min(a)
缩放 scale(𝐚, 𝐛) scale(a,b)
2 阶张量操作
转置 𝐓T T.T()
对角 diag𝐓 diag(T)
迹 tr𝐓 tr(T)
Dev dev𝐓 dev(T)
Sym symm𝐓 symm(T)
Skew-sym skew𝐓 skew(T)
行列式 det𝐓 det(T)
代数余子式 cof𝐓 cof(T)
逆 inv𝐓 inv(T)
∗
霍奇对偶 𝐓 *T
标量算术
a 和 b 为任意阶数的张量(除非进行指定)
,s 为标量,N 为元素数
1.5 量纲单位
在连续介质里,物理量都具有量纲。例如质量:kg, 体积:m³,压力:Pa。这些物理量的代
数几何操作要求量纲保持一致。对于某些同样量纲的物理量,只有加、减、等于是具有物理
意义的。为了防止对物理量进行无意义或者错误的运算,OpenFOAM 推荐用户将量纲依附
于场数据以及某个物理量,这样在对其进行张量操作的时候,OpenFOAM 会执行量纲检查。
量纲我们用 dimensionSet 类来定义,例如:
编号 名称 SI 单位 USCS 单位
1 质量 kg lbm
2 米 m ft
3 时间 s s
4 开尔文 K 。
𝑅
5 摩尔质量 kgmol lbmol
6 电流 A A
7 光强 cd cd
表 1.3 S.I. 量纲
dimensionedTensor sigma
(
"sigma",
dimensionSet (1, -1, -2, 0, 0, 0, 0),
tensor (1e6,0,0,0,1e6,0,0,0,1e6),
);
上述这段代码将会定义这样一个张量(应力单位)
:
106 0 0
σ=( 0 106 0 ) (1.45)
0 0 106
23
第二章
离散
目前我们处理的仅仅是张量算术。但是我们需要求解的是关于时间和空间的偏微分方程组。
因此我们将拓展我们的张量为张量场,例如:一个关于时间和空间变化的张量。在这一章节
我们首先对我们可能会遇到的偏微分算符进行描述。然后我们说明张量场在 OpenFOAM 中
是如何构建的,以及如何将张量场离散成为方程组。
2.1 微分算符
nabla 算符在使用的时候遵循以下原则:
2.1.1 梯度
如果定义一个标量场 s 并且 s 为连续可导的,我们有矢量场∇𝑠:
𝜕𝑠 𝜕𝑠 𝜕𝑠
∇𝑠 = ∂i 𝑠 = (𝜕𝑥 , 𝜕𝑥 , 𝜕𝑥 ) (2.2)
1 2 3
梯度我们可以用在任何张量场上,得到的是更高一阶的张量场,例如,矢量场 a 的梯度就是
二阶张量场:
2.1.2 散度
散度可以在任何一阶以及以上阶张量场上操作,结果为低一阶的张量场。例如,二阶张量场
T 的散度为矢量场:
𝜕𝑇11 /𝜕𝑥3 + 𝜕𝑇12 /𝜕𝑥3 + 𝜕𝑇13 /𝜕𝑥3
∇ ⋅ 𝐓 = ∂i 𝑇𝑖𝑗 = ( 𝜕𝑇21 /𝜕𝑥3 + 𝜕𝑇22 /𝜕𝑥3 + 𝜕𝑇23 /𝜕𝑥3 ) (2.5)
𝜕𝑇31 /𝜕𝑥3 + 𝜕𝑇32 /𝜕𝑥3 + 𝜕𝑇33 /𝜕𝑥3
2.1.3 旋度
旋度和散度的关系为:
∇ × 𝐚 = 2(∗ skew∇𝐚) (2.7)
2.1.4 拉普拉斯
拉普拉斯操作在数学上可以看做是散度和梯度的组合,即:∇2 = ∇ ⋅ ∇。然而,拉普拉斯应该
看作为是单步操作:将张量场转化为同阶张量场的操作,而不是两步张量场操作的结合(先
增加一阶然后再减去一阶)。
实际上,拉普拉斯最好定义为标量操作符的形式(正如我们定义∇操作符一样) :
𝜕2 𝜕2 𝜕2
∇2 = ∂2 = + + (2.8)
𝜕𝑥12 𝜕𝑥22 𝜕𝑥32
例如,对于一个标量场 s 的拉普拉斯场同样也为一个标量场:
𝜕2𝑠 𝜕2 𝑠 𝜕2 𝑠
∇2 𝑠 = 𝜕 2 𝑠 = + + (2.9)
𝜕𝑥12 𝜕𝑥22 𝜕𝑥32
2.1.5 时间导数
存在不止一种有关张量场的时间导数定义。为了准确的描述时间导数我们必须首先知道张量
是和一个移动的某个体积下的物理量有关的。如果我们追踪这个无限小的微元(或者微粒)
,
它是即时移动的并且物理张量𝜙会跟随时间而发生变化,我们定义物质导数为 :
2
2 拉格朗日方法
25
𝐷𝜙 ∆𝜙
𝐷𝑡
= lim (2.10)
∆𝑡→0 ∆𝑡
在连续介质问题中,特别是流体力学中,我们通常在某个固定点来观测某个物理张量跟随时
间的变化形式3。我们用∂/ ∂𝑡来表示在空间的某个点下的时间导数项,我们用它可以表示物
质导数:
𝐷𝜙 𝜕𝜙
𝐷𝑡
= 𝜕𝑡
+ 𝐔 ⋅ ∇𝜙 (2.11)
其中 U 是某个物理量𝜙的速度,2.11 公式右边的第二项我们称为𝜙的对流率。
2.2 离散简述
离散的意思就是用一系列离散的量来近似代表一系列的连续值。有限体积法以及其他的例如
有限元、有限差分在离散的时候都遵循下面的原则:
空间离散:通过一系列的点来定义求解域,它填充整个空间并且是有界的;
时间离散:对于瞬态问题,将计算时间分为有限的小的时间间隔;
方程离散:针对某个物理问题特定的偏微分方程,生成一系列的代数方程来代表在
空间离散后的物理量;
2.3 计算域离散
3 欧拉方法
26
网格互相是连续相连的,例如他们不能互相重合,并且他们需要填充整个计算域。典型的空
间离散后的网格如图 2.1 所示:
时间域
表 2.1 计算域离散
表 2.2 有限体积离散的相关参数
27
即使某些物理量以及其他的相关参数需要储存在面或者顶点上,他们大部分都储存在网格中
心 P。网格单元通过一系列的平面来界定,我们用 f 来表示面。在 OpenFOAM 中,网格单
元面的数量是没有限制的,这种网格我们通常称之为任意非结构网格。这种叫法可以和某些
网格(这些网格的网格单元面和坐标轴相依赖)来进行区分。使用这种网格来进行计算的计
算流体力学代码允许非常灵活的网格生成和操作。这在几何体非常复杂以及需要处理动网格
的时候优势明显。
虽然大部分物理量存储在网格中心,但是一些物理量依然存储在网格单元面,在
OpenFOAM 中具有两种网格单元面:
内部面:连接两个网格单元的面(且仅仅连接两个网格单元) 。对于每个内部面,
OpenFOAM 将其连接的两个网格单元一个指定为 owner,一个指定为 neighbor;
边界面:从属一个网格单元的面,且和计算域边界重合。这些面只有一个 owner 网
格单元;
2.3.1 定义 OpenFOAM 网格
slice:见上文;
word:名字;
2.3.2 定义 geometricField
目前为止我们定义了场(张量链表)和网格。他们可以通过在我们的计算域定义张量场来结
合起来,这通过 OpenFOAM 中的模板类 geometricField<Type>来实现。Field 的值区分为计
算域的内部值(计算域内部网格单元中心的值)和边界值(计算域的边界面的值)。geometric
-Field<Type>存储下列信息:
Mesh:fvMesh 的引用,其会添加一下附加信息,例如场信息存储在网格单元中心
还是面上;
Old values:在时间离散中上一个时间步的场信息。geometricField<Type>会存储上
一个时间步(过去的时间步,甚至上上个时间步)的引用信息;
类 描述 符号 成员函数
正如 2.3 节我们讨论的,我们主要将物理量定义在网格单元中心,一部分定义在网格面,很
少的一部分我们定义在网格单元顶点上。geometricField<Type>也使用 typedef 进行了重新命
名来表示定义场的位置信息:
volField<Type>:网格单元中心场;
surfaceField<Type>:网格单元面场;
pointField<Type>:网格单元顶点场;
2.4 方程离散
偏微分方程组可以转化为一系列的代数方程组,如下所示:
其中[𝐴]是方阵,[𝑥]是相关物理量的未知矢量,[𝑏]是源项矢量。我们把[𝑥]和[𝑏]称之为矢量
不是因为他们是具有三个元素的矢量,而是他们是一个和矩阵相关的专业词汇。他们是定义
在计算域的一系列的值,例如一个 geometricField<Type>类型,在使用有限体积离散的时候
一般为 volField<Type>类型。
[𝐴]是代数方程组的系数矩阵,它不能用 geometricField<Type>来描述。因此它们使用他
们自己的类进行描述:fvMatrix。fvMatrix<Type>通过对 geometricField<Type>离散进行创建
因此会继承<Type>的特性。他们可以使用常规的代数方程组操作例如加法,减法,乘法之类。
在 OpenFOAM 中,偏微分方程中的每个项都需要使用静态函数类 finiteVolumeMethod
以及 finiteVolumeCalculus 进行表示,简化的写法即为:fvm,fvc。
4此列并不是第一列的翻译
5这个图表并不是 geometricField<Type>的完整描述,在这里只是简单的介绍 geometricField<Type>的主要
衍生类
30
图 2.5 geometricField<Type>的基本类结构
32
图 2.6 geometricField<Type>及其数学操作
∫𝑉 ∇ ⊕ 𝜙 𝑑𝑉 = ∫𝑆 𝑑𝑺 ⊕ 𝜙 (2.13)
其中𝑺是面矢量,𝜙表示任意的张量场,⊕表示任意的张量积,例如内积、外积、叉乘。相对
应的就是散度:∇ ⋅ 𝜙,梯度∇𝜙,以及∇ × 𝜙。在积分之后,我们需要使用合适的格式来进行
线性化,这将在后续章节有所提及。OpenFOAM 提供了很多种格式进行离散,但某些项经
常使用一种格式来离散。离散格式的选择可以在代码中直接指定,或者可以从输入文件中指
定,他们存储在 fvSchemes 类中。
33
2.4.1 拉普拉斯项
在有限控制体内,拉普拉斯项这样积分以及线性化:
𝜙𝑁 −𝜙𝑃
𝐒𝑓 ⋅ (∇𝜙)𝑓 = |𝑆𝑓 | |𝐝|
(2.15)
在网格非正交的情况下,我们需要引入一个显性项7。
2.4.2 对流项
在有限控制体内,对流项这样积分以及线性化:
面值𝜙f 可以使用一系列的格式进行计算:
中心差分(CD):无界二阶精度:
𝜙𝑓 = 𝑓𝑥 𝜙𝑃 + (1 − 𝑓𝑥 )𝜙𝑁 (2.17)
迎风格式(UD):牺牲精度来确保有界,依据流向决定𝜙f 的值:
𝜙𝑃 for 𝐹 ≥ 0
𝜙𝑓 = { (2.18)
𝜙𝑁 for 𝐹 < 0
混合格式(BD):即中心差分和迎风格式的混合,力图在合理的精度下保证有界:
6 此公式类似一种格式
7 请参考 Hrv 的博士论文
35
2.4.3 一阶时间导数
在有限控制体内,一阶时间导数项这样积分:
𝜕
∫ 𝜌𝜙 𝑑𝑉
𝜕𝑡 𝑉
(2.20)
这一项需要将时间进行简单的离散,在这里我们引进几个项:
旧值:𝜙 0 = 𝜙(𝑡),我们在上一个时间步存储的物理量;
欧拉显性:这样指定:timeScheme EulerImplicit,其为一阶精度:
向后差分:这样指定:timeScheme BackwardDifferencing,其为需要存储旧-旧值的
二阶精度格式,因此相对于欧拉显性需要更大的内存空间:
2.4.4 二阶时间导数项
在有限控制体内,二阶时间导数项这样积分(其为一阶精度)
:
2.4.5 散度项
∫𝑉 ∇ ⋅ 𝜙 𝑑𝑉 = ∫𝑆 𝑑𝐒 ⋅ 𝜙 = ∑𝑓 𝐒𝑓 ⋅ 𝜙𝑓 (2.24)
36
2.4.6 梯度项
梯度项是可以通过很多方式进行计算的显性项。格式可以这样指定:要么通过选择某个格式
的梯度函数来计算,例如 fvc::gGrad,fvc::lsGrad,要么通过 fvc::grad 以及输入文件的 grad -
Scheme 来计算。
∫𝑉 ∇𝜙 𝑑𝑉 = ∫𝑆 𝑑𝐒 𝜙 = ∑𝑓 𝐒𝑓 𝜙𝑓 (2.25)
最小二乘法:建立在下述规则基础之上:
G = ∑𝑁 ω2𝑁 dd (2.26)
d 是 P 点到 N 点的矢量,且权函数wN = 1/|𝐝|。梯度可以这样计算:
𝜙𝑁 −𝜙𝑃
(∇𝜙)𝑓 = |𝐝|
(2.28)
2.4.7 梯度-梯度的平方
梯度-梯度的平方我们这样计算:首先对场取散度;再对这个取散度后的场继续取散度;然
后计算结果的模的平方。在数学上,梯度梯度的平方这样表示:|∇(∇𝜙)2 |。
2.4.8 旋度
∇ × 𝜙 = 2 ∗ (skew∇𝜙)
2.4.9 源项
源项的指定有三种方法:
显性:每个显性的源项为一个 volField<Type>。因此,显性的源项在偏微分方程中
可以简单的看做一个值。例如,如果我们打算求解泊松方程∇2 𝜙 = 𝑓,我们可以定
义 phi 和 f 为一个 volScalarField,然后使用下面的代码:
solve(fvm::laplacian(phi) == f)
隐性:隐性源项通过下面的公式在有限控制体内进行积分并线性化:
∫𝑉 𝜌𝜙 𝑑𝑉 = 𝜌𝑃 𝑉𝑃 𝜙𝑃 (2.29)
显性/隐性:隐性源项会改变矩阵的系数。根据源项的正负以及矩阵系数,隐形源
项会使得矩阵的对角占优有所改变。如果降低矩阵的对角占优会在矩阵迭代求解的
时候引入不稳定性。因此,OpenFOAM 提供了混合的源项离散形式:当源项小于 0
的时候进行隐形离散,源项大于 0 的时候进行显性离散8。从数学上来讲,节点 P
的矩阵系数是𝑉𝑝 max(𝜌𝑝 , 0),源项为:𝑉𝑝 min(𝜌𝑝 , 0);
2.4.10 其他显性离散
8 原文有误
38
面插值:faceInterpolate()将 volField<Type>从网格单元中心的值插值到面上并返回
一个 surface<Type>Field(使用中心差分) ;
2.5 时间离散
𝑡+Δ𝑡 𝜕
∫𝑡 [𝜕𝑡 ∫𝑉 𝜌𝜙 𝑑𝑉 + ∫𝑉 𝒜𝜙 𝑑𝑉 ] 𝑑𝑡 = 0 (2.30)
𝑡+Δ𝑡 𝜕 𝑡+Δ𝑡 (𝜌𝑃 𝜙𝑃 𝑉)𝑛 −(𝜌𝑃𝜙𝑃 𝑉)𝑜 (𝜌𝑃𝜙𝑃 𝑉)𝑛 −(𝜌𝑃 𝜙𝑃𝑉)𝑜
∫𝑡 [𝜕𝑡 ∫𝑉 𝜌𝜙 𝑑𝑉 ] 𝑑𝑡 = ∫𝑡 ∆𝑡
𝑑𝑡 = ∆𝑡
𝑑𝑡 (2.31)
第二项可以表示为:
𝑡+Δ𝑡 𝑡+Δ𝑡
∫𝑡 [∫𝑉 𝒜𝜙 𝑑𝑉 ] 𝑑𝑡 = ∫𝑡 𝒜∗ 𝜙 𝑑𝑡 (2.32)
其中𝒜∗表示𝒜的离散形式,因此,时间项的积分可以采用以下三种方式:
欧拉隐性:采用隐形形式离散空间项,因此在计算中取新值𝜙 n:
𝑡+Δ𝑡
∫𝑡 𝒜∗ 𝜙 𝑑𝑡 = 𝒜∗ 𝜙 𝑛 ∆𝑡 (2.33)
其为关于时间的一阶精度,因此为有界且无条件稳定的;
显性:采用显形形式离散空间项,因此在计算中我们去旧值𝜙 0:
𝑡+Δ𝑡
∫𝑡 𝒜∗ 𝜙 𝑑𝑡 = 𝒜∗ 𝜙 𝑜 ∆𝑡 (2.34)
其为关于时间的一阶精度,如果库郎数大于 1,其会不稳定。库郎数这样定义:
𝐔 ⋅𝐝
𝐶𝑂 = |𝐝|𝑓2∆𝑡 (2.35)
其中𝐔f 为特征速度,例如流体速度等;
39
C-N 格式:使用显性隐性的混合来离散空间项,因此需要对新值和旧值取平均:
𝑡+Δ𝑡 𝜙𝑛 +𝜙𝑜
∫𝑡 𝒜∗ 𝜙 𝑑𝑡 = 𝒜∗ ( 2
) ∆𝑡 (2.36)
其为关于时间的二阶精度,无条件稳定但是不一定有界;
目前,对时间离散的处理要根据空间导数的处理方法(显性隐性)来选定。例如,我们打算
求解下面这个瞬态扩散方程:
𝜕𝜙
𝜕𝑡
= 𝜅∇2 𝜙 (2.37)
欧拉隐性代码如下:
solve(fvm::ddt(phi) == kappa*fvm::laplacian(phi))
solve(fvm::ddt(phi) == kappa*fvc::laplacian(phi))
solve
(
fvm::ddt(phi)
==
kappa*0.5*(fvm::laplacian(phi) + fvc::laplacian(phi))
)
2.6 边界条件
边界条件对于我们需要计算的问题是非常重要的。因此我们在所有的边界面指定边界条件。
边界条件分为两种类型:
Dirichlet:描述边界上的变量值,因此我们称为固定值边界条件;
Neumann:描述变量在边界上的法向梯度值,因此我们称之为固定梯度边界条件;
当我们在进行离散的时候,有时会包含这一项:∑,因此我们需要考虑如果某个网格单元面
为边界面的时候会发生什么样的情况:
40
Fixed value:我们在边界处指定固定值:
如果需要计算面梯度(∇𝜙)𝑓 ,例如拉普拉斯项,我们可以这样用公式表示:
𝜙𝑏 −𝜙𝑃
𝐒𝑓 ⋅ (∇𝜙)𝑓 = |𝑆𝑓 | |𝐝|
(2.38)
Fixed gradient:固定梯度边界条件需要计算梯度和边界面法向的内积:
𝐒
𝔤𝑏 = (|𝐒| ⋅ ∇𝜙 ) (2.39)
𝑓
当需要边界的𝜙f 值的时候,我们需要从网格单元中心值进行插值:
当需要面法向梯度的时候,𝜙b 可以直接进行替换:
2.6.1 物理边界条件
工程师们通常通过实际的物理情况来指定边界条件。相比于前述的各种公式,真实的边界条
件非常具有描述性。在不可压缩缩流中我们有下面几个具有代表性的物理边界条件:
进口:出口的速度场需要指定,压力应该指定法向梯度为零;
出口 t:出口的压力场需要指定,速度应该指定法向梯度为零;
无滑移壁面:壁面处的速度为 0,因此需要指定速度固定值边界条件。压力指定
为法向梯度为零(因为壁面出的通量为 0)
;
有时,计算域以及边界条件会呈对称分布,我们只需要计算其中的一半区域就可以了。其他
区域我们考虑为对称面。其中对称的交界面我们必须指定为:
对称平面:对称平面边界条件指定平面的法向梯度为零;
41
第三章
算例演示
mkdir –p $FOAM_RUN
教程中的算例可以用如下命令复制到此文件夹中:
cp –r $FOAM_TUTORIALS/* $FOAM_RUN
3.1 圆柱绕流
非正交网格;
对 OpenFOAM 当中的问题生成解析解;
42
3.1.1 问题阐述
我们将这个圆柱绕流问题描述如下:
图 3.1 圆柱绕流几何模型示意图
控制方程:
不可压缩缩流体的质量守恒方程:
∇∙𝐔 = 0 (3.1)
不可压缩缩无旋场的稳态压力方程:
∇2 𝑝 = 0 (3.2)
边界条件:
求解器名称: potentialFoam,其为求解势流的求解器,假设流场不可压缩、无旋、无黏、稳
态、并且忽略重力;
算例名称:cylinder,这个算例位于$FOAM_TUTORIALS/potentialFoam 文件夹中;
43
3.1.3 网格的生成
9 在算例运行之前首先运行势流求解器可以大大加快收敛且增加求解稳定性
44
14 }
15 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
16
17 convertToMeters 1;
18
19 vertices #codeStream
20 {
21 codeInclude
22 #{
23 #include "pointField.H"
24 #};
25
26 code
27 #{
28 pointField points(19);
29 points[0] = point(0.5, 0, -0.5);
30 points[1] = point(1, 0, -0.5);
31 points[2] = point(2, 0, -0.5);
32 points[3] = point(2, 0.707107, -0.5);
33 points[4] = point(0.707107, 0.707107, -0.5);
34 points[5] = point(0.353553, 0.353553, -0.5);
35 points[6] = point(2, 2, -0.5);
36 points[7] = point(0.707107, 2, -0.5);
37 points[8] = point(0, 2, -0.5);
38 points[9] = point(0, 1, -0.5);
39 points[10] = point(0, 0.5, -0.5);
40 points[11] = point(-0.5, 0, -0.5);
41 points[12] = point(-1, 0, -0.5);
42 points[13] = point(-2, 0, -0.5);
43 points[14] = point(-2, 0.707107, -0.5);
44 points[15] = point(-0.707107, 0.707107, -0.5);
45 points[16] = point(-0.353553, 0.353553, -0.5);
46 points[17] = point(-2, 2, -0.5);
47 points[18] = point(-0.707107, 2, -0.5);
48
49 // Duplicate z points
50 label sz = points.size();
51 points.setSize(2*sz);
52 for (label i = 0; i < sz; i++)
53 {
54 const point& pt = points[i];
55 points[i+sz] = point(pt.x(), pt.y(), -pt.z());
56 }
57
58 os << points;
59 #};
60 };
61
62
63 blocks
64 (
65 hex (5 4 9 10 24 23 28 29) (10 10 1) simpleGrading (1 1 1)
66 hex (0 1 4 5 19 20 23 24) (10 10 1) simpleGrading (1 1 1)
67 hex (1 2 3 4 20 21 22 23) (20 10 1) simpleGrading (1 1 1)
68 hex (4 3 6 7 23 22 25 26) (20 20 1) simpleGrading (1 1 1)
69 hex (9 4 7 8 28 23 26 27) (10 20 1) simpleGrading (1 1 1)
70 hex (15 16 10 9 34 35 29 28) (10 10 1) simpleGrading (1 1 1)
71 hex (12 11 16 15 31 30 35 34) (10 10 1) simpleGrading (1 1 1)
72 hex (13 12 15 14 32 31 34 33) (20 10 1) simpleGrading (1 1 1)
73 hex (14 15 18 17 33 34 37 36) (20 20 1) simpleGrading (1 1 1)
74 hex (15 9 8 18 34 28 27 37) (10 20 1) simpleGrading (1 1 1)
75 );
76
77 edges
78 (
79 arc 0 5 (0.469846 0.17101 -0.5)
80 arc 5 10 (0.17101 0.469846 -0.5)
81 arc 1 4 (0.939693 0.34202 -0.5)
82 arc 4 9 (0.34202 0.939693 -0.5)
83 arc 19 24 (0.469846 0.17101 0.5)
84 arc 24 29 (0.17101 0.469846 0.5)
85 arc 20 23 (0.939693 0.34202 0.5)
86 arc 23 28 (0.34202 0.939693 0.5)
87 arc 11 16 (-0.469846 0.17101 -0.5)
88 arc 16 10 (-0.17101 0.469846 -0.5)
89 arc 12 15 (-0.939693 0.34202 -0.5)
90 arc 15 9 (-0.34202 0.939693 -0.5)
91 arc 30 35 (-0.469846 0.17101 0.5)
92 arc 35 29 (-0.17101 0.469846 0.5)
93 arc 31 34 (-0.939693 0.34202 0.5)
45
3.1.4 边界条件和初始条件
3.1.5 运行算例
在这个算例中,我们不需要设置流体的性质,因为整个流场是不可压缩无旋无黏的。在 system
子文件夹中,controlDict 文件夹记录着算例运行所需要的参数。需要注意的是,因为我们要
处理的是稳态问题,所以这个算例只应当运行一个时间步:
64
65 scalar ULeft = 0.0;
66 label leftI = mesh().boundaryMesh().findPatchID("left");
67 const fvPatchVectorField& fvp = U.boundaryField()[leftI];
68 if (fvp.size())
69 {
70 ULeft = fvp[0].x();
71 }
72 reduce(ULeft, maxOp<scalar>());
73
74 dimensionedScalar uInfX
75 (
76 "uInfx",
77 dimensionSet(0, 1, -1, 0, 0),
78 ULeft
79 );
80
81 Info << "U at inlet = " << uInfX.value() << " m/s" << endl;
82
83
84 scalar magCylinder = 0.0;
85 label cylI = mesh().boundaryMesh().findPatchID("cylinder");
86 const fvPatchVectorField& cylFvp = mesh().C().boundaryField()[cylI];
87 if (cylFvp.size())
88 {
89 magCylinder = mag(cylFvp[0]);
90 }
91 reduce(magCylinder, maxOp<scalar>());
92
93 dimensionedScalar radius
94 (
95 "radius",
96 dimensionSet(0, 1, 0, 0, 0),
97 magCylinder
98 );
99
100 Info << "Cylinder radius = " << radius.value() << " m" << endl;
101
102 volVectorField UA
103 (
104 IOobject
105 (
106 "UA",
107 mesh().time().timeName(),
108 U.mesh(),
109 IOobject::NO_READ,
110 IOobject::AUTO_WRITE
111 ),
112 U
113 );
114
115 Info<< "\nEvaluating analytical solution" << endl;
116
117 const volVectorField& centres = UA.mesh().C();
118 volScalarField magCentres(mag(centres));
119 volScalarField theta(acos((centres & vector(1,0,0))/magCentres));
120
121 volVectorField cs2theta
122 (
123 cos(2*theta)*vector(1,0,0)
124 + sin(2*theta)*vector(0,1,0)
125 );
126
127 UA = uInfX*(dimensionedVector(vector(1,0,0))
128 - pow((radius/magCentres),2)*cs2theta);
129
130 // Force writing of UA (since time has not changed)
131 UA.write();
132
133 volScalarField error("error", mag(U-UA)/mag(UA));
134
135 Info<<"Writing relative error in U to " << error.objectPath()
136 << endl;
137
138 error.write();
139 #};
140 }
141 }
142
143
48
144 // ************************************************************************* //
potentialFoam通过迭代来求解压力方程,并且可以对压力方程中的拉普拉斯项进行非正交修
正(压力方程中的显式项会在正交修正迭代之后进行更新) 。对压力方程的非正交修正迭代
次 数 由 controlDict 之 中 的 nNonOrthogonalCorrectors 来 决 定 。 在 第 一 个 例 子 中 , 我 们 将
nNonOrthogonalCorrectors设置为 0,也就是说,在求解过程中没有非正交修正迭代步(压力
方程只被求解一次) 。与之对应的数值解如图3.3(a)所示(t = 1,当稳态求解结束之时) 。
我们期待数值解能够像解析解(如图3.3(c)所示)一样,即穿过整个计算域的流线是光滑
的,但是在网格正交性不好的地方我们却能观察到明显的误差(比如在block 0,1,3的交界
处) 。如果我们将nNonOrthogonalCorrectors设置为3,再运行一次算例,其数值解如图3.3(b)
所示。这个解的结果与理论解非常相近(流线非常光滑) ,因此并没有明显的由非正交性所
引起的误差。
(a) 无非正交修正
(b) 有非正交修正
(c) 解析解
图 3.3 势流中的流线
49
3.2 稳态后向台阶湍流模拟
利用 blockMesh 当中的网格非均匀分布功能生成网格;
稳态湍流;
3.2.1 问题阐述
稳态后向台阶湍流模拟定义如下:
计算域: 计算域是二维的,由一个窄的入口、一个后向台阶、一个在出口处收缩的喷管组
成,如图 3.4 所示:
图 3.4 后向台阶的几何模型
控制方程:
不可压缩缩流体的质量守恒方程:
∇∙𝐔 = 0 (3.3)
稳态动量方程:
∇ ∙ (𝐔𝐔) + ∇ ∙ 𝐑 = −∇𝑝 (3.4)
这里的 p 是动压,𝐑 = ν𝑒𝑓𝑓 ∇𝑼是带有有效动力粘度系数ν𝑒𝑓𝑓 的粘性力项。ν𝑒𝑓𝑓 是通
过传递模型和湍流模型计算而来;
边界条件:
物性:
𝜇
空气的运动粘度系数𝜈 = 𝜌 = 18.1 × 10−6/1.293 = 14.0𝜇𝑚2 /𝑠 ;
湍流模型:
标准𝑘 − 𝜀模型;
常数:𝐶𝜇 = 0.09; 𝐶1 = 1.44; 𝐶2 = 1.92; 𝛼𝑘 = 1; 𝛼𝜖 = 0.76923;
求解器名称:simpleFoam,其为稳态不可压缩流体问题的求解器;
算例名称:pitzDaily,位于$FOAM_TUTORIALS/simpleFoam 文件夹中;
3.2.2 网格的生成
我么希望这个算例的流场足够的复杂,因此需要利用网格非均匀分布才能得到最优解。一般
来说,剪切应力(速度梯度)大的区域网格细化尤其重要。在这种区域的网格需要比其他剪
切应力较低的区域更细。在进行求解之前,我们可以提前估计一下在哪些地方容易出现大的
剪切应力。在入口处,我们有一个沿着 x 方向的稳态流动,在流体经过台阶时,这个稳态流
动和下方静止的流体之间会产生一个剪切应力,并且在计算域的下半部分产生漩涡。所以,
在这个问题中,剪切应力比较大的区域应该在计算域的中心线附近和靠近壁面的地方。
计算域被分为 12 个 block,如图 3.5 所示。其网格是三维的。图 3.5 所示的是计算域的
背面,z = - 0.5 平面。网格节点和 block 的信息储存在 blockMeshDict 文件夹中,如下所示:
86 );
87
88 boundary
89 (
90 inlet
91 {
92 type patch;
93 faces
94 (
95 (0 22 23 1)
96 (1 23 24 2)
97 (2 24 25 3)
98 );
99 }
100 outlet
101 {
102 type patch;
103 faces
104 (
105 (16 17 39 38)
106 (17 18 40 39)
107 (18 19 41 40)
108 (19 20 42 41)
109 (20 21 43 42)
110 );
111 }
112 upperWall
113 {
114 type wall;
115 faces
116 (
117 (3 25 31 9)
118 (9 31 37 15)
119 (15 37 43 21)
120 );
121 }
122 lowerWall
123 {
124 type wall;
125 faces
126 (
127 (0 6 28 22)
128 (6 5 27 28)
129 (5 4 26 27)
130 (4 10 32 26)
131 (10 16 38 32)
132 );
133 }
134 frontAndBack
135 {
136 type empty;
137 faces
138 (
139 (22 28 29 23)
140 (23 29 30 24)
141 (24 30 31 25)
142 (26 32 33 27)
143 (27 33 34 28)
144 (28 34 35 29)
145 (29 35 36 30)
146 (30 36 37 31)
147 (32 38 39 33)
148 (33 39 40 34)
149 (34 40 41 35)
150 (35 41 42 36)
151 (36 42 43 37)
152 (0 1 7 6)
153 (1 2 8 7)
154 (2 3 9 8)
155 (4 5 11 10)
156 (5 6 12 11)
157 (6 7 13 12)
158 (7 8 14 13)
159 (8 9 15 14)
160 (10 11 17 16)
161 (11 12 18 17)
162 (12 13 19 18)
163 (13 14 20 19)
164 (14 15 21 20)
165 );
53
166 }
167 );
168
169 mergePatchPairs
170 (
171 );
172
173 // ************************************************************************* //
3.2.3 边界条件和初始场
且
𝑘 = 1.5(0.5)2 = 0.375𝑚2/𝑠 2 (3.6)
如果我们假定湍流尺度为入口边界长度的十分之一有:
𝐶𝜇0.75 𝑘1.5 0.090.75 0.3751.5
ε= 𝑙
= 0.1×25.4×10−3
= 14855𝑚2 /𝑠 2 (3.7)
3.2.4 求解器的控制参数
步长只用于稳态计算中的迭代次数进行计数。这个算例需要至少一千次迭代才能收敛,所以,
我们将 endTime 设置为 1000。我们还需要保证存储足够的时间步且不会太多,这样可以设
置为 50 步一写,以保证用户的硬盘空间不会在算例运行过程中被数据填满。
3.2.5 运行算例和后处理
图 3.6 后面台阶问题中的漩涡发展
接下来我们运行程序并且对运行结果进行后处理。在几步迭代之后,比如 50 步,在台阶的
尖角下方会出现一个漩涡,但是漩涡在 x 方向上长度很短,如图 3.6(a)所示。在 1000 个
时间步之后,漩涡沿着 x 方向从台阶处一直延伸到出口处,此时系统已经达到稳态,并且漩
涡已经充分发展,如图 3.6(b-c)所示。
3.3 前向台阶的超音速绕流
在这个算例中,我们将会探究前向台阶的超音速绕流。在这个算例中,入口速度马赫数为 3,
在入口附近有一个台阶,在台阶附近会产生激波。
这个算例主要涉及 OpenFOAM 的如下特性:
超音速问题的求解
3.3.1 问题阐述
计算域:计算域是二维的,并且由一个入口区域和一个前向台阶组成。台阶的高度占入口长
55
图 3.7 前向台阶的几何模型
控制方程:
质量守恒方程:
∂𝜌
∂t
+ ∇ ∙ (𝜌𝐔) = 0 (3.8)
理想气体状态方程:
𝑝 = 𝜌𝑅𝑇 (3.9)
牛顿流体的动量守恒方程:
∂𝜌𝐔
∂t
+ ∇ ∙ (𝜌𝐔𝐔) − ∇ ∙ 𝜇∇𝐔 = −∇𝑝 (3.10)
,e = 𝐶𝑣 𝑇,和傅里叶定律,q = −k∇T:
能量方程(忽略粘性项)
∂𝜌e 𝑘
+ ∇ ∙ (𝜌𝐔e) − ∇ ∙ ∇e = −𝑝∇ ∙ 𝐔 (3.11)
∂t 𝐶𝑣
边界条件:
物性:
空气的动力粘度系数为𝜇 = 18.1μPas;
热力学性质:
算例名称:forwardStep,其位于$FOAM_TUTORIALS/sonicFoam 文件夹中;
求解器名称:sonicFoam:为可压缩流体的超音速和跨音速问题设计的求解器;
3.3.2 网格生成
本算例中所应用的网格比较简单,用大小相同的长方体网格生成即可。这些长方体网格在 x
方向长 0.06m,y 方向长 0.05m。整个计算域可以被分为三个 block,一个在台阶上沿下方,
两 个 在 台 阶 上 沿 上 方 ( 分 列 于 台 阶 两 侧 )。 关 于 网 格 的 信 息 被 储 存 在 如 下 所 示 的
blockMeshDict 文件之中:
48 );
49
50 boundary
51 (
52 inlet
53 {
54 type patch;
55 faces
56 (
57 (0 8 10 2)
58 (2 10 13 5)
59 );
60 }
61 outlet
62 {
63 type patch;
64 faces
65 (
66 (4 7 15 12)
67 );
68 }
69 bottom
70 {
71 type symmetryPlane;
72 faces
73 (
74 (0 1 9 8)
75 );
76 }
77 top
78 {
79 type symmetryPlane;
80 faces
81 (
82 (5 13 14 6)
83 (6 14 15 7)
84 );
85 }
86 obstacle
87 {
88 type patch;
89 faces
90 (
91 (1 3 11 9)
92 (3 4 12 11)
93 );
94 }
95 );
96
97 mergePatchPairs
98 (
99 );
100
101 // ************************************************************************* //
3.3.3 运行算例
3.3.4 练习
用户可以检验入口速度的升高对于解的影响。
58
图 3.8 前向台阶问题中的激波
3.4 高压水箱放水问题
在这个算例中,我们将会探究一个装满水的高压水箱放水问题。这个问题的一大特点是压力
波的传播,因此,这个算例必须要考虑流体的可压缩性。
这个算例涉及到了 OpenFOAM 的如下特性:
网格加密;
流体中的压力波;
3.4.1 问题阐述
图 3.9 带有泄流管道的水箱示意图
控制方程:在这个问题中,为了能够准确捕捉以有限速度传播的压力波,我们需要考虑流体
的压缩性𝜓。我们将利用正压关系(barotropic relationship)来将压力、密度和压缩性𝜓联系
在一起:
质量守恒方程:
∂𝜌
+ ∇ ∙ (𝜌𝐔) = 0 (3.13)
∂t
59
正压关系:
𝜕𝜌 𝜌
= =𝜓 (3.14)
𝜕𝑝 𝐾
K是体积模量;
公式 3.14 被线性化为:
𝜌 ≈ 𝜌0 + 𝜓(𝑝 − 𝑝0 ) (3.15)
𝜌0 和𝑝0 分别为参考密度和参考压力,𝜌(𝑝0 ) = 𝜌0;
牛顿流体的动量守恒方程:
∂𝜌𝐔
∂t
+ ∇ ∙ (𝜌𝐔𝐔) − ∇ ∙ 𝜇∇𝐔 = −∇𝑝 (3.16)
边界条件:使用 FoamX,将边界条件设置如下:
物性:
水的动力粘度系数为𝜇 = 1.0mPas;
热力学性质:
水的密度:𝜌 = 1000kg/m3;
参考压力:𝑝0 = 1 𝑏𝑎𝑟;
水的压缩性:𝜓 = 4.54 × 10−7 𝑠 2 /𝑚2 ;
求解器名称:sonicLiquidFoam,用来求解可压缩超音速层流问题;
算例名称:decompressionTank,这个算例位于$FOAM_TUTORIALS/sonicLiquidFoam 文件夹
中;
3.4.2 网格的生成
7 \*--------------------------------------------------------------------------------------------------------------------------*/
8 FoamFile
9 {
10 version 2.0;
11 format ascii;
12 class dictionary;
13 object blockMeshDict;
14 }
15 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
16
17 convertToMeters 0.1;
18
19 vertices
20 (
21 (0 0 -0.1)
22 (1 0 -0.1)
23 (0 0.5 -0.1)
24 (1 0.5 -0.1)
25 (1.5 0.5 -0.1)
26 (0 0.6 -0.1)
27 (1 0.6 -0.1)
28 (1.5 0.6 -0.1)
29 (0 3 -0.1)
30 (1 3 -0.1)
31 (0 0 0.1)
32 (1 0 0.1)
33 (0 0.5 0.1)
34 (1 0.5 0.1)
35 (1.5 0.5 0.1)
36 (0 0.6 0.1)
37 (1 0.6 0.1)
38 (1.5 0.6 0.1)
39 (0 3 0.1)
40 (1 3 0.1)
41 );
42
43 blocks
44 (
45 hex (0 1 3 2 10 11 13 12) (30 20 1) simpleGrading (1 1 1)
46 hex (2 3 6 5 12 13 16 15) (30 5 1) simpleGrading (1 1 1)
47 hex (3 4 7 6 13 14 17 16) (25 5 1) simpleGrading (1 1 1)
48 hex (5 6 9 8 15 16 19 18) (30 95 1) simpleGrading (1 1 1)
49 );
50
51 edges
52 (
53 );
54
55 boundary
56 (
57 outerWall
58 {
59 type wall;
60 faces
61 (
62 (0 1 11 10)
63 (1 3 13 11)
64 (3 4 14 13)
65 (7 6 16 17)
66 (6 9 19 16)
67 (9 8 18 19)
68 );
69 }
70 axis
71 {
72 type symmetryPlane;
73 faces
74 (
75 (0 10 12 2)
76 (2 12 15 5)
77 (5 15 18 8)
78 );
79 }
80 nozzle
81 {
82 type patch;
83 faces
84 (
85 (4 7 17 14)
86 );
61
87 }
88 back
89 {
90 type empty;
91 faces
92 (
93 (0 2 3 1)
94 (2 5 6 3)
95 (3 6 7 4)
96 (5 8 9 6)
97 );
98 }
99 front
100 {
101 type empty;
102 faces
103 (
104 (10 11 13 12)
105 (12 13 16 15)
106 (13 14 17 16)
107 (15 16 19 18)
108 );
109 }
110 );
111
112 mergePatchPairs
113 (
114 );
115
116 // ************************************************************************* //
为了提高计算的准确性,我们将参考压力设置为 1 bar。需要注意的是,初始场和边界条件
中的压力都应该被参考压力值抵消一部分。
3.4.3 准备运行算例
19
20 startFrom startTime;
21
22 startTime 0;
23
24 stopAt endTime;
25
26 endTime 0.0001;
27
28 deltaT 5e-07;
29
30 writeControl timeStep;
31
32 writeInterval 20;
33
34 purgeWrite 0;
35
36 writeFormat ascii;
37
38 writePrecision 6;
39
40 writeCompression off;
41
42 timeFormat general;
43
44 timePrecision 6;
45
46 runTimeModifiable true;
47
48
49 // ************************************************************************* //
3.4.4 运行算例
图 3.10 压力波的传播
清晰地观察压力波。
如果我们让算例运行足够长的时间,让压力波充分的反射回喷管,我们可以清楚地在喷
管中观察到绝对负压。这个现象非常合理且有物理依据,因为流体能够承受张力(比如说负
压)。然而,在实际情况下,由于液体的非纯净性,液体中为溶解的气体对流体流动会产生
一定的空化效果(由于负压产生的气泡,沸腾和气化的效果一样) 。因此,在实际情况下,
我们不会观察到压力下降到气化压力之下(至少在产生气泡之前) 。
3.4.5 细化网格来获得更精确解
图 3.11 更加细化的网格中的压力波传播
通过观察压力场随时间的变化,我们可以看到压力波传入水箱中,并且在各个壁面之间进行
反射。我们也可以清楚的看到压力波在某些网格区域有所聚集。现在,为了更好的捕捉压力
波,我们对网格进行细化,并且减小时间步长。我们只需要将 blockMeshDict 里面的网格数
乘以 4,比如 block 0 的网格数从(30,20,1)增加到(120,80,1)。在文件目录下运行
除此之外,
blockMesh。 为了将 Co 数控制在 1 以内,我们也应该将时间步长缩小到∆t = 10−7 𝑠。
如图 3.11 所示,加密之后的网格明显能够得到更精确的结果。
3.5 磁流体问题
在这个算例中,我们将会探究流过磁场的导电流体。这类问题被称为磁流体问题,我们用
mhdFoam 来解决类似问题。
64
3.5.1 问题阐述
计算域:计算域是二维的,由两个平行的平板组成,流体从两个平板之间流过,如图 3.12 所
示:
控制方程:
不可压缩流体的质量守恒方程:
∇∙𝐔=0 (3.19)
不可压缩缩流体的动量守恒方程:
∂𝐔
+ ∇ ∙ (𝑼𝑼) + ∇ ∙ (2𝑩Γ𝐵𝑈 𝑩) + ∇ ∙ (𝜈𝑼) + ∇(Γ𝐵𝑈 𝑩: 𝑩) = −∇𝑝 (3.20)
∂t
B 为磁感应强度,Γ𝐵𝑈 = (2𝜇𝜌)−1;
麦克斯韦方程组:
∂𝐁
∇ × 𝐄 = − ∂t (3.21)
E 为电场强度;
∇∙𝐁 =0 (3.22)
𝜕𝑫
∇×𝑯= 𝑱+ 𝜕𝑡
=𝑱 (3.23)
𝜕𝑫
假设 𝜕𝑡 ≪ 𝑱,这里 H 为磁场强度,J 为电流密度,D 为电通量密度;
电流连续性:
∇∙𝐉 =0 (3.24)
65
本构方程:
𝐁 = 𝜇𝐇 (3.25)
欧姆定律:
𝐉 = σ(𝐄 + 𝐔 × 𝐁) (3.26)
边界条件:
物性:
求解器名称:mhdFoam:用于求解不可压缩层流磁流体问题的求解器;
算例名称:hartmann,这个算例位于$FOAM_TUTORIALS/mhdFoam 文件夹中;
3.5.2 网格的生成
18
19 vertices
20 (
21 (0 -1 0)
22 (20 -1 0)
23 (20 1 0)
24 (0 1 0)
25 (0 -1 0.1)
26 (20 -1 0.1)
27 (20 1 0.1)
28 (0 1 0.1)
29 );
30
31 blocks
32 (
33 hex (0 1 2 3 4 5 6 7) (100 40 1) simpleGrading (1 1 1)
34 );
35
36 edges
37 (
38 );
39
40 boundary
41 (
42 inlet
43 {
44 type patch;
45 faces
46 (
47 (0 4 7 3)
48 );
49 }
50 outlet
51 {
52 type patch;
53 faces
54 (
55 (2 6 5 1)
56 );
57 }
58 lowerWall
59 {
60 type patch;
61 faces
62 (
63 (1 5 4 0)
64 );
65 }
66 upperWall
67 {
68 type patch;
69 faces
70 (
71 (3 7 6 2)
72 );
73 }
74 frontAndBack
75 {
76 type empty;
77 faces
78 (
79 (0 3 2 1)
80 (4 5 6 7)
81 );
82 }
83 );
84
85 mergePatchPairs
86 (
87 );
88
89 // ************************************************************************* //
3.5.3 运行算例
量场 U 转化为 U 各个分量的标量场。磁流体问题与许多参数相关,这些参数构成了无量纲
的 Hartmann 数。它表征电磁力和粘性力的比值:
𝜎
𝑀 = 𝐵𝐿√𝜌𝜈 (3.28)
操作符 数 A B C D E F G H I J K L M N O P Q R S T U V W X Z