From e9065915220abb27a3c6ff7835da439552a5b4a0 Mon Sep 17 00:00:00 2001 From: andy <a.heather@opencfd.co.uk> Date: Tue, 3 Mar 2009 17:59:44 +0000 Subject: [PATCH] multiple updates Injection: - moved position and velocity constraints for 2-d cases to the base InjectionModel - added validInjection function Clouds - added an effective density function to the KinematicCloud --- .../Templates/KinematicCloud/KinematicCloud.H | 4 + .../KinematicCloud/KinematicCloudI.H | 55 +++++++++-- .../ConeInjection/ConeInjection.C | 38 ++----- .../ConeInjection/ConeInjection.H | 14 +-- .../InjectionModel/InjectionModel.C | 98 ++++++++++++++----- .../InjectionModel/InjectionModel.H | 13 ++- .../ManualInjection/ManualInjection.C | 41 ++------ .../ManualInjection/ManualInjection.H | 18 ++-- .../InjectionModel/NoInjection/NoInjection.C | 11 ++- .../InjectionModel/NoInjection/NoInjection.H | 14 +-- 10 files changed, 183 insertions(+), 123 deletions(-) diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index 15c8cf4d035..7d05141fca0 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -320,6 +320,10 @@ public: // Note: for particles belonging to this cloud only inline const tmp<volScalarField> alpha() const; + //- Return the particle effective density field + // Note: for particles belonging to this cloud only + inline const tmp<volScalarField> rhoEff() const; + // Cloud evolution functions diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index 2b8cca12d16..948a6b5dfff 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -91,6 +91,7 @@ Foam::KinematicCloud<ParcelType>::g() const return g_; } + template<class ParcelType> inline const Foam::dictionary& Foam::KinematicCloud<ParcelType>::interpolationSchemes() const @@ -212,7 +213,7 @@ Foam::KinematicCloud<ParcelType>::SU1() const dimensionedVector ( "zero", - dimensionSet(1, -2, -2, 0, 0), + dimDensity*dimVelocity/dimTime, vector::zero ) ) @@ -237,9 +238,10 @@ Foam::KinematicCloud<ParcelType>::SU2(volVectorField& U) const << min(UCoeff_) << ", " << max(UCoeff_) << endl; } - return UTrans_/(mesh_.V()*this->db().time().deltaT()) - - fvm::Sp(UCoeff_/mesh_.V(), U) - + UCoeff_/mesh_.V()*U; + return + UTrans_/(mesh_.V()*this->db().time().deltaT()) + - fvm::Sp(UCoeff_/mesh_.V(), U) + + UCoeff_/mesh_.V()*U; } @@ -261,7 +263,7 @@ Foam::KinematicCloud<ParcelType>::theta() const false ), mesh_, - dimensionedScalar("zero", dimensionSet(0, 0, 0, 0, 0), 0.0) + dimensionedScalar("zero", dimless, 0.0) ) ); @@ -274,7 +276,7 @@ Foam::KinematicCloud<ParcelType>::theta() const theta[cellI] += p.nParticle()*p.volume(); } - theta /= mesh().cellVolumes(); + theta /= mesh().V(); return ttheta; } @@ -298,7 +300,7 @@ Foam::KinematicCloud<ParcelType>::alpha() const false ), mesh_, - dimensionedScalar("zero", dimensionSet(0, 0, 0, 0, 0), 0.0) + dimensionedScalar("zero", dimless, 0.0) ) ); @@ -311,10 +313,47 @@ Foam::KinematicCloud<ParcelType>::alpha() const alpha[cellI] += p.nParticle()*p.mass(); } - alpha /= (mesh().cellVolumes()*rho_); + alpha /= (mesh().V()*rho_); return talpha; } +template<class ParcelType> +inline const Foam::tmp<Foam::volScalarField> +Foam::KinematicCloud<ParcelType>::rhoEff() const +{ + tmp<volScalarField> trhoEff + ( + new volScalarField + ( + IOobject + ( + this->name() + "RhoEff", + this->db().time().timeName(), + this->db(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedScalar("zero", dimDensity, 0.0) + ) + ); + + scalarField& rhoEff = trhoEff().internalField(); + forAllConstIter(typename KinematicCloud<ParcelType>, *this, iter) + { + const ParcelType& p = iter(); + const label cellI = p.cell(); + + rhoEff[cellI] += p.nParticle()*p.mass(); + } + + rhoEff /= mesh().V(); + + return trhoEff; +} + + // ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C index a6d5a830413..56a497803ab 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C @@ -176,34 +176,12 @@ void Foam::ConeInjection<CloudType>::setPositionAndCell ( const label, const scalar, - const polyMeshInfo& meshInfo, vector& position, label& cellOwner ) { position = position_; this->findCellAtPosition(cellOwner, position); - - if (meshInfo.caseIs2d()) - { - if (meshInfo.caseIs2dWedge()) - { - position.component(meshInfo.emptyComponent()) = 0.0; - } - else if (meshInfo.caseIs2dSlab()) - { - position.component(meshInfo.emptyComponent()) = - meshInfo.centrePoint().component(meshInfo.emptyComponent()); - } - else - { - FatalErrorIn - ( - "void Foam::ConeInjection<CloudType>::setPositionAndCell" - ) << "Could not determine 2-D case geometry" << nl - << abort(FatalError); - } - } } @@ -211,8 +189,7 @@ template<class CloudType> Foam::vector Foam::ConeInjection<CloudType>::velocity ( const label, - const scalar time, - const polyMeshInfo& meshInfo + const scalar time ) { const scalar deg2Rad = mathematicalConstant::pi/180.0; @@ -231,13 +208,6 @@ Foam::vector Foam::ConeInjection<CloudType>::velocity vector normal = alpha*(tanVec1_*cos(beta) + tanVec2_*sin(beta)); vector dirVec = dcorr*direction_; dirVec += normal; - - // Remove empty component of velocity for slab cases - if (meshInfo.caseIs2dSlab()) - { - dirVec.component(meshInfo.emptyComponent()) = 0.0; - } - dirVec /= mag(dirVec); return Umag_().value(t)*dirVec; @@ -255,4 +225,10 @@ Foam::scalar Foam::ConeInjection<CloudType>::d0 } +template<class CloudType> +bool Foam::ConeInjection<CloudType>::validInjection(const label iParcel) +{ + return true; +} + // ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H index 610f201a1d3..22faf297eb8 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H @@ -162,7 +162,6 @@ public: ( const label iParcel, const scalar time, - const polyMeshInfo& meshInfo, vector& position, label& cellOwner ); @@ -170,17 +169,20 @@ public: //- Return the velocity of the parcel to introduce at a time vector velocity ( - const label, - const scalar time, - const polyMeshInfo& meshInfo + const label iParcel, + const scalar time ); //- Return the diameter of the parcel to introduce at a time scalar d0 ( - const label, - const scalar + const label iParcel, + const scalar time ) const; + + //- Return flag to identify whether or not injection in cellI is + // permitted + bool validInjection(const label iParcel); }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C index 0aaeb44cd46..98c762f0ece 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C @@ -228,6 +228,49 @@ Foam::scalar Foam::InjectionModel<CloudType>::setNumberOfParticles } +template<class CloudType> +void Foam::InjectionModel<CloudType>::geometryCorrection(vector& pos) const +{ + if (owner_.meshInfo().caseIs2d()) + { + if (owner_.meshInfo().caseIs2dWedge()) + { + pos.component(owner_.meshInfo().emptyComponent()) = 0.0; + } + else if (owner_.meshInfo().caseIs2dSlab()) + { + pos.component(owner_.meshInfo().emptyComponent()) = + owner_.meshInfo().centrePoint().component + ( + owner_.meshInfo().emptyComponent() + ); + } + else + { + FatalErrorIn + ( + "void Foam::InjectionModel<CloudType>::geometryCorrection" + "(vector& pos)" + ) << "Could not determine 2-D case geometry" << nl + << abort(FatalError); + } + } +} + + +template<class CloudType> +void Foam::InjectionModel<CloudType>::velocityCorrection(vector& U) const +{ + if (owner_.meshInfo().caseIs2dSlab()) + { + U.component(owner_.meshInfo().emptyComponent()) = + owner_.meshInfo().centrePoint().component + ( + owner_.meshInfo().emptyComponent() + ); + } +} + template<class CloudType> void Foam::InjectionModel<CloudType>::postInjectCheck() { @@ -380,33 +423,40 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td) // Determine the injection position and owner cell label cellI = -1; vector pos = vector::zero; - setPositionAndCell(iParcel, timeInj, owner_.meshInfo(), pos, cellI); + setPositionAndCell(iParcel, timeInj, pos, cellI); if (cellI >= 0) { - // Diameter of parcels - scalar d = d0(iParcel, timeInj); - - // Number of particles per parcel - scalar nP = setNumberOfParticles - ( - newParcels, - newVolume, - volFraction, - d, - rho - ); - - // Velocity of parcels - vector U = velocity(iParcel, timeInj, owner_.meshInfo()); - - // Lagrangian timestep - scalar dt = time - timeInj; - - // Add the new parcel - td.cloud().addNewParcel(pos, cellI, d, U, nP, dt); - massInjected_ += nP*rho*mathematicalConstant::pi*pow3(d)/6.0; - parcelsAdded_++; + if (validInjection(iParcel)) + { + // Diameter of parcels + scalar d = d0(iParcel, timeInj); + + // Number of particles per parcel + scalar nP = setNumberOfParticles + ( + newParcels, + newVolume, + volFraction, + d, + rho + ); + + // Velocity of parcels + vector U = velocity(iParcel, timeInj); + + // Lagrangian timestep + scalar dt = time - timeInj; + + // Apply corrections for 2-D cases + geometryCorrection(pos); + velocityCorrection(U); + + // Add the new parcel + td.cloud().addNewParcel(pos, cellI, d, U, nP, dt); + massInjected_ += nP*rho*mathematicalConstant::pi*pow3(d)/6.0; + parcelsAdded_++; + } } else { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H index dd7d71de248..4c4d546c179 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H @@ -88,6 +88,12 @@ private: //- Write injector properties void writeProps(); + //- Geometry correction for 2-D cases + void geometryCorrection(vector& pos) const; + + //- Velocity correction for 2-D cases + void velocityCorrection(vector& U) const; + protected: @@ -149,6 +155,9 @@ protected: const scalar time1 ) const = 0; + //- Additional flag to identify whether or not injection in cellI is + // permitted + virtual bool validInjection(const label iParcel) = 0; //- Determine properties for next time step/injection interval virtual void prepareForNextTimeStep @@ -287,7 +296,6 @@ public: ( const label iParcel, const scalar time, - const polyMeshInfo& meshInfo, vector& position, label& cellOwner ) = 0; @@ -296,8 +304,7 @@ public: virtual vector velocity ( const label iParcel, - const scalar time, - const polyMeshInfo& meshInfo + const scalar time ) = 0; //- Return the diameter of the parcel to introduce at a time diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C index 6a8361d7df2..a059b81b7c1 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C @@ -139,34 +139,12 @@ void Foam::ManualInjection<CloudType>::setPositionAndCell ( const label iParcel, const scalar time, - const polyMeshInfo& meshInfo, vector& position, label& cellOwner ) { position = positions_[iParcel]; this->findCellAtPosition(cellOwner, position); - - if (meshInfo.caseIs2d()) - { - if (meshInfo.caseIs2dWedge()) - { - position.component(meshInfo.emptyComponent()) = 0.0; - } - else if (meshInfo.caseIs2dSlab()) - { - position.component(meshInfo.emptyComponent()) = - meshInfo.centrePoint().component(meshInfo.emptyComponent()); - } - else - { - FatalErrorIn - ( - "void Foam::ManualInjection<CloudType>::setPositionAndCell" - ) << "Could not determine 2-D case geometry" << nl - << abort(FatalError); - } - } } @@ -174,18 +152,10 @@ template<class CloudType> Foam::vector Foam::ManualInjection<CloudType>::velocity ( const label, - const scalar, - const polyMeshInfo& meshInfo + const scalar ) { - vector vel = U0_; - if (meshInfo.caseIs2dSlab()) - { - vel.component(meshInfo.emptyComponent()) = - meshInfo.centrePoint().component(meshInfo.emptyComponent()); - } - - return vel; + return U0_; } @@ -200,4 +170,11 @@ Foam::scalar Foam::ManualInjection<CloudType>::d0 } +template<class CloudType> +bool Foam::ManualInjection<CloudType>::validInjection(const label) +{ + return true; +} + + // ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H index 84033863578..d97ac345244 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H @@ -33,11 +33,7 @@ Description - Parcel positions in file @c positionsFile - Initial parcel velocity - Parcel diameters obtained by PDF model - - All parcels introduced at the start of the calculation - -Note - Not suitable for 2-D slab/wedge simulations unless the @c positionsFile - describes 2-D data. + - All parcels introduced at SOI SourceFiles ManualInjection.C @@ -143,7 +139,6 @@ public: ( const label iParcel, const scalar time, - const polyMeshInfo& meshInfo, vector& position, label& cellOwner ); @@ -151,17 +146,20 @@ public: //- Return the velocity of the parcel to introduce at a time vector velocity ( - const label, - const scalar time, - const polyMeshInfo& meshInfo + const label iParcel, + const scalar time ); //- Return the diameter of the parcel to introduce at a time scalar d0 ( - const label, + const label iParcel, const scalar ) const; + + //- Return flag to identify whether or not injection in cellI is + // permitted + bool validInjection(const label iParcel); }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C index fcbd1b6981d..5e51bc26a9e 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C @@ -92,7 +92,6 @@ void Foam::NoInjection<CloudType>::setPositionAndCell ( const label, const scalar, - const polyMeshInfo&, vector&, label& ) @@ -103,8 +102,7 @@ template<class CloudType> Foam::vector Foam::NoInjection<CloudType>::velocity ( const label, - const scalar, - const polyMeshInfo& + const scalar ) { return vector::zero; @@ -122,4 +120,11 @@ Foam::scalar Foam::NoInjection<CloudType>::d0 } +template<class CloudType> +bool Foam::NoInjection<CloudType>::validInjection(const label) +{ + return false; +} + + // ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H index cb849a4951f..ab6a2ec54a7 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H @@ -107,7 +107,6 @@ public: ( const label iParcel, const scalar time, - const polyMeshInfo& meshInfo, vector& position, label& cellOwner ); @@ -115,17 +114,20 @@ public: //- Return the velocity of the parcel to introduce at a time vector velocity ( - const label, - const scalar time, - const polyMeshInfo& meshInfo + const label iParcel, + const scalar time ); //- Return the diameter of the parcel to introduce at a time scalar d0 ( - const label, - const scalar + const label iParcel, + const scalar time ) const; + + //- Return flag to identify whether or not injection in cellI is + // permitted + bool validInjection(const label cellI); }; -- GitLab