diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C index 1339545c234ccf43169a3b44bcfd188b59bd6827..e8844a526100b8d9fe8585c3ceb289abdbe846b7 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C @@ -30,6 +30,82 @@ License using namespace Foam::constant; +// * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * * // + +template<class CloudType> +void Foam::ConeNozzleInjection<CloudType>::setInjectionMethod() +{ + word injectionMethodType = this->coeffDict().lookup("injectionMethod"); + if (injectionMethodType == "disc") + { + injectionMethod_ = imDisc; + } + else if (injectionMethodType == "point") + { + injectionMethod_ = imPoint; + + // Set/cache the injector cell + this->findCellAtPosition + ( + injectorCell_, + tetFaceI_, + tetPtI_, + position_, + false + ); + } + else + { + FatalErrorIn("Foam::InjectionModel<CloudType>::setInjectionMethod()") + << "injectionMethod must be either 'point' or 'disc'" + << exit(FatalError); + } +} + + +template<class CloudType> +void Foam::ConeNozzleInjection<CloudType>::setFlowType() +{ + word flowType = this->coeffDict().lookup("flowType"); + if (flowType == "constantVelocity") + { + this->coeffDict().lookup("UMag") >> UMag_; + flowType_ = ftConstantVelocity; + } + else if (flowType == "pressureDrivenVelocity") + { + Pinj_.reset + ( + DataEntry<scalar>::New + ( + "Pinj", + this->coeffDict() + ).ptr() + ); + flowType_ = ftPressureDrivenVelocity; + } + else if (flowType == "flowRateAndDischarge") + { + Cd_.reset + ( + DataEntry<scalar>::New + ( + "Cd", + this->coeffDict() + ).ptr() + ); + flowType_ = ftFlowRateAndDischarge; + } + else + { + FatalErrorIn("Foam::InjectionModel<CloudType>::setFlowType()") + << "flowType must be either 'constantVelocity', " + <<"'pressureDrivenVelocity' or 'flowRateAndDischarge'" + << exit(FatalError); + } +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template<class CloudType> @@ -41,14 +117,9 @@ Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection : InjectionModel<CloudType>(dict, owner, typeName), injectionMethod_(imPoint), - outerNozzleDiameter_ - ( - readScalar(this->coeffDict().lookup("outerNozzleDiameter")) - ), - innerNozzleDiameter_ - ( - readScalar(this->coeffDict().lookup("innerNozzleDiameter")) - ), + flowType_(ftConstantVelocity), + outerDiameter_(readScalar(this->coeffDict().lookup("outerDiameter"))), + innerDiameter_(readScalar(this->coeffDict().lookup("innerDiameter"))), duration_(readScalar(this->coeffDict().lookup("duration"))), position_(this->coeffDict().lookup("position")), injectorCell_(-1), @@ -67,14 +138,6 @@ Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection this->coeffDict() ) ), - Cd_ - ( - DataEntry<scalar>::New - ( - "Cd", - this->coeffDict() - ) - ), thetaInner_ ( DataEntry<scalar>::New @@ -101,9 +164,13 @@ Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection ), tanVec1_(vector::zero), tanVec2_(vector::zero), - normal_(vector::zero) + normal_(vector::zero), + + UMag_(0.0), + Cd_(NULL), + Pinj_(NULL) { - if (innerNozzleDiameter_ >= outerNozzleDiameter_) + if (innerDiameter_ >= outerDiameter_) { FatalErrorIn ( @@ -116,38 +183,9 @@ Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection << exit(FatalError); } - word injectionMethodType = this->coeffDict().lookup("injectionMethod"); - - if (injectionMethodType == "disc") - { - injectionMethod_ = imDisc; - } - else if (injectionMethodType == "point") - { - injectionMethod_ = imPoint; + setInjectionMethod(); - // Set/cache the injector cell - this->findCellAtPosition - ( - injectorCell_, - tetFaceI_, - tetPtI_, - position_, - false - ); - } - else - { - FatalErrorIn - ( - "Foam::InjectionModel<CloudType>::InjectionModel" - "(" - "const dictionary&, " - "CloudType&" - ")" - )<< "injectionMethod must be either 'point' or 'disc'" << nl - << exit(FatalError); - } + setFlowType(); cachedRandom& rndGen = this->owner().rndGen(); @@ -182,21 +220,23 @@ Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection : InjectionModel<CloudType>(im), injectionMethod_(im.injectionMethod_), - outerNozzleDiameter_(im.outerNozzleDiameter_), - innerNozzleDiameter_(im.innerNozzleDiameter_), + outerDiameter_(im.outerDiameter_), + innerDiameter_(im.innerDiameter_), duration_(im.duration_), position_(im.position_), injectorCell_(im.injectorCell_), direction_(im.direction_), parcelsPerSecond_(im.parcelsPerSecond_), volumeFlowRate_(im.volumeFlowRate_().clone().ptr()), - Cd_(im.Cd_().clone().ptr()), thetaInner_(im.thetaInner_().clone().ptr()), thetaOuter_(im.thetaOuter_().clone().ptr()), sizeDistribution_(im.sizeDistribution_().clone().ptr()), tanVec1_(im.tanVec1_), tanVec2_(im.tanVec1_), - normal_(im.normal_) + normal_(im.normal_), + UMag_(im.UMag_), + Cd_(im.Cd_().clone().ptr()), + Pinj_(im.Pinj_().clone().ptr()) {} @@ -283,8 +323,8 @@ void Foam::ConeNozzleInjection<CloudType>::setPositionAndCell case imDisc: { scalar frac = rndGen.sample01<scalar>(); - scalar dr = outerNozzleDiameter_ - innerNozzleDiameter_; - scalar r = 0.5*(innerNozzleDiameter_ + frac*dr); + scalar dr = outerDiameter_ - innerDiameter_; + scalar r = 0.5*(innerDiameter_ + frac*dr); position = position_ + r*normal_; this->findCellAtPosition @@ -344,13 +384,38 @@ void Foam::ConeNozzleInjection<CloudType>::setProperties dirVec += normal; dirVec /= mag(dirVec); - scalar Ao = 0.25*mathematical::pi*outerNozzleDiameter_*outerNozzleDiameter_; - scalar Ai = 0.25*mathematical::pi*innerNozzleDiameter_*innerNozzleDiameter_; - scalar massFlowRate = - this->massTotal()*volumeFlowRate_().value(t)/this->volumeTotal(); - - scalar Umag = massFlowRate/(parcel.rho()*Cd_().value(t)*(Ao - Ai)); - parcel.U() = Umag*dirVec; + switch (flowType_) + { + case ftConstantVelocity: + { + parcel.U() = UMag_*dirVec; + break; + } + case ftPressureDrivenVelocity: + { + scalar pAmbient = this->owner().pAmbient(); + scalar rho = parcel.rho(); + scalar UMag = ::sqrt(2.0*(Pinj_().value(t) - pAmbient)/rho); + parcel.U() = UMag*dirVec; + break; + } + case ftFlowRateAndDischarge: + { + scalar Ao = 0.25*mathematical::pi*outerDiameter_*outerDiameter_; + scalar Ai = 0.25*mathematical::pi*innerDiameter_*innerDiameter_; + scalar massFlowRate = + this->massTotal() + *volumeFlowRate_().value(t) + /this->volumeTotal(); + + scalar Umag = massFlowRate/(parcel.rho()*Cd_().value(t)*(Ao - Ai)); + parcel.U() = Umag*dirVec; + break; + } + default: + { + } + } // set particle diameter parcel.d() = sizeDistribution_->sample(); diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.H index d5e9a6fc7fcc8fafda2862661cef538cb21abb12..46f876acf887ed6fc1a29829f1ad3c093b718104 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.H @@ -32,16 +32,18 @@ Description - injector position - direction (along injection axis) - parcel flow rate - - discharge coefficient, Cd - inner and outer cone angles - Parcel diameters obtained by size distribution model - Parcel velocity is calculated as: - U = V_dot/(A * Cd), where V_dot is the volume flow rate - - Based on the old 'unitInjection' model + - Constant velocity + U = <specified by user> + - Pressure driven velocity + U = sqrt(2*(Pinj - Pamb)/rho) + - Flow rate and discharge + U = V_dot/(A*Cd) SourceFiles ConeNozzleInjection.C @@ -83,19 +85,30 @@ public: imDisc }; + //- Flow type enumeration + enum flowType + { + ftConstantVelocity, + ftPressureDrivenVelocity, + ftFlowRateAndDischarge + }; + private: // Private data - //- point/disc injection method + //- Point/disc injection method injectionMethod injectionMethod_; + //- Flow type + flowType flowType_; + //- Outer nozzle diameter [m] - const scalar outerNozzleDiameter_; + const scalar outerDiameter_; //- Inner nozzle diameter [m] - const scalar innerNozzleDiameter_; + const scalar innerDiameter_; //- Injection duration [s] const scalar duration_; @@ -121,9 +134,6 @@ private: //- Volume flow rate of parcels to introduce relative to SOI [m^3/s] const autoPtr<DataEntry<scalar> > volumeFlowRate_; - //- Discharge coefficient, relative to SOI [m/s] - const autoPtr<DataEntry<scalar> > Cd_; - //- Inner cone angle relative to SOI [deg] const autoPtr<DataEntry<scalar> > thetaInner_; @@ -146,6 +156,27 @@ private: vector normal_; + // Velocity model coefficients + + //- Constant velocity [m/s] + scalar UMag_; + + //- Discharge coefficient, relative to SOI [m/s] + autoPtr<DataEntry<scalar> > Cd_; + + //- Injection pressure [Pa] + autoPtr<DataEntry<scalar> > Pinj_; + + + // Private Member Functions + + //- Set the injection type + void setInjectionMethod(); + + //- Set the injection flow type + void setFlowType(); + + public: //- Runtime type information diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/reactingCloud1Properties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/reactingCloud1Properties index 4eaea3d71aab63e8bfd91c4e73ab71c6ffb98523..e2149b798d7ab232691402c78357d524b7c3c244 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/reactingCloud1Properties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/reactingCloud1Properties @@ -175,6 +175,18 @@ cloudFunctions cycLeft_half1 ); } + + facePostProcessing + { + surfaceFormat vtk; + resetOnWrite no; + log yes; + + faceZones + ( + cycLeft + ); + } } diff --git a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties index 4a033313dc5b1ad83f29af80f418dff055a8db47..c31c76b9744c7cb0d51a86d4ae17a5d488dda87e 100644 --- a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties +++ b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties @@ -112,8 +112,9 @@ subModels massTotal 6.0e-6; parcelBasisType mass; injectionMethod disc; - outerNozzleDiameter 1.9e-4; - innerNozzleDiameter 0; + flowType flowRateAndDischarge; + outerDiameter 1.9e-4; + innerDiameter 0; duration 1.25e-3; position ( 0 0.0995 0 ); direction ( 0 -1 0 );