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