ENH: postOperation for surfaceFieldValue

- currently only 'none' or 'sqrt', which can be useful in combination
  with integrate or averaging functions.
This commit is contained in:
Mark Olesen
2016-12-15 09:46:00 +01:00
parent 001a2e4a37
commit b073c0a104
3 changed files with 64 additions and 4 deletions

View File

@ -85,6 +85,18 @@ const char* Foam::NamedEnum
"areaNormalIntegrate"
};
template<>
const char* Foam::NamedEnum
<
Foam::functionObjects::fieldValues::surfaceFieldValue::postOperationType,
2
>::names[] =
{
"none",
"sqrt"
};
const Foam::NamedEnum
<
Foam::functionObjects::fieldValues::surfaceFieldValue::regionTypes,
@ -97,6 +109,13 @@ const Foam::NamedEnum
16
> Foam::functionObjects::fieldValues::surfaceFieldValue::operationTypeNames_;
const Foam::NamedEnum
<
Foam::functionObjects::fieldValues::surfaceFieldValue::postOperationType,
2
>
Foam::functionObjects::fieldValues::surfaceFieldValue::postOperationTypeNames_;
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
@ -649,6 +668,11 @@ Foam::functionObjects::fieldValues::surfaceFieldValue::surfaceFieldValue
surfaceWriterPtr_(nullptr),
regionType_(regionTypeNames_.read(dict.lookup("regionType"))),
operation_(operationTypeNames_.read(dict.lookup("operation"))),
postOperation_
(
postOperationTypeNames_
[dict.lookupOrDefault<word>("postOperation", "none")]
),
weightFieldName_("none"),
orientWeightField_(false),
orientedFieldsStart_(labelMax),
@ -674,6 +698,11 @@ Foam::functionObjects::fieldValues::surfaceFieldValue::surfaceFieldValue
surfaceWriterPtr_(nullptr),
regionType_(regionTypeNames_.read(dict.lookup("regionType"))),
operation_(operationTypeNames_.read(dict.lookup("operation"))),
postOperation_
(
postOperationTypeNames_
[dict.lookupOrDefault<word>("postOperation", "none")]
),
weightFieldName_("none"),
orientWeightField_(false),
orientedFieldsStart_(labelMax),

View File

@ -86,6 +86,7 @@ Usage
regionType | face regionType: see below | yes |
name | name of face regionType if required | no |
operation | operation to perform | yes |
postOperation | post-operation to perform | no | none |
weightField | name of field to apply weighting | no |
orientedWeightField | name of oriented field to apply weighting | no |
scaleFactor | scale factor | no | 1
@ -223,6 +224,17 @@ public:
static const NamedEnum<operationType, 16> operationTypeNames_;
//- Post-operation type enumeration
enum postOperationType
{
postOpNone,
postOpSqrt
};
//- Operation type names
static const NamedEnum<postOperationType, 2> postOperationTypeNames_;
private:
// Private Member Functions
@ -267,6 +279,9 @@ protected:
//- Operation to apply to values
operationType operation_;
//- Optional post-evaluation operation
postOperationType postOperation_;
//- Weight field name - optional
word weightFieldName_;
@ -394,11 +409,11 @@ public:
inline fileName outputDir() const;
//- Templated helper function to output field values
template<class Type>
template<class Type, class WeightType>
bool writeValues
(
const word& fieldName,
const scalarField& weightField,
const Field<WeightType>& weightField,
const bool orient
);

View File

@ -286,11 +286,11 @@ Type Foam::functionObjects::fieldValues::surfaceFieldValue::processValues
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
template<class Type, class WeightType>
bool Foam::functionObjects::fieldValues::surfaceFieldValue::writeValues
(
const word& fieldName,
const scalarField& weightField,
const Field<WeightType>& weightField,
const bool orient
)
{
@ -355,6 +355,22 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::writeValues
Type result = processValues(values, Sf, weightField);
switch (postOperation_)
{
case postOpNone:
break;
case postOpSqrt:
{
// sqrt: component-wise - doesn't change the type
for (direction d=0; d < pTraits<Type>::nComponents; ++d)
{
setComponent(result, d)
= sqrt(mag(component(result, d)));
}
}
break;
}
file()<< tab << result;
Log << " " << operationTypeNames_[operation_]