From 9c32b96e0173eafadfb085b45d3af3fa1b7caefc Mon Sep 17 00:00:00 2001 From: graham <graham.macpherson@strath.ac.uk> Date: Fri, 6 Mar 2009 15:53:01 +0000 Subject: [PATCH] Added equipartition internal energy distribution sampling function and calling on particle intialisation, Maxwellian wall collision and free stream injection. Interface with WallInteractionModel modified to pass a scalar& for the internal energy and a label to specify the typeId. --- .../clouds/Templates/DsmcCloud/DsmcCloud.C | 49 +++++++++++++++++-- .../clouds/Templates/DsmcCloud/DsmcCloud.H | 11 ++++- .../parcels/Templates/DsmcParcel/DsmcParcel.C | 13 +++-- .../LarsenBorgnakkeVariableHardSphere.C | 4 +- .../FreeStream/FreeStream.C | 8 +-- .../MaxwellianThermal/MaxwellianThermal.C | 9 +++- .../MaxwellianThermal/MaxwellianThermal.H | 3 +- .../SpecularReflection/SpecularReflection.C | 3 +- .../SpecularReflection/SpecularReflection.H | 3 +- .../WallInteractionModel.H | 3 +- 10 files changed, 86 insertions(+), 20 deletions(-) diff --git a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C index 0e39c2ff33a..927f2199ec9 100644 --- a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C +++ b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C @@ -172,9 +172,11 @@ void Foam::DsmcCloud<ParcelType>::initialise cP.mass() ); - scalar Ei = - 0.5*cP.internalDegreesOfFreedom() - *kb*temperature; + scalar Ei = equipartitionInternalEnergy + ( + temperature, + cP.internalDegreesOfFreedom() + ); U += velocity; @@ -690,6 +692,47 @@ Foam::vector Foam::DsmcCloud<ParcelType>::equipartitionLinearVelocity } +template<class ParcelType> +Foam::scalar Foam::DsmcCloud<ParcelType>::equipartitionInternalEnergy +( + scalar temperature, + scalar iDof +) +{ + scalar Ei = 0.0; + + if + ( + iDof < 2.0 + SMALL + && iDof > 2.0 - SMALL + ) + { + // Special case for iDof = 2, i.e. diatomics; + Ei = -log(rndGen_.scalar01())*kb*temperature; + } + else + { + scalar a = 0.5*iDof - 1; + + scalar energyRatio; + + scalar P; + + do + { + energyRatio = 10*rndGen_.scalar01(); + + P = pow((energyRatio/a), a)*exp(a - energyRatio); + + } while (P < rndGen_.scalar01()); + + Ei = energyRatio*kb*temperature; + } + + return Ei; +} + + template<class ParcelType> void Foam::DsmcCloud<ParcelType>::dumpParticlePositions() const { diff --git a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H index 8e8fd5cbd74..b246b049904 100644 --- a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H +++ b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H @@ -281,8 +281,17 @@ public: scalar mass ); - //- From the Maxwellian distribution: + //- Generate a random internal energy, sampled from the + // equilibrium distribution (Bird eqn 11.22 and 11.23 and + // adapting code from DSMC3.FOR) + scalar equipartitionInternalEnergy + ( + scalar temperature, + scalar internalDegreesOfFreedom + ); + + // From the Maxwellian distribution: //- Average particle speed inline scalar maxwellianAverageSpeed ( diff --git a/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C b/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C index 93058e076e4..f9c13571894 100644 --- a/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C +++ b/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C @@ -109,25 +109,28 @@ void Foam::DsmcParcel<ParcelType>::hitWallPatch { const constantProperties& constProps(td.cloud().constProps(typeId_)); + scalar m = constProps.mass(); + // pre-interaction energy - scalar preIE = 0.5*constProps.mass()*(U_ & U_) + Ei_; + scalar preIE = 0.5*m*(U_ & U_) + Ei_; // pre-interaction momentum - vector preIMom = constProps.mass()*U_; + vector preIMom = m*U_; td.cloud().wallInteraction().correct ( wpp, this->face(), U_, - constProps.mass() + Ei_, + typeId_ ); // post-interaction energy - scalar postIE = 0.5*constProps.mass()*(U_ & U_) + Ei_; + scalar postIE = 0.5*m*(U_ & U_) + Ei_; // post-interaction momentum - vector postIMom = constProps.mass()*U_; + vector postIMom = m*U_; label wppIndex = wpp.index(); diff --git a/src/lagrangian/dsmc/submodels/BinaryCollisionModel/LarsenBorgnakkeVariableHardSphere/LarsenBorgnakkeVariableHardSphere.C b/src/lagrangian/dsmc/submodels/BinaryCollisionModel/LarsenBorgnakkeVariableHardSphere/LarsenBorgnakkeVariableHardSphere.C index 1cf6fd90dcf..ff75da32b4e 100644 --- a/src/lagrangian/dsmc/submodels/BinaryCollisionModel/LarsenBorgnakkeVariableHardSphere/LarsenBorgnakkeVariableHardSphere.C +++ b/src/lagrangian/dsmc/submodels/BinaryCollisionModel/LarsenBorgnakkeVariableHardSphere/LarsenBorgnakkeVariableHardSphere.C @@ -81,9 +81,7 @@ Foam::scalar Foam::LarsenBorgnakkeVariableHardSphere<CloudType>::energyRatio ChiBMinusOne ); } - } - - while (P < rndGen.scalar01()); + } while (P < rndGen.scalar01()); return energyRatio; } diff --git a/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C b/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C index a69f74aa994..1367198efac 100644 --- a/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C +++ b/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C @@ -237,9 +237,11 @@ void Foam::FreeStream<CloudType>::inflow() U += velocity_; - scalar Ei = - 0.5*cloud.constProps(typeId).internalDegreesOfFreedom() - *CloudType::kb*temperature_; + scalar Ei = cloud.equipartitionInternalEnergy + ( + temperature_, + cloud.constProps(typeId).internalDegreesOfFreedom() + ); cloud.addNewParcel ( diff --git a/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.C b/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.C index a6ed8e57183..d8973fc5001 100644 --- a/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.C +++ b/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.C @@ -54,7 +54,8 @@ void Foam::MaxwellianThermal<CloudType>::correct const wallPolyPatch& wpp, const label faceId, vector& U, - scalar mass + scalar& Ei, + label typeId ) { label wppIndex = wpp.index(); @@ -102,6 +103,10 @@ void Foam::MaxwellianThermal<CloudType>::correct scalar T = cloud.T().boundaryField()[wppIndex][wppLocalFace]; + scalar mass = cloud.constProps(typeId).mass(); + + scalar iDof = cloud.constProps(typeId).internalDegreesOfFreedom(); + U = sqrt(CloudType::kb*T/mass) *( @@ -111,6 +116,8 @@ void Foam::MaxwellianThermal<CloudType>::correct ); U += cloud.U().boundaryField()[wppIndex][wppLocalFace]; + + Ei = cloud.equipartitionInternalEnergy(T, iDof); } diff --git a/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.H b/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.H index 1542d20ff05..a52a066aec2 100644 --- a/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.H +++ b/src/lagrangian/dsmc/submodels/WallInteractionModel/MaxwellianThermal/MaxwellianThermal.H @@ -78,7 +78,8 @@ public: const wallPolyPatch& wpp, const label faceId, vector& U, - scalar mass + scalar& Ei, + label typeId ); }; diff --git a/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.C b/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.C index 38e6621d30b..4de5507bf00 100644 --- a/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.C +++ b/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.C @@ -56,7 +56,8 @@ void Foam::SpecularReflection<CloudType>::correct const wallPolyPatch& wpp, const label faceId, vector& U, - scalar mass + scalar& Ei, + label typeId ) { vector nw = wpp.faceAreas()[wpp.whichFace(faceId)]; diff --git a/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.H b/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.H index 67d0adf8b07..d2208bd3503 100644 --- a/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.H +++ b/src/lagrangian/dsmc/submodels/WallInteractionModel/SpecularReflection/SpecularReflection.H @@ -76,7 +76,8 @@ public: const wallPolyPatch& wpp, const label faceId, vector& U, - scalar mass + scalar& Ei, + label typeId ); }; diff --git a/src/lagrangian/dsmc/submodels/WallInteractionModel/WallInteractionModel/WallInteractionModel.H b/src/lagrangian/dsmc/submodels/WallInteractionModel/WallInteractionModel/WallInteractionModel.H index d8667201a7a..582bf2b1065 100644 --- a/src/lagrangian/dsmc/submodels/WallInteractionModel/WallInteractionModel/WallInteractionModel.H +++ b/src/lagrangian/dsmc/submodels/WallInteractionModel/WallInteractionModel/WallInteractionModel.H @@ -130,7 +130,8 @@ public: const wallPolyPatch& wpp, const label faceId, vector& U, - scalar mass + scalar& Ei, + label typeId ) = 0; }; -- GitLab