标量场壁面梯度的处理方式



  • 各位前辈:
    我自己编写的一个求解器里 热扩散系数ka 在不同位置值不一样,是一个标量场。因此我定义了一个变量 volScalarField ka=f(…) 。 在温度方程里的拉普拉斯项fvm::laplacian(ka,T) 中 存在ka的梯度的计算。 volScalarField 在壁面边界也有分布,因此grad(ka)在边界处的计算是错误的。
    我的办法是把ka在壁面设为 zerogradient 条件。但总觉得不是十分完美,不知各位前辈有没有更好的方法。


  • 网格教授 OpenFOAM教授 管理员

    存在ka的梯度的计算。 volScalarField 在壁面边界也有分布,因此grad(ka)在边界处的计算是错误的。

    为什么?fvc::grad()函数在边界处已经考虑了边界的问题。



  • @东岳 纯流体计算时热扩散系数在边界是没有意义的吧,一般情况下是dimensionscalar ,是一个常数,grad(ka)都是0。 但如果吧ka 设为 volScalarField 的话,边界值也会被用于计算grad。 热扩散系数应该定义在流体域也就是内部场中,但volScalarField 有边界值。 有没有可能只对volScalarField 的内部场进行初始化和计算?
    像这样 ka.primitiveFieldRef()=(r*(kf*(1+nn)-ks)+ks)/(1+nn*r);


  • 网格教授 OpenFOAM教授 管理员

    你可以简单的把grad(ka)在边界处的值设为0,可参考: http://www.cfd-china.com/topic/1199



  • @东岳 抱歉,我上面说的有问题,边界上的值会影响 fvc::grad(ka)在靠近壁面边界的第一层网格上的值。如果把grad(ka)在边界上设为0,靠近第一层网格处的grad(ka)还是不对。 是不是应该对ka在边界的值进行操作。或者手动计算靠近边界第一层网格上的grad(ka)。

    我现在是吧ka在壁面设为zerogradient 条件


  • 网格教授 OpenFOAM教授 管理员

    参考这个:

    
        forAll(patches, patchi)
        {
            const fvPatch& currPatch = patches[patchi];
    
            if (isType<wallFvPatch>(currPatch))
            {
                forAll(currPatch, facei)
                {
                    label faceCelli = currPatch.faceCells()[facei];
    
                    epsilon[faceCelli] = 0.0;//毗连网格单元值
                    G[faceCelli] = 0.0;//毗连网格单元值
                }
            }
        }
    

    将你的边界毗连网格单元值的梯度手动给定



  • @东岳 谢谢前辈