mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Adding interCondensingEvaporatingFoam and tutorial
This commit is contained in:
8
applications/solvers/multiphase/interCondensingEvaporatingFoam/Allwclean
Executable file
8
applications/solvers/multiphase/interCondensingEvaporatingFoam/Allwclean
Executable file
@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # Run from this directory
|
||||
set -x
|
||||
|
||||
wclean libso temperaturePhaseChangeTwoPhaseMixtures
|
||||
wclean
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
12
applications/solvers/multiphase/interCondensingEvaporatingFoam/Allwmake
Executable file
12
applications/solvers/multiphase/interCondensingEvaporatingFoam/Allwmake
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # Run from this directory
|
||||
|
||||
# Parse arguments for library compilation
|
||||
targetType=libso
|
||||
. $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
|
||||
set -x
|
||||
|
||||
wmake $targetType temperaturePhaseChangeTwoPhaseMixtures
|
||||
wmake
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
@ -0,0 +1,3 @@
|
||||
interCondensatingEvaporatingFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/interCondensatingEvaporatingFoam
|
||||
@ -0,0 +1,30 @@
|
||||
interPhaseChangePath = $(FOAM_SOLVERS)/multiphase/interPhaseChangeFoam
|
||||
|
||||
EXE_INC = \
|
||||
-ItemperaturePhaseChangeTwoPhaseMixtures/lnInclude \
|
||||
-I$(interPhaseChangePath) \
|
||||
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels \
|
||||
-I$(LIB_SRC)/transportModels/incompressible/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
|
||||
-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/fvOptions/lnInclude\
|
||||
-I$(LIB_SRC)/sampling/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lphaseTemperatureChangeTwoPhaseMixtures \
|
||||
-ltwoPhaseMixture \
|
||||
-linterfaceProperties \
|
||||
-ltwoPhaseProperties \
|
||||
-lincompressibleTransportModels \
|
||||
-lturbulenceModels \
|
||||
-lincompressibleTurbulenceModels \
|
||||
-lfiniteVolume \
|
||||
-lmeshTools \
|
||||
-lfvOptions \
|
||||
-lsampling \
|
||||
-lfluidThermophysicalModels
|
||||
@ -0,0 +1,26 @@
|
||||
fvVectorMatrix UEqn
|
||||
(
|
||||
fvm::ddt(rho, U)
|
||||
+ fvm::div(rhoPhi, U)
|
||||
- fvm::Sp(fvc::ddt(rho) + fvc::div(rhoPhi), U)
|
||||
+ turbulence->divDevRhoReff(rho, U)
|
||||
);
|
||||
|
||||
UEqn.relax();
|
||||
|
||||
if (pimple.momentumPredictor())
|
||||
{
|
||||
solve
|
||||
(
|
||||
UEqn
|
||||
==
|
||||
fvc::reconstruct
|
||||
(
|
||||
(
|
||||
interface.surfaceTensionForce()
|
||||
- ghf*fvc::snGrad(rho)
|
||||
- fvc::snGrad(p_rgh)
|
||||
) * mesh.magSf()
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
volScalarField contErr(fvc::ddt(rho) + fvc::div(rhoPhi));
|
||||
|
||||
scalar sumLocalContErr = runTime.deltaTValue()*
|
||||
mag(contErr)().weightedAverage(mesh.V()).value();
|
||||
|
||||
scalar globalContErr = runTime.deltaTValue()*
|
||||
contErr.weightedAverage(mesh.V()).value();
|
||||
|
||||
Info<< "time step continuity errors : sum local = " << sumLocalContErr
|
||||
<< ", global = " << globalContErr
|
||||
<< endl;
|
||||
|
||||
@ -0,0 +1,158 @@
|
||||
Info<< "Reading field p_rgh\n" << endl;
|
||||
volScalarField p_rgh
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"p_rgh",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh
|
||||
);
|
||||
|
||||
Info<< "Reading field U\n" << endl;
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh
|
||||
);
|
||||
|
||||
#include "createPhi.H"
|
||||
|
||||
// Create p before the thermo
|
||||
volScalarField p
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"p",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
p_rgh
|
||||
);
|
||||
|
||||
// Creating e based thermo
|
||||
autoPtr<twoPhaseMixtureEThermo> thermo;
|
||||
thermo.set(new twoPhaseMixtureEThermo(U, phi));
|
||||
|
||||
// Create mixture and
|
||||
Info<< "Creating temperaturePhaseChangeTwoPhaseMixture\n" << endl;
|
||||
autoPtr<temperaturePhaseChangeTwoPhaseMixture> mixture =
|
||||
temperaturePhaseChangeTwoPhaseMixture::New(thermo(), mesh);
|
||||
|
||||
|
||||
volScalarField& T = thermo->T();
|
||||
volScalarField& e = thermo->he();
|
||||
|
||||
// Correct e from T and alpha
|
||||
thermo->correct();
|
||||
|
||||
volScalarField& alpha1(thermo->alpha1());
|
||||
volScalarField& alpha2(thermo->alpha2());
|
||||
|
||||
const dimensionedScalar& rho1 = thermo->rho1();
|
||||
const dimensionedScalar& rho2 = thermo->rho2();
|
||||
|
||||
// Need to store rho for ddt(rho, U)
|
||||
volScalarField rho
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
alpha1*rho1 + alpha2*rho2,
|
||||
alpha1.boundaryField().types()
|
||||
);
|
||||
rho.oldTime();
|
||||
|
||||
|
||||
// Construct interface from alpha1 distribution
|
||||
interfaceProperties interface
|
||||
(
|
||||
alpha1,
|
||||
U,
|
||||
thermo->transportPropertiesDict()
|
||||
);
|
||||
|
||||
// Construct incompressible turbulence model
|
||||
autoPtr<incompressible::turbulenceModel> turbulence
|
||||
(
|
||||
incompressible::turbulenceModel::New(U, phi, thermo())
|
||||
);
|
||||
|
||||
|
||||
Info<< "Calculating field g.h\n" << endl;
|
||||
volScalarField gh("gh", g & mesh.C());
|
||||
surfaceScalarField ghf("ghf", g & mesh.Cf());
|
||||
|
||||
//Update p with rho
|
||||
p = p_rgh + rho*gh;
|
||||
|
||||
label pRefCell = 0;
|
||||
scalar pRefValue = 0.0;
|
||||
setRefCell
|
||||
(
|
||||
p,
|
||||
p_rgh,
|
||||
pimple.dict(),
|
||||
pRefCell,
|
||||
pRefValue
|
||||
);
|
||||
|
||||
if (p_rgh.needReference())
|
||||
{
|
||||
p += dimensionedScalar
|
||||
(
|
||||
"p",
|
||||
p.dimensions(),
|
||||
pRefValue - getRefCellValue(p, pRefCell)
|
||||
);
|
||||
p_rgh = p - rho*gh;
|
||||
}
|
||||
|
||||
// Turbulent Prandtl number
|
||||
dimensionedScalar Prt("Prt", dimless, thermo->transportPropertiesDict());
|
||||
|
||||
volScalarField kappaEff
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"kappaEff",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
thermo->kappa()
|
||||
);
|
||||
|
||||
Info<< "Creating field kinetic energy K\n" << endl;
|
||||
volScalarField K("K", 0.5*magSqr(U));
|
||||
|
||||
Info<< "Creating field pDivU\n" << endl;
|
||||
volScalarField pDivU
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"pDivU",
|
||||
runTime.timeName(),
|
||||
mesh
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("pDivU", p.dimensions()/dimTime, 0)
|
||||
);
|
||||
@ -0,0 +1,31 @@
|
||||
{
|
||||
tmp<volScalarField> tcp(thermo->Cp());
|
||||
const volScalarField& cp = tcp();
|
||||
|
||||
kappaEff = thermo->kappa() + rho*cp*turbulence->nut()/Prt;
|
||||
|
||||
pDivU = dimensionedScalar("pDivU", p.dimensions()/dimTime, 0.0);
|
||||
|
||||
if (thermo->pDivU())
|
||||
{
|
||||
pDivU = (p*fvc::div(rhoPhi/fvc::interpolate(rho)));
|
||||
}
|
||||
|
||||
fvScalarMatrix eEqn
|
||||
(
|
||||
fvm::ddt(rho, e)
|
||||
+ fvc::ddt(rho, K) + fvc::div(rhoPhi, K)
|
||||
+ fvm::div(rhoPhi, e)
|
||||
- fvm::Sp(fvc::ddt(rho) + fvc::div(rhoPhi), e)
|
||||
- fvm::laplacian(kappaEff/cp, e)
|
||||
+ pDivU
|
||||
);
|
||||
|
||||
eEqn.relax();
|
||||
eEqn.solve();
|
||||
|
||||
thermo->correct();
|
||||
|
||||
Info<< "min/max(T) = " << min(T).value() << ", "
|
||||
<< max(T).value() <<endl;
|
||||
}
|
||||
@ -0,0 +1,137 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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/>.
|
||||
|
||||
Application
|
||||
interCondensatingEvaporatingFoam
|
||||
|
||||
Group
|
||||
grpMultiphaseSolvers
|
||||
|
||||
Description
|
||||
Solver for 2 incompressible, non-isothermal immiscible fluids with
|
||||
phase-change (evaporation-condensation) between a fluid and its vapour.
|
||||
Uses a VOF (volume of fluid) phase-fraction based interface capturing
|
||||
approach.
|
||||
|
||||
The momentum, energy and other fluid properties are of the "mixture" and a
|
||||
single momentum equation is solved.
|
||||
|
||||
Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "CMULES.H"
|
||||
#include "subCycle.H"
|
||||
#include "interfaceProperties.H"
|
||||
#include "twoPhaseMixtureEThermo.H"
|
||||
#include "temperaturePhaseChangeTwoPhaseMixture.H"
|
||||
#include "turbulentTransportModel.H"
|
||||
#include "turbulenceModel.H"
|
||||
#include "pimpleControl.H"
|
||||
#include "fvOptions.H"
|
||||
#include "fixedFluxPressureFvPatchScalarField.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#include "setRootCase.H"
|
||||
#include "createTime.H"
|
||||
#include "createMesh.H"
|
||||
|
||||
pimpleControl pimple(mesh);
|
||||
|
||||
#include "readGravitationalAcceleration.H"
|
||||
#include "initContinuityErrs.H"
|
||||
#include "createFields.H"
|
||||
#include "createFvOptions.H"
|
||||
#include "createTimeControls.H"
|
||||
#include "CourantNo.H"
|
||||
#include "setInitialDeltaT.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
#include "readTimeControls.H"
|
||||
#include "CourantNo.H"
|
||||
#include "setDeltaT.H"
|
||||
|
||||
runTime++;
|
||||
|
||||
Info<< "Time = " << runTime.timeName() << nl << endl;
|
||||
|
||||
// --- Pressure-velocity PIMPLE corrector loop
|
||||
while (pimple.loop())
|
||||
{
|
||||
#include "alphaControls.H"
|
||||
|
||||
surfaceScalarField rhoPhi
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rhoPhi",
|
||||
runTime.timeName(),
|
||||
mesh
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("0", dimMass/dimTime, 0)
|
||||
);
|
||||
|
||||
#include "alphaEqnSubCycle.H"
|
||||
mixture->correct();
|
||||
|
||||
#include "UEqn.H"
|
||||
#include "eEqn.H"
|
||||
|
||||
// --- Pressure corrector loop
|
||||
while (pimple.correct())
|
||||
{
|
||||
#include "pEqn.H"
|
||||
}
|
||||
|
||||
#include "continuityError.H"
|
||||
|
||||
if (pimple.turbCorr())
|
||||
{
|
||||
turbulence->correct();
|
||||
}
|
||||
}
|
||||
|
||||
runTime.write();
|
||||
|
||||
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
||||
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
||||
<< nl << endl;
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,77 @@
|
||||
{
|
||||
volScalarField rAU("rAU", 1.0/UEqn.A());
|
||||
surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU));
|
||||
|
||||
volVectorField HbyA("HbyA", U);
|
||||
HbyA = rAU*UEqn.H();
|
||||
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
adjustPhi(phiHbyA, U, p_rgh);
|
||||
|
||||
surfaceScalarField phig
|
||||
(
|
||||
(
|
||||
interface.surfaceTensionForce()
|
||||
- ghf*fvc::snGrad(rho)
|
||||
)*rAUf*mesh.magSf()
|
||||
);
|
||||
|
||||
phiHbyA += phig;
|
||||
|
||||
// Update the fixedFluxPressure BCs to ensure flux consistency
|
||||
setSnGrad<fixedFluxPressureFvPatchScalarField>
|
||||
(
|
||||
p_rgh.boundaryField(),
|
||||
(
|
||||
phiHbyA.boundaryField()
|
||||
- (mesh.Sf().boundaryField() & U.boundaryField())
|
||||
)/(mesh.magSf().boundaryField()*rAUf.boundaryField())
|
||||
);
|
||||
|
||||
Pair<tmp<volScalarField> > vDot = mixture->vDot();
|
||||
const volScalarField& vDotc = vDot[0]();
|
||||
const volScalarField& vDotv = vDot[1]();
|
||||
|
||||
while (pimple.correctNonOrthogonal())
|
||||
{
|
||||
fvScalarMatrix p_rghEqn
|
||||
(
|
||||
fvc::div(phiHbyA)
|
||||
- fvm::laplacian(rAUf, p_rgh)
|
||||
- (vDotc - vDotv)
|
||||
);
|
||||
|
||||
p_rghEqn.setReference(pRefCell, pRefValue);
|
||||
|
||||
p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter())));
|
||||
|
||||
if (pimple.finalNonOrthogonalIter())
|
||||
{
|
||||
phi = phiHbyA + p_rghEqn.flux();
|
||||
|
||||
U = HbyA + rAU*fvc::reconstruct((phig + p_rghEqn.flux())/rAUf);
|
||||
U.correctBoundaryConditions();
|
||||
fvOptions.correct(U);
|
||||
K = 0.5*magSqr(U);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
p == p_rgh + rho*gh;
|
||||
|
||||
if (p_rgh.needReference())
|
||||
{
|
||||
p += dimensionedScalar
|
||||
(
|
||||
"p",
|
||||
p.dimensions(),
|
||||
pRefValue - getRefCellValue(p, pRefCell)
|
||||
);
|
||||
p_rgh = p - rho*gh;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
temperaturePhaseChangeTwoPhaseMixtures/newtemperaturePhaseChangeTwoPhaseMixture.C
|
||||
temperaturePhaseChangeTwoPhaseMixtures/temperaturePhaseChangeTwoPhaseMixture.C
|
||||
thermoIncompressibleTwoPhaseMixture/thermoIncompressibleTwoPhaseMixture.C
|
||||
twoPhaseMixtureEThermo/twoPhaseMixtureEThermo.C
|
||||
constant/constant.C
|
||||
|
||||
LIB = $(FOAM_LIBBIN)/libphaseTemperatureChangeTwoPhaseMixtures
|
||||
@ -0,0 +1,16 @@
|
||||
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels \
|
||||
-I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
|
||||
-I$(LIB_SRC)/transportModels/incompressible/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude
|
||||
|
||||
LIB_LIBS = \
|
||||
-ltwoPhaseMixture \
|
||||
-linterfaceProperties \
|
||||
-ltwoPhaseProperties \
|
||||
-lincompressibleTransportModels \
|
||||
-lfiniteVolume \
|
||||
-lfluidThermophysicalModels
|
||||
@ -0,0 +1,174 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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 "constant.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "fvcGrad.H"
|
||||
#include "twoPhaseMixtureEThermo.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace temperaturePhaseChangeTwoPhaseMixtures
|
||||
{
|
||||
defineTypeNameAndDebug(constant, 0);
|
||||
addToRunTimeSelectionTable
|
||||
(
|
||||
temperaturePhaseChangeTwoPhaseMixture,
|
||||
constant,
|
||||
components
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixtures::constant::constant
|
||||
(
|
||||
const thermoIncompressibleTwoPhaseMixture& mixture,
|
||||
const fvMesh& mesh
|
||||
)
|
||||
:
|
||||
temperaturePhaseChangeTwoPhaseMixture(mixture, mesh),
|
||||
coeffC_(subDict(type() + "Coeffs").lookup("coeffC")),
|
||||
coeffE_(subDict(type() + "Coeffs").lookup("coeffE"))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::Pair<Foam::tmp<Foam::volScalarField> >
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixtures::constant::mDotAlphal() const
|
||||
{
|
||||
const volScalarField& T = mesh_.lookupObject<volScalarField>("T");
|
||||
|
||||
const twoPhaseMixtureEThermo& thermo =
|
||||
refCast<const twoPhaseMixtureEThermo>
|
||||
(
|
||||
mesh_.lookupObject<basicThermo>(basicThermo::dictName)
|
||||
);
|
||||
|
||||
const dimensionedScalar& TSat = thermo.TSat();
|
||||
|
||||
dimensionedScalar T0("0", dimTemperature, 0.0);
|
||||
|
||||
return Pair<tmp<volScalarField> >
|
||||
(
|
||||
coeffC_*mixture_.rho2()*max(TSat - T, T0),
|
||||
-coeffE_*mixture_.rho1()*max(T - TSat, T0)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::Pair<Foam::tmp<Foam::volScalarField> >
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixtures::constant::mDot() const
|
||||
{
|
||||
|
||||
volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(mixture_.alpha1(), scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
volScalarField limitedAlpha2
|
||||
(
|
||||
min(max(mixture_.alpha2(), scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const volScalarField& T = mesh_.lookupObject<volScalarField>("T");
|
||||
|
||||
const twoPhaseMixtureEThermo& thermo =
|
||||
refCast<const twoPhaseMixtureEThermo>
|
||||
(
|
||||
mesh_.lookupObject<basicThermo>(basicThermo::dictName)
|
||||
);
|
||||
|
||||
const dimensionedScalar& TSat = thermo.TSat();
|
||||
|
||||
dimensionedScalar T0("0", dimTemperature, 0.0);
|
||||
|
||||
return Pair<tmp<volScalarField> >
|
||||
(
|
||||
coeffC_*mixture_.rho2()*limitedAlpha2*max(TSat - T, T0),
|
||||
coeffE_*mixture_.rho1()*limitedAlpha1*max(T - TSat, T0)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::Pair<Foam::tmp<Foam::volScalarField> >
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixtures::constant::mDotDeltaT() const
|
||||
{
|
||||
volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(mixture_.alpha1(), scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
volScalarField limitedAlpha2
|
||||
(
|
||||
min(max(mixture_.alpha2(), scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const volScalarField& T = mesh_.lookupObject<volScalarField>("T");
|
||||
|
||||
const twoPhaseMixtureEThermo& thermo =
|
||||
refCast<const twoPhaseMixtureEThermo>
|
||||
(
|
||||
mesh_.lookupObject<basicThermo>(basicThermo::dictName)
|
||||
);
|
||||
|
||||
const dimensionedScalar& TSat = thermo.TSat();
|
||||
|
||||
|
||||
return Pair<tmp<volScalarField> >
|
||||
(
|
||||
coeffC_*mixture_.rho2()*limitedAlpha2*pos(TSat - T),
|
||||
coeffE_*mixture_.rho1()*limitedAlpha1*pos(T - TSat)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void Foam::temperaturePhaseChangeTwoPhaseMixtures::constant::correct()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool Foam::temperaturePhaseChangeTwoPhaseMixtures::constant::read()
|
||||
{
|
||||
if (temperaturePhaseChangeTwoPhaseMixture::read())
|
||||
{
|
||||
subDict(type() + "Coeffs").lookup("coeffC") >> coeffC_;
|
||||
subDict(type() + "Coeffs").lookup("coeffE") >> coeffE_;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,118 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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::phaseChangeTwoPhaseMixtures::constant
|
||||
|
||||
Description
|
||||
constant condensation/saturation model.
|
||||
|
||||
|
||||
SourceFiles
|
||||
constant.C
|
||||
|
||||
\*--------------------------------------------------------------------*/
|
||||
|
||||
#ifndef constant_H
|
||||
#define constant_H
|
||||
|
||||
#include "temperaturePhaseChangeTwoPhaseMixture.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace temperaturePhaseChangeTwoPhaseMixtures
|
||||
{
|
||||
|
||||
/*--------------------------------------------------------------------*\
|
||||
Class constant
|
||||
\*--------------------------------------------------------------------*/
|
||||
|
||||
class constant
|
||||
:
|
||||
public temperaturePhaseChangeTwoPhaseMixture
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Condensation coefficient [1/s/K]
|
||||
dimensionedScalar coeffC_;
|
||||
|
||||
//- Evaporation coefficient [1/s/K]
|
||||
dimensionedScalar coeffE_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("constant");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
constant
|
||||
(
|
||||
const thermoIncompressibleTwoPhaseMixture& mixture,
|
||||
const fvMesh& mesh
|
||||
);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~constant()
|
||||
{}
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return the mass condensation and vaporisation rates as a
|
||||
// coefficient to multiply (1 - alphal) for the condensation rate
|
||||
// and a coefficient to multiply alphal for the vaporisation rate
|
||||
virtual Pair<tmp<volScalarField> > mDotAlphal() const;
|
||||
|
||||
//- Return the mass condensation and vaporisation rates as coefficients
|
||||
virtual Pair<tmp<volScalarField> > mDot() const;
|
||||
|
||||
//- Return the mass condensation and vaporisation rates as a
|
||||
// coefficient to multiply (Tsat - T) for the condensation rate
|
||||
// and a coefficient to multiply (T - Tsat) for the vaporisation rate
|
||||
virtual Pair<tmp<volScalarField> > mDotDeltaT() const;
|
||||
|
||||
//- Correct the constant phaseChange model
|
||||
virtual void correct();
|
||||
|
||||
//- Read the transportProperties dictionary and update
|
||||
virtual bool read();
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace temperaturePhaseChangeTwoPhaseMixtures
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,83 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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 "temperaturePhaseChangeTwoPhaseMixture.H"
|
||||
#include "basicThermo.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::autoPtr<Foam::temperaturePhaseChangeTwoPhaseMixture>
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixture::New
|
||||
(
|
||||
const thermoIncompressibleTwoPhaseMixture& thermo,
|
||||
const fvMesh& mesh
|
||||
)
|
||||
{
|
||||
IOdictionary phaseChangePropertiesDict
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"phaseChangeProperties",
|
||||
mesh.time().constant(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
)
|
||||
);
|
||||
|
||||
word temperaturePhaseChangeTwoPhaseMixtureTypeName
|
||||
(
|
||||
phaseChangePropertiesDict.lookup
|
||||
(
|
||||
"phaseChangeTwoPhaseModel"
|
||||
)
|
||||
);
|
||||
|
||||
Info<< "Selecting phaseChange model "
|
||||
<< temperaturePhaseChangeTwoPhaseMixtureTypeName << endl;
|
||||
|
||||
componentsConstructorTable::iterator cstrIter =
|
||||
componentsConstructorTablePtr_
|
||||
->find(temperaturePhaseChangeTwoPhaseMixtureTypeName);
|
||||
|
||||
if (cstrIter == componentsConstructorTablePtr_->end())
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"temperaturePhaseChangeTwoPhaseMixture::New"
|
||||
) << "Unknown temperaturePhaseChangeTwoPhaseMixture type "
|
||||
<< temperaturePhaseChangeTwoPhaseMixtureTypeName << endl << endl
|
||||
<< "Valid temperaturePhaseChangeTwoPhaseMixtures are : " << endl
|
||||
<< componentsConstructorTablePtr_->sortedToc()
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
return autoPtr<temperaturePhaseChangeTwoPhaseMixture>
|
||||
(cstrIter()(thermo, mesh));
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,109 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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 "temperaturePhaseChangeTwoPhaseMixture.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(temperaturePhaseChangeTwoPhaseMixture, 0);
|
||||
defineRunTimeSelectionTable
|
||||
(
|
||||
temperaturePhaseChangeTwoPhaseMixture,
|
||||
components
|
||||
);
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixture::
|
||||
temperaturePhaseChangeTwoPhaseMixture
|
||||
(
|
||||
const thermoIncompressibleTwoPhaseMixture& mixture,
|
||||
const fvMesh& mesh
|
||||
)
|
||||
:
|
||||
IOdictionary
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"phaseChangeProperties",
|
||||
mesh.time().constant(),
|
||||
mesh,
|
||||
IOobject::MUST_READ_IF_MODIFIED,
|
||||
IOobject::NO_WRITE
|
||||
)
|
||||
),
|
||||
mixture_(mixture),
|
||||
mesh_(mesh)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::Pair<Foam::tmp<Foam::volScalarField> >
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixture::vDotAlphal() const
|
||||
{
|
||||
volScalarField alphalCoeff
|
||||
(
|
||||
1.0/mixture_.rho1() - mixture_.alpha1()
|
||||
*(1.0/mixture_.rho1() - 1.0/mixture_.rho2())
|
||||
);
|
||||
|
||||
Pair<tmp<volScalarField> > mDotAlphal = this->mDotAlphal();
|
||||
|
||||
return Pair<tmp<volScalarField> >
|
||||
(
|
||||
alphalCoeff*mDotAlphal[0],
|
||||
alphalCoeff*mDotAlphal[1]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::Pair<Foam::tmp<Foam::volScalarField> >
|
||||
Foam::temperaturePhaseChangeTwoPhaseMixture::vDot() const
|
||||
{
|
||||
dimensionedScalar pCoeff(1.0/mixture_.rho1() - 1.0/mixture_.rho2());
|
||||
Pair<tmp<volScalarField> > mDot = this->mDot();
|
||||
|
||||
return Pair<tmp<volScalarField> >(pCoeff*mDot[0], pCoeff*mDot[1]);
|
||||
}
|
||||
|
||||
|
||||
bool Foam::temperaturePhaseChangeTwoPhaseMixture::read()
|
||||
{
|
||||
if (regIOobject::read())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,168 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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::temperaturePhaseChangeTwoPhaseMixture
|
||||
|
||||
Description
|
||||
|
||||
SourceFiles
|
||||
temperaturePhaseChangeTwoPhaseMixture.C
|
||||
newtemperaturePhaseChangeTwoPhaseMixture.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef temperaturePhaseChangeTwoPhaseMixture_H
|
||||
#define temperaturePhaseChangeTwoPhaseMixture_H
|
||||
|
||||
#include "thermoIncompressibleTwoPhaseMixture.H"
|
||||
#include "typeInfo.H"
|
||||
#include "runTimeSelectionTables.H"
|
||||
#include "volFields.H"
|
||||
#include "dimensionedScalar.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class temperaturePhaseChangeTwoPhaseMixture Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class temperaturePhaseChangeTwoPhaseMixture
|
||||
:
|
||||
public IOdictionary
|
||||
{
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
|
||||
//- Reference to the thermoIncompressibleTwoPhaseMixture
|
||||
const thermoIncompressibleTwoPhaseMixture& mixture_;
|
||||
|
||||
//- Reference to fvMesh
|
||||
const fvMesh& mesh_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow copy construct
|
||||
temperaturePhaseChangeTwoPhaseMixture
|
||||
(
|
||||
const temperaturePhaseChangeTwoPhaseMixture&
|
||||
);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const temperaturePhaseChangeTwoPhaseMixture&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("temperaturePhaseChangeTwoPhaseMixture");
|
||||
|
||||
|
||||
// Declare run-time constructor selection table
|
||||
|
||||
declareRunTimeSelectionTable
|
||||
(
|
||||
autoPtr,
|
||||
temperaturePhaseChangeTwoPhaseMixture,
|
||||
components,
|
||||
(
|
||||
const thermoIncompressibleTwoPhaseMixture& mixture,
|
||||
const fvMesh& mesh
|
||||
),
|
||||
(mixture, mesh)
|
||||
);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Return a reference to the selected phaseChange model
|
||||
static autoPtr<temperaturePhaseChangeTwoPhaseMixture> New
|
||||
(
|
||||
const thermoIncompressibleTwoPhaseMixture& mixture,
|
||||
const fvMesh& mesh
|
||||
);
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
temperaturePhaseChangeTwoPhaseMixture
|
||||
(
|
||||
const thermoIncompressibleTwoPhaseMixture& mixture,
|
||||
const fvMesh& mesh
|
||||
);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~temperaturePhaseChangeTwoPhaseMixture()
|
||||
{}
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
|
||||
//- Return the mass condensation and vaporisation rates as a
|
||||
// coefficient to multiply (1 - alphal) for the condensation rate
|
||||
// and a coefficient to multiply alphal for the vaporisation rate
|
||||
virtual Pair<tmp<volScalarField> > mDotAlphal() const = 0;
|
||||
|
||||
//- Return the mass condensation and vaporisation rates as coefficients
|
||||
virtual Pair<tmp<volScalarField> > mDot() const = 0;
|
||||
|
||||
//- Return the mass condensation and vaporisation rates as a
|
||||
// coefficient to multiply (Tsat - T) for the condensation rate
|
||||
// and a coefficient to multiply (T - Tsat) for the vaporisation rate
|
||||
virtual Pair<tmp<volScalarField> > mDotDeltaT() const = 0;
|
||||
|
||||
//- Return the volumetric condensation and vaporisation rates as a
|
||||
// coefficient to multiply (1 - alphal) for the condensation rate
|
||||
// and a coefficient to multiply alphal for the vaporisation rate
|
||||
Pair<tmp<volScalarField> > vDotAlphal() const;
|
||||
|
||||
//- Return the volumetric condensation and vaporisation rates as
|
||||
// coefficients
|
||||
Pair<tmp<volScalarField> > vDot() const;
|
||||
|
||||
//- Correct the phaseChange model
|
||||
virtual void correct() = 0;
|
||||
|
||||
//- Read the transportProperties dictionary and update
|
||||
virtual bool read();
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,133 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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 "thermoIncompressibleTwoPhaseMixture.H"
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(thermoIncompressibleTwoPhaseMixture, 0);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::thermoIncompressibleTwoPhaseMixture::thermoIncompressibleTwoPhaseMixture
|
||||
(
|
||||
const volVectorField& U,
|
||||
const surfaceScalarField& phi
|
||||
)
|
||||
:
|
||||
incompressibleTwoPhaseMixture(U, phi),
|
||||
|
||||
kappa1_
|
||||
(
|
||||
"kappa1",
|
||||
dimEnergy/dimTime/dimLength/dimTemperature,
|
||||
subDict(phase1Name_).lookup("kappa")
|
||||
),
|
||||
kappa2_
|
||||
(
|
||||
"kappa2",
|
||||
kappa1_.dimensions(),
|
||||
subDict(phase2Name_).lookup("kappa")
|
||||
),
|
||||
|
||||
Cp1_
|
||||
(
|
||||
"Cp1",
|
||||
dimEnergy/dimTemperature/dimMass,
|
||||
subDict(phase1Name_).lookup("Cp")
|
||||
),
|
||||
Cp2_
|
||||
(
|
||||
"Cp2",
|
||||
dimEnergy/dimTemperature/dimMass,
|
||||
subDict(phase2Name_).lookup("Cp")
|
||||
),
|
||||
|
||||
Cv1_
|
||||
(
|
||||
"Cv1",
|
||||
dimEnergy/dimTemperature/dimMass,
|
||||
subDict(phase1Name_).lookup("Cv")
|
||||
),
|
||||
|
||||
Cv2_
|
||||
(
|
||||
"Cv2",
|
||||
dimEnergy/dimTemperature/dimMass,
|
||||
subDict(phase2Name_).lookup("Cv")
|
||||
),
|
||||
|
||||
Hf1_
|
||||
(
|
||||
"Hf1",
|
||||
dimEnergy/dimMass,
|
||||
subDict(phase1Name_).lookup("hf")
|
||||
),
|
||||
|
||||
Hf2_
|
||||
(
|
||||
"Hf2",
|
||||
dimEnergy/dimMass,
|
||||
subDict(phase2Name_).lookup("hf")
|
||||
)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
bool Foam::thermoIncompressibleTwoPhaseMixture::read()
|
||||
{
|
||||
if (incompressibleTwoPhaseMixture::read())
|
||||
{
|
||||
subDict(phase1Name_).lookup("kappa") >> kappa1_;
|
||||
subDict(phase2Name_).lookup("kappa") >> kappa2_;
|
||||
|
||||
subDict(phase1Name_).lookup("Cp") >> Cp1_;
|
||||
subDict(phase2Name_).lookup("Cp") >> Cp2_;
|
||||
|
||||
subDict(phase1Name_).lookup("Cv") >> Cv1_;
|
||||
subDict(phase2Name_).lookup("Cv") >> Cv2_;
|
||||
|
||||
subDict(phase1Name_).lookup("hf") >> Hf1_;
|
||||
subDict(phase2Name_).lookup("hf") >> Hf2_;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,156 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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::thermoIncompressibleTwoPhaseMixture
|
||||
|
||||
Description
|
||||
A two-phase incompressible transportModel
|
||||
|
||||
SourceFiles
|
||||
thermoIncompressibleTwoPhaseMixture.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef thermoIncompressibleTwoPhaseMixture_H
|
||||
#define thermoIncompressibleTwoPhaseMixture_H
|
||||
|
||||
#include "incompressibleTwoPhaseMixture.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class thermoIncompressibleTwoPhaseMixture Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class thermoIncompressibleTwoPhaseMixture
|
||||
:
|
||||
public incompressibleTwoPhaseMixture
|
||||
{
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
|
||||
|
||||
//- Thermal variables
|
||||
dimensionedScalar kappa1_;
|
||||
dimensionedScalar kappa2_;
|
||||
|
||||
dimensionedScalar Cp1_;
|
||||
dimensionedScalar Cp2_;
|
||||
|
||||
dimensionedScalar Cv1_;
|
||||
dimensionedScalar Cv2_;
|
||||
|
||||
dimensionedScalar Hf1_;
|
||||
dimensionedScalar Hf2_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
TypeName("thermoIncompressibleTwoPhaseMixture");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from U and phi
|
||||
thermoIncompressibleTwoPhaseMixture
|
||||
(
|
||||
const volVectorField& U,
|
||||
const surfaceScalarField& phi
|
||||
);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~thermoIncompressibleTwoPhaseMixture()
|
||||
{}
|
||||
|
||||
|
||||
// Access function
|
||||
|
||||
//- Return const-access to phase2 kappa
|
||||
const dimensionedScalar& kappa2() const
|
||||
{
|
||||
return kappa2_;
|
||||
};
|
||||
|
||||
//- Return const-access to phase1 kappa
|
||||
const dimensionedScalar& kappa1() const
|
||||
{
|
||||
return kappa1_;
|
||||
};
|
||||
|
||||
//- Return const-access to phase1 Cp
|
||||
const dimensionedScalar& Cp1() const
|
||||
{
|
||||
return Cp1_;
|
||||
};
|
||||
|
||||
//- Return const-access to phase1 Cp
|
||||
const dimensionedScalar& Cp2() const
|
||||
{
|
||||
return Cp2_;
|
||||
};
|
||||
|
||||
//- Return const-access to phase1 Cv
|
||||
const dimensionedScalar& Cv1() const
|
||||
{
|
||||
return Cv1_;
|
||||
};
|
||||
|
||||
//- Return const-access to phase1 Cv
|
||||
const dimensionedScalar& Cv2() const
|
||||
{
|
||||
return Cv2_;
|
||||
};
|
||||
|
||||
//- Return latent heat for phase 1
|
||||
const dimensionedScalar& Hf1() const
|
||||
{
|
||||
return Hf1_;
|
||||
};
|
||||
|
||||
//- Return latent heat for phase 2
|
||||
const dimensionedScalar& Hf2() const
|
||||
{
|
||||
return Hf2_;
|
||||
};
|
||||
|
||||
//- Read base transportProperties dictionary
|
||||
virtual bool read();
|
||||
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,592 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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 "twoPhaseMixtureEThermo.H"
|
||||
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
#include "fixedEnergyFvPatchScalarField.H"
|
||||
#include "gradientEnergyFvPatchScalarField.H"
|
||||
#include "mixedEnergyFvPatchScalarField.H"
|
||||
#include "twoPhaseMixtureEThermo.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(twoPhaseMixtureEThermo, 0);
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||
|
||||
void Foam::twoPhaseMixtureEThermo::eBoundaryCorrection(volScalarField& h)
|
||||
{
|
||||
volScalarField::GeometricBoundaryField& hbf = h.boundaryField();
|
||||
|
||||
forAll(hbf, patchi)
|
||||
{
|
||||
if (isA<gradientEnergyFvPatchScalarField>(hbf[patchi]))
|
||||
{
|
||||
refCast<gradientEnergyFvPatchScalarField>(hbf[patchi]).gradient()
|
||||
= hbf[patchi].fvPatchField::snGrad();
|
||||
}
|
||||
else if (isA<mixedEnergyFvPatchScalarField>(hbf[patchi]))
|
||||
{
|
||||
refCast<mixedEnergyFvPatchScalarField>(hbf[patchi]).refGrad()
|
||||
= hbf[patchi].fvPatchField::snGrad();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Foam::twoPhaseMixtureEThermo::init()
|
||||
{
|
||||
const volScalarField alpha1Rho1(alpha1()*rho1());
|
||||
const volScalarField alpha2Rho2(alpha2()*rho2());
|
||||
|
||||
e_ =
|
||||
(
|
||||
(T_ - TSat_)*(alpha1Rho1*Cv1() + alpha2Rho2*Cv2())
|
||||
+ (alpha1Rho1*Hf1() + alpha2Rho2*Hf2())
|
||||
)
|
||||
/(alpha1Rho1 + alpha2Rho2);
|
||||
|
||||
e_.correctBoundaryConditions();
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::twoPhaseMixtureEThermo::twoPhaseMixtureEThermo
|
||||
(
|
||||
const volVectorField& U,
|
||||
const surfaceScalarField& phi
|
||||
)
|
||||
:
|
||||
basicThermo(U.mesh(), word::null),
|
||||
thermoIncompressibleTwoPhaseMixture(U, phi),
|
||||
|
||||
e_
|
||||
(
|
||||
volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"e",
|
||||
U.mesh().time().timeName(),
|
||||
U.mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
U.mesh(),
|
||||
dimensionedScalar("zero", dimEnergy/dimMass, 0.0),
|
||||
heBoundaryTypes()
|
||||
)
|
||||
),
|
||||
|
||||
TSat_
|
||||
(
|
||||
"TSat",
|
||||
dimTemperature,
|
||||
basicThermo::lookup("TSat")
|
||||
),
|
||||
|
||||
pDivU_(basicThermo::lookupOrDefault<Switch>("pDivU", true))
|
||||
|
||||
{
|
||||
// Initialise e
|
||||
init();
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::twoPhaseMixtureEThermo::~twoPhaseMixtureEThermo()
|
||||
{}
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void Foam::twoPhaseMixtureEThermo::correct()
|
||||
{
|
||||
incompressibleTwoPhaseMixture::correct();
|
||||
|
||||
const volScalarField alpha1Rho1(alpha1()*rho1());
|
||||
const volScalarField alpha2Rho2(alpha2()*rho2());
|
||||
|
||||
T_ =
|
||||
(
|
||||
(e_*(alpha1Rho1 + alpha2Rho2))
|
||||
- (alpha1Rho1*Hf1() + alpha2Rho2*Hf2())
|
||||
)
|
||||
/(alpha1Rho1*Cv1() + alpha2Rho2*Cv2())
|
||||
+ TSat_;
|
||||
|
||||
T().correctBoundaryConditions();
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::twoPhaseMixtureEThermo::he
|
||||
(
|
||||
const volScalarField& p,
|
||||
const volScalarField& T
|
||||
) const
|
||||
{
|
||||
const volScalarField alpha1Rho1(alpha1()*rho1());
|
||||
const volScalarField alpha2Rho2(alpha2()*rho2());
|
||||
|
||||
return
|
||||
(
|
||||
(T - TSat_)*(alpha1Rho1*Cv1() + alpha2Rho2*Cv2())
|
||||
+ (alpha1Rho1*Hf1() + alpha2Rho2*Hf2())
|
||||
)
|
||||
/ (alpha1Rho1 + alpha2Rho2);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::twoPhaseMixtureEThermo::he
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const labelList& cells
|
||||
) const
|
||||
{
|
||||
tmp<scalarField> the(new scalarField(T.size()));
|
||||
scalarField& he = the.ref();
|
||||
|
||||
const volScalarField alpha1Rho1(alpha1()*rho1());
|
||||
const volScalarField alpha2Rho2(alpha2()*rho2());
|
||||
|
||||
forAll(T, i)
|
||||
{
|
||||
label celli = cells[i];
|
||||
he[i] =
|
||||
(
|
||||
(T[i] - TSat_.value())
|
||||
*(
|
||||
alpha1Rho1[celli]*Cv1().value()
|
||||
+ alpha2Rho2[celli]*Cv2().value()
|
||||
)
|
||||
+ (
|
||||
alpha1Rho1[celli]*Hf1().value()
|
||||
+ alpha2Rho2[celli]*Hf2().value()
|
||||
)
|
||||
)
|
||||
/ (alpha1Rho1[celli] + alpha2Rho2[celli]);
|
||||
}
|
||||
|
||||
return the;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::twoPhaseMixtureEThermo::he
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchI
|
||||
) const
|
||||
{
|
||||
const scalarField& alpha1p = alpha1().boundaryField()[patchI];
|
||||
const scalarField& alpha2p = alpha2().boundaryField()[patchI];
|
||||
|
||||
const scalarField& Tp = T_.boundaryField()[patchI];
|
||||
|
||||
return
|
||||
(
|
||||
(
|
||||
(Tp - TSat_.value())
|
||||
*(
|
||||
alpha1p*rho1().value()*Cv1().value()
|
||||
+ alpha2p*rho2().value()*Cv2().value()
|
||||
)
|
||||
+ (
|
||||
alpha1p*rho1().value()*Hf1().value()
|
||||
+ alpha2p*rho2().value()*Hf2().value()
|
||||
)
|
||||
)
|
||||
/ (alpha1p*rho1().value() + alpha2p*rho2().value())
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::hc() const
|
||||
{
|
||||
|
||||
const fvMesh& mesh = this->T_.mesh();
|
||||
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"hc",
|
||||
mesh.time().timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("hc",Hf2() - Hf1())
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::twoPhaseMixtureEThermo::THE
|
||||
(
|
||||
const scalarField& h,
|
||||
const scalarField& p,
|
||||
const scalarField& T0, // starting temperature
|
||||
const labelList& cells
|
||||
) const
|
||||
{
|
||||
NotImplemented;
|
||||
return tmp<Foam::scalarField>();
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::twoPhaseMixtureEThermo::THE
|
||||
(
|
||||
const scalarField& h,
|
||||
const scalarField& p,
|
||||
const scalarField& T0, // starting temperature
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
NotImplemented;
|
||||
return tmp<Foam::scalarField>();
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::Cp() const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
"cp",
|
||||
limitedAlpha1*Cp1() + (scalar(1) - limitedAlpha1)*Cp2()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::twoPhaseMixtureEThermo::Cp
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const scalarField& alpha1p = limitedAlpha1.boundaryField()[patchi];
|
||||
|
||||
return
|
||||
(
|
||||
alpha1p*Cp1().value() + (scalar(1) - alpha1p)*Cp2().value()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::rho() const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
"rho",
|
||||
limitedAlpha1*rho1().value()
|
||||
+ (scalar(1) - limitedAlpha1)*rho2().value()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::twoPhaseMixtureEThermo::rho
|
||||
(
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const scalarField& alpha1p = limitedAlpha1.boundaryField()[patchi];
|
||||
|
||||
return
|
||||
(
|
||||
alpha1p*rho1().value() + (scalar(1.0) - alpha1p)*rho2().value()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::Cv() const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
"cv",
|
||||
limitedAlpha1*Cv1() + (scalar(1) - limitedAlpha1)*Cv2()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::twoPhaseMixtureEThermo::Cv
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const scalarField& alpha1p = limitedAlpha1.boundaryField()[patchi];
|
||||
|
||||
return
|
||||
(
|
||||
alpha1p*Cv1().value() + (scalar(1) - alpha1p)*Cv2().value()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::gamma() const
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
(alpha1_*Cp1() + alpha2_*Cp2()) / (alpha1_*Cv1() + alpha2_*Cv2())
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::twoPhaseMixtureEThermo::gamma
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
return
|
||||
(
|
||||
gamma()().boundaryField()[patchi]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::Cpv() const
|
||||
{
|
||||
// This is an e thermo (Cpv = Cv)
|
||||
return Cv();
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::twoPhaseMixtureEThermo::Cpv
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchI
|
||||
) const
|
||||
{
|
||||
// This is a e thermo (Cpv = Cv)
|
||||
return Cv(p, T, patchI);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::CpByCpv() const
|
||||
{
|
||||
NotImplemented;
|
||||
return tmp<Foam::volScalarField>();
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::twoPhaseMixtureEThermo::CpByCpv
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
NotImplemented;
|
||||
return tmp<Foam::scalarField>();
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::kappa() const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
"kappa",
|
||||
limitedAlpha1*kappa1() + (scalar(1) - limitedAlpha1)*kappa2()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::twoPhaseMixtureEThermo::kappa(const label patchi) const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const scalarField& alpha1p = limitedAlpha1.boundaryField()[patchi];
|
||||
|
||||
return (alpha1p*kappa1().value() + (1 - alpha1p)*kappa2().value());
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::kappaEff
|
||||
(
|
||||
const volScalarField& kappat
|
||||
) const
|
||||
{
|
||||
tmp<Foam::volScalarField> kappaEff(kappa() + kappat);
|
||||
kappaEff.ref().rename("kappaEff");
|
||||
return kappaEff;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::twoPhaseMixtureEThermo::kappaEff
|
||||
(
|
||||
const scalarField& kappat,
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const scalarField& alpha1p = limitedAlpha1.boundaryField()[patchi];
|
||||
|
||||
return
|
||||
(alpha1p*kappa1().value() + (1 - alpha1p)*kappa2().value()) + kappat;
|
||||
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::twoPhaseMixtureEThermo::alphaEff
|
||||
(
|
||||
const volScalarField& alphat
|
||||
) const
|
||||
{
|
||||
const volScalarField rho
|
||||
(
|
||||
alpha1_*rho1() + (1.0 - alpha1_)*rho2()
|
||||
);
|
||||
|
||||
|
||||
return (kappa()/Cp()/rho + alphat);
|
||||
}
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::twoPhaseMixtureEThermo::alphaEff
|
||||
(
|
||||
const scalarField& alphat,
|
||||
const label patchi
|
||||
) const
|
||||
{
|
||||
const volScalarField limitedAlpha1
|
||||
(
|
||||
min(max(alpha1_, scalar(0)), scalar(1))
|
||||
);
|
||||
|
||||
const scalarField& alpha1p = limitedAlpha1.boundaryField()[patchi];
|
||||
|
||||
const scalarField rho
|
||||
(
|
||||
alpha1p*rho1().value() + (1.0 - alpha1p)*rho2().value()
|
||||
);
|
||||
|
||||
const scalarField kappa
|
||||
(
|
||||
alpha1p*kappa1().value() + (1.0 - alpha1p)*kappa2().value()
|
||||
);
|
||||
|
||||
const scalarField Cp
|
||||
(
|
||||
alpha1p*Cp1().value() + (1.0 - alpha1p)*Cp2().value()
|
||||
);
|
||||
|
||||
return kappa/Cp/rho + alphat;
|
||||
}
|
||||
|
||||
bool Foam::twoPhaseMixtureEThermo::read()
|
||||
{
|
||||
if (basicThermo::read() && thermoIncompressibleTwoPhaseMixture::read())
|
||||
{
|
||||
basicThermo::lookup("pDivU") >> pDivU_;
|
||||
basicThermo::lookup("TSat") >> TSat_;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
@ -0,0 +1,313 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd
|
||||
\\/ 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::twoPhaseMixtureEThermo
|
||||
|
||||
Description
|
||||
Two phases thermo Internal energy mixture Defined as:
|
||||
e1 = Cv1(T - Tsat) + Hv1
|
||||
e2 = Cv2(T - Tsat) + Hv2
|
||||
e = (alpha1*rho1*e1 + alpha2*rho2*e2) / (alpha1*rho1 + alpha2*rho2)
|
||||
|
||||
SourceFiles
|
||||
twoPhaseMixtureEThermo.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef flashThermo_H
|
||||
#define flashThermo_H
|
||||
|
||||
#include "volFields.H"
|
||||
|
||||
#include "basicThermo.H"
|
||||
#include "thermoIncompressibleTwoPhaseMixture.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class twoPhaseMixtureEThermo Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class twoPhaseMixtureEThermo
|
||||
:
|
||||
public basicThermo,
|
||||
public thermoIncompressibleTwoPhaseMixture
|
||||
{
|
||||
|
||||
protected:
|
||||
|
||||
// Protected Data
|
||||
|
||||
//- Internal energy field [J]
|
||||
volScalarField e_;
|
||||
|
||||
//- Saturation Temperature
|
||||
dimensionedScalar TSat_;
|
||||
|
||||
//- Should the p*div(U) term be included in the energy equation
|
||||
Switch pDivU_;
|
||||
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Correct boundary for e
|
||||
void eBoundaryCorrection (volScalarField& h);
|
||||
|
||||
//- Initialize
|
||||
void init();
|
||||
|
||||
|
||||
public:
|
||||
|
||||
TypeName("twoPhaseMixtureEThermo");
|
||||
|
||||
// Constructor
|
||||
twoPhaseMixtureEThermo
|
||||
(
|
||||
const volVectorField& U,
|
||||
const surfaceScalarField& phi
|
||||
);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~twoPhaseMixtureEThermo();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
|
||||
//- Return access to the inernal energy field [J/Kg]
|
||||
virtual volScalarField& he()
|
||||
{
|
||||
return e_;
|
||||
}
|
||||
|
||||
//- Return access to the inernal energy field [J/Kg]
|
||||
virtual const volScalarField& he() const
|
||||
{
|
||||
return e_;
|
||||
}
|
||||
|
||||
//- Enthalpy/Internal energy
|
||||
// for given pressure and temperature [J/kg]
|
||||
virtual tmp<volScalarField> he
|
||||
(
|
||||
const volScalarField& p,
|
||||
const volScalarField& T
|
||||
) const;
|
||||
|
||||
//- Enthalpy/Internal energy for cell-set [J/kg]
|
||||
virtual tmp<scalarField> he
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const labelList& cells
|
||||
) const;
|
||||
|
||||
//- Enthalpy/Internal energy for patch [J/kg]
|
||||
virtual tmp<scalarField> he
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
//- Chemical enthalpy [J/kg]
|
||||
virtual tmp<volScalarField> hc() const;
|
||||
|
||||
//- Temperature from enthalpy/internal energy for cell-set
|
||||
virtual tmp<scalarField> THE
|
||||
(
|
||||
const scalarField& h,
|
||||
const scalarField& p,
|
||||
const scalarField& T0, // starting temperature
|
||||
const labelList& cells
|
||||
) const;
|
||||
|
||||
//- Temperature from enthalpy/internal energy for patch
|
||||
virtual tmp<scalarField> THE
|
||||
(
|
||||
const scalarField& h,
|
||||
const scalarField& p,
|
||||
const scalarField& T0, // starting temperature
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
|
||||
//- Return true if the equation of state is incompressible
|
||||
// i.e. rho != f(p)
|
||||
bool incompressible() const
|
||||
{
|
||||
return (true);
|
||||
}
|
||||
|
||||
//- Return true if the equation of state is isochoric
|
||||
// i.e. rho = const
|
||||
bool isochoric() const
|
||||
{
|
||||
return (false);
|
||||
}
|
||||
|
||||
//- Return rho of the mixture
|
||||
virtual tmp<volScalarField> rho() const;
|
||||
|
||||
//- Return rho for patch
|
||||
virtual tmp<scalarField> rho(const label patchi) const;
|
||||
|
||||
//- Return Cp of the mixture
|
||||
virtual tmp<volScalarField> Cp() const;
|
||||
|
||||
//- Heat capacity at constant pressure for patch [J/kg/K]
|
||||
virtual tmp<scalarField> Cp
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
//- Return Cv of the mixture
|
||||
virtual tmp<volScalarField> Cv() const;
|
||||
|
||||
//- Heat capacity at constant volume for patch [J/kg/K]
|
||||
virtual tmp<scalarField> Cv
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchI
|
||||
) const;
|
||||
|
||||
//- Gamma = Cp/Cv []
|
||||
virtual tmp<volScalarField> gamma() const;
|
||||
|
||||
//- Gamma = Cp/Cv for patch []
|
||||
virtual tmp<scalarField> gamma
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
//- Heat capacity at constant pressure/volume [J/kg/K]
|
||||
virtual tmp<volScalarField> Cpv() const;
|
||||
|
||||
//- Heat capacity at constant pressure/volume for patch [J/kg/K]
|
||||
virtual tmp<scalarField> Cpv
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
//- Heat capacity ratio []
|
||||
virtual tmp<volScalarField> CpByCpv() const;
|
||||
|
||||
//- Heat capacity ratio for patch []
|
||||
virtual tmp<scalarField> CpByCpv
|
||||
(
|
||||
const scalarField& p,
|
||||
const scalarField& T,
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
//- Thermal diffusivity for temperature of mixture [J/m/s/K]
|
||||
virtual tmp<volScalarField> kappa() const;
|
||||
|
||||
//- Thermal diffusivity for temperature
|
||||
// of mixture for patch [J/m/s/K]
|
||||
virtual tmp<scalarField> kappa
|
||||
(
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
//- Effective thermal diffusivity for temperature
|
||||
// of mixture [J/m/s/K]
|
||||
virtual tmp<volScalarField> kappaEff
|
||||
(
|
||||
const volScalarField&
|
||||
) const;
|
||||
|
||||
//- Effective thermal diffusivity for temperature
|
||||
// of mixture for patch [J/m/s/K]
|
||||
virtual tmp<scalarField> kappaEff
|
||||
(
|
||||
const scalarField& alphat,
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
//- Effective thermal diffusivity of mixture [kg/m/s]
|
||||
virtual tmp<volScalarField> alphaEff
|
||||
(
|
||||
const volScalarField& alphat
|
||||
) const;
|
||||
|
||||
//- Effective thermal diffusivity of mixture for patch [kg/m/s]
|
||||
virtual tmp<scalarField> alphaEff
|
||||
(
|
||||
const scalarField& alphat,
|
||||
const label patchi
|
||||
) const;
|
||||
|
||||
|
||||
//- Correct the thermo fields
|
||||
virtual void correct();
|
||||
|
||||
//- Read properties
|
||||
virtual bool read();
|
||||
|
||||
|
||||
// Access to thermodynamic state variables
|
||||
|
||||
//- Return const-access to the saturation temperature
|
||||
const dimensionedScalar& TSat() const
|
||||
{
|
||||
return TSat_;
|
||||
}
|
||||
|
||||
//- Return transport properties dictionary
|
||||
const incompressibleTwoPhaseMixture& transportPropertiesDict()
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
//- Should the dpdt term be included in the enthalpy equation
|
||||
Switch pDivU() const
|
||||
{
|
||||
return pDivU_;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -130,6 +130,13 @@ Foam::tmp<Foam::scalarField> Foam::temperatureCoupledBase::kappa
|
||||
|
||||
return thermo.kappa(patchI);
|
||||
}
|
||||
else if (mesh.foundObject<basicThermo>(basicThermo::dictName))
|
||||
{
|
||||
const basicThermo& thermo =
|
||||
mesh.lookupObject<basicThermo>(basicThermo::dictName);
|
||||
|
||||
return thermo.kappa(patchI);
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalErrorInFunction
|
||||
|
||||
53
tutorials/multiphase/interCondensingEvaporatingFoam/0/T
Normal file
53
tutorials/multiphase/interCondensingEvaporatingFoam/0/T
Normal file
@ -0,0 +1,53 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class volScalarField;
|
||||
object Tair;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [0 0 0 1 0 0 0];
|
||||
|
||||
internalField uniform 368;
|
||||
|
||||
boundaryField
|
||||
{
|
||||
bottom
|
||||
{
|
||||
type zeroGradient;
|
||||
}
|
||||
top
|
||||
{
|
||||
type inletOutlet;
|
||||
inletValue $internalField;
|
||||
value $internalField;
|
||||
}
|
||||
left
|
||||
{
|
||||
type compressible::turbulentHeatFluxTemperature;
|
||||
heatSource flux;
|
||||
q uniform -40e3;
|
||||
kappa fluidThermo;
|
||||
kappaName none;
|
||||
value $internalField;
|
||||
}
|
||||
right
|
||||
{
|
||||
type zeroGradient;
|
||||
value $internalField;
|
||||
}
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
49
tutorials/multiphase/interCondensingEvaporatingFoam/0/U
Normal file
49
tutorials/multiphase/interCondensingEvaporatingFoam/0/U
Normal file
@ -0,0 +1,49 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format binary;
|
||||
class volVectorField;
|
||||
object U.air;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [0 1 -1 0 0 0 0];
|
||||
|
||||
internalField uniform (0 0 0);
|
||||
|
||||
boundaryField
|
||||
{
|
||||
bottom
|
||||
{
|
||||
type fixedValue;
|
||||
value $internalField;
|
||||
}
|
||||
top
|
||||
{
|
||||
type pressureInletOutletVelocity;
|
||||
value uniform (0 0 0);
|
||||
}
|
||||
left
|
||||
{
|
||||
type fixedValue;
|
||||
value $internalField;
|
||||
}
|
||||
right
|
||||
{
|
||||
type fixedValue;
|
||||
value $internalField;
|
||||
}
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
}
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,48 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class volScalarField;
|
||||
location "0";
|
||||
object alpha.liquid;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [0 0 0 0 0 0 0];
|
||||
|
||||
internalField uniform 0;
|
||||
|
||||
boundaryField
|
||||
{
|
||||
bottom
|
||||
{
|
||||
type zeroGradient;
|
||||
}
|
||||
top
|
||||
{
|
||||
type inletOutlet;
|
||||
inletValue $internalField;
|
||||
value $internalField;
|
||||
}
|
||||
left
|
||||
{
|
||||
type zeroGradient;
|
||||
}
|
||||
right
|
||||
{
|
||||
type zeroGradient;
|
||||
}
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
}
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
56
tutorials/multiphase/interCondensingEvaporatingFoam/0/k
Normal file
56
tutorials/multiphase/interCondensingEvaporatingFoam/0/k
Normal file
@ -0,0 +1,56 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class volScalarField;
|
||||
location "0";
|
||||
object k;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [ 0 2 -2 0 0 0 0 ];
|
||||
|
||||
internalField uniform 2e-3;
|
||||
|
||||
boundaryField
|
||||
{
|
||||
bottom
|
||||
{
|
||||
type kqRWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type inletOutlet;
|
||||
inletValue $internalField;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
left
|
||||
{
|
||||
type kqRWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type kqRWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
55
tutorials/multiphase/interCondensingEvaporatingFoam/0/nut
Normal file
55
tutorials/multiphase/interCondensingEvaporatingFoam/0/nut
Normal file
@ -0,0 +1,55 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class volScalarField;
|
||||
location "0";
|
||||
object nut;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [ 0 2 -1 0 0 0 0 ];
|
||||
|
||||
internalField uniform 0;
|
||||
|
||||
boundaryField
|
||||
{
|
||||
bottom
|
||||
{
|
||||
type nutkWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type calculated;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
left
|
||||
{
|
||||
type nutkWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type nutkWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
56
tutorials/multiphase/interCondensingEvaporatingFoam/0/omega
Normal file
56
tutorials/multiphase/interCondensingEvaporatingFoam/0/omega
Normal file
@ -0,0 +1,56 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class volScalarField;
|
||||
location "0";
|
||||
object omega;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [ 0 0 -1 0 0 0 0 ];
|
||||
|
||||
internalField uniform 1;
|
||||
|
||||
boundaryField
|
||||
{
|
||||
bottom
|
||||
{
|
||||
type omegaWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type inletOutlet;
|
||||
inletValue $internalField;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
left
|
||||
{
|
||||
type omegaWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type omegaWallFunction;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
59
tutorials/multiphase/interCondensingEvaporatingFoam/0/p_rgh
Normal file
59
tutorials/multiphase/interCondensingEvaporatingFoam/0/p_rgh
Normal file
@ -0,0 +1,59 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class volScalarField;
|
||||
object p_rgh;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [ 1 -1 -2 0 0 0 0 ];
|
||||
|
||||
internalField uniform 1e5;
|
||||
|
||||
boundaryField
|
||||
{
|
||||
bottom
|
||||
{
|
||||
type fixedFluxPressure;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type totalPressure;
|
||||
p0 $internalField;
|
||||
U U;
|
||||
phi phi;
|
||||
rho rho;
|
||||
psi none;
|
||||
gamma 1;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
left
|
||||
{
|
||||
type fixedFluxPressure;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type fixedFluxPressure;
|
||||
value $internalField;
|
||||
}
|
||||
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
9
tutorials/multiphase/interCondensingEvaporatingFoam/Allclean
Executable file
9
tutorials/multiphase/interCondensingEvaporatingFoam/Allclean
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # Run from this directory
|
||||
|
||||
# Source tutorial clean functions
|
||||
. $WM_PROJECT_DIR/bin/tools/CleanFunctions
|
||||
|
||||
cleanCase
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
12
tutorials/multiphase/interCondensingEvaporatingFoam/Allrun
Executable file
12
tutorials/multiphase/interCondensingEvaporatingFoam/Allrun
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # Run from this directory
|
||||
|
||||
# Source tutorial run functions
|
||||
. $WM_PROJECT_DIR/bin/tools/RunFunctions
|
||||
|
||||
application=`getApplication`
|
||||
|
||||
runApplication blockMesh
|
||||
runApplication $application
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
@ -0,0 +1,22 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class uniformDimensionedVectorField;
|
||||
location "constant";
|
||||
object g;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dimensions [0 1 -2 0 0 0 0];
|
||||
value (0 -9.81 0);
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,26 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object phaseChangeProperties;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
phaseChangeTwoPhaseModel constant;
|
||||
|
||||
constantCoeffs
|
||||
{
|
||||
coeffC coeffC [0 0 -1 -1 0 0 0] 250;
|
||||
coeffE coeffE [0 0 -1 -1 0 0 0] 250;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,21 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object transportProperties;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
TSat TSat [0 0 0 1 0] 366; // saturation temperature
|
||||
|
||||
pDivU true;
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,50 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object transportProperties;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
phases (liquid vapour);// FC-72
|
||||
|
||||
|
||||
sigma sigma [1 0 -2 0 0 0 0] 0.07;
|
||||
|
||||
liquid
|
||||
{
|
||||
transportModel Newtonian;
|
||||
nu nu [0 2 -1 0 0 0 0] 2.64e-7;
|
||||
rho rho [1 -3 0 0 0 0 0] 1583.4;
|
||||
|
||||
|
||||
Cp Cp [0 2 -2 -1 0 0 0] 1.1072e3;
|
||||
Cv cv [0 2 -2 -1 0 0 0] 1.1072e3; //assume Cp for liquid
|
||||
kappa kappa [1 1 -3 -1 0 0 0] 0.057;
|
||||
hf hf [0 2 -2 0 0 0 0] 0;
|
||||
}
|
||||
|
||||
vapour
|
||||
{
|
||||
transportModel Newtonian;
|
||||
nu nu [0 2 -1 0 0 0 0] 5e-7;
|
||||
rho rho [1 -3 0 0 0 0 0] 14.9;
|
||||
|
||||
|
||||
Cp Cp [0 2 -2 -1 0 0 0] 895.2; //FC72 vapour
|
||||
Cv Cv [0 2 -2 -1 0 0 0] 870.4; // Cv = Cp - R/w
|
||||
kappa kappa [1 1 -3 -1 0 0 0] 0.01; //FC72 vapour
|
||||
hf hf [0 2 -2 0 0 0 0] 93.0e3;
|
||||
}
|
||||
|
||||
Prt 0.7;
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,29 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "constant";
|
||||
object turbulenceProperties.air;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
simulationType RAS;
|
||||
|
||||
RAS
|
||||
{
|
||||
RASModel kOmega;
|
||||
|
||||
turbulence on;
|
||||
printCoeffs on;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,82 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object blockMeshDict;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
convertToMeters 1e-2;
|
||||
|
||||
vertices
|
||||
(
|
||||
(0 0 0)
|
||||
(0.2 0 0)
|
||||
(0.2 1 0)
|
||||
(0 1 0)
|
||||
(0 0 1)
|
||||
(0.2 0 1)
|
||||
(0.2 1 1)
|
||||
(0 1 1)
|
||||
);
|
||||
|
||||
blocks
|
||||
(
|
||||
hex (0 1 2 3 4 5 6 7) (60 50 1) simpleGrading (3 1 1)
|
||||
);
|
||||
|
||||
|
||||
boundary
|
||||
(
|
||||
bottom
|
||||
{
|
||||
type wall;
|
||||
faces
|
||||
(
|
||||
(1 5 4 0)
|
||||
);
|
||||
}
|
||||
top
|
||||
{
|
||||
type patch;
|
||||
faces
|
||||
(
|
||||
(3 7 6 2)
|
||||
);
|
||||
}
|
||||
left
|
||||
{
|
||||
type wall;
|
||||
faces
|
||||
(
|
||||
(0 4 7 3)
|
||||
);
|
||||
}
|
||||
right
|
||||
{
|
||||
type wall;
|
||||
faces
|
||||
(
|
||||
(2 6 5 1)
|
||||
);
|
||||
}
|
||||
frontAndBack
|
||||
{
|
||||
type empty;
|
||||
faces
|
||||
(
|
||||
(4 5 6 7)
|
||||
(0 1 2 3)
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,57 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object controlDict;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
application interCondensatingEvaporatingFoam;
|
||||
|
||||
startFrom startTime;
|
||||
|
||||
startTime 0;
|
||||
|
||||
stopAt endTime;
|
||||
|
||||
endTime 4;
|
||||
|
||||
deltaT 1e-5;
|
||||
|
||||
writeControl adjustableRunTime;
|
||||
|
||||
writeInterval 1e-1;
|
||||
|
||||
purgeWrite 0;
|
||||
|
||||
writeFormat ascii;
|
||||
|
||||
writePrecision 6;
|
||||
|
||||
writeCompression uncompressed;
|
||||
|
||||
timeFormat general;
|
||||
|
||||
timePrecision 6;
|
||||
|
||||
runTimeModifiable yes;
|
||||
|
||||
adjustTimeStep yes;
|
||||
|
||||
maxCo 6.0;
|
||||
|
||||
maxAlphaCo 6.0;
|
||||
|
||||
maxDeltaT 1e-2;
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,71 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object fvSchemes;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
ddtSchemes
|
||||
{
|
||||
default Euler;
|
||||
}
|
||||
|
||||
gradSchemes
|
||||
{
|
||||
default Gauss linear;
|
||||
}
|
||||
|
||||
divSchemes
|
||||
{
|
||||
default none;
|
||||
|
||||
div(rhoPhi,U) Gauss linear;
|
||||
div(phi,omega) Gauss linear;
|
||||
div(phi,k) Gauss linear;
|
||||
div(rhoPhi,e) Gauss linear;
|
||||
div(rhoPhi,K) Gauss upwind;
|
||||
div(phi,alpha) Gauss vanLeer;
|
||||
div(phirb,alpha) Gauss linear;
|
||||
div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
|
||||
div((muEff*dev(T(grad(U))))) Gauss linear;
|
||||
}
|
||||
|
||||
laplacianSchemes
|
||||
{
|
||||
default Gauss linear orthogonal;
|
||||
}
|
||||
|
||||
interpolationSchemes
|
||||
{
|
||||
default linear;
|
||||
}
|
||||
|
||||
snGradSchemes
|
||||
{
|
||||
default orthogonal;
|
||||
}
|
||||
|
||||
wallDist
|
||||
{
|
||||
method meshWave;
|
||||
}
|
||||
|
||||
fluxRequired
|
||||
{
|
||||
default none;
|
||||
p_rgh;
|
||||
alpha.liquid;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,130 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: plus |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object fvSolution;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
solvers
|
||||
{
|
||||
"alpha.liquid.*"
|
||||
{
|
||||
cAlpha 1;
|
||||
nAlphaCorr 2;
|
||||
nAlphaSubCycles 2;
|
||||
|
||||
MULESCorr yes;
|
||||
nLimiterIter 1;
|
||||
|
||||
solver smoothSolver;
|
||||
smoother symGaussSeidel;
|
||||
tolerance 1e-8;
|
||||
relTol 0;
|
||||
}
|
||||
|
||||
"U.*"
|
||||
{
|
||||
solver smoothSolver;
|
||||
smoother symGaussSeidel;
|
||||
tolerance 1e-7;
|
||||
relTol 0;
|
||||
};
|
||||
|
||||
p_rgh
|
||||
{
|
||||
solver GAMG;
|
||||
tolerance 1e-8;
|
||||
relTol 0.01;
|
||||
|
||||
smoother DICGaussSeidel;
|
||||
nPreSweeps 0;
|
||||
nPostSweeps 2;
|
||||
|
||||
cacheAgglomeration true;
|
||||
|
||||
nCellsInCoarsestLevel 10;
|
||||
agglomerator faceAreaPair;
|
||||
mergeLevels 1;
|
||||
};
|
||||
|
||||
p_rghFinal
|
||||
{
|
||||
solver PCG;
|
||||
preconditioner
|
||||
{
|
||||
preconditioner GAMG;
|
||||
|
||||
tolerance 1e-6;
|
||||
relTol 0;
|
||||
|
||||
nVcycles 2;
|
||||
|
||||
smoother DICGaussSeidel;
|
||||
nPreSweeps 0;
|
||||
nPostSweeps 2;
|
||||
nFinestSweeps 2;
|
||||
|
||||
cacheAgglomeration true;
|
||||
nCellsInCoarsestLevel 10;
|
||||
agglomerator faceAreaPair;
|
||||
mergeLevels 1;
|
||||
};
|
||||
tolerance 1e-9;
|
||||
relTol 0;
|
||||
maxIter 300;
|
||||
};
|
||||
|
||||
pcorr
|
||||
{
|
||||
$p_rgh;
|
||||
relTol 0;
|
||||
};
|
||||
|
||||
"e.*"
|
||||
{
|
||||
solver smoothSolver;
|
||||
smoother symGaussSeidel;
|
||||
tolerance 1e-7;
|
||||
relTol 0.0;
|
||||
}
|
||||
|
||||
"(k.*|omega.*|Theta.*).*"
|
||||
{
|
||||
solver PBiCG;
|
||||
preconditioner DILU;
|
||||
tolerance 1e-7;
|
||||
relTol 0;
|
||||
}
|
||||
}
|
||||
|
||||
PIMPLE
|
||||
{
|
||||
momentumPredictor false;
|
||||
nOuterCorrectors 1;
|
||||
nCorrectors 3;
|
||||
nNonOrthogonalCorrectors 0;
|
||||
}
|
||||
|
||||
relaxationFactors
|
||||
{
|
||||
fields
|
||||
{
|
||||
}
|
||||
equations
|
||||
{
|
||||
".*" 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user