32 template<
class CloudType>
35 IOobject propsDictHeader
37 "injectionProperties",
38 owner_.db().time().timeName(),
39 "uniform"/cloud::prefix/owner_.name(),
46 if (propsDictHeader.headerOk())
48 const IOdictionary
propsDict(propsDictHeader);
50 propsDict.readIfPresent(
"massInjected", massInjected_);
51 propsDict.readIfPresent(
"nInjections", nInjections_);
52 propsDict.readIfPresent(
"parcelsAddedTotal", parcelsAddedTotal_);
53 propsDict.readIfPresent(
"timeStep0", timeStep0_);
58 template<
class CloudType>
61 if (owner_.db().time().outputTime())
67 "injectionProperties",
68 owner_.db().time().timeName(),
69 "uniform"/cloud::prefix/owner_.name(),
77 propsDict.add(
"massInjected", massInjected_);
78 propsDict.add(
"nInjections", nInjections_);
79 propsDict.add(
"parcelsAddedTotal", parcelsAddedTotal_);
87 template<
class CloudType>
107 scalar t0 = timeStep0_ - SOI_;
108 scalar t1 = time - SOI_;
111 newParcels = parcelsToInject(t0, t1);
114 newVolume = volumeToInject(t0, t1);
117 if ((newParcels == 0) && (newVolume > 0.0))
129 template<
class CloudType>
136 const vector p0 = position;
138 bool foundCell =
false;
140 cellI = owner_.mesh().findCell(position);
144 const vector&
C = owner_.mesh().
C()[cellI];
145 position += SMALL*(C - position);
147 foundCell = owner_.mesh().pointInCell(position, cellI);
155 cellI = owner_.mesh().findNearestCell(position);
159 const vector&
C = owner_.mesh().
C()[cellI];
160 position += SMALL*(C - position);
162 foundCell = owner_.mesh().pointInCell(position, cellI);
171 "Foam::InjectionModel<CloudType>::findCellAtPosition"
176 )<<
"Cannot find parcel injection cell. "
177 <<
"Parcel position = " << p0 <<
nl
183 template<
class CloudType>
188 const scalar diameter,
193 switch (parcelBasis_)
205 nP = massTotal_/(rho*volumeTotal_);
214 "Foam::InjectionModel<CloudType>::setNumberOfParticles"
221 )<<
"Unknown parcelBasis type" <<
nl
230 template<
class CloudType>
233 const label parcelsAdded,
234 const scalar massAdded
239 if (allParcelsAdded > 0)
242 <<
"--> Cloud: " << owner_.name() <<
nl
243 <<
" Added " << allParcelsAdded <<
" new parcels" <<
nl <<
endl;
247 parcelsAddedTotal_ += allParcelsAdded;
253 time0_ = owner_.db().time().value();
265 template<
class CloudType>
276 parcelsAddedTotal_(0),
277 parcelBasis_(pbNumber),
285 template<
class CloudType>
295 coeffDict_(dict.
subDict(type +
"Coeffs")),
301 parcelsAddedTotal_(0),
302 parcelBasis_(pbNumber),
303 time0_(owner.db().time().value()),
309 Info<<
" Constructing " << owner.mesh().nGeometricD() <<
"-D injection"
312 word parcelBasisType = coeffDict_.lookup(
"parcelBasisType");
313 if (parcelBasisType ==
"mass")
315 parcelBasis_ = pbMass;
317 else if (parcelBasisType ==
"number")
319 parcelBasis_ = pbNumber;
325 "Foam::InjectionModel<CloudType>::InjectionModel"
327 "const dictionary&, "
331 )<<
"parcelBasisType must be either 'number' or 'mass'" <<
nl
341 template<
class CloudType>
348 template<
class CloudType>
349 template<
class TrackData>
357 const scalar time = owner_.db().time().value();
358 const scalar carrierDt = owner_.db().time().deltaTValue();
362 label parcelsAdded = 0;
363 scalar massAdded = 0.0;
364 label newParcels = 0;
365 scalar newVolume = 0.0;
367 prepareForNextTimeStep(time, newParcels, newVolume);
370 const scalar deltaT =
371 max(0.0,
min(carrierDt,
min(time - SOI_, timeEnd() - time0_)));
374 const scalar padTime =
max(0.0, SOI_ - time0_);
377 for (label parcelI=0; parcelI<newParcels; parcelI++)
379 if (validInjection(parcelI))
382 scalar timeInj = time0_ + padTime + deltaT*parcelI/newParcels;
387 setPositionAndCell(parcelI, newParcels, timeInj, pos, cellI);
392 scalar dt = time - timeInj;
401 setProperties(parcelI, newParcels, timeInj, *pPtr);
404 td.cloud().checkParcelProperties(*pPtr, dt, fullyDescribed());
425 td.cloud().addParticle(pPtr);
427 massAdded += pPtr->nParticle()*pPtr->mass();
433 postInjectCheck(parcelsAdded, massAdded);