ENH: faceSource function object - updates and fixes

This commit is contained in:
andy
2013-11-11 12:59:21 +00:00
parent 6359588079
commit 6341de384d
3 changed files with 67 additions and 24 deletions

View File

@ -48,11 +48,13 @@ namespace Foam
template<> template<>
const char* NamedEnum<fieldValues::faceSource::operationType, 12>::names[] = const char* NamedEnum<fieldValues::faceSource::operationType, 14>::names[] =
{ {
"none", "none",
"sum", "sum",
"sumMag",
"sumDirection", "sumDirection",
"sumDirectionBalance",
"average", "average",
"weightedAverage", "weightedAverage",
"areaAverage", "areaAverage",
@ -75,7 +77,7 @@ namespace Foam
const Foam::NamedEnum<Foam::fieldValues::faceSource::sourceType, 3> const Foam::NamedEnum<Foam::fieldValues::faceSource::sourceType, 3>
Foam::fieldValues::faceSource::sourceTypeNames_; Foam::fieldValues::faceSource::sourceTypeNames_;
const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 12> const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 14>
Foam::fieldValues::faceSource::operationTypeNames_; Foam::fieldValues::faceSource::operationTypeNames_;
@ -450,6 +452,11 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict)
Info<< " weight field = " << weightFieldName_; Info<< " weight field = " << weightFieldName_;
} }
if (dict.readIfPresent("scaleFactor", scaleFactor_))
{
Info<< " scale factor = " << scaleFactor_;
}
Info<< nl << endl; Info<< nl << endl;
if (valueOutput_) if (valueOutput_)
@ -499,24 +506,15 @@ Foam::scalar Foam::fieldValues::faceSource::processValues
{ {
case opSumDirection: case opSumDirection:
{ {
const vector direction(dict_.lookup("direction")); vector n(dict_.lookup("direction"));
return sum(pos(values*(Sf & n))*mag(values));
scalar v = 0.0;
forAll(Sf, i)
{
scalar d = Sf[i] & direction;
if (d > 0)
{
v += pos(values[i])*values[i];
} }
else case opSumDirectionBalance:
{ {
v += neg(values[i])*values[i]; vector n(dict_.lookup("direction"));
} const scalarField nv(values*(Sf & n));
}
return v; return sum(pos(nv)*mag(values) - neg(nv)*mag(values));
} }
default: default:
{ {
@ -539,8 +537,19 @@ Foam::vector Foam::fieldValues::faceSource::processValues
{ {
case opSumDirection: case opSumDirection:
{ {
const vector direction(dict_.lookup("direction")); vector n(dict_.lookup("direction"));
return sum(pos(values & direction)*values); n /= mag(n) + ROOTVSMALL;
const scalarField nv(n & values);
return sum(pos(nv)*n*(nv));
}
case opSumDirectionBalance:
{
vector n(dict_.lookup("direction"));
n /= mag(n) + ROOTVSMALL;
const scalarField nv(n & values);
return sum(pos(nv)*n*(nv));
} }
case opAreaNormalAverage: case opAreaNormalAverage:
{ {
@ -576,6 +585,7 @@ Foam::fieldValues::faceSource::faceSource
source_(sourceTypeNames_.read(dict.lookup("source"))), source_(sourceTypeNames_.read(dict.lookup("source"))),
operation_(operationTypeNames_.read(dict.lookup("operation"))), operation_(operationTypeNames_.read(dict.lookup("operation"))),
weightFieldName_("none"), weightFieldName_("none"),
scaleFactor_(1.0),
nFaces_(0), nFaces_(0),
faceId_(), faceId_(),
facePatchId_(), facePatchId_(),

View File

@ -71,6 +71,7 @@ Description
sourceName | name of face source if required | no | sourceName | name of face source if required | no |
operation | operation to perform | yes | operation | operation to perform | yes |
weightField | name of field to apply weighting | no | weightField | name of field to apply weighting | no |
scaleFactor | scale factor | no | 1
fields | list of fields to operate on | yes | fields | list of fields to operate on | yes |
\endtable \endtable
@ -87,7 +88,9 @@ Description
\plaintable \plaintable
none | no operation none | no operation
sum | sum sum | sum
sumMag | sum of component magnitudes
sumDirection | sum values which are positive in given direction sumDirection | sum values which are positive in given direction
sumDirectionBalance | sum of balance of values in given direction
average | ensemble average average | ensemble average
weightedAverage | weighted average weightedAverage | weighted average
areaAverage | area weighted average areaAverage | area weighted average
@ -177,7 +180,9 @@ public:
{ {
opNone, opNone,
opSum, opSum,
opSumMag,
opSumDirection, opSumDirection,
opSumDirectionBalance,
opAverage, opAverage,
opWeightedAverage, opWeightedAverage,
opAreaAverage, opAreaAverage,
@ -190,7 +195,7 @@ public:
}; };
//- Operation type names //- Operation type names
static const NamedEnum<operationType, 12> operationTypeNames_; static const NamedEnum<operationType, 14> operationTypeNames_;
private: private:
@ -237,6 +242,9 @@ protected:
//- Weight field name - optional //- Weight field name - optional
word weightFieldName_; word weightFieldName_;
//- Scale factor - optional
scalar scaleFactor_;
//- Global number of faces //- Global number of faces
label nFaces_; label nFaces_;

View File

@ -141,6 +141,11 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
result = sum(values); result = sum(values);
break; break;
} }
case opSumMag:
{
result = sum(cmptMag(values));
break;
}
case opSumDirection: case opSumDirection:
{ {
FatalErrorIn FatalErrorIn
@ -161,6 +166,26 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
result = pTraits<Type>::zero; result = pTraits<Type>::zero;
break; break;
} }
case opSumDirectionBalance:
{
FatalErrorIn
(
"template<class Type>"
"Type Foam::fieldValues::faceSource::processSameTypeValues"
"("
"const Field<Type>&, "
"const vectorField&, "
"const scalarField&"
") const"
)
<< "Operation " << operationTypeNames_[operation_]
<< " not available for values of type "
<< pTraits<Type>::typeName
<< exit(FatalError);
result = pTraits<Type>::zero;
break;
}
case opAverage: case opAverage:
{ {
result = sum(values)/values.size(); result = sum(values)/values.size();
@ -304,8 +329,8 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName)
); );
} }
// apply weight field // apply scale factor and weight field
values *= weightField; values *= scaleFactor_*weightField;
if (Pstream::master()) if (Pstream::master())
{ {