diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C index b3ca4f6d4df0a0466fd0bb560deffa6708e855d8..8f047d1d41f03bd38589fe3360cc87bf6e9f41ec 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C @@ -26,19 +26,13 @@ License #include "fieldAverage.H" #include "volFields.H" -#include "dictionary.H" #include "Time.H" -#include "IFstream.H" -#include "OFstream.H" #include "fieldAverageItem.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // -namespace Foam -{ - defineTypeNameAndDebug(fieldAverage, 0); -} +defineTypeNameAndDebug(Foam::fieldAverage, 0); const Foam::word Foam::fieldAverage::EXT_MEAN = "Mean"; const Foam::word Foam::fieldAverage::EXT_PRIME2MEAN = "Prime2Mean"; @@ -46,100 +40,81 @@ const Foam::word Foam::fieldAverage::EXT_PRIME2MEAN = "Prime2Mean"; // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::fieldAverage::checkoutFields(const wordList& fieldNames) const +void Foam::fieldAverage::resetFields(wordList& names) { - forAll(fieldNames, i) + forAll(names, fieldI) { - if (fieldNames[i] != word::null) + if (names[fieldI].size()) { - obr_.checkOut(*obr_[fieldNames[i]]); + obr_.checkOut(*obr_[names[fieldI]]); } } + + names.clear(); + names.setSize(faItems_.size()); } -void Foam::fieldAverage::resetLists(const label nItems) +void Foam::fieldAverage::initialize() { - checkoutFields(meanScalarFields_); - meanScalarFields_.clear(); - meanScalarFields_.setSize(nItems); - - checkoutFields(meanVectorFields_); - meanVectorFields_.clear(); - meanVectorFields_.setSize(nItems); - - checkoutFields(meanSphericalTensorFields_); - meanSphericalTensorFields_.clear(); - meanSphericalTensorFields_.setSize(nItems); - - checkoutFields(meanSymmTensorFields_); - meanSymmTensorFields_.clear(); - meanSymmTensorFields_.setSize(nItems); + resetFields(meanScalarFields_); + resetFields(meanVectorFields_); + resetFields(meanSphericalTensorFields_); + resetFields(meanSymmTensorFields_); + resetFields(meanTensorFields_); - checkoutFields(meanTensorFields_); - meanTensorFields_.clear(); - meanTensorFields_.setSize(nItems); - - checkoutFields(prime2MeanScalarFields_); - prime2MeanScalarFields_.clear(); - prime2MeanScalarFields_.setSize(nItems); - - checkoutFields(prime2MeanSymmTensorFields_); - prime2MeanSymmTensorFields_.clear(); - prime2MeanSymmTensorFields_.setSize(nItems); + resetFields(prime2MeanScalarFields_); + resetFields(prime2MeanSymmTensorFields_); totalIter_.clear(); - totalIter_.setSize(nItems, 1); + totalIter_.setSize(faItems_.size(), 1); totalTime_.clear(); - totalTime_.setSize(nItems, obr_.time().deltaT().value()); -} + totalTime_.setSize(faItems_.size(), obr_.time().deltaT().value()); -void Foam::fieldAverage::initialise() -{ // Add mean fields to the field lists - forAll(faItems_, i) + forAll(faItems_, fieldI) { - const word& fieldName = faItems_[i].fieldName(); + const word& fieldName = faItems_[fieldI].fieldName(); if (obr_.foundObject<volScalarField>(fieldName)) { - addMeanField<scalar>(i, meanScalarFields_); + addMeanField<scalar>(fieldI, meanScalarFields_); } else if (obr_.foundObject<volVectorField>(fieldName)) { - addMeanField<vector>(i, meanVectorFields_); + addMeanField<vector>(fieldI, meanVectorFields_); } else if (obr_.foundObject<volSphericalTensorField>(fieldName)) { - addMeanField<sphericalTensor>(i, meanSphericalTensorFields_); + addMeanField<sphericalTensor>(fieldI, meanSphericalTensorFields_); } else if (obr_.foundObject<volSymmTensorField>(fieldName)) { - addMeanField<symmTensor>(i, meanSymmTensorFields_); + addMeanField<symmTensor>(fieldI, meanSymmTensorFields_); } else if (obr_.foundObject<volTensorField>(fieldName)) { - addMeanField<tensor>(i, meanTensorFields_); + addMeanField<tensor>(fieldI, meanTensorFields_); } else { - FatalErrorIn("Foam::fieldAverage::initialise()") - << "Requested field " << faItems_[i].fieldName() + FatalErrorIn("Foam::fieldAverage::initialize()") + << "Requested field " << faItems_[fieldI].fieldName() << " does not exist in the database" << nl << exit(FatalError); } } // Add prime-squared mean fields to the field lists - forAll(faItems_, i) + forAll(faItems_, fieldI) { - if (faItems_[i].prime2Mean()) + if (faItems_[fieldI].prime2Mean()) { - const word& fieldName = faItems_[i].fieldName(); - if (!faItems_[i].mean()) + const word& fieldName = faItems_[fieldI].fieldName(); + if (!faItems_[fieldI].mean()) { - FatalErrorIn("Foam::fieldAverage::initialise()") + FatalErrorIn("Foam::fieldAverage::initialize()") << "To calculate the prime-squared average, the " << "mean average must also be selected for field " << fieldName << nl << exit(FatalError); @@ -149,7 +124,7 @@ void Foam::fieldAverage::initialise() { addPrime2MeanField<scalar, scalar> ( - i, + fieldI, meanScalarFields_, prime2MeanScalarFields_ ); @@ -158,14 +133,14 @@ void Foam::fieldAverage::initialise() { addPrime2MeanField<vector, symmTensor> ( - i, + fieldI, meanVectorFields_, prime2MeanSymmTensorFields_ ); } else { - FatalErrorIn("Foam::fieldAverage::initialise()") + FatalErrorIn("Foam::fieldAverage::initialize()") << "prime2Mean average can only be applied to " << "volScalarFields and volVectorFields" << nl << " Field: " << fieldName << nl @@ -176,111 +151,26 @@ void Foam::fieldAverage::initialise() } -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -Foam::fieldAverage::fieldAverage -( - const word& name, - const objectRegistry& obr, - const dictionary& dict, - const bool loadFromFiles -) -: - name_(name), - obr_(obr), - active_(true), - cleanRestart_(dict.lookupOrDefault<Switch>("cleanRestart", false)), - faItems_(dict.lookup("fields")), - meanScalarFields_(faItems_.size()), - meanVectorFields_(faItems_.size()), - meanSphericalTensorFields_(faItems_.size()), - meanSymmTensorFields_(faItems_.size()), - meanTensorFields_(faItems_.size()), - prime2MeanScalarFields_(faItems_.size()), - prime2MeanSymmTensorFields_(faItems_.size()), - totalIter_(faItems_.size(), 1), - totalTime_(faItems_.size(), obr_.time().deltaT().value()) -{ - // Check if the available mesh is an fvMesh otherise deactivate - if (!isA<fvMesh>(obr_)) - { - active_ = false; - WarningIn - ( - "fieldAverage::fieldAverage\n" - "(\n" - "const word&,\n" - "const objectRegistry&,\n" - "const dictionary&,\n" - "const bool\n" - ")" - ) << "No fvMesh available, deactivating." - << nl << endl; - } - - read(dict); -} - - -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -Foam::fieldAverage::~fieldAverage() -{} - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -void Foam::fieldAverage::read(const dictionary& dict) -{ - if (active_) - { - faItems_.clear(); - faItems_ = List<fieldAverageItem>(dict.lookup("fields")); - - resetLists(faItems_.size()); - - initialise(); - - readAveragingProperties(); - } -} - - -void Foam::fieldAverage::execute() +void Foam::fieldAverage::calcAverages() { - if (active_) - { - calcAverages(); - } -} - + const label currentTimeIndex = + static_cast<const fvMesh&>(obr_).time().timeIndex(); -void Foam::fieldAverage::end() -{ - if (active_) + if (prevTimeIndex_ == currentTimeIndex) { - calcAverages(); + return; } -} - - -void Foam::fieldAverage::write() -{ - if (active_) + else { - writeAverages(); - writeAveragingProperties(); + prevTimeIndex_ = currentTimeIndex; } -} -void Foam::fieldAverage::calcAverages() -{ Info<< "Calculating averages" << nl << endl; - forAll(faItems_, i) + forAll(faItems_, fieldI) { - totalIter_[i]++; - totalTime_[i] += obr_.time().deltaT().value(); + totalIter_[fieldI]++; + totalTime_[fieldI] += obr_.time().deltaT().value(); } addMeanSqrToPrime2Mean<scalar, scalar> @@ -342,12 +232,12 @@ void Foam::fieldAverage::writeAveragingProperties() const ) ); - forAll(faItems_, i) + forAll(faItems_, fieldI) { - const word& fieldName = faItems_[i].fieldName(); + const word& fieldName = faItems_[fieldI].fieldName(); propsDict.add(fieldName, dictionary()); - propsDict.subDict(fieldName).add("totalIter", totalIter_[i]); - propsDict.subDict(fieldName).add("totalTime", totalTime_[i]); + propsDict.subDict(fieldName).add("totalIter", totalIter_[fieldI]); + propsDict.subDict(fieldName).add("totalTime", totalTime_[fieldI]); } propsDict.regIOobject::write(); @@ -363,34 +253,39 @@ void Foam::fieldAverage::readAveragingProperties() } else { - IFstream propsFile + IOobject propsDictHeader ( - obr_.time().path()/obr_.time().timeName() - /"uniform"/"fieldAveragingProperties" + "fieldAveragingProperties", + obr_.time().timeName(), + "uniform", + obr_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false ); - if (!propsFile.good()) + if (!propsDictHeader.headerOk()) { Info<< "fieldAverage: starting averaging at time " << obr_.time().timeName() << nl << endl; return; } - dictionary propsDict(dictionary::null, propsFile); + IOdictionary propsDict(propsDictHeader); Info<< "fieldAverage: restarting averaging for fields:" << endl; - forAll(faItems_, i) + forAll(faItems_, fieldI) { - const word& fieldName = faItems_[i].fieldName(); + const word& fieldName = faItems_[fieldI].fieldName(); if (propsDict.found(fieldName)) { dictionary fieldDict(propsDict.subDict(fieldName)); - totalIter_[i] = readLabel(fieldDict.lookup("totalIter")); - totalTime_[i] = readScalar(fieldDict.lookup("totalTime")); + totalIter_[fieldI] = readLabel(fieldDict.lookup("totalIter")); + totalTime_[fieldI] = readScalar(fieldDict.lookup("totalTime")); Info<< " " << fieldName - << " iters = " << totalIter_[i] - << " time = " << totalTime_[i] << endl; + << " iters = " << totalIter_[fieldI] + << " time = " << totalTime_[fieldI] << endl; } } Info<< endl; @@ -398,6 +293,104 @@ void Foam::fieldAverage::readAveragingProperties() } +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fieldAverage::fieldAverage +( + const word& name, + const objectRegistry& obr, + const dictionary& dict, + const bool loadFromFiles +) +: + name_(name), + obr_(obr), + active_(true), + prevTimeIndex_(-1), + cleanRestart_(false), + faItems_(), + meanScalarFields_(), + meanVectorFields_(), + meanSphericalTensorFields_(), + meanSymmTensorFields_(), + meanTensorFields_(), + prime2MeanScalarFields_(), + prime2MeanSymmTensorFields_(), + totalIter_(), + totalTime_() +{ + // Only active if a fvMesh is available + if (isA<fvMesh>(obr_)) + { + read(dict); + } + else + { + active_ = false; + WarningIn + ( + "fieldAverage::fieldAverage\n" + "(\n" + "const word&,\n" + "const objectRegistry&,\n" + "const dictionary&,\n" + "const bool\n" + ")" + ) << "No fvMesh available, deactivating." + << nl << endl; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::fieldAverage::~fieldAverage() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::fieldAverage::read(const dictionary& dict) +{ + if (active_) + { + dict.readIfPresent("cleanRestart", cleanRestart_); + dict.lookup("fields") >> faItems_; + + initialize(); + readAveragingProperties(); + + // ensure first averaging works unconditionally + prevTimeIndex_ = -1; + } +} + + +void Foam::fieldAverage::execute() +{ + if (active_) + { + calcAverages(); + } +} + + +void Foam::fieldAverage::end() +{ +} + + +void Foam::fieldAverage::write() +{ + if (active_) + { + calcAverages(); + writeAverages(); + writeAveragingProperties(); + } +} + + void Foam::fieldAverage::updateMesh(const mapPolyMesh&) { // Do nothing diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H index 435bb2746db274f4555bdfd39bb3c40908cf53eb..bffb23b2e0b0f34ae52ca292f3bd672442692bda 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H @@ -107,6 +107,14 @@ class fieldAverage { protected: + // File and field name extensions + + //- Mean average + static const word EXT_MEAN; + + //- Prime-squared average + static const word EXT_PRIME2MEAN; + // Private data //- Name of this set of field averages. @@ -118,6 +126,9 @@ protected: //- On/off switch bool active_; + //- Time at last call, prevents repeated averaging + label prevTimeIndex_; + //- Clean restart flag Switch cleanRestart_; @@ -125,15 +136,6 @@ protected: // calculated and output List<fieldAverageItem> faItems_; - // File and field name extensions - - //- Mean average - static const word EXT_MEAN; - - //- Prime-squared average - static const word EXT_PRIME2MEAN; - - // Lists of averages // Arithmetic mean fields @@ -143,7 +145,8 @@ protected: wordList meanSymmTensorFields_; wordList meanTensorFields_; - // Prime-squared fields - applicable to volVectorFields only + // Prime-squared fields + // Only applicable to volScalarFields / volVectorFields wordList prime2MeanScalarFields_; wordList prime2MeanSymmTensorFields_; @@ -162,20 +165,18 @@ protected: // Initialisation routines //- Checkout fields (causes deletion) from the database - void checkoutFields(const wordList&) const; - - //- Reset size of lists (clear existing values) - void resetLists(const label nItems); + // and reset lists + void resetFields(wordList&); - //- Intitialise averaging. Check requested field averages are - // valid, and populate field lists - void initialise(); + //- Reset lists (clear existing values) and initialize averaging. + // Check requested field averages are valid, populate field lists + void initialize(); - //- Add mean average field to PtrList + //- Add mean average field to list template<class Type> void addMeanField(const label, wordList&) const; - //- Add prime-squared average field to PtrList + //- Add prime-squared average field to list template<class Type1, class Type2> void addPrime2MeanField ( @@ -211,7 +212,7 @@ protected: ) const; - // I-O + // IO //- Write averages virtual void writeAverages() const; @@ -281,7 +282,7 @@ public: //- Execute the averaging virtual void execute(); - //- Execute the averaging at the final time-loop + //- Execute the averaging at the final time-loop, currently does nothing virtual void end(); //- Calculate the field average data and write diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C index c6e57835a726bc85d4c37f1e0a13fda554137932..a69dce41b7d613e1d2032e0ed393d57fcfec9545 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C @@ -33,15 +33,15 @@ License template<class Type> void Foam::fieldAverage::addMeanField ( - const label fieldi, + const label fieldI, wordList& meanFieldList ) const { - if (faItems_[fieldi].mean()) + if (faItems_[fieldI].mean()) { typedef GeometricField<Type, fvPatchField, volMesh> fieldType; - const word& fieldName = faItems_[fieldi].fieldName(); + const word& fieldName = faItems_[fieldI].fieldName(); const word meanFieldName = fieldName + EXT_MEAN; @@ -49,14 +49,14 @@ void Foam::fieldAverage::addMeanField if (obr_.foundObject<fieldType>(meanFieldName)) { - meanFieldList[fieldi] = meanFieldName; + meanFieldList[fieldI] = meanFieldName; } else if (obr_.found(meanFieldName)) { Info<< "Cannot allocate average field " << meanFieldName << " since an object with that name already exists." << " Disabling averaging." << nl << endl; - meanFieldList[fieldi] = word::null; + meanFieldList[fieldI] = word::null; } else { @@ -79,7 +79,7 @@ void Foam::fieldAverage::addMeanField // Store on registry fPtr->store(); - meanFieldList[fieldi] = meanFieldName; + meanFieldList[fieldI] = meanFieldName; } } } @@ -88,38 +88,38 @@ void Foam::fieldAverage::addMeanField template<class Type1, class Type2> void Foam::fieldAverage::addPrime2MeanField ( - const label fieldi, + const label fieldI, const wordList& meanFieldList, wordList& prime2MeanFieldList ) const { - if (faItems_[fieldi].mean() && meanFieldList[fieldi] != word::null) + if (faItems_[fieldI].mean() && meanFieldList[fieldI].size()) { typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1; typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2; - const word& fieldName = faItems_[fieldi].fieldName(); + const word& fieldName = faItems_[fieldI].fieldName(); const word meanFieldName = fieldName + EXT_PRIME2MEAN; Info<< "Reading/calculating field " << meanFieldName << nl << endl; if (obr_.foundObject<fieldType2>(meanFieldName)) { - prime2MeanFieldList[fieldi] = meanFieldName; + prime2MeanFieldList[fieldI] = meanFieldName; } else if (obr_.found(meanFieldName)) { Info<< "Cannot allocate average field " << meanFieldName << " since an object with that name already exists." << " Disabling averaging." << nl << endl; - prime2MeanFieldList[fieldi] = word::null; + prime2MeanFieldList[fieldI] = word::null; } else { const fieldType1& baseField = obr_.lookupObject<fieldType1>(fieldName); const fieldType1& meanField = - obr_.lookupObject<fieldType1>(meanFieldList[fieldi]); + obr_.lookupObject<fieldType1>(meanFieldList[fieldI]); fieldType2* fPtr = new fieldType2 ( @@ -137,7 +137,7 @@ void Foam::fieldAverage::addPrime2MeanField // Store on registry fPtr->store(); - prime2MeanFieldList[fieldi] = meanFieldName; + prime2MeanFieldList[fieldI] = meanFieldName; } } } @@ -153,7 +153,7 @@ const forAll(faItems_, i) { - if (faItems_[i].mean() && meanFieldList[i] != word::null) + if (faItems_[i].mean() && meanFieldList[i].size()) { const word& fieldName = faItems_[i].fieldName(); const fieldType& baseField = @@ -199,8 +199,8 @@ void Foam::fieldAverage::calculatePrime2MeanFields if ( faItems_[i].prime2Mean() - && meanFieldList[i] != word::null - && prime2MeanFieldList[i] != word::null + && meanFieldList[i].size() + && prime2MeanFieldList[i].size() ) { const word& fieldName = faItems_[i].fieldName(); @@ -250,8 +250,8 @@ void Foam::fieldAverage::addMeanSqrToPrime2Mean if ( faItems_[i].prime2Mean() - && meanFieldList[i] != word::null - && prime2MeanFieldList[i] != word::null + && meanFieldList[i].size() + && prime2MeanFieldList[i].size() ) { const fieldType1& meanField = @@ -274,7 +274,7 @@ void Foam::fieldAverage::writeFieldList(const wordList& fieldList) const forAll(fieldList, i) { - if (fieldList[i] != word::null) + if (fieldList[i].size()) { const fieldType& f = obr_.lookupObject<fieldType>(fieldList[i]); f.write();