diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index 15c8cf4d0357a2f2689a60c5ee7e94e2471fc48d..7d05141fca04ff37509ff6868fcc1d68710ebe81 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 2b8cca12d1657de733eb7ebb1e99b50fe8a59e8c..948a6b5dfffc2605fefb5a3ef9e81f83c08d042b 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 a6d5a830413ca6811529cfc3c0d50bb95fc2a7dc..56a497803ab9f74963cfaa0a84b53900bd655b31 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 610f201a1d3716776de5b382cefe4abaf38e7663..22faf297eb8761365f05adb25e9a03eb698c3425 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 0aaeb44cd4619d85019bce8d6628517956055e05..98c762f0eceb053a960cbaeae599f32e3310dc55 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 dd7d71de2484d406aee674e900f62c6c39b46118..4c4d546c179ece8888fd94eaffb1cb17d4ca16cf 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 6a8361d7df2ef9368a0b65264009b7c121764c02..a059b81b7c1fc2c547b9c5caa97ab45c6a59b6dc 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 8403386357803ab5acb6f64baeab57e8b8e8f5ba..d97ac345244689ebc0d27a3156c02b46a2357f29 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 fcbd1b6981d68e7d194d45a99d92100f7dc47ca3..5e51bc26a9ee1c3a8c392dc9248df4287d90fb06 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 cb849a4951f865f7121a8aff44b330c4033c84e9..ab6a2ec54a72010146db85f9abb0a49af8911e3f 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); };