fvm::ddt(rho, T)与rho*fvm::ddt(T)的区别



  • 假设我又一个这样的方程:
    $$\frac{\partial( \rho T)}{\partial t} = -\nabla \cdot (\vec{U}\rho T)$$

    其中$\rho$表示流体(比如水)的密度,根据状态方程及p,T计算出来。请问在离散的时候下面这两种写法的结果有什么区别?

    1. fvm::ddt(rho, T) == -fvm::div(phi,T);

    2. rho*fvm::ddt(T) == -fvm::div(phi,T);



  • 区别应该在于密度是否可压吧



  • fvm::ddt(rho,T) = $\frac{\p \rho T}{\p t}$, rho*fvm::ddt(T) = $\rho\frac{\p T}{\p t}$



  • 我最近在更新rhoFoam系列求解器,做了更深的工作,发现ddt这一项还有点意思,假设$t$为当前时间步,欧拉格式:

    • runTime++之前,fvc:ddt(T) = $\frac{T^t-T^{t-\Delta t}}{\Delta t}$;

    • runTime++之后,如果T进行TEqn.solve()更新,fvc:ddt(T) = $\frac{T^{t+\Delta t}-T^{t}}{\Delta t}$

    • runTime++之后,如果T没有进行TEqn.solve()之类的更新,fvc:ddt(T) = 0,因为$T^{t+\Delta t}=T^t$, 同时T.oldTime()也是$T^t$。,

    主要是代码中的vfvf.oldTime()需要跟时间步对一下。

    所以fvm::ddt(rho, T)还需要考虑rhoEqn是否更新:

    • 如果在runTime++之后,进行了rhoEqn.solve(),那么fvm::ddt(rho, T) = $\frac{\rho^{t+\Delta t'} T^{t+\Delta t}-\rho^{t} T^{t}}{\Delta t}$

    • 如果在runTime++之后,没有进行rhoEqn.solve(),那么fvm::ddt(rho, T) = $\frac{\rho^{t} T^{t+\Delta t}-\rho^{t-\Delta t} T^{t}}{\Delta t}$

    • 前者看起来更耦合在一起

    二者都不同于rho*fvm::ddt(T),因为其等于$\frac{\rho^{t} T^{t+\Delta t}-\rho^{t} T^{t}}{\Delta t}$,或$\frac{\rho^{t-\Delta t} T^{t+\Delta t}-\rho^{t-\Delta t} T^{t}}{\Delta t}$



  • @东岳 太感谢了!您这次来了一个非常透彻的分析,我的疑问已全部被解决。


Log in to reply
 

CFD中文网 2016 - 2020 | 京ICP备15017992号-2