From ab10b4a05cfdba1a27b0abedb3c6c033e5a80c1b Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Sat, 21 Jan 2023 22:30:33 +0100 Subject: [PATCH] EHN: add FieldFunction interface for 0/1 clamping - enables clamp(field, zero_one{}) returning a tmp Field --- applications/test/minMax2/Test-minMax2.C | 6 +- .../DimensionedFieldFunctions.C | 67 +++++++++++++++++- .../DimensionedFieldFunctions.H | 31 ++++++++- .../FieldField/FieldFieldFunctions.C | 1 + .../FieldField/FieldFieldFunctions.H | 1 + .../fields/Fields/Field/FieldFunctions.C | 26 +++++++ .../fields/Fields/Field/FieldFunctions.H | 1 + .../GeometricField/GeometricFieldFunctions.C | 68 +++++++++++++++++++ .../GeometricField/GeometricFieldFunctions.H | 30 ++++++++ .../primitives/ranges/MinMax/MinMax.H | 3 +- 10 files changed, 227 insertions(+), 7 deletions(-) diff --git a/applications/test/minMax2/Test-minMax2.C b/applications/test/minMax2/Test-minMax2.C index 531235e6f5..136681d75c 100644 --- a/applications/test/minMax2/Test-minMax2.C +++ b/applications/test/minMax2/Test-minMax2.C @@ -152,13 +152,13 @@ int main(int argc, char *argv[]) Info<< nl << "field: " << flatOutput(someField) << nl; Info<< "clamp01: " - << flatOutput(clamp(someField, scalarMinMax(zero_one{}))()) << nl; + << flatOutput(clamp(someField, zero_one{})()) << nl; Info<< "clamp01: " - << clamp(tmp(someField), scalarMinMax(zero_one{}))<< nl; + << clamp(tmp(someField), zero_one{})<< nl; scalarField result(10); - clamp(result, someField, scalarMinMax(zero_one{})); + clamp(result, someField, zero_one{}); Info<< "result: " << result << nl; diff --git a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C index 841324d1f2..c2217d2fd1 100644 --- a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C +++ b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C @@ -319,7 +319,72 @@ BINARY_TYPE_FUNCTION(Type, Type, Type, min) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptMultiply) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptDivide) -BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clip) + +// ------------------------------------------------------------------------- // + +// Clamp Methods + +template +void clamp +( + DimensionedField& result, + const DimensionedField& f1, + const Foam::zero_one +) +{ + const MinMax range(Foam::zero_one{}); + + clamp(result.field(), f1.field(), range); + result.oriented() = f1.oriented(); +} + +template +tmp> +clamp +( + const DimensionedField& f1, + const Foam::zero_one +) +{ + auto tres = + reuseTmpDimensionedField::New + ( + f1, + "clamp01(" + f1.name() + ')', + f1.dimensions() + ); + + clamp(tres.ref(), f1, Foam::zero_one{}); + + return tres; +} + + +template +tmp> +clamp +( + const tmp>& tf1, + const Foam::zero_one +) +{ + const auto& f1 = tf1(); + + auto tres = + reuseTmpDimensionedField::New + ( + tf1, + "clamp01(" + f1.name() + ')', + f1.dimensions() + ); + + clamp(tres.field(), f1, Foam::zero_one{}); + + tf1.clear(); + return tres; +} + +BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clamp) // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H index 3adb4ececb..537c736624 100644 --- a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H +++ b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H @@ -137,7 +137,36 @@ BINARY_TYPE_FUNCTION(Type, Type, Type, min) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptMultiply) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptDivide) -BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clip) + +// ------------------------------------------------------------------------- // + +// Clamp Methods + +template +void clamp +( + DimensionedField& result, + const DimensionedField& f1, + const Foam::zero_one +); + +template +tmp> +clamp +( + const DimensionedField& f1, + const Foam::zero_one +); + +template +tmp> +clamp +( + const tmp>& tf1, + const Foam::zero_one +); + +BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clamp) // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.C b/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.C index abfeab9928..dfda7e3602 100644 --- a/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.C +++ b/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.C @@ -630,6 +630,7 @@ BINARY_TYPE_FUNCTION(Type, Type, Type, min) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptMultiply) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptDivide) +// Note: works with zero_one through implicit conversion to MinMax BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clamp) diff --git a/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.H b/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.H index b1b0501e95..9776c63c37 100644 --- a/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.H +++ b/src/OpenFOAM/fields/FieldFields/FieldField/FieldFieldFunctions.H @@ -287,6 +287,7 @@ BINARY_TYPE_FUNCTION(Type, Type, Type, min) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptMultiply) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptDivide) +// Note: works with zero_one through implicit conversion to MinMax BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clamp) diff --git a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C index f3e136c2e9..4a4e8d1177 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C +++ b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C @@ -700,7 +700,33 @@ void clamp } } +template +void clamp +( + Field& result, + const UList& f1, + const Foam::zero_one& // Note: macros generate a const reference +) +{ + if (result.cdata() == f1.cdata()) + { + // Apply in-place + result.clamp_range(Foam::zero_one{}); + } + else + { + std::transform + ( + f1.cbegin(), + f1.cbegin(result.size()), + result.begin(), + clampOp(Foam::zero_one{}) + ); + } +} + BINARY_FUNCTION_INTERFACE_FS(Type, Type, MinMax, clamp) +BINARY_FUNCTION_INTERFACE_FS(Type, Type, Foam::zero_one, clamp) BINARY_FUNCTION(Type, Type, Type, max) diff --git a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H index 57a0c5db18..9307b9d155 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H +++ b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H @@ -314,6 +314,7 @@ BINARY_TYPE_FUNCTION(Type, Type, Type, cmptMultiply) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptDivide) BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clamp) +BINARY_TYPE_FUNCTION_FS(Type, Type, Foam::zero_one, clamp) BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clip) // Same as clamp diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C index 0c686d3be2..a62fd98b54 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C @@ -480,6 +480,74 @@ BINARY_TYPE_FUNCTION(Type, Type, Type, cmptMultiply) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptDivide) +// ------------------------------------------------------------------------- // + +// Clamp Methods + +template class PatchField, class GeoMesh> +void clamp +( + GeometricField& result, + const GeometricField& f1, + const Foam::zero_one +) +{ + const MinMax range(Foam::zero_one{}); + + clamp(result.primitiveFieldRef(), f1.primitiveField(), range); + clamp(result.boundaryFieldRef(), f1.boundaryField(), range); + result.oriented() = f1.oriented(); +} + +template class PatchField, class GeoMesh> +tmp> +clamp +( + const GeometricField& f1, + const Foam::zero_one +) +{ + auto tres = + reuseTmpGeometricField::New + ( + f1, + "clamp01(" + f1.name() + ')', + f1.dimensions() + ); + + clamp(tres.ref(), f1, Foam::zero_one{}); + + return tres; +} + + +template class PatchField, class GeoMesh> +tmp> +clamp +( + const tmp>& tf1, + const Foam::zero_one +) +{ + const auto& f1 = tf1(); + + auto tres = + reuseTmpGeometricField::New + ( + tf1, + "clamp01(" + f1.name() + ')', + f1.dimensions() + ); + + clamp(tres.ref(), f1, Foam::zero_one{}); + + tf1.clear(); + return tres; +} + +BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clamp) + + // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * // UNARY_OPERATOR(Type, Type, -, negate, transform) diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H index 9b91dc3c07..937a07e443 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H @@ -273,6 +273,36 @@ BINARY_TYPE_FUNCTION(Type, Type, Type, min) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptMultiply) BINARY_TYPE_FUNCTION(Type, Type, Type, cmptDivide) +// ------------------------------------------------------------------------- // + +// Clamp Methods + +template class PatchField, class GeoMesh> +void clamp +( + GeometricField& result, + const GeometricField& f1, + const Foam::zero_one +); + +template class PatchField, class GeoMesh> +tmp> +clamp +( + const GeometricField& f1, + const Foam::zero_one +); + +template class PatchField, class GeoMesh> +tmp> +clamp +( + const tmp>& tf1, + const Foam::zero_one +); + +BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax, clamp) + // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/primitives/ranges/MinMax/MinMax.H b/src/OpenFOAM/primitives/ranges/MinMax/MinMax.H index 3738f8847a..be7a3ee8c8 100644 --- a/src/OpenFOAM/primitives/ranges/MinMax/MinMax.H +++ b/src/OpenFOAM/primitives/ranges/MinMax/MinMax.H @@ -85,6 +85,7 @@ Description #define Foam_MinMax_H #include "scalar.H" +#include "zero.H" #include "Pair.H" #include "Tuple2.H" #include "VectorSpace.H" @@ -97,8 +98,6 @@ namespace Foam // Forward Declarations template class MinMax; -class zero; -class zero_one; // Common min/max types typedef MinMax