From c836a017e67b503b490875ccbedf29eb34210132 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Mon, 31 Oct 2016 08:26:06 +0100 Subject: [PATCH] ENH: allow specific restart time for field averaging (issue #282) - Can currently have a periodic restart, but for simulations with a known run-up, it can be useful to have a specific time to restart the averaging. - Note that the restartTime acts as a 'single-shot'. If the restartTime is already in the past when a simulation is started, it is ignored. If, during a simulation, the restartTime is crossed, it will be triggered and then set itself to be ignored in the future. --- .../field/fieldAverage/fieldAverage.C | 34 ++++++++++++++++++- .../field/fieldAverage/fieldAverage.H | 6 +++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/functionObjects/field/fieldAverage/fieldAverage.C b/src/functionObjects/field/fieldAverage/fieldAverage.C index cf076159c4..d7cd691bf2 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverage.C +++ b/src/functionObjects/field/fieldAverage/fieldAverage.C @@ -141,12 +141,24 @@ void Foam::functionObjects::fieldAverage::calcAverages() prevTimeIndex_ = currentTimeIndex; } + bool doRestart = false; if (periodicRestart_ && currentTime > restartPeriod_*periodIndex_) { - restart(); + doRestart = true; periodIndex_++; } + if (currentTime >= restartTime_) + { + doRestart = true; // Restart is overdue. + restartTime_ = GREAT; // Avoid triggering again + } + + if (doRestart) + { + restart(); + } + Log << type() << " " << name() << " write:" << nl << " Calculating averages" << nl; @@ -262,6 +274,7 @@ Foam::functionObjects::fieldAverage::fieldAverage restartOnOutput_(false), periodicRestart_(false), restartPeriod_(GREAT), + restartTime_(GREAT), initialised_(false), faItems_(), totalIter_(), @@ -296,6 +309,25 @@ bool Foam::functionObjects::fieldAverage::read(const dictionary& dict) if (periodicRestart_) { dict.lookup("restartPeriod") >> restartPeriod_; + Log + << " Restart period " << restartPeriod_ + << nl << endl; + } + + restartTime_ = GREAT; + if (dict.readIfPresent("restartTime", restartTime_)) + { + if (restartTime_ < obr_.time().value()) + { + // The restart time is already in the past - ignore + restartTime_ = GREAT; + } + else + { + Log + << " Restart scheduled at time " << restartTime_ + << nl << endl; + } } readAveragingProperties(); diff --git a/src/functionObjects/field/fieldAverage/fieldAverage.H b/src/functionObjects/field/fieldAverage/fieldAverage.H index 0fd49c9bd6..31a4763bfa 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverage.H +++ b/src/functionObjects/field/fieldAverage/fieldAverage.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -106,6 +106,7 @@ Usage restartOnOutput | Restart the averaging on output | no | no periodicRestart | Periodically restart the averaging | no | no restartPeriod | Periodic restart period | conditional | + restartTime | One-shot reset of the averaging | no | great fields | list of fields and averaging options | yes | \endtable @@ -166,6 +167,9 @@ protected: //- Restart period scalar restartPeriod_; + //- Specific restart time + scalar restartTime_; + //- Initialised flag bool initialised_;