经验大分享:OpenFOAM中的边界条件(一)

简介: 经验大分享:OpenFOAM中的边界条件(一)

博客园:硫酸亚铜

原文链接:

本系列解读 OpenFOAM 中边界条件的实现。主要关心一些几个问题:

OpenFOAM 中边界条件是怎样与有限体积离散部分交互的?

怎么从代码看懂一个边界条件具体是怎么计算边界上的值的?

怎么定制一个边界条件?

本篇先阐述第一个问题。

从有限体积离散的角度来看,离散过程中,可能要用到的边界信息包括两类:一是某个场在边界上的值,另一是某个场在边界上的梯度。前者在对流项的离散中需要用到,举例说

当组成体积元的面中有边界面时,需要用到这些边界面上的值 ?f。

而在扩散项的离散过程中

这时,如果组成体积元的某个面是边界面,就需要该边界面上 ?的梯度值 ??f 了。

边界上的某个场值,或者梯度值,其计算方法可以用如下通式表示

这里,?C表示?在邻近边界的网格中心的值,A1 ,B1,A2,B2是系数。

OpenFOAM 中的边界条件类中,有四个函数分别对应上面四个系数:valueInternalCoeffs 对应A1,valueBoundaryCoeffs 对应 B1,gradientInternalCoeffs对应 A2,gradientBoundaryCoeffs对应B2。

所以,看懂 OpenFOAM 中的边界条件,很关键的一步就是看懂这四个函数的定义。

此外,还有一个函数,updateCoeffs, 也很重要。这个函数负责对边界条件进行显式地更新。浏览一下 OpenFOAM 边界条件的代码,会发现很多边界条件都是在 updateCoeffs 这个函数中进行边界值的计算的。

另外,还有些边界条件,似乎是在 evaluate 函数中进行边界值的指定的。

至于边界条件是在什么地方调用的,cfd-online 上有一个帖子,Hrvoje Jasak 对这个问题的回答是:

"

Easy:

- on correctBoundaryConditions() for a field

- on updateCoeffs() at matrix creation

correctBoundaryConditions is also called after the linear solver call automatically.

"

其他网友还提供了一些有价值的信息,比如,在 correctBoundaryConditions 函数中,

template

void Foam::GeometricField::

correctBoundaryConditions()

{

this->setUpToDate();

storeOldTimes();

boundaryField_.evaluate();

}

调用了 evaluate 函数。

为什么有些边界条件用 updateCoeffs(),而有些则用 evaluate() 呢?目前的理解是这样的: updateCoeffs() 主要用来显式地计算并更新变量在边界上的值,当边界上的值是通过某个依赖于外部参数的公式来计算,并且值会随着迭代的进行而不断改变时,则需要用 updateCoeffs()。有些边界条件,比如最基本的 //代码效果参考:http://www.zidongmutanji.com/zsjx/194807.html

zeroGradient(),不需要外部的参数,只需要每一次将临近网格的值赋给边界就可以了,这时就可以用 evaluate()。

关于边界条件调用的具体过程,需要在看了 fvMatrix 类以后才能更深入地理解,博主目前只能给出一个粗浅的理解。

参考资料:

The Finite Volume Method in Computational Fluid Dynamics: An Advanced Introduction with OpenFOAM? and Matlab?

相关文章
|
5月前
|
JSON 前端开发 数据格式
经验大分享:TheGeneofBitizens
经验大分享:TheGeneofBitizens
32 3
|
5月前
经验大分享:sdfdsf
经验大分享:sdfdsf
24 0
|
5月前
|
JSON 网络协议 Linux
经验大分享:serval
经验大分享:serval
23 0
|
5月前
|
机器学习/深度学习
经验大分享:Sicily1153
经验大分享:Sicily1153
26 0
|
6月前
|
安全 前端开发 开发者
干货!6个方面,32条总结教你提升职场经验
本文提出了职场成长的建议,包括不要依赖“新人”身份,撰写技术博客促进成长,阅读《金字塔原理》和《高效能人士的七个习惯》等书籍,积极解决问题,不沉迷于忙碌,长远看待得失,拓宽知识领域,保持好奇和热爱。日常工作要注重质量,主动规划,良好沟通,避免传播负面情绪,理解和尊重上级,学会被管理。培养定义问题的能力,以价值、结果和问题为导向思考,控制情绪,以及成为他人的追随者而非仅仅管理者。
|
测试技术 Linux Go
|
小程序 程序员 Windows
学习经验
写写自己的学习经验
|
存储 算法 Ubuntu
学习 C++ 的一点浅薄经验
工作所需,需要学习下 C++,今天就谈一下自己是怎么快速学习 C++,并且在工作中实际上手开发的,希望能够给大家一些启发。
160 0
|
机器学习/深度学习 存储 Cloud Native
如何在工作中快速成长?致工程师的 10 个简单技巧
精英人数的增长速度持续加快后,很多人开始焦虑,我也焦虑,深知要走出焦虑不容易,我想把走出焦虑快速成长的认知和方法写成文章分享给更多人,做成【技术人成长系列】文章给更多人面对面分享,该系列总共三篇,分别是《完成自己的认知升级》、《自我成长的方法》、《学会自我培养或培养他人》。本文是快速成长第一篇:“完成自己的认知升级”,内容偏长但值得仔细阅读。
如何在工作中快速成长?致工程师的 10 个简单技巧