@疏影横斜水清浅 在 大气边界层迎风坡台阶地形的风场模拟 中说:
@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
@李东岳 谢谢李老师回复,重新算了一下,这个错误自行消失了
@李东岳 李老师,您好,并行计算过程中修改stopAt为writeNow,接着reconstructPar看了下云图,再接着mpirun就会浮点超限,您遇到过这个情况吗
大家好啊,想问下大家有没有遇到这样的情况:
并行计算过程中修改stopAt为writeNow,接着reconstructPar看了下云图,再接着mpirun就会浮点超限
@xiaofenger tecplot2018可以
如果有人做过火焰面模型的超声速修正的话,可以加我微信18434360045,我想有偿请教下
大家好,最近在做火焰面模型的超声速修正,采用的方法是添加能量方程隐式求解温
度,修正基于flameletFoam ,参考了FPVCentralFoam:火焰面模型的超声速修正,其
中一种方法是只查询火焰面表中的组分质量分数,然后添加能量方程,通过能量方
程隐式求解温度,这个应该就是通过求解能量方程得到焓分布,再通过调用
thermo.correct();隐式求解温度。考虑到flameletFoam中的chemkinReader使用的是显焓
形式,我选取的还是显焓形成的能量方程(跟reactingFoam的形式一样,区别只是反
应源项不同),其他修改的部分参考了FPVCentralFoam
https://github.com/weixian001/FPVCentralFoam-v3.0.1
EEqn:
{
volScalarField& he=thermo.he();
volScalarField& dq=thermo.dq();
fvScalarMatrix EEqn
(
fvm::ddt(rho, he) + fvm::div(phi, he)
+ fvc::ddt(rho, K) + fvc::div(phi, K)
+ (
he.name() == "e"
? fvc::div
(
fvc::absolute(phi/fvc::interpolate(rho), U),
p,
"div(phiv,p)"
)
: -dpdt
)
- fvm::laplacian(turbulence->alphaEff(), he)
==
dq
);
EEqn.relax();
//fvOptions.constrain(EEqn);
EEqn.solve();
//fvOptions.correct(he);
// Calculate thermodynamic Properties, calculate T and other parameters
thermo.correct();
}
通过导入非燃烧火焰面数据计算冷态混合时得到的结果不对(燃烧解更不对)。我
注意到flamletFoam的前处理通过温度与各个组分的质量分数得到显焓:
void Foam::canteraReader::calculateEnthalpy()
{
Info << "calculate sensible Enthalpy" << endl;
scalar pstd = 1e5;
label labelT(tableNames_["T"]);
List<scalar> he(singleData_[labelT].size(), 0.0);
for (int i=0;i<singleData_[labelT].size();i++)
{
for (int j=0; j<thermo.composition().species().size();j++)
{
label k = composition.species()[tableNames_[j]];
he[i] += singleData_[j][i] * composition.Hs(k, pstd, singleData_[labelT][i]);
}
}
singleData_.append(he);
}
其中
he[i] += singleData_[j][i] * composition.Hs(k, pstd, singleData_[labelT][i]);
表示的是 h(T)=ΣYihi(T), i表示第i个组分,Y表示质量分数
由于火焰面模型不涉及化学反应,并且组分质量分数是通过查表得到的,我怀疑现
在通过求解添加的能量方程得到的显焓不是 h(T)=ΣYihi(T)这个形式
想请教下OpenFOAM自带的reactingFOAM求解能量方程得到的显焓也是这样的形式
吗?还是他也是通过 mixture_ = this->cellMixture(celli);
质量分数加权得到 mixture 的值,这样得到 h(T)=ΣYihi(T)。
需要在复制的求解器下执行:
echo "export LIB_XXXX_SRC=$WM_PROJECT_USER_DIR/applications/FGMFoam/src" > bashrc
source bashrc
接着将所有Make/option中原来的LIB_FLAMELET_SRC
换为LIB_XXXX_SRC
最后再编译即可
各位老师,大佬,大神好,
最近下载了一个第三方求解器flameletFoam,编译时需要将环境变量配置到相应的src文件:
export LIB_FLAMELET_SRC=$HOME/($YOUR_PATH)/flameletFoam/src
如果我现在将这个求解器复制并准备修改,如何修改上述命令中的LIB_FLAMELET_SRC,例如改为LIB_NEWFLAMELET_SRC。
谢谢大家!
@zhouxu gasinlet初始条件改为zeroGradient行不行?
@xpqiu 1799361277@qq.com 谢谢大佬
2.“==”就相当于“-”,注释掉的两行和等号右边是一个意思