pisoFoam计算的U,求div(U)结果为何不是严格等于0
-
@coolhhh 在 pisoFoam计算的U,求div(U)结果为何不是严格等于0 中说:
为何of中最后输出phi不用fvc::flux(U),而是用了phi = phiHbyA - pEqn.flux()?
fvScalarMatrix pEqn ( fvm::laplacian(rAU, p) == fvc::div(phiHbyA) ); pEqn.setReference(pRefCell, pRefValue); pEqn.solve(); phi = phiHbyA - pEqn.flux();
上面这几行代码里面,
pEqn
实际上是建立在sum(phi)= sum(phiHbyA - pEqn.flux())=0
,也就是说,在sum(phi)= sum(phiHbyA - pEqn.flux())=0
的时候,才有fvm::laplacian(rAU, p) == fvc::div(phiHbyA)
这个形式。所以求解fvm::laplacian(rAU, p) == fvc::div(phiHbyA)
,sum(phi)= sum(phiHbyA - pEqn.flux())=0
。 -
李老师,我做了简单的对比:
-
下面计算的
div(U)
与div(phi)
结果基本相等,区别是小数点后五六位
①直接求div(U)
②已知U
->phi = fvc::flux(U)
->div(phi)
-
接着对比
reconstruct(phi)
。编译mypisoFoam
,把pEqn.H
中计算U修改为
U = fvc::reconstruct(phi); // U = HbyA - rAU*fvc::grad(p);
同样计算计算of2206自带一个算例:Decay of homogeneous isotropic turbulence,模拟结果:
(1)对比div(U)
与div(phi)
的均值和标准差。采用reconstruct(phi)
,得到的div(U)
的均值和标准差要小一点。这里有个注意点是,of计算的div(phi)
,基本数值都很小,但会有一个比较大的数,下面的计算结果是剔除了这个最大数的计算结果。
(2)对比湍流特性。可以看出
reconstruct(phi)
结果要更差,还是原本of的U = HbyA - rAU*fvc::grad(p)
计算准确
-
-
谢谢李老师,文章已经发表了,只是好奇做个对比。在想的问题是,一直以来各种湍流生成方法都在追求实现生成零散度的湍流场
U
,我们直接构造的是0时刻的U
,而不是phi
。根据测试结果看,如果严格让
div(U)=0
, 此时U -> phi = fvc::flux(U) -> div(phi)
得到的div(phi)
也基本等于0。但这种情况下0时刻的湍流特性会变化的比较大,结果会变差。of在后面时间步计算输出的
U
实际上不满足div(U)=0
,所以想法是0时刻提供的初始U
也不需要强制要求div(U)=0
,这样得到的结果可能才是更合理的。 -
-