如何重新读取已有的时间步里的场
-
在一个自定义solver里,需要在特定的时间步时,重新读取当前时间步文件夹里的场(可以是速度场或者压力场),我使用了:
volScalarField p ( IOobject ( "p", runTime.timeName(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ), mesh );
但实际上MUST_READ_IF_MODIFIED是不起作用的,直接在solver里写“p.read()” 也是不管用的,值并没有发生变化,还是一开始初始时间步从time文件中读取的值。在CFDonline上我看到了解释:
https://www.cfd-online.com/Forums/openfoam-programming-development/122189-runtime-modification-volscalarfield.html
和IOobject有关系。但是不知道大家有没有更简单的办法。谢谢 -
@李东岳 李老师,controlDict读取的也是latestTime (比如是t1), 然后他读取了t1时间步的场,比如一个force source term ‘f’。现在我在solver里想定义,每运行ndeltaT的时间步时,从新的(t1+ndeltaT)time文件中读取新的 ‘f’场, ‘f’场的值事先准备好了,放在(t1+ndeltaT,t1+2ndeltaT,t1+3n*deltaT,.......)里面。问题是,读了t1时间步的场后,后面的怎么都读不进去,仍然保持t1时候的值不变,不管是设置了“MUST_READ_IF_MODIFIED”,或者强制‘f.read()’。
volScalarField f ( IOobject ( "f", runTime.timeName(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ), mesh );
-
@coolhhh 嗯嗯,刚刚试了,不行。这样子的话,p的值就为0了,再read()一下还是0,读不进来。
我在想,能不能借鉴从constant/transportProperties中读取nu的方法:dimensionedScalar nu ( "nu", dimViscosity, transportProperties.lookup("nu") );
这样子是可以实时更新的。但是不知道如何在runTime.timeName()中lookup场的值,这个代码怎么写还没搞明白,一直报错。
这样写是报错的:p = dimensionedScalar("p", p.dimensions(), runTime.timeName().lookup("p")); log文件: interPhaseChangeFoam_justPp.C:120:72: error: ‘class Foam::word’ has no member named ‘lookup’ p = dimensionedScalar("p", p.dimensions(), runTime.timeName().lookup("p")