dragModels: Added AttouFerschneider model for trickle beds
Also added tutorial case demonstrating usage. Note that the new drag models are symmetric and should be used without any blending. This work was supported by Georg Skillas and Zhen Li, at Evonik
This commit is contained in:
@ -15,6 +15,7 @@ dragModels/Tenneti/Tenneti.C
|
||||
dragModels/TomiyamaKataokaZunSakaguchi/TomiyamaKataokaZunSakaguchi.C
|
||||
dragModels/WenYu/WenYu.C
|
||||
dragModels/IshiiZuber/IshiiZuber.C
|
||||
dragModels/AttouFerschneider/AttouFerschneider.C
|
||||
|
||||
swarmCorrections/swarmCorrection/swarmCorrection.C
|
||||
swarmCorrections/swarmCorrection/newSwarmCorrection.C
|
||||
|
||||
@ -0,0 +1,179 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2018 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "AttouFerschneider.H"
|
||||
#include "phasePair.H"
|
||||
#include "phaseSystem.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace dragModels
|
||||
{
|
||||
defineTypeNameAndDebug(AttouFerschneider, 0);
|
||||
addToRunTimeSelectionTable(dragModel, AttouFerschneider, dictionary);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::dragModels::AttouFerschneider::KGasLiquid
|
||||
(
|
||||
const phaseModel& gas,
|
||||
const phaseModel& liquid
|
||||
) const
|
||||
{
|
||||
const phaseModel& solid = gas.fluid().phases()[solidName_];
|
||||
|
||||
const volScalarField oneMinusGas(max(1 - gas, liquid.residualAlpha()));
|
||||
const volScalarField cbrtR(solid/oneMinusGas);
|
||||
const volScalarField magURel(mag(gas.U() - liquid.U()));
|
||||
|
||||
return
|
||||
E2_*gas.mu()*sqr(oneMinusGas/solid.d())*sqr(cbrtR)
|
||||
/max(gas, gas.residualAlpha())
|
||||
+ E2_*gas.rho()*magURel*(1 - gas)/solid.d()*cbrtR;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::dragModels::AttouFerschneider::KGasSolid
|
||||
(
|
||||
const phaseModel& gas,
|
||||
const phaseModel& solid
|
||||
) const
|
||||
{
|
||||
const volScalarField oneMinusGas(max(1 - gas, solid.residualAlpha()));
|
||||
const volScalarField cbrtR(solid/oneMinusGas);
|
||||
|
||||
return
|
||||
E1_*gas.mu()*sqr(oneMinusGas/solid.d())*sqr(cbrtR)
|
||||
/max(gas, gas.residualAlpha())
|
||||
+ E2_*gas.rho()*mag(gas.U())*(1 - gas)/solid.d()*cbrtR;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::dragModels::AttouFerschneider::KLiquidSolid
|
||||
(
|
||||
const phaseModel& liquid,
|
||||
const phaseModel& solid
|
||||
) const
|
||||
{
|
||||
const phaseModel& gas = liquid.fluid().phases()[gasName_];
|
||||
|
||||
return
|
||||
E1_*liquid.mu()*sqr(max(solid, solid.residualAlpha())/solid.d())
|
||||
/max(liquid, liquid.residualAlpha())
|
||||
+ E2_*liquid.rho()*mag(gas.U())*solid/solid.d();
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::dragModels::AttouFerschneider::AttouFerschneider
|
||||
(
|
||||
const dictionary& dict,
|
||||
const phasePair& pair,
|
||||
const bool registerObject
|
||||
)
|
||||
:
|
||||
dragModel(dict, pair, registerObject),
|
||||
gasName_(dict.lookup("gas")),
|
||||
liquidName_(dict.lookup("liquid")),
|
||||
solidName_(dict.lookup("solid")),
|
||||
E1_("E1", dimless, dict),
|
||||
E2_("E1", dimless, dict)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::dragModels::AttouFerschneider::~AttouFerschneider()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::dragModels::AttouFerschneider::CdRe() const
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Not implemented."
|
||||
<< "Drag coefficient is not defined for the AttouFerschneider model."
|
||||
<< exit(FatalError);
|
||||
|
||||
return tmp<volScalarField>(nullptr);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::dragModels::AttouFerschneider::K() const
|
||||
{
|
||||
switch (Pair<word>::compare(pair_, phasePairKey(gasName_, liquidName_)))
|
||||
{
|
||||
case 1:
|
||||
return KGasLiquid(pair_.phase1(), pair_.phase2());
|
||||
case -1:
|
||||
return KGasLiquid(pair_.phase2(), pair_.phase1());
|
||||
}
|
||||
|
||||
switch (Pair<word>::compare(pair_, phasePairKey(gasName_, solidName_)))
|
||||
{
|
||||
case 1:
|
||||
return KGasSolid(pair_.phase1(), pair_.phase2());
|
||||
case -1:
|
||||
return KGasSolid(pair_.phase2(), pair_.phase1());
|
||||
}
|
||||
|
||||
switch (Pair<word>::compare(pair_, phasePairKey(liquidName_, solidName_)))
|
||||
{
|
||||
case 1:
|
||||
return KLiquidSolid(pair_.phase1(), pair_.phase2());
|
||||
case -1:
|
||||
return KLiquidSolid(pair_.phase2(), pair_.phase1());
|
||||
}
|
||||
|
||||
FatalErrorInFunction
|
||||
<< "The pair does not contain two of out of the gas, liquid and solid "
|
||||
<< "phase models."
|
||||
<< exit(FatalError);
|
||||
|
||||
return tmp<volScalarField>(nullptr);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::surfaceScalarField>
|
||||
Foam::dragModels::AttouFerschneider::Kf() const
|
||||
{
|
||||
return fvc::interpolate(K());
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,155 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2018 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::dragModels::AttouFerschneider
|
||||
|
||||
Description
|
||||
Attou and Ferschneider's Drag model for film flow through packed beds. The
|
||||
implementation follows the desciption of Gunjal and Ranade, who, in the
|
||||
reference below, formulate the model in more convenient terms.
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
"Modeling of laboratory and commercial scale hydro-processing reactors
|
||||
using CFD"
|
||||
Gunjal, P.R., Ranade, V.V.,
|
||||
Chemical Engineering Science
|
||||
Volume 62, Issues 18-20, September-October 2007, pp. 5512 - 5526
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
AttouFerschneider.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef AttouFerschneider_H
|
||||
#define AttouFerschneider_H
|
||||
|
||||
#include "dragModel.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
class phasePair;
|
||||
class phaseModel;
|
||||
|
||||
namespace dragModels
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class AttouFerschneider Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class AttouFerschneider
|
||||
:
|
||||
public dragModel
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Name of the gaseous phase
|
||||
const word gasName_;
|
||||
|
||||
//- Name of the liquidphase
|
||||
const word liquidName_;
|
||||
|
||||
//- Name of the solid phase
|
||||
const word solidName_;
|
||||
|
||||
//- Ergun constant 1
|
||||
const dimensionedScalar E1_;
|
||||
|
||||
//- Ergun constant 2
|
||||
const dimensionedScalar E2_;
|
||||
|
||||
|
||||
// Private member functions
|
||||
|
||||
//- Return the momentum transfer coefficient between gas and liquid
|
||||
virtual tmp<volScalarField> KGasLiquid
|
||||
(
|
||||
const phaseModel& gas,
|
||||
const phaseModel& liquid
|
||||
) const;
|
||||
|
||||
//- Return the momentum transfer coefficient between gas and solid
|
||||
virtual tmp<volScalarField> KGasSolid
|
||||
(
|
||||
const phaseModel& gas,
|
||||
const phaseModel& solid
|
||||
) const;
|
||||
|
||||
//- Return the momentum transfer coefficient between liquid and solid
|
||||
virtual tmp<volScalarField> KLiquidSolid
|
||||
(
|
||||
const phaseModel& liquid,
|
||||
const phaseModel& solid
|
||||
) const;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("AttouFerschneider");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from a dictionary and a phase pair
|
||||
AttouFerschneider
|
||||
(
|
||||
const dictionary& dict,
|
||||
const phasePair& pair,
|
||||
const bool registerObject
|
||||
);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~AttouFerschneider();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Drag coefficient
|
||||
virtual tmp<volScalarField> CdRe() const;
|
||||
|
||||
//- The drag coefficient used in the momentum equation
|
||||
virtual tmp<volScalarField> K() const;
|
||||
|
||||
//- The drag coefficient used in the face-momentum equations
|
||||
virtual tmp<surfaceScalarField> Kf() const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace dragModels
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user