diff --git a/src/lagrangian/coalCombustion/coalParcel/coalParcel.C b/src/lagrangian/coalCombustion/coalParcel/coalParcel.C index a6500c8388e3f025709dc1d5f321936d918398bb..3445afe14eb3bd32418d0f01e087a92414158d9f 100644 --- a/src/lagrangian/coalCombustion/coalParcel/coalParcel.C +++ b/src/lagrangian/coalCombustion/coalParcel/coalParcel.C @@ -57,6 +57,7 @@ Foam::coalParcel::coalParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& pi0, @@ -78,6 +79,7 @@ Foam::coalParcel::coalParcel typeId, nParticle0, d0, + dTarget0, U0, f0, pi0, diff --git a/src/lagrangian/coalCombustion/coalParcel/coalParcel.H b/src/lagrangian/coalCombustion/coalParcel/coalParcel.H index 81f6447320c40fbde7138b7040575f56998340b4..6195de8439bb01ce34a359bac1d296c3aff3d398 100644 --- a/src/lagrangian/coalCombustion/coalParcel/coalParcel.H +++ b/src/lagrangian/coalCombustion/coalParcel/coalParcel.H @@ -79,6 +79,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& pi0, diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index ed5b5ae539b827b057c7cd12e4456c07ee95aec3..1d0a903810222341e512845b8097b661689ca990 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -297,9 +297,10 @@ public: //- Return refernce to the random object inline Random& rndGen(); - //- Return the cell occupancy information for each parcel, - // non-const access, the caller is responsible for updating - // it if particles are removed or created. + //- Return the cell occupancy information for each + // parcel, non-const access, the caller is + // responsible for updating it for its own purposes + // if particles are removed or created. inline List<DynamicList<ParcelType*> >& cellOccupancy(); diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.C index aa2db0b4de6fd7b220d6b773886ea7423a803e85..4e80d16d6f63d683db81b504d7d2561fa36aa5e6 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.C @@ -300,6 +300,27 @@ Foam::CollisionRecordList<PairType, WallType>::matchPairRecord } +template<class PairType, class WallType> +bool Foam::CollisionRecordList<PairType, WallType>::checkPairRecord +( + label origProcOfOther, + label origIdOfOther +) +{ + forAll(pairRecords_, i) + { + PairCollisionRecord<PairType>& pCR = pairRecords_[i]; + + if (pCR.match(origProcOfOther, origIdOfOther)) + { + return true; + } + } + + return false; +} + + template<class PairType, class WallType> Foam::WallCollisionRecord<WallType>& Foam::CollisionRecordList<PairType, WallType>::matchWallRecord @@ -333,6 +354,26 @@ Foam::CollisionRecordList<PairType, WallType>::matchWallRecord } +template<class PairType, class WallType> +bool Foam::CollisionRecordList<PairType, WallType>::checkWallRecord +( + const vector& pRel, + scalar radius +) +{ + forAll(wallRecords_, i) + { + WallCollisionRecord<WallType>& wCR = wallRecords_[i]; + + if (wCR.match(pRel, radius)) + { + return true; + } + } + + return false; +} + template<class PairType, class WallType> void Foam::CollisionRecordList<PairType, WallType>::update() diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.H index 51aa29849f3f6359d6e1c7015b802479277613b8..a933b35ca02e8c68af30c4739a5d3dae44d2bd73 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/CollisionRecordList/CollisionRecordList.H @@ -168,6 +168,10 @@ public: label origIdOfOther ); + //- Enquire if the specified record exists without modifying + // its accessed status + bool checkPairRecord(label origProcOfOther, label origIdOfOther); + //- Enquires if the position of wall impact relative to the // particle centre is present in the records. If so, return // access to the WallCollisionRecord (hence the data) and @@ -179,6 +183,10 @@ public: scalar radius ); + //- Enquire if the specified record exists without modifying + // its accessed status + bool checkWallRecord(const vector& pRel, scalar radius); + //- Update the collision records, deleting any records not // marked as having been accessed, then mark all records as // not accessed ready for the next evaluation diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index 26acc7d9e6e657b5d72cec2d3bbbd3ec97f7fefa..f6ba6aeed3a74760a53e98ae973796c438b2ef95 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -225,6 +225,7 @@ Foam::KinematicParcel<ParcelType>::KinematicParcel typeId_(p.typeId_), nParticle_(p.nParticle_), d_(p.d_), + dTarget_(p.dTarget_), U_(p.U_), f_(p.f_), angularMomentum_(p.angularMomentum_), diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H index b87a1390df4fb36ab31475e7e03caa974006d3c5..4a76cb0173c634584c2f9b6ee7ce480843c8b592 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H @@ -250,6 +250,9 @@ protected: //- Diameter [m] scalar d_; + //- Target diameter [m] + scalar dTarget_; + //- Velocity of Parcel [m/s] vector U_; @@ -347,6 +350,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -388,6 +392,9 @@ public: //- Return const access to diameter inline scalar d() const; + //- Return const access to target diameter + inline scalar dTarget() const; + //- Return const access to velocity inline const vector& U() const; @@ -427,6 +434,9 @@ public: //- Return access to diameter inline scalar& d(); + //- Return access to target diameter + inline scalar& dTarget(); + //- Return access to velocity inline vector& U(); @@ -478,19 +488,19 @@ public: inline scalar volume() const; //- Particle volume for a given diameter - inline scalar volume(const scalar d) const; + inline static scalar volume(const scalar d); //- Particle projected area inline scalar areaP() const; //- Projected area for given diameter - inline scalar areaP(const scalar d) const; + inline static scalar areaP(const scalar d); //- Particle surface area inline scalar areaS() const; //- Surface area for given diameter - inline scalar areaS(const scalar d) const; + inline static scalar areaS(const scalar d); //- Reynolds number inline scalar Re diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H index a6f41647c78a0be932b5aa0c97d3d60a42e2c284..e39a9f43af0d32dc9a07b981d33c4ecd8b988e8f 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H @@ -91,6 +91,7 @@ inline Foam::KinematicParcel<ParcelType>::KinematicParcel typeId_(owner.parcelTypeId()), nParticle_(0), d_(0.0), + dTarget_(0.0), U_(vector::zero), f_(vector::zero), angularMomentum_(vector::zero), @@ -116,6 +117,7 @@ inline Foam::KinematicParcel<ParcelType>::KinematicParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -128,6 +130,7 @@ inline Foam::KinematicParcel<ParcelType>::KinematicParcel typeId_(typeId), nParticle_(nParticle0), d_(d0), + dTarget_(dTarget0), U_(U0), f_(f0), angularMomentum_(angularMomentum0), @@ -292,6 +295,13 @@ inline Foam::scalar Foam::KinematicParcel<ParcelType>::d() const } +template <class ParcelType> +inline Foam::scalar Foam::KinematicParcel<ParcelType>::dTarget() const +{ + return dTarget_; +} + + template <class ParcelType> inline const Foam::vector& Foam::KinematicParcel<ParcelType>::U() const { @@ -380,6 +390,13 @@ inline Foam::scalar& Foam::KinematicParcel<ParcelType>::d() } +template <class ParcelType> +inline Foam::scalar& Foam::KinematicParcel<ParcelType>::dTarget() +{ + return dTarget_; +} + + template <class ParcelType> inline Foam::vector& Foam::KinematicParcel<ParcelType>::U() { @@ -504,7 +521,7 @@ inline Foam::scalar Foam::KinematicParcel<ParcelType>::volume() const template <class ParcelType> inline Foam::scalar -Foam::KinematicParcel<ParcelType>::volume(const scalar d) const +Foam::KinematicParcel<ParcelType>::volume(const scalar d) { return pi/6.0*pow3(d); } @@ -519,7 +536,7 @@ inline Foam::scalar Foam::KinematicParcel<ParcelType>::areaP() const template <class ParcelType> inline Foam::scalar -Foam::KinematicParcel<ParcelType>::areaP(const scalar d) const +Foam::KinematicParcel<ParcelType>::areaP(const scalar d) { return 0.25*areaS(d); } @@ -534,7 +551,7 @@ inline Foam::scalar Foam::KinematicParcel<ParcelType>::areaS() const template <class ParcelType> inline Foam::scalar -Foam::KinematicParcel<ParcelType>::areaS(const scalar d) const +Foam::KinematicParcel<ParcelType>::areaS(const scalar d) { return pi*d*d; } diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C index 7660070383dd2f234dd09d93233ed70481f6f763..8f1645db60622d0fe9b053c19d49446eeb87dc7d 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C @@ -37,6 +37,7 @@ Foam::string Foam::KinematicParcel<ParcelType>::propHeader = + " typeId" + " nParticle" + " d" + + " dTarget " + " (Ux Uy Uz)" + " (fx fy fz)" + " (angularMomentumx angularMomentumy angularMomentumz)" @@ -68,6 +69,7 @@ Foam::KinematicParcel<ParcelType>::KinematicParcel typeId_(0), nParticle_(0.0), d_(0.0), + dTarget_(0.0), U_(vector::zero), f_(vector::zero), angularMomentum_(vector::zero), @@ -88,6 +90,7 @@ Foam::KinematicParcel<ParcelType>::KinematicParcel typeId_ = readLabel(is); nParticle_ = readScalar(is); d_ = readScalar(is); + dTarget_ = readScalar(is); is >> U_; is >> f_; is >> angularMomentum_; @@ -106,6 +109,7 @@ Foam::KinematicParcel<ParcelType>::KinematicParcel + sizeof(typeId_) + sizeof(nParticle_) + sizeof(d_) + + sizeof(dTarget_) + sizeof(U_) + sizeof(f_) + sizeof(angularMomentum_) @@ -150,6 +154,9 @@ void Foam::KinematicParcel<ParcelType>::readFields(Cloud<ParcelType>& c) IOField<scalar> d(c.fieldIOobject("d", IOobject::MUST_READ)); c.checkFieldIOobject(c, d); + IOField<scalar> dTarget(c.fieldIOobject("dTarget", IOobject::MUST_READ)); + c.checkFieldIOobject(c, dTarget); + IOField<vector> U(c.fieldIOobject("U", IOobject::MUST_READ)); c.checkFieldIOobject(c, U); @@ -234,6 +241,7 @@ void Foam::KinematicParcel<ParcelType>::readFields(Cloud<ParcelType>& c) p.typeId_ = typeId[i]; p.nParticle_ = nParticle[i]; p.d_ = d[i]; + p.dTarget_ = dTarget[i]; p.U_ = U[i]; p.f_ = f[i]; p.angularMomentum_ = angularMomentum[i]; @@ -271,6 +279,7 @@ void Foam::KinematicParcel<ParcelType>::writeFields(const Cloud<ParcelType>& c) np ); IOField<scalar> d(c.fieldIOobject("d", IOobject::NO_READ), np); + IOField<scalar> dTarget(c.fieldIOobject("dTarget", IOobject::NO_READ), np); IOField<vector> U(c.fieldIOobject("U", IOobject::NO_READ), np); IOField<vector> f(c.fieldIOobject("f", IOobject::NO_READ), np); IOField<vector> angularMomentum @@ -333,6 +342,7 @@ void Foam::KinematicParcel<ParcelType>::writeFields(const Cloud<ParcelType>& c) typeId[i] = p.typeId(); nParticle[i] = p.nParticle(); d[i] = p.d(); + dTarget[i] = p.dTarget(); U[i] = p.U(); f[i] = p.f(); angularMomentum[i] = p.angularMomentum(); @@ -357,6 +367,7 @@ void Foam::KinematicParcel<ParcelType>::writeFields(const Cloud<ParcelType>& c) typeId.write(); nParticle.write(); d.write(); + dTarget.write(); U.write(); f.write(); angularMomentum.write(); @@ -390,6 +401,7 @@ Foam::Ostream& Foam::operator<< << token::SPACE << p.typeId() << token::SPACE << p.nParticle() << token::SPACE << p.d() + << token::SPACE << p.dTarget() << token::SPACE << p.U() << token::SPACE << p.f() << token::SPACE << p.angularMomentum() @@ -409,6 +421,7 @@ Foam::Ostream& Foam::operator<< + sizeof(p.typeId()) + sizeof(p.nParticle()) + sizeof(p.d()) + + sizeof(p.dTarget()) + sizeof(p.U()) + sizeof(p.f()) + sizeof(p.angularMomentum()) diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H index 3fb4ef24218b83ca9693fc72337b7bc0ac9ff799..ed0b11e88e5b478b7e682cfca45e06be153c3e6f 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H @@ -306,6 +306,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H index 5899d2a6666df49a9651c3aef7b34b5df3eae75d..960a298ad7cdb1ce03f2bc9d0b133376b7dc76d4 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H @@ -113,6 +113,7 @@ inline Foam::ReactingMultiphaseParcel<ParcelType>::ReactingMultiphaseParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -134,6 +135,7 @@ inline Foam::ReactingMultiphaseParcel<ParcelType>::ReactingMultiphaseParcel typeId, nParticle0, d0, + dTarget0, U0, f0, angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H index 415967c7c53842f40edd8885ce72a7027021bcf8..6ae15d5098ebe41cbbb03109d748002d0530cf4a 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H @@ -255,6 +255,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H index 39beae61cf026a0767df019e016768b66fab9304..60c1556b8f2fb641113a07e0293ac7c19f459798 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H @@ -98,6 +98,7 @@ inline Foam::ReactingParcel<ParcelType>::ReactingParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -116,6 +117,7 @@ inline Foam::ReactingParcel<ParcelType>::ReactingParcel typeId, nParticle0, d0, + dTarget0, U0, f0, angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H index 5632d76592b797876e9fdacd243e74db4c744c17..dc97dcba6c41e0303396b2e863976c596ac4c14c 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H @@ -268,6 +268,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H index b046f142ddd3c6f168a15e104d60e07f749a463c..b728ce65cbb40c4302ea1239562615d4feb9caec 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H @@ -99,6 +99,7 @@ inline Foam::ThermoParcel<ParcelType>::ThermoParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -116,6 +117,7 @@ inline Foam::ThermoParcel<ParcelType>::ThermoParcel typeId, nParticle0, d0, + dTarget0, U0, f0, angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C index 4ec2941bf78cca58d41db4f368c29aab5a86f6ce..adc4fc409bd59ec5e933e6838ba78adbfc33abc8 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C @@ -67,6 +67,7 @@ Foam::basicKinematicParcel::basicKinematicParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -84,6 +85,7 @@ Foam::basicKinematicParcel::basicKinematicParcel typeId, nParticle0, d0, + dTarget0, U0, f0, angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.H b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.H index 56d9cad296e9682bc4ccd2b3e30466515395b569..5fdb8777a5c2ec5b8ec4202ebf595c73519d0a6c 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.H @@ -81,6 +81,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C index 49e4e06ef4c56652ec775245caca7211e980d07d..748122567e9bdb30486e9f8b43bef4b187ae5823 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C @@ -57,6 +57,7 @@ Foam::basicReactingMultiphaseParcel::basicReactingMultiphaseParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -79,6 +80,7 @@ Foam::basicReactingMultiphaseParcel::basicReactingMultiphaseParcel typeId, nParticle0, d0, + dTarget0, U0, f0, angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H index 1c9d2db2d72fcfe7035b9130e16fec262d429e21..2fa913c2299865b7bc9bc28b866de8b77e497560 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H +++ b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H @@ -82,6 +82,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.C b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.C index f60f30b552bd5ca4ecf7d05a851a6f1bf9250afe..25b0c4c26aea6ff009cfe93614f90ece1f77381f 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.C @@ -57,6 +57,7 @@ Foam::basicReactingParcel::basicReactingParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, @@ -75,6 +76,7 @@ Foam::basicReactingParcel::basicReactingParcel typeId, nParticle0, d0, + dTarget0, U0, f0, angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.H b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.H index 4329c61d9c3eff0eb02541f893c57661db7be988..49e26aadb70c6dbbbe297b54b54685e0d703ca2c 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.H +++ b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.H @@ -80,6 +80,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector& U0, const vector& f0, const vector& angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C index b77bf79b93c65c4ac3ff1cab7dd6bdd6949e0ee0..5b5fddb1bbc4924f5c58742fddbb46642ce8c1cb 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C @@ -60,6 +60,7 @@ Foam::basicThermoParcel::basicThermoParcel const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector U0, const vector& f0, const vector& angularMomentum0, @@ -77,6 +78,7 @@ Foam::basicThermoParcel::basicThermoParcel typeId, nParticle0, d0, + dTarget0, U0, f0, angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.H b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.H index 71614c7d9d0b7292e1eb0d8c4bf18f9999b7e072..8f3720b365f79c6da7ccc168b7f4607c29d13c5f 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.H +++ b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.H @@ -80,6 +80,7 @@ public: const label typeId, const scalar nParticle0, const scalar d0, + const scalar dTarget0, const vector U0, const vector& f0, const vector& angularMomentum0, diff --git a/src/lagrangian/intermediate/parcels/include/makeParcelInjectionModels.H b/src/lagrangian/intermediate/parcels/include/makeParcelInjectionModels.H index ea8dcd57f475f72fa3684ed1e9cbc84fdae61af0..b673d3d84cc2fd75ef476b54ed41866d6ea25f59 100644 --- a/src/lagrangian/intermediate/parcels/include/makeParcelInjectionModels.H +++ b/src/lagrangian/intermediate/parcels/include/makeParcelInjectionModels.H @@ -33,11 +33,13 @@ License #include "ConeInjection.H" #include "ConeInjectionMP.H" #include "FieldActivatedInjection.H" +#include "InflationInjection.H" #include "KinematicLookupTableInjection.H" #include "ManualInjection.H" #include "NoInjection.H" #include "PatchInjection.H" + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #define makeParcelInjectionModels(ParcelType) \ @@ -63,6 +65,12 @@ License ParcelType \ ); \ makeInjectionModelType \ + ( \ + InflationInjection, \ + KinematicCloud, \ + ParcelType \ + ); \ + makeInjectionModelType \ ( \ KinematicLookupTableInjection, \ KinematicCloud, \ diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C index 3047f909affff8565f0de630bc1a1af0638e0a0e..438b32b2252b07350225323df1e0fe8c49c77e35 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C @@ -36,7 +36,7 @@ Foam::label Foam::ConeInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { @@ -54,7 +54,7 @@ Foam::scalar Foam::ConeInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H index 58309fa86548a39bb1320dc10b58eae0ea0a3dbb..a9c289d6d48d44b5be1c59fba2697b6e1c661591 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H @@ -123,14 +123,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Number of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C index 05cfb680a4f39d25a375164a72671b9d938ef1fd..6639c43587fc4e7fb237ac09962a53bb73b909cd 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C @@ -36,7 +36,7 @@ Foam::label Foam::ConeInjectionMP<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { @@ -63,7 +63,7 @@ Foam::scalar Foam::ConeInjectionMP<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H index 1033defe8b5cc5e08475df68ead7d903d6bd9e07..2b0d4e8c313e5586a92fc20926fa1c58925c1c72 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H @@ -133,14 +133,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Number of parcels to introduce over the time step scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C index a0dae5cb34f02803d8b9fe9e326f812165704351..44cebec90388d605251285ca144b5a2cfaa20516 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C @@ -36,7 +36,7 @@ Foam::label Foam::FieldActivatedInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if (sum(nParcelsInjected_) < nParcelsPerInjector_*positions_.size()) { @@ -54,7 +54,7 @@ Foam::scalar Foam::FieldActivatedInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { if (sum(nParcelsInjected_) < nParcelsPerInjector_*positions_.size()) { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H index 282e876cc665e06f25131c4cb820622681c496f2..9acf379154d5f99162cc6744ff48fd7d711366f1 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H @@ -123,14 +123,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C new file mode 100644 index 0000000000000000000000000000000000000000..e1d3bd6d3ddd641d3729ec499c22b8b7c842037b --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C @@ -0,0 +1,466 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "InflationInjection.H" +#include "mathematicalConstants.H" +#include "PackedBoolList.H" +#include "Switch.H" +#include "cellSet.H" +#include "ListListOps.H" + +using namespace Foam::constant::mathematical; + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +template<class CloudType> +Foam::label Foam::InflationInjection<CloudType>::parcelsToInject +( + const scalar time0, + const scalar time1 +) +{ + const polyMesh& mesh = this->owner().mesh(); + + List<DynamicList<typename CloudType::parcelType*> >& cellOccupancy = + this->owner().cellOccupancy(); + + scalar gR = growthRate_().value(time1); + + scalar dT = time1 - time0; + + // Inflate existing particles + + forAll(inflationCells_, iCI) + { + label cI = inflationCells_[iCI]; + + typename CloudType::parcelType* pPtr = NULL; + + forAll(cellOccupancy[cI], cPI) + { + pPtr = cellOccupancy[cI][cPI]; + + scalar dTarget = pPtr->dTarget(); + + pPtr->d() = min(dTarget, pPtr->d() + gR*dT); + } + } + + // Generate new particles + + newParticles_.clear(); + + Random& rnd = this->owner().rndGen(); + + // Diameter factor, when splitting particles into 4, this is the + // factor that modifies the diameter. + scalar dFact = sqrt(2.0)/(sqrt(3.0) + sqrt(2.0)); + + if ((time0 >= 0.0) && (time0 < duration_)) + { + volumeAccumulator_ += + fraction_*flowRateProfile_().integrate(time0, time1); + } + + labelHashSet cellCentresUsed; + + // Loop escape counter + label maxIterations = max + ( + 1, + (10*volumeAccumulator_) + /CloudType::parcelType::volume(parcelPDF_().minValue()) + ); + + label iterationNo = 0; + + // Info<< "Accumulated volume to inject: " + // << returnReduce(volumeAccumulator_, sumOp<scalar>()) << endl; + + while (!generationCells_.empty() && volumeAccumulator_ > 0) + { + if (iterationNo > maxIterations) + { + WarningIn + ( + "Foam::label " + "Foam::InflationInjection<CloudType>::parcelsToInject" + "(" + "const scalar time0, " + "const scalar time1" + ")" + ) + << "Maximum particle split iterations (" + << maxIterations << ") exceeded" << endl; + + break; + } + + label cI = + generationCells_[rnd.integer(0, generationCells_.size() - 1)]; + + // Pick a particle at random from the cell - if there are + // none, insert one at the cell centre. Otherwise, split an + // existing particle into four new ones. + + if (cellOccupancy[cI].empty()) + { + if (!cellCentresUsed.found(cI)) + { + scalar dNew = parcelPDF_().sample(); + + newParticles_.append + ( + vectorPairScalarPair + ( + Pair<vector>(mesh.cellCentres()[cI], vector::zero), + Pair<scalar>(dNew, dNew) + ) + ); + + volumeAccumulator_ -= CloudType::parcelType::volume(dNew); + + cellCentresUsed.insert(cI); + } + } + else + { + label cPI = rnd.integer(0, cellOccupancy[cI].size() - 1); + + // This has to be a reference to the pointer so that it + // can be set to NULL when the particle is deleted. + typename CloudType::parcelType*& pPtr = cellOccupancy[cI][cPI]; + + if (pPtr != NULL) + { + scalar pD = pPtr->d(); + + // Select bigger particles by preference + if ((pD/pPtr->dTarget()) < rnd.scalar01()) + { + continue; + } + + const point& pP = pPtr->position(); + const vector& pU = pPtr->U(); + + // Generate a tetrahedron of new positions with the + // four new spheres fitting inside the old one, where + // a is the diameter of the new spheres, and is + // related to the diameter of the enclosing sphere, A, + // by a = sqrt(2)*A/(sqrt(3) + sqrt(2)); + + // Positions around the origin, which is the + // tetrahedron centroid (centre of old sphere). + + // x = a/sqrt(3) + // r = a/(2*sqrt(6)) + // R = sqrt(3)*a/(2*sqrt(2)) + // d = a/(2*sqrt(3)) + + // p0(x, 0, -r) + // p1(-d, a/2, -r) + // p2(-d, -a/2, -r) + // p3(0, 0, R) + + scalar a = pD*dFact; + + scalar x = a/sqrt(3.0); + scalar r = a/(2.0*sqrt(6.0)); + scalar R = sqrt(3.0)*a/(2.0*sqrt(2.0)); + scalar d = a/(2.0*sqrt(3.0)); + + scalar dNew = parcelPDF_().sample(); + scalar volNew = CloudType::parcelType::volume(dNew); + + newParticles_.append + ( + vectorPairScalarPair + ( + Pair<vector>(vector(x, 0, -r) + pP, pU), + Pair<scalar>(a, dNew) + ) + ); + volumeAccumulator_ -= volNew; + + dNew = parcelPDF_().sample(); + newParticles_.append + ( + vectorPairScalarPair + ( + Pair<vector>(vector(-d, a/2, -r) + pP, pU), + Pair<scalar>(a, dNew) + ) + ); + volumeAccumulator_ -= volNew; + + dNew = parcelPDF_().sample(); + newParticles_.append + ( + vectorPairScalarPair + ( + Pair<vector>(vector(-d, -a/2, -r) + pP, pU), + Pair<scalar>(a, dNew) + ) + ); + volumeAccumulator_ -= volNew; + + dNew = parcelPDF_().sample(); + newParticles_.append + ( + vectorPairScalarPair + ( + Pair<vector>(vector(0, 0, R) + pP, pU), + Pair<scalar>(a, dNew) + ) + ); + volumeAccumulator_ -= volNew; + + // Account for the lost volume of the particle which + // is to be deleted + volumeAccumulator_ += CloudType::parcelType::volume + ( + pPtr->dTarget() + ); + + this->owner().deleteParticle(*pPtr); + + pPtr = NULL; + } + } + + iterationNo++; + } + + if (Pstream::parRun()) + { + List<List<vectorPairScalarPair> > gatheredNewParticles + ( + Pstream::nProcs() + ); + + gatheredNewParticles[Pstream::myProcNo()] = newParticles_; + + // Gather data onto master + Pstream::gatherList(gatheredNewParticles); + + // Combine + List<vectorPairScalarPair> combinedNewParticles + ( + ListListOps::combine<List<vectorPairScalarPair> > + ( + gatheredNewParticles, + accessOp<List<vectorPairScalarPair> >() + ) + ); + + if (Pstream::master()) + { + newParticles_ = combinedNewParticles; + } + + Pstream::scatter(newParticles_); + } + + return newParticles_.size(); +} + + +template<class CloudType> +Foam::scalar Foam::InflationInjection<CloudType>::volumeToInject +( + const scalar time0, + const scalar time1 +) +{ + if ((time0 >= 0.0) && (time0 < duration_)) + { + return fraction_*flowRateProfile_().integrate(time0, time1); + } + else + { + return 0.0; + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class CloudType> +Foam::InflationInjection<CloudType>::InflationInjection +( + const dictionary& dict, + CloudType& owner +) +: + InjectionModel<CloudType>(dict, owner, typeName), + generationSetName_(this->coeffDict().lookup("generationCellSet")), + inflationSetName_(this->coeffDict().lookup("inflationCellSet")), + generationCells_(), + inflationCells_(), + duration_(readScalar(this->coeffDict().lookup("duration"))), + flowRateProfile_ + ( + DataEntry<scalar>::New + ( + "flowRateProfile", + this->coeffDict() + ) + ), + growthRate_ + ( + DataEntry<scalar>::New + ( + "growthRate", + this->coeffDict() + ) + ), + newParticles_(), + volumeAccumulator_(0.0), + fraction_(1.0), + parcelPDF_ + ( + pdfs::pdf::New + ( + this->coeffDict().subDict("parcelPDF"), + owner.rndGen() + ) + ) +{ + cellSet generationCells(this->owner().mesh(), generationSetName_); + + generationCells_ = generationCells.toc(); + + cellSet inflationCells(this->owner().mesh(), inflationSetName_); + + // Union of cellSets + inflationCells |= generationCells; + + inflationCells_ = inflationCells.toc(); + + if (Pstream::parRun()) + { + scalar generationVolume = 0.0; + + forAll(generationCells_, gCI) + { + label cI = generationCells_[gCI]; + + generationVolume += this->owner().mesh().cellVolumes()[cI]; + } + + scalar totalGenerationVolume = generationVolume; + + reduce(totalGenerationVolume, sumOp<scalar>()); + + fraction_ = generationVolume/totalGenerationVolume; + } + + // Set total volume/mass to inject + this->volumeTotal_ = fraction_*flowRateProfile_().integrate(0.0, duration_); + this->massTotal_ *= fraction_; +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +template<class CloudType> +Foam::InflationInjection<CloudType>::~InflationInjection() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class CloudType> +bool Foam::InflationInjection<CloudType>::active() const +{ + return true; +} + + +template<class CloudType> +Foam::scalar Foam::InflationInjection<CloudType>::timeEnd() const +{ + return this->SOI_ + duration_; +} + + +template<class CloudType> +void Foam::InflationInjection<CloudType>::setPositionAndCell +( + const label parcelI, + const label, + const scalar, + vector& position, + label& cellOwner, + label& tetFaceI, + label& tetPtI +) +{ + position = newParticles_[parcelI].first().first(); + + this->findCellAtPosition + ( + cellOwner, + tetFaceI, + tetPtI, + position, + false + ); +} + + +template<class CloudType> +void Foam::InflationInjection<CloudType>::setProperties +( + const label parcelI, + const label, + const scalar, + typename CloudType::parcelType& parcel +) +{ + parcel.U() = newParticles_[parcelI].first().second(); + + parcel.d() = newParticles_[parcelI].second().first(); + + parcel.dTarget() = newParticles_[parcelI].second().second(); +} + + +template<class CloudType> +bool Foam::InflationInjection<CloudType>::fullyDescribed() const +{ + return false; +} + + +template<class CloudType> +bool Foam::InflationInjection<CloudType>::validInjection(const label) +{ + return true; +} + + +// ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H new file mode 100644 index 0000000000000000000000000000000000000000..70724124300621dba60e09c7a256e1aec9567af2 --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H @@ -0,0 +1,200 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::InflationInjection + +Description + Inflation injection - creates new particles by splitting existing + particles within in a set of generation cells, then inflating them + to a target diameter within the generation cells and an additional + set of inflation cells. + +SourceFiles + InflationInjection.C + +\*---------------------------------------------------------------------------*/ + +#ifndef InflationInjection_H +#define InflationInjection_H + +#include "InjectionModel.H" +#include "pdf.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Structure to hold: +// + position = vectorPairScalarPair::first().first() +// + velocity = vectorPairScalarPair::first().second() +// + diameter = vectorPairScalarPair::second().first() +// + target diameter = vectorPairScalarPair::second().second() +// One structure to allow single operation parallel comms +typedef Tuple2<Pair<vector>, Pair<scalar> > vectorPairScalarPair; + + +/*---------------------------------------------------------------------------*\ + Class InflationInjection Declaration +\*---------------------------------------------------------------------------*/ + +template<class CloudType> +class InflationInjection +: + public InjectionModel<CloudType> +{ + // Private data + + //- Name of cellSet for generating new particles + word generationSetName_; + + //- Name of cellSet for inflating new particles + word inflationSetName_; + + //- Set of cells to generate particles in + labelList generationCells_; + + //- Set of cells to inflate particles in, includes all + // generation cells + labelList inflationCells_; + + //- Injection duration [s] + const scalar duration_; + + //- Flow rate profile relative to SOI [m3/s] + const autoPtr<DataEntry<scalar> > flowRateProfile_; + + //- Growth rate of particle diameters towards target [m/s] + const autoPtr<DataEntry<scalar> > growthRate_; + + //- Positions, velocities, diameters and target diameters of + // new particles after splitting + DynamicList<vectorPairScalarPair> newParticles_; + + //- Accumulation variable to carry over volume from one injection + // to the next + scalar volumeAccumulator_; + + //- Fraction of injection controlled by this processor + scalar fraction_; + + //- Parcel size PDF model + const autoPtr<pdfs::pdf> parcelPDF_; + + +protected: + + // Protected Member Functions + + //- Number of parcels to introduce over the time step relative to SOI + label parcelsToInject + ( + const scalar time0, + const scalar time1 + ); + + //- Volume of parcels to introduce over the time step relative to SOI + scalar volumeToInject + ( + const scalar time0, + const scalar time1 + ); + + +public: + + //- Runtime type information + TypeName("InflationInjection"); + + + // Constructors + + //- Construct from dictionary + InflationInjection + ( + const dictionary& dict, + CloudType& owner + ); + + + //- Destructor + virtual ~InflationInjection(); + + + // Member Functions + + //- Flag to indicate whether model activates injection model + bool active() const; + + //- Return the end-of-injection time + scalar timeEnd() const; + + + // Injection geometry + + //- Set the injection position and owner cell, tetFace and tetPt + virtual void setPositionAndCell + ( + const label parcelI, + const label nParcels, + const scalar time, + vector& position, + label& cellOwner, + label& tetFaceI, + label& tetPtI + ); + + //- Set the parcel properties + virtual void setProperties + ( + const label parcelI, + const label nParcels, + const scalar time, + typename CloudType::parcelType& parcel + ); + + //- Flag to identify whether model fully describes the parcel + virtual bool fullyDescribed() const; + + //- Return flag to identify whether or not injection of parcelI is + // permitted + virtual bool validInjection(const label parcelI); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "InflationInjection.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C index 9136baa60791c7a5628fe570b7eb02a4209d3d0f..5a386e4397e10a863a17b2aae75bb9f8aee9dcfd 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C @@ -159,6 +159,8 @@ bool Foam::InjectionModel<CloudType>::findCellAtPosition reduce(procI, maxOp<label>()); + // Ensure that only one processor attempts to insert this Parcel + if (procI != Pstream::myProcNo()) { cellI = -1; @@ -166,11 +168,12 @@ bool Foam::InjectionModel<CloudType>::findCellAtPosition tetPtI = -1; } - // Last chance - find nearest cell and try that one - // - the point is probably on an edge + // Last chance - find nearest cell and try that one - the point is + // probably on an edge if (procI == -1) { cellI = owner_.mesh().findNearestCell(position); + if (cellI >= 0) { position += SMALL*(cellCentres[cellI] - position); @@ -428,14 +431,15 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td) const scalar padTime = max(0.0, SOI_ - time0_); // Introduce new parcels linearly across carrier phase timestep - for (label parcelI=0; parcelI<newParcels; parcelI++) + for (label parcelI = 0; parcelI < newParcels; parcelI++) { if (validInjection(parcelI)) { // Calculate the pseudo time of injection for parcel 'parcelI' scalar timeInj = time0_ + padTime + deltaT*parcelI/newParcels; - // Determine the injection position and owner cell + // Determine the injection position and owner cell, + // tetFace and tetPt label cellI = -1; label tetFaceI = -1; label tetPtI = -1; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H index 542e038b4acf75525678dcddcd33c55dcfe34287..5b225c0781487a7b805a9912ef0d07ac759faf82 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H @@ -156,14 +156,14 @@ protected: ( const scalar time0, const scalar time1 - ) const = 0; + ) = 0; //- Volume of parcels to introduce over the time step relative to SOI virtual scalar volumeToInject ( const scalar time0, const scalar time1 - ) const = 0; + ) = 0; //- Additional flag to identify whether or not injection of parcelI is // permitted diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C index 45fd5b0df6ac76df37bb87e4be43299216dcf43b..b87449f225d352beac22560726458b11baaec702 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C @@ -33,7 +33,7 @@ Foam::label Foam::KinematicLookupTableInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { @@ -51,7 +51,7 @@ Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { scalar volume = 0.0; if ((time0 >= 0.0) && (time0 < duration_)) diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H index 1692c92a0f0c7933b149348a8b94397910636a8c..ff840187f26d126f3989820ec5ce7043162ad7e0 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H @@ -100,14 +100,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C index b7e3c7022746520235a7b9df4ff276796704d958..48b156d1e2e8b70014adf7020e199d17c2567ae3 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C @@ -37,7 +37,7 @@ Foam::label Foam::ManualInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((0.0 >= time0) && (0.0 < time1)) { @@ -55,7 +55,7 @@ Foam::scalar Foam::ManualInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { // All parcels introduced at SOI if ((0.0 >= time0) && (0.0 < time1)) diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H index a001f940534ff314a7f43b9142722f08ea9f6566..b4feea97441a0f974912e146914dc93ac1df3391 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H @@ -95,14 +95,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C index 6303a8f30fa623147e054133695e4f582809d51f..8391c3654b633b2b1ca6d56ae89f92aa7becda0a 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C @@ -33,7 +33,7 @@ Foam::label Foam::NoInjection<CloudType>::parcelsToInject ( const scalar, const scalar -) const +) { return 0; } @@ -44,7 +44,7 @@ Foam::scalar Foam::NoInjection<CloudType>::volumeToInject ( const scalar, const scalar -) const +) { return 0.0; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H index d5026cc75d405ad277100a5de8220119f00fb98f..c16a9367785ff5abfb735682fc5cdec156c30beb 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H @@ -60,14 +60,14 @@ protected: ( const scalar, const scalar - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar, const scalar - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C index 8c50cec0e095ca54f843397c207f742c8f29133c..088546930733dbc406830eb839272e56fd7a99c0 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C @@ -34,7 +34,7 @@ Foam::label Foam::PatchInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { @@ -52,7 +52,7 @@ Foam::scalar Foam::PatchInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H index ee6a5edeb0a19095a37b194a66ce86c0ee0861ed..85dbb2fcb63b11e7d8bb08067e0ae8f88af2439a 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H @@ -101,14 +101,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C index 8ba48ca48d0752f6d06222533688acf503f6e10b..5c4b49370b1a5ec6a610120cab03006e107856ce 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C +++ b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C @@ -32,7 +32,7 @@ Foam::label Foam::ReactingLookupTableInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { @@ -50,7 +50,7 @@ Foam::scalar Foam::ReactingLookupTableInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { scalar volume = 0.0; if ((time0 >= 0.0) && (time0 < duration_)) diff --git a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H index 88bb33005f2f6f244b657fe6632ef687fa32553b..e13169a5b75318ffe4b33d06e12dec1d9ccfde53 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H +++ b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H @@ -103,14 +103,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C index a97ab2d4d89a4f32c115019d2b872359f322d882..1178b5cc33f05394a18a0cbc59a346fd19d86a5f 100644 --- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C +++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C @@ -33,7 +33,7 @@ Foam::ReactingMultiphaseLookupTableInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { @@ -52,7 +52,7 @@ Foam::ReactingMultiphaseLookupTableInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { scalar volume = 0.0; if ((time0 >= 0.0) && (time0 < duration_)) diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H index 289f664550e1b9321e386d1f8582af5e8d7741ca..5b0ecae379350a54a13a1dcb58dc70337830674b 100644 --- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H +++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H @@ -106,14 +106,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C index 6138a8a5f544b8ffbd8be8785a85d1996089bdbf..6d7c9aef2cbc416a824da9e538e6a6dc5258f570 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C @@ -33,7 +33,7 @@ Foam::label Foam::ThermoLookupTableInjection<CloudType>::parcelsToInject ( const scalar time0, const scalar time1 -) const +) { if ((time0 >= 0.0) && (time0 < duration_)) { @@ -51,7 +51,7 @@ Foam::scalar Foam::ThermoLookupTableInjection<CloudType>::volumeToInject ( const scalar time0, const scalar time1 -) const +) { scalar volume = 0.0; if ((time0 >= 0.0) && (time0 < duration_)) diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H index c66f0778f649c039f67603f7466e082402dc0e52..4fd93884b46fa6ea5afdbc9b0b4be8cc239be36f 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H @@ -102,14 +102,14 @@ protected: ( const scalar time0, const scalar time1 - ) const; + ); //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, const scalar time1 - ) const; + ); public: