void Foam::solidParticle::hitWallPatch ( const wallPolyPatch& wpp, solidParticle::trackData& td ) { vector nw = wpp.faceAreas()[wpp.whichFace(face())]; nw /= mag(nw); scalar Un = U_ & nw; vector Ut = U_ - Un*nw; if (Un > 0) { U_ -= (1.0 + td.spc().e())*Un*nw; } U_ -= td.spc().mu()*Ut; }
void Foam::SpecularReflection<CloudType>::correct ( const wallPolyPatch& wpp, const label faceId, vector& U, scalar& Ei, label typeId ) { vector nw = wpp.faceAreas()[wpp.whichFace(faceId)]; nw /= mag(nw); scalar magUn = U & nw; if (magUn > 0.0) { U -= 2.0*magUn*nw; } }
void Foam::StandardWallInteraction<CloudType>::correct ( const wallPolyPatch& wpp, const label faceId, vector& U ) const { vector nw = wpp.faceAreas()[wpp.whichFace(faceId)]; nw /= mag(nw); scalar Un = U & nw; vector Ut = U - Un*nw; if (Un > 0) { U -= (1.0 + e_)*Un*nw; } U -= mu_*Ut; }
void Foam::MaxwellianThermal<CloudType>::correct ( typename CloudType::parcelType& p, const wallPolyPatch& wpp ) { vector& U = p.U(); scalar& Ei = p.Ei(); label typeId = p.typeId(); label wppIndex = wpp.index(); label wppLocalFace = wpp.whichFace(p.face()); vector nw = p.normal(); nw /= mag(nw); // Normal velocity magnitude scalar U_dot_nw = U & nw; // Wall tangential velocity (flow direction) vector Ut = U - U_dot_nw*nw; CloudType& cloud(this->owner()); Random& rndGen(cloud.rndGen()); while (mag(Ut) < SMALL) { // If the incident velocity is parallel to the face normal, no // tangential direction can be chosen. Add a perturbation to the // incoming velocity and recalculate. U = vector ( U.x()*(0.8 + 0.2*rndGen.scalar01()), U.y()*(0.8 + 0.2*rndGen.scalar01()), U.z()*(0.8 + 0.2*rndGen.scalar01()) ); U_dot_nw = U & nw; Ut = U - U_dot_nw*nw; } // Wall tangential unit vector vector tw1 = Ut/mag(Ut); // Other tangential unit vector vector tw2 = nw^tw1; scalar T = cloud.boundaryT().boundaryField()[wppIndex][wppLocalFace]; scalar mass = cloud.constProps(typeId).mass(); scalar iDof = cloud.constProps(typeId).internalDegreesOfFreedom(); U = sqrt(physicoChemical::k.value()*T/mass) *( rndGen.GaussNormal()*tw1 + rndGen.GaussNormal()*tw2 - sqrt(-2.0*log(max(1 - rndGen.scalar01(), VSMALL)))*nw ); U += cloud.boundaryU().boundaryField()[wppIndex][wppLocalFace]; Ei = cloud.equipartitionInternalEnergy(T, iDof); }
void Foam::DsmcParcel<ParcelType>::hitWallPatch ( const wallPolyPatch& wpp, TrackData& td, const tetIndices& tetIs ) { label wppIndex = wpp.index(); label wppLocalFace = wpp.whichFace(this->face()); const scalar fA = mag(wpp.faceAreas()[wppLocalFace]); const scalar deltaT = td.cloud().pMesh().time().deltaTValue(); const constantProperties& constProps(td.cloud().constProps(typeId_)); scalar m = constProps.mass(); vector nw = wpp.faceAreas()[wppLocalFace]; nw /= mag(nw); scalar U_dot_nw = U_ & nw; vector Ut = U_ - U_dot_nw*nw; scalar invMagUnfA = 1/max(mag(U_dot_nw)*fA, VSMALL); td.cloud().rhoNBF()[wppIndex][wppLocalFace] += invMagUnfA; td.cloud().rhoMBF()[wppIndex][wppLocalFace] += m*invMagUnfA; td.cloud().linearKEBF()[wppIndex][wppLocalFace] += 0.5*m*(U_ & U_)*invMagUnfA; td.cloud().internalEBF()[wppIndex][wppLocalFace] += Ei_*invMagUnfA; td.cloud().iDofBF()[wppIndex][wppLocalFace] += constProps.internalDegreesOfFreedom()*invMagUnfA; td.cloud().momentumBF()[wppIndex][wppLocalFace] += m*Ut*invMagUnfA; // pre-interaction energy scalar preIE = 0.5*m*(U_ & U_) + Ei_; // pre-interaction momentum vector preIMom = m*U_; td.cloud().wallInteraction().correct ( static_cast<DsmcParcel<ParcelType> &>(*this), wpp ); U_dot_nw = U_ & nw; Ut = U_ - U_dot_nw*nw; invMagUnfA = 1/max(mag(U_dot_nw)*fA, VSMALL); td.cloud().rhoNBF()[wppIndex][wppLocalFace] += invMagUnfA; td.cloud().rhoMBF()[wppIndex][wppLocalFace] += m*invMagUnfA; td.cloud().linearKEBF()[wppIndex][wppLocalFace] += 0.5*m*(U_ & U_)*invMagUnfA; td.cloud().internalEBF()[wppIndex][wppLocalFace] += Ei_*invMagUnfA; td.cloud().iDofBF()[wppIndex][wppLocalFace] += constProps.internalDegreesOfFreedom()*invMagUnfA; td.cloud().momentumBF()[wppIndex][wppLocalFace] += m*Ut*invMagUnfA; // post-interaction energy scalar postIE = 0.5*m*(U_ & U_) + Ei_; // post-interaction momentum vector postIMom = m*U_; scalar deltaQ = td.cloud().nParticle()*(preIE - postIE)/(deltaT*fA); vector deltaFD = td.cloud().nParticle()*(preIMom - postIMom)/(deltaT*fA); td.cloud().qBF()[wppIndex][wppLocalFace] += deltaQ; td.cloud().fDBF()[wppIndex][wppLocalFace] += deltaFD; }