diff --git a/applications/test/minMax2/Test-minMax2.C b/applications/test/minMax2/Test-minMax2.C index 201b0548d6..531235e6f5 100644 --- a/applications/test/minMax2/Test-minMax2.C +++ b/applications/test/minMax2/Test-minMax2.C @@ -162,9 +162,16 @@ int main(int argc, char *argv[]) Info<< "result: " << result << nl; - someField.clamp(zero_one{}); - + someField.clamp_range(zero_one{}); Info<< "inplace: " << someField << nl; + + scalar val(1.414); + + Info<< "clamp " << val + // nope << " : " << clamp(val, zero_one{}) + // nope << " : " << clamp(val, scalarMinMax(zero_one{})) + << " : " << clamp(val, 0, 1) + << nl; } Info<< nl << "\nDone\n" << endl; diff --git a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C index 5566474746..17d07fb2f0 100644 --- a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C +++ b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C @@ -282,39 +282,6 @@ void FieldField::replace } -template class Field, class Type> -void FieldField::clamp -( - const Type& lower, - const Type& upper -) -{ - if (lower < upper) - { - for (auto& ff : *this) - { - ff.clamp(lower, upper); - } - } -} - - -template class Field, class Type> -void FieldField::clamp -( - const MinMax& range -) -{ - if (range.min() < range.max()) - { - for (auto& ff : *this) - { - ff.clamp(range.min(), range.max()); - } - } -} - - template class Field, class Type> void FieldField::clamp_min ( @@ -341,6 +308,37 @@ void FieldField::clamp_max } +template class Field, class Type> +void FieldField::clamp_range +( + const Type& lower, + const Type& upper +) +{ + // Note: no checks for bad/invalid clamping ranges + + for (auto& ff : *this) + { + ff.clamp_range(lower, upper); + } +} + + +template class Field, class Type> +void FieldField::clamp_range +( + const MinMax& range +) +{ + // Note: no checks for bad/invalid clamping ranges + + for (auto& ff : *this) + { + ff.clamp_range(range.min(), range.max()); + } +} + + template class Field, class Type> tmp> FieldField::T() const { diff --git a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H index 11504cbe79..d8dbbcdf0e 100644 --- a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H +++ b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H @@ -149,20 +149,20 @@ public: //- Replace a component field of the field void replace(const direction, const cmptType&); - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. - void clamp(const Type& lower, const Type& upper); - - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. - void clamp(const MinMax& range); - //- Impose lower (floor) clamp on the field values (in-place) void clamp_min(const Type& lower); //- Impose upper (ceiling) clamp on the field values (in-place) void clamp_max(const Type& upper); + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. + void clamp_range(const Type& lower, const Type& upper); + + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. + void clamp_range(const MinMax& range); + //- Return the field transpose (only defined for second rank tensors) tmp> T() const; diff --git a/src/OpenFOAM/fields/Fields/Field/Field.C b/src/OpenFOAM/fields/Fields/Field/Field.C index fad7a81541..64dc2d73a3 100644 --- a/src/OpenFOAM/fields/Fields/Field/Field.C +++ b/src/OpenFOAM/fields/Fields/Field/Field.C @@ -658,27 +658,6 @@ void Foam::Field::replace } -template -void Foam::Field::clamp(const Type& lower, const Type& upper) -{ - // Use free functions min(), max() to impose component-wise clamping - if (lower < upper) - { - // std::for_each - for (auto& val : *this) - { - val = min(max(val, lower), upper); - } - } -} - -template -void Foam::Field::clamp(const MinMax& range) -{ - clamp(range.min(), range.max()); -} - - template void Foam::Field::clamp_min(const Type& lower) { @@ -702,6 +681,26 @@ void Foam::Field::clamp_max(const Type& upper) } +template +void Foam::Field::clamp_range(const Type& lower, const Type& upper) +{ + // Note: no checks for bad/invalid clamping ranges + + // Use free functions min(), max() to impose component-wise clamping + // std::for_each + for (auto& val : *this) + { + val = min(max(val, lower), upper); + } +} + +template +void Foam::Field::clamp_range(const MinMax& range) +{ + Field::clamp_range(range.min(), range.max()); +} + + template template VSForm Foam::Field::block(const label start) const diff --git a/src/OpenFOAM/fields/Fields/Field/Field.H b/src/OpenFOAM/fields/Fields/Field/Field.H index f398928d1a..0f5d81237f 100644 --- a/src/OpenFOAM/fields/Fields/Field/Field.H +++ b/src/OpenFOAM/fields/Fields/Field/Field.H @@ -434,20 +434,20 @@ public: //- Replace a component field of the field void replace(const direction, const cmptType&); - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. - void clamp(const Type& lower, const Type& upper); - - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. - void clamp(const MinMax& range); - //- Impose lower (floor) clamp on the field values (in-place) void clamp_min(const Type& lower); //- Impose upper (ceiling) clamp on the field values (in-place) void clamp_max(const Type& upper); + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. + void clamp_range(const Type& lower, const Type& upper); + + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. + void clamp_range(const MinMax& range); + template VSForm block(const label start) const; diff --git a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C index bfcc7860d3..d3576ac210 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C +++ b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C @@ -664,28 +664,22 @@ void clamp const MinMax& range ) { + // Note: no checks for bad/invalid clamping ranges + if (result.cdata() == f1.cdata()) { // Apply in-place - result.clamp(range); + result.clamp_range(range); } else { - if (range.good()) - { - std::transform - ( - f1.cbegin(), - f1.cbegin(result.size()), - result.begin(), - clampOp(range) - ); - } - else - { - // No clamping - std::copy(f1.cbegin(), f1.cbegin(result.size()), result.begin()); - } + std::transform + ( + f1.cbegin(), + f1.cbegin(result.size()), + result.begin(), + clampOp(range) + ); } } diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C index 0f39b3f116..af2ef82dd9 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C @@ -1249,50 +1249,6 @@ void Foam::GeometricField::replace } -template class PatchField, class GeoMesh> -void Foam::GeometricField::clamp -( - const Type& lower, - const Type& upper -) -{ - primitiveFieldRef().clamp(lower, upper); - boundaryFieldRef().clamp(lower, upper); -} - - -template class PatchField, class GeoMesh> -void Foam::GeometricField::clamp -( - const MinMax& range -) -{ - primitiveFieldRef().clamp(range.min(), range.max()); - boundaryFieldRef().clamp(range.min(), range.max()); -} - - -template class PatchField, class GeoMesh> -void Foam::GeometricField::clamp -( - const dimensioned& lower, - const dimensioned& upper -) -{ - this->clamp(lower.value(), upper.value()); -} - - -template class PatchField, class GeoMesh> -void Foam::GeometricField::clamp -( - const dimensioned>& range -) -{ - this->clamp(range.value()); -} - - template class PatchField, class GeoMesh> void Foam::GeometricField::clamp_min ( @@ -1335,6 +1291,50 @@ void Foam::GeometricField::clamp_max } +template class PatchField, class GeoMesh> +void Foam::GeometricField::clamp_range +( + const Type& lower, + const Type& upper +) +{ + primitiveFieldRef().clamp_range(lower, upper); + boundaryFieldRef().clamp_range(lower, upper); +} + + +template class PatchField, class GeoMesh> +void Foam::GeometricField::clamp_range +( + const MinMax& range +) +{ + primitiveFieldRef().clamp_range(range.min(), range.max()); + boundaryFieldRef().clamp_range(range.min(), range.max()); +} + + +template class PatchField, class GeoMesh> +void Foam::GeometricField::clamp_range +( + const dimensioned& lower, + const dimensioned& upper +) +{ + this->clamp_range(lower.value(), upper.value()); +} + + +template class PatchField, class GeoMesh> +void Foam::GeometricField::clamp_range +( + const dimensioned>& range +) +{ + this->clamp_range(range.value()); +} + + template class PatchField, class GeoMesh> void Foam::GeometricField::negate() { diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H index cf4a09c683..d7fffa0d23 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H @@ -629,26 +629,6 @@ public: const dimensioned& ds ); - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. - void clamp(const Type& lower, const Type& upper); - - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. - void clamp(const MinMax& range); - - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. No dimension checking. - void clamp - ( - const dimensioned& lower, - const dimensioned& upper - ); - - //- Clamp field values (in-place) to the specified range. - // A no-op for an invalid range. No dimension checking. - void clamp(const dimensioned>& range); - //- Impose lower (floor) clamp on the field values (in-place) void clamp_min(const Type& lower); @@ -663,6 +643,26 @@ public: // No dimension checking void clamp_max(const dimensioned& upper); + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. No dimension checking. + void clamp_range(const dimensioned>& range); + + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. + void clamp_range(const Type& lower, const Type& upper); + + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. + void clamp_range(const MinMax& range); + + //- Clamp field values (in-place) to the specified range. + // Does not check if range is valid or not. No dimension checking. + void clamp_range + ( + const dimensioned& lower, + const dimensioned& upper + ); + // Member Operators @@ -715,17 +715,17 @@ public: // Housekeeping //- Clamp field values (in-place) to the specified range. - // \deprecated(2023-01) prefer clamp() naming + // \deprecated(2023-01) prefer clamp_range() naming void clip(const dimensioned>& range) { - this->clamp(range); + this->clamp_range(range); } //- Clamp field values (in-place) to the specified range. - // \deprecated(2023-01) prefer clamp() naming + // \deprecated(2023-01) prefer clamp_range() naming void clip(const dimensioned& lo, const dimensioned& hi) { - this->clamp(lo.value(), hi.value()); + this->clamp_range(lo.value(), hi.value()); } //- Use minimum of the field and specified value. ie, clamp_max(). @@ -738,12 +738,12 @@ public: // \deprecated(2023-01) prefer clamp_min() void max(const dimensioned& lower) { this->clamp_min(lower); } - //- Deprecated(2019-01) identical to clamp() - // \deprecated(2019-01) identical to clamp() - FOAM_DEPRECATED_FOR(2019-01, "clamp() method") + //- Deprecated(2019-01) identical to clamp_range() + // \deprecated(2019-01) identical to clamp_range() + FOAM_DEPRECATED_FOR(2019-01, "clamp_range() method") void maxMin(const dimensioned& lo, const dimensioned& hi) { - return this->clamp(lo.value(), hi.value()); + return this->clamp_range(lo.value(), hi.value()); } };