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