大步长下变形网格发散
-
请教各位大神!OpenFOAM变形网格,步长大了之后,物面附近网格就跟不上了(如下图)。除了减小步长(实在是太耗费时间),还能通过使用不同diffusivity模型来改善吗,比如directional?这方面找不到啥帖子或讲解,自己测试也一头雾水,根本不知道原理上是怎么影响网格变形的。能给推荐几篇论文读读也十分感谢!
背景:
我在做一个流固耦合模拟,一根3D圆柱在横向平动时的变形,一端运动给定。因为preCICE耦合还不支持重叠网格,只能使用displacementLaplacian求解器,根据圆柱物面的平动位移+变形,将全场网格变形。试了几天后发现,OpenFOAM很难算大变形呐(虽然我这个问题主要是平动造成的大变形,可是又不能用solidBody) -
谢谢岳老师回复!刚去看了这个算例,确实使用的是directional diffusivity。顺着这个思路把其它用了directional的例程都看了一下,设置都是类似
diffusivity directional (a,b,c)
,我先照猫画虎试着算一个。我用的是com版本的。重叠网格是好,可惜物面还需要根据固体域的变形来变形,而现在还没法实现不同的dynamicFvMesh同时用吧。即使能同时使用dynamicOversetFvMesh和dynamicMotionSolverFvMesh,固体也需要在刚性运动的坐标系下求解,这样得到的物面位移才是“纯变形”,感觉很难,preCICE那边也一堆想要用重叠网格算FSI的,也没见解决方案。商软(starccm)那面还是强呀,随意叠加刚性运动与变形。
至于原理,根据directionalDiffusivity.C中写的
void Foam::directionalDiffusivity::correct() { const surfaceVectorField n(mesh().Sf()/mesh().magSf()); faceDiffusivity_ == (n & cmptMultiply(diffusivityVector_, n)); }
给
diffusivity directional (1,200,200)
相当于给朝x方向的面1个单位的扩散系数,而给y和z向的面200个单位的扩散系数。Gpt解释说扩散系数越小代表网格越刚,变形越小。也许因此实现了在x方向跟随变形? -
@李东岳 是扩散模型处理的:
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++]; }
-
给感兴趣的同学老师们更新一下进展:
-
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个直径后还没发散
-
-
再次更新进展:
在displacementLaplacianFvMotionSolver基础上修改了一下,把边界(交界面)上固体域传来的位移分为刚性平移和局部变形,只针对后者求解laplacian方程得cellDisplacement场,插值到pointDisplacement场后再加上刚性平移场输出。这样改后,虽然时间步还是不能很大(否则端部还是出现“跟不上”的问题),但在和之前相同的时间步下,走了393个直径后的效果依旧很好:
还存在的一个问题是边界附近的网格变化没有考虑到正交(如右中图),可能是扩散方程求解变形的固有问题?也许对时间步长的限制也是因此导致的。了解到rbfMotionSolver这种求解方法,不知道是否可以解决这个问题? -
感谢更新。是的,rbf对你说的正交性那个有很大的改善。这是算流固耦合?
我在这面看到了这个rbf,没准可以移植一下 https://github.com/solids4foam/solids4foam/tree/master/src
我试了一下,感觉挺有意思,你要不要玩玩extend那个,比solids4foam的简单很多,直接挂库就行
不过openfoam.org的slerp看起来也很流弊 https://openfoam.org/release/2-3-0/mesh-motion/
-
谢谢李老师提供的资讯,原来openfoam.org介绍slerp时说过“求解椭圆方程得位移场会导致旋转边界附近网格剪切变形”!
@李东岳 在 大步长下变形网格发散 中说:
是的,rbf对你说的正交性那个有很大的改善。这是算流固耦合?
是的,用的preCICE和calculiX算的流固耦合。
@李东岳 在 大步长下变形网格发散 中说:
你要不要玩玩extend那个,比solids4foam的简单很多,直接挂库就行
我看了一下,extend这个只针对给定旋转角度和角速度的固体运动情况,还不是普遍情况。
还有一点是,rbf插值算位移场在分核计算时要特别处理(对每一分区提取边界点,插值内部点),有些麻烦。针对我这个问题,非正交带来的误差应该还能接受,先这么算看看
-
可以尝试一下RBF求解器,RBF支持的动网格幅度很大,远超扩散和逆距离,当然,也可以尝试一下overset。
https://www.bilibili.com/video/BV18a4y1D7zB/?vd_source=17ca8ef5f5c666dfc54376ddcfdd33da -
@lwjetmann 可以去查一下solid4foam,这里边提供了RBF求解器,solid4foam的RBF库已经处理好并行问题了,但是你需要做一下改动,因为据我所知(个人见解,真伪自辩!):这个RBF库只能实现被动位移,显然,你要做的仿真是需要写一个主动位移函数的。
dynamicOversetFvMesh确实可以定义运动,因为都是求解位移拉普拉斯方程,区别就是扩散系数是选择均一的?还是逆距离的?还是。。。@lwjetmann 在 大步长下变形网格发散 中说:
但是不知道overset的边界怎么在变形
理论上来说,位移拉普拉斯方程,就是给所有网格单元“中心”定义的,你要好好读一下代码,位移拉普拉斯方程是根据已知的位移边界条件,求解其余单元的位移值,这个需要插值到网格节点上的。换句话说,是不是overset边界,根本不影响变形。fixed边界,才会影响变形。
如果你要用重叠网格,记住,不要用逆距离,OF的这个方法存在BUG!不要问我为什么,因为我也不知道怎么解决这个问题。
祝好~
-
十分感谢您的分享!
@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!