diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C index 9af80cfe85639717df67abd41fe2274106b71b12..b9c4023401a4fbcb744cacc684fc6e567aef531d 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C @@ -46,26 +46,45 @@ const Foam::word Foam::fieldAverage::EXT_PRIME2MEAN = "Prime2Mean"; // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // +void Foam::fieldAverage::checkoutFields(const wordList& fieldNames) const +{ + forAll(fieldNames, i) + { + if (fieldNames[i] != word::null) + { + obr_.checkOut(*obr_[fieldNames[i]]); + } + } +} + + void Foam::fieldAverage::resetLists(const label nItems) { + 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); + checkoutFields(meanTensorFields_); meanTensorFields_.clear(); meanTensorFields_.setSize(nItems); + checkoutFields(prime2MeanScalarFields_); prime2MeanScalarFields_.clear(); prime2MeanScalarFields_.setSize(nItems); + checkoutFields(prime2MeanSymmTensorFields_); prime2MeanSymmTensorFields_.clear(); prime2MeanSymmTensorFields_.setSize(nItems); @@ -128,7 +147,7 @@ void Foam::fieldAverage::initialise() if (obr_.foundObject<volScalarField>(fieldName)) { - addPrime2MeanField<scalar> + addPrime2MeanField<scalar, scalar> ( i, meanScalarFields_, @@ -137,7 +156,7 @@ void Foam::fieldAverage::initialise() } else if (obr_.foundObject<volVectorField>(fieldName)) { - addPrime2MeanField<vector> + addPrime2MeanField<vector, symmTensor> ( i, meanVectorFields_, @@ -188,12 +207,12 @@ Foam::fieldAverage::fieldAverage active_ = false; WarningIn ( - "fieldAverage::fieldAverage" - "(" - "const word&," - "const objectRegistry&," - "const dictionary&," - "const bool" + "fieldAverage::fieldAverage\n" + "(\n" + "const word&,\n" + "const objectRegistry&,\n" + "const dictionary&,\n" + "const bool\n" ")" ) << "No fvMesh available, deactivating." << nl << endl; @@ -255,12 +274,12 @@ void Foam::fieldAverage::calcAverages() totalTime_[i] += obr_.time().deltaT().value(); } - addMeanSqrToPrime2Mean<scalar> + addMeanSqrToPrime2Mean<scalar, scalar> ( meanScalarFields_, prime2MeanScalarFields_ ); - addMeanSqrToPrime2Mean<vector> + addMeanSqrToPrime2Mean<vector, symmTensor> ( meanVectorFields_, prime2MeanSymmTensorFields_ @@ -272,12 +291,12 @@ void Foam::fieldAverage::calcAverages() calculateMeanFields<symmTensor>(meanSymmTensorFields_); calculateMeanFields<tensor>(meanTensorFields_); - calculatePrime2MeanFields<scalar> + calculatePrime2MeanFields<scalar, scalar> ( meanScalarFields_, prime2MeanScalarFields_ ); - calculatePrime2MeanFields<vector> + calculatePrime2MeanFields<vector, symmTensor> ( meanVectorFields_, prime2MeanSymmTensorFields_ @@ -316,7 +335,7 @@ void Foam::fieldAverage::writeAveragingProperties() const forAll(faItems_, i) { - const word fieldName = faItems_[i].fieldName(); + const word& fieldName = faItems_[i].fieldName(); propsDict.add(fieldName, dictionary()); propsDict.subDict(fieldName).add("totalIter", totalIter_[i]); propsDict.subDict(fieldName).add("totalTime", totalTime_[i]); diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H index f7ee571e48be3a4d6c8dcceb09b3a862c9b49319..2cb245b14d0c387c9f1cbbf14bd13f50f079c646 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H @@ -121,7 +121,7 @@ protected: //- Clean restart flag Switch cleanRestart_; - //- List of field average items, describing waht averages to be + //- List of field average items, describing what averages to be // calculated and output List<fieldAverageItem> faItems_; @@ -137,15 +137,15 @@ protected: // Lists of averages // Arithmetic mean fields - PtrList<volScalarField> meanScalarFields_; - PtrList<volVectorField> meanVectorFields_; - PtrList<volSphericalTensorField> meanSphericalTensorFields_; - PtrList<volSymmTensorField> meanSymmTensorFields_; - PtrList<volTensorField> meanTensorFields_; + wordList meanScalarFields_; + wordList meanVectorFields_; + wordList meanSphericalTensorFields_; + wordList meanSymmTensorFields_; + wordList meanTensorFields_; // Prime-squared fields - applicable to volVectorFields only - PtrList<volScalarField> prime2MeanScalarFields_; - PtrList<volSymmTensorField> prime2MeanSymmTensorFields_; + wordList prime2MeanScalarFields_; + wordList prime2MeanSymmTensorFields_; // Counters @@ -161,6 +161,9 @@ 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); @@ -170,20 +173,16 @@ protected: //- Add mean average field to PtrList template<class Type> - void addMeanField - ( - const label, - PtrList<GeometricField<Type, fvPatchField, volMesh> >& - ); + void addMeanField(const label, wordList&) const; //- Add prime-squared average field to PtrList template<class Type1, class Type2> void addPrime2MeanField ( const label, - PtrList<GeometricField<Type1, fvPatchField, volMesh> >&, - PtrList<GeometricField<Type2, fvPatchField, volMesh> >& - ); + const wordList&, + wordList& + ) const; // Calculation functions @@ -193,26 +192,23 @@ protected: //- Calculate mean average fields template<class Type> - void calculateMeanFields - ( - PtrList<GeometricField<Type, fvPatchField, volMesh> >& - ); + void calculateMeanFields(const wordList&) const; //- Add mean-squared field value to prime-squared mean field template<class Type1, class Type2> void addMeanSqrToPrime2Mean ( - PtrList<GeometricField<Type1, fvPatchField, volMesh> >&, - PtrList<GeometricField<Type2, fvPatchField, volMesh> >& - ); + const wordList&, + const wordList& + ) const; //- Calculate prime-squared average fields template<class Type1, class Type2> void calculatePrime2MeanFields ( - PtrList<GeometricField<Type1, fvPatchField, volMesh> >&, - PtrList<GeometricField<Type2, fvPatchField, volMesh> >& - ); + const wordList&, + const wordList& + ) const; // I-O @@ -222,11 +218,7 @@ protected: //- Write fields template<class Type> - void writeFieldList - ( - const PtrList<GeometricField<Type, fvPatchField, volMesh> >& - fieldList - ) const; + void writeFieldList(const wordList&) const; //- Write averaging properties - steps and time void writeAveragingProperties() const; diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C index 8bba661723f3f3b92921b62739dfb11f8cafc36a..c6e57835a726bc85d4c37f1e0a13fda554137932 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C @@ -34,22 +34,36 @@ template<class Type> void Foam::fieldAverage::addMeanField ( const label fieldi, - PtrList<GeometricField<Type, fvPatchField, volMesh> >& meanFieldList -) + wordList& meanFieldList +) const { if (faItems_[fieldi].mean()) { typedef GeometricField<Type, fvPatchField, volMesh> fieldType; const word& fieldName = faItems_[fieldi].fieldName(); - const fieldType& baseField = obr_.lookupObject<fieldType>(fieldName); const word meanFieldName = fieldName + EXT_MEAN; + Info<< "Reading/calculating field " << meanFieldName << nl << endl; - meanFieldList.set - ( - fieldi, - new fieldType + + if (obr_.foundObject<fieldType>(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; + } + else + { + const fieldType& baseField = + obr_.lookupObject<fieldType>(fieldName); + + fieldType* fPtr = new fieldType ( IOobject ( @@ -57,12 +71,16 @@ void Foam::fieldAverage::addMeanField obr_.time().timeName(), obr_, IOobject::READ_IF_PRESENT, - IOobject::NO_WRITE, - false + IOobject::NO_WRITE ), baseField - ) - ); + ); + + // Store on registry + fPtr->store(); + + meanFieldList[fieldi] = meanFieldName; + } } } @@ -71,25 +89,39 @@ template<class Type1, class Type2> void Foam::fieldAverage::addPrime2MeanField ( const label fieldi, - PtrList<GeometricField<Type1, fvPatchField, volMesh> >& meanFieldList, - PtrList<GeometricField<Type2, fvPatchField, volMesh> >& prime2MeanFieldList -) + const wordList& meanFieldList, + wordList& prime2MeanFieldList +) const { - if (faItems_[fieldi].mean() && meanFieldList.set(fieldi)) + if (faItems_[fieldi].mean() && meanFieldList[fieldi] != word::null) { typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1; typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2; const word& fieldName = faItems_[fieldi].fieldName(); - const fieldType1& baseField = obr_.lookupObject<fieldType1>(fieldName); - const fieldType1& meanField = meanFieldList[fieldi]; const word meanFieldName = fieldName + EXT_PRIME2MEAN; Info<< "Reading/calculating field " << meanFieldName << nl << endl; - prime2MeanFieldList.set - ( - fieldi, - new fieldType2 + + if (obr_.foundObject<fieldType2>(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; + } + else + { + const fieldType1& baseField = + obr_.lookupObject<fieldType1>(fieldName); + const fieldType1& meanField = + obr_.lookupObject<fieldType1>(meanFieldList[fieldi]); + + fieldType2* fPtr = new fieldType2 ( IOobject ( @@ -97,21 +129,23 @@ void Foam::fieldAverage::addPrime2MeanField obr_.time().timeName(), obr_, IOobject::READ_IF_PRESENT, - IOobject::NO_WRITE, - false + IOobject::NO_WRITE ), sqr(baseField) - sqr(meanField) - ) - ); + ); + + // Store on registry + fPtr->store(); + + prime2MeanFieldList[fieldi] = meanFieldName; + } } } template<class Type> -void Foam::fieldAverage::calculateMeanFields -( - PtrList<GeometricField<Type, fvPatchField, volMesh> >& meanFieldList -) +void Foam::fieldAverage::calculateMeanFields(const wordList& meanFieldList) +const { typedef GeometricField<Type, fvPatchField, volMesh> fieldType; @@ -119,12 +153,15 @@ void Foam::fieldAverage::calculateMeanFields forAll(faItems_, i) { - if (faItems_[i].mean() && meanFieldList.set(i)) + if (faItems_[i].mean() && meanFieldList[i] != word::null) { const word& fieldName = faItems_[i].fieldName(); const fieldType& baseField = obr_.lookupObject<fieldType>(fieldName); - fieldType& meanField = meanFieldList[i]; + fieldType& meanField = const_cast<fieldType&> + ( + obr_.lookupObject<fieldType>(meanFieldList[i]) + ); scalar alpha = 0.0; scalar beta = 0.0; @@ -148,9 +185,9 @@ void Foam::fieldAverage::calculateMeanFields template<class Type1, class Type2> void Foam::fieldAverage::calculatePrime2MeanFields ( - PtrList<GeometricField<Type1, fvPatchField, volMesh> >& meanFieldList, - PtrList<GeometricField<Type2, fvPatchField, volMesh> >& prime2MeanFieldList -) + const wordList& meanFieldList, + const wordList& prime2MeanFieldList +) const { typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1; typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2; @@ -162,15 +199,19 @@ void Foam::fieldAverage::calculatePrime2MeanFields if ( faItems_[i].prime2Mean() - && meanFieldList.set(i) - && prime2MeanFieldList.set(i) + && meanFieldList[i] != word::null + && prime2MeanFieldList[i] != word::null ) { const word& fieldName = faItems_[i].fieldName(); const fieldType1& baseField = obr_.lookupObject<fieldType1>(fieldName); - const fieldType1& meanField = meanFieldList[i]; - fieldType2& prime2MeanField = prime2MeanFieldList[i]; + const fieldType1& meanField = + obr_.lookupObject<fieldType1>(meanFieldList[i]); + fieldType2& prime2MeanField = const_cast<fieldType2&> + ( + obr_.lookupObject<fieldType2>(prime2MeanFieldList[i]) + ); scalar alpha = 0.0; scalar beta = 0.0; @@ -197,9 +238,9 @@ void Foam::fieldAverage::calculatePrime2MeanFields template<class Type1, class Type2> void Foam::fieldAverage::addMeanSqrToPrime2Mean ( - PtrList<GeometricField<Type1, fvPatchField, volMesh> >& meanFieldList, - PtrList<GeometricField<Type2, fvPatchField, volMesh> >& prime2MeanFieldList -) + const wordList& meanFieldList, + const wordList& prime2MeanFieldList +) const { typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1; typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2; @@ -209,12 +250,16 @@ void Foam::fieldAverage::addMeanSqrToPrime2Mean if ( faItems_[i].prime2Mean() - && meanFieldList.set(i) - && prime2MeanFieldList.set(i) + && meanFieldList[i] != word::null + && prime2MeanFieldList[i] != word::null ) { - const fieldType1& meanField = meanFieldList[i]; - fieldType2& prime2MeanField = prime2MeanFieldList[i]; + const fieldType1& meanField = + obr_.lookupObject<fieldType1>(meanFieldList[i]); + fieldType2& prime2MeanField = const_cast<fieldType2&> + ( + obr_.lookupObject<fieldType2>(prime2MeanFieldList[i]) + ); prime2MeanField += sqr(meanField); } @@ -223,16 +268,16 @@ void Foam::fieldAverage::addMeanSqrToPrime2Mean template<class Type> -void Foam::fieldAverage::writeFieldList -( - const PtrList<GeometricField<Type, fvPatchField, volMesh> >& fieldList -) const +void Foam::fieldAverage::writeFieldList(const wordList& fieldList) const { + typedef GeometricField<Type, fvPatchField, volMesh> fieldType; + forAll(fieldList, i) { - if (fieldList.set(i)) + if (fieldList[i] != word::null) { - fieldList[i].write(); + const fieldType& f = obr_.lookupObject<fieldType>(fieldList[i]); + f.write(); } } }