From 451cc4e620a1f1c41ab0e32710b167c67b18f779 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Sat, 30 Jan 2016 11:23:38 +0000 Subject: [PATCH] fieldAverage: Added periodicRestart option and rationalized naming of restart options When restarting form a previous calculation, the averaging is continuous or may be restarted using the \c restartOnRestart option. The averaging process may be restarted after each calculation output time using the \c restartOnOutput option or restarted periodically using the \c periodicRestart option and setting \c restartPeriod to the required averaging period. Example of function object specification: \verbatim fieldAverage1 { type fieldAverage; functionObjectLibs ("libfieldFunctionObjects.so"); ... restartOnRestart false; restartOnOutput false; periodicRestart false; restartPeriod 0.002; fields ( U { mean on; prime2Mean on; base time; window 10.0; windowName w1; } p { mean on; prime2Mean on; base time; } ); } \endverbatim \heading Function object usage \table Property | Description | Required | Default value type | type name: fieldAverage | yes | restartOnRestart | Restart the averaging on restart | no | no restartOnOutput | Restart the averaging on output | no | no periodicRestart | Periodically restart the averaging | no | no restartPeriod | Periodic restart period | conditional | fields | list of fields and averaging options | yes | \endtable --- .../fieldAverage/fieldAverage/fieldAverage.C | 61 +++++++++++++------ .../fieldAverage/fieldAverage/fieldAverage.H | 51 ++++++++++------ .../fieldAverage/fieldAverageTemplates.C | 6 +- .../freeSpacePeriodic/system/controlDict | 1 - .../freeSpaceStream/system/controlDict | 2 +- .../supersonicCorner/system/controlDict | 1 - .../dsmcFoam/wedge15Ma5/system/controlDict | 1 - 7 files changed, 79 insertions(+), 44 deletions(-) diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C index 33dc39b951..f37bee4003 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -104,6 +104,21 @@ void Foam::fieldAverage::initialize() } +void Foam::fieldAverage::restart() +{ + Info<< " Restarting averaging at time " << obr_.time().timeName() + << nl << endl; + + totalIter_.clear(); + totalIter_.setSize(faItems_.size(), 1); + + totalTime_.clear(); + totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue()); + + initialize(); +} + + void Foam::fieldAverage::calcAverages() { if (!initialised_) @@ -111,8 +126,8 @@ void Foam::fieldAverage::calcAverages() initialize(); } - const label currentTimeIndex = - static_cast(obr_).time().timeIndex(); + const label currentTimeIndex = obr_.time().timeIndex(); + const scalar currentTime = obr_.time().value(); if (prevTimeIndex_ == currentTimeIndex) { @@ -123,6 +138,12 @@ void Foam::fieldAverage::calcAverages() prevTimeIndex_ = currentTimeIndex; } + if (periodicRestart_ && currentTime > restartPeriod_*periodIndex_) + { + restart(); + periodIndex_++; + } + Info<< type() << " " << name_ << " output:" << nl; Info<< " Calculating averages" << nl; @@ -195,7 +216,7 @@ void Foam::fieldAverage::readAveragingProperties() totalTime_.clear(); totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue()); - if (resetOnRestart_ || resetOnOutput_) + if (restartOnRestart_ || restartOnOutput_) { Info<< " Starting averaging at time " << obr_.time().timeName() << nl; @@ -255,12 +276,15 @@ Foam::fieldAverage::fieldAverage obr_(obr), active_(true), prevTimeIndex_(-1), - resetOnRestart_(false), - resetOnOutput_(false), + restartOnRestart_(false), + restartOnOutput_(false), + periodicRestart_(false), + restartPeriod_(GREAT), initialised_(false), faItems_(), totalIter_(), - totalTime_() + totalTime_(), + periodIndex_(1) { // Only active if a fvMesh is available if (isA(obr_)) @@ -293,10 +317,16 @@ void Foam::fieldAverage::read(const dictionary& dict) Info<< type() << " " << name_ << ":" << nl; - dict.readIfPresent("resetOnRestart", resetOnRestart_); - dict.readIfPresent("resetOnOutput", resetOnOutput_); + dict.readIfPresent("restartOnRestart", restartOnRestart_); + dict.readIfPresent("restartOnOutput", restartOnOutput_); + dict.readIfPresent("periodicRestart", periodicRestart_); dict.lookup("fields") >> faItems_; + if (periodicRestart_) + { + dict.lookup("restartPeriod") >> restartPeriod_; + } + readAveragingProperties(); Info<< endl; @@ -335,18 +365,9 @@ void Foam::fieldAverage::write() writeAverages(); writeAveragingProperties(); - if (resetOnOutput_) + if (restartOnOutput_) { - Info<< " Restarting averaging at time " << obr_.time().timeName() - << nl << endl; - - totalIter_.clear(); - totalIter_.setSize(faItems_.size(), 1); - - totalTime_.clear(); - totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue()); - - initialize(); + restart(); } Info<< endl; diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H index 01b2558010..0b47ee3b06 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -54,12 +54,13 @@ Description time are written on a per-field basis to the \c fieldAveragingProperties dictionary, located in \/uniform - When restarting form a previous calculation, the averaging is continuous. - However, the averaging process can be restarted using the \c resetOnRestart - option. + When restarting form a previous calculation, the averaging is continuous or + may be restarted using the \c restartOnRestart option. - To restart the averaging process after each calculation output time, use - the \c resetOnOutput option. + The averaging process may be restarted after each calculation output time + using the \c restartOnOutput option or restarted periodically using the \c + periodicRestart option and setting \c restartPeriod to the required + averaging period. Example of function object specification: \verbatim @@ -68,8 +69,10 @@ Description type fieldAverage; functionObjectLibs ("libfieldFunctionObjects.so"); ... - resetOnRestart true; - resetOnOutput false; + restartOnRestart true; + restartOnOutput false; + periodicRestart false; + restartPeriod 0.002; fields ( U @@ -92,11 +95,13 @@ Description \heading Function object usage \table - Property | Description | Required | Default value - type | type name: fieldAverage | yes | - resetOnRestart | flag to reset the averaging on restart | yes | - resetOnOutput| flag to reset the averaging on output | yes | - fields | list of fields and averaging options | yes | + Property | Description | Required | Default value + type | type name: fieldAverage | yes | + restartOnRestart | Restart the averaging on restart | no | no + restartOnOutput | Restart the averaging on output | no | no + periodicRestart | Periodically restart the averaging | no | no + restartPeriod | Periodic restart period | conditional | + fields | list of fields and averaging options | yes | \endtable @@ -156,11 +161,17 @@ protected: //- Time at last call, prevents repeated averaging label prevTimeIndex_; - //- Reset the averaging process on restart flag - Switch resetOnRestart_; + //- Restart the averaging process on restart + Switch restartOnRestart_; - //- Reset the averaging process on output flag - Switch resetOnOutput_; + //- Restart the averaging process on output + Switch restartOnOutput_; + + //- Periodically restart the averaging process + Switch periodicRestart_; + + //- Restart period + scalar restartPeriod_; //- Initialised flag bool initialised_; @@ -177,6 +188,9 @@ protected: //- Total time counter List totalTime_; + //- Index for periodic restart + label periodIndex_; + // Private Member Functions @@ -190,6 +204,9 @@ protected: // Check requested field averages are valid, populate field lists void initialize(); + //- Restart averaging for restartOnOutput + void restart(); + //- Add mean average field to database template void addMeanFieldType(const label fieldI); diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C index f4660ec82b..6078b95b72 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -66,7 +66,7 @@ void Foam::fieldAverage::addMeanFieldType(const label fieldI) meanFieldName, obr_.time().timeName(obr_.time().startTime().value()), obr_, - resetOnOutput_ + restartOnOutput_ ? IOobject::NO_READ : IOobject::READ_IF_PRESENT, IOobject::NO_WRITE @@ -136,7 +136,7 @@ void Foam::fieldAverage::addPrime2MeanFieldType(const label fieldI) prime2MeanFieldName, obr_.time().timeName(obr_.time().startTime().value()), obr_, - resetOnOutput_ + restartOnOutput_ ? IOobject::NO_READ : IOobject::READ_IF_PRESENT, IOobject::NO_WRITE diff --git a/tutorials/discreteMethods/dsmcFoam/freeSpacePeriodic/system/controlDict b/tutorials/discreteMethods/dsmcFoam/freeSpacePeriodic/system/controlDict index 28634ee885..9023648489 100644 --- a/tutorials/discreteMethods/dsmcFoam/freeSpacePeriodic/system/controlDict +++ b/tutorials/discreteMethods/dsmcFoam/freeSpacePeriodic/system/controlDict @@ -54,7 +54,6 @@ functions type fieldAverage; functionObjectLibs ( "libfieldFunctionObjects.so" ); outputControl outputTime; - resetOnOutput off; fields ( diff --git a/tutorials/discreteMethods/dsmcFoam/freeSpaceStream/system/controlDict b/tutorials/discreteMethods/dsmcFoam/freeSpaceStream/system/controlDict index 2f17c188c0..5a086c27b0 100644 --- a/tutorials/discreteMethods/dsmcFoam/freeSpaceStream/system/controlDict +++ b/tutorials/discreteMethods/dsmcFoam/freeSpaceStream/system/controlDict @@ -54,7 +54,7 @@ functions type fieldAverage; functionObjectLibs ( "libfieldFunctionObjects.so" ); outputControl outputTime; - resetOnOutput off; + restartOnOutput off; fields ( diff --git a/tutorials/discreteMethods/dsmcFoam/supersonicCorner/system/controlDict b/tutorials/discreteMethods/dsmcFoam/supersonicCorner/system/controlDict index 8045c73096..8f2320499b 100644 --- a/tutorials/discreteMethods/dsmcFoam/supersonicCorner/system/controlDict +++ b/tutorials/discreteMethods/dsmcFoam/supersonicCorner/system/controlDict @@ -54,7 +54,6 @@ functions type fieldAverage; functionObjectLibs ( "libfieldFunctionObjects.so" ); outputControl outputTime; - resetOnOutput off; fields ( diff --git a/tutorials/discreteMethods/dsmcFoam/wedge15Ma5/system/controlDict b/tutorials/discreteMethods/dsmcFoam/wedge15Ma5/system/controlDict index 7215ec7182..8fa72c1dde 100644 --- a/tutorials/discreteMethods/dsmcFoam/wedge15Ma5/system/controlDict +++ b/tutorials/discreteMethods/dsmcFoam/wedge15Ma5/system/controlDict @@ -54,7 +54,6 @@ functions type fieldAverage; functionObjectLibs ( "libfieldFunctionObjects.so" ); outputControl outputTime; - resetOnOutput off; fields (