driftFluxFoam: Generalised the treatment of the effect of flow curvature

Rather than rely on the MRF rotation the effect of acceleration due to flow
curvature on the dispersed is now handled directly using the Ud.grad(Ud) term
derived from the phase momentum equation.  This means that any flow curvature
from bulk rotation to recirulation zones now affect the separation of the
dispersed phase from the continuous phase in a physical manner.
This commit is contained in:
Henry Weller
2022-04-13 11:24:56 +01:00
parent 5e99344348
commit 620cbe9d1f
16 changed files with 246 additions and 153 deletions

View File

@ -1,12 +1,10 @@
// Solve the Momentum equation
MRF.correctBoundaryVelocity(U);
fvVectorMatrix UEqn
(
fvm::ddt(rho, U) + fvm::div(rhoPhi, U)
+ MRF.DDt(rho, U)
+ fvc::div(UdmModel.tauDm())
+ mixture.MRF().DDt(rho, U)
+ mixture.divTauDm()
+ turbulence->divDevTau(U)
==
fvModels.source(rho, U)

View File

@ -13,7 +13,7 @@
dimensionedScalar(phi.dimensions(), 0)
);
surfaceScalarField phir(fvc::flux(UdmModel.Udm()));
surfaceScalarField phir(fvc::flux(mixture.Udm()));
if (nAlphaSubCycles > 1)
{

View File

@ -29,8 +29,13 @@ volVectorField U
#include "createPhi.H"
#include "readGravitationalAcceleration.H"
#include "readhRef.H"
#include "gh.H"
Info<< "Reading incompressibleTwoPhaseInteractingMixture\n" << endl;
incompressibleTwoPhaseInteractingMixture mixture(U, phi);
incompressibleTwoPhaseInteractingMixture mixture(U, phi, g);
volScalarField& alpha1(mixture.alpha1());
@ -63,11 +68,6 @@ surfaceScalarField rhoPhi
);
#include "readGravitationalAcceleration.H"
#include "readhRef.H"
#include "gh.H"
// Construct compressible turbulence model
autoPtr<compressible::momentumTransportModel> turbulence
(
@ -75,7 +75,6 @@ autoPtr<compressible::momentumTransportModel> turbulence
);
volScalarField p
(
IOobject
@ -109,19 +108,5 @@ mesh.schemes().setFluxRequired(alpha1.name());
// MULES Correction
tmp<surfaceScalarField> talphaPhiCorr0;
#include "createMRF.H"
// Relative Velocity
autoPtr<relativeVelocityModel> UdmModelPtr
(
relativeVelocityModel::New
(
mixture,
mixture,
g,
MRF
)
);
#include "createFvModels.H"
#include "createFvConstraints.H"

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -37,15 +37,12 @@ Description
#include "CMULES.H"
#include "subCycle.H"
#include "incompressibleTwoPhaseInteractingMixture.H"
#include "relativeVelocityModel.H"
#include "momentumTransportModel.H"
#include "compressibleMomentumTransportModels.H"
#include "pimpleControl.H"
#include "pressureReference.H"
#include "fvModels.H"
#include "fvConstraints.H"
#include "gaussLaplacianScheme.H"
#include "uncorrectedSnGrad.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -64,7 +61,6 @@ int main(int argc, char *argv[])
volScalarField& alpha2(mixture.alpha2());
const dimensionedScalar& rho1 = mixture.rhod();
const dimensionedScalar& rho2 = mixture.rhoc();
relativeVelocityModel& UdmModel(UdmModelPtr());
turbulence->validate();
@ -85,9 +81,9 @@ int main(int argc, char *argv[])
// --- Pressure-velocity PIMPLE corrector loop
while (pimple.loop())
{
fvModels.correct();
mixture.correct();
UdmModel.correct();
fvModels.correct();
#include "alphaEqnSubCycle.H"

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2014-2021 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -24,6 +24,8 @@ License
\*---------------------------------------------------------------------------*/
#include "incompressibleTwoPhaseInteractingMixture.H"
#include "relativeVelocityModel.H"
#include "fvcDiv.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -39,8 +41,9 @@ namespace Foam
Foam::incompressibleTwoPhaseInteractingMixture::
incompressibleTwoPhaseInteractingMixture
(
const volVectorField& U,
const surfaceScalarField& phi
volVectorField& U,
const surfaceScalarField& phi,
const uniformDimensionedVectorField& g
)
:
twoPhaseMixture(U.mesh()),
@ -60,6 +63,10 @@ incompressibleTwoPhaseInteractingMixture
U_(U),
g_(g),
MRF_(U.mesh()),
mu_
(
IOobject
@ -71,14 +78,145 @@ incompressibleTwoPhaseInteractingMixture
U_.mesh(),
dimensionedScalar(dimensionSet(1, -1, -1, 0, 0), 0),
calculatedFvPatchScalarField::typeName
)
),
UdmModel_(relativeVelocityModel::New(*this, *this, g))
{
correct();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::incompressibleTwoPhaseInteractingMixture::
~incompressibleTwoPhaseInteractingMixture()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
const Foam::mixtureViscosityModel&
Foam::incompressibleTwoPhaseInteractingMixture::muModel() const
{
return muModel_();
}
const Foam::viscosityModel&
Foam::incompressibleTwoPhaseInteractingMixture::nucModel() const
{
return nucModel_();
}
const Foam::dimensionedScalar&
Foam::incompressibleTwoPhaseInteractingMixture::rhod() const
{
return rhod_;
}
const Foam::dimensionedScalar&
Foam::incompressibleTwoPhaseInteractingMixture::rhoc() const
{
return rhoc_;
};
const Foam::dimensionedScalar&
Foam::incompressibleTwoPhaseInteractingMixture::dd() const
{
return dd_;
}
Foam::scalar
Foam::incompressibleTwoPhaseInteractingMixture::alphaMax() const
{
return alphaMax_;
}
const Foam::volVectorField&
Foam::incompressibleTwoPhaseInteractingMixture::U() const
{
return U_;
}
const Foam::IOMRFZoneList&
Foam::incompressibleTwoPhaseInteractingMixture::MRF() const
{
return MRF_;
}
Foam::tmp<Foam::volScalarField>
Foam::incompressibleTwoPhaseInteractingMixture::mu() const
{
return mu_;
}
Foam::tmp<Foam::scalarField>
Foam::incompressibleTwoPhaseInteractingMixture::mu(const label patchi) const
{
return mu_.boundaryField()[patchi];
}
Foam::tmp<Foam::volScalarField>
Foam::incompressibleTwoPhaseInteractingMixture::rho() const
{
return alpha1()*rhod_ + alpha2()*rhoc_;
}
Foam::tmp<Foam::scalarField>
Foam::incompressibleTwoPhaseInteractingMixture::rho(const label patchi) const
{
return
alpha1().boundaryField()[patchi]*rhod_.value()
+ alpha2().boundaryField()[patchi]*rhoc_.value();
}
Foam::tmp<Foam::volScalarField>
Foam::incompressibleTwoPhaseInteractingMixture::nu() const
{
return mu_/rho();
}
Foam::tmp<Foam::scalarField>
Foam::incompressibleTwoPhaseInteractingMixture::nu(const label patchi) const
{
return mu_.boundaryField()[patchi]/rho(patchi);
}
const Foam::volVectorField&
Foam::incompressibleTwoPhaseInteractingMixture::Udm() const
{
return UdmModel_->Udm();
}
Foam::tmp<Foam::volVectorField>
Foam::incompressibleTwoPhaseInteractingMixture::divTauDm() const
{
return fvc::div(UdmModel_->tauDm());
}
void Foam::incompressibleTwoPhaseInteractingMixture::correct()
{
MRF_.correctBoundaryVelocity(U_);
mu_ = muModel_->mu(rhoc_*nucModel_->nu(), U_);
UdmModel_->correct();
}
bool Foam::incompressibleTwoPhaseInteractingMixture::read()
{
if (twoPhaseMixture::read())

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2014-2021 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -37,16 +37,19 @@ SourceFiles
#ifndef incompressibleTwoPhaseInteractingMixture_H
#define incompressibleTwoPhaseInteractingMixture_H
#include "twoPhaseMixture.H"
#include "viscosityModel.H"
#include "mixtureViscosityModel.H"
#include "twoPhaseMixture.H"
#include "viscosity.H"
#include "uniformDimensionedFields.H"
#include "IOMRFZoneList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
class relativeVelocityModel;
/*---------------------------------------------------------------------------*\
Class incompressibleTwoPhaseInteractingMixture Declaration
\*---------------------------------------------------------------------------*/
@ -70,10 +73,19 @@ class incompressibleTwoPhaseInteractingMixture
//- Optional maximum dispersed phase-fraction (e.g. packing limit)
scalar alphaMax_;
const volVectorField& U_;
volVectorField& U_;
//- Acceleration due to gravity
const uniformDimensionedVectorField& g_;
//- Optional MRF zones
IOMRFZoneList MRF_;
volScalarField mu_;
//- Dispersed phase relative velocity model
autoPtr<relativeVelocityModel> UdmModel_;
public:
@ -85,104 +97,69 @@ public:
//- Construct from components
incompressibleTwoPhaseInteractingMixture
(
const volVectorField& U,
const surfaceScalarField& phi
volVectorField& U,
const surfaceScalarField& phi,
const uniformDimensionedVectorField& g
);
//- Destructor
virtual ~incompressibleTwoPhaseInteractingMixture()
{}
virtual ~incompressibleTwoPhaseInteractingMixture();
// Member Functions
//- Return const-access to the mixture viscosityModel
const mixtureViscosityModel& muModel() const
{
return muModel_();
}
const mixtureViscosityModel& muModel() const;
//- Return const-access to the continuous-phase viscosityModel
const viscosityModel& nucModel() const
{
return nucModel_();
}
const viscosityModel& nucModel() const;
//- Return const-access to the dispersed-phase density
const dimensionedScalar& rhod() const
{
return rhod_;
}
const dimensionedScalar& rhod() const;
//- Return const-access to continuous-phase density
const dimensionedScalar& rhoc() const
{
return rhoc_;
};
const dimensionedScalar& rhoc() const;
//- Return the diameter of the dispersed-phase particles
const dimensionedScalar& dd() const
{
return dd_;
}
const dimensionedScalar& dd() const;
//- Optional maximum phase-fraction (e.g. packing limit)
// Defaults to 1
scalar alphaMax() const
{
return alphaMax_;
}
scalar alphaMax() const;
//- Return const-access to the mixture velocity
const volVectorField& U() const
{
return U_;
}
const volVectorField& U() const;
//- Return MRF zones
const IOMRFZoneList& MRF() const;
//- Return the dynamic mixture viscosity
tmp<volScalarField> mu() const
{
return mu_;
}
tmp<volScalarField> mu() const;
//- Return the dynamic mixture viscosity for patch
virtual tmp<scalarField> mu(const label patchi) const
{
return mu_.boundaryField()[patchi];
}
virtual tmp<scalarField> mu(const label patchi) const;
//- Return the mixture density
virtual tmp<volScalarField> rho() const
{
return alpha1()*rhod_ + alpha2()*rhoc_;
}
virtual tmp<volScalarField> rho() const;
//- Return the mixture density for patch
virtual tmp<scalarField> rho(const label patchi) const
{
return
alpha1().boundaryField()[patchi]*rhod_.value()
+ alpha2().boundaryField()[patchi]*rhoc_.value();
}
virtual tmp<scalarField> rho(const label patchi) const;
//- Return the mixture viscosity
virtual tmp<volScalarField> nu() const
{
return mu_/rho();
}
virtual tmp<volScalarField> nu() const;
//- Return the mixture viscosity for patch
virtual tmp<scalarField> nu(const label patchi) const
{
return mu_.boundaryField()[patchi]/rho(patchi);
}
virtual tmp<scalarField> nu(const label patchi) const;
//- Return the diffusion velocity of the dispersed phase
const volVectorField& Udm() const;
//- Return the div stress tensor due to the phase transport
tmp<volVectorField> divTauDm() const;
//- Correct the laminar viscosity
virtual void correct()
{
mu_ = muModel_->mu(rhoc_*nucModel_->nu(), U_);
}
virtual void correct();
//- Read base phaseProperties dictionary
virtual bool read();

View File

@ -61,6 +61,12 @@ Foam::mixtureViscosityModels::Quemada::Quemada
optionalSubDict(typeName + "Coeffs").lookup("alphaMax")
),
q_(optionalSubDict(typeName + "Coeffs").lookupOrDefault("q", scalar(2))),
muMax_
(
"muMax",
dimDynamicViscosity,
optionalSubDict(typeName + "Coeffs").lookup("muMax")
),
alpha_
(
mesh.lookupObject<volScalarField>
@ -84,7 +90,7 @@ Foam::mixtureViscosityModels::Quemada::mu
const volVectorField& U
) const
{
return muc*pow(1.0 - alpha_/alphaMax_, -q_);
return min(muc*pow(1.0 - alpha_/alphaMax_, -q_), muMax_);
}

View File

@ -38,12 +38,12 @@ Description
Usage
Example usage:
\verbatim
viscosityModel Quemada;
viscosityModel Quemada;
alphaMax 0.6; // Maximum dispersed phase-fraction (packing fraction)
q 2; // Exponent, defaults to 2
alphaMax 0.6; // Maximum dispersed phase-fraction (packing fraction)
q 2; // Exponent, defaults to 2
rho 1996;
rho 1996;
\endverbatim
SourceFiles
@ -81,6 +81,9 @@ class Quemada
//- Exponent (defaults to 2)
scalar q_;
//- Maximum viscosity
dimensionedScalar muMax_;
//- Dispersed phase fraction
const volScalarField& alpha_;

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2014-2021 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -57,7 +57,7 @@ Foam::mixtureViscosityModels::plastic::plastic
plasticViscosityCoeff_
(
"coeff",
dimensionSet(1, -1, -1, 0, 0),
dimDynamicViscosity,
plasticCoeffs_.lookup("coeff")
),
plasticViscosityExponent_
@ -66,12 +66,7 @@ Foam::mixtureViscosityModels::plastic::plastic
dimless,
plasticCoeffs_.lookup("exponent")
),
muMax_
(
"muMax",
dimensionSet(1, -1, -1, 0, 0),
plasticCoeffs_.lookup("muMax")
),
muMax_("muMax", dimDynamicViscosity, plasticCoeffs_.lookup("muMax")),
alpha_
(
mesh.lookupObject<volScalarField>

View File

@ -6,9 +6,9 @@
(
"phiHbyA",
fvc::flux(HbyA)
+ MRF.zeroFilter(fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi))
+ mixture.MRF().zeroFilter(fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi))
);
MRF.makeRelative(phiHbyA);
mixture.MRF().makeRelative(phiHbyA);
adjustPhi(phiHbyA, U, p_rgh);
surfaceScalarField phig
@ -21,7 +21,7 @@
phiHbyA += phig;
// Update the pressure BCs to ensure flux consistency
constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF);
constrainPressure(p_rgh, U, phiHbyA, rAUf, mixture.MRF());
while (pimple.correctNonOrthogonal())
{

View File

@ -44,11 +44,10 @@ Foam::relativeVelocityModels::general::general
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
)
:
relativeVelocityModel(dict, mixture, g, MRF),
relativeVelocityModel(dict, mixture, g),
a_("a", dimless, dict),
a1_("a1", dimless, dict),
Vc_("Vc", dimTime, dict),
@ -67,9 +66,7 @@ Foam::relativeVelocityModels::general::~general()
void Foam::relativeVelocityModels::general::correct()
{
Udm_ =
(rhoc_/rho())
*Vc_
*(g_ + MRF_.centrifugalAcceleration())
(rhoc_/rho())*Vc_*acceleration()
*(
exp(-a_*max(alphad_ - residualAlpha_, scalar(0)))
- exp(-a1_*max(alphad_ - residualAlpha_, scalar(0)))

View File

@ -80,8 +80,7 @@ public:
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
);

View File

@ -27,6 +27,7 @@ License
#include "fixedValueFvPatchFields.H"
#include "slipFvPatchFields.H"
#include "partialSlipFvPatchFields.H"
#include "fvcGrad.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -71,8 +72,7 @@ Foam::relativeVelocityModel::relativeVelocityModel
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
)
:
mixture_(mixture),
@ -81,8 +81,6 @@ Foam::relativeVelocityModel::relativeVelocityModel
rhoc_(mixture.rhoc()),
rhod_(mixture.rhod()),
g_(g),
MRF_(MRF),
Udm_
(
IOobject
@ -106,8 +104,7 @@ Foam::autoPtr<Foam::relativeVelocityModel> Foam::relativeVelocityModel::New
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
)
{
word modelType(dict.lookup(typeName));
@ -134,8 +131,7 @@ Foam::autoPtr<Foam::relativeVelocityModel> Foam::relativeVelocityModel::New
(
dict.optionalSubDict(modelType + "Coeffs"),
mixture,
g,
MRF
g
)
);
}
@ -155,6 +151,15 @@ Foam::tmp<Foam::volScalarField> Foam::relativeVelocityModel::rho() const
}
Foam::tmp<Foam::volVectorField>
Foam::relativeVelocityModel::acceleration() const
{
const volVectorField Ud(mixture_.U() + Udm_);
return g_ - (Ud & fvc::grad(Ud));
}
Foam::tmp<Foam::volSymmTensorField> Foam::relativeVelocityModel::tauDm() const
{
const volScalarField betac(alphac_*rhoc_);

View File

@ -36,7 +36,6 @@ SourceFiles
#include "incompressibleTwoPhaseInteractingMixture.H"
#include "uniformDimensionedFields.H"
#include "MRFZoneList.H"
#include "runTimeSelectionTables.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -81,9 +80,6 @@ protected:
//- Acceleration due to gravity
const uniformDimensionedVectorField& g_;
//- MRF zones
const MRFZoneList& MRF_;
//- Dispersed diffusion velocity
mutable volVectorField Udm_;
@ -101,10 +97,9 @@ public:
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
),
(dict, mixture, g, MRF)
(dict, mixture, g)
);
@ -115,8 +110,7 @@ public:
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
);
//- Disallow default bitwise copy construction
@ -128,8 +122,7 @@ public:
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
);
@ -154,6 +147,10 @@ public:
return Udm_;
}
//- Return the dispersed phase acceleration
// Including buoyancy and flow curvature
tmp<volVectorField> acceleration() const;
//- Return the stress tensor due to the phase transport
tmp<volSymmTensorField> tauDm() const;

View File

@ -44,11 +44,10 @@ Foam::relativeVelocityModels::simple::simple
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
)
:
relativeVelocityModel(dict, mixture, g, MRF),
relativeVelocityModel(dict, mixture, g),
a_("a", dimless, dict),
Vc_("Vc", dimTime, dict),
residualAlpha_("residualAlpha", dimless, dict)
@ -66,8 +65,7 @@ Foam::relativeVelocityModels::simple::~simple()
void Foam::relativeVelocityModels::simple::correct()
{
Udm_ =
(rhoc_/rho())
*Vc_*(g_ + MRF_.centrifugalAcceleration())
(rhoc_/rho())*Vc_*acceleration()
*pow(scalar(10), -a_*max(alphad_, scalar(0)));
}

View File

@ -77,8 +77,7 @@ public:
(
const dictionary& dict,
const incompressibleTwoPhaseInteractingMixture& mixture,
const uniformDimensionedVectorField& g,
const MRFZoneList& MRF
const uniformDimensionedVectorField& g
);