From 4bd6aba569ba479302b03cec073d192581b91f23 Mon Sep 17 00:00:00 2001 From: graham Date: Tue, 7 Dec 2010 16:03:58 +0000 Subject: [PATCH] ENH: Better handling of injection rates less than one parcel per timestep. --- .../PatchInjection/PatchInjection.C | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C index 73de293b43..c124977e5a 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C @@ -38,7 +38,24 @@ Foam::label Foam::PatchInjection::parcelsToInject { if ((time0 >= 0.0) && (time0 < duration_)) { - return round(fraction_*(time1 - time0)*parcelsPerSecond_); + scalar nParcels =fraction_*(time1 - time0)*parcelsPerSecond_; + + cachedRandom& rnd = this->owner().rndGen(); + + label nParcelsToInject = floor(nParcels); + + // Inject an additional parcel with a probability based on the + // remainder after the floor function + if + ( + nParcelsToInject > 0 + && (nParcels - scalar(nParcelsToInject) > rnd.position(0.0, 1.0)) + ) + { + ++nParcelsToInject; + } + + return nParcelsToInject; } else { @@ -173,6 +190,7 @@ void Foam::PatchInjection::setPositionAndCell if (cellOwners_.size() > 0) { cachedRandom& rnd = this->owner().rndGen(); + label cellI = rnd.position