大步长下变形网格发散
-
请教各位大神!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插值算位移场在分核计算时要特别处理(对每一分区提取边界点,插值内部点),有些麻烦。针对我这个问题,非正交带来的误差应该还能接受,先这么算看看