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()),
100 injectorOrder_(
identity(positionAxis_.size())),
106 tanVec1_.setSize(positionAxis_.size());
107 tanVec2_.setSize(positionAxis_.size());
110 const Time& time = owner.db().time();
112 flowRateProfile_->userTimeToTime(time);
113 Umag_->userTimeToTime(time);
114 thetaInner_->userTimeToTime(time);
115 thetaOuter_->userTimeToTime(time);
121 vector& axis = positionAxis_[i].second();
125 scalar magTangent = 0.0;
128 while (magTangent < SMALL)
132 tangent = v - (v & axis)*axis;
133 magTangent =
mag(tangent);
136 tanVec1_[i] = tangent/magTangent;
137 tanVec2_[i] = axis^tanVec1_[i];
141 this->volumeTotal_ = flowRateProfile_->integrate(0.0, duration_);
145 template<
class CloudType>
152 positionAxis_(im.positionAxis_),
153 injectorCells_(im.injectorCells_),
154 injectorTetFaces_(im.injectorTetFaces_),
155 injectorTetPts_(im.injectorTetPts_),
156 duration_(im.duration_),
157 parcelsPerInjector_(im.parcelsPerInjector_),
158 flowRateProfile_(im.flowRateProfile_.clone()),
159 Umag_(im.Umag_.clone()),
160 thetaInner_(im.thetaInner_.clone()),
161 thetaOuter_(im.thetaOuter_.clone()),
162 sizeDistribution_(im.sizeDistribution_.clone()),
163 nInjected_(im.nInjected_),
164 injectorOrder_(im.injectorOrder_),
165 tanVec1_(im.tanVec1_),
166 tanVec2_(im.tanVec2_)
172 template<
class CloudType>
175 bitSet reject(positionAxis_.size());
182 !this->findCellAtPosition
185 injectorTetFaces_[i],
187 positionAxis_[i].first(),
188 !this->ignoreOutOfBounds_
197 const label nRejected = reject.count();
207 Info<<
" " << nRejected
208 <<
" positions rejected, out of bounds" <<
endl;
213 template<
class CloudType>
216 return this->SOI_ + duration_;
220 template<
class CloudType>
227 if ((time0 >= 0.0) && (time0 < duration_))
229 const scalar targetVolume = flowRateProfile_->integrate(0, time1);
231 const scalar volumeFraction = targetVolume/this->volumeTotal_;
233 const label targetParcels =
234 ceil(positionAxis_.size()*parcelsPerInjector_*volumeFraction);
236 return targetParcels - nInjected_;
243 template<
class CloudType>
250 if ((time0 >= 0.0) && (time0 < duration_))
252 return flowRateProfile_->integrate(time0, time1);
259 template<
class CloudType>
274 const label i = injectorOrder_[parcelI % positionAxis_.size()];
275 position = positionAxis_[i].first();
276 cellOwner = injectorCells_[i];
277 tetFacei = injectorTetFaces_[i];
278 tetPti = injectorTetPts_[i];
282 template<
class CloudType>
293 const label i = injectorOrder_[parcelI % positionAxis_.size()];
296 scalar t = time - this->SOI_;
297 scalar ti = thetaInner_->value(t);
298 scalar to = thetaOuter_->value(t);
302 scalar dcorr =
cos(coneAngle);
306 vector dirVec = dcorr*positionAxis_[i].second();
311 parcel.U() = Umag_->value(t)*dirVec;
314 parcel.d() = sizeDistribution_().sample();
321 template<
class CloudType>
328 template<
class CloudType>