49 Foam::multiHoleInjector::multiHoleInjector
56 propsDict_(dict.
subDict(typeName +
"Props")),
57 centerPosition_(propsDict_.lookup(
"position")),
58 xyAngle_(
readScalar(propsDict_.lookup(
"xyAngle"))),
59 zAngle_(
readScalar(propsDict_.lookup(
"zAngle"))),
60 nHoles_(readLabel(propsDict_.lookup(
"nHoles"))),
61 umbrellaAngle_(
readScalar(propsDict_.lookup(
"umbrellaAngle"))),
62 nozzleTipDiameter_(
readScalar(propsDict_.lookup(
"nozzleTipDiameter"))),
63 angleSpacing_(propsDict_.lookup(
"angleSpacing")),
67 nParcels_(readLabel(propsDict_.lookup(
"nParcels"))),
68 X_(propsDict_.lookup(
"X")),
69 massFlowRateProfile_(propsDict_.lookup(
"massFlowRateProfile")),
70 velocityProfile_(massFlowRateProfile_),
71 injectionPressureProfile_(massFlowRateProfile_),
72 CdProfile_(massFlowRateProfile_),
73 TProfile_(propsDict_.lookup(
"temperatureProfile")),
74 averageParcelMass_(nHoles_*mass_/nParcels_),
77 pressureIndependentVelocity_(
true),
78 tangentialInjectionVector1_(nHoles_),
79 tangentialInjectionVector2_(nHoles_)
84 if (
mag(massFlowRateProfile_[0][0]-TProfile_[0][0]) > SMALL)
86 FatalError <<
"multiHoleInjector::multiHoleInjector(const time& t, const dictionary dict) " <<
endl
87 <<
" start-times do not match for TemperatureProfile and massFlowRateProfile."
91 if (
mag(massFlowRateProfile_[massFlowRateProfile_.size()-1][0]-TProfile_[TProfile_.size()-1][0]) > SMALL)
93 FatalError <<
"multiHoleInjector::multiHoleInjector(const time& t, const dictionary dict) " <<
endl
94 <<
" end-times do not match for TemperatureProfile and massFlowRateProfile."
99 forAll(massFlowRateProfile_, i)
101 massFlowRateProfile_[i][0] = t.
userTimeToTime(massFlowRateProfile_[i][0]);
102 velocityProfile_[i][0] = massFlowRateProfile_[i][0];
103 injectionPressureProfile_[i][0] = massFlowRateProfile_[i][0];
111 scalar integratedMFR = integrateTable(massFlowRateProfile_);
113 forAll(massFlowRateProfile_, i)
116 massFlowRateProfile_[i][1] *= mass_/integratedMFR;
118 CdProfile_[i][0] = massFlowRateProfile_[i][0];
119 CdProfile_[i][1] = Cd_;
122 setTangentialVectors();
131 if (
mag(Xsum - 1.0) > SMALL)
133 Info <<
"Warning!!!\n multiHoleInjector::multiHoleInjector(const time& t, Istream& is)"
134 <<
"X does not add up to 1.0, correcting molar fractions."
152 void Foam::multiHoleInjector::setTangentialVectors()
155 scalar alpha = xyAngle_*pi180;
156 scalar
phi = zAngle_*pi180;
160 if (
mag(zp-xp) < 1.0
e-15)
162 xp =
vector(0.0, 0.0, -1.0);
173 scalar u = umbrellaAngle_*pi180/2.0;
174 for(label i=0; i<nHoles_; i++)
176 angle += angleSpacing_[i];
177 scalar v = angle*pi180;
179 vector dp = direction_[i] - (direction_[i] & zp)*direction_[i];
184 position_[i] = centerPosition_ + 0.5*nozzleTipDiameter_*dp;
188 Random rndGen(label(0));
190 for(label i=0; i<nHoles_; i++)
196 vector testThis = rndGen.vector01();
198 tangent = testThis - (testThis & direction_[i])*direction_[i];
202 tangentialInjectionVector1_[i] = tangent/magV;
203 tangentialInjectionVector2_[i] = direction_[i] ^ tangentialInjectionVector1_[i];
216 scalar mInj = mass_*(fractionOfInjection(time1)-fractionOfInjection(time0));
217 label nParcels = label(mInj/averageParcelMass_ + 0.49);
232 const scalar angleOfWedge,
233 const vector& axisOfSymmetry,
234 const vector& axisOfWedge,
235 const vector& axisOfWedgeNormal,
241 scalar is = position_[n] & axisOfSymmetry;
242 scalar magInj =
mag(position_[n] - is*axisOfSymmetry);
245 axisOfWedge*
cos(0.5*angleOfWedge)
246 + axisOfWedgeNormal*
sin(0.5*angleOfWedge);
247 halfWedge /=
mag(halfWedge);
249 return (is*axisOfSymmetry + magInj*halfWedge);
254 scalar iRadius = d_*rndGen.
scalar01();
262 tangentialInjectionVector1_[n]*
cos(iAngle)
263 + tangentialInjectionVector2_[n]*
sin(iAngle)
287 return direction_[i];
295 const scalar angleOfWedge
298 scalar mInj = mass_*(fractionOfInjection(time1)-fractionOfInjection(time0));
326 return getTableValue(TProfile_, time);
331 return massFlowRateProfile_[0][0];
336 return massFlowRateProfile_[massFlowRateProfile_.size()-1][0];
344 return getTableValue(massFlowRateProfile_, time);
352 return getTableValue(injectionPressureProfile_, time);
360 return getTableValue(velocityProfile_, time);
376 Foam::scalar Foam::multiHoleInjector::fractionOfInjection(
const scalar time)
const
378 return integrateTable(massFlowRateProfile_, time)/mass_;
386 return mass_*fractionOfInjection(t);
393 const scalar referencePressure
399 forAll(velocityProfile_, i)
401 scalar time = velocityProfile_[i][0];
402 scalar
rho = fuel.
rho(referencePressure,
T(time), X_);
403 scalar v = massFlowRateProfile_[i][1]/(Cd_*rho*
A);
404 velocityProfile_[i][1] = v;
405 injectionPressureProfile_[i][1] = referencePressure + 0.5*rho*v*v;
411 return tangentialInjectionVector1_[n];
416 return tangentialInjectionVector2_[n];