ENH: use magType for sumMag() functions

- use outerProduct for sumSqr() for consistency with sqr()
This commit is contained in:
Mark Olesen
2019-06-04 20:32:13 +02:00
committed by Andrew Heather
parent dc32b20a5c
commit 1ed1b4d5b6
11 changed files with 268 additions and 193 deletions

View File

@ -614,9 +614,12 @@ Foam::sqr(const dimensioned<Type>& dt)
} }
template<class Type> template<class Type>
Foam::dimensioned<Foam::scalar> Foam::magSqr(const dimensioned<Type>& dt) Foam::dimensioned<typename Foam::typeOfMag<Type>::type>
Foam::magSqr(const dimensioned<Type>& dt)
{ {
return dimensioned<scalar> typedef typename typeOfMag<Type>::type magType;
return dimensioned<magType>
( (
"magSqr(" + dt.name() + ')', "magSqr(" + dt.name() + ')',
magSqr(dt.dimensions()), magSqr(dt.dimensions()),
@ -625,9 +628,12 @@ Foam::dimensioned<Foam::scalar> Foam::magSqr(const dimensioned<Type>& dt)
} }
template<class Type> template<class Type>
Foam::dimensioned<Foam::scalar> Foam::mag(const dimensioned<Type>& dt) Foam::dimensioned<typename Foam::typeOfMag<Type>::type>
Foam::mag(const dimensioned<Type>& dt)
{ {
return dimensioned<scalar> typedef typename typeOfMag<Type>::type magType;
return dimensioned<magType>
( (
"mag(" + dt.name() + ')', "mag(" + dt.name() + ')',
dt.dimensions(), dt.dimensions(),

View File

@ -437,10 +437,12 @@ dimensioned<typename outerProduct<Type, Type>::type>
sqr(const dimensioned<Type>&); sqr(const dimensioned<Type>&);
template<class Type> template<class Type>
dimensioned<scalar> magSqr(const dimensioned<Type>&); dimensioned<typename typeOfMag<Type>::type>
magSqr(const dimensioned<Type>& dt);
template<class Type> template<class Type>
dimensioned<scalar> mag(const dimensioned<Type>&); dimensioned<typename typeOfMag<Type>::type>
mag(const dimensioned<Type>& dt);
template<class Type> template<class Type>
dimensioned<Type> cmptMultiply dimensioned<Type> cmptMultiply

View File

@ -141,13 +141,13 @@ sqr(const tmp<DimensionedField<Type, GeoMesh>>& tdf)
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> magSqr tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( magSqr(const DimensionedField<Type, GeoMesh>& df)
const DimensionedField<Type, GeoMesh>& df
)
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres = auto tres =
tmp<DimensionedField<scalar, GeoMesh>>::New tmp<DimensionedField<magType, GeoMesh>>::New
( (
IOobject IOobject
( (
@ -165,15 +165,15 @@ tmp<DimensionedField<scalar, GeoMesh>> magSqr
} }
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> magSqr tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( magSqr(const tmp<DimensionedField<Type, GeoMesh>>& tdf)
const tmp<DimensionedField<Type, GeoMesh>>& tdf
)
{ {
typedef typename typeOfMag<Type>::type magType;
const DimensionedField<Type, GeoMesh>& df = tdf(); const DimensionedField<Type, GeoMesh>& df = tdf();
auto tres = auto tres =
reuseTmpDimensionedField<scalar, Type, GeoMesh>::New reuseTmpDimensionedField<magType, Type, GeoMesh>::New
( (
tdf, tdf,
"magSqr(" + df.name() + ')', "magSqr(" + df.name() + ')',
@ -188,13 +188,13 @@ tmp<DimensionedField<scalar, GeoMesh>> magSqr
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> mag tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( mag(const DimensionedField<Type, GeoMesh>& df)
const DimensionedField<Type, GeoMesh>& df
)
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres = auto tres =
tmp<DimensionedField<scalar, GeoMesh>>::New tmp<DimensionedField<magType, GeoMesh>>::New
( (
IOobject IOobject
( (
@ -212,15 +212,15 @@ tmp<DimensionedField<scalar, GeoMesh>> mag
} }
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> mag tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( mag(const tmp<DimensionedField<Type, GeoMesh>>& tdf)
const tmp<DimensionedField<Type, GeoMesh>>& tdf
)
{ {
typedef typename typeOfMag<Type>::type magType;
const DimensionedField<Type, GeoMesh>& df = tdf(); const DimensionedField<Type, GeoMesh>& df = tdf();
auto tres = auto tres =
reuseTmpDimensionedField<scalar, Type, GeoMesh>::New reuseTmpDimensionedField<magType, Type, GeoMesh>::New
( (
tdf, tdf,
"mag(" + df.name() + ')', "mag(" + df.name() + ')',
@ -325,11 +325,10 @@ UNARY_REDUCTION_FUNCTION(Type, max, gMax)
UNARY_REDUCTION_FUNCTION(Type, min, gMin) UNARY_REDUCTION_FUNCTION(Type, min, gMin)
UNARY_REDUCTION_FUNCTION(Type, sum, gSum) UNARY_REDUCTION_FUNCTION(Type, sum, gSum)
UNARY_REDUCTION_FUNCTION(Type, average, gAverage) UNARY_REDUCTION_FUNCTION(Type, average, gAverage)
UNARY_REDUCTION_FUNCTION(MinMax<Type>, minMax, gMinMax) UNARY_REDUCTION_FUNCTION(MinMax<Type>, minMax, gMinMax)
UNARY_REDUCTION_FUNCTION(scalarMinMax, minMaxMag, gMinMaxMag) UNARY_REDUCTION_FUNCTION(scalarMinMax, minMaxMag, gMinMaxMag)
UNARY_REDUCTION_FUNCTION(scalar, sumMag, gSumMag) UNARY_REDUCTION_FUNCTION(typename typeOfMag<Type>::type, sumMag, gSumMag)
#undef UNARY_REDUCTION_FUNCTION #undef UNARY_REDUCTION_FUNCTION

View File

@ -62,34 +62,29 @@ tmp<DimensionedField<typename outerProduct<Type, Type>::type, GeoMesh>>
sqr(const tmp<DimensionedField<Type, GeoMesh>>& tdf); sqr(const tmp<DimensionedField<Type, GeoMesh>>& tdf);
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> magSqr tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( magSqr(const DimensionedField<Type, GeoMesh>& df);
const DimensionedField<Type, GeoMesh>& df
);
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> magSqr tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( magSqr(const tmp<DimensionedField<Type, GeoMesh>>& tdf);
const tmp<DimensionedField<Type, GeoMesh>>& tdf
);
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> mag tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( mag(const DimensionedField<Type, GeoMesh>& df);
const DimensionedField<Type, GeoMesh>& df
);
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp<DimensionedField<scalar, GeoMesh>> mag tmp<DimensionedField<typename typeOfMag<Type>::type, GeoMesh>>
( mag(const tmp<DimensionedField<Type, GeoMesh>>& tdf);
const tmp<DimensionedField<Type, GeoMesh>>& tdf
);
template<class Type, class GeoMesh> template<class Type, class GeoMesh>
tmp tmp
< <
DimensionedField DimensionedField
<typename DimensionedField<Type, GeoMesh>::cmptType, GeoMesh> <
typename DimensionedField<Type, GeoMesh>::cmptType,
GeoMesh
>
> >
cmptAv(const DimensionedField<Type, GeoMesh>& df); cmptAv(const DimensionedField<Type, GeoMesh>& df);
@ -97,7 +92,10 @@ template<class Type, class GeoMesh>
tmp tmp
< <
DimensionedField DimensionedField
<typename DimensionedField<Type, GeoMesh>::cmptType, GeoMesh> <
typename DimensionedField<Type, GeoMesh>::cmptType,
GeoMesh
>
> >
cmptAv(const tmp<DimensionedField<Type, GeoMesh>>& tdf); cmptAv(const tmp<DimensionedField<Type, GeoMesh>>& tdf);
@ -123,7 +121,7 @@ UNARY_REDUCTION_FUNCTION(Type, average, gAverage)
UNARY_REDUCTION_FUNCTION(MinMax<Type>, minMax, gMinMax) UNARY_REDUCTION_FUNCTION(MinMax<Type>, minMax, gMinMax)
UNARY_REDUCTION_FUNCTION(scalarMinMax, minMaxMag, gMinMaxMag) UNARY_REDUCTION_FUNCTION(scalarMinMax, minMaxMag, gMinMaxMag)
UNARY_REDUCTION_FUNCTION(scalar, sumMag, gSumMag) UNARY_REDUCTION_FUNCTION(typename typeOfMag<Type>::type, sumMag, gSumMag)
#undef UNARY_REDUCTION_FUNCTION #undef UNARY_REDUCTION_FUNCTION

View File

@ -158,7 +158,11 @@ sqr(const tmp<FieldField<Field, Type>>& tf)
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
void magSqr(FieldField<Field, scalar>& sf, const FieldField<Field, Type>& f) void magSqr
(
FieldField<Field, typename typeOfMag<Type>::type>& sf,
const FieldField<Field, Type>& f
)
{ {
forAll(sf, i) forAll(sf, i)
{ {
@ -167,11 +171,14 @@ void magSqr(FieldField<Field, scalar>& sf, const FieldField<Field, Type>& f)
} }
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> magSqr(const FieldField<Field, Type>& f) tmp<FieldField<Field, typename typeOfMag<Type>::type>>
magSqr(const FieldField<Field, Type>& f)
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres auto tres
( (
FieldField<Field, scalar>::NewCalculatedType(f) FieldField<Field, magType>::NewCalculatedType(f)
); );
magSqr(tres.ref(), f); magSqr(tres.ref(), f);
@ -179,11 +186,14 @@ tmp<FieldField<Field, scalar>> magSqr(const FieldField<Field, Type>& f)
} }
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> magSqr(const tmp<FieldField<Field, Type>>& tf) tmp<FieldField<Field, typename typeOfMag<Type>::type>>
magSqr(const tmp<FieldField<Field, Type>>& tf)
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres auto tres
( (
reuseTmpFieldField<Field, scalar, Type>::New(tf) reuseTmpFieldField<Field, magType, Type>::New(tf)
); );
magSqr(tres.ref(), tf()); magSqr(tres.ref(), tf());
@ -193,7 +203,11 @@ tmp<FieldField<Field, scalar>> magSqr(const tmp<FieldField<Field, Type>>& tf)
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
void mag(FieldField<Field, scalar>& sf, const FieldField<Field, Type>& f) void mag
(
FieldField<Field, typename typeOfMag<Type>::type>& sf,
const FieldField<Field, Type>& f
)
{ {
forAll(sf, i) forAll(sf, i)
{ {
@ -202,11 +216,14 @@ void mag(FieldField<Field, scalar>& sf, const FieldField<Field, Type>& f)
} }
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> mag(const FieldField<Field, Type>& f) tmp<FieldField<Field, typename typeOfMag<Type>::type>>
mag(const FieldField<Field, Type>& f)
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres auto tres
( (
FieldField<Field, scalar>::NewCalculatedType(f) FieldField<Field, magType>::NewCalculatedType(f)
); );
mag(tres.ref(), f); mag(tres.ref(), f);
@ -214,11 +231,14 @@ tmp<FieldField<Field, scalar>> mag(const FieldField<Field, Type>& f)
} }
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> mag(const tmp<FieldField<Field, Type>>& tf) tmp<FieldField<Field, typename typeOfMag<Type>::type>>
mag(const tmp<FieldField<Field, Type>>& tf)
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres auto tres
( (
reuseTmpFieldField<Field, scalar, Type>::New(tf) reuseTmpFieldField<Field, magType, Type>::New(tf)
); );
mag(tres.ref(), tf()); mag(tres.ref(), tf());
@ -480,19 +500,21 @@ Type sum(const FieldField<Field, Type>& f)
TMP_UNARY_FUNCTION(Type, sum) TMP_UNARY_FUNCTION(Type, sum)
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
scalar sumMag(const FieldField<Field, Type>& f) typename typeOfMag<Type>::type sumMag(const FieldField<Field, Type>& f)
{ {
scalar SumMag = 0.0; typedef typename typeOfMag<Type>::type magType;
magType result = Zero;
forAll(f, i) forAll(f, i)
{ {
SumMag += sumMag(f[i]); result += sumMag(f[i]);
} }
return SumMag; return result;
} }
TMP_UNARY_FUNCTION(scalar, sumMag) TMP_UNARY_FUNCTION(typename typeOfMag<Type>::type, sumMag)
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
Type average(const FieldField<Field, Type>& f) Type average(const FieldField<Field, Type>& f)
@ -555,25 +577,24 @@ TMP_UNARY_FUNCTION(scalarMinMax, minMaxMag)
// With reduction on ReturnType // With reduction on ReturnType
#define G_UNARY_FUNCTION(returnType, gFunc, func, rFunc) \ #define G_UNARY_FUNCTION(ReturnType, gFunc, func, rFunc) \
\ \
template<template<class> class Field, class Type> \ template<template<class> class Field, class Type> \
returnType gFunc(const FieldField<Field, Type>& f) \ ReturnType gFunc(const FieldField<Field, Type>& f) \
{ \ { \
returnType res = func(f); \ ReturnType res = func(f); \
reduce(res, rFunc##Op<returnType>()); \ reduce(res, rFunc##Op<ReturnType>()); \
return res; \ return res; \
} \ } \
TMP_UNARY_FUNCTION(returnType, gFunc) TMP_UNARY_FUNCTION(ReturnType, gFunc)
G_UNARY_FUNCTION(Type, gMax, max, max) G_UNARY_FUNCTION(Type, gMax, max, max)
G_UNARY_FUNCTION(Type, gMin, min, min) G_UNARY_FUNCTION(Type, gMin, min, min)
G_UNARY_FUNCTION(Type, gSum, sum, sum) G_UNARY_FUNCTION(Type, gSum, sum, sum)
G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum) G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum)
G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum) G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum)
G_UNARY_FUNCTION(scalar, gSumMag, sumMag, sum) G_UNARY_FUNCTION(typename typeOfMag<Type>::type, gSumMag, sumMag, sum)
#undef G_UNARY_FUNCTION #undef G_UNARY_FUNCTION

View File

@ -90,23 +90,35 @@ sqr(const tmp<FieldField<Field, Type>>& tf);
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
void magSqr(FieldField<Field, scalar>& sf, const FieldField<Field, Type>& f); void magSqr
(
FieldField<Field, typename typeOfMag<Type>::type>& sf,
const FieldField<Field, Type>& f
);
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> magSqr(const FieldField<Field, Type>& f); tmp<FieldField<Field, typename typeOfMag<Type>::type>>
magSqr(const FieldField<Field, Type>& f);
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> magSqr(const tmp<FieldField<Field, Type>>& tf); tmp<FieldField<Field, typename typeOfMag<Type>::type>>
magSqr(const tmp<FieldField<Field, Type>>& tf);
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
void mag(FieldField<Field, scalar>& sf, const FieldField<Field, Type>& f); void mag
(
FieldField<Field, typename typeOfMag<Type>::type>& res,
const FieldField<Field, Type>& f
);
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> mag(const FieldField<Field, Type>& f); tmp<FieldField<Field, typename typeOfMag<Type>::type>>
mag(const FieldField<Field, Type>& f);
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
tmp<FieldField<Field, scalar>> mag(const tmp<FieldField<Field, Type>>& tf); tmp<FieldField<Field, typename typeOfMag<Type>::type>>
mag(const tmp<FieldField<Field, Type>>& tf);
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
@ -214,9 +226,9 @@ TMP_UNARY_FUNCTION(Type, sum)
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
scalar sumMag(const FieldField<Field, Type>& f); typename typeOfMag<Type>::type sumMag(const FieldField<Field, Type>& f);
TMP_UNARY_FUNCTION(scalar, sumMag) TMP_UNARY_FUNCTION(typename typeOfMag<Type>::type, sumMag)
template<template<class> class Field, class Type> template<template<class> class Field, class Type>
@ -239,20 +251,19 @@ TMP_UNARY_FUNCTION(scalarMinMax, minMaxMag)
// With reduction on ReturnType // With reduction on ReturnType
#define G_UNARY_FUNCTION(returnType, gFunc, func, rFunc) \ #define G_UNARY_FUNCTION(ReturnType, gFunc, func, rFunc) \
\ \
template<template<class> class Field, class Type> \ template<template<class> class Field, class Type> \
returnType gFunc(const FieldField<Field, Type>& f); \ ReturnType gFunc(const FieldField<Field, Type>& f); \
TMP_UNARY_FUNCTION(returnType, gFunc) TMP_UNARY_FUNCTION(ReturnType, gFunc)
G_UNARY_FUNCTION(Type, gMax, max, max) G_UNARY_FUNCTION(Type, gMax, max, max)
G_UNARY_FUNCTION(Type, gMin, min, min) G_UNARY_FUNCTION(Type, gMin, min, min)
G_UNARY_FUNCTION(Type, gSum, sum, sum) G_UNARY_FUNCTION(Type, gSum, sum, sum)
G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum) G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum)
G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum) G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum)
G_UNARY_FUNCTION(scalar, gSumMag, sumMag, sum) G_UNARY_FUNCTION(typename typeOfMag<Type>::type, gSumMag, sumMag, sum)
#undef G_UNARY_FUNCTION #undef G_UNARY_FUNCTION

View File

@ -146,23 +146,35 @@ sqr(const tmp<Field<Type>>& tf)
template<class Type> template<class Type>
void magSqr(Field<scalar>& res, const UList<Type>& f) void magSqr
(
Field<typename typeOfMag<Type>::type>& res,
const UList<Type>& f
)
{ {
TFOR_ALL_F_OP_FUNC_F(scalar, res, =, magSqr, Type, f) typedef typename typeOfMag<Type>::type magType;
TFOR_ALL_F_OP_FUNC_F(magType, res, =, magSqr, Type, f)
} }
template<class Type> template<class Type>
tmp<Field<scalar>> magSqr(const UList<Type>& f) tmp<Field<typename typeOfMag<Type>::type>>
magSqr(const UList<Type>& f)
{ {
auto tres = tmp<Field<scalar>>::New(f.size()); typedef typename typeOfMag<Type>::type magType;
auto tres = tmp<Field<magType>>::New(f.size());
magSqr(tres.ref(), f); magSqr(tres.ref(), f);
return tres; return tres;
} }
template<class Type> template<class Type>
tmp<Field<scalar>> magSqr(const tmp<Field<Type>>& tf) tmp<Field<typename typeOfMag<Type>::type>>
magSqr(const tmp<Field<Type>>& tf)
{ {
auto tres = reuseTmp<scalar, Type>::New(tf); typedef typename typeOfMag<Type>::type magType;
auto tres = reuseTmp<magType, Type>::New(tf);
magSqr(tres.ref(), tf()); magSqr(tres.ref(), tf());
tf.clear(); tf.clear();
return tres; return tres;
@ -170,23 +182,35 @@ tmp<Field<scalar>> magSqr(const tmp<Field<Type>>& tf)
template<class Type> template<class Type>
void mag(Field<scalar>& res, const UList<Type>& f) void mag
(
Field<typename typeOfMag<Type>::type>& res,
const UList<Type>& f
)
{ {
TFOR_ALL_F_OP_FUNC_F(scalar, res, =, mag, Type, f) typedef typename typeOfMag<Type>::type magType;
TFOR_ALL_F_OP_FUNC_F(magType, res, =, mag, Type, f)
} }
template<class Type> template<class Type>
tmp<Field<scalar>> mag(const UList<Type>& f) tmp<Field<typename typeOfMag<Type>::type>>
mag(const UList<Type>& f)
{ {
auto tres = tmp<Field<scalar>>::New(f.size()); typedef typename typeOfMag<Type>::type magType;
auto tres = tmp<Field<magType>>::New(f.size());
mag(tres.ref(), f); mag(tres.ref(), f);
return tres; return tres;
} }
template<class Type> template<class Type>
tmp<Field<scalar>> mag(const tmp<Field<Type>>& tf) tmp<Field<typename typeOfMag<Type>::type>>
mag(const tmp<Field<Type>>& tf)
{ {
auto tres = reuseTmp<scalar, Type>::New(tf); typedef typename typeOfMag<Type>::type magType;
auto tres = reuseTmp<magType, Type>::New(tf);
mag(tres.ref(), tf()); mag(tres.ref(), tf());
tf.clear(); tf.clear();
return tres; return tres;
@ -341,14 +365,14 @@ TMP_UNARY_FUNCTION(Type, min)
template<class Type> template<class Type>
Type sum(const UList<Type>& f) Type sum(const UList<Type>& f)
{ {
Type Sum = Zero;
if (f.size()) if (f.size())
{ {
Type Sum = Zero;
TFOR_ALL_S_OP_F(Type, Sum, +=, Type, f) TFOR_ALL_S_OP_F(Type, Sum, +=, Type, f)
return Sum;
} }
return Zero; return Sum;
} }
TMP_UNARY_FUNCTION(Type, sum) TMP_UNARY_FUNCTION(Type, sum)
@ -413,15 +437,15 @@ Type minMagSqr(const UList<Type>& f)
TMP_UNARY_FUNCTION(Type, minMagSqr) TMP_UNARY_FUNCTION(Type, minMagSqr)
template<class Type> template<class Type>
typename pTraits<Type>::cmptType typename scalarProduct<Type, Type>::type
sumProd(const UList<Type>& f1, const UList<Type>& f2) sumProd(const UList<Type>& f1, const UList<Type>& f2)
{ {
typedef typename pTraits<Type>::cmptType outType; typedef typename scalarProduct<Type, Type>::type prodType;
outType result = Zero; prodType result = Zero;
if (f1.size() && (f1.size() == f2.size())) if (f1.size() && (f1.size() == f2.size()))
{ {
TFOR_ALL_S_OP_F_OP_F(outType, result, +=, Type, f1, &&, Type, f2) TFOR_ALL_S_OP_F_OP_F(prodType, result, +=, Type, f1, &&, Type, f2)
} }
return result; return result;
} }
@ -450,41 +474,54 @@ Type sumCmptProd(const UList<Type>& f1, const UList<Type>& f2)
template<class Type> template<class Type>
scalar sumSqr(const UList<Type>& f) typename outerProduct1<Type>::type
sumSqr(const UList<Type>& f)
{ {
scalar SumSqr = 0; typedef typename outerProduct1<Type>::type prodType;
prodType result = Zero;
if (f.size()) if (f.size())
{ {
TFOR_ALL_S_OP_FUNC_F(scalar, SumSqr, +=, sqr, Type, f) TFOR_ALL_S_OP_FUNC_F(prodType, result, +=, sqr, Type, f)
} }
return SumSqr; return result;
} }
TMP_UNARY_FUNCTION(scalar, sumSqr)
template<class Type> template<class Type>
scalar sumMag(const UList<Type>& f) typename outerProduct1<Type>::type
sumSqr(const tmp<Field<Type>>& tf)
{ {
scalar SumMag = 0; typedef typename outerProduct1<Type>::type prodType;
if (f.size()) prodType result = sumSqr(tf());
{ tf.clear();
TFOR_ALL_S_OP_FUNC_F(scalar, SumMag, +=, mag, Type, f) return result;
}
return SumMag;
} }
TMP_UNARY_FUNCTION(scalar, sumMag)
template<class Type>
typename typeOfMag<Type>::type
sumMag(const UList<Type>& f)
{
typedef typename typeOfMag<Type>::type magType;
magType result = Zero;
if (f.size())
{
TFOR_ALL_S_OP_FUNC_F(magType, result, +=, mag, Type, f)
}
return result;
}
TMP_UNARY_FUNCTION(typename typeOfMag<Type>::type, sumMag)
template<class Type> template<class Type>
Type sumCmptMag(const UList<Type>& f) Type sumCmptMag(const UList<Type>& f)
{ {
Type SumMag = Zero; Type result = Zero;
if (f.size()) if (f.size())
{ {
TFOR_ALL_S_OP_FUNC_F(scalar, SumMag, +=, cmptMag, Type, f) TFOR_ALL_S_OP_FUNC_F(Type, result, +=, cmptMag, Type, f)
} }
return SumMag; return result;
} }
TMP_UNARY_FUNCTION(Type, sumCmptMag) TMP_UNARY_FUNCTION(Type, sumCmptMag)
@ -530,24 +567,24 @@ G_UNARY_FUNCTION(Type, gSumCmptMag, sumCmptMag, sum)
G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum) G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum)
G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum) G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum)
G_UNARY_FUNCTION(scalar, gSumSqr, sumSqr, sum) G_UNARY_FUNCTION(typename outerProduct1<Type>::type, gSumSqr, sumSqr, sum)
G_UNARY_FUNCTION(scalar, gSumMag, sumMag, sum) G_UNARY_FUNCTION(typename typeOfMag<Type>::type, gSumMag, sumMag, sum)
#undef G_UNARY_FUNCTION #undef G_UNARY_FUNCTION
template<class Type> template<class Type>
typename pTraits<Type>::cmptType gSumProd typename scalarProduct<Type, Type>::type gSumProd
( (
const UList<Type>& f1, const UList<Type>& f1,
const UList<Type>& f2, const UList<Type>& f2,
const label comm const label comm
) )
{ {
typedef typename pTraits<Type>::cmptType outType; typedef typename scalarProduct<Type, Type>::type prodType;
outType result = sumProd(f1, f2); prodType result = sumProd(f1, f2);
reduce(result, sumOp<outType>(), Pstream::msgType(), comm); reduce(result, sumOp<prodType>(), Pstream::msgType(), comm);
return result; return result;
} }

View File

@ -94,23 +94,35 @@ sqr(const tmp<Field<Type>>& tf);
template<class Type> template<class Type>
void magSqr(Field<scalar>& res, const UList<Type>& f); void magSqr
(
Field<typename typeOfMag<Type>::type>& res,
const UList<Type>& f
);
template<class Type> template<class Type>
tmp<Field<scalar>> magSqr(const UList<Type>& f); tmp<Field<typename typeOfMag<Type>::type>>
magSqr(const UList<Type>& f);
template<class Type> template<class Type>
tmp<Field<scalar>> magSqr(const tmp<Field<Type>>& tf); tmp<Field<typename typeOfMag<Type>::type>>
magSqr(const tmp<Field<Type>>& tf);
template<class Type> template<class Type>
void mag(Field<scalar>& res, const UList<Type>& f); void mag
(
Field<typename typeOfMag<Type>::type>& res,
const UList<Type>& f
);
template<class Type> template<class Type>
tmp<Field<scalar>> mag(const UList<Type>& f); tmp<Field<typename typeOfMag<Type>::type>>
mag(const UList<Type>& f);
template<class Type> template<class Type>
tmp<Field<scalar>> mag(const tmp<Field<Type>>& tf); tmp<Field<typename typeOfMag<Type>::type>>
mag(const tmp<Field<Type>>& tf);
template<class Type> template<class Type>
@ -197,7 +209,8 @@ TMP_UNARY_FUNCTION(Type, minMagSqr)
template<class Type> template<class Type>
typename pTraits<Type>::cmptType sumProd typename scalarProduct<Type, Type>::type
sumProd
( (
const UList<Type>& f1, const UList<Type>& f1,
const UList<Type>& f2 const UList<Type>& f2
@ -207,14 +220,15 @@ template<class Type>
Type sumCmptProd(const UList<Type>& f1, const UList<Type>& f2); Type sumCmptProd(const UList<Type>& f1, const UList<Type>& f2);
template<class Type> template<class Type>
scalar sumSqr(const UList<Type>& f); typename outerProduct1<Type>::type sumSqr(const UList<Type>& f);
TMP_UNARY_FUNCTION(scalar, sumSqr)
template<class Type> template<class Type>
scalar sumMag(const UList<Type>& f); typename outerProduct1<Type>::type sumSqr(const tmp<Field<Type>>& tf);
TMP_UNARY_FUNCTION(scalar, sumMag) template<class Type>
typename typeOfMag<Type>::type sumMag(const UList<Type>& f);
TMP_UNARY_FUNCTION(typename typeOfMag<Type>::type, sumMag)
template<class Type> template<class Type>
Type sumCmptMag(const UList<Type>& f); Type sumCmptMag(const UList<Type>& f);
@ -244,13 +258,14 @@ G_UNARY_FUNCTION(Type, gSumCmptMag, sumCmptMag, sum)
G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum) G_UNARY_FUNCTION(MinMax<Type>, gMinMax, minMax, sum)
G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum) G_UNARY_FUNCTION(scalarMinMax, gMinMaxMag, minMaxMag, sum)
G_UNARY_FUNCTION(scalar, gSumSqr, sumSqr, sum) G_UNARY_FUNCTION(typename outerProduct1<Type>::type, gSumSqr, sumSqr, sum)
G_UNARY_FUNCTION(scalar, gSumMag, sumMag, sum) G_UNARY_FUNCTION(typename typeOfMag<Type>::type, gSumMag, sumMag, sum)
#undef G_UNARY_FUNCTION #undef G_UNARY_FUNCTION
template<class Type> template<class Type>
typename pTraits<Type>::cmptType gSumProd typename scalarProduct<Type, Type>::type gSumProd
( (
const UList<Type>& f1, const UList<Type>& f1,
const UList<Type>& f2, const UList<Type>& f2,

View File

@ -257,7 +257,7 @@ sqr(const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf)
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
void magSqr void magSqr
( (
GeometricField<scalar, PatchField, GeoMesh>& gsf, GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>& gsf,
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
) )
{ {
@ -268,13 +268,16 @@ void magSqr
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> magSqr tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
magSqr
( (
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
) )
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres = auto tres =
tmp<GeometricField<scalar, PatchField, GeoMesh>>::New tmp<GeometricField<magType, PatchField, GeoMesh>>::New
( (
IOobject IOobject
( (
@ -294,30 +297,13 @@ tmp<GeometricField<scalar, PatchField, GeoMesh>> magSqr
} }
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> magSqr tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
magSqr
( (
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf
) )
{ {
const GeometricField<Type, PatchField, GeoMesh>& gf = tgf(); auto tres = magSqr(tgf.cref());
auto tres =
tmp<GeometricField<scalar, PatchField, GeoMesh>>::New
(
IOobject
(
"magSqr(" + gf.name() + ')',
gf.instance(),
gf.db(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
gf.mesh(),
sqr(gf.dimensions())
);
magSqr(tres.ref(), gf);
tgf.clear(); tgf.clear();
return tres; return tres;
@ -327,7 +313,7 @@ tmp<GeometricField<scalar, PatchField, GeoMesh>> magSqr
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
void mag void mag
( (
GeometricField<scalar, PatchField, GeoMesh>& gsf, GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>& gsf,
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
) )
{ {
@ -338,13 +324,16 @@ void mag
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> mag tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
mag
( (
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
) )
{ {
typedef typename typeOfMag<Type>::type magType;
auto tres = auto tres =
tmp<GeometricField<scalar, PatchField, GeoMesh>>::New tmp<GeometricField<magType, PatchField, GeoMesh>>::New
( (
IOobject IOobject
( (
@ -364,30 +353,13 @@ tmp<GeometricField<scalar, PatchField, GeoMesh>> mag
} }
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> mag tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
mag
( (
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf
) )
{ {
const GeometricField<Type, PatchField, GeoMesh>& gf = tgf(); auto tres = mag(tgf.cref());
auto tres =
tmp<GeometricField<scalar, PatchField, GeoMesh>>::New
(
IOobject
(
"mag(" + gf.name() + ')',
gf.instance(),
gf.db(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
gf.mesh(),
gf.dimensions()
);
mag(tres.ref(), gf);
tgf.clear(); tgf.clear();
return tres; return tres;
@ -559,7 +531,7 @@ dimensioned<returnType> func \
UNARY_REDUCTION_FUNCTION(Type, sum, gSum) UNARY_REDUCTION_FUNCTION(Type, sum, gSum)
UNARY_REDUCTION_FUNCTION(Type, average, gAverage) UNARY_REDUCTION_FUNCTION(Type, average, gAverage)
UNARY_REDUCTION_FUNCTION(scalar, sumMag, gSumMag) UNARY_REDUCTION_FUNCTION(typename typeOfMag<Type>::type, sumMag, gSumMag)
#undef UNARY_REDUCTION_FUNCTION #undef UNARY_REDUCTION_FUNCTION

View File

@ -142,18 +142,20 @@ sqr(const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf);
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
void magSqr void magSqr
( (
GeometricField<scalar, PatchField, GeoMesh>& gsf, GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>& gsf,
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
); );
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> magSqr tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
magSqr
( (
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
); );
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> magSqr tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
magSqr
( (
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf
); );
@ -161,18 +163,20 @@ tmp<GeometricField<scalar, PatchField, GeoMesh>> magSqr
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
void mag void mag
( (
GeometricField<scalar, PatchField, GeoMesh>& gsf, GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>& gsf,
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
); );
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> mag tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
mag
( (
const GeometricField<Type, PatchField, GeoMesh>& gf const GeometricField<Type, PatchField, GeoMesh>& gf
); );
template<class Type, template<class> class PatchField, class GeoMesh> template<class Type, template<class> class PatchField, class GeoMesh>
tmp<GeometricField<scalar, PatchField, GeoMesh>> mag tmp<GeometricField<typename typeOfMag<Type>::type, PatchField, GeoMesh>>
mag
( (
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf
); );
@ -252,7 +256,7 @@ dimensioned<returnType> func \
UNARY_REDUCTION_FUNCTION(Type, sum, gSum) UNARY_REDUCTION_FUNCTION(Type, sum, gSum)
UNARY_REDUCTION_FUNCTION(Type, average, gAverage) UNARY_REDUCTION_FUNCTION(Type, average, gAverage)
UNARY_REDUCTION_FUNCTION(scalar, sumMag, gSumMag) UNARY_REDUCTION_FUNCTION(typename typeOfMag<Type>::type, sumMag, gSumMag)
#undef UNARY_REDUCTION_FUNCTION #undef UNARY_REDUCTION_FUNCTION

View File

@ -103,6 +103,16 @@ public:
}; };
//- Outer-product of identical types
template<class arg1>
class outerProduct1
:
public outerProduct<arg1, arg1>
{
public:
};
template<class arg1, class arg2> template<class arg1, class arg2>
class crossProduct class crossProduct
{ {