ENH: add surfField support to various field function objects

- fieldAverage
  - mag
  - magSqr
  - readFields
  - fieldsExpression (add, subtract)
This commit is contained in:
Mark Olesen
2016-12-15 09:32:53 +01:00
parent b0433d93f8
commit 001a2e4a37
9 changed files with 144 additions and 62 deletions

View File

@ -48,17 +48,17 @@ void Foam::functionObjects::fieldAverage::resetFields()
{ {
if (faItems_[i].mean()) 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 (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() void Foam::functionObjects::fieldAverage::restart()
{ {
Log << " Restarting averaging at time " << obr_.time().timeName() Log << " Restarting averaging at time " << obr().time().timeName()
<< nl << endl; << nl << endl;
totalIter_.clear(); totalIter_.clear();
totalIter_.setSize(faItems_.size(), 1); totalIter_.setSize(faItems_.size(), 1);
totalTime_.clear(); totalTime_.clear();
totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue()); totalTime_.setSize(faItems_.size(), obr().time().deltaTValue());
initialize(); initialize();
} }
@ -128,8 +128,8 @@ void Foam::functionObjects::fieldAverage::calcAverages()
initialize(); initialize();
} }
const label currentTimeIndex = obr_.time().timeIndex(); const label currentTimeIndex = obr().time().timeIndex();
const scalar currentTime = obr_.time().value(); const scalar currentTime = obr().time().value();
if (prevTimeIndex_ == currentTimeIndex) if (prevTimeIndex_ == currentTimeIndex)
{ {
@ -176,7 +176,7 @@ void Foam::functionObjects::fieldAverage::calcAverages()
forAll(faItems_, fieldi) forAll(faItems_, fieldi)
{ {
totalIter_[fieldi]++; totalIter_[fieldi]++;
totalTime_[fieldi] += obr_.time().deltaTValue(); totalTime_[fieldi] += obr().time().deltaTValue();
} }
Log << endl; Log << endl;
@ -217,11 +217,11 @@ void Foam::functionObjects::fieldAverage::readAveragingProperties()
totalIter_.setSize(faItems_.size(), 1); totalIter_.setSize(faItems_.size(), 1);
totalTime_.clear(); totalTime_.clear();
totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue()); totalTime_.setSize(faItems_.size(), obr().time().deltaTValue());
if (restartOnRestart_ || restartOnOutput_) if (restartOnRestart_ || restartOnOutput_)
{ {
Info<< " Starting averaging at time " << obr_.time().timeName() Info<< " Starting averaging at time " << obr().time().timeName()
<< nl; << nl;
} }
else else
@ -248,7 +248,7 @@ void Foam::functionObjects::fieldAverage::readAveragingProperties()
{ {
Info<< " " << fieldName Info<< " " << fieldName
<< ": starting averaging at time " << ": starting averaging at time "
<< obr_.time().timeName() << endl; << obr().time().timeName() << endl;
} }
} }
} }

View File

@ -30,6 +30,7 @@ Group
Description Description
Calculates average quantities for a user-specified selection of volumetric Calculates average quantities for a user-specified selection of volumetric
and surface fields. 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 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 averages to perform, and can be updated during the calculation. The current
@ -108,6 +109,7 @@ Usage
restartPeriod | Periodic restart period | conditional | restartPeriod | Periodic restart period | conditional |
restartTime | One-shot reset of the averaging | no | great restartTime | One-shot reset of the averaging | no | great
fields | list of fields and averaging options | yes | fields | list of fields and averaging options | yes |
subRegion | name of a sub-region such as a surface name | no |
\endtable \endtable
@ -272,10 +274,10 @@ protected:
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
fieldAverage(const fieldAverage&); fieldAverage(const fieldAverage&) = delete;
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
void operator=(const fieldAverage&); void operator=(const fieldAverage&) = delete;
public: public:

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -26,6 +26,7 @@ License
#include "fieldAverageItem.H" #include "fieldAverageItem.H"
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H" #include "surfaceFields.H"
#include "surfFields.H"
#include "OFstream.H" #include "OFstream.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
@ -41,11 +42,11 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType(const label fieldi)
Log << " Reading/initialising field " << meanFieldName << endl; Log << " Reading/initialising field " << meanFieldName << endl;
if (obr_.foundObject<Type>(meanFieldName)) if (foundObject<Type>(meanFieldName))
{ {
// do nothing // do nothing
} }
else if (obr_.found(meanFieldName)) else if (obr().found(meanFieldName))
{ {
Log << " Cannot allocate average field " << meanFieldName Log << " Cannot allocate average field " << meanFieldName
<< " since an object with that name already exists." << " since an object with that name already exists."
@ -55,18 +56,18 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType(const label fieldi)
} }
else else
{ {
const Type& baseField = obr_.lookupObject<Type>(fieldName); const Type& baseField = lookupObject<Type>(fieldName);
// Store on registry // Store on registry
obr_.store obr().store
( (
new Type new Type
( (
IOobject IOobject
( (
meanFieldName, meanFieldName,
obr_.time().timeName(obr_.time().startTime().value()), obr().time().timeName(obr().time().startTime().value()),
obr_, obr(),
restartOnOutput_ restartOnOutput_
? IOobject::NO_READ ? IOobject::NO_READ
: IOobject::READ_IF_PRESENT, : IOobject::READ_IF_PRESENT,
@ -82,24 +83,26 @@ void Foam::functionObjects::fieldAverage::addMeanFieldType(const label fieldi)
template<class Type> template<class Type>
void Foam::functionObjects::fieldAverage::addMeanField(const label fieldi) void Foam::functionObjects::fieldAverage::addMeanField(const label fieldi)
{ {
typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
typedef DimensionedField<Type, surfGeoMesh> SurfFieldType;
if (faItems_[fieldi].mean()) if (faItems_[fieldi].mean())
{ {
typedef GeometricField<Type, fvPatchField, volMesh>
VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh>
SurfaceFieldType;
const word& fieldName = faItems_[fieldi].fieldName(); const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject<VolFieldType>(fieldName)) if (foundObject<VolFieldType>(fieldName))
{ {
addMeanFieldType<VolFieldType>(fieldi); addMeanFieldType<VolFieldType>(fieldi);
} }
else if (obr_.foundObject<SurfaceFieldType>(fieldName)) else if (foundObject<SurfaceFieldType>(fieldName))
{ {
addMeanFieldType<SurfaceFieldType>(fieldi); addMeanFieldType<SurfaceFieldType>(fieldi);
} }
else if (foundObject<SurfFieldType>(fieldName))
{
addMeanFieldType<SurfFieldType>(fieldi);
}
} }
} }
@ -116,11 +119,11 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType
Log << " Reading/initialising field " << prime2MeanFieldName << nl; Log << " Reading/initialising field " << prime2MeanFieldName << nl;
if (obr_.foundObject<Type2>(prime2MeanFieldName)) if (foundObject<Type2>(prime2MeanFieldName))
{ {
// do nothing // do nothing
} }
else if (obr_.found(prime2MeanFieldName)) else if (obr().found(prime2MeanFieldName))
{ {
Log << " Cannot allocate average field " << prime2MeanFieldName Log << " Cannot allocate average field " << prime2MeanFieldName
<< " since an object with that name already exists." << " since an object with that name already exists."
@ -130,19 +133,19 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType
} }
else else
{ {
const Type1& baseField = obr_.lookupObject<Type1>(fieldName); const Type1& baseField = lookupObject<Type1>(fieldName);
const Type1& meanField = obr_.lookupObject<Type1>(meanFieldName); const Type1& meanField = lookupObject<Type1>(meanFieldName);
// Store on registry // Store on registry
obr_.store obr().store
( (
new Type2 new Type2
( (
IOobject IOobject
( (
prime2MeanFieldName, prime2MeanFieldName,
obr_.time().timeName(obr_.time().startTime().value()), obr().time().timeName(obr().time().startTime().value()),
obr_, obr(),
restartOnOutput_ restartOnOutput_
? IOobject::NO_READ ? IOobject::NO_READ
: IOobject::READ_IF_PRESENT, : IOobject::READ_IF_PRESENT,
@ -160,9 +163,11 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanField(const label fieldi)
{ {
typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1; typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1;
typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1; typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1;
typedef DimensionedField<Type1, surfGeoMesh> SurfFieldType1;
typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2; typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2;
typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2; typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2;
typedef DimensionedField<Type2, surfGeoMesh> SurfFieldType2;
if (faItems_[fieldi].prime2Mean()) if (faItems_[fieldi].prime2Mean())
{ {
@ -176,17 +181,24 @@ void Foam::functionObjects::fieldAverage::addPrime2MeanField(const label fieldi)
<< fieldName << nl << exit(FatalError); << fieldName << nl << exit(FatalError);
} }
if (obr_.foundObject<VolFieldType1>(fieldName)) if (foundObject<VolFieldType1>(fieldName))
{ {
addPrime2MeanFieldType<VolFieldType1, VolFieldType2>(fieldi); addPrime2MeanFieldType<VolFieldType1, VolFieldType2>(fieldi);
} }
else if (obr_.foundObject<SurfaceFieldType1>(fieldName)) else if (foundObject<SurfaceFieldType1>(fieldName))
{ {
addPrime2MeanFieldType<SurfaceFieldType1, SurfaceFieldType2> addPrime2MeanFieldType<SurfaceFieldType1, SurfaceFieldType2>
( (
fieldi fieldi
); );
} }
else if (foundObject<SurfFieldType1>(fieldName))
{
addPrime2MeanFieldType<SurfFieldType1, SurfFieldType2>
(
fieldi
);
}
} }
} }
@ -199,16 +211,16 @@ void Foam::functionObjects::fieldAverage::calculateMeanFieldType
{ {
const word& fieldName = faItems_[fieldi].fieldName(); const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject<Type>(fieldName)) if (foundObject<Type>(fieldName))
{ {
const Type& baseField = obr_.lookupObject<Type>(fieldName); const Type& baseField = lookupObject<Type>(fieldName);
Type& meanField = const_cast<Type&> Type& meanField = const_cast<Type&>
( (
obr_.lookupObject<Type>(faItems_[fieldi].meanFieldName()) lookupObject<Type>(faItems_[fieldi].meanFieldName())
); );
scalar dt = obr_.time().deltaTValue(); scalar dt = obr().time().deltaTValue();
scalar Dt = totalTime_[fieldi]; scalar Dt = totalTime_[fieldi];
if (faItems_[fieldi].iterBase()) if (faItems_[fieldi].iterBase())
@ -239,6 +251,7 @@ void Foam::functionObjects::fieldAverage::calculateMeanFields() const
{ {
typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType; typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
typedef DimensionedField<Type, surfGeoMesh> SurfFieldType;
forAll(faItems_, i) forAll(faItems_, i)
{ {
@ -246,6 +259,7 @@ void Foam::functionObjects::fieldAverage::calculateMeanFields() const
{ {
calculateMeanFieldType<VolFieldType>(i); calculateMeanFieldType<VolFieldType>(i);
calculateMeanFieldType<SurfaceFieldType>(i); calculateMeanFieldType<SurfaceFieldType>(i);
calculateMeanFieldType<SurfFieldType>(i);
} }
} }
} }
@ -259,18 +273,16 @@ void Foam::functionObjects::fieldAverage::calculatePrime2MeanFieldType
{ {
const word& fieldName = faItems_[fieldi].fieldName(); const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject<Type1>(fieldName)) if (foundObject<Type1>(fieldName))
{ {
const Type1& baseField = obr_.lookupObject<Type1>(fieldName); const Type1& baseField = lookupObject<Type1>(fieldName);
const Type1& meanField = const Type1& meanField =
obr_.lookupObject<Type1>(faItems_[fieldi].meanFieldName()); lookupObject<Type1>(faItems_[fieldi].meanFieldName());
Type2& prime2MeanField = const_cast<Type2&> Type2& prime2MeanField =
( lookupObjectRef<Type2>(faItems_[fieldi].prime2MeanFieldName());
obr_.lookupObject<Type2>(faItems_[fieldi].prime2MeanFieldName())
);
scalar dt = obr_.time().deltaTValue(); scalar dt = obr().time().deltaTValue();
scalar Dt = totalTime_[fieldi]; scalar Dt = totalTime_[fieldi];
if (faItems_[fieldi].iterBase()) if (faItems_[fieldi].iterBase())
@ -304,9 +316,11 @@ void Foam::functionObjects::fieldAverage::calculatePrime2MeanFields() const
{ {
typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1; typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1;
typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1; typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1;
typedef DimensionedField<Type1, surfGeoMesh> SurfFieldType1;
typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2; typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2;
typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2; typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2;
typedef DimensionedField<Type2, surfGeoMesh> SurfFieldType2;
forAll(faItems_, i) forAll(faItems_, i)
{ {
@ -317,6 +331,11 @@ void Foam::functionObjects::fieldAverage::calculatePrime2MeanFields() const
( (
i i
); );
calculatePrime2MeanFieldType<SurfFieldType1, SurfFieldType2>
(
i
);
} }
} }
} }
@ -330,15 +349,13 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType
{ {
const word& fieldName = faItems_[fieldi].fieldName(); const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject<Type1>(fieldName)) if (foundObject<Type1>(fieldName))
{ {
const Type1& meanField = const Type1& meanField =
obr_.lookupObject<Type1>(faItems_[fieldi].meanFieldName()); lookupObject<Type1>(faItems_[fieldi].meanFieldName());
Type2& prime2MeanField = const_cast<Type2&> Type2& prime2MeanField =
( lookupObjectRef<Type2>(faItems_[fieldi].prime2MeanFieldName());
obr_.lookupObject<Type2>(faItems_[fieldi].prime2MeanFieldName())
);
prime2MeanField += sqr(meanField); prime2MeanField += sqr(meanField);
} }
@ -350,9 +367,11 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const
{ {
typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1; typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1;
typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1; typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1;
typedef DimensionedField<Type1, surfGeoMesh> SurfFieldType1;
typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2; typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2;
typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2; typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2;
typedef DimensionedField<Type2, surfGeoMesh> SurfFieldType2;
forAll(faItems_, i) forAll(faItems_, i)
{ {
@ -360,6 +379,7 @@ void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const
{ {
addMeanSqrToPrime2MeanType<VolFieldType1, VolFieldType2>(i); addMeanSqrToPrime2MeanType<VolFieldType1, VolFieldType2>(i);
addMeanSqrToPrime2MeanType<SurfaceFieldType1, SurfaceFieldType2>(i); addMeanSqrToPrime2MeanType<SurfaceFieldType1, SurfaceFieldType2>(i);
addMeanSqrToPrime2MeanType<SurfFieldType1, SurfFieldType2>(i);
} }
} }
} }
@ -371,9 +391,9 @@ void Foam::functionObjects::fieldAverage::writeFieldType
const word& fieldName const word& fieldName
) const ) const
{ {
if (obr_.foundObject<Type>(fieldName)) if (foundObject<Type>(fieldName))
{ {
const Type& f = obr_.lookupObject<Type>(fieldName); const Type& f = lookupObject<Type>(fieldName);
f.write(); f.write();
} }
} }
@ -384,6 +404,7 @@ void Foam::functionObjects::fieldAverage::writeFields() const
{ {
typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType; typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
typedef DimensionedField<Type, surfGeoMesh> SurfFieldType;
forAll(faItems_, i) forAll(faItems_, i)
{ {
@ -392,12 +413,14 @@ void Foam::functionObjects::fieldAverage::writeFields() const
const word& fieldName = faItems_[i].meanFieldName(); const word& fieldName = faItems_[i].meanFieldName();
writeFieldType<VolFieldType>(fieldName); writeFieldType<VolFieldType>(fieldName);
writeFieldType<SurfaceFieldType>(fieldName); writeFieldType<SurfaceFieldType>(fieldName);
writeFieldType<SurfFieldType>(fieldName);
} }
if (faItems_[i].prime2Mean()) if (faItems_[i].prime2Mean())
{ {
const word& fieldName = faItems_[i].prime2MeanFieldName(); const word& fieldName = faItems_[i].prime2MeanFieldName();
writeFieldType<VolFieldType>(fieldName); writeFieldType<VolFieldType>(fieldName);
writeFieldType<SurfaceFieldType>(fieldName); writeFieldType<SurfaceFieldType>(fieldName);
writeFieldType<SurfFieldType>(fieldName);
} }
} }
} }

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -25,6 +25,7 @@ License
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H" #include "surfaceFields.H"
#include "surfFields.H"
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
@ -33,6 +34,7 @@ bool Foam::functionObjects::fieldsExpression::calcFieldTypes(FOType& fo)
{ {
typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType; typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
typedef DimensionedField<Type, surfGeoMesh> SurfFieldType;
if (foundObject<VolFieldType>(fieldNames_[0])) if (foundObject<VolFieldType>(fieldNames_[0]))
{ {
@ -50,6 +52,14 @@ bool Foam::functionObjects::fieldsExpression::calcFieldTypes(FOType& fo)
fo.template calcFieldType<SurfaceFieldType>() fo.template calcFieldType<SurfaceFieldType>()
); );
} }
else if (foundObject<SurfFieldType>(fieldNames_[0]))
{
return store
(
resultName_,
fo.template calcFieldType<SurfFieldType>()
);
}
else else
{ {
return false; return false;

View File

@ -32,6 +32,7 @@ Description
The operation can be applied to any volume or surface fields generating a The operation can be applied to any volume or surface fields generating a
volume or surface scalar field. volume or surface scalar field.
With the %subRegion option, also supports fields on a surfMesh.
See also See also
Foam::functionObjects::fvMeshFunctionObject Foam::functionObjects::fvMeshFunctionObject

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -25,6 +25,7 @@ License
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H" #include "surfaceFields.H"
#include "surfFields.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@ -33,6 +34,7 @@ bool Foam::functionObjects::mag::calcMag()
{ {
typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType; typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
typedef DimensionedField<Type, surfGeoMesh> SurfFieldType;
if (foundObject<VolFieldType>(fieldName_)) if (foundObject<VolFieldType>(fieldName_))
{ {
@ -50,6 +52,14 @@ bool Foam::functionObjects::mag::calcMag()
Foam::mag(lookupObject<SurfaceFieldType>(fieldName_)) Foam::mag(lookupObject<SurfaceFieldType>(fieldName_))
); );
} }
else if (foundObject<SurfFieldType>(fieldName_))
{
return store
(
resultName_,
Foam::mag(lookupObject<SurfFieldType>(fieldName_))
);
}
else else
{ {
return false; return false;

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -32,6 +32,7 @@ Description
The operation can be applied to any volume or surface field generating a The operation can be applied to any volume or surface field generating a
volume or surface scalar field. volume or surface scalar field.
With the %subRegion option, also supports fields on a surfMesh.
See also See also
Foam::functionObjects::fvMeshFunctionObject Foam::functionObjects::fvMeshFunctionObject

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -25,6 +25,7 @@ License
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H" #include "surfaceFields.H"
#include "surfFields.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@ -33,6 +34,7 @@ bool Foam::functionObjects::magSqr::calcMagSqr()
{ {
typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType; typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
typedef DimensionedField<Type, surfGeoMesh> SurfFieldType;
if (foundObject<VolFieldType>(fieldName_)) if (foundObject<VolFieldType>(fieldName_))
{ {
@ -50,6 +52,14 @@ bool Foam::functionObjects::magSqr::calcMagSqr()
Foam::magSqr(lookupObject<SurfaceFieldType>(fieldName_)) Foam::magSqr(lookupObject<SurfaceFieldType>(fieldName_))
); );
} }
else if (foundObject<SurfFieldType>(fieldName_))
{
return store
(
resultName_,
Foam::magSqr(lookupObject<SurfFieldType>(fieldName_))
);
}
else else
{ {
return false; return false;

View File

@ -26,6 +26,7 @@ License
#include "readFields.H" #include "readFields.H"
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H" #include "surfaceFields.H"
#include "surfFields.H"
#include "Time.H" #include "Time.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -35,6 +36,7 @@ bool Foam::functionObjects::readFields::loadField(const word& fieldName)
{ {
typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType; typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
typedef DimensionedField<Type, surfGeoMesh> SurfFieldType;
if (foundObject<VolFieldType>(fieldName)) if (foundObject<VolFieldType>(fieldName))
{ {
@ -49,6 +51,12 @@ bool Foam::functionObjects::readFields::loadField(const word& fieldName)
<< " " << fieldName << " already exists in database" << " " << fieldName << " already exists in database"
<< " already in database" << endl; << " already in database" << endl;
} }
else if (foundObject<SurfFieldType>(fieldName))
{
DebugInfo<< "readFields: " << SurfFieldType::typeName
<< " " << fieldName << " already exists in database"
<< " already in database" << endl;
}
else else
{ {
IOobject fieldHeader IOobject fieldHeader
@ -76,6 +84,23 @@ bool Foam::functionObjects::readFields::loadField(const word& fieldName)
mesh_.objectRegistry::store(sfPtr); mesh_.objectRegistry::store(sfPtr);
return true; return true;
} }
else if (fieldHeader.typeHeaderOk<SurfFieldType>(true))
{
if (isA<surfMesh>(obr()))
{
const surfMesh& s = dynamicCast<const surfMesh>(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; return false;