/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . \*---------------------------------------------------------------------------*/ #include "GradientDispersionRAS.H" #include "demandDrivenData.H" #include "fvcGrad.H" // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template Foam::GradientDispersionRAS::GradientDispersionRAS ( const dictionary& dict, CloudType& owner ) : DispersionRASModel(dict, owner), gradkPtr_(nullptr), ownGradK_(false) {} template Foam::GradientDispersionRAS::GradientDispersionRAS ( const GradientDispersionRAS& dm ) : DispersionRASModel(dm), gradkPtr_(dm.gradkPtr_), ownGradK_(dm.ownGradK_) { dm.ownGradK_ = false; } // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template Foam::GradientDispersionRAS::~GradientDispersionRAS() { cacheFields(false); } // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template void Foam::GradientDispersionRAS::cacheFields(const bool store) { DispersionRASModel::cacheFields(store); if (store) { gradkPtr_ = fvc::grad(*this->kPtr_).ptr(); ownGradK_ = true; } else { if (ownGradK_) { deleteDemandDrivenData(gradkPtr_); gradkPtr_ = nullptr; ownGradK_ = false; } } } template Foam::vector Foam::GradientDispersionRAS::update ( const scalar dt, const label celli, const vector& U, const vector& Uc, vector& UTurb, scalar& tTurb ) { Random& rnd = this->owner().rndGen(); const scalar cps = 0.16432; const scalar k = this->kPtr_->primitiveField()[celli]; const scalar epsilon = this->epsilonPtr_->primitiveField()[celli] + ROOTVSMALL; const vector& gradk = this->gradkPtr_->primitiveField()[celli]; const scalar UrelMag = mag(U - Uc - UTurb); const scalar tTurbLoc = min(k/epsilon, cps*pow(k, 1.5)/epsilon/(UrelMag + SMALL)); // Parcel is perturbed by the turbulence if (dt < tTurbLoc) { tTurb += dt; if (tTurb > tTurbLoc) { tTurb = 0.0; const scalar sigma = sqrt(2.0*k/3.0); const vector dir = -gradk/(mag(gradk) + SMALL); scalar fac = 0.0; // In 2D calculations the -grad(k) is always // away from the axis of symmetry // This creates a 'hole' in the spray and to // prevent this we let fac be both negative/positive if (this->owner().mesh().nSolutionD() == 2) { fac = rnd.GaussNormal(); } else { fac = mag(rnd.GaussNormal()); } UTurb = sigma*fac*dir; } } else { tTurb = GREAT; UTurb = Zero; } return Uc + UTurb; } // ************************************************************************* //