如何设置运行期自动变化写数据的时间间隔?
-
请教一下各位,我的问题是:
在 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
多的话写个循环就行了
-
不可以。
可以试试这个,
codeStream
比calc
更强大,类似的: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
中的这个case
: Github链接
在controlDict
中设置一个functions
,就可以在deltaTvalues
文件中分段设置timeStep
了。functions { timeStepping { type setTimeStep; functionObjectLibs ("libutilityFunctionObjects.so"); enabled yes; deltaT tableFile; file "system/deltaTvalues"; } } 但是经过简单测试,发现设置这个之后,
controlDict
中的deltaT
就失效了,就是说没法只对某段时间加密,必须完整地设置好从startTime
到endTime
所有的时间步长。另外maxCo
也失效了。
时间有限,可能我的回答也有漏洞,欢迎补充或指出错误。 -
此外,除了从文件中读取
timeStep
之外,这里的deltaT
还提供以下设置:constant csvFile halfCosineRamp linearRamp one polynomial quadraticRamp quarterCosineRamp quarterSineRamp scale sine square table tableFile uniform zero -
刚刚又发现另一个方法,可能更加适合你的需求
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链接,(发动机中的时间是曲轴转角),所以你可能需要相应修改一下。
-
额,发现理解错出题人的意思了,尴尬。。。
-
functions { xxx { type coded; libs ("libutilityFunctionObjects.so"); name setDeltaT; code #{ #}; codeExecute #{ #}; } }
controlDict
里面类似的这个代码段确实有时候比较好玩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 就行了。 @千里之行
-
@浪迹天大 老师您好,按照这个方法,我需要更改controlDict中的maxDeltaT。但是会发现文件更新不起作用。
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v2012 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // application interFlowVb1; startFrom latestTime; startTime 0; stopAt endTime; endTime 0.3; deltaT 0.00005; writeControl adjustableRunTime; writeInterval 0.05; purgeWrite 0; writeFormat binary; writePrecision 8; writeCompression off; timeFormat general; timePrecision 8; runTimeModifiable yes; adjustTimeStep yes; maxCo 0.5; maxAlphaCo 0.5; maxCapillaryNum 10; // stability criteria is 1 maxDeltaT 2e-5;//controlDict.a; // maxDeltaT 1e-5;//controlDict.b; // maxDeltaT 5e-6;//controlDict.c; functions { fileUpdate1 { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); writeControl timeStep; writeInterval 1; fileToUpdate "$FOAM_CASE/system/controlDict"; timeVsFile ( (-1 "$FOAM_CASE/system/controlDict.a") (1e-4 "$FOAM_CASE/system/controlDict.b") (2e-4 "$FOAM_CASE/system/controlDict.c") ); } }
三个文件只有maxDeltaT有差别,请老师捞捞@李东岳 @浪迹天大
运行后结果提示:
timeActivatedFileUpdate: copying file "~/orifice3Da/system/controlDict.c" to: "~/orifice3Da/system/controlDict" Courant Number mean: 2.0171174e-08 max: 0.3369988 Interface Courant Number mean: 2.978204e-10 max: 0.22052861 Capillary Number: 2.4526254 deltaT = 2e-05 Time = 0.00022
文件有更新,并且maxDeltaT也更新为了1e-5; 但是它没有发挥作用,可以看到文件更新后的deltaT 依然是 2e-05,如果是我自己运行过程中手动改小maxDeltaT,它会马上从deltaT = 2e-05,便为deltaT = 1e-05。
10/16