请教密度随深度连续变化设置问题



  • 大家好,目前我正在使用interfoam,上层是空气,下层是水,对于水体,如何在边界和初始场文件设置密度随深度连续变化?已知其分布规律



  • interFoam是不可压缩的,如果是水和空气,只有2个密度不具备梯度变化。你那个需要compressibleInterFoam。密度随深度连续变化需要做硬植入或者写个utility,比如这种:https://coding.net/u/dyfluid/p/Solvers_DYFLUID/git/blob/master/pipeU/pipeU.C



  • @东岳 谢谢版主。您给我的例子中是速度随深度变化U[cell].y() = 0.7 - mag(x - 0.075);,这个我用groovybc实现过。我的问题是一个水池,左侧入口速度恒定,但是密度需要连续分层,并且初始流场密度也要分层,与入口一致。研究流场中的障碍物影响,这个是否有相似的例子可以参考?



  • 设置初始场可以用东岳大哥的方法(自己写一个 utility),边界条件则可以使用 codedFixedValue
    举个例子:

    wall
    {
        type            codedFixedValue;
        value           uniform 550;
        name            suibian;
        code            #{
            scalarField x = this->patch().Cf().component(0); 
            // Cf 表示此 patch 的所有面心坐标,是一个 vectoeField,component(0) 表示取其第 0 个分量,即 x 坐标。
            scalarField T = 550*x;
            operator==(T);
        #};
    }    
    


  • @浪迹天大请教密度随深度连续变化设置问题 中说:

    codedFixedValue

    谢谢您,这几天一直没有看



  • @浪迹天大 您好,我有些疑惑。
    初始场密度分布的unity是写在compressibleInterFoam求解器中的‘createFields.H’文件中吗?在

        Info<< "Reading thermophysical properties\n" << endl;
    
        volScalarField& p = mixture.p();
        volScalarField& T = mixture.T();
        volScalarField& rho1 = mixture.thermo1().rho();
        const volScalarField& psi1 = mixture.thermo1().psi();
        volScalarField& rho2 = mixture.thermo2().rho();
        const volScalarField& psi2 = mixture.thermo2().psi();
    
        volScalarField rho
        (
            IOobject
            (
                "rho",
                runTime.timeName(),
                mesh,
                IOobject::READ_IF_PRESENT,
                IOobject::AUTO_WRITE
            ),
            alpha1*rho1 + alpha2*rho2
        );
    

    代码中,我只需要把rho1重新定义成随函数变化就行吗?

    边界条件部分,使用codedFixedValue可以按照您的给的例子把T换成密度吗?“0.org”文件夹中就没有rho这个文件呀?



  • @东岳 李老师,compressibleInterFoam求解器该如何设置边界密度随空间变化呢



  • compressibleInterFoam读入rho的方式是READ_IF_PRESENT,也就是说存在rho文件的话,就会被读进去。所以可以在0文件夹下自己添加一个rho,然后用funkySetField 设置你要的初始场。
    至于“如何设置边界密度随空间变化”,compressibleInterFoam是基于压力的求解器,也就是密度由压力决定。所以只要把p_rgh设置对了就可以吧?



  • @Jacobian 您好,谢谢您的回复。在我的算例里面,水和空气的密度可在constant文件夹中的thermalphysicalProperties设置成多项式形式,即随温度变化。我现在遇到的问题是希望能够设置水体(rho1)部分的数值按照一个特定的函数随空间变化,初始时刻满足、入口边界满足即可,我不是很清楚用压力是否合适



  • 抱歉说漏了,rho、rho.water、rho.air这三个文件都要放进0文件夹。funkySetFields是能够使用函数表达式的,用来设置场内分布;边界上的值可以用funkySetBoundaryField来设置。在system下添加funkySetFieldsDict和funkySetBoundaryDict来使用。里面的内容,随便举个例子:

    //funkySetFields
    expressions
     (
        pressureWater
        {
         field p_rgh; //需要设置的物理量
         expression "100000 - 99800*pos().y";  //这行写你要的函数
         condition  "(pos().x <= 5) && (pos().x >= 0)"; //起作用的范围、可以注释掉,不影响使用
         keepPatches 1; //填1就好,要不然可能把边界条件改成zeroGradient
        }
     );
    
    //funkySetBoundaryField
    pressureWater
     {
        field p_rgh;
        expressions
        (
            {
                target value;
                patchName INLET; //选择边界面
                //variables "maxY=max(pts().y);";  //可以注释掉,不影响使用
                expression "100000 - 99800*pos().y"; //这行写你要的函数
            }
             //可以再expression下同时写多个边界的设置
            {
                target value;
                patchName OUTLET;
                //variables "maxY=max(pts().y);";
                expression "100000 - 99800*pos().y";
            }
        );
    }
    

    更多细节参考这里链接文本,以及swak4foam的tutorials
    另外,你的这个算例里面压力也应当要设置,需要和密度相匹配。



  • @Jacobian Not all heroes wear capes, thanks for sharing



  • @Jacobian 谢谢您的帮助。如果我把rho、rho.water、rho.air这三个文件放进0文件夹,此时thermalphysicalProperties设置的密度就没有用了吧



  • @Jacobian 我尝试了您的方法,其实不需要设置rho.water、rho.air。我设置了水的密度随高度按照双曲函数变化,初始时刻以及边界密度是没有问题的。但是运算开始后出现问题,密度分布立即按照thermalphysicalProperties设置变化,也就是说按照目前的方法无法控制密度与其他物理场的联系。实际上我的密度场是可以随着流场变化的,因此我觉得应该添加一个浓度输运方程,然后重新定义热物性,使密度随之变化。


Log in to reply