又仔细看了一下,两个版本应该是差不多的。
相对速度是因为CdRe不是曳力系数 而是曳力系数×雷诺数 所以可以用粘度、直径还有密度换算成相对速度。
anubis
帖子
-
-
com版本和org版本的burns湍流耗散力好像不太一样
OpenFOAM8里的
Foam::turbulentDispersionModels::Burns::D() const { const fvMesh& mesh(pair_.phase1().mesh()); const dragModel& drag = mesh.lookupObject<dragModel> ( IOobject::groupName(dragModel::typeName, pair_.name()) ); return drag.Ki() *continuousTurbulence().nut() /sigma_ *pair_.dispersed() *sqr(pair_.dispersed() + pair_.continuous()) /( max(pair_.dispersed(), pair_.dispersed().residualAlpha()) *max(pair_.continuous(), pair_.continuous().residualAlpha()) ); }
OpenFOAM2012里的
Foam::turbulentDispersionModels::Burns::D() const { const fvMesh& mesh(pair_.phase1().mesh()); const dragModel& drag ( mesh.lookupObject<dragModel> ( IOobject::groupName(dragModel::typeName, pair_.name()) ) ); return 0.75 *drag.CdRe() *pair_.continuous().nu() *pair_.continuous().turbulence().nut() /( sigma_ *sqr(pair_.dispersed().d()) ) *pair_.continuous().rho() *pair_.dispersed() *( 1.0/max(pair_.dispersed(), residualAlpha_) + 1.0/max(pair_.continuous(), residualAlpha_) ); }
公式应该是
按照这个公式,感觉2012版本里的比较接近,但是还不太一样,相对速度Ur,在2012的代码里好像变成了连续相的粘度除以离散相直径,虽然量纲和速度是一样的,但是不太明白为什么会这样? -
@李东岳
遍历一次就可以了吧,我原来的想法是每次往数组最后添加元素(粒子的编号),不过刚搜了一下C++的数组大小是固定的(C++学的不太扎实), 换成vector可能可以? -
@李东岳
https://www.cfd-online.com/Forums/openfoam-solving/175539-cyclic-patchtype-inletoutlet-boundary-condition.html
我是这个帖子看到有人提到他用inletoulet和cyclic 一起用的,不过他说并行有问题,
所以我试了一下串行的时候确实可以, 并行我倒是没试过。
我感觉两个物理量,一个循环,另一个就普通的进出口,在理论上也没啥问题吧?只是openfoam给了patchtype以后,有的边界条件就能在cyclic patch type上用了。 -
@李东岳 我现在用了inletoutlet , 是可以和cyclic的patchtype一起用的
-
我想要做一个周期性循环的算例,但是不是所有的物理量都是循环的,标量场(比如温度)的进口是一个固定的值,可以在cyclic的patchtype实现这个吗?
-
在看《Computational Fluid Dynamics of Dispersed Two-Phase Flows at High Phase Fractions》的时候碰到一个不太理解的地方。
一般的相间动量传递可以写成方程(3.10)
为了模拟phase inversion, 方程(3.11)加入了b相变成离散相时的曳力、升力等。
但对于方程(3.11)的曳力相,如果仍然是a相为离散相的情况,$\alpha_a$→0 ,$ f_a$→0,
那曳力相前面的部分不就变成$3/4\alpha_a\alpha_b(f_b\frac{C_{db}\rho_a}{d_b})$,和(3.10)里的不一样,b相变成分散相时候应该才是这个形式,虚拟质量力也是一样的情况。 升力也对不上。 -
最近算了一个气泡在静水中上升, 计算域用的是圆柱,气泡从底部开始上升,底面wall边界,侧面和顶部零梯度边界。
发现气泡尾部的速度场不太对,如图。
在O型网格划分的四个方向分别出现了一块区域速度比较大。这个应该是非物理的,如果换成完全正交的网格就不会出现。snGradSchemes采用的是corrected, PIMPLE循环中nCorrectors设置为3次,nNonOrthogonalCorrectors设置为3次。 不知道还有没有别的地方会造成影响,有没有大神有思路或者碰到过类似的问题的。
-
@小考拉 第四张图和第五张图就是tecplot的
-
-
我发现是因为我改动了orientation函数, 我是先用isoadvector重构了一遍界面,取了界面的法相方向,在orientation函数中又赋值给了interface.n(),
如果采用原先的cellNormals.operator[]来进行赋值的话,是没有问题的,计算出来的体积和实际上alpha1所占有的体积是相同的。
但是我没想明白为什么会这样,我大致学习了一下您的论文,我感觉界面的法相方向应该是不会影响重构出来的体积大小的吧? 应该也不是方向弄反了,如果反了的话两个值应该一直会差很多才对。 -
又碰到一个问题,我自己写了个函数计算网格内的液相体积, surface与网格的交点是从plicFacePoints()函数读过来的,
比较了一下计算出来的液相体积和alpha1乘以网格体积的值, 对大部分网格,两个值基本上是一致的,误差在0.1%以内,但是当alpha1接近0或者1的时候,误差有时候就比较大了。
下面是我碰到的一个误差最大的网格, 我用的是长方体的网格,PointLists_是网格的8个点,isofacePoints_ 是surface与网格的交点,VolumeIntegrate_ 是我自己写的函数计算出来的体积, alpha1_ * mesh_.V 就是这个网格内的alpha1乘以体积,test_ratio是这两个值的比值。
因为我算例是二维的,所以我自己也手算了一下,函数算出来的体积应该没有什么问题,应该是重构界面的时候出现的误差,我想请教一下有方法减少这部分的误差吗?@队长别开枪PointLists_ 8((0.0185 0.001 0.000522015) (0.0185 0.0015 0.000522015) (0.019 0.001 0.000522015) (0.019 0.0015 0.000522015) (0.0185 0.001 -0.000522015) (0.0185 0.0015 -0.000522015) (0.019 0.001 -0.000522015) (0.019 0.0015 -0.000522015)) isofacePoints_ 4((0.019 0.00144899 0.000522015) (0.0189992 0.0015 0.000522015) (0.0189992 0.0015 -0.000522015) (0.019 0.00144899 -0.000522015)) VolumeIntegrate_ = 2.11363e-14 alpha1_ * mesh_.V = 1.80361e-14 test_ratio = 0.853322
-
@队长别开枪
确实有用, 现在好多了 -
@队长别开枪
我测试了一下interIsoFoam和interPlicFoam重构的界面,感觉plic的界面精度不太够
alpha的场是这样的,气液相左右平分一个比较斜的网格。
把重构出来的界面写到文件里面打开查看,左边是iso重构的界面,右边是plic重构的界面,可以看到iso重构出来的界面基本上符合实际的相界面,而plic重构出来的界面波浪形特别严重。大佬有思路改进这个问题吗?
-
@队长别开枪 我最近就是在修改interIsoFoam里的积分计算方法,但结果总是不好,二维计算的结果还可以,但是一算三维的气泡,速度场就会在局部出现很大的值。我感觉是因为我把它的界面当作平面来处理了,只取面的前3个点来做计算,我准备根据interPlicFoam计算得到的界面再试试看。
-
大佬问个问题,您这个求解器重构的界面是平面吗? 我之前用的interIsoFoam, 看他论文里说iso-surface他是处理成非平面的,我对比了一下of1906中的interIsoFoam和您这个求解器, 我感觉他的求解器在算气泡上升的过程和interFoam差距很大,您这个更加接近
-
@小考拉
看到这个帖子想到了我碰到的一个问题。
我的计算结果是一条线上的值,并且只在一层网格内存在值。
但是后处理软件把cell data 插值到Point data后,这个值就减半了。
然后对这条线进行绘图,绘制出来的数据都是减半后的数据。
paraview:
tecplot
这个问题我是一直没有找到解决方法,因为不是很关键所以也没太纠结,不知道有没有大佬有思路的。
-
@队长别开枪 是的 这个精度和效率完全够了 再次感谢大佬的工作
-
@队长别开枪 这个工具的功能确实是我想要实现的,非常感谢。 顺便请教一下,相交体积的计算您是怎么实现的,可以简单说一下思路吗,我自己本来这两天也在想做这个,但是没有想到特别好的办法。
-
@队长别开枪 在 setFields是否可以在给定的几何域的边界上的网格赋值的时候进行插值 中说:
刚发现大佬是做PLIC-VOF的,我最近是想试试修改一下iso-advector的代码,因为iso-advector总会在非界面的位置出现轻微大于0和小于1的网格。不知道您的interPlicFoam在这方面会有类似的问题吗? 另外就是您在初始化的时候,会根据实际的气泡或者说气液界面位置去赋值每个网格的值吗(我觉得这会影响初始的界面重构),我是考虑在给初始的alpha场的时候,根据每个网格占据的气液相体积计算相应的体积分数来赋值,这也是我这个帖子提出的原因,因为我之前只会把代码写在求解器里进行编译。 -
@队长别开枪 在 interPlicFoam 中说:
如果修改snaptol的话是不是理论上守恒性被破坏了?
-
@队长别开枪 是的,我想要在初始化的时候给定气液界面处的网格一个处于0-1的值,而不是这种突变的值。 李老师给的努塞尔数的例子应该就是我想问的,以前看到过但是忘了怎么用。不过我这两天还在外面没有时间去尝试是不是能达到我的目的。
-
setFields赋值的时候在边界会产生锯齿状的分布,如下图
如果想要在处于给定的几何域的边界上的网格赋值的时候插值的话,需要怎么做?另外请教一个问题,如果说我想直接对场的数据进行操作的话,除了直接将代码编译进求解器外,还有没有办法可以在不运行求解器的时候进行操作,有没有例子可以参考。
-
直接的宏应该是没有的 你可以自己用UDF写个类似于level set的函数计算每个位置到界面的距离
-
@马乔 好的,谢谢。 顺便问一下,这个auto是指什么?数据类型自动根据后面的指定嘛?
-
有没有函数可以像mesh.cellPoints()一样可以直接根据面的index来获取组成面的四个点的坐标?
-
void Foam::interfaceProperties::calculateK() { const fvMesh& mesh = alpha1_.mesh(); const surfaceVectorField& Sf = mesh.Sf(); // Cell gradient of alpha const volVectorField gradAlpha(fvc::grad(alpha1_, "nHat")); // Interpolated face-gradient of alpha surfaceVectorField gradAlphaf(fvc::interpolate(gradAlpha)); // gradAlphaf -= // (mesh.Sf()/mesh.magSf()) // *(fvc::snGrad(alpha1_) - (mesh.Sf() & gradAlphaf)/mesh.magSf()); // Face unit interface normal surfaceVectorField nHatfv(gradAlphaf/(mag(gradAlphaf) + deltaN_)); // surfaceVectorField nHatfv // ( // (gradAlphaf + deltaN_*vector(0, 0, 1) // *sign(gradAlphaf.component(vector::Z)))/(mag(gradAlphaf) + deltaN_) // ); correctContactAngle(nHatfv.boundaryFieldRef(), gradAlphaf.boundaryField()); // Face unit interface normal flux nHatf_ = nHatfv & Sf; // Simple expression for curvature K_ = -fvc::div(nHatf_); // Complex expression for curvature. // Correction is formally zero but numerically non-zero. /* volVectorField nHat(gradAlpha/(mag(gradAlpha) + deltaN_)); forAll(nHat.boundaryField(), patchi) { nHat.boundaryField()[patchi] = nHatfv.boundaryField()[patchi]; } K_ = -fvc::div(nHatf_) + (nHat & fvc::grad(nHatfv) & nHat); */ }
interFoam在计算曲率的时候应该是调用了这个函数, 我想问一下这里被注释掉的这段complex expression什么时候可以用? 有没有原始文献可以参考。
-
你现在解决虚拟流动的问题了吗?
-
@东岳
我现在是对所有网格做遍历,遍历每个网格上的面,判断是内部的面还是边界的面,如果是边界的面的话,通量值就会和另一块processor上对应的网格上的值相关,目前就是不知道怎么去找这个网格。 -
@东岳
谢谢李老师回复,我的问题是这样的:我想要遍历每个面修改通量,然后发现没有考虑网格内部的由于并行出现的每个processor上的交界面,现在不知道怎么去遍历这些边界上的面,以及找到这个边界的某个面的上下游的cell。有没有现成的例子可以参考。
不知道我有没有把问题描述清楚。 -
我想请教一个问题,在并行下,不同processor数据交换位置的面,patchi和facei一样吗?
还有就是如何去找一个processor上一个面对应的另外一个processor上的面。 -
@东岳
第一个大概明白了,就是用迎风格式的时候
-fvc::flux(-phir, alpha2, alpharScheme) 和 fvc::flux(phir, alpha2, alpharScheme) 会不一样对吧?第二个的话
tmp<surfaceScalarField> talphaPhi1Corr(talphaPhi1Un() - alphaPhi10);
那alphaPhi10是高阶的吗?我之前以为是talphaPhi1Un是高阶的,alphaPhi10是低阶的。
-
tmp<surfaceScalarField> talphaPhi1Un ( fvc::flux ( phiCN(), cnCoeff*alpha1 + (1.0 - cnCoeff)*alpha1.oldTime(), alphaScheme ) + fvc::flux ( -fvc::flux(-phir, alpha2, alpharScheme), alpha1, alpharScheme ) );
第二项通量中的-fvc::flux(-phir, alpha2, alpharScheme)为什么要用两个负号?
MULES::correct ( geometricOneField(), alpha1, talphaPhi1Un(), talphaPhi1Corr.ref(), Sp, (-Sp*alpha1)(), 1, 0 );
调用mules的correct函数的时候,这个talphaPhi1Un()有什么用吗? 我看了一下好像correct函数本身没有用到这个参数?
-
你换个并行方式试试
-
@mr-shan 跟库朗特数有关, 越小的网格精度越高,但是要保证一样的库朗特数就要用越小的时间步长。
-
我在fluent里面用CLSVOF的时候也碰到类似的情况, 原因我感觉是网格太小或者时间步长太大,你可以试试缩小时间步长。
-
如题,想算个泡状流, 用VOF的话计算量太大, 用欧拉多相流的话网格又太小了, 比气泡的直径小。
-
@两月三年 定义的flux可以是与速度无关的。参考这个例子https://wenku.baidu.com/view/af5875254b35eefdc8d3338f.html,这里例子里的flux就是单位向量乘以面积的向量。单位向量是无散的,肯定没有问题。我想知道的是如果不是无散的,为什么帮助里说会导致overshoot或undershoot。
-
@两月三年 默认的对流项是密度乘以速度,这个场在满足连续性方程的情况下是无散的,这个没问题。如果我自己定义的对流扩散方程中的对流项不是速度,并且不是无散的,那么可不可以用uds来做? 为什么这里说如果不是无散的会导致高估或低估?
-
Note that the advective flux field that is supplied by your UDF should be divergence-free (that is, it satisfies the continuity equation). In discrete terms this means that the sum of fluxes over all the faces of each cell should be zero. If the advective field is not divergence-free, then is not “conserved" and will result in overshoots/undershoots in the cell value of .
看到DEFINE_UDS_FLUX的帮助文档里有这么一句话,不是很明白为什么要求是无散的? -
@李东岳 好的 谢谢!
-
如果你需要气泡的形状,波浪的表面,你就需要捕获气泡或者波浪的界面,因此你需要使用界面跟踪类模型
这里的图2得多少网格 -
@金石为开 你好,请问IATE模型能给进口的气泡直径吗?
-
@wwzhao 那几何重构求解得到的体积分数是间断函数吗?
-
@李东岳 好的,非常感谢!
-
@李东岳 没有搜到这篇文章, 能麻烦您发一下吗? 非常感谢!
-
请问这个是哪里看到的,有更详细的讲VOF吗?
-
@李东岳 感谢回答! 我的理解是,VOF在求解的过程中,气液的相互作用已经在一套控制方程里体现出来了,不需要再添加额外的相间作用力,添加了反而是不对的。这么理解有问题吗?
-
VOF本身是一套控制方程,两相之间的作用力该如何实现?
bunrs湍流耗散力
bunrs湍流耗散力
粒子与网格归属问题
粒子与网格归属问题
请教一个cyclic边界条件的问题
请教一个cyclic边界条件的问题
请教一个cyclic边界条件的问题
关于openfoam中使用的双流体模型
interFoam + 非正交网格计算
tecplot如何提取一条曲线上的数据
interPlicFoam
interPlicFoam
interPlicFoam
interPlicFoam
interPlicFoam
interPlicFoam
interPlicFoam
tecplot如何提取一条曲线上的数据
setFields是否可以在给定的几何域的边界上的网格赋值的时候进行插值
setFields是否可以在给定的几何域的边界上的网格赋值的时候进行插值
setFields是否可以在给定的几何域的边界上的网格赋值的时候进行插值
interPlicFoam
setFields是否可以在给定的几何域的边界上的网格赋值的时候进行插值
setFields是否可以在给定的几何域的边界上的网格赋值的时候进行插值
fluent自适应网格用什么宏定义自适应标记函数。
如何获取一个面上四个角点的坐标?
如何获取一个面上四个角点的坐标?
interFoam的曲率计算
Fluent VOF 耦合Level-Set方法时的Density correction 抑制虚拟流动
关于processor边界的问题
关于processor边界的问题
关于processor边界的问题
关于VOF中alphaEqn.H的问题
关于VOF中alphaEqn.H的问题
ANSYS CFX 16.0 多核并行出错,提示mpid.exe已停止工作
两相流VOF自由面处总会出现锯齿状
两相流VOF自由面处总会出现锯齿状
欧拉多相流能不能计算气泡直径比网格大的情况?
关于fluent uds的
关于fluent uds的
关于fluent uds的
多相流与矩方法的数学模型
多相流与矩方法的数学模型
使用QBMM模拟气泡流
关于气层或气泡减阻的多相流模型的选择
看到个VOF界面重组的小图,挺有意思
看到个VOF界面重组的小图,挺有意思
看到个VOF界面重组的小图,挺有意思
请问VOF方法能实现曳力等相间作用力的效果吗?
请问VOF方法能实现曳力等相间作用力的效果吗?