From b0b1d0f8b20fc0d9b6e37f52cbd86ea93f295cff Mon Sep 17 00:00:00 2001 From: Andrew Heather <> Date: Wed, 18 Dec 2024 15:06:11 +0000 Subject: [PATCH] ENH: fieldAverage - allow averaging on internal fields - see #3242 BUG: fieldAverage - handle duplicate entries --- .../field/fieldAverage/fieldAverage.C | 25 ++- .../field/fieldAverage/fieldAverage.H | 16 +- .../fieldAverage/fieldAverageTemplates.C | 205 ++++++++++++------ 3 files changed, 173 insertions(+), 73 deletions(-) diff --git a/src/functionObjects/field/fieldAverage/fieldAverage.C b/src/functionObjects/field/fieldAverage/fieldAverage.C index ab2cf923bc..1c5441f7a8 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverage.C +++ b/src/functionObjects/field/fieldAverage/fieldAverage.C @@ -308,14 +308,31 @@ bool Foam::functionObjects::fieldAverage::read(const dictionary& dict) dict.readIfPresent("restartOnRestart", restartOnRestart_); dict.readIfPresent("restartOnOutput", restartOnOutput_); dict.readIfPresent("periodicRestart", periodicRestart_); - dict.readEntry("fields", faItems_); - for (auto& item : faItems_) + List faItems0; + dict.readEntry("fields", faItems0); + + DynamicList faItems(faItems0.size()); + + wordHashSet names; + for (auto& item : faItems0) { - item.setMeanFieldName(scopedName(item.meanFieldName())); - item.setPrime2MeanFieldName(scopedName(item.prime2MeanFieldName())); + if (names.insert(item.fieldName())) + { + item.setMeanFieldName(scopedName(item.meanFieldName())); + item.setPrime2MeanFieldName(scopedName(item.prime2MeanFieldName())); + faItems.push_back(item); + } + else + { + WarningInFunction + << "Duplicate entry found: " << item.fieldName() + << " (ignored)" << endl; + } } + faItems_.transfer(faItems); + const scalar currentTime = obr().time().value(); if (periodicRestart_) diff --git a/src/functionObjects/field/fieldAverage/fieldAverage.H b/src/functionObjects/field/fieldAverage/fieldAverage.H index 868bed6147..3081085188 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverage.H +++ b/src/functionObjects/field/fieldAverage/fieldAverage.H @@ -233,19 +233,19 @@ protected: //- Add mean average field to database template - void addMeanFieldType(fieldAverageItem& item); + bool addMeanFieldType(fieldAverageItem& item); //- Add mean average field to database template - void addMeanField(fieldAverageItem& item); + bool addMeanField(fieldAverageItem& item); //- Add prime-squared average field to database template - void addPrime2MeanFieldType(fieldAverageItem& item); + bool addPrime2MeanFieldType(fieldAverageItem& item); //- Add prime-squared average field to database template - void addPrime2MeanField(fieldAverageItem& item); + bool addPrime2MeanField(fieldAverageItem& item); // Calculation functions @@ -263,20 +263,20 @@ protected: //- Add mean-squared field value to prime-squared mean field template - void addMeanSqrToPrime2MeanType(const fieldAverageItem& item) const; + bool addMeanSqrToPrime2MeanType(const fieldAverageItem& item) const; //- Add mean-squared field value to prime-squared mean field template void addMeanSqrToPrime2Mean() const; template - void storeWindowFieldType(fieldAverageItem& item); + bool storeWindowFieldType(fieldAverageItem& item); template void storeWindowFields(); template - void restoreWindowFieldsType(const fieldAverageItem& item); + bool restoreWindowFieldsType(const fieldAverageItem& item); template void restoreWindowFields(const fieldAverageItem& item); @@ -288,7 +288,7 @@ protected: //- Write fields template - void writeFieldType(const word& fieldName) const; + bool writeFieldType(const word& fieldName) const; //- Write fields template diff --git a/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C b/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C index 9b612df9a8..770e96f59e 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C +++ b/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C @@ -35,16 +35,16 @@ License // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template -void Foam::functionObjects::fieldAverage::addMeanFieldType +bool Foam::functionObjects::fieldAverage::addMeanFieldType ( fieldAverageItem& item ) { - const word& fieldName = item.fieldName(); + const Type* fieldPtr = findObject(item.fieldName()); - if (!foundObject(fieldName)) + if (!fieldPtr) { - return; + return false; } // Field has been found, so set active flag to true @@ -66,7 +66,7 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType } else { - const Type& baseField = lookupObject(fieldName); + const Type& baseField = *fieldPtr; // Store on registry obr().store @@ -88,38 +88,51 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType 1*baseField ) ); + + return true; } + + return false; } template -void Foam::functionObjects::fieldAverage::addMeanField +bool Foam::functionObjects::fieldAverage::addMeanField ( fieldAverageItem& item ) { typedef GeometricField VolFieldType; + typedef typename VolFieldType::Internal VolFieldInternalType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; + bool added = false; + if (item.mean()) { - addMeanFieldType(item); - addMeanFieldType(item); - addMeanFieldType(item); + added = + ( + addMeanFieldType(item) + || addMeanFieldType(item) + || addMeanFieldType(item) + || addMeanFieldType(item) + ); } + + return added; } template -void Foam::functionObjects::fieldAverage::restoreWindowFieldsType +bool Foam::functionObjects::fieldAverage::restoreWindowFieldsType ( const fieldAverageItem& item ) { if (restartOnOutput_) { - return; + return false; } const word& fieldName = item.fieldName(); @@ -128,7 +141,7 @@ void Foam::functionObjects::fieldAverage::restoreWindowFieldsType if (!fieldPtr) { - return; + return false; } const FIFOStack& fieldNames = item.windowFieldNames(); @@ -160,6 +173,8 @@ void Foam::functionObjects::fieldAverage::restoreWindowFieldsType << endl; } } + + return true; } @@ -170,29 +185,34 @@ void Foam::functionObjects::fieldAverage::restoreWindowFields ) { typedef GeometricField VolFieldType; + typedef typename VolFieldType::Internal VolFieldInternalType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; if (item.window() > 0) { - restoreWindowFieldsType(item); - restoreWindowFieldsType(item); - restoreWindowFieldsType(item); + (void) + ( + restoreWindowFieldsType(item) + || restoreWindowFieldsType(item) + || restoreWindowFieldsType(item) + || restoreWindowFieldsType(item) + ); } } template -void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType +bool Foam::functionObjects::fieldAverage::addPrime2MeanFieldType ( fieldAverageItem& item ) { - const word& fieldName = item.fieldName(); + const auto* baseFieldPtr = findObject(item.fieldName()); - if (!foundObject(fieldName)) + if (!baseFieldPtr) { - return; + return false; } const word& meanFieldName = item.meanFieldName(); @@ -212,7 +232,7 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType } else { - const Type1& baseField = lookupObject(fieldName); + const auto& baseField = *baseFieldPtr; const Type1& meanField = lookupObject(meanFieldName); // Store on registry @@ -233,24 +253,32 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType sqr(baseField) - sqr(meanField) ) ); + + return true; } + + return false; } template -void Foam::functionObjects::fieldAverage::addPrime2MeanField +bool Foam::functionObjects::fieldAverage::addPrime2MeanField ( fieldAverageItem& item ) { typedef GeometricField VolFieldType1; + typedef typename VolFieldType1::Internal VolFieldInternalType1; typedef GeometricField SurfaceFieldType1; typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; + typedef typename VolFieldType2::Internal VolFieldInternalType2; typedef GeometricField SurfaceFieldType2; typedef DimensionedField SurfFieldType2; + bool added = false; + if (item.prime2Mean()) { if (!item.mean()) @@ -261,26 +289,34 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanField << item.fieldName() << nl << exit(FatalError); } - addPrime2MeanFieldType(item); - addPrime2MeanFieldType(item); - addPrime2MeanFieldType(item); + added = + addPrime2MeanFieldType(item) + || addPrime2MeanFieldType + ( + item + ) + || addPrime2MeanFieldType(item) + || addPrime2MeanFieldType(item); } + + return added; } template -void Foam::functionObjects::fieldAverage::storeWindowFieldType +bool Foam::functionObjects::fieldAverage::storeWindowFieldType ( fieldAverageItem& item ) { - const word& fieldName = item.fieldName(); - if (!foundObject(fieldName)) + const auto* fPtr = findObject(item.fieldName()); + + if (!fPtr) { - return; + return false; } - const Type& baseField = lookupObject(fieldName); + const Type& baseField = *fPtr; const word windowFieldName = item.windowFieldName(this->name()); @@ -306,6 +342,8 @@ void Foam::functionObjects::fieldAverage::storeWindowFieldType DebugInfo << "Create and store: " << windowFieldName << endl; item.addToWindow(windowFieldName, obr().time().deltaTValue()); + + return true; } @@ -313,6 +351,7 @@ template void Foam::functionObjects::fieldAverage::storeWindowFields() { typedef GeometricField VolFieldType; + typedef typename VolFieldType::Internal VolFieldInternalType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; @@ -320,9 +359,13 @@ void Foam::functionObjects::fieldAverage::storeWindowFields() { if (item.storeWindowFields()) { - storeWindowFieldType(item); - storeWindowFieldType(item); - storeWindowFieldType(item); + (void) + ( + storeWindowFieldType(item) + || storeWindowFieldType(item) + || storeWindowFieldType(item) + || storeWindowFieldType(item) + ); } } } @@ -332,14 +375,21 @@ template void Foam::functionObjects::fieldAverage::calculateMeanFields() const { typedef GeometricField VolFieldType; + typedef typename VolFieldType::Internal VolFieldInternalType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; + const auto& obr = this->obr(); + for (const fieldAverageItem& item : faItems_) { - item.calculateMeanField(obr()); - item.calculateMeanField(obr()); - item.calculateMeanField(obr()); + (void) + ( + item.calculateMeanField(obr) + || item.calculateMeanField(obr) + || item.calculateMeanField(obr) + || item.calculateMeanField(obr) + ); } } @@ -348,36 +398,41 @@ template void Foam::functionObjects::fieldAverage::calculatePrime2MeanFields() const { typedef GeometricField VolFieldType1; + typedef typename VolFieldType1::Internal VolFieldInternalType1; typedef GeometricField SurfaceFieldType1; typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; + typedef typename VolFieldType2::Internal VolFieldInternalType2; typedef GeometricField SurfaceFieldType2; typedef DimensionedField SurfFieldType2; + const auto& obr = this->obr(); + for (const fieldAverageItem& item : faItems_) { - item.calculatePrime2MeanField(obr()); - item.calculatePrime2MeanField + (void) ( - obr() + item.calculatePrime2MeanField(obr) + || item.calculatePrime2MeanField + (obr) + || item.calculatePrime2MeanField + (obr) + || item.calculatePrime2MeanField(obr) ); - item.calculatePrime2MeanField(obr()); } } template -void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType +bool Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType ( const fieldAverageItem& item ) const { - const word& fieldName = item.fieldName(); - - if (!foundObject(fieldName)) + if (!foundObject(item.fieldName())) { - return; + return false; } const Type1& meanField = lookupObject(item.meanFieldName()); @@ -385,6 +440,8 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType Type2& prime2MeanField = lookupObjectRef(item.prime2MeanFieldName()); prime2MeanField += sqr(meanField); + + return true; } @@ -392,10 +449,12 @@ template void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const { typedef GeometricField VolFieldType1; + typedef typename VolFieldType1::Internal VolFieldInternalType1; typedef GeometricField SurfaceFieldType1; typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; + typedef typename VolFieldType2::Internal VolFieldInternalType2; typedef GeometricField SurfaceFieldType2; typedef DimensionedField SurfFieldType2; @@ -403,28 +462,36 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const { if (item.prime2Mean()) { - addMeanSqrToPrime2MeanType(item); - addMeanSqrToPrime2MeanType + (void) ( - item + addMeanSqrToPrime2MeanType(item) + || addMeanSqrToPrime2MeanType + (item) + || addMeanSqrToPrime2MeanType + (item) + || addMeanSqrToPrime2MeanType + (item) ); - addMeanSqrToPrime2MeanType(item); } } } template -void Foam::functionObjects::fieldAverage::writeFieldType +bool Foam::functionObjects::fieldAverage::writeFieldType ( const word& fieldName ) const { - if (foundObject(fieldName)) + const auto* fPtr = findObject(fieldName); + + if (fPtr) { - const Type& f = lookupObject(fieldName); - f.write(); + DebugInfo<< "writing " << Type::typeName << ": " << fieldName << endl; + return fPtr->write(); } + + return false; } @@ -432,6 +499,7 @@ template void Foam::functionObjects::fieldAverage::writeFields() const { typedef GeometricField VolFieldType; + typedef typename VolFieldType::Internal VolFieldInternalType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; @@ -440,17 +508,27 @@ void Foam::functionObjects::fieldAverage::writeFields() const if (item.mean()) { const word& fieldName = item.meanFieldName(); - writeFieldType(fieldName); - writeFieldType(fieldName); - writeFieldType(fieldName); + + (void) + ( + writeFieldType(fieldName) + || writeFieldType(fieldName) + || writeFieldType(fieldName) + || writeFieldType(fieldName) + ); } if (item.prime2Mean()) { const word& fieldName = item.prime2MeanFieldName(); - writeFieldType(fieldName); - writeFieldType(fieldName); - writeFieldType(fieldName); + + (void) + ( + writeFieldType(fieldName) + || writeFieldType(fieldName) + || writeFieldType(fieldName) + || writeFieldType(fieldName) + ); } if (item.writeWindowFields()) @@ -459,9 +537,14 @@ void Foam::functionObjects::fieldAverage::writeFields() const forAllConstIters(fieldNames, fieldNameIter) { const word& fieldName = fieldNameIter(); - writeFieldType(fieldName); - writeFieldType(fieldName); - writeFieldType(fieldName); + + (void) + ( + writeFieldType(fieldName) + || writeFieldType(fieldName) + || writeFieldType(fieldName) + || writeFieldType(fieldName) + ); } } }