Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 请教porosityModel.C中diag()、source()和psi()的意思

请教porosityModel.C中diag()、source()和psi()的意思

已定时 已固定 已锁定 已移动 OpenFOAM
11 帖子 2 发布者 8.0k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • C 离线
    C 离线
    chaoscfd
    写于 最后由 编辑
    #2

    啊,尴尬,题目写错了,应该是“请教DarcyForchheimer.C中diag()、source()和psi()的意思”。correct函数是在DarcyForchheimer.C中,不是在porosityModel.C中。正文中对应的地方也错了。:zoule:

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #3

    在离散方程的时候,内部场离散会产生源项,你看这个http://dyfluid.com/icoFoam.html 方程16就会产生一个source。另外就是人工手动加的source。我12年写的那个好像不对。怎么那么复杂.. psi你就可以当做是U

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • C 离线
    C 离线
    chaoscfd
    写于 最后由 李东岳 编辑
    #4

    @东岳 在 请教porosityModel.C中diag()、source()和psi()的意思 中说:

    http://dyfluid.com/icoFoam.html

    感谢李老师的回复!
    稍微有一点理解了,比如在icoFoam中这个源项是来自于上一个时间步的值:
    \begin{equation}
    S_{P}^{n}=\frac{V_{p}}{\Delta_{t}}U_{P}^{n}
    \end{equation}
    但如果是没有时间项的SIMPLE算法是不是这个源项UEqn.source()就没有值了呢?
    主要是因为我的问题是在看porousSimpleFoam的代码时产生的。在porousSimpleFoam中的多孔隙模型DarcyForchheimer里面,源项的表达式为:
    \begin{equation}
    S=-(\mu d+\frac{\rho \left | U \right |}{2})U
    \end{equation}
    这一段代码应该是对应DarcyForchheimerTemplates.C中的apply()函数:

    void Foam::porosityModels::DarcyForchheimer::apply
    (
        scalarField& Udiag,
        vectorField& Usource,
        const scalarField& V,
        const RhoFieldType& rho,
        const scalarField& mu,
        const vectorField& U
    ) const
    {
        forAll(cellZoneIDs_, zoneI)
        {
            const tensorField& dZones = D_[zoneI];
            const tensorField& fZones = F_[zoneI];
    
            const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]];
    
            forAll(cells, i)
            {
                const label celli = cells[i];
                const label j = this->fieldIndex(i);
                const tensor Cd =
                    mu[celli]*dZones[j] + (rho[celli]*mag(U[celli]))*fZones[j];
    
                const scalar isoCd = tr(Cd);
    
                Udiag[celli] += V[celli]*isoCd;
                Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]);
            }
        }
    }
    

    代码的最后

                Udiag[celli] += V[celli]*isoCd;
                Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]);
    

    给Udiag()和Usource()附了值,应该就是代表对U方程的修正,将源项的影响传入到U方程中,这样的理解是否正确?那在赋值之前,对于SIMPLE算法,Usoure()的值应该是为0的,是这样的吗?

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #5

    我没细看你这个代码,但是从

     const tensor Cd =
                    mu[celli]*dZones[j] + (rho[celli]*mag(U[celli]))*fZones[j];
    
                const scalar isoCd = tr(Cd);
    
                Udiag[celli] += V[celli]*isoCd;
                Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]);
    

    这几行来看,应该就是人工手动加的源项。对角部分isoCd和源项isoCd部分可以抵消,但这样写可以增加对角占优

    那在赋值之前,对于SIMPLE算法,Usoure()的值应该是为0的,是这样的吗?

    还需要确定是否有其他的源项。如果没有就是0

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    C 1 条回复 最后回复
  • C 离线
    C 离线
    chaoscfd
    在 中回复了 李东岳 最后由 编辑
    #6

    @东岳 在 请教porosityModel.C中diag()、source()和psi()的意思 中说:

    这几行来看,应该就是人工手动加的源项。对角部分isoCd和源项isoCd部分可以抵消,但这样写可以增加对角占优

    “对角部分isoCd和源项isoCd部分可以抵消”,这句话还是不太懂,我还得再消化消化。
    但今天试着输出了一些网格的Usource():
    这是空间内存在多孔隙介质时的Usource()值:
    f7a5c101-0e07-4eb2-aee0-1db9a3484906-image.png
    这是空间内无多孔隙介质时的Usource()值:
    93668cd2-4164-4301-98da-dc249cd30bb2-image.png
    发现确实没有多孔隙介质时Usource()的值要小很多,已经接近0了。

    1 条回复 最后回复
  • C 离线
    C 离线
    chaoscfd
    写于 最后由 chaoscfd 编辑
    #7

    时隔九个月,今天重新看这个帖子,终于搞清楚了,记录一下。
    确实是像李老师说的那样,Usource()就是源项,这里是手动加的源项,之前一直以为是系数矩阵的非对角元。
    Udiag()代表U方程的对角线元素,来自IduMatrix,而Usource()是源项矩阵,来自fvMatrix。上面的代码之所以会出现Udiag(),其实就是像李老师说的那样,是为了增加对角占优。而多孔隙模型的源项就是从Usource加入的:

    Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]);
    

    这里Cd就是公式(2)中括号中的部分。

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #8

    最近在更新多孔介质部分内容,下图应该解释的比较清楚

    2021-08-10 09-56-35屏幕截图.png

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • C 离线
    C 离线
    chaoscfd
    写于 最后由 编辑
    #9

    原来是这样,感觉很神奇啊。请教李老师,为什么要对源项分开进行显式隐式的离散?

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 chaoscfd 最后由 编辑
    #10

    @chaoscfd 不能单独进行隐性离散,因为$\mathbf{D}$为二阶张量,单纯显性离散其实完全可以。不过既然能隐性一点,那就隐性一点增加对角占有 :-)

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    C 1 条回复 最后回复
  • C 离线
    C 离线
    chaoscfd
    在 中回复了 李东岳 最后由 编辑
    #11

    @李东岳 感谢李老师!

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]