谢谢李老师。
我自己也找资料看了一下,发现您之前给的那个常用推导黑色卡片里面有展开写的速度梯度场,是
$$
\nabla {\bf{U}} = \frac{{\partial {U_j}}}{{\partial {x_i}}}
$$
i是横行,j是竖行。确实应该用代码2。
更详细的内容,找到一个知乎笔记:https://zhuanlan.zhihu.com/p/474966621
学流体的小明
帖子
-
OpenFOAM编程计算湍动能Budget -
如何加速压力求解器收敛😅我自己写的程序必须是simple的分解,scotch都不能用,更不用说metis了
-
OpenFOAM编程计算湍动能Budget想计算这样一个项:
$$
{ - \langle \bar \rho {{\tilde u'}_i}\rangle \left( {\frac{{\partial \langle {{\tilde u}_i}\rangle }}{{\partial t}} + \langle {{\tilde u}_j}\rangle \frac{{\partial \langle {{\tilde u}_i}\rangle }}{{\partial {x_j}}}} \right)}
$$
其中尖括号表示时间平均,上标撇表示脉动量。
湍流质量通量(Turbulent mass flux) = 密度乘以速度脉动。
代码应该写成哪样?主要后面的那个平均速度的梯度和平均速度的点积。
代码一-TMFMean & ( fvc::ddt(UMean) + fvc::grad(UMean) & UMean )
代码二
-TMFMean & ( fvc::ddt(UMean) + UMean & fvc::grad(UMean) )
个人觉得是代码一,发出来和大佬们确认一下。
-
如何加速压力求解器收敛谢谢两位老师讨论。
我还是比较接受李老师的意见,不敢把库朗数增大。
压力求解器能想办法让收敛快一些吗? -
如何加速压力求解器收敛使用interFoam计算气泡槽道流,发现压力求解器的收敛速度比较慢。
已经使用过两种方法:第一种是GAMG求解器,在大部分情况下效率都比较好。但是在一些算例中,气泡贴近壁面,很多气泡间产生了斥力,斥力是作为一个源项添加到动量方程UEqn当中的,见 https://cfd-china.com/post/37476。
斥力在许多气泡之间产生之后,可以明显感觉到GAMG求解器迭代次数增加,消耗时间变长。p_rgh { solver GAMG; tolerance 1e-09; relTol 0.002; smoother GaussSeidel; } p_rghFinal { $p_rgh; tolerance 1e-8; relTol 0; }
于是使用了第二种PCG求解器,仅在“斥力在许多气泡之间产生”这一情况下表现好一些。
p_rghFinal { solver PCG; preconditioner { preconditioner GAMG; tolerance 1e-8; relTol 0; nVcycles 2; smoother DICGaussSeidel; nPreSweeps 2; } tolerance 1e-08; relTol 0; }
比如下面这张图,在将GAMG求解器替换为PCG之后,迭代次数大大减小,计算速度也变大(子图上面的紫色线,在10000迭代步之前有个转折,转折之前,每计算一步需要的执行时间ExecutionTime越来越大,转折之后紫色线斜率基本固定,每计算一步需要的执行时间基本固定)。
我的问题是:
-
我现在的库朗数和界面库朗数都是0.5,敢放松库朗数的限制以使用大时间步长吗?
-
有什么方法可以加快压力求解器的收敛吗?有什么推荐压力求解器?或者PIMPLE算法的一些设置?目前的PIMPLE设置是这样的:
PIMPLE { momentumPredictor no; nOuterCorrectors 1; nCorrectors 3; nNonOrthogonalCorrectors 0; }
求各位大佬指教!🙏🙏
-
-
interFoam吐核alpha.water越界了?你看最小值都负零点零几了,可能是边界条件没设置好,其它物理量的边界条件也会影响。
-
openfoam9安装失败那我不知道咋办了,要不你用apt删了重装一下,或者编译源代码安装。
或者你电脑提前改变了apt的安装路径,安装到了其它地方?
下面这个里面安装的openfoam9就是在/opt目录下面。
https://blog.csdn.net/sagjhdj/article/details/123435344 -
如何在流场中加入体积力场 -
openfoam9安装失败apt这种安装方式应该会安装到/opt目录下面吧,你看看那里。
-
如何在流场中加入体积力场编程。
// 先创建一个场 volVectorField source_Vector ( IOobject ( "source_Vector", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), mesh, dimensionedVector(dimensionSet(1,-2,-2,0,0,0,0), Zero) ); // 根据你的需要进行赋值 forAll(mesh,cellid) { source_Vector[cellid]=........; } // 添加方案一,添加到UEqn.H当中的动量方程中 fvVectorMatrix UEqn ( fvm::ddt(rho, U) + fvm::div(rhoPhi, U) + MRF.DDt(rho, U) + turbulence->divDevRhoReff(rho, U) == fvOptions(rho, U) + source_Vector // Add the source field ); // 添加方案二,添加到泊松方程里面,需要先插值为surfaceScalarField surfaceScalarField source_phig=-fvc::interpolate(source_Vector ); // 然后添加到pEqn的phig surfaceScalarField phig ( ( mixture.surfaceTensionForce() + source_phig // Add the source field - ghf*fvc::snGrad(rho) )*rAUf*mesh.magSf() );
我这个是改的interFoam,你类比一下就行,量纲应该不会一样。
-
关于编译动态库后在求解器中使用报错以我对C++编程三脚猫程度的理解,应该是basicThermo.C没有被编译,因为在solidThermo.H/C中只包含了头文件basicThermo.H。
你可以试试在solidThermo的Make/files中这样写basicPorousThermo.C porousThermo.C LIB = $(FOAM_USER_LIBBIN)/libporousThermo
这样应该不需要你复制代码吧,也许(很没有信心)。
-
关于编译动态库后在求解器中使用报错看报错信息是porousThermo没有找到basicPorousThermo,你在options中把basicPorousThermo链接上试试?
-
在OpenFOAM中如何判断一个单元是否为边界单元?可以从边界上的face返回这个face属于的cell
const Foam::fvBoundaryMesh &procBoundary = mesh.boundary(); forAll(procBoundary, patch) { forAll(procBoundary[patch], facei) { const label bcell = boundaryMesh[patch].faceCells()[facei]; } }
你可以得到所有的边界单元编号,然后做你其它向做的事就应该比较方便了
-
overinterdymfoam的一些疑问@csj1246957849
因为提取等值面的时候进行了插值。
可以提取xz截面,显示网格线,然后你用我黄色画出来的看界面附近的网格,OpenFOAM用的有限体积法用到的是cell中心值,当你用setFields赋值的时候,z=0这条线和赋到的cell有各种关系。具体情况我这里表述很麻烦,你实际看一眼应该就能理解。
你上面图片显示的都是point的值,是paraview插值出来的,cell值前面是一个小方块,你可以看看cell值,就没有红色和蓝色的过渡。 -
overinterdymfoam的一些疑问interFoam好像不能用backward的ddt吧?应该是使用了Crank-Nicolson?
-
openform的瞬时温度场我刚好也用过window,window的时长还是要和你实际的流场有关,可以先用probe工具输出一下单点的监测历史,确定一个合适的window时间。
window 5;
意思是当前时间步往前的5s都是window的范围。举例:t = 1s,平均操作是对0-1s的数据;t = 6s,平均操作是1-6s的数据。
是不是平均的时间太长了? -
使用自适应网格细化并行计算结果在进行reconstructPar进行整合的时候会出现问题额,我那个帖子也是说的这个问题呀,你先串行自适应加密几次,然后把串行的网格直接替换constant/polyMesh就行了
-
openfoam对于气泡进行自适应网格细化出现棱角继续往下计算的话,应该会算出来圆弧边的界面?
不过这个自适应加密对alpha.water的处理确实有点粗暴啊,我之前用的时候也没注意这一点。会不会是哪里没设置好?看看你的dynamicMeshDict。
还有就是fvSolution里面不要显式地把correctPhi改为no,自适应加密之后确实是需要进行通量修正的。
我的做法是先进行预加密,然后把在背景网格上已经有一定加密的网格文件直接替换掉constant/polyMesh。
https://www.cfd-china.com/topic/6177/paraview查看自适应加密网格出错 -
openfoam如何中途调整更改网格?我也只是遇到过相同的自适应网格重组时候有网格问题,倒是没做过这种重叠网格的操作😂。感觉不太好搞,你得学习一下网格文件的结构。
-
openfoam如何中途调整更改网格?感觉大部分动网格的类似问题都可以用这种方法处理:
先使用reconstructParMesh,再使用reconstructPar。
然后重组后的网格就在你重组的那个时间步里。