38 template<
class CloudType>
47 positionAxis_(this->coeffDict().
lookup(
"positionAxis")),
48 injectorCells_(positionAxis_.size()),
49 injectorTetFaces_(positionAxis_.size()),
50 injectorTetPts_(positionAxis_.size()),
51 duration_(this->coeffDict().getScalar(
"duration")),
54 this->coeffDict().getScalar(
"parcelsPerInjector")
96 this->coeffDict().subDict(
"sizeDistribution"), owner.
rndGen()
99 nInjected_(this->parcelsAddedTotal()),
105 tanVec1_.setSize(positionAxis_.size());
106 tanVec2_.setSize(positionAxis_.size());
108 duration_ = owner.db().time().userTimeToTime(duration_);
114 vector& axis = positionAxis_[i].second();
118 scalar magTangent = 0.0;
121 while (magTangent < SMALL)
125 tangent = v - (v & axis)*axis;
126 magTangent =
mag(tangent);
129 tanVec1_[i] = tangent/magTangent;
130 tanVec2_[i] = axis^tanVec1_[i];
134 this->volumeTotal_ = flowRateProfile_.integrate(0.0, duration_);
138 template<
class CloudType>
145 positionAxis_(im.positionAxis_),
146 injectorCells_(im.injectorCells_),
147 injectorTetFaces_(im.injectorTetFaces_),
148 injectorTetPts_(im.injectorTetPts_),
149 duration_(im.duration_),
150 parcelsPerInjector_(im.parcelsPerInjector_),
151 flowRateProfile_(im.flowRateProfile_),
153 thetaInner_(im.thetaInner_),
154 thetaOuter_(im.thetaOuter_),
155 sizeDistribution_(im.sizeDistribution_.clone()),
156 nInjected_(im.nInjected_),
157 tanVec1_(im.tanVec1_),
158 tanVec2_(im.tanVec2_)
164 template<
class CloudType>
167 bitSet reject(positionAxis_.size());
174 !this->findCellAtPosition
177 injectorTetFaces_[i],
179 positionAxis_[i].first(),
180 !this->ignoreOutOfBounds_
189 const label nRejected = reject.count();
199 Info<<
" " << nRejected
200 <<
" positions rejected, out of bounds" <<
endl;
205 template<
class CloudType>
208 return this->SOI_ + duration_;
212 template<
class CloudType>
219 if ((time0 >= 0.0) && (time0 < duration_))
221 const scalar targetVolume = flowRateProfile_.integrate(0, time1);
223 const scalar volumeFraction = targetVolume/this->volumeTotal_;
225 const label targetParcels =
226 ceil(positionAxis_.size()*parcelsPerInjector_*volumeFraction);
228 return targetParcels - nInjected_;
235 template<
class CloudType>
242 if ((time0 >= 0.0) && (time0 < duration_))
244 return flowRateProfile_.integrate(time0, time1);
251 template<
class CloudType>
263 const label i = parcelI % positionAxis_.size();
265 position = positionAxis_[i].first();
266 cellOwner = injectorCells_[i];
267 tetFacei = injectorTetFaces_[i];
268 tetPti = injectorTetPts_[i];
272 template<
class CloudType>
284 const label i = parcelI % positionAxis_.size();
286 scalar t = time - this->SOI_;
287 scalar ti = thetaInner_.value(t);
288 scalar to = thetaOuter_.value(t);
292 scalar dcorr =
cos(coneAngle);
296 vector dirVec = dcorr*positionAxis_[i].second();
300 parcel.U() = Umag_.value(t)*dirVec;
303 parcel.d() = sizeDistribution_().sample();
310 template<
class CloudType>
317 template<
class CloudType>