From 48d003675abd8c4f9128fafdfed4850b59c3d55b Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Tue, 26 May 2009 11:25:15 +0100
Subject: [PATCH] using new setProperties method for new particles

---
 .../ConeInjection/ConeInjection.C             |  24 ++--
 .../ConeInjection/ConeInjection.H             |  24 ++--
 .../FieldActivatedInjection.C                 |  22 ++--
 .../FieldActivatedInjection.H                 |  24 ++--
 .../InjectionModel/InjectionModel.C           | 103 ++++++++++--------
 .../InjectionModel/InjectionModel.H           |  20 +++-
 .../ManualInjection/ManualInjection.C         |  24 ++--
 .../ManualInjection/ManualInjection.H         |  24 ++--
 .../InjectionModel/NoInjection/NoInjection.C  |  22 ++--
 .../InjectionModel/NoInjection/NoInjection.H  |  22 ++--
 10 files changed, 151 insertions(+), 158 deletions(-)

diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
index a812eb91897..9eb74d585f8 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 b65a6b58988..b60c1377aee 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 3110de5c3e3..b3340351438 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 0fec8998159..88d9c8302f6 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 6a0ba9544bc..d73859de150 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 b18f1b0dceb..6e612194e3a 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 6d71828c237..f7da4915a24 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 6b3988abcaa..327ec83ce23 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 5e51bc26a9e..d2936b3cbec 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 e05790a64e9..fef47e00b33 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
-- 
GitLab