想在程序中调用UMean这个值,应该如何实现?



  • 在做湍流模型相关的工作,需要在程序中实现调用“时间平均的速度”--UMean,这个应该如何实现呢?
    虽然在计算过程中会输出UMean这个值,但是不知应该如何调用这个值?还是需要重新写程序,自己计算UMean的值呢?


  • 管理员

    你用的是哪个求解器?



  • @李东岳 基于channelFoam修改的channelRotate,计算旋转槽道流的求解器,用的是piso算法。
    版本比较低,用的是OpenFOAM2.3.0.


  • 管理员

    2.3.x里面没看到channelFoam,2.1.x里面没看到输出UMean: https://github.com/OpenFOAM/OpenFOAM-2.1.x/blob/master/applications/solvers/incompressible/channelFoam/channelFoam.C

    把你的log输出用代码的形式输出一下?

    虽然在计算过程中会输出UMean这个值,但是不知应该如何调用这个值?

    如果程序本身会输出UMean,应该是在程序内部定义了volVectorField的一个场,你直接用就可以了不用自己计算。



  • @东岳 我没有说清楚,程序本身不会输出UMean的值,只是在controlDict中设定平均速度U,会在结果文件中保存UMean,但是求解器本身应该没有计算UMean值。
    所以要调用UMean就有点麻烦了?



  • 同有这个问题:crying: 困扰了好几天了都.

    大家好,我最近在计算一个翼型空化流动算例,用的是interphaseChangeFoam求解器,用fieldAverage函数计算得出了一个时均速度场 UMean 文件,可是当我试图用singleGraph工具提取一条线上的Umean, 却发现会出现以下错误?是不是因为 interPhaseChangeFoam中没有定义UMean场?如果是这样的话,那该怎样才能对UMean这个场进行操作呢:crying:

    这是我用singleGraph时输入的命令:
    0_1522660194850_c77c9248-6e48-4f41-9fbc-aa1467e95e75-图片.png

    这是错误提示:
    0_1522660270552_a097207b-8472-47ac-9226-c333fc248ea7-图片.png


  • 管理员

    @lllwonderliquid

    你这个直接用postProcess,然后在singleGraph里面设置读取已经输出的UMean

    @benqing
    你的意思是在你运行的程序中,调用UMean



  • @东岳 是在湍流模型中调用UMean的这个值,这个估计是要自己写程序,但是不知从何下手,没有直接编写程序的经验



  • @东岳 东岳前辈,现在这个问题还未解决,我想实现在湍流模型中实现UMean的计算,类似于UMean=UMean+U这种形式,但是我不知如何在程序中实现。



  • @benqing 请问您解决了吗?我最近也在进行这个工作,如果解决了,可不可以说一下方法?


  • 管理员

    OpenFOAM里面有后处理程序可以提取mean值,核心的代码如下:

    template<class Type>
    void Foam::functionObjects::fieldAverage::calculateMeanFieldType
    (
        const label fieldi
    ) const
    {
        const word& fieldName = faItems_[fieldi].fieldName();
    
        if (obr_.foundObject<Type>(fieldName))
        {
            const Type& baseField = obr_.lookupObject<Type>(fieldName);
    
            Type& meanField =
                obr_.lookupObjectRef<Type>(faItems_[fieldi].meanFieldName());
    
            scalar dt = obr_.time().deltaTValue();
            scalar Dt = totalTime_[fieldi];
    
            if (faItems_[fieldi].iterBase())
            {
                dt = 1;
                Dt = scalar(totalIter_[fieldi]);
            }
    
            scalar beta = dt/Dt;
    
            if (faItems_[fieldi].window() > 0)
            {
                const scalar w = faItems_[fieldi].window();
    
                if (Dt - dt >= w)
                {
                    beta = dt/w;
                }
            }
    
            meanField = (1 - beta)*meanField + beta*baseField;
        }
    }
    

    其位于fieldAverageTemplates.C中.因此你需要把上面的代码转移到solver里面,类似:

    1. 创立一个UMean场;
    2. 在代码里面进行下面的计算:
      UMean = (1 - deltaT/currentT)*UMean + deltaT/currentT*U;
      


  • @zhengshu930 解决了,不过我是在修改湍流模型的时候添加的,你是想在哪里添加吗?



  • @东岳 谢谢老师 的回答,受益匪浅



  • @benqing 我想要直接使用umean进行其他计算,所以需要提取出来,如果复杂的话,可不可以把你邮箱给我,想看一下具体代码,372660640@qq.com,这是我的邮箱



  • @zhengshu930 我是在湍流模型里实现的,以kepsilon模型为例的话,在C文件中存在correct函数,这个是一个每一步都会调用的函数,因此我直接在这里面添加了一下代码

     j_=j_+1.0;   
     Ui_=Ui_+U();  
     umean_=Ui_/j_;
    

    其中j是一个累加的过程,返回当前迭代步数;Ui是j个时间步前面的速度的总和,初值为0,U()是每个时间步计算的值,umean就是j个时间步的平均速度



  • @benqing 谢谢,等我研究研究,不懂的再向您请教。


Log in to reply
 


CFD中文网 | 东岳流体学术 | 东岳流体商业 | 吉ICP备20003622号-1