diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index 2091654067..42c3aee5f1 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -160,7 +160,7 @@ protected: const dictionary subModelProperties_; //- Random number generator - used by some injection routines - cachedRandom rndGen_; + mutable cachedRandom rndGen_; //- Cell occupancy information for each parcel, (demand driven) autoPtr>> cellOccupancyPtr_; @@ -363,7 +363,7 @@ public: // Cloud data //- Return reference to the random object - inline cachedRandom& rndGen(); + inline cachedRandom& rndGen() const; //- Return the cell occupancy information for each // parcel, non-const access, the caller is diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index 37a1a43d17..53b6c71316 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -356,7 +356,7 @@ inline Foam::scalar Foam::KinematicCloud::Dmax() const template -inline Foam::cachedRandom& Foam::KinematicCloud::rndGen() +inline Foam::cachedRandom& Foam::KinematicCloud::rndGen() const { return rndGen_; } diff --git a/src/lagrangian/turbulence/submodels/Thermodynamic/ParticleForces/BrownianMotion/BrownianMotionForce.C b/src/lagrangian/turbulence/submodels/Thermodynamic/ParticleForces/BrownianMotion/BrownianMotionForce.C index af762752cf..313cbf0b17 100644 --- a/src/lagrangian/turbulence/submodels/Thermodynamic/ParticleForces/BrownianMotion/BrownianMotionForce.C +++ b/src/lagrangian/turbulence/submodels/Thermodynamic/ParticleForces/BrownianMotion/BrownianMotionForce.C @@ -193,13 +193,28 @@ Foam::forceSuSp Foam::BrownianMotionForce::calcCoupled f = mass*sqrt(mathematical::pi*s0/dt); } - const scalar sqrt2 = sqrt(2.0); - for (direction dir = 0; dir < vector::nComponents; dir++) - { - const scalar x = rndGen_.sample01(); - const scalar eta = sqrt2*erfInv(2*x - 1.0); - value.Su()[dir] = f*eta; - } + + // To generate a cubic distribution (3 independent directions) : + // const scalar sqrt2 = sqrt(2.0); + // for (direction dir = 0; dir < vector::nComponents; dir++) + // { + // const scalar x = rndGen_.sample01(); + // const scalar eta = sqrt2*erfInv(2*x - 1.0); + // value.Su()[dir] = f*eta; + // } + + + // To generate a spherical distribution: + + cachedRandom& rnd = this->owner().rndGen(); + + const scalar theta = rnd.sample01()*twoPi; + const scalar u = 2*rnd.sample01() - 1; + + const scalar a = sqrt(1 - sqr(u)); + const vector dir(a*cos(theta), a*sin(theta), u); + + value.Su() = f*mag(rnd.GaussNormal())*dir; return value; }