/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
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_(NULL),
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_ = NULL;
ownGradK_ = false;
}
}
}
template
Foam::vector Foam::GradientDispersionRAS::update
(
const scalar dt,
const label cellI,
const vector& U,
const vector& Uc,
vector& UTurb,
scalar& tTurb
)
{
cachedRandom& rnd = this->owner().rndGen();
const scalar cps = 0.16432;
const scalar k = this->kPtr_->internalField()[cellI];
const scalar epsilon =
this->epsilonPtr_->internalField()[cellI] + ROOTVSMALL;
const vector& gradk = this->gradkPtr_->internalField()[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;
scalar sigma = sqrt(2.0*k/3.0);
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 = vector::zero;
}
return Uc + UTurb;
}
// ************************************************************************* //