diff --git a/applications/test/complex/Test-complex.C b/applications/test/complex/Test-complex.C index 9f26407fd1..da200a2864 100644 --- a/applications/test/complex/Test-complex.C +++ b/applications/test/complex/Test-complex.C @@ -97,6 +97,7 @@ int main(int argc, char *argv[]) c.Im() *= 5; } + Info<< "sumProd: " << sumProd(fld1, fld2) << nl; fld1 *= 10; Info<< "scalar multiply: " << flatOutput(fld1) << nl; diff --git a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C index aa2ad4bc8f..a5b9663992 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C +++ b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.C @@ -423,14 +423,17 @@ Type minMagSqr(const UList& f) TMP_UNARY_FUNCTION(Type, minMagSqr) template -scalar sumProd(const UList& f1, const UList& f2) +typename pTraits::cmptType +sumProd(const UList& f1, const UList& f2) { - scalar SumProd = 0; + typedef typename pTraits::cmptType outType; + + outType result = Zero; if (f1.size() && (f1.size() == f2.size())) { - TFOR_ALL_S_OP_F_OP_F(scalar, SumProd, +=, Type, f1, &&, Type, f2) + TFOR_ALL_S_OP_F_OP_F(outType, result, +=, Type, f1, &&, Type, f2) } - return SumProd; + return result; } @@ -544,16 +547,18 @@ G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, minMaxMag) template -scalar gSumProd +typename pTraits::cmptType gSumProd ( const UList& f1, const UList& f2, const label comm ) { - scalar SumProd = sumProd(f1, f2); - reduce(SumProd, sumOp(), Pstream::msgType(), comm); - return SumProd; + typedef typename pTraits::cmptType outType; + + outType result = sumProd(f1, f2); + reduce(result, sumOp(), Pstream::msgType(), comm); + return result; } template @@ -658,7 +663,7 @@ tmp::type>> \ operator Op(const UList& f1, const tmp>& tf2) \ { \ typedef typename product::type productType; \ - auto tres = reuseTmp::New(tf2); \ + auto tres = reuseTmp::New(tf2); \ OpFunc(tres.ref(), f1, tf2()); \ tf2.clear(); \ return tres; \ @@ -669,7 +674,7 @@ tmp::type>> \ operator Op(const tmp>& tf1, const UList& f2) \ { \ typedef typename product::type productType; \ - auto tres = reuseTmp::New(tf1); \ + auto tres = reuseTmp::New(tf1); \ OpFunc(tres.ref(), tf1(), f2); \ tf1.clear(); \ return tres; \ diff --git a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H index 78e5db2a0c..f99c53d057 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H +++ b/src/OpenFOAM/fields/Fields/Field/FieldFunctions.H @@ -197,7 +197,11 @@ TMP_UNARY_FUNCTION(Type, minMagSqr) template -scalar sumProd(const UList& f1, const UList& f2); +typename pTraits::cmptType sumProd +( + const UList& f1, + const UList& f2 +); template Type sumCmptProd(const UList& f1, const UList& f2); @@ -244,7 +248,7 @@ G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, minMaxMag) #undef G_UNARY_FUNCTION template -scalar gSumProd +typename pTraits::cmptType gSumProd ( const UList& f1, const UList& f2, diff --git a/src/OpenFOAM/fields/Fields/complex/complexField.C b/src/OpenFOAM/fields/Fields/complex/complexField.C index 5662ab4076..881745b4ab 100644 --- a/src/OpenFOAM/fields/Fields/complex/complexField.C +++ b/src/OpenFOAM/fields/Fields/complex/complexField.C @@ -132,6 +132,18 @@ Foam::scalarField Foam::Im(const UList& cf) namespace Foam { +template<> +complex sumProd(const UList& f1, const UList& f2) +{ + complex result = Zero; + if (f1.size() && (f1.size() == f2.size())) + { + TFOR_ALL_S_OP_F_OP_F(complex, result, +=, complex, f1, *, complex, f2) + } + return result; +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // UNARY_FUNCTION(complex, complex, pow3) diff --git a/src/OpenFOAM/fields/Fields/complex/complexField.H b/src/OpenFOAM/fields/Fields/complex/complexField.H index c9b9351364..51b147263c 100644 --- a/src/OpenFOAM/fields/Fields/complex/complexField.H +++ b/src/OpenFOAM/fields/Fields/complex/complexField.H @@ -74,6 +74,12 @@ scalarField Im(const UList& cf); //- Sum real and imag components scalarField ReImSum(const UList& cf); +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//- Sum product +template<> +complex sumProd(const UList& f1, const UList& f2); + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/fields/Fields/scalarField/scalarField.C b/src/OpenFOAM/fields/Fields/scalarField/scalarField.C index c7f151c90d..97433f1c91 100644 --- a/src/OpenFOAM/fields/Fields/scalarField/scalarField.C +++ b/src/OpenFOAM/fields/Fields/scalarField/scalarField.C @@ -92,14 +92,26 @@ tmp stabilise(const tmp& tsf, const scalar s) // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template<> -scalar sumProd(const UList& f1, const UList& f2) +float sumProd(const UList& f1, const UList& f2) { - scalar SumProd = 0.0; + float result = 0.0; if (f1.size() && (f1.size() == f2.size())) { - TFOR_ALL_S_OP_F_OP_F(scalar, SumProd, +=, scalar, f1, *, scalar, f2) + TFOR_ALL_S_OP_F_OP_F(float, result, +=, float, f1, *, float, f2) } - return SumProd; + return result; +} + + +template<> +double sumProd(const UList& f1, const UList& f2) +{ + double result = 0.0; + if (f1.size() && (f1.size() == f2.size())) + { + TFOR_ALL_S_OP_F_OP_F(double, result, +=, double, f1, *, double, f2) + } + return result; } diff --git a/src/OpenFOAM/fields/Fields/scalarField/scalarField.H b/src/OpenFOAM/fields/Fields/scalarField/scalarField.H index db6e2e98ba..aa6c5adc26 100644 --- a/src/OpenFOAM/fields/Fields/scalarField/scalarField.H +++ b/src/OpenFOAM/fields/Fields/scalarField/scalarField.H @@ -76,8 +76,13 @@ tmp stabilise(const tmp&, const scalar s); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +//- Sum product for float template<> -scalar sumProd(const UList& f1, const UList& f2); +float sumProd(const UList& f1, const UList& f2); + +//- Sum product for double +template<> +double sumProd(const UList& f1, const UList& f2); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //