@yfclark 我也隐隐感觉到非惯性坐标系似乎有什么局限性,但是说不出来。谢谢您的耐心解答、建议和鼓励。
千里之行
帖子
-
动网格还是非惯性参考系? -
动网格还是非惯性参考系?@yfclark 十分感谢您的解答。因为目前我准备基于动网格这个路线做点东西,但是有人说完全没必要,用非惯性参考系就行,所以我也十分困惑,一时不知道如何说服别人和说服自己。能否具体举一些有趣的例子呢?十分感谢!
-
动网格还是非惯性参考系?对于液舱晃荡这种流动,液舱受迫运动导致舱内流体产生运动。OpenFOAM 当前的求解器是基于惯性参考系,用了刚体运动的动网格技术求解。还有一种方法是在非惯性参考系下求解控制方程,而不需要用到刚体运动动网格技术,即在动量方程右端项加入平移和转动惯性力。请问这两种方法孰优孰劣,为什么 OpenFOAM 选择了前者?
-
compressibleInterFoam 压力方程中关于 psi 的项是如何推导出来的?@东岳
谢谢东岳老师,大概明白了,这样就隐式处理了连续性方程里密度对时间的导数项,否则不加这项的话,就是显式处理。这样理解对吗? -
compressibleInterFoam 压力方程中关于 psi 的项是如何推导出来的?@东岳
谢谢东岳老师,我现在知道如何增加一个状态方程类,编写新的 psi 计算值。我想请教一下:(alpha1*psi1/rho1) * correction(fvm::ddt(p_rgh))
这个关于 psi 的项乘以 correction 函数,是数学模型理论推导出来的呢,还是出于数值计算的考虑增加呢?
-
compressibleInterFoam 压力方程中关于 psi 的项是如何推导出来的?各位前辈,请教一个问题。在 multiphase/compressibleInterFoam 求解器中,压力方程里含有关于 psi 的项,我一直不知道这是如何推导出来的,但是其他的项能找到推导的依据。以 OpenFOAM-v1806 为例:
p_rghEqnComp1 = pos(alpha1) *( ( fvc::ddt(alpha1, rho1) + fvc::div(alphaPhi1*rho1f) - (fvOptions(alpha1, mixture.thermo1().rho())&rho1) )/rho1 - fvc::ddt(alpha1) - fvc::div(alphaPhi1) + (alpha1*psi1/rho1) * correction(fvm::ddt(p_rgh)) );
其中最后一行的这项关于 psi1 ,psi1 是第 1 相状态方程里的系数,以 OpenFOAM 的 perfectFluid 状态方程为例,
rho1 = psi1 * p + rho1_ref
psi1 = 1 / (R * T)
这里 rho1 是第一相的密度,rho1_ref 是一个基准密度,是常量,从字典里读取。p 是压力场。R 是常数,从字典里读取的。T 是温度场。但是如果状态方程有一个更复杂的形式,比如 rho1_ref 也是和温度有关,是变化的。或者密度和压力没有这样的线性关系。那么这一项该如何考虑呢?如何变化呢?
-
如何设置运行期自动变化写数据的时间间隔?@李东岳 还有一个问题请教一下,表达式里可以包含分支 if else 这种结构吗?
-
如何设置运行期自动变化写数据的时间间隔?@sungda 今天我还意识到一个问题,我用到了整体运动动网格,当我从新的时刻继续算的时候,fvSolution 字典里的压力参考点 pRefPoint 其实也需要改,因为这个位置变了。OpenFOAM 用的是大地坐标描述运动的计算域。如果运动复杂,这个位置还不好确定呢。
-
如何设置运行期自动变化写数据的时间间隔?@李东岳 谢谢,没想到还有这种操作啊,能嵌入数学计算表达式,得好好设计一个表达式。
-
如何设置运行期自动变化写数据的时间间隔?@sungda 谢谢,这个方法非常好,我现在就准备这么干啦!
-
如何设置运行期自动变化写数据的时间间隔?请教一下各位,我的问题是:
在 controlDict 里 的 writeInterval 关键字是用来设置写数据的时间间隔。现在我遇到一个算例,网格量很大,在某个时间段内想要很密集的写数据,然后在 paraview 里分析。但是之前和之后不需要这么密集的写数据。如果一直很密集写数据,磁盘没那么大。根据之前试算的结果,我知道了要加密写数据的时间段区间。有什么办法能够让 writeInterval 在我指定的时间区间内变小,然后 OpenFOAM 加密写数据? -
求一篇关于 VOF 方法 MULES 的文章@李东岳 十分感谢东岳老师!
我是看了 International Journal of Multiphase Flow 期刊上的这篇文章:
Influence of surface tension implementation in Volume of Fluid and coupled Volume of Fluid with Level Set methods for bubble growth and detachment
这篇文章可以从下面的链接下载
https://pan.baidu.com/s/1nwO8cNR
其中说到 OpenFOAM 用到的 VOF 方法的时候引用了这篇文章,我一看作者是 Weller,所以以为 MULES 和这篇文章相关。 -
求一篇关于 VOF 方法 MULES 的文章大家好,我个人感觉关于 OpenFOAM 中的 VOF 方法 MULES 的资料很少,有一篇文章感觉很相关,也被不少文章引用:
Weller, H.G., 2008. A new approach to VOF-based interface capturing methods for incompressible and compressible flows. Technical Report No. TR/HGW/04.
好像是一个技术报告,也不知道属于什么期刊,我一直不能下到。如果谁有的话,能否方便共享一下吗?如能这样,感激不尽!!
-
关于压力场边界更新的实现机制的疑问@dzw05 哦,懂了,原来如此,十分感谢!!
-
关于压力场边界更新的实现机制的疑问@李东岳 哦,明白了,谢谢东岳老师,我再去好好看看相关的代码。那 "calculated" 类型的边界条件对应的类是 calculatedFvPatchField ,但是并没有重新定义虚函数 evaluate,肯定是基类 fvPatchField 的 evaluate 函数被调用了,可是那个 evaluate 函数并没有做什么计算,所以即使调用了场对象的 correctBoundaryConditions 函数,在 calculated 类型的边界也没有发生计算,这样理解对吗?
另外,经常会遇到这样的边界条件:inlet { type fixedValue; value $internalField; }
这里的 $internalField 是什么意思呢,我认为是这块边界的值取邻近内场的值,但是一直也没有找到代码的依据,并且这样的边界条件和 zeroGradient 又有什么区别呢?
-
关于压力场边界更新的实现机制的疑问大家好,我的问题是在计算过程中,压力场的边界何时更新?因为我发现在 multiphase 类的求解器中,compressibleInterFoam 在 pEqn.H 中分别调用速度场和压力场的 corrrectBoundaryConditions 函数来更新与边界相关的值,即
U.correctBoundaryConditions();
p_rgh.correctBoundaryConditions();
但是 interFoam 在 pEqn.H 中只会调用速度场的 correctBoundaryConditions 函数,不会调用压力场,其他地方也没有,只有
U.correctBoundaryConditions();
类似的,twoPhaseEulerFoam, reactingTwoPhaseEulerFoam, reactingMultiphaseEulerFoam, cavitatingFoam, compressibleMultiphaseInterFoam 这些求解器都会调用速度场和压力场的 correctBoundaryConditions 函数。但是 twoLiquidMixingFoam, driftFluxFoam, potentialFreeSurfaceFoam, multiphaseEulerFoam, interPhaseChangeFoam, MPPICInterFoam 只会调用速度场的 correctBoundaryConditions 函数,不会调用压力场的。
我也查看了源代码,目前我掌握到的信息如下:
GeometricField 类型的 correctBoundaryConditions 函数的定义是template<class Type, template<class> class PatchField, class GeoMesh> void Foam::GeometricField<Type, PatchField, GeoMesh>:: correctBoundaryConditions() { this->setUpToDate(); storeOldTimes(); boundaryField_.evaluate(); }
可以看出具体的操作是交给成员 boundaryField_ 的 evaluate 函数执行的,boundaryField_ 声明如下:
//- Boundary Type field containing boundary field values Boundary boundaryField_;
Boundary 类型是各个边界块的集合。每一个边界块根据不同的边界条件类型对应有不同的边界条件类,比如 zeroGradient 类型的边界条件对应 zeroGradientFvPatchField 类,他们共同的基类是 fvPatchField,evaluate 函数是这个派生体系的虚函数,不同的边界条件派生类会重新定义自己的这个虚函数,实现了多态,从而实现不同的边界更新方式。而 boundaryField_ 的 evaluate 函数会遍历各个边界块,调用各自的 evaluate 函数实现更新。代码如下:
template<class Type, template<class> class PatchField, class GeoMesh> void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: evaluate() { ...... forAll(*this, patchi) { this->operator[](patchi).evaluate(Pstream::defaultCommsType); } ...... }
我想请教各位,如果没有调用压力场的 correctBoundaryConditions 函数,那么压力场是怎么更新边界的呢?我所指定的不同的压力边界条件,又是如何生效的呢?问题有点长,十分感谢您的耐心阅读与解答!!
-
怎么让交界面更加平滑@wwzhao 动网格主要分两种,一种是整体做刚性运动,网格单元之间没有相对位移。另一种是单元有变形,有拓扑变化,或者有动态增减网格。 isoAdvector 应用于第二类动网格可能需要一些改动,那么第一类动网格呢?我目前正在准备研究这个,想请教一下您对此的看法。