37 template<
class CloudType>
44 { injectionMethod::imPoint,
"point" },
45 { injectionMethod::imDisc,
"disc" },
46 { injectionMethod::imMovingPoint,
"movingPoint" },
49 template<
class CloudType>
56 { flowType::ftConstantVelocity,
"constantVelocity" },
57 { flowType::ftPressureDrivenVelocity,
"pressureDrivenVelocity" },
58 { flowType::ftFlowRateAndDischarge,
"flowRateAndDischarge" },
64 template<
class CloudType>
67 switch (injectionMethod_)
69 case injectionMethod::imPoint:
70 case injectionMethod::imDisc:
72 this->coeffDict().readEntry(
"position", position_);
75 case injectionMethod::imMovingPoint:
77 positionVsTime_.reset(this->coeffDict());
83 <<
"Unhandled injection method "
84 << injectionMethodNames[injectionMethod_]
91 template<
class CloudType>
96 case flowType::ftConstantVelocity:
98 this->coeffDict().readEntry(
"UMag", UMag_);
101 case flowType::ftPressureDrivenVelocity:
103 Pinj_.reset(this->coeffDict());
106 case flowType::ftFlowRateAndDischarge:
108 Cd_.reset(this->coeffDict());
114 <<
"Unhandled flow type "
115 << flowTypeNames[flowType_]
124 template<
class CloudType>
129 const word& modelName
135 injectionMethodNames.get(
"injectionMethod", this->coeffDict())
137 flowType_(flowTypeNames.get(
"flowType", this->coeffDict())),
138 outerDiameter_(this->coeffDict().getScalar(
"outerDiameter")),
139 innerDiameter_(this->coeffDict().getScalar(
"innerDiameter")),
140 duration_(this->coeffDict().getScalar(
"duration")),
141 positionVsTime_(owner.db().time(),
"position"),
146 direction_(this->coeffDict().
lookup(
"direction")),
147 parcelsPerSecond_(this->coeffDict().getScalar(
"parcelsPerSecond")),
179 this->coeffDict().subDict(
"sizeDistribution"),
188 Cd_(owner.db().time(),
"Cd"),
189 Pinj_(owner.db().time(),
"Pinj")
191 if (innerDiameter_ >= outerDiameter_)
194 <<
"Inner diameter must be less than the outer diameter:" <<
nl
195 <<
" innerDiameter: " << innerDiameter_ <<
nl
196 <<
" outerDiameter: " << outerDiameter_
200 duration_ = owner.db().time().userTimeToTime(duration_);
202 setInjectionMethod();
209 direction_.normalise();
213 scalar magTangent = 0.0;
215 while(magTangent < SMALL)
219 tangent = v - (v & direction_)*direction_;
220 magTangent =
mag(tangent);
223 tanVec1_ = tangent/magTangent;
224 tanVec2_ = direction_^tanVec1_;
227 this->volumeTotal_ = flowRateProfile_.integrate(0.0, duration_);
233 template<
class CloudType>
240 injectionMethod_(im.injectionMethod_),
241 flowType_(im.flowType_),
242 outerDiameter_(im.outerDiameter_),
243 innerDiameter_(im.innerDiameter_),
244 duration_(im.duration_),
245 positionVsTime_(im.positionVsTime_),
246 position_(im.position_),
247 injectorCell_(im.injectorCell_),
248 tetFacei_(im.tetFacei_),
250 direction_(im.direction_),
251 parcelsPerSecond_(im.parcelsPerSecond_),
252 flowRateProfile_(im.flowRateProfile_),
253 thetaInner_(im.thetaInner_),
254 thetaOuter_(im.thetaOuter_),
255 sizeDistribution_(im.sizeDistribution_.clone()),
256 tanVec1_(im.tanVec1_),
257 tanVec2_(im.tanVec2_),
267 template<
class CloudType>
274 template<
class CloudType>
279 switch (injectionMethod_)
281 case injectionMethod::imPoint:
283 this->findCellAtPosition
300 template<
class CloudType>
303 return this->SOI_ + duration_;
307 template<
class CloudType>
314 if ((time0 >= 0.0) && (time0 < duration_))
316 return floor((time1 - time0)*parcelsPerSecond_);
323 template<
class CloudType>
330 if ((time0 >= 0.0) && (time0 < duration_))
332 return flowRateProfile_.integrate(time0, time1);
339 template<
class CloudType>
356 switch (injectionMethod_)
358 case injectionMethod::imPoint:
360 position = position_;
361 cellOwner = injectorCell_;
362 tetFacei = tetFacei_;
367 case injectionMethod::imMovingPoint:
369 position = positionVsTime_.value(time - this->SOI_);
371 this->findCellAtPosition
381 case injectionMethod::imDisc:
383 scalar frac =
rndGen.globalSample01<scalar>();
384 scalar dr = outerDiameter_ - innerDiameter_;
385 scalar r = 0.5*(innerDiameter_ + frac*dr);
387 position = position_ + r*normal_;
389 this->findCellAtPosition
401 <<
"Unhandled injection method "
402 << injectionMethodNames[injectionMethod_]
409 template<
class CloudType>
421 scalar t = time - this->SOI_;
422 scalar ti = thetaInner_.value(t);
423 scalar to = thetaOuter_.value(t);
424 scalar coneAngle =
degToRad(
rndGen.sample01<scalar>()*(to - ti) + ti);
427 scalar dcorr =
cos(coneAngle);
430 vector dirVec = dcorr*direction_;
436 case flowType::ftConstantVelocity:
438 parcel.U() = UMag_*dirVec;
441 case flowType::ftPressureDrivenVelocity:
443 scalar pAmbient = this->owner().pAmbient();
444 scalar
rho = parcel.rho();
445 scalar UMag =
::sqrt(2.0*(Pinj_.value(t) - pAmbient)/
rho);
446 parcel.U() = UMag*dirVec;
449 case flowType::ftFlowRateAndDischarge:
453 scalar massFlowRate =
455 *flowRateProfile_.value(t)
456 /this->volumeTotal();
458 scalar Umag = massFlowRate/(parcel.rho()*Cd_.value(t)*(Ao - Ai));
459 parcel.U() = Umag*dirVec;
465 <<
"Unhandled injection method "
466 << flowTypeNames[flowType_]
472 parcel.d() = sizeDistribution_->sample();
476 template<
class CloudType>
483 template<
class CloudType>