diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C index a812eb918979e90930138f617cb493600d5f5781..9eb74d585f8ed24e156453528ae850e06d3a49b3 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C @@ -186,12 +186,14 @@ void Foam::ConeInjection<CloudType>::setPositionAndCell template<class CloudType> -Foam::vector Foam::ConeInjection<CloudType>::velocity +void Foam::ConeInjection<CloudType>::setProperties ( - const label, - const scalar time + const label parcelI, + const scalar time, + typename CloudType::parcelType* pPtr ) { + // set particle velocity const scalar deg2Rad = mathematicalConstant::pi/180.0; scalar t = time - this->SOI_; @@ -210,23 +212,15 @@ Foam::vector Foam::ConeInjection<CloudType>::velocity dirVec += normal; dirVec /= mag(dirVec); - return Umag_().value(t)*dirVec; -} - + pPtr->U() = Umag_().value(t)*dirVec; -template<class CloudType> -Foam::scalar Foam::ConeInjection<CloudType>::d0 -( - const label, - const scalar -) const -{ - return parcelPDF_().sample(); + // set particle diameter + pPtr->d() = parcelPDF_().sample(); } template<class CloudType> -bool Foam::ConeInjection<CloudType>::validInjection(const label parcelI) +bool Foam::ConeInjection<CloudType>::validInjection(const label) { 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 b65a6b58988d38e251605b63e1cfbf6cb9abd96c..b60c1377aeefc96214b9bb55a3ae25214205de61 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H @@ -108,14 +108,14 @@ protected: // Protected member functions - //- Number of parcels to introduce over the time step + //- Number of parcels to introduce over the time step relative to SOI label parcelsToInject ( const scalar time0, const scalar time1 ) const; - //- Number of parcels to introduce over the time step + //- Number of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, @@ -155,7 +155,7 @@ public: // Injection geometry //- Set the injection position and owner cell - void setPositionAndCell + virtual void setPositionAndCell ( const label parcelI, const scalar time, @@ -163,23 +163,21 @@ public: label& cellOwner ); - //- Return the velocity of the parcel to introduce at a time - vector velocity + virtual void setProperties ( const label parcelI, - const scalar time + const scalar time, + typename CloudType::parcelType* pPtr ); - //- Return the diameter of the parcel to introduce at a time - scalar d0 - ( - const label parcelI, - const scalar time - ) const; + virtual bool fullyDescribed() const + { + return false; + } //- Return flag to identify whether or not injection in cellI is // permitted - bool validInjection(const label parcelI); + virtual bool validInjection(const label parcelI); }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C index 3110de5c3e3f3139dcdb21c8596529a70d435001..b33403514384aeff6eba3e894007598a77e68e60 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C @@ -181,24 +181,18 @@ void Foam::FieldActivatedInjection<CloudType>::setPositionAndCell template<class CloudType> -Foam::vector Foam::FieldActivatedInjection<CloudType>::velocity +void Foam::FieldActivatedInjection<CloudType>::setProperties ( - const label, - const scalar + const label parcelI, + const scalar, + typename CloudType::parcelType* pPtr ) { - return U0_; -} + // set particle velocity + pPtr->U() = U0_; - -template<class CloudType> -Foam::scalar Foam::FieldActivatedInjection<CloudType>::d0 -( - const label parcelI, - const scalar -) const -{ - return diameters_[parcelI]; + // set particle diameter + pPtr->d() = diameters_[parcelI]; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H index 0fec8998159df037d1735de3e99a91aed7471dd2..88d9c8302f6fc6e5a3ffe39654e4d10dbde58f36 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H @@ -113,14 +113,14 @@ protected: // Protected member functions - //- Number of parcels to introduce over the time step + //- Number of parcels to introduce over the time step relative to SOI label parcelsToInject ( const scalar time0, const scalar time1 ) const; - //- Volume of parcels to introduce over the time step + //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, @@ -160,7 +160,7 @@ public: // Injection geometry //- Set the injection position and owner cell - void setPositionAndCell + virtual void setPositionAndCell ( const label parcelI, const scalar time, @@ -168,23 +168,21 @@ public: label& cellOwner ); - //- Return the velocity of the parcel to introduce at a time - vector velocity + virtual void setProperties ( const label parcelI, - const scalar time + const scalar time, + typename CloudType::parcelType* pPtr ); - //- Return the diameter of the parcel to introduce at a time - scalar d0 - ( - const label parcelI, - const scalar time - ) const; + virtual bool fullyDescribed() const + { + return false; + } //- Return flag to identify whether or not injection in cellI is // permitted - bool validInjection(const label parcelI); + virtual bool validInjection(const label parcelI); }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C index 6a0ba9544bc4a61eb47055786de2c448fe5b3417..d73859de1505f7c2175e8e8835e3d413e5a79554 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C @@ -88,8 +88,7 @@ void Foam::InjectionModel<CloudType>::writeProps() template<class CloudType> void Foam::InjectionModel<CloudType>::prepareForNextTimeStep ( - const scalar time0, - const scalar time1, + const scalar time, label& newParcels, scalar& newVolume ) @@ -99,15 +98,15 @@ void Foam::InjectionModel<CloudType>::prepareForNextTimeStep newVolume = 0.0; // Return if not started injection event - if (time1 < SOI_) + if (time < SOI_) { - timeStep0_ = time1; + timeStep0_ = time; return; } // Make times relative to SOI scalar t0 = timeStep0_ - SOI_; - scalar t1 = time1 - SOI_; + scalar t1 = time - SOI_; // Number of parcels to inject newParcels = parcelsToInject(t0, t1); @@ -123,7 +122,7 @@ void Foam::InjectionModel<CloudType>::prepareForNextTimeStep else { // advance value of timeStep0_ - timeStep0_ = time1; + timeStep0_ = time; } } @@ -348,13 +347,22 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td) } const scalar time = owner_.db().time().value(); - const scalar continuousDt = owner_.db().time().deltaT().value(); +/* + // Return if not started injection event + if (time < SOI_) + { + timeStep0_ = time; + postInjectCheck(0); + return; + } +*/ + const scalar carrierDt = owner_.db().time().deltaT().value(); const polyMesh& mesh = owner_.mesh(); // Prepare for next time step label newParcels = 0; scalar newVolume = 0.0; - prepareForNextTimeStep(time0_, time, newParcels, newVolume); + prepareForNextTimeStep(time, newParcels, newVolume); // Return if no parcels are required if (newParcels == 0) @@ -363,18 +371,11 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td) return; } - // Particle density given by constant properties - const scalar rho = td.constProps().rho0(); - // Volume fraction to introduce during this timestep const scalar volFraction = volumeFraction(newVolume); // Duration of injection period during this timestep - const scalar deltaT = min - ( - continuousDt, - min(time - SOI_, timeEnd() - time0_) - ); + const scalar deltaT = min(carrierDt, min(time - SOI_, timeEnd() - time0_)); // Pad injection time if injection starts during this timestep const scalar padTime = max(0.0, SOI_ - time0_); @@ -383,44 +384,56 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td) label parcelsAdded = 0; for (label parcelI=0; parcelI<newParcels; parcelI++) { - // Calculate the pseudo time of injection for parcel 'parcelI' - scalar timeInj = time0_ + padTime + deltaT*parcelI/newParcels; - - // Determine the injection position and owner cell - label cellI = -1; - vector pos = vector::zero; - setPositionAndCell(parcelI, timeInj, pos, cellI); - - if (cellI > -1) + if (validInjection(parcelI)) { - if (validInjection(parcelI)) - { - // Diameter of parcels - scalar d = d0(parcelI, timeInj); + // Calculate the pseudo time of injection for parcel 'parcelI' + scalar timeInj = time0_ + padTime + deltaT*parcelI/newParcels; - // Number of particles per parcel - scalar nP = setNumberOfParticles - ( - newParcels, - newVolume, - volFraction, - d, - rho - ); - - // Velocity of parcels - vector U = velocity(parcelI, timeInj); + // Determine the injection position and owner cell + label cellI = -1; + vector pos = vector::zero; + setPositionAndCell(parcelI, timeInj, pos, cellI); + if (cellI > -1) + { // Lagrangian timestep scalar dt = time - timeInj; - // Apply corrections for 2-D cases + // Apply corrections to position for 2-D cases meshTools::constrainToMeshCentre(mesh, pos); - meshTools::constrainDirection(mesh, mesh.solutionD(), U); + + // Create a new parcel + parcelType* pPtr = new parcelType(td.cloud(), pos, cellI); + + // Assign new parcel properties in injection model + setProperties(parcelI, timeInj, pPtr); + + // Check new parcel properties + td.cloud().checkParcelProperties(pPtr, dt, fullyDescribed()); + + // Apply correction to velocity for 2-D cases + meshTools::constrainDirection + ( + mesh, + mesh.solutionD(), + pPtr->U() + ); + + // Number of particles per parcel + pPtr->nParticle() = + setNumberOfParticles + ( + newParcels, + newVolume, + volFraction, + pPtr->d(), + pPtr->rho() + ); // Add the new parcel - td.cloud().addNewParcel(pos, cellI, d, U, nP, dt); - massInjected_ += nP*rho*mathematicalConstant::pi*pow3(d)/6.0; + td.cloud().addParticle(pPtr); + + massInjected_ += pPtr->nParticle()*pPtr->mass(); parcelsAdded++; } } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H index b18f1b0dceb5dea2e70797933c1890761dd32ed8..6e612194e3ad4d6edad281c6b6d5d5110e8ccbf5 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H @@ -93,6 +93,9 @@ protected: // Protected data + //- Convenience typedef for parcel type + typedef typename CloudType::parcelType parcelType; + // Global injection properties //- Start of injection [s] @@ -132,14 +135,14 @@ protected: // Protected member functions - //- Number of parcels to introduce over the time step + //- Number of parcels to introduce over the time step relative to SOI virtual label parcelsToInject ( const scalar time0, const scalar time1 ) const = 0; - //- Volume of parcels to introduce over the time step + //- Volume of parcels to introduce over the time step relative to SOI virtual scalar volumeToInject ( const scalar time0, @@ -153,8 +156,7 @@ protected: //- Determine properties for next time step/injection interval virtual void prepareForNextTimeStep ( - const scalar time0, - const scalar time1, + const scalar time, label& newParcels, scalar& newVolume ); @@ -291,6 +293,15 @@ public: label& cellOwner ) = 0; + virtual void setProperties + ( + const label parcelI, + const scalar time, + typename CloudType::parcelType* pPtr + ) = 0; + + virtual bool fullyDescribed() const = 0; +/* //- Return the velocity of the parcel to introduce at a time virtual vector velocity ( @@ -304,6 +315,7 @@ public: const label parcelI, const scalar time ) const = 0; +*/ }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C index 6d71828c237ca36ed0bc29e3b22e1db97a47adb7..f7da4915a2491f2d98c4a0106201bcbeb10762c8 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C @@ -130,7 +130,7 @@ template<class CloudType> Foam::scalar Foam::ManualInjection<CloudType>::timeEnd() const { // Not used - return 0.0; + return this->SOI_; } @@ -149,24 +149,18 @@ void Foam::ManualInjection<CloudType>::setPositionAndCell template<class CloudType> -Foam::vector Foam::ManualInjection<CloudType>::velocity +void Foam::ManualInjection<CloudType>::setProperties ( - const label, - const scalar + const label parcelI, + const scalar, + typename CloudType::parcelType* pPtr ) { - return U0_; -} + // set particle velocity + pPtr->U() = U0_; - -template<class CloudType> -Foam::scalar Foam::ManualInjection<CloudType>::d0 -( - const label parcelI, - const scalar -) const -{ - return diameters_[parcelI]; + // set particle diameter + pPtr->d() = diameters_[parcelI]; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H index 6b3988abcaa8298f91bba55bbe9d4607b3e3f1aa..327ec83ce2380c93b8c9100426ec9590dcfb43ea 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H @@ -85,14 +85,14 @@ protected: // Protected member functions - //- Number of parcels to introduce over the time step + //- Number of parcels to introduce over the time step relative to SOI label parcelsToInject ( const scalar time0, const scalar time1 ) const; - //- Volume of parcels to introduce over the time step + //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar time0, @@ -132,7 +132,7 @@ public: // Injection geometry //- Set the injection position and owner cell - void setPositionAndCell + virtual void setPositionAndCell ( const label parcelI, const scalar time, @@ -140,23 +140,21 @@ public: label& cellOwner ); - //- Return the velocity of the parcel to introduce at a time - vector velocity + virtual void setProperties ( const label parcelI, - const scalar time + const scalar time, + typename CloudType::parcelType* pPtr ); - //- Return the diameter of the parcel to introduce at a time - scalar d0 - ( - const label parcelI, - const scalar time - ) const; + virtual bool fullyDescribed() const + { + return false; + } //- Return flag to identify whether or not injection in cellI is // permitted - bool validInjection(const label parcelI); + virtual bool validInjection(const label parcelI); }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C index 5e51bc26a9ee1c3a8c392dc9248df4287d90fb06..d2936b3cbec49d0f5d0a2199bc240c29dc9255e5 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C @@ -99,24 +99,18 @@ void Foam::NoInjection<CloudType>::setPositionAndCell template<class CloudType> -Foam::vector Foam::NoInjection<CloudType>::velocity +void Foam::NoInjection<CloudType>::setProperties ( - const label, - const scalar + const label parcelI, + const scalar, + typename CloudType::parcelType* pPtr ) { - return vector::zero; -} - + // set particle velocity + pPtr->U() = vector::zero; -template<class CloudType> -Foam::scalar Foam::NoInjection<CloudType>::d0 -( - const label, - const scalar -) const -{ - return 0.0; + // set particle diameter + pPtr->d() = 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 e05790a64e928e90e3d00e8d7c3326cf97e5f3e9..fef47e00b336ce9fbf38895636f1a923d53fcd71 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H @@ -56,14 +56,14 @@ protected: // Protected member functions - //- Number of parcels to introduce over the time step + //- Number of parcels to introduce over the time step relative to SOI label parcelsToInject ( const scalar, const scalar ) const; - //- Volume of parcels to introduce over the time step + //- Volume of parcels to introduce over the time step relative to SOI scalar volumeToInject ( const scalar, @@ -103,7 +103,7 @@ public: // Injection geometry //- Set the injection position and owner cell - void setPositionAndCell + virtual void setPositionAndCell ( const label parcelI, const scalar time, @@ -111,19 +111,17 @@ public: label& cellOwner ); - //- Return the velocity of the parcel to introduce at a time - vector velocity + virtual void setProperties ( const label parcelI, - const scalar time + const scalar time, + typename CloudType::parcelType* pPtr ); - //- Return the diameter of the parcel to introduce at a time - scalar d0 - ( - const label parcelI, - const scalar time - ) const; + virtual bool fullyDescribed() const + { + return false; + } //- Return flag to identify whether or not injection in cellI is // permitted