37 template<
class CloudType>
48 particleFluxAccumulators_()
58 if (isType<polyPatch>(
patch))
68 this->coeffDict().subDict(
"numberDensities")
74 particleFluxAccumulators_.
setSize(patches_.size());
87 moleculeTypeIds_.setSize(molecules.size());
89 numberDensities_.setSize(molecules.size());
93 numberDensities_[i] = numberDensitiesDict.
get<scalar>(molecules[i]);
95 moleculeTypeIds_[i] =
cloud.typeIdList().
find(molecules[i]);
97 if (moleculeTypeIds_[i] == -1)
100 <<
"typeId " << molecules[i] <<
"not defined in cloud." <<
nl
105 numberDensities_ /=
cloud.nParticle();
112 template<
class CloudType>
119 template<
class CloudType>
127 label patchi = patches_[
p];
140 template<
class CloudType>
147 const scalar deltaT =
mesh.time().deltaTValue();
153 label particlesInserted = 0;
155 const volScalarField::Boundary& boundaryT
157 cloud.boundaryT().boundaryField()
160 const volVectorField::Boundary& boundaryU
162 cloud.boundaryU().boundaryField()
168 label patchi = patches_[
p];
180 label typeId = moleculeTypeIds_[i];
182 scalar mass =
cloud.constProps(typeId).mass();
184 if (
min(boundaryT[patchi]) < SMALL)
187 <<
"Zero boundary temperature detected, check boundaryT "
188 <<
"condition." <<
nl
194 cloud.maxwellianMostProbableSpeed
208 (boundaryU[patchi] & -
patch.faceAreas()/
mag(
patch.faceAreas()))
215 mag(
patch.faceAreas())*numberDensities_[i]*deltaT
218 exp(-
sqr(sCosTheta)) + sqrtPi*sCosTheta*(1 +
erf(sCosTheta))
230 label globalFaceIndex = pFI +
patch.start();
232 label celli =
mesh.faceOwner()[globalFaceIndex];
236 scalar fA =
mag(
patch.faceAreas()[pFI]);
248 scalar previousCummulativeSum = 0.0;
256 + previousCummulativeSum;
258 previousCummulativeSum = cTriAFracs[triI];
263 cTriAFracs.last() = 1.0;
277 scalar faceTemperature = boundaryT[patchi][pFI];
279 const vector& faceVelocity = boundaryU[patchi][pFI];
283 scalar& faceAccumulator = pFA[i][pFI];
286 label nI =
max(label(faceAccumulator), 0);
290 if ((faceAccumulator - nI) >
rndGen.sample01<scalar>())
295 faceAccumulator -= nI;
297 label typeId = moleculeTypeIds_[i];
299 scalar mass =
cloud.constProps(typeId).mass();
301 for (label i = 0; i < nI; i++)
306 scalar triSelection =
rndGen.sample01<scalar>();
309 label selectedTriI = -1;
315 if (cTriAFracs[triI] >= triSelection)
323 const tetIndices& faceTetIs = faceTets[selectedTriI];
329 scalar mostProbableSpeed
331 cloud.maxwellianMostProbableSpeed
338 scalar sCosTheta = (faceVelocity &
n)/mostProbableSpeed;
341 scalar uNormProbCoeffA =
342 sCosTheta +
sqrt(
sqr(sCosTheta) + 2.0);
344 scalar uNormProbCoeffB =
348 + sCosTheta*(sCosTheta -
sqrt(
sqr(sCosTheta) + 2.0))
352 scalar randomScaling = 3.0;
356 randomScaling =
mag(sCosTheta) + 1;
364 scalar uNormalThermal;
370 randomScaling*(2.0*
rndGen.sample01<scalar>() - 1);
372 uNormal = uNormalThermal + sCosTheta;
380 P = 2.0*uNormal/uNormProbCoeffA
381 *
exp(uNormProbCoeffB -
sqr(uNormalThermal));
384 }
while (P <
rndGen.sample01<scalar>());
389 rndGen.GaussNormal<scalar>()*t1
390 +
rndGen.GaussNormal<scalar>()*t2
392 + (t1 & faceVelocity)*t1
393 + (t2 & faceVelocity)*t2
394 + mostProbableSpeed*uNormal*
n;
396 scalar Ei =
cloud.equipartitionInternalEnergy
399 cloud.constProps(typeId).internalDegreesOfFreedom()
402 cloud.addNewParcel(
p, celli,
U, Ei, typeId);
412 Info<<
" Particles inserted = "
413 << particlesInserted <<
endl;