转载链接:http://xiaopingqiu.github.io/2016/04/02/Boundary-conditions-in-OpenFOAM2/

本篇在上一篇的基础上来解读 OpenFOAM 中的基础边界条件。基础边界条件一般包括三类,一是Dirichlet 边界,二是 Neumann 边界,三是混合 Dirichlet 和 Neumann 的边界。

1.
fixedValue

这个是 OpenFOAM 中的 Dirichlet 边界条件。

  • 构造函数

template<class
Type>

fixedValueFvPatchField<Type>::fixedValueFvPatchField

(

const
fvPatch& p,

const
DimensionedField<Type,
volMesh>& iF,

const
dictionary& dict

)

:

fvPatchField<Type>(p,
iF, dict, true)

{}

熟悉 OpenFOAM 的人都知道, fixedValue 这个边界条件需要用 value 关键字来指定边界的值。value 这个关键字是通过 DimensionedField 类来处理的。 DimensionedField 这个类将读取 value 关键字对应的场的值用来初始化边界上的值。

  • Coefficients

template<class
Type>

tmp<Field<Type>
>
fixedValueFvPatchField<Type>::valueInternalCoeffs

(

const
tmp<scalarField>&

)
const

{

return
tmp<Field<Type>
>

(

new
Field<Type>(this->size(),
pTraits<Type>::zero)

);

}

template<class
Type>

tmp<Field<Type>
>
fixedValueFvPatchField<Type>::valueBoundaryCoeffs

(

const
tmp<scalarField>&

)
const

{

return
*this;

}

这里 "*this" 表示类本身,即当前边界上的值。这个值在上面的构造函数中进行了初始化,所以,可以理解为
valueBoundaryCoeffs
函数返回的正是关键字 "value" 所对应的值。

template<class
Type>

tmp<Field<Type>
>
fixedValueFvPatchField<Type>::gradientInternalCoeffs()
const

{

return
-pTraits<Type>::one*this->patch().deltaCoeffs();

}

template<class
Type>

tmp<Field<Type>
>
fixedValueFvPatchField<Type>::gradientBoundaryCoeffs()
const

{

return
this->patch().deltaCoeffs()*(*this);

}

中的边界条件(二)【转载】">

其中 delta为面心与面所属网格中心的距离的倒数。

从上述系数,可以知道,fixedValue 边界条件对边界的值和梯度值的计算为如下:

中的边界条件(二)【转载】">

这与预期是一致的。

2.
zeroGradient

这个是 OpenFOAM 中的一种特殊的 Neumann 边界条件,即边界的梯度为零。

  • evaluate
    函数

template<class
Type>

void
zeroGradientFvPatchField<Type>::evaluate(const
Pstream::commsTypes)

{

if
(!this->updated())

{

this->updateCoeffs();

}

fvPatchField<Type>::operator==(this->patchInternalField());

fvPatchField<Type>::evaluate();

}

注意,这里的 operator== 与 operator= 的作用是一样的,都是赋值运算,而不是比较。

  • coefficients

template<class
Type>

tmp<Field<Type>
>
zeroGradientFvPatchField<Type>::valueInternalCoeffs

(

const
tmp<scalarField>&

)
const

{

return
tmp<Field<Type>
>

(

new
Field<Type>(this->size(),
pTraits<Type>::one)

);

}

template<class
Type>

tmp<Field<Type>
>
zeroGradientFvPatchField<Type>::valueBoundaryCoeffs

(

const
tmp<scalarField>&

)
const

{

return
tmp<Field<Type>
>

(

new
Field<Type>(this->size(),
pTraits<Type>::zero)

);

}

template<class
Type>

tmp<Field<Type>
>
zeroGradientFvPatchField<Type>::gradientInternalCoeffs()
const

{

return
tmp<Field<Type>
>

(

new
Field<Type>(this->size(),
pTraits<Type>::zero)

);

}

template<class
Type>

tmp<Field<Type>
>
zeroGradientFvPatchField<Type>::gradientBoundaryCoeffs()
const

{

return
tmp<Field<Type>
>

(

new
Field<Type>(this->size(),
pTraits<Type>::zero)

);

}

中的边界条件(二)【转载】">

从上述系数,可以知道,fixedValue 边界条件对边界的值和梯度值的计算为如下:

中的边界条件(二)【转载】">

这与预期是一致的。

3. fixedGradient

这个是
OpenFOAM 中的 Neumann 边界条件,可以指定边界上的梯度值。

  • 构造函数

template<class
Type>

fixedGradientFvPatchField<Type>::fixedGradientFvPatchField

(

const
fvPatch& p,

const
DimensionedField<Type,
volMesh>& iF,

const
dictionary& dict

)

:

fvPatchField<Type>(p,
iF, dict),

gradient_("gradient", dict,
p.size())

{

evaluate();

}

需要读取关键字 "gradient" 对应的值来初始化变量 gradient_。

  • evaluate
    函数

template<class
Type>

void
fixedGradientFvPatchField<Type>::evaluate(const
Pstream::commsTypes)

{

if
(!this->updated())

{

this->updateCoeffs();

}

Field<Type>::operator=

(

this->patchInternalField()
+ gradient_/this->patch().deltaCoeffs()

);

fvPatchField<Type>::evaluate();

}

中的边界条件(二)【转载】">

其中 delta 为面心与面所属网格中心的距离的倒数。

  • coefficients

template<class
Type>

tmp<Field<Type>
>
fixedGradientFvPatchField<Type>::valueInternalCoeffs

(

const
tmp<scalarField>&

)
const

{

return
tmp<Field<Type>
>(new
Field<Type>(this->size(),
pTraits<Type>::one));

}

template<class
Type>

tmp<Field<Type>
>
fixedGradientFvPatchField<Type>::valueBoundaryCoeffs

(

const
tmp<scalarField>&

)
const

{

return
gradient()/this->patch().deltaCoeffs();

}

template<class
Type>

tmp<Field<Type>
>
fixedGradientFvPatchField<Type>::

gradientInternalCoeffs()
const

{

return
tmp<Field<Type>
>

(

new
Field<Type>(this->size(),
pTraits<Type>::zero)

);

}

template<class
Type>

tmp<Field<Type>
>
fixedGradientFvPatchField<Type>::

中的边界条件(二)【转载】">

4.
mixed

这是 OpenFOAM 中的混合边界条件。

  • 构造函数

template<class
Type>

mixedFvPatchField<Type>::mixedFvPatchField

(

const
fvPatch& p,

const
DimensionedField<Type,
volMesh>& iF,

const
dictionary& dict

)

:

fvPatchField<Type>(p,
iF, dict),

refValue_("refValue", dict,
p.size()),

refGrad_("refGradient",
dict, p.size()),

valueFraction_("valueFraction",
dict, p.size())

{

evaluate();

}

需要读取三个参数。

  • Evaluate

template<class
Type>

void
mixedFvPatchField<Type>::evaluate(const
Pstream::commsTypes)

{

if
(!this->updated())

{

this->updateCoeffs();

}

Field<Type>::operator=

(

valueFraction_*refValue_

+

(1.0 -
valueFraction_)*

(

this->patchInternalField()

+
refGrad_/this->patch().deltaCoeffs()

)

);

fvPatchField<Type>::evaluate();

}

中的边界条件(二)【转载】">

  • Coefficients

template<class
Type>

tmp<Field<Type>
>
mixedFvPatchField<Type>::valueInternalCoeffs

(

const
tmp<scalarField>&

)
const

{

return
Type(pTraits<Type>::one)*(1.0 -
valueFraction_);

}

template<class
Type>

tmp<Field<Type>
>
mixedFvPatchField<Type>::valueBoundaryCoeffs

(

const
tmp<scalarField>&

)
const

{

return

valueFraction_*refValue_

+ (1.0 -
valueFraction_)*refGrad_/this->patch().deltaCoeffs();

}

template<class
Type>

tmp<Field<Type>
>
mixedFvPatchField<Type>::gradientInternalCoeffs()
const

{

return
-Type(pTraits<Type>::one)*valueFraction_*this->patch().deltaCoeffs();

}

template<class
Type>

tmp<Field<Type>
>
mixedFvPatchField<Type>::gradientBoundaryCoeffs()
const

{

return

valueFraction_*this->patch().deltaCoeffs()*refValue_

+ (1.0 -
valueFraction_)*refGrad_;

}

中的边界条件(二)【转载】">

附注:本篇中所有的下标
pp 都表示当前边界(present boundary patch),下标 CC 表示当前边界所属的网格的中心。

OpenFOAM 中的边界条件(二)【转载】的更多相关文章

  1. OpenFOAM 中的边界条件(一)【转载】

    链接:http://xiaopingqiu.github.io/2016/04/02/Boundary-conditions-in-OpenFOAM1/ 本系列解读 OpenFOAM 中边界条件的实现 ...

  2. 如何在OpenFOAM中增加边界条件【翻译】

    注:如有翻译不妥,还请见谅 翻译自:http://openfoamwiki.net/index.php/HowTo_Adding_a_new_boundary_condition 首先请看:http: ...

  3. OpenFOAM 中边界条件的设定【转载】

    转载自:http://blog.sina.com.cn/s/blog_a0b4201d0102v7jt.html 用习惯了FLUENT的操作界面,再使用OpenFOAM就会觉得非常繁琐.遇到的第一个问 ...

  4. <转载>c++中new一个二维数组

    原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int  byte  long... 1.dataType (*num)[n] = n ...

  5. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  6. C++中的异常处理(二)

    C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报  分类: C++编程语言(24)  版权声明:本文为博主原创文章,未经 ...

  7. C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)

    C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...

  8. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

  9. c#中的linq二

    c#中的linq二   using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...

随机推荐

  1. wstngfw中配置freeradius

    wstngfw中配置freeradius Radius为各种网络设备和服务提供了一个认证来源. Radius认证常用于***.入网门户.交换机.路由器和防火墙.Radius认证比在网络上的不同设备跟踪 ...

  2. iOS - SceneKit 3D引擎初探

    最近到处搜集资料研究3D最后还是决定锁定OC框架,找到的学习资料随后慢慢整理 SceneKit 是一个OC 框架,开始之前,先熟悉一下SceneKit 的三维坐标系: 很清楚的看到,SceneKit ...

  3. JavaScript中对null和undefined的理解

    前沿: 今天工作中遇到了监视一个变量是undefined,结果判断写的是==null 返回值是true,这个结果引起了我对这两个东西的兴趣. 查询了相关的文章理解并测试了.发现有以下特点: 1.广义上 ...

  4. 如何:确定已安装的 .NET Framework 版本

    用户可在他们的计算机上安装和运行 .NET Framework 的多个版本. 当你开发或部署应用时,你可能需要知道用户的计算机上安装了哪些 .NET Framework 版本. .NET Framew ...

  5. Android笔记(九) Android中的布局——框架布局

    框架布局没有任何定位方式,所有的控件都会摆放在布局的左上角. 代码示例: framelayout.xml <?xml version="1.0" encoding=" ...

  6. 第十八篇:简易版web服务器开发

    在上篇有实现了一个静态的web服务器,可以接收web浏览器的请求,随后对请求消息进行解析,获取客户想要文件的文件名,随后根据文件名返回响应消息:那么这篇我们对该web服务器进行改善,通过多任务.非阻塞 ...

  7. 有关Error during sbt execution: No Scala version specified or detected的解决方案--SBT

    sbt 全称为 Simple Build Tool,是 Scala 项目中的标准构建工具,类似于 Java 下的 Maven/Groovy 中的 Gradle. 项目的构建 项目依赖自动化管理 提供统 ...

  8. Codeforces 750 E New Year and Old Subsequence

    E. New Year and Old Subsequence 思路:线段树维护矩阵乘法. 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...

  9. cvte2018春招前端开发实习面试分享

    编程题问题描述: 返回整数数组中出现次数第n多的数字(返回值可能有多个) 最近在找实习,面试二面最后出了一道这样的编程题,当时有思路但语法有错误,而且很紧张,最后没有运行出来,导致凉凉,回来重新思考了 ...

  10. Java基础面试题1

    http://blog.csdn.net/jackfrued/article/details/44921941 1.面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面: - 抽象:抽象 ...