关于壁面函数有些不懂
-
各位老师,这个壁变函数一直搞得浑浑噩噩的,看文献说“近 壁 区 高 Re数 采 用 的紊 动 各 向同 性 假 设 不 再 适 用,因而k-e紊 流 模式在 此 不 能 应 用,故 应 选 取 距 固 壁某 一 距 离 的 边 界作 为 计 算 边界。”这句有话有点不懂,k和e是取“距 固 壁某 一 距 离的值”作为边界条件吗?那固壁处怎么办,就不处理了吗
-
-
实在是不懂了,求解释:crying:
-
http://dyfluid.com/wallFunction.html
之前写过一些壁面函数的东西很详细,仅供参考。注意:(1)通过求解离散的k方程获取全场的k值;
(2)通过方程(28)确定壁面节点处的εP;
(3)通过方程(31)确定壁面节点处的νP;
(4)通过νP计算湍流动能耗散率传输方程中的壁面的湍流动能耗散率产生项;
(5)求解ε方程; -
@lsprxd 在 关于壁面函数有些不懂 中说:
无网格伽辽金法
很抱歉对伽辽金不是很熟悉。
你图片中的是求解NS方程和湍流模型的整体策略。壁面函数是在2.2和2.1之间内部调用的。OpenFOAM中的做法是:- 首先通过方程28求解网格面第一层网格体心得
epsilon
; - 通过方程35求解G;
- 求解
epsilon
方程,其中epsilon
的边界条件极为第一层网格体心得epsilon
,也就是你之前发的中文部分的内容; - 然后求解
k
- 然后通过
k
和epsilon
更新wall粘度
- 首先通过方程28求解网格面第一层网格体心得
-
-
@random_ran
好多文献就是这样的,给定初值,求解N-S,得到速度带入k-e,更新湍流粘度。就是第二张图片那个连接里面的,而且他直接在wall上设置k和e为0
-
-
在网上看的有人这样说的“最简单的办法是用对第一个节点的K,E直接赋值,由U+,Y+计算ut(摩擦速度),K=ut*ut/sqrt(0.09),E=ut**3/y/0.42”,这个赋值是赋在壁面上?这个p点是距壁面y处的值,那这些赋值的位置应该是距壁面y处的所有值吗?
-
当求解湍流粘度的时候需要调用y+(看方程31),其可以采用不同的方法,最简单的方法就是我网页那种方法,然而另一种方法就是上文中提出的牛顿迭代法。俩种方法最后都需要使用方程31更新粘度。
下面是OpenFOAM中采用我网页中方法的步骤:
tmp<scalarField> nutkWallFunctionFvPatchScalarField::calcNut() const { const label patchi = patch().index(); const turbulenceModel& turbModel = db().lookupObject<turbulenceModel> ( IOobject::groupName ( turbulenceModel::propertiesName, internalField().group() ) ); const scalarField& y = turbModel.y()[patchi]; const tmp<volScalarField> tk = turbModel.k(); const volScalarField& k = tk(); const tmp<scalarField> tnuw = turbModel.nu(patchi); const scalarField& nuw = tnuw(); const scalar Cmu25 = pow025(Cmu_); tmp<scalarField> tnutw(new scalarField(patch().size(), 0.0)); scalarField& nutw = tnutw.ref(); forAll(nutw, facei) { label faceCelli = patch().faceCells()[facei]; scalar yPlus = Cmu25*y[facei]*sqrt(k[faceCelli])/nuw[facei];//简单计算y+ if (yPlus > yPlusLam_) { nutw[facei] = nuw[facei]*(yPlus*kappa_/log(E_*yPlus) - 1.0);//方程31 } } return tnutw; } 下面是OpenFOAM中采用你截图的迭代法求解的步骤:
tmp<scalarField> nutUWallFunctionFvPatchScalarField::calcNut() const { const label patchi = patch().index(); const turbulenceModel& turbModel = db().lookupObject<turbulenceModel> ( IOobject::groupName ( turbulenceModel::propertiesName, internalField().group() ) ); const fvPatchVectorField& Uw = turbModel.U().boundaryField()[patchi]; const scalarField magUp(mag(Uw.patchInternalField() - Uw)); const tmp<scalarField> tnuw = turbModel.nu(patchi); const scalarField& nuw = tnuw(); tmp<scalarField> tyPlus = calcYPlus(magUp);//通过速度迭代计算y+ scalarField& yPlus = tyPlus.ref(); tmp<scalarField> tnutw(new scalarField(patch().size(), 0.0)); scalarField& nutw = tnutw.ref(); forAll(yPlus, facei) { if (yPlus[facei] > yPlusLam_) { nutw[facei] = nuw[facei]*(yPlus[facei]*kappa_/log(E_*yPlus[facei]) - 1.0);//方程31 } } return tnutw; } 一直时间很紧没有时间细看这个帖子,不过看起来非常有意思,近期我更新一下你贴图那种方法的思路。
10/26