diff --git a/applications/test/Distribution/DistributionTest.C b/applications/test/Distribution/DistributionTest.C index e59cb1af1e..3d181b22fb 100644 --- a/applications/test/Distribution/DistributionTest.C +++ b/applications/test/Distribution/DistributionTest.C @@ -45,7 +45,8 @@ Description #include "Distribution.H" #include "Random.H" #include "dimensionedTypes.H" - +#include "argList.H" +#include "PstreamReduceOps.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -53,6 +54,8 @@ using namespace Foam; int main(int argc, char *argv[]) { + # include "setRootCase.H" + Random R(918273); { @@ -76,7 +79,67 @@ int main(int argc, char *argv[]) << "Median " << dS.median() << endl; - dS.write("Distribution_scalar_test", dS.normalised()); + dS.write("Distribution_scalar_test_1"); + + Distribution dS2(scalar(1e-2)); + + Info<< nl << "Distribution" << nl + << "Sampling " + << randomDistributionTestSize + << " times from GaussNormal distribution." + << endl; + + for (label i = 0; i < randomDistributionTestSize; i++) + { + dS2.add(1.5*R.GaussNormal() -6.0); + } + + Info<< "Mean " << dS2.mean() << nl + << "Median " << dS2.median() + << endl; + + dS2.write("Distribution_scalar_test_2"); + + Info<< nl << "Adding previous two Distribution" << endl; + + dS = dS + dS2; + + dS.write("Distribution_scalar_test_1+2"); + } + + if (Pstream::parRun()) + { + // scalar in parallel + label randomDistributionTestSize = 100000000; + + Distribution dS(scalar(1e-1)); + + Pout<< "Distribution" << nl + << "Sampling " + << randomDistributionTestSize + << " times from uniform distribution." + << endl; + + for (label i = 0; i < randomDistributionTestSize; i++) + { + dS.add(R.scalar01() + 10*Pstream::myProcNo()); + } + + Pout<< "Mean " << dS.mean() << nl + << "Median " << dS.median() + << endl; + + reduce(dS, sumOp< Distribution >()); + + if (Pstream::master()) + { + Info<< "Reducing parallel Distribution" << nl + << "Mean " << dS.mean() << nl + << "Median " << dS.median() + << endl; + + dS.write("Distribution_scalar_test_parallel_reduced"); + } } { @@ -114,40 +177,40 @@ int main(int argc, char *argv[]) << "Median " << dV.median() << endl; - dV.write("Distribution_vector_test", dV.normalised()); + dV.write("Distribution_vector_test"); } - { - // labelVector - Distribution dLV(labelVector::one*10); + // { + // // labelVector + // Distribution dLV(labelVector::one*10); - label randomDistributionTestSize = 2000000; + // label randomDistributionTestSize = 2000000; - Info<< nl << "Distribution" << nl - << "Sampling " - << randomDistributionTestSize - << " times from uniform distribution." - << endl; + // Info<< nl << "Distribution" << nl + // << "Sampling " + // << randomDistributionTestSize + // << " times from uniform distribution." + // << endl; - for (label i = 0; i < randomDistributionTestSize; i++) - { - dLV.add - ( - labelVector - ( - R.integer(-1000, 1000), - R.integer(-5000, 5000), - R.integer(-2000, 7000) - ) - ); - } + // for (label i = 0; i < randomDistributionTestSize; i++) + // { + // dLV.add + // ( + // labelVector + // ( + // R.integer(-1000, 1000), + // R.integer(-5000, 5000), + // R.integer(-2000, 7000) + // ) + // ); + // } - Info<< "Mean " << dLV.mean() << nl - << "Median " << dLV.median() - << endl; + // Info<< "Mean " << dLV.mean() << nl + // << "Median " << dLV.median() + // << endl; - dLV.write("Distribution_labelVector_test", dLV.normalised()); - } + // dLV.write("Distribution_labelVector_test"); + // } { // tensor @@ -170,7 +233,7 @@ int main(int argc, char *argv[]) << "Median " << dT.median() << endl; - dT.write("Distribution_tensor_test", dT.normalised()); + dT.write("Distribution_tensor_test"); } { @@ -194,7 +257,7 @@ int main(int argc, char *argv[]) << "Median " << dSyT.median() << endl; - dSyT.write("Distribution_symmTensor_test", dSyT.normalised()); + dSyT.write("Distribution_symmTensor_test"); } { @@ -218,7 +281,7 @@ int main(int argc, char *argv[]) << "Median " << dSpT.median() << endl; - dSpT.write("Distribution_sphericalTensor_test", dSpT.normalised()); + dSpT.write("Distribution_sphericalTensor_test"); } Info<< nl << "End" << nl << endl; diff --git a/src/OpenFOAM/containers/Lists/Distribution/Distribution.C b/src/OpenFOAM/containers/Lists/Distribution/Distribution.C index 263853428d..d242feb11a 100644 --- a/src/OpenFOAM/containers/Lists/Distribution/Distribution.C +++ b/src/OpenFOAM/containers/Lists/Distribution/Distribution.C @@ -28,7 +28,73 @@ License #include "OFstream.H" #include "ListOps.H" -// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template +Foam::Distribution::Distribution() +: + List< List >(pTraits::nComponents), + binWidth_(pTraits::one), + listStarts_(pTraits::nComponents, 0) +{} + + +template +Foam::Distribution::Distribution(const Type& binWidth) +: + List< List >(pTraits::nComponents), + binWidth_(binWidth), + listStarts_(pTraits::nComponents, 0) +{} + + +template +Foam::Distribution::Distribution(const Distribution& d) +: + List< List >(static_cast< const List< List >& >(d)), + binWidth_(d.binWidth()), + listStarts_(d.listStarts()) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +template +Foam::Distribution::~Distribution() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template +Foam::scalar Foam::Distribution::totalWeight(direction cmpt) const +{ + const List& cmptDistribution = (*this)[cmpt]; + + scalar sumOfWeights = 0.0; + + forAll(cmptDistribution, i) + { + sumOfWeights += cmptDistribution[i]; + } + + return sumOfWeights; +} + + +template +Foam::List Foam::Distribution::keys(direction cmpt) const +{ + List