From 29c8a77e04d8f7c9e64ad4b06b5118f01e819fb6 Mon Sep 17 00:00:00 2001 From: Kutalmis Bercin Date: Wed, 18 Dec 2024 16:37:31 +0000 Subject: [PATCH] ENH: ConeNozzle: add injector velocity and angular-segmented disc options --- .../ConeNozzleInjection/ConeNozzleInjection.C | 124 +++++++++++++++++- .../ConeNozzleInjection/ConeNozzleInjection.H | 21 ++- 2 files changed, 141 insertions(+), 4 deletions(-) diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C index 527b32851d..20eb4cbf2c 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeNozzleInjection/ConeNozzleInjection.C @@ -30,6 +30,7 @@ License #include "Function1.H" #include "unitConversion.H" #include "distributionModel.H" +#include "axisAngleRotation.H" using namespace Foam::constant; @@ -43,8 +44,10 @@ Foam::ConeNozzleInjection::injectionMethodNames ({ { injectionMethod::imPoint, "point" }, { injectionMethod::imDisc, "disc" }, + { injectionMethod::imDiscSegments, "discSegments" }, }); + template const Foam::Enum < @@ -231,6 +234,20 @@ Foam::ConeNozzleInjection::ConeNozzleInjection owner.rndGen() ) ), + t0_(this->template getModelProperty("t0")), + nInjectors_ + ( + this->coeffDict().template getOrDefault("nInjectors", 1) + ), + Uinjector_(Zero), + initialInjectorDir_ + ( + this->coeffDict().template getOrDefault + ( + "initialInjectorDir", + Zero + ) + ), tanVec1_(Zero), tanVec2_(Zero), normal_(Zero), @@ -248,6 +265,15 @@ Foam::ConeNozzleInjection::ConeNozzleInjection << exit(FatalError); } + if (nInjectors_ < SMALL) + { + FatalIOErrorInFunction(this->coeffDict()) + << "Number of injectors in angular-segmented disc " + << "must be positive" << nl + << " nInjectors: " << nInjectors_ << nl + << exit(FatalIOError); + } + // Convert from user time to reduce the number of time conversion calls const Time& time = owner.db().time(); duration_ = time.userTimeToTime(duration_); @@ -297,6 +323,10 @@ Foam::ConeNozzleInjection::ConeNozzleInjection thetaInner_(im.thetaInner_.clone()), thetaOuter_(im.thetaOuter_.clone()), sizeDistribution_(im.sizeDistribution_.clone()), + t0_(im.t0_), + nInjectors_(im.nInjectors_), + Uinjector_(im.Uinjector_), + initialInjectorDir_(im.initialInjectorDir_), tanVec1_(im.tanVec1_), tanVec2_(im.tanVec2_), normal_(im.normal_), @@ -420,6 +450,14 @@ void Foam::ConeNozzleInjection::setPositionAndCell { position = positionVsTime_->value(t); + // Estimate the moving injector velocity + const vector position0(positionVsTime_->value(t0_)); + const scalar dt = t - t0_; + if (dt > 0) + { + Uinjector_ = (position - position0)/dt; + } + this->findCellAtPosition ( cellOwner, @@ -438,6 +476,70 @@ void Foam::ConeNozzleInjection::setPositionAndCell position = positionVsTime_->value(t) + r*normal_; + // Estimate the moving injector velocity + const vector position0(positionVsTime_->value(t0_) + r*normal_); + const scalar dt = t - t0_; + if (dt > 0) + { + Uinjector_ = (position - position0)/dt; + } + + this->findCellAtPosition + ( + cellOwner, + tetFacei, + tetPti, + position + ); + break; + } + case injectionMethod::imDiscSegments: + { + // Calculate the uniform angular increment in radians + const scalar angleIncrement = mathematical::twoPi/nInjectors_; + + // Randomly set the index of injector angles + const label injectorIndex = + rndGen.globalPosition