@疏影横斜水清浅 在 大气边界层迎风坡台阶地形的风场模拟 中说:
@cccrrryyy 不是发散,是结果不对,非常明显。我已经找到错误原因了,我的压力边界设置错误了,设置成零梯度了,改成零压力计算结果就可以了。再次谢谢您,也谢谢各位大佬吧友的解答。
你好,请问你说的是上边界的压力零梯度改为固定值0就正常了吗
@疏影横斜水清浅 在 大气边界层迎风坡台阶地形的风场模拟 中说:
@cccrrryyy 不是发散,是结果不对,非常明显。我已经找到错误原因了,我的压力边界设置错误了,设置成零梯度了,改成零压力计算结果就可以了。再次谢谢您,也谢谢各位大佬吧友的解答。
你好,请问你说的是上边界的压力零梯度改为固定值0就正常了吗
手动直接改那个时间步的边界条件就可以,只不过需要下拉到最下面一点
decomposePar -latestTime 可以不
@李东岳 在 请教一下标准k-epsilon湍流模型中的epsilon_()与k_()与epsilon_和k_有什么区别 中说:
目的:减少并行通信,从而降低并行计算的计算成本。(只有boundaryField才需要通信)
我不觉得是这个原因。我觉得应为这个是源项。源项是源项。源项不应该对boundary产生印象。
感谢李老师回复, 我再查查看看
https://www.cfd-online.com/Forums/openfoam-programming-development/224302-difference-between-rho-rho_-rho.html
@李东岳 李老师,这里。修正下:大部分通信发生在boundaryField
另外,两个湍流模型里的divU
和G
的定义也不一样:
//standard k-epsilon
volScalarField::Internal divU
(
fvc::div(fvc::absolute(this->phi(), U))()
);
tmp<volTensorField> tgradU = fvc::grad(U);
volScalarField::Internal G
(
this->GName(),
nut()*(dev(twoSymm(tgradU().v())) && tgradU().v())
);
//LaunderSharmaKE
volScalarField divU(fvc::div(fvc::absolute(this->phi(), U)));
tmp<volTensorField> tgradU = fvc::grad(U);
volScalarField G(this->GName(), nut*(tgradU() && dev(twoSymm(tgradU()))));
可以看到,标准模型里都是InternalField
epsilon,k
在声明时:
volScalarField epsilon_;
volScalarField k_;
这俩变量类型都是volScalarField
,volScalarField
就包含internalField
和boundaryField
,epsilon_()
和k_()
以及rho()
和alpha()
中的 operator()
返回internalField
,类型相当于volScalarField::Internal
目的:减少并行通信,从而降低并行计算的计算成本。(只有boundaryField才需要通信)
注意:epsilon_()
和k_()
以及rho()
和alpha()
使用时仅在方程右边构造源项
插个眼
各位大佬,
标准k-epsilon模型中的epsEqn:
// Dissipation equation
tmp<fvScalarMatrix> epsEqn
(
fvm::ddt(alpha, rho, epsilon_)
+ fvm::div(alphaRhoPhi, epsilon_)
- fvm::laplacian(alpha*rho*DepsilonEff(), epsilon_)
==
C1_*alpha()*rho()*G*epsilon_()/k_()
- fvm::SuSp(((2.0/3.0)*C1_ - C3_)*alpha()*rho()*divU, epsilon_)
- fvm::Sp(C2_*alpha()*rho()*epsilon_()/k_(), epsilon_)
+ epsilonSource()
+ fvModels.source(alpha, rho, epsilon_)
);
请问epsilon_()与k_()中的操作符()返回的是上一个迭代步/时间步的值吗?
另外,我想像LaunderSharmaKE一样改变这一项的系数
- fvm::Sp(C2_*alpha()*rho()*epsilon_()/k_(), epsilon_)
参考LaunderSharmaKE中定义系数的代码:
//LaunderSharmaKE.H声明
tmp<volScalarField> f2() const;
//LaunderSharmaKE.C定义
template<class BasicMomentumTransportModel>
tmp<volScalarField> LaunderSharmaKE<BasicMomentumTransportModel>::f2() const
{
return
scalar(1)
- 0.3*exp(-min(sqr(sqr(k_)/(this->nu()*epsilon_)), scalar(50.0)));
}
参考LaunderSharmaKE定义的epsilonEqn:
tmp<fvScalarMatrix> epsEqn
(
fvm::ddt(alpha, rho, epsilon_)
+ fvm::div(alphaRhoPhi, epsilon_)
- fvm::laplacian(alpha*rho*DepsilonEff(), epsilon_)
==
C1_*alpha*rho*G*epsilon_/k_
- fvm::SuSp(((2.0/3.0)*C1_ - C3_)*alpha*rho*divU, epsilon_)
- fvm::Sp(C2_*f2()*alpha*rho*epsilon_/k_, epsilon_)
+ alpha*rho*E
+ epsilonSource()
+ fvModels.source(alpha, rho, epsilon_)
);
LaunderSharmaKE中直接使用的是epsilon_,k_,不加括号表示的是下一个迭代步的待求值吗?
如果在标准k-epsilon中定义一模一样的函数f2()
,并加到eqsEqn
中,只有将标准k-epsilon中的epsilon_(), k_()
改为epsilon_, k_
,编译才能通过,否则会因为无法匹配Sp函数报错:
error: no matching function for call to ‘Sp(Foam::tmp<Foam::Field<double> >, Foam::volScalarField&)’
418 | - fvm::Sp(C2_*f2()*alpha()*rho()*epsilon_()/k_(), epsilon_)
那么我将epsilon_()/k_()
直接改为epsilon_/k_
会影响结果吗?
或者有没有其他解决方法
谢谢各位大佬!!
如上图,这样一个积分公式,k是湍动能,z是计算域高度。目前我仅能想到通过步进来计算:
sum = 0;
for(scalar z=0; z<=maxHeight; z=z+0.01)
{
sum += z*sqrt(k)*0.01;
}
想问下各位大佬怎么写成OpenFOAM风格的代码
@wangfei9088 在 求本大气边界层相关的电子书 An introduction to Boundary Layer Meteorology 中说:
@ShaneHEEE 咱就是说有没有可能论坛不能上传超过1M的文件?要不要留个邮箱?
感谢铁铁 ,1799361277@qq.com
Roland B. Stull的An introduction to Boundary Layer Meteorology,网上实在找不到资源了
@cccrrryyy velocity-inlet设置为负值好像不能表示出口
@李东岳 我这试了下system下创建fieldAverage文件并复制上述代码,删掉functions和fieldAverage1可以计算完成后处理,controDict不需要挂载,完整的文件内容如下
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
-------------------------------------------------------------------------------
Description
Calculates and writes the time averages of given list of fields.
\*---------------------------------------------------------------------------*/
type fieldAverage;
libs ( "libfieldFunctionObjects.so" );
writeControl writeTime;
timeStart 0;
timeEnd 100;
resetOnOutput false;
fields
(
U
{
mean on;
prime2Mean on;
base time;
}
);
@veen 大佬搞好没
@tens 啊这,谢谢前辈
李老师,我想请教一下您,为什么在kEpsilon等模型.C文件中计算湍流粘性系数的函数correctNut()给出的形式是这样的:
使用了k的平方根而不是二次方
template<class BasicTurbulenceModel>
void kEpsilon<BasicTurbulenceModel>::correctNut()
{
this->nut_ = Cmu_*sqr(k_)/epsilon_;
this->nut_.correctBoundaryConditions();
fv::options::New(this->mesh_).correct(this->nut_);
BasicTurbulenceModel::correctNut();
}
@我是河滩 sonicFoam
@李东岳 谢谢李老师回复,重新算了一下,这个错误自行消失了