如何设置运行期自动变化写数据的时间间隔?
-
可以参考
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
也失效了。
时间有限,可能我的回答也有漏洞,欢迎补充或指出错误。 -
刚刚又发现另一个方法,可能更加适合你的需求
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链接,(发动机中的时间是曲轴转角),所以你可能需要相应修改一下。
-
@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。