如何设置运行期自动变化写数据的时间间隔?



  • 请教一下各位,我的问题是:
    在 controlDict 里 的 writeInterval 关键字是用来设置写数据的时间间隔。现在我遇到一个算例,网格量很大,在某个时间段内想要很密集的写数据,然后在 paraview 里分析。但是之前和之后不需要这么密集的写数据。如果一直很密集写数据,磁盘没那么大。根据之前试算的结果,我知道了要加密写数据的时间段区间。有什么办法能够让 writeInterval 在我指定的时间区间内变小,然后 OpenFOAM 加密写数据?



  • 我觉得不用改writeInterval吧,直接搞3个或者多个controlDict.x
    startFrom都改成latestTime,把endTime变成你想要的时间就行了,每个controlDict的间隔自己改
    然后随便写个脚本

    cp /your/case/root/path/system/controlDict.1  ****/controlDict
    xxxFoam
    cp /your/case/root/path/system/controlDict.2  ****/controlDict
    xxxFoam
    

    多的话写个循环就行了


  • 网格教授 OpenFOAM教授 管理员

    是的,可参考楼上,

    另外,可以参考下面的代码

    
    dT 100;
    
    application     icoFoam;
    
    startFrom       startTime;
    
    startTime       0;
    
    stopAt          endTime;
    
    endTime         0.5;
    
    deltaT          0.005;
    
    writeControl    timeStep;
    
    writeInterval   #calc "$T";//你需要写一些数学运算
    
    


  • @sungda 谢谢,这个方法非常好,我现在就准备这么干啦!



  • @李东岳 谢谢,没想到还有这种操作啊,能嵌入数学计算表达式,得好好设计一个表达式。



  • @sungda 今天我还意识到一个问题,我用到了整体运动动网格,当我从新的时刻继续算的时候,fvSolution 字典里的压力参考点 pRefPoint 其实也需要改,因为这个位置变了。OpenFOAM 用的是大地坐标描述运动的计算域。如果运动复杂,这个位置还不好确定呢。



  • @李东岳 还有一个问题请教一下,表达式里可以包含分支 if else 这种结构吗?


  • 网格教授 OpenFOAM教授 管理员

    不可以。

    可以试试这个,codeStreamcalc更强大,类似的:

    startTime 0;
    endTime 100;
    ...
    writeInterval #codeStream
    {
    code
    #{
        scalar start = readScalar(dict.lookup("startTime"));
        scalar end = readScalar(dict.lookup("endTime"));
        label nDumps = 5;
        os << ((end - start)/nDumps);
    #};
    };
    
    


  • 可以参考tut 中的这个caseGithub链接
    controlDict中设置一个functions,就可以在deltaTvalues文件中分段设置timeStep了。

    functions
    {
        timeStepping
        {
            type            setTimeStep;
            functionObjectLibs ("libutilityFunctionObjects.so");
            enabled         yes;
            deltaT          tableFile;
            file            "system/deltaTvalues";
        }
    }
    

    但是经过简单测试,发现设置这个之后,controlDict中的deltaT就失效了,就是说没法只对某段时间加密,必须完整地设置好从startTimeendTime所有的时间步长。另外maxCo也失效了。
    时间有限,可能我的回答也有漏洞,欢迎补充或指出错误。



  • 此外,除了从文件中读取timeStep之外,这里的deltaT还提供以下设置:

    constant
    csvFile
    halfCosineRamp
    linearRamp
    one
    polynomial
    quadraticRamp
    quarterCosineRamp
    quarterSineRamp
    scale
    sine
    square
    table
    tableFile
    uniform
    zero
    


  • 刚刚又发现另一个方法,可能更加适合你的需求:quwan:

    functions
    {
        timeStep
        {
            type coded;
            libs            ("libutilityFunctionObjects.so");
            name setDeltaT;
    
            code
            #{
            #};
    
            codeExecute
            #{
                const Time& runTime = mesh().time();
                if (runTime.timeToUserTime(runTime.value()) >= -15.0)
                {
                    const_cast<Time&>(runTime).setDeltaT
                    (
                        runTime.userTimeToTime(0.025)
                    );
                }
            #};
        }
    }
    

    这个算例来自一个发动机算例Github链接,(发动机中的时间是曲轴转角),所以你可能需要相应修改一下。



  • 额,发现理解错出题人的意思了,尴尬。。。


  • 网格教授 OpenFOAM教授 管理员

    functions
    {
        xxx
        {
            type coded;
            libs ("libutilityFunctionObjects.so");
            name setDeltaT;
    
            code
            #{
            #};
    
            codeExecute
            #{
            #};
        }
    }
    

    controlDict里面类似的这个代码段确实有时候比较好玩 :quwan:

    fvSolution 字典里的压力参考点 pRefPoint 其实也需要改,因为这个位置变了。OpenFOAM 用的是大地坐标描述运动的计算域。

    这个是怎么回事? @千里之行



  • @sungda 按照这位兄台的回答,然后结合题主的问题(续算时参考点变了?)
    还有一个方法:

    functions
    {
        fileUpdate1
        {
            type              timeActivatedFileUpdate;
            libs              ("libutilityFunctionObjects.so");
            writeControl      timeStep;
            writeInterval     1;
            fileToUpdate      "$FOAM_CASE/system/controlDict";
            timeVsFile
            (
                (-1 "$FOAM_CASE/system/controlDict.0")
                (0.10 "$FOAM_CASE/system/controlDict.10")
                (0.20 "$FOAM_CASE/system/controlDict.20")
                (0.35 "$FOAM_CASE/system/controlDict.35")
            );
        }
    }    
    

    这个不需要续算,在运行时就可以更改controlDict文件,在不同时刻设置你需要的 writeInterval 就行了。 @千里之行



  • @浪迹天大 functions好强大:surprised: ,赞一个,不过题主貌似还想要复杂的表达式改其它文件,这个就麻烦到我宁可手动调了。:mihu: