From 001a2e4a37f97799dab3733db7e34c26cdfab943 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 15 Dec 2016 09:32:53 +0100 Subject: [PATCH] ENH: add surfField support to various field function objects - fieldAverage - mag - magSqr - readFields - fieldsExpression (add, subtract) --- .../field/fieldAverage/fieldAverage.C | 24 ++-- .../field/fieldAverage/fieldAverage.H | 6 +- .../fieldAverage/fieldAverageTemplates.C | 111 +++++++++++------- .../fieldsExpressionTemplates.C | 12 +- src/functionObjects/field/mag/mag.H | 1 + src/functionObjects/field/mag/magTemplates.C | 12 +- src/functionObjects/field/magSqr/magSqr.H | 3 +- .../field/magSqr/magSqrTemplates.C | 12 +- .../field/readFields/readFieldsTemplates.C | 25 ++++ 9 files changed, 144 insertions(+), 62 deletions(-) diff --git a/src/functionObjects/field/fieldAverage/fieldAverage.C b/src/functionObjects/field/fieldAverage/fieldAverage.C index 12ffdcd9a5..ad1ce8d969 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverage.C +++ b/src/functionObjects/field/fieldAverage/fieldAverage.C @@ -48,17 +48,17 @@ void Foam::functionObjects::fieldAverage::resetFields() { if (faItems_[i].mean()) { - if (obr_.found(faItems_[i].meanFieldName())) + if (obr().found(faItems_[i].meanFieldName())) { - obr_.checkOut(*obr_[faItems_[i].meanFieldName()]); + obr().checkOut(*obr()[faItems_[i].meanFieldName()]); } } if (faItems_[i].prime2Mean()) { - if (obr_.found(faItems_[i].prime2MeanFieldName())) + if (obr().found(faItems_[i].prime2MeanFieldName())) { - obr_.checkOut(*obr_[faItems_[i].prime2MeanFieldName()]); + obr().checkOut(*obr()[faItems_[i].prime2MeanFieldName()]); } } } @@ -108,14 +108,14 @@ void Foam::functionObjects::fieldAverage::initialize() void Foam::functionObjects::fieldAverage::restart() { - Log << " Restarting averaging at time " << obr_.time().timeName() + Log << " 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()); + totalTime_.setSize(faItems_.size(), obr().time().deltaTValue()); initialize(); } @@ -128,8 +128,8 @@ void Foam::functionObjects::fieldAverage::calcAverages() initialize(); } - const label currentTimeIndex = obr_.time().timeIndex(); - const scalar currentTime = obr_.time().value(); + const label currentTimeIndex = obr().time().timeIndex(); + const scalar currentTime = obr().time().value(); if (prevTimeIndex_ == currentTimeIndex) { @@ -176,7 +176,7 @@ void Foam::functionObjects::fieldAverage::calcAverages() forAll(faItems_, fieldi) { totalIter_[fieldi]++; - totalTime_[fieldi] += obr_.time().deltaTValue(); + totalTime_[fieldi] += obr().time().deltaTValue(); } Log << endl; @@ -217,11 +217,11 @@ void Foam::functionObjects::fieldAverage::readAveragingProperties() totalIter_.setSize(faItems_.size(), 1); totalTime_.clear(); - totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue()); + totalTime_.setSize(faItems_.size(), obr().time().deltaTValue()); if (restartOnRestart_ || restartOnOutput_) { - Info<< " Starting averaging at time " << obr_.time().timeName() + Info<< " Starting averaging at time " << obr().time().timeName() << nl; } else @@ -248,7 +248,7 @@ void Foam::functionObjects::fieldAverage::readAveragingProperties() { Info<< " " << fieldName << ": starting averaging at time " - << obr_.time().timeName() << endl; + << obr().time().timeName() << endl; } } } diff --git a/src/functionObjects/field/fieldAverage/fieldAverage.H b/src/functionObjects/field/fieldAverage/fieldAverage.H index 20c8380d7e..74c4768d37 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverage.H +++ b/src/functionObjects/field/fieldAverage/fieldAverage.H @@ -30,6 +30,7 @@ Group Description Calculates average quantities for a user-specified selection of volumetric and surface fields. + With the %subRegion option, also supports fields on a surfMesh. Fields are entered as a list of sub-dictionaries, which indicate the type of averages to perform, and can be updated during the calculation. The current @@ -108,6 +109,7 @@ Usage restartPeriod | Periodic restart period | conditional | restartTime | One-shot reset of the averaging | no | great fields | list of fields and averaging options | yes | + subRegion | name of a sub-region such as a surface name | no | \endtable @@ -272,10 +274,10 @@ protected: //- Disallow default bitwise copy construct - fieldAverage(const fieldAverage&); + fieldAverage(const fieldAverage&) = delete; //- Disallow default bitwise assignment - void operator=(const fieldAverage&); + void operator=(const fieldAverage&) = delete; public: diff --git a/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C b/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C index fd6c50542d..422a149939 100644 --- a/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C +++ b/src/functionObjects/field/fieldAverage/fieldAverageTemplates.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -26,6 +26,7 @@ License #include "fieldAverageItem.H" #include "volFields.H" #include "surfaceFields.H" +#include "surfFields.H" #include "OFstream.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -41,11 +42,11 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType(const label fieldi) Log << " Reading/initialising field " << meanFieldName << endl; - if (obr_.foundObject(meanFieldName)) + if (foundObject(meanFieldName)) { // do nothing } - else if (obr_.found(meanFieldName)) + else if (obr().found(meanFieldName)) { Log << " Cannot allocate average field " << meanFieldName << " since an object with that name already exists." @@ -55,18 +56,18 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType(const label fieldi) } else { - const Type& baseField = obr_.lookupObject(fieldName); + const Type& baseField = lookupObject(fieldName); // Store on registry - obr_.store + obr().store ( new Type ( IOobject ( meanFieldName, - obr_.time().timeName(obr_.time().startTime().value()), - obr_, + obr().time().timeName(obr().time().startTime().value()), + obr(), restartOnOutput_ ? IOobject::NO_READ : IOobject::READ_IF_PRESENT, @@ -82,24 +83,26 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType(const label fieldi) template void Foam::functionObjects::fieldAverage::addMeanField(const label fieldi) { + typedef GeometricField VolFieldType; + typedef GeometricField SurfaceFieldType; + typedef DimensionedField SurfFieldType; + if (faItems_[fieldi].mean()) { - typedef GeometricField - VolFieldType; - - typedef GeometricField - SurfaceFieldType; - const word& fieldName = faItems_[fieldi].fieldName(); - if (obr_.foundObject(fieldName)) + if (foundObject(fieldName)) { addMeanFieldType(fieldi); } - else if (obr_.foundObject(fieldName)) + else if (foundObject(fieldName)) { addMeanFieldType(fieldi); } + else if (foundObject(fieldName)) + { + addMeanFieldType(fieldi); + } } } @@ -116,11 +119,11 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType Log << " Reading/initialising field " << prime2MeanFieldName << nl; - if (obr_.foundObject(prime2MeanFieldName)) + if (foundObject(prime2MeanFieldName)) { // do nothing } - else if (obr_.found(prime2MeanFieldName)) + else if (obr().found(prime2MeanFieldName)) { Log << " Cannot allocate average field " << prime2MeanFieldName << " since an object with that name already exists." @@ -130,19 +133,19 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType } else { - const Type1& baseField = obr_.lookupObject(fieldName); - const Type1& meanField = obr_.lookupObject(meanFieldName); + const Type1& baseField = lookupObject(fieldName); + const Type1& meanField = lookupObject(meanFieldName); // Store on registry - obr_.store + obr().store ( new Type2 ( IOobject ( prime2MeanFieldName, - obr_.time().timeName(obr_.time().startTime().value()), - obr_, + obr().time().timeName(obr().time().startTime().value()), + obr(), restartOnOutput_ ? IOobject::NO_READ : IOobject::READ_IF_PRESENT, @@ -160,9 +163,11 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanField(const label fieldi) { typedef GeometricField VolFieldType1; typedef GeometricField SurfaceFieldType1; + typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; typedef GeometricField SurfaceFieldType2; + typedef DimensionedField SurfFieldType2; if (faItems_[fieldi].prime2Mean()) { @@ -176,17 +181,24 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanField(const label fieldi) << fieldName << nl << exit(FatalError); } - if (obr_.foundObject(fieldName)) + if (foundObject(fieldName)) { addPrime2MeanFieldType(fieldi); } - else if (obr_.foundObject(fieldName)) + else if (foundObject(fieldName)) { addPrime2MeanFieldType ( fieldi ); } + else if (foundObject(fieldName)) + { + addPrime2MeanFieldType + ( + fieldi + ); + } } } @@ -199,16 +211,16 @@ void Foam::functionObjects::fieldAverage::calculateMeanFieldType { const word& fieldName = faItems_[fieldi].fieldName(); - if (obr_.foundObject(fieldName)) + if (foundObject(fieldName)) { - const Type& baseField = obr_.lookupObject(fieldName); + const Type& baseField = lookupObject(fieldName); Type& meanField = const_cast ( - obr_.lookupObject(faItems_[fieldi].meanFieldName()) + lookupObject(faItems_[fieldi].meanFieldName()) ); - scalar dt = obr_.time().deltaTValue(); + scalar dt = obr().time().deltaTValue(); scalar Dt = totalTime_[fieldi]; if (faItems_[fieldi].iterBase()) @@ -239,6 +251,7 @@ void Foam::functionObjects::fieldAverage::calculateMeanFields() const { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; + typedef DimensionedField SurfFieldType; forAll(faItems_, i) { @@ -246,6 +259,7 @@ void Foam::functionObjects::fieldAverage::calculateMeanFields() const { calculateMeanFieldType(i); calculateMeanFieldType(i); + calculateMeanFieldType(i); } } } @@ -259,18 +273,16 @@ void Foam::functionObjects::fieldAverage::calculatePrime2MeanFieldType { const word& fieldName = faItems_[fieldi].fieldName(); - if (obr_.foundObject(fieldName)) + if (foundObject(fieldName)) { - const Type1& baseField = obr_.lookupObject(fieldName); + const Type1& baseField = lookupObject(fieldName); const Type1& meanField = - obr_.lookupObject(faItems_[fieldi].meanFieldName()); + lookupObject(faItems_[fieldi].meanFieldName()); - Type2& prime2MeanField = const_cast - ( - obr_.lookupObject(faItems_[fieldi].prime2MeanFieldName()) - ); + Type2& prime2MeanField = + lookupObjectRef(faItems_[fieldi].prime2MeanFieldName()); - scalar dt = obr_.time().deltaTValue(); + scalar dt = obr().time().deltaTValue(); scalar Dt = totalTime_[fieldi]; if (faItems_[fieldi].iterBase()) @@ -304,9 +316,11 @@ void Foam::functionObjects::fieldAverage::calculatePrime2MeanFields() const { typedef GeometricField VolFieldType1; typedef GeometricField SurfaceFieldType1; + typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; typedef GeometricField SurfaceFieldType2; + typedef DimensionedField SurfFieldType2; forAll(faItems_, i) { @@ -317,6 +331,11 @@ void Foam::functionObjects::fieldAverage::calculatePrime2MeanFields() const ( i ); + + calculatePrime2MeanFieldType + ( + i + ); } } } @@ -330,15 +349,13 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType { const word& fieldName = faItems_[fieldi].fieldName(); - if (obr_.foundObject(fieldName)) + if (foundObject(fieldName)) { const Type1& meanField = - obr_.lookupObject(faItems_[fieldi].meanFieldName()); + lookupObject(faItems_[fieldi].meanFieldName()); - Type2& prime2MeanField = const_cast - ( - obr_.lookupObject(faItems_[fieldi].prime2MeanFieldName()) - ); + Type2& prime2MeanField = + lookupObjectRef(faItems_[fieldi].prime2MeanFieldName()); prime2MeanField += sqr(meanField); } @@ -350,9 +367,11 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const { typedef GeometricField VolFieldType1; typedef GeometricField SurfaceFieldType1; + typedef DimensionedField SurfFieldType1; typedef GeometricField VolFieldType2; typedef GeometricField SurfaceFieldType2; + typedef DimensionedField SurfFieldType2; forAll(faItems_, i) { @@ -360,6 +379,7 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const { addMeanSqrToPrime2MeanType(i); addMeanSqrToPrime2MeanType(i); + addMeanSqrToPrime2MeanType(i); } } } @@ -371,9 +391,9 @@ void Foam::functionObjects::fieldAverage::writeFieldType const word& fieldName ) const { - if (obr_.foundObject(fieldName)) + if (foundObject(fieldName)) { - const Type& f = obr_.lookupObject(fieldName); + const Type& f = lookupObject(fieldName); f.write(); } } @@ -384,6 +404,7 @@ void Foam::functionObjects::fieldAverage::writeFields() const { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; + typedef DimensionedField SurfFieldType; forAll(faItems_, i) { @@ -392,12 +413,14 @@ void Foam::functionObjects::fieldAverage::writeFields() const const word& fieldName = faItems_[i].meanFieldName(); writeFieldType(fieldName); writeFieldType(fieldName); + writeFieldType(fieldName); } if (faItems_[i].prime2Mean()) { const word& fieldName = faItems_[i].prime2MeanFieldName(); writeFieldType(fieldName); writeFieldType(fieldName); + writeFieldType(fieldName); } } } diff --git a/src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C b/src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C index b9b3be1135..c50b7ed98b 100644 --- a/src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C +++ b/src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,6 +25,7 @@ License #include "volFields.H" #include "surfaceFields.H" +#include "surfFields.H" // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // @@ -33,6 +34,7 @@ bool Foam::functionObjects::fieldsExpression::calcFieldTypes(FOType& fo) { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; + typedef DimensionedField SurfFieldType; if (foundObject(fieldNames_[0])) { @@ -50,6 +52,14 @@ bool Foam::functionObjects::fieldsExpression::calcFieldTypes(FOType& fo) fo.template calcFieldType() ); } + else if (foundObject(fieldNames_[0])) + { + return store + ( + resultName_, + fo.template calcFieldType() + ); + } else { return false; diff --git a/src/functionObjects/field/mag/mag.H b/src/functionObjects/field/mag/mag.H index de2737c31d..2010e25e5a 100644 --- a/src/functionObjects/field/mag/mag.H +++ b/src/functionObjects/field/mag/mag.H @@ -32,6 +32,7 @@ Description The operation can be applied to any volume or surface fields generating a volume or surface scalar field. + With the %subRegion option, also supports fields on a surfMesh. See also Foam::functionObjects::fvMeshFunctionObject diff --git a/src/functionObjects/field/mag/magTemplates.C b/src/functionObjects/field/mag/magTemplates.C index 0b6035f0a0..dead35a360 100644 --- a/src/functionObjects/field/mag/magTemplates.C +++ b/src/functionObjects/field/mag/magTemplates.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,6 +25,7 @@ License #include "volFields.H" #include "surfaceFields.H" +#include "surfFields.H" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // @@ -33,6 +34,7 @@ bool Foam::functionObjects::mag::calcMag() { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; + typedef DimensionedField SurfFieldType; if (foundObject(fieldName_)) { @@ -50,6 +52,14 @@ bool Foam::functionObjects::mag::calcMag() Foam::mag(lookupObject(fieldName_)) ); } + else if (foundObject(fieldName_)) + { + return store + ( + resultName_, + Foam::mag(lookupObject(fieldName_)) + ); + } else { return false; diff --git a/src/functionObjects/field/magSqr/magSqr.H b/src/functionObjects/field/magSqr/magSqr.H index f1af984178..c112187e70 100644 --- a/src/functionObjects/field/magSqr/magSqr.H +++ b/src/functionObjects/field/magSqr/magSqr.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -32,6 +32,7 @@ Description The operation can be applied to any volume or surface field generating a volume or surface scalar field. + With the %subRegion option, also supports fields on a surfMesh. See also Foam::functionObjects::fvMeshFunctionObject diff --git a/src/functionObjects/field/magSqr/magSqrTemplates.C b/src/functionObjects/field/magSqr/magSqrTemplates.C index a5b1011c39..a3fee019bb 100644 --- a/src/functionObjects/field/magSqr/magSqrTemplates.C +++ b/src/functionObjects/field/magSqr/magSqrTemplates.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,6 +25,7 @@ License #include "volFields.H" #include "surfaceFields.H" +#include "surfFields.H" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // @@ -33,6 +34,7 @@ bool Foam::functionObjects::magSqr::calcMagSqr() { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; + typedef DimensionedField SurfFieldType; if (foundObject(fieldName_)) { @@ -50,6 +52,14 @@ bool Foam::functionObjects::magSqr::calcMagSqr() Foam::magSqr(lookupObject(fieldName_)) ); } + else if (foundObject(fieldName_)) + { + return store + ( + resultName_, + Foam::magSqr(lookupObject(fieldName_)) + ); + } else { return false; diff --git a/src/functionObjects/field/readFields/readFieldsTemplates.C b/src/functionObjects/field/readFields/readFieldsTemplates.C index 07d73044c7..326b8f2156 100644 --- a/src/functionObjects/field/readFields/readFieldsTemplates.C +++ b/src/functionObjects/field/readFields/readFieldsTemplates.C @@ -26,6 +26,7 @@ License #include "readFields.H" #include "volFields.H" #include "surfaceFields.H" +#include "surfFields.H" #include "Time.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -35,6 +36,7 @@ bool Foam::functionObjects::readFields::loadField(const word& fieldName) { typedef GeometricField VolFieldType; typedef GeometricField SurfaceFieldType; + typedef DimensionedField SurfFieldType; if (foundObject(fieldName)) { @@ -49,6 +51,12 @@ bool Foam::functionObjects::readFields::loadField(const word& fieldName) << " " << fieldName << " already exists in database" << " already in database" << endl; } + else if (foundObject(fieldName)) + { + DebugInfo<< "readFields: " << SurfFieldType::typeName + << " " << fieldName << " already exists in database" + << " already in database" << endl; + } else { IOobject fieldHeader @@ -76,6 +84,23 @@ bool Foam::functionObjects::readFields::loadField(const word& fieldName) mesh_.objectRegistry::store(sfPtr); return true; } + else if (fieldHeader.typeHeaderOk(true)) + { + if (isA(obr())) + { + const surfMesh& s = dynamicCast(obr()); + + // Store field on surfMesh database + Log << " Reading " << fieldName << endl; + SurfFieldType* sfPtr(new SurfFieldType(fieldHeader, s)); + s.store(sfPtr); + return true; + } + else + { + return false; + } + } } return false;