37 template<
class CloudType>
52 tag[particlei] =
p.tag();
53 position[particlei] =
p.position();
55 soi[particlei] =
p.soi();
68 ListListOps::combine<List<label>>
78 ListListOps::combine<List<point>>
88 ListListOps::combine<List<vector>>
98 ListListOps::combine<List<scalar>>
108 ListListOps::combine<List<scalar>>
117 maxTag =
max(maxTag, tag[particlei]);
120 label nInjectors = maxTag + 1;
130 const label tagi = tag[i];
131 const scalar t = soi[i];
132 injStartTime[tagi] =
min(t, injStartTime[tagi]);
133 injEndTime[tagi] =
max(t, injEndTime[tagi]);
134 injPosition[tagi].
append(position[i]);
136 injDiameter[tagi].
append(d[i]);
141 scalar sumVolume = 0;
142 startTime_.setSize(nInjectors, 0);
143 endTime_.setSize(nInjectors, 0);
144 sizeDistribution_.setSize(nInjectors);
145 position_.setSize(nInjectors);
146 U_.setSize(nInjectors);
147 volumeFlowRate_.setSize(nInjectors, 0);
149 scalar minTime = GREAT;
157 const label nParticle = diameters.size();
158 const scalar dTime = injEndTime[i] - injStartTime[i];
160 if ((nParticle > 1) && (dTime > ROOTVSMALL))
162 minTime =
min(minTime, injStartTime[i]);
164 startTime_[injectori] = injStartTime[i];
165 endTime_[injectori] = injEndTime[i];
168 position_[injectori].
setSize(resampleSize_);
169 U_[injectori].setSize(resampleSize_);
173 for (label samplei = 0; samplei < resampleSize_; ++samplei)
176 positioni[samplei] = injPosition[i][posi] + positionOffset_;
177 Ui[samplei] = injU[i][posi];
182 forAll(diameters, particlei)
184 sumPow3 +=
pow3(diameters[particlei]);
189 volumeFlowRate_[injectori] =
volume/dTime;
192 sizeDistribution_.
set
208 startTime_.setSize(injectori);
209 endTime_.setSize(injectori);
210 position_.setSize(injectori);
211 U_.setSize(injectori);
212 volumeFlowRate_.setSize(injectori);
213 sizeDistribution_.setSize(injectori);
216 forAll(startTime_, injectori)
218 startTime_[injectori] -= minTime;
219 endTime_[injectori] -= minTime;
224 this->volumeTotal_ = sumVolume;
227 Info<<
" Read " << position_.size() <<
" injectors with "
228 << tag.size() <<
" total particles" <<
endl;
234 template<
class CloudType>
240 const word& modelName
244 cloudName_(this->coeffDict().
lookup(
"cloud")),
245 startTime_(this->template getModelProperty<
scalarList>(
"startTime")),
246 endTime_(this->template getModelProperty<
scalarList>(
"endTime")),
247 position_(this->template getModelProperty<
List<
vectorList>>(
"position")),
248 positionOffset_(this->coeffDict().
lookup(
"positionOffset")),
251 this->template getModelProperty<
scalarList>(
"volumeFlowRate")
254 binWidth_(this->coeffDict().getScalar(
"binWidth")),
258 ceil(this->coeffDict().getScalar(
"parcelsPerInjector"))
262 this->coeffDict().getOrDefault(
"resampleSize", label(100))
264 applyDistributionMassTotal_
266 this->coeffDict().getBool(
"applyDistributionMassTotal")
270 this->coeffDict().getOrDefault(
"ignoreOutOfBounds", false)
272 nParcelsInjected_(this->parcelsAddedTotal()),
273 nParcelsInjected0_(0),
274 currentInjectori_(0),
304 Info<<
" Set mass to inject from distribution: "
310 template<
class CloudType>
314 const InjectedParticleDistributionInjection<CloudType>& im
318 cloudName_(im.cloudName_),
319 startTime_(im.startTime_),
320 endTime_(im.endTime_),
321 position_(im.position_),
322 positionOffset_(im.positionOffset_),
323 volumeFlowRate_(im.volumeFlowRate_),
325 binWidth_(im.binWidth_),
326 sizeDistribution_(im.sizeDistribution_.size()),
327 parcelsPerInjector_(im.parcelsPerInjector_),
328 resampleSize_(im.resampleSize_),
329 applyDistributionMassTotal_(im.applyDistributionMassTotal_),
330 ignoreOutOfBounds_(im.ignoreOutOfBounds_),
331 nParcelsInjected_(im.nParcelsInjected_),
332 nParcelsInjected0_(im.nParcelsInjected0_),
333 currentInjectori_(0),
343 new distributionModels::general
345 im.sizeDistribution_[injectori]
355 template<
class CloudType>
363 template<
class CloudType>
368 template<
class CloudType>
376 template<
class CloudType>
386 nParcelsInjected0_ = 0;
388 if (startTime_.empty() || this->volumeTotal_ < ROOTVSMALL)
393 scalar targetVolume = 0;
394 forAll(startTime_, injectori)
396 if (time1 > startTime_[injectori])
398 scalar totalDuration =
399 min(time1, endTime_[injectori]) - startTime_[injectori];
401 targetVolume += volumeFlowRate_[injectori]*totalDuration;
405 const label targetParcels =
408 scalar(startTime_.size()*parcelsPerInjector_)
409 *targetVolume/this->volumeTotal_
412 const label nParcels = targetParcels - nParcelsInjected_;
418 template<
class CloudType>
427 forAll(startTime_, injectori)
429 if ((time1 > startTime_[injectori]) && (time1 <= endTime_[injectori]))
431 scalar duration =
min(time1, endTime_[injectori]) - time0;
432 volume += volumeFlowRate_[injectori]*duration;
440 template<
class CloudType>
444 const label nParcels,
453 currentInjectori_ = rnd.
globalPosition<label>(0, position_.size() - 1);
454 currentSamplei_ = rnd.
globalPosition<label>(0, resampleSize_ - 1);
456 position = position_[currentInjectori_][currentSamplei_];
459 this->findCellAtPosition
469 template<
class CloudType>
479 parcel.U() = U_[currentInjectori_][currentSamplei_];
482 parcel.d() = sizeDistribution_[currentInjectori_].sample();
486 nParcelsInjected0_++;
490 template<
class CloudType>
498 template<
class CloudType>
508 template<
class CloudType>
513 if (this->writeTime())
515 this->setModelProperty(
"startTime", startTime_);
516 this->setModelProperty(
"endTime", endTime_);
517 this->setModelProperty(
"position", position_);
518 this->setModelProperty(
"volumeFlowRate", volumeFlowRate_);
519 this->setModelProperty(
"U", U_);
520 forAll(sizeDistribution_, i)