/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2011-2017 OpenFOAM Foundation ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . \*---------------------------------------------------------------------------*/ #include "fieldAverageItem.H" #include "volFields.H" #include "surfaceFields.H" #include "polySurfaceFields.H" #include "OFstream.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template void Foam::functionObjects::fieldAverage::addMeanFieldType ( fieldAverageItem& item ) { const word& fieldName = item.fieldName(); if (!foundObject(fieldName)) { return; } // Field has been found, so set active flag to true item.active() = true; const word& meanFieldName = item.meanFieldName(); Log << " Reading/initialising field " << meanFieldName << endl; if (foundObject(meanFieldName)) {} else if (obr().found(meanFieldName)) { Log << " Cannot allocate average field " << meanFieldName << " since an object with that name already exists." << " Disabling averaging for field." << endl; item.mean() = false; } else { const Type& baseField = lookupObject(fieldName); // Store on registry obr().store ( new Type ( IOobject ( meanFieldName, obr().time().timeName(obr().time().startTime().value()), obr(), ( restartOnOutput_ ? IOobject::NO_READ : IOobject::READ_IF_PRESENT ), IOobject::NO_WRITE ), 1*baseField ) ); } } template void Foam::functionObjects::fieldAverage::addMeanField ( fieldAverageItem& item ) { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; if (item.mean()) { addMeanFieldType(item); addMeanFieldType(item); addMeanFieldType(item); } } template void Foam::functionObjects::fieldAverage::restoreWindowFieldsType ( const fieldAverageItem& item ) { if (restartOnOutput_) { return; } const word& fieldName = item.fieldName(); const Type* fieldPtr = findObject(fieldName); if (!fieldPtr) { return; } const FIFOStack& fieldNames = item.windowFieldNames(); forAllConstIters(fieldNames, fieldIter) { const word& name = fieldIter(); IOobject io ( name, obr().time().timeName(obr().time().startTime().value()), obr(), IOobject::MUST_READ, IOobject::NO_WRITE ); if (io.typeHeaderOk(true)) { DebugInfo << "Read and store: " << name << endl; obr().store(new Type(io, fieldPtr->mesh())); } else { WarningInFunction << "Unable to read window " << Type::typeName << " " << name << ". Averaging restart behaviour may be compromised" << endl; } } } template void Foam::functionObjects::fieldAverage::restoreWindowFields ( const fieldAverageItem& item ) { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; if (item.window() > 0) { restoreWindowFieldsType(item); restoreWindowFieldsType(item); restoreWindowFieldsType(item); } } template void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType ( fieldAverageItem& item ) { const word& fieldName = item.fieldName(); if (!foundObject(fieldName)) { return; } const word& meanFieldName = item.meanFieldName(); const word& prime2MeanFieldName = item.prime2MeanFieldName(); Log << " Reading/initialising field " << prime2MeanFieldName << nl; if (foundObject(prime2MeanFieldName)) {} else if (obr().found(prime2MeanFieldName)) { Log << " Cannot allocate average field " << prime2MeanFieldName << " since an object with that name already exists." << " Disabling averaging for field." << endl; item.prime2Mean() = false; } else { const Type1& baseField = lookupObject(fieldName); const Type1& meanField = lookupObject(meanFieldName); // Store on registry obr().store ( new Type2 ( IOobject ( prime2MeanFieldName, obr().time().timeName(obr().time().startTime().value()), obr(), restartOnOutput_? IOobject::NO_READ : IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), sqr(baseField) - sqr(meanField) ) ); } } template void Foam::functionObjects::fieldAverage::addPrime2MeanField ( fieldAverageItem& item ) { typedef GeometricField VolFieldType1; typedef GeometricField SurfaceFieldType1; typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; typedef GeometricField SurfaceFieldType2; typedef DimensionedField SurfFieldType2; if (item.prime2Mean()) { if (!item.mean()) { FatalErrorInFunction << "To calculate the prime-squared average, the " << "mean average must also be selected for field " << item.fieldName() << nl << exit(FatalError); } addPrime2MeanFieldType(item); addPrime2MeanFieldType(item); addPrime2MeanFieldType(item); } } template void Foam::functionObjects::fieldAverage::storeWindowFieldType ( fieldAverageItem& item ) { const word& fieldName = item.fieldName(); if (!foundObject(fieldName)) { return; } const Type& baseField = lookupObject(fieldName); const word windowFieldName = item.windowFieldName(this->name()); // Store on registry obr().store ( new Type ( IOobject ( windowFieldName, obr().time().timeName(obr().time().startTime().value()), obr(), restartOnOutput_ ? IOobject::NO_READ : IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), 1*baseField ) ); DebugInfo << "Create and store: " << windowFieldName << endl; item.addToWindow(windowFieldName, obr().time().deltaTValue()); } template void Foam::functionObjects::fieldAverage::storeWindowFields() { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; for (fieldAverageItem& item : faItems_) { if (item.storeWindowFields()) { storeWindowFieldType(item); storeWindowFieldType(item); storeWindowFieldType(item); } } } template void Foam::functionObjects::fieldAverage::calculateMeanFields() const { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; for (const fieldAverageItem& item : faItems_) { item.calculateMeanField(obr()); item.calculateMeanField(obr()); item.calculateMeanField(obr()); } } template void Foam::functionObjects::fieldAverage::calculatePrime2MeanFields() const { typedef GeometricField VolFieldType1; typedef GeometricField SurfaceFieldType1; typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; typedef GeometricField SurfaceFieldType2; typedef DimensionedField SurfFieldType2; for (const fieldAverageItem& item : faItems_) { item.calculatePrime2MeanField(obr()); item.calculatePrime2MeanField ( obr() ); item.calculatePrime2MeanField(obr()); } } template void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType ( const fieldAverageItem& item ) const { const word& fieldName = item.fieldName(); if (!foundObject(fieldName)) { return; } const Type1& meanField = lookupObject(item.meanFieldName()); Type2& prime2MeanField = lookupObjectRef(item.prime2MeanFieldName()); prime2MeanField += sqr(meanField); } template void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const { typedef GeometricField VolFieldType1; typedef GeometricField SurfaceFieldType1; typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; typedef GeometricField SurfaceFieldType2; typedef DimensionedField SurfFieldType2; for (const fieldAverageItem& item : faItems_) { if (item.prime2Mean()) { addMeanSqrToPrime2MeanType(item); addMeanSqrToPrime2MeanType ( item ); addMeanSqrToPrime2MeanType(item); } } } template void Foam::functionObjects::fieldAverage::writeFieldType ( const word& fieldName ) const { if (foundObject(fieldName)) { const Type& f = lookupObject(fieldName); f.write(); } } template void Foam::functionObjects::fieldAverage::writeFields() const { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; typedef DimensionedField SurfFieldType; for (const fieldAverageItem& item : faItems_) { if (item.mean()) { const word& fieldName = item.meanFieldName(); writeFieldType(fieldName); writeFieldType(fieldName); writeFieldType(fieldName); } if (item.prime2Mean()) { const word& fieldName = item.prime2MeanFieldName(); writeFieldType(fieldName); writeFieldType(fieldName); writeFieldType(fieldName); } if (item.writeWindowFields()) { FIFOStack fieldNames = item.windowFieldNames(); forAllConstIters(fieldNames, fieldNameIter) { const word& fieldName = fieldNameIter(); writeFieldType(fieldName); writeFieldType(fieldName); writeFieldType(fieldName); } } } } // ************************************************************************* //