diff --git a/applications/test/vector/Test-vector.C b/applications/test/vector/Test-vector.C index 799dfd83f1..f5b29425ca 100644 --- a/applications/test/vector/Test-vector.C +++ b/applications/test/vector/Test-vector.C @@ -45,6 +45,7 @@ void printInfo(const vector& vec) << " sum:" << cmptSum(vec) << " prod:" << cmptProduct(vec) << " mag:" << cmptMag(vec) + << " magSqr:" << cmptMagSqr(vec) << nl << nl; } diff --git a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C index b6a4986407..acae8b4f37 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C +++ b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C @@ -322,6 +322,30 @@ tmp> cmptMag(const tmp>& tf) } +template +void cmptMagSqr(Field& res, const UList& f) +{ + TFOR_ALL_F_OP_FUNC_F(Type, res, =, cmptMagSqr, Type, f) +} + +template +tmp> cmptMagSqr(const UList& f) +{ + auto tres = tmp>::New(f.size()); + cmptMagSqr(tres.ref(), f); + return tres; +} + +template +tmp> cmptMagSqr(const tmp>& tf) +{ + auto tres = New(tf); + cmptMagSqr(tres.ref(), tf()); + tf.clear(); + return tres; +} + + #define TMP_UNARY_FUNCTION(ReturnType, Func) \ \ template \ diff --git a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H index e80d01df2b..aef3f53c89 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H +++ b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H @@ -167,6 +167,16 @@ template tmp> cmptMag(const tmp>& tf); +template +void cmptMagSqr(Field& res, const UList& f); + +template +tmp> cmptMagSqr(const UList& f); + +template +tmp> cmptMagSqr(const tmp>& tf); + + #define TMP_UNARY_FUNCTION(ReturnType, Func) \ \ /** \brief Apply the \c Func() function on the tmp field */ \ diff --git a/src/OpenFOAM/primitives/Scalar/Scalar.H b/src/OpenFOAM/primitives/Scalar/Scalar.H index 7caea028a0..2d96ab3054 100644 --- a/src/OpenFOAM/primitives/Scalar/Scalar.H +++ b/src/OpenFOAM/primitives/Scalar/Scalar.H @@ -382,6 +382,12 @@ inline Scalar cmptMag(const Scalar s) } +inline Scalar cmptMagSqr(const Scalar s) +{ + return magSqr(s); +} + + inline Scalar sqrtSumSqr(const Scalar a, const Scalar b) { const Scalar maga = mag(a); diff --git a/src/OpenFOAM/primitives/VectorSpace/VectorSpaceI.H b/src/OpenFOAM/primitives/VectorSpace/VectorSpaceI.H index d81a43cdfc..641aafaad4 100644 --- a/src/OpenFOAM/primitives/VectorSpace/VectorSpaceI.H +++ b/src/OpenFOAM/primitives/VectorSpace/VectorSpaceI.H @@ -635,6 +635,18 @@ inline Form cmptMag } +template +inline Form cmptMagSqr +( + const VectorSpace& vs +) +{ + Form v; + VectorSpaceOps::eqOp(v, vs, eqMagSqrOp()); + return v; +} + + template inline Form max ( diff --git a/src/OpenFOAM/primitives/ops/ops.H b/src/OpenFOAM/primitives/ops/ops.H index 7161d90cd5..9a007e4f40 100644 --- a/src/OpenFOAM/primitives/ops/ops.H +++ b/src/OpenFOAM/primitives/ops/ops.H @@ -74,6 +74,7 @@ EqOp(multiplyEq, x *= y) EqOp(divideEq, x /= y) EqOp(eqSqr, x = sqr(y)) EqOp(eqMag, x = mag(y)) +EqOp(eqMagSqr, x = magSqr(y)) EqOp(plusEqMagSqr, x += magSqr(y)) EqOp(maxEq, x = max(x, y)) EqOp(minEq, x = min(x, y))