From e2bad4ddac0ea2d758d4677a81264885f86dae18 Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Fri, 20 Feb 2009 17:45:44 +0000
Subject: [PATCH] restructuring

    - injection model sets new parcel position and cell owner
    - allows injection model to cache injection cells etc.
---
 .../Templates/KinematicCloud/KinematicCloud.C |  2 +-
 .../ConeInjection/ConeInjection.C             | 20 +++--
 .../ConeInjection/ConeInjection.H             | 10 ++-
 .../InjectionModel/InjectionModel.C           | 82 ++++++++++---------
 .../InjectionModel/InjectionModel.H           | 29 ++++---
 .../InjectionModel/InjectionModelI.H          |  4 +-
 .../ManualInjection/ManualInjection.C         | 20 +++--
 .../ManualInjection/ManualInjection.H         | 10 ++-
 .../InjectionModel/NoInjection/NoInjection.C  | 12 +--
 .../InjectionModel/NoInjection/NoInjection.H  | 10 ++-
 10 files changed, 108 insertions(+), 91 deletions(-)

diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index 8a8723a5395..55ad4d3b576 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -244,7 +244,7 @@ void Foam::KinematicCloud<ParcelType>::info() const
 {
     Info<< "Cloud name: " << this->name() << nl
         << "    Parcels added during this run   = "
-        << returnReduce(this->injection().nParcelsAddedTotal(), sumOp<label>())
+        << returnReduce(this->injection().parcelsAddedTotal(), sumOp<label>())
             << nl
         << "    Mass introduced during this run = "
         << returnReduce(this->injection().massInjected(), sumOp<scalar>())
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
index a1cc13f345d..a6d5a830413 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
@@ -30,7 +30,7 @@ License
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
 template<class CloudType>
-Foam::label Foam::ConeInjection<CloudType>::nParcelsToInject
+Foam::label Foam::ConeInjection<CloudType>::parcelsToInject
 (
     const scalar time0,
     const scalar time1
@@ -172,36 +172,38 @@ Foam::scalar Foam::ConeInjection<CloudType>::timeEnd() const
 
 
 template<class CloudType>
-Foam::vector Foam::ConeInjection<CloudType>::position
+void Foam::ConeInjection<CloudType>::setPositionAndCell
 (
     const label,
     const scalar,
-    const polyMeshInfo& meshInfo
+    const polyMeshInfo& meshInfo,
+    vector& position,
+    label& cellOwner
 )
 {
-    vector pos = position_;
+    position = position_;
+    this->findCellAtPosition(cellOwner, position);
+
     if (meshInfo.caseIs2d())
     {
         if (meshInfo.caseIs2dWedge())
         {
-            pos.component(meshInfo.emptyComponent()) = 0.0;
+            position.component(meshInfo.emptyComponent()) = 0.0;
         }
         else if (meshInfo.caseIs2dSlab())
         {
-            pos.component(meshInfo.emptyComponent()) =
+            position.component(meshInfo.emptyComponent()) =
                 meshInfo.centrePoint().component(meshInfo.emptyComponent());
         }
         else
         {
             FatalErrorIn
             (
-                "Foam::vector Foam::ConeInjection<CloudType>::position"
+                "void Foam::ConeInjection<CloudType>::setPositionAndCell"
             )   << "Could not determine 2-D case geometry" << nl
                 << abort(FatalError);
         }
     }
-
-    return pos;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
index d4f01a4b68e..8034278da56 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
@@ -113,7 +113,7 @@ protected:
     // Protected member functions
 
         //- Number of parcels to introduce over the time step
-        label nParcelsToInject
+        label parcelsToInject
         (
             const scalar time0,
             const scalar time1
@@ -159,12 +159,14 @@ public:
 
         // Injection geometry
 
-            //- Return the injection position
-            vector position
+            //- Set the injection position and owner cell
+            void setPositionAndCell
             (
                 const label iParcel,
                 const scalar time,
-                const polyMeshInfo& meshInfo
+                const polyMeshInfo& meshInfo,
+                vector& position,
+                label& cellOwner
             );
 
             //- Return the velocity of the parcel to introduce at a time
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
index 3ef7e2a8734..65d0ac295f7 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
@@ -34,13 +34,13 @@ void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
 (
     const scalar time0,
     const scalar time1,
-    label& nParcels,
-    scalar& volume
+    label& newParcels,
+    scalar& newVolume
 )
 {
     // Initialise values
-    nParcels = 0;
-    volume = 0.0;
+    newParcels = 0;
+    newVolume = 0.0;
 
     // Return if not started injection event
     if (time1 < SOI_)
@@ -54,13 +54,13 @@ void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
     scalar t1 = time1 - SOI_;
 
     // Number of parcels to inject
-    nParcels = nParcelsToInject(t0, t1);
+    newParcels = parcelsToInject(t0, t1);
 
     // Volume of parcels to inject
-    volume = volumeToInject(t0, t1);
+    newVolume = volumeToInject(t0, t1);
 
     // Hold previous time if no parcels, but non-zero volume fraction
-    if ((nParcels == 0) && (volume > 0.0))
+    if ((newParcels == 0) && (newVolume > 0.0))
     {
         // hold value of timeStep0_
     }
@@ -73,7 +73,7 @@ void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
 
 
 template<class CloudType>
-void Foam::InjectionModel<CloudType>::findInjectorCellAndPosition
+void Foam::InjectionModel<CloudType>::findCellAtPosition
 (
     label& cellI,
     vector& position
@@ -88,7 +88,7 @@ void Foam::InjectionModel<CloudType>::findInjectorCellAndPosition
     if (cellI >= 0)
     {
         const vector& C = owner_.mesh().C()[cellI];
-        position += 1.0e-6*(C - position);
+        position += SMALL*(C - position);
 
         foundCell = owner_.mesh().pointInCell(position, cellI);
     }
@@ -103,7 +103,7 @@ void Foam::InjectionModel<CloudType>::findInjectorCellAndPosition
         if (cellI >= 0)
         {
             const vector& C = owner_.mesh().C()[cellI];
-            position += 1.0e-6*(C - position);
+            position += SMALL*(C - position);
 
             foundCell = owner_.mesh().pointInCell(position, cellI);
         }
@@ -114,7 +114,7 @@ void Foam::InjectionModel<CloudType>::findInjectorCellAndPosition
     {
         FatalErrorIn
         (
-            "InjectionModel<CloudType>::setInjectorCellAndPosition"
+            "InjectionModel<CloudType>::findCellAtPosition"
             "(label&, vector&)"
         )<< "Cannot find parcel injection cell. "
          << "Parcel position = " << p0 << nl
@@ -126,7 +126,7 @@ void Foam::InjectionModel<CloudType>::findInjectorCellAndPosition
 template<class CloudType>
 Foam::scalar Foam::InjectionModel<CloudType>::setNumberOfParticles
 (
-    const label nParcels,
+    const label parcels,
     const scalar diameter,
     const scalar volumeFraction,
     const scalar rho,
@@ -138,7 +138,7 @@ Foam::scalar Foam::InjectionModel<CloudType>::setNumberOfParticles
     {
         case pbMass:
         {
-            nP = volumeFraction*massTotal_/nParcels
+            nP = volumeFraction*massTotal_/parcels
                /(rho*mathematicalConstant::pi/6.0*pow3(diameter));
             break;
         }
@@ -152,9 +152,15 @@ Foam::scalar Foam::InjectionModel<CloudType>::setNumberOfParticles
             nP = 0.0;
             FatalErrorIn
             (
-                "void Foam::InjectionModel<CloudType>::setNumberOfParticles"
-                "(const label, const scalar, const scalar, const scalar, "
-                "const scalar)"
+                "Foam::scalar "
+                "Foam::InjectionModel<CloudType>::setNumberOfParticles"
+                "(\n"
+                "    const label,\n"
+                "    const scalar,\n"
+                "    const scalar,\n"
+                "    const scalar,\n"
+                "    const scalar\n"
+                ")"
             )<< "Unknown parcelBasis type" << nl
              << exit(FatalError);
         }
@@ -167,18 +173,18 @@ Foam::scalar Foam::InjectionModel<CloudType>::setNumberOfParticles
 template<class CloudType>
 void Foam::InjectionModel<CloudType>::postInjectCheck()
 {
-    if (nParcelsAdded_ > 0)
+    if (parcelsAdded_ > 0)
     {
         Pout<< "\n--> Cloud: " << owner_.name() << nl
-            << "    Added " << nParcelsAdded_
+            << "    Added " << parcelsAdded_
             <<  " new parcels" << nl << endl;
     }
 
     // Increment total number of parcels added
-    nParcelsAddedTotal_ += nParcelsAdded_;
+    parcelsAddedTotal_ += parcelsAdded_;
 
     // Reset parcel counters
-    nParcelsAdded_ = 0;
+    parcelsAdded_ = 0;
 
     // Update time for start of next injection
     time0_ = owner_.db().time().value();
@@ -205,8 +211,8 @@ Foam::InjectionModel<CloudType>::InjectionModel
     massTotal_(dimensionedScalar(coeffDict_.lookup("massTotal")).value()),
     massInjected_(0.0),
     nInjections_(0),
-    nParcelsAdded_(0),
-    nParcelsAddedTotal_(0),
+    parcelsAdded_(0),
+    parcelsAddedTotal_(0),
     parcelBasisType_(coeffDict_.lookup("parcelBasisType")),
     parcelBasis_(pbNumber),
     time0_(owner.db().time().value()),
@@ -249,13 +255,13 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
     const scalar continuousDt = owner_.db().time().deltaT().value();
 
     // Prepare for next time step
-    nParcelsAdded_ = 0;
-    label nParcels = 0;
-    scalar volume = 0.0;
-    prepareForNextTimeStep(time0_, time, nParcels, volume);
+    parcelsAdded_ = 0;
+    label newParcels = 0;
+    scalar newVolume = 0.0;
+    prepareForNextTimeStep(time0_, time, newParcels, newVolume);
 
     // Return if no parcels are required
-    if (nParcels == 0)
+    if (newParcels == 0)
     {
         postInjectCheck();
         return;
@@ -265,7 +271,7 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
     const scalar rho = td.constProps().rho0();
 
     // Volume fraction to introduce during this timestep
-    const scalar volFraction = volumeFraction(volume);
+    const scalar volFraction = volumeFraction(newVolume);
 
     // Duration of injection period during this timestep
     const scalar deltaT = min
@@ -278,13 +284,15 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
     const scalar padTime = max(0.0, SOI_ - time0_);
 
     // Introduce new parcels linearly with time
-    for (label iParcel=0; iParcel<nParcels; iParcel++)
+    for (label iParcel=0; iParcel<newParcels; iParcel++)
     {
         // Calculate the pseudo time of injection for parcel 'iParcel'
-        scalar timeInj = time0_ + padTime + deltaT*iParcel/nParcels;
+        scalar timeInj = time0_ + padTime + deltaT*iParcel/newParcels;
 
-        // Determine injected parcel properties
-        vector pos = position(iParcel, timeInj, owner_.meshInfo());
+        // Determine the injection position and owner cell
+        label cellI = -1;
+        vector pos = vector::zero;
+        setPositionAndCell(iParcel, timeInj, owner_.meshInfo(), pos, cellI);
 
         // Diameter of parcels
         scalar d = d0(iParcel, timeInj);
@@ -292,27 +300,23 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
         // Number of particles per parcel
         scalar nP = setNumberOfParticles
         (
-            nParcels,
+            newParcels,
             d,
             volFraction,
             rho,
-            volume
+            newVolume
         );
 
         // Velocity of parcels
         vector U = velocity(iParcel, timeInj, owner_.meshInfo());
 
-        // Determine the injection cell
-        label cellI = -1;
-        findInjectorCellAndPosition(cellI, pos);
-
         if (cellI >= 0)
         {
             scalar dt = time - timeInj;
             td.cloud().addNewParcel(pos, cellI, d, U, nP, dt);
 
             massInjected_ += nP*rho*mathematicalConstant::pi*pow3(d)/6.0;
-            nParcelsAdded_++;
+            parcelsAdded_++;
         }
     }
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
index 791631fb993..aad8f1a6c66 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
@@ -108,10 +108,10 @@ protected:
             label nInjections_;
 
             //- Running counter of parcels added during each injection
-            label nParcelsAdded_;
+            label parcelsAdded_;
 
             //- Running counter of total number of parcels added
-            label nParcelsAddedTotal_;
+            label parcelsAddedTotal_;
 
 
         // Injection properties per Lagrangian time step
@@ -134,7 +134,7 @@ protected:
     // Protected member functions
 
         //- Number of parcels to introduce over the time step
-        virtual label nParcelsToInject
+        virtual label parcelsToInject
         (
             const scalar time0,
             const scalar time1
@@ -153,13 +153,14 @@ protected:
         (
             const scalar time0,
             const scalar time1,
-            label& nParcels,
-            scalar& volume
+            label& newParcels,
+            scalar& newVolume
         );
 
-        //- Find the cell that contains the injector position
-        //  Will modify position slightly towards the owner cell centroid
-        virtual void findInjectorCellAndPosition
+        //- Find the cell that contains the supplied position
+        //  Will modify position slightly towards the owner cell centroid to
+        //  ensure that it lies in a cell and not edge/face
+        virtual void findCellAtPosition
         (
             label& cellI,
             vector& position
@@ -168,7 +169,7 @@ protected:
         //- Set number of particles to inject given parcel properties
         scalar setNumberOfParticles
         (
-            const label nParcels,
+            const label parcels,
             const scalar diameter,
             const scalar volumeFraction,
             const scalar rho,
@@ -265,7 +266,7 @@ public:
                 inline label nInjections() const;
 
                 //- Return the total number parcels added
-                inline label nParcelsAddedTotal() const;
+                inline label parcelsAddedTotal() const;
 
 
         // Per-injection event functions
@@ -280,12 +281,14 @@ public:
 
         // Injection geometry
 
-            //- Return the injection position
-            virtual vector position
+            //- Set the injection position and owner cell
+            virtual void setPositionAndCell
             (
                 const label iParcel,
                 const scalar time,
-                const polyMeshInfo& meshInfo
+                const polyMeshInfo& meshInfo,
+                vector& position,
+                label& cellOwner
             ) = 0;
 
             //- Return the velocity of the parcel to introduce at a time
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H
index f02d05b902c..80a142816c8 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H
@@ -90,9 +90,9 @@ Foam::label Foam::InjectionModel<CloudType>::nInjections() const
 
 
 template<class CloudType>
-Foam::label Foam::InjectionModel<CloudType>::nParcelsAddedTotal() const
+Foam::label Foam::InjectionModel<CloudType>::parcelsAddedTotal() const
 {
-    return nParcelsAddedTotal_;
+    return parcelsAddedTotal_;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
index c201b5fc4f3..6a8361d7df2 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
@@ -29,7 +29,7 @@ License
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
 template<class CloudType>
-Foam::label Foam::ManualInjection<CloudType>::nParcelsToInject
+Foam::label Foam::ManualInjection<CloudType>::parcelsToInject
 (
     const scalar time0,
     const scalar time1
@@ -135,36 +135,38 @@ Foam::scalar Foam::ManualInjection<CloudType>::timeEnd() const
 
 
 template<class CloudType>
-Foam::vector Foam::ManualInjection<CloudType>::position
+void Foam::ManualInjection<CloudType>::setPositionAndCell
 (
     const label iParcel,
     const scalar time,
-    const polyMeshInfo& meshInfo
+    const polyMeshInfo& meshInfo,
+    vector& position,
+    label& cellOwner
 )
 {
-    vector pos = positions_[iParcel];
+    position = positions_[iParcel];
+    this->findCellAtPosition(cellOwner, position);
+
     if (meshInfo.caseIs2d())
     {
         if (meshInfo.caseIs2dWedge())
         {
-            pos.component(meshInfo.emptyComponent()) = 0.0;
+            position.component(meshInfo.emptyComponent()) = 0.0;
         }
         else if (meshInfo.caseIs2dSlab())
         {
-            pos.component(meshInfo.emptyComponent()) =
+            position.component(meshInfo.emptyComponent()) =
                 meshInfo.centrePoint().component(meshInfo.emptyComponent());
         }
         else
         {
             FatalErrorIn
             (
-                "Foam::vector Foam::ManualInjection<CloudType>::position"
+                "void Foam::ManualInjection<CloudType>::setPositionAndCell"
             )   << "Could not determine 2-D case geometry" << nl
                 << abort(FatalError);
         }
     }
-
-    return pos;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
index 63939241775..05f117b8ad0 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
@@ -94,7 +94,7 @@ protected:
     // Protected member functions
 
         //- Number of parcels to introduce over the time step
-        label nParcelsToInject
+        label parcelsToInject
         (
             const scalar time0,
             const scalar time1
@@ -140,12 +140,14 @@ public:
 
         // Injection geometry
 
-            //- Return the injection position
-            vector position
+            //- Set the injection position and owner cell
+            void setPositionAndCell
             (
                 const label iParcel,
                 const scalar time,
-                const polyMeshInfo& meshInfo
+                const polyMeshInfo& meshInfo,
+                vector& position,
+                label& cellOwner
             );
 
             //- Return the velocity of the parcel to introduce at a time
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
index d5530ba71d0..43c03392f67 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
@@ -30,7 +30,7 @@ License
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
 template<class CloudType>
-Foam::label Foam::NoInjection<CloudType>::nParcelsToInject
+Foam::label Foam::NoInjection<CloudType>::parcelsToInject
 (
     const scalar,
     const scalar
@@ -88,15 +88,15 @@ Foam::scalar Foam::NoInjection<CloudType>::timeEnd() const
 
 
 template<class CloudType>
-Foam::vector Foam::NoInjection<CloudType>::position
+void Foam::NoInjection<CloudType>::setPositionAndCell
 (
     const label,
     const scalar,
-    const polyMeshInfo&
+    const polyMeshInfo&,
+    vector&,
+    label&
 )
-{
-    return vector::zero;
-}
+{}
 
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
index 99f37cea4a4..538af518043 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
@@ -58,7 +58,7 @@ protected:
     // Protected member functions
 
         //- Number of parcels to introduce over the time step
-        label nParcelsToInject
+        label parcelsToInject
         (
             const scalar,
             const scalar
@@ -104,12 +104,14 @@ public:
 
         // Injection geometry
 
-            //- Return the injection position
-            vector position
+            //- Set the injection position and owner cell
+            void setPositionAndCell
             (
                 const label iParcel,
                 const scalar time,
-                const polyMeshInfo& meshInfo
+                const polyMeshInfo& meshInfo,
+                vector& position,
+                label& cellOwner
             );
 
             //- Return the velocity of the parcel to introduce at a time
-- 
GitLab