@李东岳 很奇怪,又画了个很稀的6万网格量的网格,先前会发散的极低雷诺数,现在却不发散了。看来雷诺数极低,网格就不能太密?
通过网盘分享的文件:2D_21cylinders_Re0.0001.zip
链接: https://pan.baidu.com/s/1NdfFZrV2k_T8mAY7fA7ktg?pwd=8888 提取码: 8888
@李东岳 很奇怪,又画了个很稀的6万网格量的网格,先前会发散的极低雷诺数,现在却不发散了。看来雷诺数极低,网格就不能太密?
通过网盘分享的文件:2D_21cylinders_Re0.0001.zip
链接: https://pan.baidu.com/s/1NdfFZrV2k_T8mAY7fA7ktg?pwd=8888 提取码: 8888
simpleFoam求解的定常问题,用的空间离散格式都是二阶的,审稿人让验证网格的二阶收敛精度。不知有没有人用过paraview将稀网格数据插值到密网格上并算过残差E和收敛阶次p?另外对于很复杂的三维网格,网格的非均匀性对收敛阶次公式的计算又该如何考虑呢?
没有
做了一个能复现问题的干净算例,感兴趣的同学可以试试(网格量57万,需要算一段时间才发散,我保留了发散后的log.pimpleFoam文件,可以用文件里的plot_residual脚本来查看残差。使用的OpenFOAM版本为v2006或v2406)。
通过网盘分享的文件:2D_21cylinders.zip
链接: https://pan.baidu.com/s/1lHExA2yRnUzXFxYYtAc6rw?pwd=8888 提取码: 8888
@CHRISVC 感谢回复!
观察到:关闭动网格不发散,减少圆柱数量(降低网格复杂度)发散的雷诺数会降低,怀疑是动网格或者网格非正交修正的问题
层流不用壁面函数
@李东岳 感觉这个问题挺有意义的,肯定可以从原理上说清楚为啥发散。给的是一个极大的单块网格平动(入口速度零,零法向压力梯度;出口压力零,零速度梯度),一直调不出来就放弃了,可能雷诺数低到某个程度,就不能靠放大计算域来使边界条件匹配了。
祝李老师上课愉快!
@李东岳 最后还是没搞明白咋回事,怀疑是动网格不能用来算很低雷诺数的情况,外边界条件可能不匹配
假如圆柱不动,多低雷诺数(甚至拿掉对流项)应该都可以算吧
@RolandLent 源码在openfoam-adapter的FSI/Force.C和ForceBase.C中
十分感谢您的分享!
@Mina-Lee 在 大步长下变形网格发散 中说:
换句话说,是不是overset边界,根本不影响变形。fixed边界,才会影响变形。
确实是啊!displacementLaplacianFvMotionSolver类中组建cellDisplacement场时,只对pointDisplacement为fixedValue类型的patch进行了处理(改为cellMotion类型,并对face各点求平均),其它类型的没做任何处理;最后cellDisplacement再插值回pointDisplacement时,点位移场只有原本的fixedValue边界没被修改,其它的都被求解结果修改了。
我看代码时没深想到这一层,只在用的时候发现有时远场使用fixedValue和slip效果不同,我在这个贴子中的回复属于是瞎猫碰上死老鼠了,看来远场只要不是fixedValue,给任意都行。
最后我的问题还是用的单一区域网格以及求扩散方程变形成功实现的,为了验证还用StarCCM算了比过,吻合得很好。倒是在StarCCM中试过重叠网格,overset交界面网格难匹配,常常挖洞出错,算出来的结果锯齿也很厉害。至于rbf,有些懒得折腾了,以后遇到非用不可的情况再说。
这句话应该是您的“泣血之言”,指给后来的人看看
@Mina-Lee 在 大步长下变形网格发散 中说:
如果你要用重叠网格,记住,不要用逆距离,OF的这个方法存在BUG!
@Mina-Lee 感谢回复!不知道com版本有没有直接可用的rbf求解器呢?这个UP的视频我之前搜到过,当时还问了一下,他说dynamicOversetFvMesh就可以定义运动了。但是不知道overset的边界怎么在变形,而且他肯定是用的rbf
谢谢李老师提供的资讯,原来openfoam.org介绍slerp时说过“求解椭圆方程得位移场会导致旋转边界附近网格剪切变形”!
@李东岳 在 大步长下变形网格发散 中说:
是的,rbf对你说的正交性那个有很大的改善。这是算流固耦合?
是的,用的preCICE和calculiX算的流固耦合。
@李东岳 在 大步长下变形网格发散 中说:
你要不要玩玩extend那个,比solids4foam的简单很多,直接挂库就行
我看了一下,extend这个只针对给定旋转角度和角速度的固体运动情况,还不是普遍情况。
还有一点是,rbf插值算位移场在分核计算时要特别处理(对每一分区提取边界点,插值内部点),有些麻烦。针对我这个问题,非正交带来的误差应该还能接受,先这么算看看
如果原本不支持叠加的话,这种可能只有基于sixDoFRigidBodyMotion自定义一个动网格求解器了。
再次更新进展:
在displacementLaplacianFvMotionSolver基础上修改了一下,把边界(交界面)上固体域传来的位移分为刚性平移和局部变形,只针对后者求解laplacian方程得cellDisplacement场,插值到pointDisplacement场后再加上刚性平移场输出。这样改后,虽然时间步还是不能很大(否则端部还是出现“跟不上”的问题),但在和之前相同的时间步下,走了393个直径后的效果依旧很好:
还存在的一个问题是边界附近的网格变化没有考虑到正交(如右中图),可能是扩散方程求解变形的固有问题?也许对时间步长的限制也是因此导致的。了解到rbfMotionSolver这种求解方法,不知道是否可以解决这个问题?
@Elysiumor OpenFOAM有maxwellSlip边界条件
@bestucan 谢谢老师的手把手指导!原来是可以沿着基类往上找的,之前一看到继承了好几个基类就感觉太麻烦找不出来了。
使用grep在src中搜还可以搜到用法,也很不错,但是函数定义换行了就不好搜了。比如这个要是用 grep -rP "::average\n\(" .
啥也找不到。
编译本地doxygen也学到了,openfoam2406版本的方法整理一下
sudo apt-get install doxygen graphviz
cd /usr/share/doc/openfoam2406-common/doc/Doxygen/
gzip -dk Doxyfile.gz #解压doxygen配置文件
./Allwmake
firefox html/index.html
本地查看foam下的函数不会卡了,不过网页中没有的函数原型本地也没有
@bestucan 谢谢老师回复!我也知道这个搜索功能,只是我在里边实在找不到原型 ╯︿╰
再就是这种直接定义在FOAM名称空间下的函数,浏览器toolbox查看卡的不行,也很难搜索在哪儿定义的,不知道有没有好的解决方法
@Joker 不清楚算的是什么情况,但总该按实际情况给?
上下是壁面的话,就noslip(虽然两个角点有速度,就像cavity的两个角点一样);
上下是自由流场的话,就symmetry或slip。
movingWallVelocity我理解是运动壁面的无穿透条件,上下边界没有给网格运动,只是网格节点变形,用不到这个BC吧
大家好,变形网格求解cellDisplacement时,需要用到cellMotion边界条件。我在看其updateCoeffs()函数时(见下),不理解这句:this->operator[](i) = pp[i].average(points, pointMotion);
average函数咋有两个输入参数了呢?
const fvPatch& p = this->patch();
const polyPatch& pp = p.patch();
const fvMesh& mesh = this->internalField().mesh();
const pointField& points = mesh.points();
word pfName = this->internalField().name();
pfName.replace("cell", "point");
const GeometricField<Type, pointPatchField, pointMesh>& pointMotion =
this->db().objectRegistry::template
lookupObject<GeometricField<Type, pointPatchField, pointMesh>>
(pfName);
forAll(p, i)
{
this->operator[](i) = pp[i].average(points, pointMotion);
}
根据我的经验,/constant/polyMesh/boundary中左边界的patch要最后定义,不然与上下边界的角点的pointDisplacement BC会被覆盖。而且上下边界的pointDisplacement BC要用slip,再搭配合适的时间步长应该可以成功实现你要的运动。
给感兴趣的同学老师们更新一下进展:
directional diffusivity对我的三维情况,效果比inverDistance扩散模型更差,给的diffusivity directional (1,200,200)
,只运动了不到两个直径网格便发散了
directional diffusivity好像只有给(a, b, 0)且a<<b这种模式才有效果,且仅针对单向平移的二维网格。用不同的参数试了试moving cone算例
尝试把moving cone改为球,diffusivity directional (1,200,0)
,效果也不错
我的情况目前只有减小时间步长了,移动33个直径后还没发散
@李东岳 是扩散模型处理的:diffusivity quadratic inverseDistance (cylinder)
1楼的图给的是圆柱的对称平面(圆柱端部用半球过渡的),圆柱往x负方向动(水平往右)。到图中发散的时刻,圆柱已经走了16个直径。将时间步长减小为当前的十分之一,网格变形能跟上,但是算得太慢了。所以想能不能通过改扩散系数模型来让网格在大步长的情况下也能 “跟着动” 。
@李东岳 在 大步长下变形网格发散 中说:
要不然就是扩散模型边界条件没弄对
pointDisplacement边界条件很简单,远场是slip(或fixedValue也行,因为远场很远,10000个直径,网格扭曲也是局限在物面附近),圆柱物面是fixedValue(但实际应该是openfoam-adapter把固体域的位移map过来了:
// Get the displacement on the patch
fixedValuePointPatchVectorField& pointDisplacementFluidPatch(
refCast<fixedValuePointPatchVectorField>(
pointDisplacement_->boundaryFieldRef()[patchID]));
// Overwrite the nodes on the interface directly
forAll(pointDisplacement_->boundaryFieldRef()[patchID], i)
{
for (unsigned int d = 0; d < dim; ++d)
pointDisplacementFluidPatch[i][d] = buffer[bufferIndex++];
}