mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: surfaceFilmModels::waxSolventEvaporation, waxSolventViscosity: new wax/solvent film models
to support the evaporation of the solvent from the wax film and the changes in viscosity caused by the reduction in solvent content. BUG: filmViscosityModel::thixotropicViscosity: Corrected sign of impingement rate to compensate for rhoSp having the wrong sign BUG: surfaceFilmModels::waxSolventEvaporation: Corrected handling of impingement ENH: surfaceFilmModels::waxSolventViscosity: Changed mixing to mole-fraction based ENH: surfaceFilmModels::thermoSingleLayer: Added call to solveContinuity before updateSubmodels to allow sub-models to solve transport equations for conserved properties
This commit is contained in:
committed by
Andrew Heather
parent
964c7d223c
commit
512252a67e
@ -47,6 +47,7 @@ $(THERMOMODELS)/phaseChangeModel/phaseChangeModel/phaseChangeModelNew.C
|
|||||||
$(THERMOMODELS)/phaseChangeModel/noPhaseChange/noPhaseChange.C
|
$(THERMOMODELS)/phaseChangeModel/noPhaseChange/noPhaseChange.C
|
||||||
$(THERMOMODELS)/phaseChangeModel/standardPhaseChange/standardPhaseChange.C
|
$(THERMOMODELS)/phaseChangeModel/standardPhaseChange/standardPhaseChange.C
|
||||||
$(THERMOMODELS)/phaseChangeModel/solidification/solidification.C
|
$(THERMOMODELS)/phaseChangeModel/solidification/solidification.C
|
||||||
|
$(THERMOMODELS)/phaseChangeModel/waxSolventEvaporation/waxSolventEvaporation.C
|
||||||
|
|
||||||
$(THERMOMODELS)/heatTransferModel/heatTransferModel/heatTransferModel.C
|
$(THERMOMODELS)/heatTransferModel/heatTransferModel/heatTransferModel.C
|
||||||
$(THERMOMODELS)/heatTransferModel/heatTransferModel/heatTransferModelNew.C
|
$(THERMOMODELS)/heatTransferModel/heatTransferModel/heatTransferModelNew.C
|
||||||
@ -67,6 +68,7 @@ $(THERMOMODELS)/filmViscosityModel/liquidViscosity/liquidViscosity.C
|
|||||||
$(THERMOMODELS)/filmViscosityModel/thixotropicViscosity/thixotropicViscosity.C
|
$(THERMOMODELS)/filmViscosityModel/thixotropicViscosity/thixotropicViscosity.C
|
||||||
$(THERMOMODELS)/filmViscosityModel/ArrheniusViscosity/ArrheniusViscosity.C
|
$(THERMOMODELS)/filmViscosityModel/ArrheniusViscosity/ArrheniusViscosity.C
|
||||||
$(THERMOMODELS)/filmViscosityModel/function1Viscosity/function1Viscosity.C
|
$(THERMOMODELS)/filmViscosityModel/function1Viscosity/function1Viscosity.C
|
||||||
|
$(THERMOMODELS)/filmViscosityModel/waxSolventViscosity/waxSolventViscosity.C
|
||||||
|
|
||||||
|
|
||||||
/* Boundary conditions */
|
/* Boundary conditions */
|
||||||
|
|||||||
@ -154,7 +154,7 @@ void thixotropicViscosity::correct
|
|||||||
(
|
(
|
||||||
max
|
max
|
||||||
(
|
(
|
||||||
film.rhoSp(),
|
-film.rhoSp(),
|
||||||
dimensionedScalar("zero", film.rhoSp().dimensions(), 0)
|
dimensionedScalar("zero", film.rhoSp().dimensions(), 0)
|
||||||
)/(deltaRho + deltaRho0),
|
)/(deltaRho + deltaRho0),
|
||||||
lambda_
|
lambda_
|
||||||
|
|||||||
@ -0,0 +1,191 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2017 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 "waxSolventViscosity.H"
|
||||||
|
#include "kinematicSingleLayer.H"
|
||||||
|
#include "waxSolventEvaporation.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace regionModels
|
||||||
|
{
|
||||||
|
namespace surfaceFilmModels
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
defineTypeNameAndDebug(waxSolventViscosity, 0);
|
||||||
|
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
filmViscosityModel,
|
||||||
|
waxSolventViscosity,
|
||||||
|
dictionary
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void waxSolventViscosity::correctMu()
|
||||||
|
{
|
||||||
|
const kinematicSingleLayer& film = filmType<kinematicSingleLayer>();
|
||||||
|
|
||||||
|
const uniformDimensionedScalarField Wwax
|
||||||
|
(
|
||||||
|
film.regionMesh().lookupObject<uniformDimensionedScalarField>
|
||||||
|
(
|
||||||
|
waxSolventEvaporation::typeName + ":Wwax"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const uniformDimensionedScalarField Wsolvent
|
||||||
|
(
|
||||||
|
film.regionMesh().lookupObject<uniformDimensionedScalarField>
|
||||||
|
(
|
||||||
|
waxSolventEvaporation::typeName + ":Wsolvent"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const uniformDimensionedScalarField Ysolvent0
|
||||||
|
(
|
||||||
|
film.regionMesh().lookupObject<uniformDimensionedScalarField>
|
||||||
|
(
|
||||||
|
waxSolventEvaporation::typeName + ":Ysolvent0"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField& Ysolvent
|
||||||
|
(
|
||||||
|
film.regionMesh().lookupObject<volScalarField>
|
||||||
|
(
|
||||||
|
waxSolventEvaporation::typeName + ":Ysolvent"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const volScalarField Xsolvent
|
||||||
|
(
|
||||||
|
Ysolvent*Wsolvent/((1 - Ysolvent)*Wwax + Ysolvent*Wsolvent)
|
||||||
|
);
|
||||||
|
|
||||||
|
const dimensionedScalar Xsolvent0
|
||||||
|
(
|
||||||
|
Ysolvent0*Wsolvent/((1 - Ysolvent0)*Wwax + Ysolvent0*Wsolvent)
|
||||||
|
);
|
||||||
|
|
||||||
|
mu_ = pow(muWax_/muSolvent_, (1 - Xsolvent)/(1 - Xsolvent0))*muSolvent_;
|
||||||
|
mu_.correctBoundaryConditions();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
waxSolventViscosity::waxSolventViscosity
|
||||||
|
(
|
||||||
|
surfaceFilmRegionModel& film,
|
||||||
|
const dictionary& dict,
|
||||||
|
volScalarField& mu
|
||||||
|
)
|
||||||
|
:
|
||||||
|
filmViscosityModel(typeName, film, dict, mu),
|
||||||
|
muWax_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":muWax",
|
||||||
|
film.regionMesh().time().timeName(),
|
||||||
|
film.regionMesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
film.regionMesh(),
|
||||||
|
dimensionedScalar("zero", dimDynamicViscosity, 0),
|
||||||
|
zeroGradientFvPatchScalarField::typeName
|
||||||
|
),
|
||||||
|
muWaxModel_
|
||||||
|
(
|
||||||
|
filmViscosityModel::New
|
||||||
|
(
|
||||||
|
film,
|
||||||
|
coeffDict_.subDict("muWax"),
|
||||||
|
muWax_
|
||||||
|
)
|
||||||
|
),
|
||||||
|
muSolvent_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":muSolvent",
|
||||||
|
film.regionMesh().time().timeName(),
|
||||||
|
film.regionMesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
film.regionMesh(),
|
||||||
|
dimensionedScalar("zero", dimDynamicViscosity, 0),
|
||||||
|
zeroGradientFvPatchScalarField::typeName
|
||||||
|
),
|
||||||
|
muSolventModel_
|
||||||
|
(
|
||||||
|
filmViscosityModel::New
|
||||||
|
(
|
||||||
|
film,
|
||||||
|
coeffDict_.subDict("muSolvent"),
|
||||||
|
muSolvent_
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
waxSolventViscosity::~waxSolventViscosity()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void waxSolventViscosity::correct
|
||||||
|
(
|
||||||
|
const volScalarField& p,
|
||||||
|
const volScalarField& T
|
||||||
|
)
|
||||||
|
{
|
||||||
|
muWaxModel_->correct(p, T);
|
||||||
|
muSolventModel_->correct(p, T);
|
||||||
|
|
||||||
|
correctMu();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceFilmModels
|
||||||
|
} // End namespace regionModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,128 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2017 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::regionModels::surfaceFilmModels::waxSolventViscosity
|
||||||
|
|
||||||
|
Description
|
||||||
|
Wax solvent mixture viscosity model.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
waxSolventViscosity.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef waxSolventViscosity_H
|
||||||
|
#define waxSolventViscosity_H
|
||||||
|
|
||||||
|
#include "filmViscosityModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace regionModels
|
||||||
|
{
|
||||||
|
namespace surfaceFilmModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class waxSolventViscosity Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class waxSolventViscosity
|
||||||
|
:
|
||||||
|
public filmViscosityModel
|
||||||
|
{
|
||||||
|
// Private member functions
|
||||||
|
|
||||||
|
//- Correct the mixture viscosity
|
||||||
|
void correctMu();
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
waxSolventViscosity(const waxSolventViscosity&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const waxSolventViscosity&);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected data
|
||||||
|
|
||||||
|
//- Wax viscosity
|
||||||
|
volScalarField muWax_;
|
||||||
|
|
||||||
|
//- Wax viscosity model
|
||||||
|
autoPtr<filmViscosityModel> muWaxModel_;
|
||||||
|
|
||||||
|
//- Solvent viscosity
|
||||||
|
volScalarField muSolvent_;
|
||||||
|
|
||||||
|
//- Solvent viscosity model
|
||||||
|
autoPtr<filmViscosityModel> muSolventModel_;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("waxSolvent");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from surface film model
|
||||||
|
waxSolventViscosity
|
||||||
|
(
|
||||||
|
surfaceFilmRegionModel& film,
|
||||||
|
const dictionary& dict,
|
||||||
|
volScalarField& mu
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~waxSolventViscosity();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Correct
|
||||||
|
virtual void correct
|
||||||
|
(
|
||||||
|
const volScalarField& p,
|
||||||
|
const volScalarField& T
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceFilmModels
|
||||||
|
} // End namespace regionModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,406 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2017 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 "waxSolventEvaporation.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "thermoSingleLayer.H"
|
||||||
|
#include "zeroField.H"
|
||||||
|
|
||||||
|
#include "fvmDdt.H"
|
||||||
|
#include "fvmDiv.H"
|
||||||
|
#include "fvcDiv.H"
|
||||||
|
#include "fvmSup.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace regionModels
|
||||||
|
{
|
||||||
|
namespace surfaceFilmModels
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
defineTypeNameAndDebug(waxSolventEvaporation, 0);
|
||||||
|
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
phaseChangeModel,
|
||||||
|
waxSolventEvaporation,
|
||||||
|
dictionary
|
||||||
|
);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
scalar waxSolventEvaporation::Sh
|
||||||
|
(
|
||||||
|
const scalar Re,
|
||||||
|
const scalar Sc
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (Re < 5.0E+05)
|
||||||
|
{
|
||||||
|
return 0.664*sqrt(Re)*cbrt(Sc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0.037*pow(Re, 0.8)*cbrt(Sc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
waxSolventEvaporation::waxSolventEvaporation
|
||||||
|
(
|
||||||
|
surfaceFilmRegionModel& film,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
:
|
||||||
|
phaseChangeModel(typeName, film, dict),
|
||||||
|
Wwax_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":Wwax",
|
||||||
|
film.regionMesh().time().constant(),
|
||||||
|
film.regionMesh()
|
||||||
|
),
|
||||||
|
readScalar(coeffDict_.lookup("Wwax"))
|
||||||
|
),
|
||||||
|
Wsolvent_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":Wsolvent",
|
||||||
|
film.regionMesh().time().constant(),
|
||||||
|
film.regionMesh()
|
||||||
|
),
|
||||||
|
readScalar(coeffDict_.lookup("Wsolvent"))
|
||||||
|
),
|
||||||
|
Ysolvent0_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":Ysolvent0",
|
||||||
|
film.regionMesh().time().constant(),
|
||||||
|
film.regionMesh(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
),
|
||||||
|
Ysolvent_
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":Ysolvent",
|
||||||
|
film.regionMesh().time().timeName(),
|
||||||
|
film.regionMesh(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::AUTO_WRITE
|
||||||
|
),
|
||||||
|
film.regionMesh()
|
||||||
|
),
|
||||||
|
deltaMin_(readScalar(coeffDict_.lookup("deltaMin"))),
|
||||||
|
L_(readScalar(coeffDict_.lookup("L"))),
|
||||||
|
TbFactor_(coeffDict_.lookupOrDefault<scalar>("TbFactor", 1.1)),
|
||||||
|
YInfZero_(coeffDict_.lookupOrDefault<Switch>("YInfZero", false)),
|
||||||
|
activityCoeff_
|
||||||
|
(
|
||||||
|
Function1<scalar>::New("activityCoeff", coeffDict_)
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
waxSolventEvaporation::~waxSolventEvaporation()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class YInfType>
|
||||||
|
void waxSolventEvaporation::correctModel
|
||||||
|
(
|
||||||
|
const scalar dt,
|
||||||
|
scalarField& availableMass,
|
||||||
|
scalarField& dMass,
|
||||||
|
scalarField& dEnergy,
|
||||||
|
YInfType YInf
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const thermoSingleLayer& film = filmType<thermoSingleLayer>();
|
||||||
|
|
||||||
|
const volScalarField& delta = film.delta();
|
||||||
|
const volScalarField& deltaRho = film.deltaRho();
|
||||||
|
const surfaceScalarField& phi = film.phi();
|
||||||
|
|
||||||
|
// Set local thermo properties
|
||||||
|
const SLGThermo& thermo = film.thermo();
|
||||||
|
const filmThermoModel& filmThermo = film.filmThermo();
|
||||||
|
const label vapId = thermo.carrierId(filmThermo.name());
|
||||||
|
|
||||||
|
// Retrieve fields from film model
|
||||||
|
const scalarField& pInf = film.pPrimary();
|
||||||
|
const scalarField& T = film.T();
|
||||||
|
const scalarField& hs = film.hs();
|
||||||
|
const scalarField& rho = film.rho();
|
||||||
|
const scalarField& rhoInf = film.rhoPrimary();
|
||||||
|
const scalarField& muInf = film.muPrimary();
|
||||||
|
const scalarField& magSf = film.magSf();
|
||||||
|
const vectorField dU(film.UPrimary() - film.Us());
|
||||||
|
const scalarField limMass
|
||||||
|
(
|
||||||
|
max(scalar(0), availableMass - deltaMin_*rho*magSf)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Molecular weight of vapour [kg/kmol]
|
||||||
|
const scalar Wvap = thermo.carrier().W(vapId);
|
||||||
|
|
||||||
|
const scalar Wwax = Wwax_.value();
|
||||||
|
const scalar Wsolvent = Wsolvent_.value();
|
||||||
|
|
||||||
|
volScalarField::Internal evapRateCoeff
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":evapRateCoeff",
|
||||||
|
film.regionMesh().time().timeName(),
|
||||||
|
film.regionMesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
film.regionMesh(),
|
||||||
|
dimensionedScalar("zero", dimDensity*dimVelocity, 0)
|
||||||
|
);
|
||||||
|
|
||||||
|
volScalarField::Internal evapRateInf
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
typeName + ":evapRateInf",
|
||||||
|
film.regionMesh().time().timeName(),
|
||||||
|
film.regionMesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
film.regionMesh(),
|
||||||
|
dimensionedScalar("zero", dimDensity*dimVelocity, 0)
|
||||||
|
);
|
||||||
|
|
||||||
|
bool filmPresent = false;
|
||||||
|
|
||||||
|
forAll(dMass, celli)
|
||||||
|
{
|
||||||
|
if (delta[celli] > deltaMin_)
|
||||||
|
{
|
||||||
|
filmPresent = true;
|
||||||
|
|
||||||
|
const scalar Ysolvent = Ysolvent_[celli];
|
||||||
|
|
||||||
|
// Molefraction of solvent in liquid film
|
||||||
|
const scalar Xsolvent
|
||||||
|
(
|
||||||
|
Ysolvent*Wsolvent/((1 - Ysolvent)*Wwax + Ysolvent*Wsolvent)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Primary region density [kg/m3]
|
||||||
|
const scalar rhoInfc = rhoInf[celli];
|
||||||
|
|
||||||
|
// Cell pressure [Pa]
|
||||||
|
const scalar pc = pInf[celli];
|
||||||
|
|
||||||
|
// Calculate the boiling temperature
|
||||||
|
const scalar Tb = filmThermo.Tb(pc);
|
||||||
|
|
||||||
|
// Local temperature - impose lower limit of 200 K for stability
|
||||||
|
const scalar Tloc = min(TbFactor_*Tb, max(200.0, T[celli]));
|
||||||
|
|
||||||
|
const scalar pPartialCoeff
|
||||||
|
(
|
||||||
|
filmThermo.pv(pc, Tloc)*activityCoeff_->value(Xsolvent)
|
||||||
|
);
|
||||||
|
|
||||||
|
scalar XsCoeff = pPartialCoeff/pc;
|
||||||
|
|
||||||
|
// Vapour phase mole fraction of solvent at interface
|
||||||
|
scalar Xs = XsCoeff*Xsolvent;
|
||||||
|
|
||||||
|
if (Xs > 1)
|
||||||
|
{
|
||||||
|
WarningInFunction
|
||||||
|
<< "Solvent vapour pressure > ambient pressure"
|
||||||
|
<< endl;
|
||||||
|
|
||||||
|
XsCoeff /= Xs;
|
||||||
|
Xs = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vapour phase mass fraction of solvent at the interface
|
||||||
|
const scalar YsCoeff
|
||||||
|
(
|
||||||
|
XsCoeff/(XsCoeff*Xsolvent*Wsolvent + (1 - Xs)*Wvap)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Primary region viscosity [Pa.s]
|
||||||
|
const scalar muInfc = muInf[celli];
|
||||||
|
|
||||||
|
// Reynolds number
|
||||||
|
const scalar Re = rhoInfc*mag(dU[celli])*L_/muInfc;
|
||||||
|
|
||||||
|
// Vapour diffusivity [m2/s]
|
||||||
|
const scalar Dab = filmThermo.D(pc, Tloc);
|
||||||
|
|
||||||
|
// Schmidt number
|
||||||
|
const scalar Sc = muInfc/(rhoInfc*(Dab + ROOTVSMALL));
|
||||||
|
|
||||||
|
// Sherwood number
|
||||||
|
const scalar Sh = this->Sh(Re, Sc);
|
||||||
|
|
||||||
|
// Mass transfer coefficient [m/s]
|
||||||
|
evapRateCoeff[celli] = rhoInfc*Sh*Dab/(L_ + ROOTVSMALL);
|
||||||
|
|
||||||
|
// Solvent mass transfer
|
||||||
|
const scalar dm
|
||||||
|
(
|
||||||
|
max
|
||||||
|
(
|
||||||
|
dt*magSf[celli]
|
||||||
|
*evapRateCoeff[celli]*(YsCoeff*Ysolvent - YInf[celli]),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (dm > limMass[celli])
|
||||||
|
{
|
||||||
|
evapRateCoeff[celli] *= limMass[celli]/dm;
|
||||||
|
}
|
||||||
|
|
||||||
|
evapRateInf[celli] = evapRateCoeff[celli]*YInf[celli];
|
||||||
|
evapRateCoeff[celli] *= YsCoeff;
|
||||||
|
|
||||||
|
// hVap[celli] = filmThermo.hl(pc, Tloc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const dimensionedScalar deltaRho0Bydt
|
||||||
|
(
|
||||||
|
"deltaRho0",
|
||||||
|
deltaRho.dimensions()/dimTime,
|
||||||
|
ROOTVSMALL/dt
|
||||||
|
);
|
||||||
|
|
||||||
|
volScalarField::Internal impingementRate
|
||||||
|
(
|
||||||
|
max
|
||||||
|
(
|
||||||
|
-film.rhoSp()(),
|
||||||
|
dimensionedScalar("zero", film.rhoSp().dimensions(), 0)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (filmPresent)
|
||||||
|
{
|
||||||
|
// Solve for the solvent mass fraction
|
||||||
|
fvScalarMatrix YsolventEqn
|
||||||
|
(
|
||||||
|
fvm::ddt(deltaRho, Ysolvent_)
|
||||||
|
+ fvm::div(phi, Ysolvent_)
|
||||||
|
==
|
||||||
|
deltaRho0Bydt*Ysolvent_()
|
||||||
|
|
||||||
|
+ evapRateInf
|
||||||
|
|
||||||
|
// Include the effect of the impinging droplets
|
||||||
|
// added with Ysolvent = Ysolvent0
|
||||||
|
+ impingementRate*Ysolvent0_
|
||||||
|
|
||||||
|
- fvm::Sp
|
||||||
|
(
|
||||||
|
deltaRho0Bydt
|
||||||
|
+ evapRateCoeff
|
||||||
|
+ film.rhoSp()()
|
||||||
|
+ impingementRate,
|
||||||
|
Ysolvent_
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
YsolventEqn.relax();
|
||||||
|
YsolventEqn.solve();
|
||||||
|
|
||||||
|
Ysolvent_.min(1);
|
||||||
|
Ysolvent_.max(0);
|
||||||
|
|
||||||
|
scalarField dm
|
||||||
|
(
|
||||||
|
dt*magSf*rhoInf*(evapRateCoeff*Ysolvent_ + evapRateInf)
|
||||||
|
);
|
||||||
|
|
||||||
|
dMass += dm;
|
||||||
|
|
||||||
|
// Heat is assumed to be removed by heat-transfer to the wall
|
||||||
|
// so the energy remains unchanged by the phase-change.
|
||||||
|
dEnergy += dm*hs;
|
||||||
|
|
||||||
|
// Latent heat [J/kg]
|
||||||
|
// dEnergy += dm*(hs[celli] + hVap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void waxSolventEvaporation::correctModel
|
||||||
|
(
|
||||||
|
const scalar dt,
|
||||||
|
scalarField& availableMass,
|
||||||
|
scalarField& dMass,
|
||||||
|
scalarField& dEnergy
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (YInfZero_)
|
||||||
|
{
|
||||||
|
correctModel(dt, availableMass, dMass, dEnergy, zeroField());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const thermoSingleLayer& film = filmType<thermoSingleLayer>();
|
||||||
|
const label vapId = film.thermo().carrierId(film.filmThermo().name());
|
||||||
|
const scalarField& YInf = film.YPrimary()[vapId];
|
||||||
|
|
||||||
|
correctModel(dt, availableMass, dMass, dEnergy, YInf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceFilmModels
|
||||||
|
} // End namespace regionModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,160 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2017 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::waxSolventEvaporation
|
||||||
|
|
||||||
|
Description
|
||||||
|
Wax solvent mixture evaporation model.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
waxSolventEvaporation.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef waxSolventEvaporation_H
|
||||||
|
#define waxSolventEvaporation_H
|
||||||
|
|
||||||
|
#include "phaseChangeModel.H"
|
||||||
|
#include "uniformDimensionedFields.H"
|
||||||
|
#include "Function1.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace regionModels
|
||||||
|
{
|
||||||
|
namespace surfaceFilmModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class waxSolventEvaporation Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class waxSolventEvaporation
|
||||||
|
:
|
||||||
|
public phaseChangeModel
|
||||||
|
{
|
||||||
|
// Private member functions
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
waxSolventEvaporation(const waxSolventEvaporation&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const waxSolventEvaporation&);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected data
|
||||||
|
|
||||||
|
//- Molecular weight of wax [kg/kmol]
|
||||||
|
uniformDimensionedScalarField Wwax_;
|
||||||
|
|
||||||
|
//- Molecular weight of liquid [kg/kmol]
|
||||||
|
uniformDimensionedScalarField Wsolvent_;
|
||||||
|
|
||||||
|
//- Initial solvent mass-fraction
|
||||||
|
uniformDimensionedScalarField Ysolvent0_;
|
||||||
|
|
||||||
|
//- Solvent mass-fraction
|
||||||
|
volScalarField Ysolvent_;
|
||||||
|
|
||||||
|
//- Minimum film height for model to be active
|
||||||
|
const scalar deltaMin_;
|
||||||
|
|
||||||
|
//- Length scale [m]
|
||||||
|
const scalar L_;
|
||||||
|
|
||||||
|
//- Boiling temperature factor
|
||||||
|
// Used to set max limit on temperature to Tb*TbFactor
|
||||||
|
const scalar TbFactor_;
|
||||||
|
|
||||||
|
//- Switch to treat YInf as zero
|
||||||
|
Switch YInfZero_;
|
||||||
|
|
||||||
|
//- Activity coefficient as a function of solvent mole fraction
|
||||||
|
autoPtr<Function1<scalar>> activityCoeff_;
|
||||||
|
|
||||||
|
|
||||||
|
// Protected member functions
|
||||||
|
|
||||||
|
//- Return Sherwood number as a function of Reynolds and Schmidt numbers
|
||||||
|
scalar Sh(const scalar Re, const scalar Sc) const;
|
||||||
|
|
||||||
|
template<class YInfType>
|
||||||
|
void correctModel
|
||||||
|
(
|
||||||
|
const scalar dt,
|
||||||
|
scalarField& availableMass,
|
||||||
|
scalarField& dMass,
|
||||||
|
scalarField& dEnergy,
|
||||||
|
YInfType YInf
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("waxSolventEvaporation");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from surface film model
|
||||||
|
waxSolventEvaporation
|
||||||
|
(
|
||||||
|
surfaceFilmRegionModel& film,
|
||||||
|
const dictionary& dict
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~waxSolventEvaporation();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Correct
|
||||||
|
virtual void correctModel
|
||||||
|
(
|
||||||
|
const scalar dt,
|
||||||
|
scalarField& availableMass,
|
||||||
|
scalarField& dMass,
|
||||||
|
scalarField& dEnergy
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceFilmModels
|
||||||
|
} // End namespace regionModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -628,6 +628,9 @@ void thermoSingleLayer::evolveRegion()
|
|||||||
InfoInFunction << endl;
|
InfoInFunction << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Solve continuity for deltaRho_
|
||||||
|
solveContinuity();
|
||||||
|
|
||||||
// Update sub-models to provide updated source contributions
|
// Update sub-models to provide updated source contributions
|
||||||
updateSubmodels();
|
updateSubmodels();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user