@李东岳 可以把日常的流体都看成稀薄流体呀。从各种benchmark来看的话,精度还不错,处于同一个水平。
现在主要的问题是,显式LBM并行效率特别的高,然后我就寻思着有限体积也可以显式呀,谁怕谁。结果性能卡在了压力泊松方程的求解上
史浩
帖子
-
-
有没有可以不通过压力修正方法来求解CFD的算法(LBM除外)?
事情是这样的:最近用PISO方法和一个做LBM的同事PK 求解CFD的性能,遇到了瓶颈:传统的投影法在求解压力泊松方程的时候会花费大量的时间。想知道有没有方法可以绕过求解压力-泊松方程?
我的一个思路就是:在不可压缩流体中引入较小的压缩性,然后写出压力和密度的状态方程,从而壁面压力方程的求解,不知道可不可行。
希望老铁们出谋划策,不想被LBM锤 -
@hongjiewang 在 界面相变 中说:
afvm::Sp(vDotvmcAlphal, alpha1) + avDotcAlphal
从你给的代码里面,没看出什么问题,可能是其他方面可以出问题了
相含量的变化不一定只和源项有关,还可能和宏观流动、求解误差等相关
建议跟踪一下你给的源项这个东西的值a*fvm::Sp(vDotvmcAlphal, alpha1) + a*vDotcAlphal
如果这个值没有问题,那看一下你写的代码,看看你代码计算的过程是不是和现实中的物理过程有偏差。比如说这个地方相分数为1,但是你的源项可能是一个正值。因为你用他的散度去表示界面处的相变过程,这个表示本身就是不严谨的。
话说回来,你为啥不用相分数,来判断是否为相界面?代码如下:forAll(a,celli) { if (alpha1[celli] > 0.001 && alpha1[celli] < 0.999) { a[celli]=1; } else { a[celli]=0; } }
-
@李东岳 李老师,好久不见!最近重温你写的interFoam求解器的解析,里面有一句话
VOF作为网格依赖类求解器,加密网格研究网格无关性至关重要
这里所说的网格依赖具体的标准是什么?因为所有的数值模拟结果都和网格相关,但不是所有的求解器都叫网格依赖类求解器。所以我觉得应该要满足一定的标准才能叫网格依赖类求解器,那么有没有什么文献定义过赭红标准?还只是大家经验之谈,只是觉得VOF模型受网格影响大一些?
-
@hongjiewang 能帮到你我也很开心,继续加油~
-
@hongjiewang 你的a是一个volScalarField,而test是一个surfaceScalarField,两个变量不匹配。想办法把surfaeScalarField转化成一个volScalarField试一下
-
@Yu_Tian 都不需要,你只需要添加Ue的相应插值格式和求解器参数即可。也不用添加一个初始场,因为一开始你设置的是NO_READ属性,程序不会读初始场
-
@Yu_Tian 感谢分享,非常棒!学习了!这个失真的问题肯定会存在,只要不影响你想讨论的结果,都是可以接受的
-
@Yu_Tian 我这个图就是局部网格加密(AMR)结果的后处理图。对于局部网格加密算例,流线图没有影响,矢量图确实会在加密网格区域比较密集。矢量图的这个问题我也没找到比较好的处理方法,如果你有比较好的方法可以分享一下
-
@Yu_Tian 在createFields.H文件中,添加变量声明
volVectorField js ( IOobject ( "js", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), -sigma*fvc::grad(Ue) );
在求解完Ue后,更新一下js
js=-sigma*fvc::grad(Ue);
我一般这样通过求解器实现的。
也可以用postProcess实现,但是需要具体看一下他的源码,这个我不是很熟悉
放一个我之前写过的一个求边界“axis”上的最大速度,这个是参考之前版本的calc方法写的,后来calc全部整合到postProcess中了,但是在OpenFOAM 6里面,按照calc的思虑一样可以用#include "timeSelector.H" #include "calcType.H" void calc(const argList& args, const Time& runTime, const fvMesh& mesh) { IOobject UHeader ( "U", runTime.timeName(), mesh, IOobject::MUST_READ ); if (phiHeader.headerOk()) { volVectorField U(UHeader, mesh); forAll(U.boundaryField(), patchi) { const fvPatchVectorField & pU = U.boundaryField()[patchi]; const fvPatch & pU_B = pU.patch(); if(pU_B.name() == "axis") { Foam::Info<< "mag(U) max : " << max(mag(pU)).value() << Foam::endl; break; } } } else { Foam::Info<< "No U exists!" << Foam::endl; } Info<< "\nEnd\n" << endl; } int main(int argc, char *argv[]) { #include "setRootCase.H" #include "createTime.H" Foam::instantList timeDirs = Foam::timeSelector::select0(runTime, args); #include "createNamedMesh.H" forAll(timeDirs, timeI) { runTime.setTime(timeDirs[timeI], timeI); Foam::Info<< "Time = " << runTime.timeName() << Foam::endl; mesh.readUpdate(); calc(args, runTime, mesh); Foam::Info<< Foam::endl; } Foam::Info<< "End\n" << Foam::endl; return 0; }
-
@Yu_Tian 抱歉,前面的公式少打了一个负号
-
,不过你已经找到这个错误了。
postProcess这个东西我还没用过,有空研究研究,你看看下面这种书写格式行不行postProcess -func "grad(-1.0*Ue)"
当时我直接写在程序里面了,把他当成一个结果输出了
-
@xiaolin 我刚刚看了一下,我用的是OpenFOAM 6,前面写错了抱歉。
下面是movingConeTopoFvMesh中对应的构造函数(初始化函数)Foam::movingConeTopoFvMesh::movingConeTopoFvMesh(const IOobject& io) : topoChangerFvMesh(io), motionDict_ ( IOdictionary ( IOobject ( "dynamicMeshDict", time().constant(), *this, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE, false ) ).optionalSubDict(typeName + "Coeffs") //在movingConeTopoFvMeshCoeffs中寻找对应参数 ), motionVelAmplitude_(motionDict_.lookup("motionVelAmplitude")), motionVelPeriod_(readScalar(motionDict_.lookup("motionVelPeriod"))), curMotionVel_ ( motionVelAmplitude_*sin(time().value()*pi/motionVelPeriod_) ), leftEdge_(readScalar(motionDict_.lookup("leftEdge"))), curLeft_(readScalar(motionDict_.lookup("leftObstacleEdge"))), curRight_(readScalar(motionDict_.lookup("rightObstacleEdge"))) { ... }
从构造函数可以看出来,所有的动网格参数要从一个movingConeTopoFvMeshCoeffs的字典中查找获得,所以,在设置动网格参数的时候,这个字典是不能少的,其对应结构如下:
movingConeTopoFvMeshCoeffs { ... }
你好像缺少了这个结构
-
@DY大世界 久闻snappyHexMesh大名,遗憾从来没用过,平时计算的季和模型都比较简单 抱歉,估计忙不上你什么忙
你在文中说网格和计算结果都会略有不同,有没有图可以展示一下他们的不同? -
@xiaolin 你用的是哪个版本?我用OpenFOAM 7,这个动网格设置大约是这个风格
dynamicFvMeshLibs ("libmovingConeTopoFvMesh.so"); dynamicFvMesh movingConeTopoFvMesh; movingConeTopoXXXFvMeshCoeffs { motionVelAmplitude (0 0.00006 0); motionVelPeriod 1; //leftEdge 0; leftObstacleEdge 0.2; rightObstacleEdge 1.5; left { minThickness 2.5e-3; maxThickness 7.6e-3; } right { minThickness 1.2e-3; maxThickness 2.8e-3; } }
-
@Yu_Tian 电场强度是电势(电压)的梯度
E = fvc::grad(Ue) // Electric field intensity j = sigma*E // Current density, sigma--electric conductivity
-
@Yu_Tian 你说的是电场的streamline是么?是下图这种效果么?
这个直接用电场强度矢量做流线图就可以得到,不用再求导了 -
@东岳 你这一提醒,我发现我上面的好像错了。这里说的加速度应该指的是物质导数,物质导数和局部导数有如下关系
我上面写的fvc::ddt(U)
只是其中的局部导数。
那问题来了,在OpenFOAM中怎么求物质导数?下面的公式求物质导数看起来有点土DUDt=fvc::ddt(U)+fvc::div(phi, U)
-
@DY大世界 加速度是速度对时间的导数,应该是ddt(U)。grad(U)是空间的导数,相当于速度的梯度
-
@tangcheng 这种时候就不能忽略粗糙度和震动了,把这些因素都考虑进去再进行计算。这种时候两个理想平板之间的雷诺数计算方式已经不适用于你说的这种请款的计算了
-
@Sloan 那个算例是OpenFOAM 8下的一个基准算例,算是一种3D dam break
${FOAM_TUTORIALS}/multiphase/interFoam/laminar/damBreakWithObstacle
你可以自己跑一下试试,原始文件里面用的就是用的MPLIC方法,效果很好 -
@波流力 关于PLIC方法处理界面处的插值格式,可以参考以下网站:
https://cfd.direct/openfoam/free-software/multiphase-interface-capturing/ -
文章被接收啦,其中的网格独立性验证各位大佬帮助很多,一并谢过 @random_ran @东岳
-
@东岳 我使用的是自适应时间步长,保证最大的库朗数小于0.4。之前在文章中做过网格独立性验证,网格越细,下落的速度越慢,当网格小于一定的尺度后,达到一个“精确”的结果,液滴下落的速度不随网格的细化而有太大的变化
-
这个主要问题是OpenFOAM自带的AMR是基于三维网格的,二维网格就会报错。关于2D自适应网格的资料看这里
-
@xpqiu 亲测好用!感谢大佬!
-
paraview显示的时候,总会带透视效果,如下图:
希望得到下图没有透视效果的图,如下图
-
可以尝试一下OpenFOAM 8,里面有个PLIC,看起来很牛逼的样子
-
@东岳 已经安装好了,跑了一下damBreak算例
下图左边和右边分别是界面采用PLIC处理和采用原始界面压缩的结果。差别还是很明显的,整体感觉采用PLIC的结果比原始界面压缩的结果慢了半拍。之前在计算液滴下落的时候,也有类似的情况:细网格的液滴下落要比粗网格的慢一点。这种有没有人作专门的解释?
计算速度上,采用PLIC计算1s用了8s,采用界面压缩计算1s用了6s,PLIC计算要慢一些
-
@东岳 编译安装是怎么安装?之前一直是按照网页上敲命令,没编译安装过
电脑里已经安装了OpenFOAM 7,没有卸载,这个会不会对安装新版本有影响?之前从v5一直安装到v7,都是删除之前的版本再安装的,这次没删除,不知道是不是这个原因 -
如题,严格按照官网的流程进行安装。在运行如下命令的时候
sudo apt-get update
出现如下错误提示
W: 仓库 “http://ppa.launchpad.net/mc3man/trusty-media/ubuntu xenial Release” 没有 Release 文件。 N: 无法认证来自该源的数据,所以使用它会带来潜在风险。 N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。 E: 无法下载 http://ppa.launchpad.net/mc3man/trusty-media/ubuntu/dists/xenial/main/binary-amd64/Packages 404 Not Found [IP: 91.189.95.83 80] E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。
然后继续按照流程安装
sudo apt-get -y install openfoam8
提示如下错误
错误:1 https://deac-riga.dl.sourceforge.net/project/foam/foam/ubuntu xenial/main amd64 openfoam8 amd64 20200722 Maximum (10) redirects followed E: 下载 https://deac-riga.dl.sourceforge.net/project/foam/foam/ubuntu/dists/xenial/main/binary-amd64/openfoam8_20200722_amd64.deb Maximum (10) redirects followed 失败 E: Internal Error, ordering was unable to handle the media swap
万能的CFD中文网,有木有解决办法?
-
自己顶一下,有人临幸一下么?
-
用了两年OpenFOAM了,感觉至今感觉还没太看懂icoFoam中的东西,慌得一批
-
最近在做一个高分子溶胀-溶解的项目,里面涉及到固体的溶胀、固体的溶解这两个过程,万能的CFD中文网,有没有做这方面研究的CFDer?
在知网上搜了一下模拟糖块在水中溶解的文章,发现竟然没有,是这个太简单了没人整么? -
@Sloan 如果你电脑是8个核心的话,建议用7个核心就,留一个给系统
@cccrrryyy OpenFOAM会自动选择空闲的核心进行计算,只有当核心全部占用的时候才会重复选择。要注意的是,现在的服务器和电脑一般都会用超线程技术,即一个物理核心在系统里面会被认为是两个核心。当多个算例同时运行的时候,OpenFOAM可能选择一个物理核心上的两个线程进行计算,而其余的物理核心空闲,而这样会导致计算效率的下降。为了提高计算效率,建议关闭超线程。OpenFOAM中可以指定核心,这个在mpirun的命令参数里可以指定,我见过这些命令,但是没系统的用过 -
之前写了一篇文章,主要内容是模拟了电磁场下液滴的下落过程。其中多相流部分是采用interFoam中的算法计算的,电磁场是自己植入进去的。为了增加计算精度,采用了自适应网格细化(adaptive mesh refinement)来捕捉两相界面。
最近审稿意见回来了,里面很重要的一条是:Is the solution grid independend? Please give a proof!
自己的想法是:做不同尺寸网格下的计算,然后对比结果,结果一致就说明算法的网格独立性很好。但是感觉当网格粗大的时候VOF模型算的确实差别比较大
由于一直在用CFD做一些应用,对于网格独立性验证这东西不是很懂。这类意见大概怎么回复比较好?有没有有经验的大佬分享一下经验? -
有两个关羽OpenFOAM速度场边界条件的问题
1、对于noSlip边界条件
在书“The Finite Volume Method in Computaional Fluid Dynamics”中认为速度场的无滑移边界条件和普通的Dirichlet边界条件是不同的:
而在OpenFOAM中,noSlip边界条件直接视为Dirichlet边界条件,即fixedValue,源代码链接
这里我觉得书里面的推导好像更有道理,但是平时用fixedValue也没什么问题。请问哪个是更合理的处理呢?2、对于symmetry和sip边界条件
书中,认为这两种边界条件是等价的:
但是,在对两个边界离散的过程中,得到的结果又有差别:
symmetry 边界条件的离散结果如下:
slip的离散结果如下:
在OpenFOAM中,slip边界条件是symmetry边界条件的子类且未作任何修改。symmetry边界条件采用书中symmetry的离散格式 symmetry源代码
请问,书中slip边界条件的离散错在哪里? -
冰棒下表面某一时刻的形状
然后一个师兄路过,问了我一句:你在干啥呢!我一脸懵逼。。。 -
@东岳 比较通用的就是多孔介质模型,好用好收敛,算的还快。之前不是在公众号上发过一个普度大学基于OpenFOAM做的求解器嘛,那个就可以,还能算凝固过程中的宏观偏析(化工里面好像叫分凝)
-
如题所示
-
老哥这是计算连铸结晶器湍流么?
-
@东岳 多年的僵尸帖被大佬翻牌子,吓了一跳。当时求解一个耦合方程,自己想着最理想的方式就是全耦合,两个变量组装成一个矩阵,整体求解,然后自己就掉进牛角尖里出不了。后来想k-e模型中两个变量是耦合在一起的,就学习了一下OpenFOAM中湍流方程的处理方法。现在用显示耦合方法计算,然后多迭代一两次,精度并不差,就放弃了最开始整体求解的想法。
@大喵 这个对方程和代码再好好对应一下,OpenFOAM里面的和经典湍流模型方程是一致的 -
在计算一个圆柱模型(如下图),划分六面体网格的时候,有这样的一个结构:
在该结构附近,计算时会出现一些不真实的结果:
该问题是一个带源项的纯扩散问题。请问怎样在不改变网格的情况下,通过选择差值算法尽量减轻这种现象?
后处理的时候遇到这种问题,很烦躁 -
获得一个连续粒径分布,如下图:
原文链接:Simulation of liquid jet primary breakup: Dynamics of ligament and droplet formation -
@东岳 如何能比较好的表征一个形状不是很圆的球球?
这个残缺的蛋蛋怎么搞一下? -
请问如何导出该球表面积随时间的变化?现在自己手动记录每一个时间液滴的体积,感觉很很费事
液体从上表面进入,滴落到下面的水池中,怎么把每一个时刻的界面表面积随时间的变化导出成一个文件? -
t=0.89s
原始interFoam求解器结果
file:///media/sh/SH/OpenFOAM/droplets/tutorials/noPcorrInterFoam/testTubeMixer1/interFoam.jpg
去掉correctPhi.H后的结果
file:///media/sh/SH/OpenFOAM/droplets/tutorials/noPcorrInterFoam/testTubeMixer2/interNoPcorrFoam.jpg
把图补上,原来的图太大了上传失败了 -
上面的图片实在上传不上去,主要是证明两种结果一样,两个图看起来确实是一样的,就不再另外挂图了
-
现在OpenFOAM比较成熟的求解器都能求解动网格算例,与v5.0中普通求解器相比,现在的求解器为了求解动网算例,都会在循环中加这么一段:
while (pimple.loop()) { if (pimple.firstIter() || moveMeshOuterCorrectors) { mesh.update(); if (mesh.changing()) { // Do not apply previous time-step mesh compression flux // if the mesh topology changed if (mesh.topoChanging()) { talphaPhi1Corr0.clear(); } gh = (g & mesh.C()) - ghRef; ghf = (g & mesh.Cf()) - ghRef; MRF.update(); if (correctPhi) { // Calculate absolute flux // from the mapped surface velocity phi = mesh.Sf() & Uf(); #include "correctPhi.H" // Make the flux relative to the mesh motion fvc::makeRelative(phi, U); mixture.correct(); } if (checkMeshCourantNo) { #include "meshCourantNo.H" } } } ........ }
其中比较关键的是correctPhi.H,这个文件主要是实现一个面通量的预修正,引入了一个修正压力pcorr。但是这一块具体实现了什么功能,我还是不清楚,于是我把这一行给注释掉了,然后比较原始的interFoam和注释掉correctPhi.H后的求解器求解结果,算例采用OpenFOAM自带的interFoam tutorial算例——testTubeMixer。比较了两个算例在t=0.89s的结果:
下图为原始的interFoam求解的结果:
下图为注释掉correctPhi.H后的求解结果:
就上面的结果来看,没有任何的区别。但是作为OpenFOAM的程序设计师们,肯定不会把一段没用的代码放在一个这么经典的求解器中。有没有哪位CFDer能够解释一下这个correctPhi.H是做什么呢?
如何不求解压力泊松方程实现压力-速度修正
如何不求解压力泊松方程实现压力-速度修正
界面相变
文章中的网格独立性验证
界面相变
界面相变
如何看流场中的加速度云图?
如何看流场中的加速度云图?
如何看流场中的加速度云图?
如何看流场中的加速度云图?
movingConeTopoFvMesh使用的一些疑惑
如何看流场中的加速度云图?
movingConeTopoFvMesh使用的一些疑惑
关于二维模型的计算,这两种snappyHexMesh方法有什么不同,应该采用哪一个?
movingConeTopoFvMesh使用的一些疑惑
如何看流场中的加速度云图?
如何看流场中的加速度云图?
如何看流场中的加速度云图?
如何看流场中的加速度云图?
相距极其近的两平板间流动,是层流还是湍流?
请教divSheme中设置对溃坝自由液面形态的影响, RNG k-e湍流模型
静置液滴表面利用自适应网格导致初始化后的液滴表面不稳定,如何解决
请教divSheme中设置对溃坝自由液面形态的影响, RNG k-e湍流模型
文章中的网格独立性验证
安装OpenFOAM v8遇到问题
OpenFoam中的溃坝算例加入自适应网格计算一定时间步后出现的问题
paraview中如何关闭透视效果
paraview中如何关闭透视效果
请教divSheme中设置对溃坝自由液面形态的影响, RNG k-e湍流模型
安装OpenFOAM v8遇到问题
安装OpenFOAM v8遇到问题
安装OpenFOAM v8遇到问题
求固体溶解方面模拟的文章
phiHbyA的计算
求固体溶解方面模拟的文章
OpenFOAM多个并行算例同时运行导致计算效率下降
文章中的网格独立性验证
关羽OpenFOAM中边界条件的一点疑问
今天上午做了一个冰棒在空气中熔化
paraview 后处理中,如何显示某一点随时间的变化曲线
paraview 后处理中,如何显示某一点随时间的变化曲线
Fluent和OpenFOAM LES计算结果的差异性
OpenFOAM中标准k-e湍流模型的一点疑问
圆柱网格问题导致求解结果失真
如何在VOF模型中统计液滴粒径的大小
如何计算不规则体的体积
如何计算不规则体的体积
动网格求解中correctPhi的作用是什么
动网格求解中correctPhi的作用是什么
动网格求解中correctPhi的作用是什么