From aaa3d026e8530b4de39a0c1fc58a5fbbeecbc942 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 9 Apr 2015 15:45:10 +0100 Subject: [PATCH] cachedRandom: Added GaussNormal functions and applied to StochasticDispersionRAS Resolves bug-report http://www.openfoam.org/mantisbt/view.php?id=1650 Thanks to Timo Niemi --- .../primitives/random/Random/Random.C | 4 +- .../random/cachedRandom/cachedRandom.C | 144 +++++++++++++----- .../random/cachedRandom/cachedRandom.H | 53 +++++-- .../cachedRandom/cachedRandomTemplates.C | 37 ++++- .../StochasticDispersionRAS.C | 16 +- 5 files changed, 179 insertions(+), 75 deletions(-) diff --git a/src/OpenFOAM/primitives/random/Random/Random.C b/src/OpenFOAM/primitives/random/Random/Random.C index c0c361e53c..3fa14012c1 100644 --- a/src/OpenFOAM/primitives/random/Random/Random.C +++ b/src/OpenFOAM/primitives/random/Random/Random.C @@ -177,10 +177,10 @@ Foam::scalar Foam::Random::GaussNormal() { v1 = 2.0*scalar01() - 1.0; v2 = 2.0*scalar01() - 1.0; - rsq = v1*v1 + v2*v2; + rsq = sqr(v1) + sqr(v2); } while (rsq >= 1.0 || rsq == 0.0); - fac = sqrt(-2.0 * log(rsq)/rsq); + fac = sqrt(-2.0*log(rsq)/rsq); gset = v1*fac; iset = 1; diff --git a/src/OpenFOAM/primitives/random/cachedRandom/cachedRandom.C b/src/OpenFOAM/primitives/random/cachedRandom/cachedRandom.C index bbbc0dd344..c7e65ac558 100644 --- a/src/OpenFOAM/primitives/random/cachedRandom/cachedRandom.C +++ b/src/OpenFOAM/primitives/random/cachedRandom/cachedRandom.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -57,7 +57,9 @@ Foam::cachedRandom::cachedRandom(const label seed, const label count) : seed_(1), samples_(0), - sampleI_(-1) + sampleI_(-1), + hasGaussSample_(false), + gaussSample_(0) { if (seed > 1) { @@ -84,8 +86,15 @@ Foam::cachedRandom::cachedRandom(const cachedRandom& cr, const bool reset) : seed_(cr.seed_), samples_(cr.samples_), - sampleI_(cr.sampleI_) + sampleI_(cr.sampleI_), + hasGaussSample_(cr.hasGaussSample_), + gaussSample_(cr.gaussSample_) { + if (reset) + { + hasGaussSample_ = false; + gaussSample_ = 0; + } if (sampleI_ == -1) { WarningIn @@ -112,13 +121,6 @@ Foam::cachedRandom::~cachedRandom() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template<> -Foam::label Foam::cachedRandom::sample01() -{ - return round(scalar01()); -} - - template<> Foam::scalar Foam::cachedRandom::sample01() { @@ -127,9 +129,44 @@ Foam::scalar Foam::cachedRandom::sample01() template<> -Foam::label Foam::cachedRandom::position(const label& start, const label& end) +Foam::label Foam::cachedRandom::sample01() { - return start + round(scalar01()*(end - start)); + return round(scalar01()); +} + + +template<> +Foam::scalar Foam::cachedRandom::GaussNormal() +{ + if (hasGaussSample_) + { + hasGaussSample_ = false; + return gaussSample_; + } + else + { + scalar rsq, v1, v2; + do + { + v1 = 2*scalar01() - 1; + v2 = 2*scalar01() - 1; + rsq = sqr(v1) + sqr(v2); + } while (rsq >= 1 || rsq == 0); + + scalar fac = sqrt(-2*log(rsq)/rsq); + + gaussSample_ = v1*fac; + hasGaussSample_ = true; + + return v2*fac; + } +} + + +template<> +Foam::label Foam::cachedRandom::GaussNormal() +{ + return round(GaussNormal()); } @@ -145,18 +182,9 @@ Foam::scalar Foam::cachedRandom::position template<> -Foam::label Foam::cachedRandom::globalSample01() +Foam::label Foam::cachedRandom::position(const label& start, const label& end) { - scalar value = -GREAT; - - if (Pstream::master()) - { - value = scalar01(); - } - - reduce(value, maxOp()); - - return round(value); + return start + round(scalar01()*(end - start)); } @@ -170,29 +198,57 @@ Foam::scalar Foam::cachedRandom::globalSample01() value = scalar01(); } - reduce(value, maxOp()); + Pstream::scatter(value); return value; } template<> -Foam::label Foam::cachedRandom::globalPosition -( - const label& start, - const label& end -) +Foam::label Foam::cachedRandom::globalSample01() { - label value = labelMin; + scalar value = -GREAT; if (Pstream::master()) { - value = round(scalar01()*(end - start)); + value = scalar01(); } - reduce(value, maxOp