ENH: multiFieldValue: add divide and cmptDivide operations

TUT: cavity: new examples for multiFieldValue divide/cmptDivide ops
This commit is contained in:
Kutalmis Bercin 2022-06-29 14:56:43 +01:00
parent 7de07fd8ba
commit 1ce0cb407a
4 changed files with 69 additions and 9 deletions

View File

@ -53,12 +53,20 @@ Foam::functionObjects::fieldValues::multiFieldValue::operationTypeNames_
{ operationType::opSum, "sum" },
{ operationType::opAdd, "add" },
{ operationType::opSubtract, "subtract" },
{ operationType::opDivide, "divide" },
{ operationType::opCmptDivide, "cmptDivide" },
{ operationType::opMin, "min" },
{ operationType::opMax, "max" },
{ operationType::opAverage, "average" },
});
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Implementation
#include "multiFieldValueImpl.C"
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
void Foam::functionObjects::fieldValues::multiFieldValue::writeFileHeader

View File

@ -92,6 +92,8 @@ Usage
sum | Sum of values
add | Add values (same as sum)
subtract | Subtract values from first entry
divide | Divide first entry by values
cmptDivide | Divide first entry by componentwise values
min | Minimum value
max | Maximum value
average | Average value
@ -106,12 +108,12 @@ Usage
SourceFiles
multiFieldValue.C
multiFieldValueTemplates.C
multiFieldValueImpl.C
\*---------------------------------------------------------------------------*/
#ifndef functionObjects_multiFieldValue_H
#define functionObjects_multiFieldValue_H
#ifndef Foam_functionObjects_multiFieldValue_H
#define Foam_functionObjects_multiFieldValue_H
#include "stateFunctionObject.H"
#include "writeFile.H"
@ -145,6 +147,8 @@ public:
opSum, //!< Sum of values
opAdd, //!< Add values (same as sum)
opSubtract, //!< Subtract values from first entry
opDivide, //!< Divide first entry by values
opCmptDivide, //!< Divide first entry by values componentwise
opMin, //!< Minimum value
opMax, //!< Maximum value
opAverage //!< Average value
@ -243,12 +247,6 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
#include "multiFieldValueTemplates.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -28,6 +28,28 @@ License
#include "FlatOutput.H"
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
namespace Foam
{
//- Return magnitude of a given value unless the given Type is scalar
template<class Type>
static inline scalar MagOp(const Type& val)
{
return Foam::mag(val);
}
//- Return self if a given Type is scalar
template<>
inline scalar MagOp<scalar>(const scalar& val)
{
return val;
}
} // End namespace Foam
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
@ -70,6 +92,24 @@ bool Foam::functionObjects::fieldValues::multiFieldValue::applyOperation
}
break;
}
case opDivide:
{
result = values[0];
for (label i = 1; i < values.size(); ++i)
{
result /= stabilise(MagOp(values[i]), SMALL);
}
break;
}
case opCmptDivide:
{
result = values[0];
for (label i = 1; i < values.size(); ++i)
{
result = cmptDivide(result, stabilise(values[i], SMALL));
}
break;
}
case opMin:
{
result = min(values);

View File

@ -126,4 +126,18 @@ multiFieldValue_average
}
multiFieldValue_divide
{
${multiFieldValue_add}
operation divide;
}
multiFieldValue_cmptDivide
{
${multiFieldValue_add}
operation cmptDivide;
}
// ************************************************************************* //