@z597288 3楼用到的几个命令组合一下应该可以实现
xpqiu
帖子
-
提取log文件中的一些信息 -
请教一下,paraview里面怎么在图例标题中输入希腊字母可以用 LaTex 的语法来实现希腊字母输入。
-
边界条件设置??k 和 epsilon 可以也设置为 slip,nut 设置为 calculated。
-
ParaView切片问题??切完之后再用 clip ,或者 先用 Select Cells Through,选定你想显示的网格,再用 extract selection 把选定的网格提取出来单独显示即可。
-
关于网格建立的方向与模型方向是否需要一致- 你的背景网格三个方向的尺寸差异太大了,z方向的尺寸只有其他两个方向的大概 1/6,这不利于 snap 。建议将背景网格尺寸调成一样,或者至少把差异缩小试试。
- snap 阶段建议增加 featureSnap 的次数
- meshQuality里面,maxNonOrtho 你设置的是45,建议调大一些,比如调到65。
试了一下,不完美,但是有改善。
-
不使用湍流模型,而是直接求解器中实现湍流计算这段代码跟使用SA湍流模型计算有一个差异是:这段代码是先求解 nuTilda 方程得到 nut,然后再用更新的nut来构建和求解 UEqn,而直接使用湍流模型的时候是先求解 UEqn,pEqn,然后再用修正的速度来构建和求解nuTildaEqn
-
理想气体的壁面条件@myheart OpenFOAM 里面求解理想气体(ideal gas,无粘性)流动的求解器是 rhoCentralFoam,你看这个求解器的算例壁面都用的是某种滑移边界。
-
原有的湍流模型加上非线性项雷诺应力的问题@SHUKK
你需要 libtorch,这个是C++库,提供了跟 pytorch 一样的功能。也就是说,用pytorch训练的模型,可以做到利用 libtorch 提供的 API 读入到任何 C++ 程序中来用。
针对Open FOAM,这个项目 https://gitlab.com/tmaric/openfoam-ml 可以作为入门参考。 -
原有的湍流模型加上非线性项雷诺应力的问题@SHUKK
你的 g(i) 是用训练好的模型来计算对吧,那么其实你只需要用C++把你计算g(i)相关的代码写出来,写成湍流模型的成员函数,然后再在correctNonLinearStress里面调用这些函数就可以了。虽然g(i)不能写出显式的公式,但是也是代入一些流场变量,然后输出g(i)的数值吧,这样肯定也是可以写出可以调用的函数的。 -
原有的湍流模型加上非线性项雷诺应力的问题@SHUKK
你可以参考一下这个项目:https://github.com/furstj/myTurbulenceModels里面有非线性湍流模型的例子,比如这个 EARSM 模型,https://github.com/furstj/myTurbulenceModels/tree/main/turbulenceModels/RAS/EARSM
你可以在这个 EARSM 模型的基础上来修改,基本上只需要其中的 correctNonlinearStress 函数就可以了。
-
bound 函数的实现方法@李东岳
只是知道用了这个函数就会引起计算错误,但是不确定是不是我其他代码有问题。
希望有大佬路过进来看看这个 bound 函数的实现到底为什么要这样。 -
bound 函数的实现方法不知道为什么这个 bound 函数里面要用到 average 这样的操作。
之所以关心这个问题,是因为这个 average 给我导致一个严重的bug -
bound 函数的实现方法很多有界变量在计算过程中为了防止数值问题,需要限定下限值,在OpenFOAM中一般都是使用bound 函数,代码见:src/finiteVolume/cfdTools/general/bound/bound.C。然而这个 bound 函数的实现却有些让人摸不着头脑:
Foam::volScalarField& Foam::bound(volScalarField& vsf, const dimensionedScalar& lowerBound) { const scalar minVsf = min(vsf).value(); if (minVsf < lowerBound.value()) { Info<< "bounding " << vsf.name() << ", min: " << minVsf << " max: " << max(vsf).value() << " average: " << gAverage(vsf.primitiveField()) << endl; vsf.primitiveFieldRef() = max ( max ( vsf.primitiveField(), fvc::average(max(vsf, lowerBound))().primitiveField() * pos0(-vsf.primitiveField()) ), lowerBound.value() ); vsf.boundaryFieldRef() = max(vsf.boundaryField(), lowerBound.value()); } return vsf; }
一般的想法是,直接把小于 lowerBound 的重置为 lowerBound 就行了。但是 OpenFOAM 的实现是,对于某个变量v,当 0 < v < lowerBound的,令 v=lowBound (与预期一致);当 v < 0 时,
pos0(-vsf.primitiveField())
为 1,也就意味着用如下公式重新计算了下限值fvc::average(max(vsf, lowerBound))().primitiveField()
这种做法有什么数学上的解释吗?
-
用较小的时间步长,结果反而出问题了@李东岳
参考文献:
Knacke, T. (2013).
Potential effects of Rhie & Chow type interpolations in airframe
noise simulations. In: Schram, C., Dénos, R., Lecomte E. (ed):
Accurate and efficient aeroacoustic prediction approaches for
airframe noise, VKI LS 2013-03. -
IOobject::groupName("omega", alphaRhoPhi.group()) 这句话的意思是?@Chen_hao
当这个模型用于多相流时,IOobject::groupName("omega", alphaRhoPhi.group()) 会变成类似 omega.air 这样的名字。 -
计算一定区域内网格数用 topoSet,把这些区域内的网格提取到 cellSet,提取过程会告诉你网格数量。
-
SHM尖锐直角边界层添加meshQualityControls 部分把 relaxed 里面的质量控制参数再放宽一些。然后 nRelaxedIter 设置为 0。
-
怎样才能取一个局部面作为一个新边界?还可以用 topoSet 结合 createPatch 来实现,不过这样得到的面不一定是精确地 1/2,因为createPatch 只是从已经画好的网格上选一些面来生成一个新边界。
-
怎样把某个截面处的速度分布转移到边界上?@soulx7 参考这个算例:
tutorials/incompressible/pisoFoam/LES/pitzDailyMapped -
Gauss LUST grad(U)和Gauss LUST unlimitedGrad(U)@wg0632
Gauss LUST grad(U) 当中的 grad(U) 对应一个梯度计算格式,会从 gradSchemes 部分取查找。如果 gradSchemes 部分定义了 grad(U) ,则使用该部分的 grad(U) 对应的格式。如果gradSchemes 部分没有定义grad(U) ,则会使用 gradSchemes 部分的 default 对应的格式。如果 default 也没有则报错。所以,Gauss LUST grad(U) 和Gauss LUST unlimitedGrad(U) 的区别取决于 gradSchemes 里面如何定义的 grad(U) 和 unlimitedGrad(U)。