30 template<
class ParcelType>
31 template<
class TrackData>
39 rhoc_ = td.rhoInterp().interpolate(this->position(), cellI);
40 if (rhoc_ < td.constProps().rhoMin())
44 "void Foam::KinematicParcel<ParcelType>::setCellValues"
50 ) <<
"Limiting observed density in cell " << cellI <<
" to "
51 << td.constProps().rhoMin() <<
nl <<
endl;
53 rhoc_ = td.constProps().rhoMin();
56 Uc_ = td.UInterp().interpolate(this->position(), cellI);
58 muc_ = td.muInterp().interpolate(this->position(), cellI);
61 Uc_ = td.cloud().dispersion().update
73 template<
class ParcelType>
74 template<
class TrackData>
82 Uc_ += td.cloud().UTrans()[cellI]/massCell(cellI);
86 template<
class ParcelType>
87 template<
class TrackData>
97 const scalar np0 = nParticle_;
100 const scalar rho0 = rho_;
101 const scalar mass0 = mass();
104 const scalar
Re = this->
Re(U0, d0, rhoc_, muc_);
114 vector dUTrans = vector::zero;
122 calcVelocity(td, dt, cellI, Re, muc_, d0, U0, rho0, mass0, Su, dUTrans);
127 if (td.cloud().coupled())
130 td.cloud().UTrans()[cellI] += np0*dUTrans;
140 template<
class ParcelType>
141 template<
class TrackData>
160 const scalar utc = td.cloud().drag().utc(Re, d, mu) + ROOTVSMALL;
164 mass*td.cloud().forces().calcCoupled(cellI, dt, rhoc_, rho, Uc_, U);
165 const vector FNonCoupled =
166 mass*td.cloud().forces().calcNonCoupled(cellI, dt, rhoc_, rho, Uc_, U);
173 const scalar As = this->areaS(d);
174 const vector ap = Uc_ + (FCoupled + FNonCoupled +
Su)/(utc*As);
175 const scalar bp = 6.0*utc/(rho*
d);
178 td.cloud().UIntegrator().integrate(U, dt, ap, bp);
182 dUTrans += dt*(utc*As*(Ures.
average() - Uc_) - FCoupled);
194 template <
class ParcelType>
202 nParticle_(p.nParticle_),
216 template<
class ParcelType>
217 template<
class TrackData>
220 ParcelType&
p =
static_cast<ParcelType&
>(*this);
222 td.switchProcessor =
false;
223 td.keepParticle =
true;
229 scalar tEnd = (1.0 - p.stepFraction())*deltaT;
230 const scalar dtMax = tEnd;
232 while (td.keepParticle && !td.switchProcessor && tEnd > ROOTVSMALL)
238 scalar dt =
min(dtMax, tEnd);
242 label cellI = p.cell();
246 dt *= p.trackToFace(p.position() + dt*U_, td);
250 p.stepFraction() = 1.0 - tEnd/deltaT;
256 p.setCellValues(td, dt, cellI);
258 if (td.cloud().cellValueSourceCorrection())
260 p.cellValueSourceCorrection(td, dt, cellI);
263 p.calc(td, dt, cellI);
266 if (p.onBoundary() && td.keepParticle)
268 if (isA<processorPolyPatch>(pbMesh[p.patch(p.face())]))
270 td.switchProcessor =
true;
275 return td.keepParticle;
279 template<
class ParcelType>
280 template<
class TrackData>
288 ParcelType&
p =
static_cast<ParcelType&
>(*this);
289 td.cloud().postProcessing().postPatch(p, patchI);
291 return td.cloud().patchInteraction().correct
302 template<
class ParcelType>
314 template<
class ParcelType>
315 template<
class TrackData>
322 td.switchProcessor =
true;
326 template<
class ParcelType>
335 template<
class ParcelType>
336 template<
class TrackData>
347 template<
class ParcelType>
356 template<
class ParcelType>
357 template<
class TrackData>
364 td.keepParticle =
false;
368 template<
class ParcelType>
373 template<
class ParcelType>
381 template<
class ParcelType>