OpenFOAM 中的边界条件(二)【转载】
转载链接: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 中的边界条件(二)【转载】的更多相关文章
- OpenFOAM 中的边界条件(一)【转载】
链接:http://xiaopingqiu.github.io/2016/04/02/Boundary-conditions-in-OpenFOAM1/ 本系列解读 OpenFOAM 中边界条件的实现 ...
- 如何在OpenFOAM中增加边界条件【翻译】
注:如有翻译不妥,还请见谅 翻译自:http://openfoamwiki.net/index.php/HowTo_Adding_a_new_boundary_condition 首先请看:http: ...
- OpenFOAM 中边界条件的设定【转载】
转载自:http://blog.sina.com.cn/s/blog_a0b4201d0102v7jt.html 用习惯了FLUENT的操作界面,再使用OpenFOAM就会觉得非常繁琐.遇到的第一个问 ...
- <转载>c++中new一个二维数组
原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int byte long... 1.dataType (*num)[n] = n ...
- C语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...
- C++中的异常处理(二)
C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报 分类: C++编程语言(24) 版权声明:本文为博主原创文章,未经 ...
- C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)
C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...
- IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)
问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时 ...
- c#中的linq二
c#中的linq二 using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...
随机推荐
- 使用SAP Cloud Platform Leonardo机器学习的测试控制台
选中一个需要进行测试的Leonardo机器学习服务,点击Configure Environments: 因为我不想使用sandbox环境,所以我选择了eu10这个region: 维护clientid和 ...
- 3-JavaSe-1-stream-1-流库特征
1.parallelStream可以让流库以并行方式来执行过滤和计数. String content=new String(Files.readAllBytes(Paths.get("D:\ ...
- 支付宝手机网站支付(基于Java实现支付宝手机网站支付)
支付宝支付核心需要的参数是(APPID,PRIVATE_KEY,ALIPAY_PUBLIC_KEY) APPID:创建应用后就有的APPID. PRIVATE_KEY:应用私钥 ALIPAY_PUBL ...
- Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息
之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...
- Mysql之数据库简介
一.什么是数据库? 据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的 过去人们将数据存放在文件柜里,现在数据量庞大,已经不再适用 数据库是长期存放在计算机内.有组 ...
- 【深度学习】基于Pytorch的ResNet实现
目录 1. ResNet理论 2. pytorch实现 2.1 基础卷积 2.2 模块 2.3 使用ResNet模块进行迁移学习 1. ResNet理论 论文:https://arxiv.org/pd ...
- 基于fastai的分类网络
classify.fastai Classifier based on fastai 欢迎访问:https://github.com/pprp/classify.fastai/ 字符识别分类器-基于f ...
- JS函数篇【2】
什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. <h3 onload="add2(1,2,3);add3(4,5,6)"></h3> &l ...
- Song Form
First of all, song form is an indepentent concept from the boxes, boxes simply describe the way the ...
- ReLU激活函数
参考:https://blog.csdn.net/cherrylvlei/article/details/53149381 首先,我们来看一下ReLU激活函数的形式,如下图: 单侧抑制,当模型增加N层 ...