ENH: Adding features for phase change solvers

1) Adding interfaceHeight FO
2) Adding interfaceHeatResistance mass transfer model to
   interCondensatingEvaporatingFoam with spread source approach
3) Reworking framework for icoReactingMultiphaseInterFoam
This commit is contained in:
sergio
2020-02-04 13:14:04 -08:00
committed by Mattijs Janssens
parent 2ee9315532
commit 499933dbab
85 changed files with 6616 additions and 548 deletions

View File

@ -115,4 +115,6 @@ zeroGradient/zeroGradient.C
stabilityBlendingFactor/stabilityBlendingFactor.C
interfaceHeight/interfaceHeight.C
LIB = $(FOAM_LIBBIN)/libfieldFunctionObjects

View File

@ -0,0 +1,289 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2017-2019 OpenFOAM Foundation
-------------------------------------------------------------------------------
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 "interfaceHeight.H"
#include "fvMesh.H"
#include "interpolation.H"
#include "IOmanip.H"
#include "meshSearch.H"
#include "midPointAndFaceSet.H"
#include "Time.H"
#include "uniformDimensionedFields.H"
#include "volFields.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace functionObjects
{
defineTypeNameAndDebug(interfaceHeight, 0);
addToRunTimeSelectionTable(functionObject, interfaceHeight, dictionary);
}
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::functionObjects::interfaceHeight::writePositions()
{
const uniformDimensionedVectorField& g =
mesh_.time().lookupObject<uniformDimensionedVectorField>("g");
vector gHat = vector::zero;
if (mag(direction_) > 0.0)
{
gHat = direction_/mag(direction_);
}
else
{
gHat = g.value()/mag(g.value());
}
const volScalarField& alpha =
mesh_.lookupObject<volScalarField>(alphaName_);
autoPtr<interpolation<scalar>>
interpolator
(
interpolation<scalar>::New(interpolationScheme_, alpha)
);
if (Pstream::master())
{
file(fileID::heightFile) << mesh_.time().timeName() << tab;
file(fileID::positionFile) << mesh_.time().timeName() << tab;
}
forAll(locations_, li)
{
// Create a set along a ray projected in the direction of gravity
const midPointAndFaceSet set
(
"",
mesh_,
meshSearch(mesh_),
"xyz",
locations_[li] + gHat*mesh_.bounds().mag(),
locations_[li] - gHat*mesh_.bounds().mag()
);
// Find the height of the location above the boundary
scalar hLB = set.size() ? - gHat & (locations_[li] - set[0]) : - GREAT;
reduce(hLB, maxOp<scalar>());
// Calculate the integrals of length and length*alpha along the sampling
// line. The latter is equal to the equivalent length with alpha equal
// to one.
scalar sumLength = 0, sumLengthAlpha = 0;
for(label si = 0; si < set.size() - 1; ++ si)
{
if (set.segments()[si] != set.segments()[si+1])
{
continue;
}
const vector& p0 = set[si], p1 = set[si+1];
const label c0 = set.cells()[si], c1 = set.cells()[si+1];
const label f0 = set.faces()[si], f1 = set.faces()[si+1];
const scalar a0 = interpolator->interpolate(p0, c0, f0);
const scalar a1 = interpolator->interpolate(p1, c1, f1);
const scalar l = - gHat & (p1 - p0);
sumLength += l;
sumLengthAlpha += l*(a0 + a1)/2;
}
reduce(sumLength, sumOp<scalar>());
reduce(sumLengthAlpha, sumOp<scalar>());
// Write out
if (Pstream::master())
{
// Interface heights above the boundary and location
const scalar hIB =
liquid_ ? sumLengthAlpha : sumLength - sumLengthAlpha;
const scalar hIL = hIB - hLB;
// Position of the interface
const point p = locations_[li] - gHat*hIL;
const Foam::Omanip<int> w = valueWidth(1);
file(fileID::heightFile) << w << hIB << w << hIL;
file(fileID::positionFile) << '(' << w << p.x() << w << p.y()
<< valueWidth() << p.z() << ") ";
}
}
if (Pstream::master())
{
file(fileID::heightFile).endl();
file(fileID::positionFile).endl();
}
}
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::functionObjects::interfaceHeight::writeFileHeader(const fileID i)
{
forAll(locations_, li)
{
writeHeaderValue
(
file(i),
"Location " + Foam::name(li),
locations_[li]
);
}
switch (fileID(i))
{
case fileID::heightFile:
writeHeaderValue
(
file(fileID::heightFile),
"hB",
"Interface height above the boundary"
);
writeHeaderValue
(
file(fileID::heightFile),
"hL",
"Interface height above the location"
);
break;
case fileID::positionFile:
writeHeaderValue(file(i), "p", "Interface position");
break;
}
const Foam::Omanip<int> w = valueWidth(1);
writeCommented(file(i), "Location");
forAll(locations_, li)
{
switch (fileID(i))
{
case fileID::heightFile:
file(i) << w << li << w << ' ';
break;
case fileID::positionFile:
file(i) << w << li << w << ' ' << w << ' ' << " ";
break;
}
}
file(i).endl();
writeCommented(file(i), "Time");
forAll(locations_, li)
{
switch (fileID(i))
{
case fileID::heightFile:
file(i) << w << "hB" << w << "hL";
break;
case fileID::positionFile:
file(i) << w << "p" << w << ' ' << w << ' ' << " ";
break;
}
}
file(i).endl();
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::functionObjects::interfaceHeight::interfaceHeight
(
const word& name,
const Time& runTime,
const dictionary& dict
)
:
fvMeshFunctionObject(name, runTime, dict),
logFiles(obr_, name),
alphaName_("alpha"),
liquid_(true),
locations_(),
interpolationScheme_("cellPoint"),
direction_(vector::zero)
{
read(dict);
resetNames({"height", "position"});
writeFileHeader(fileID::heightFile);
writeFileHeader(fileID::positionFile);
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::functionObjects::interfaceHeight::~interfaceHeight()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionObjects::interfaceHeight::read(const dictionary& dict)
{
dict.readIfPresent("alpha", alphaName_);
dict.readIfPresent("liquid", liquid_);
dict.lookup("locations") >> locations_;
dict.readIfPresent("interpolationScheme", interpolationScheme_);
dict.readIfPresent("direction", direction_);
return true;
}
bool Foam::functionObjects::interfaceHeight::execute()
{
return true;
}
bool Foam::functionObjects::interfaceHeight::end()
{
return true;
}
bool Foam::functionObjects::interfaceHeight::write()
{
logFiles::write();
writePositions();
return true;
}
// ************************************************************************* //

View File

@ -0,0 +1,181 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2017-2019 OpenFOAM Foundation
-------------------------------------------------------------------------------
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::functionObjects::interfaceHeight
Description
This function object reports the height of the interface above a set of
locations. For each location, it writes the vertical distance of the
interface above both the location and the lowest boundary. It also writes
the point on the interface from which these heights are computed. It uses
an integral approach, so if there are multiple interfaces above or below a
location then this method will generate average values.
Example of function object specification:
\verbatim
interfaceHeight1
{
type interfaceHeight;
libs ("libfieldFunctionObjects.so");
alpha alpha.water;
locations ((0 0 0) (10 0 0) (20 0 0));
}
\endverbatim
Usage
\table
Property | Description | Required | Default value
type | type name | yes |
alpha | name of the alpha field | no | alpha
locations | list of locations to report the height at | yes |
liquid | is the alpha field that of the liquid | no | true
direction | direction of interface | no | g
\endtable
SourceFiles
interfaceHeight.C
\*---------------------------------------------------------------------------*/
#ifndef interfaceHeight_H
#define interfaceHeight_H
#include "fvMeshFunctionObject.H"
#include "logFiles.H"
#include "point.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace functionObjects
{
/*---------------------------------------------------------------------------*\
Class interfaceHeight Declaration
\*---------------------------------------------------------------------------*/
class interfaceHeight
:
public fvMeshFunctionObject,
public logFiles
{
// Private Data
//- Name of the alpha field
word alphaName_;
//- Is the alpha field that of the liquid under the wave?
bool liquid_;
//- List of locations to report the height at
List<point> locations_;
//- Interpolation scheme
word interpolationScheme_;
//- Direction of interface motion
vector direction_;
// Private Member Functions
//- Output positions
void writePositions();
// Private Enumerations
//- File enumeration
enum class fileID
{
heightFile = 0,
positionFile = 1
};
Ostream& file(const fileID fid)
{
return logFiles::files(label(fid));
}
protected:
// Protected Member Functions
//- Output file header information
virtual void writeFileHeader(const fileID i);
public:
//- Runtime type information
TypeName("interfaceHeight");
// Constructors
//- Construct from Time and dictionary
interfaceHeight
(
const word& name,
const Time& runTime,
const dictionary& dict
);
//- Destructor
virtual ~interfaceHeight();
// Member Functions
//- Read
virtual bool read(const dictionary&);
//- Execute
virtual bool execute();
//- Execute at the final time-loop
virtual bool end();
//- Write
virtual bool write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace functionObjects
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //