mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Added binary operations to fieldValueDelta function object
This commit is contained in:
@ -29,7 +29,24 @@ License
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
defineTypeNameAndDebug(Foam::fieldValues::fieldValueDelta, 0);
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(Foam::fieldValues::fieldValueDelta, 0);
|
||||||
|
|
||||||
|
template<>
|
||||||
|
const char*
|
||||||
|
NamedEnum<fieldValues::fieldValueDelta::operationType, 4>::names[] =
|
||||||
|
{
|
||||||
|
"add",
|
||||||
|
"subtract",
|
||||||
|
"min",
|
||||||
|
"max"
|
||||||
|
};
|
||||||
|
|
||||||
|
const Foam::NamedEnum<Foam::fieldValues::fieldValueDelta::operationType, 4>
|
||||||
|
Foam::fieldValues::fieldValueDelta::operationTypeNames_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -60,6 +77,7 @@ Foam::fieldValues::fieldValueDelta::fieldValueDelta
|
|||||||
obr_(obr),
|
obr_(obr),
|
||||||
loadFromFiles_(loadFromFiles),
|
loadFromFiles_(loadFromFiles),
|
||||||
log_(false),
|
log_(false),
|
||||||
|
operation_(opSubtract),
|
||||||
source1Ptr_(NULL),
|
source1Ptr_(NULL),
|
||||||
source2Ptr_(NULL)
|
source2Ptr_(NULL)
|
||||||
{
|
{
|
||||||
@ -82,14 +100,20 @@ void Foam::fieldValues::fieldValueDelta::writeFileHeader(const label i)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
file() << "# Time";
|
Ostream& os = file();
|
||||||
|
|
||||||
|
os << "# Source1 : " << source1Ptr_->name() << nl
|
||||||
|
<< "# Source2 : " << source2Ptr_->name() << nl
|
||||||
|
<< "# Operation : " << operationTypeNames_[operation_] << nl;
|
||||||
|
|
||||||
|
os << "# Time";
|
||||||
|
|
||||||
forAll(commonFields, i)
|
forAll(commonFields, i)
|
||||||
{
|
{
|
||||||
file()<< tab << commonFields[i];
|
os << tab << commonFields[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
file() << endl;
|
os << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -126,6 +150,8 @@ void Foam::fieldValues::fieldValueDelta::read(const dictionary& dict)
|
|||||||
false
|
false
|
||||||
).ptr()
|
).ptr()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
operation_ = operationTypeNames_.read(dict.lookup("operation"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -85,6 +85,19 @@ class fieldValueDelta
|
|||||||
:
|
:
|
||||||
public functionObjectFile
|
public functionObjectFile
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
//- Operation type enumeration
|
||||||
|
enum operationType
|
||||||
|
{
|
||||||
|
opAdd,
|
||||||
|
opSubtract,
|
||||||
|
opMin,
|
||||||
|
opMax
|
||||||
|
};
|
||||||
|
|
||||||
|
//- Operation type names
|
||||||
|
static const NamedEnum<operationType, 4> operationTypeNames_;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -102,6 +115,9 @@ private:
|
|||||||
//- Switch to send output to Info as well as to file
|
//- Switch to send output to Info as well as to file
|
||||||
Switch log_;
|
Switch log_;
|
||||||
|
|
||||||
|
//- Operation to apply to values
|
||||||
|
operationType operation_;
|
||||||
|
|
||||||
//- Field value source object 1
|
//- Field value source object 1
|
||||||
autoPtr<fieldValue> source1Ptr_;
|
autoPtr<fieldValue> source1Ptr_;
|
||||||
|
|
||||||
@ -115,6 +131,10 @@ private:
|
|||||||
template<class Type>
|
template<class Type>
|
||||||
void processFields(bool& found);
|
void processFields(bool& found);
|
||||||
|
|
||||||
|
//- Templated function to apply the operation
|
||||||
|
template<class Type>
|
||||||
|
Type applyOperation(const Type& value1, const Type& value2) const;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|||||||
@ -28,6 +28,57 @@ License
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Type Foam::fieldValues::fieldValueDelta::applyOperation
|
||||||
|
(
|
||||||
|
const Type& value1,
|
||||||
|
const Type& value2
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
Type result = pTraits<Type>::zero;
|
||||||
|
|
||||||
|
switch (operation_)
|
||||||
|
{
|
||||||
|
case opAdd:
|
||||||
|
{
|
||||||
|
result = value1 + value2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case opSubtract:
|
||||||
|
{
|
||||||
|
result = value1 - value2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case opMin:
|
||||||
|
{
|
||||||
|
result = min(value1, value2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case opMax:
|
||||||
|
{
|
||||||
|
result = max(value1, value2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"Type Foam::fieldValues::fieldValueDelta::applyOperation"
|
||||||
|
"("
|
||||||
|
"const Type&, "
|
||||||
|
"const Type&"
|
||||||
|
") const"
|
||||||
|
)
|
||||||
|
<< "Unable to process operation "
|
||||||
|
<< operationTypeNames_[operation_]
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void Foam::fieldValues::fieldValueDelta::processFields(bool& found)
|
void Foam::fieldValues::fieldValueDelta::processFields(bool& found)
|
||||||
{
|
{
|
||||||
@ -49,15 +100,18 @@ void Foam::fieldValues::fieldValueDelta::processFields(bool& found)
|
|||||||
results1.lookup(fieldName) >> r1;
|
results1.lookup(fieldName) >> r1;
|
||||||
results2.lookup(fieldName) >> r2;
|
results2.lookup(fieldName) >> r2;
|
||||||
|
|
||||||
|
Type result = applyOperation(r1, r2);
|
||||||
|
|
||||||
if (log_)
|
if (log_)
|
||||||
{
|
{
|
||||||
Info<< " field: " << fieldName << ", delta: " << r2 - r1
|
Info<< " " << operationTypeNames_[operation_]
|
||||||
|
<< "(" << fieldName << ") = " << result
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
file()<< tab << r2 - r1;
|
file()<< tab << result;
|
||||||
}
|
}
|
||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user