mirror of
https://github.com/OpenFOAM/OpenFOAM-6.git
synced 2025-12-08 06:57:46 +00:00
This patch enables the reactingEulerFoam solvers to simulate polydisperse flow situations, i.e. flows where the disperse phase is subject to a size distribution. The newly added populationBalanceModel class solves the integro-partial differential population balance equation (PBE) by means of a class method, also called discrete or sectional method. This approach is based on discretizing the PBE over its internal coordinate, the particle volume. This yields a set of transport equations for the number concentration of particles in classes with a different representative size. These are coupled through their source-terms and solved in a segregated manner. The implementation is done in a way, that the total particle number and mass is preserved for coalescence, breakup and drift (i.e. isothermal growth or phase change) processes, irrespective of the chosen discretization over the internal coordinate. A population balance can be split over multiple velocity (temperature) fields, using the capability of reactingMultiphaseEulerFoam to solve for n momentum (energy) equations. To a certain degree, this takes into account the dependency of heat- and momentum transfer on the disperse phase diameter. It is also possible to define multiple population balances, e.g. bubbles and droplets simultaneously. The functionality can be switched on by choosing the appropriate phaseSystem type, e.g. populationBalanceMultiphaseSystem and the newly added diameterModel class called velocityGroup. To illustrate the use of the functionality, a bubbleColumnPolydisperse tutorial was added for reactingTwoPhaseEulerFoam and reactingMultiphaseEulerFoam. Furthermore, a reactingEulerFoam-specific functionObject called sizeDistribution was added to allow post-Processing of the size distribution, e.g. to obtain the number density function in a specific region. Patch contributed by Institute of Fluid Dynamics, Helmholtz-Zentrum Dresden - Rossendorf (HZDR) and VTT Technical Research Centre of Finland Ltd.
281 lines
7.3 KiB
C++
281 lines
7.3 KiB
C++
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
Class
|
|
Foam::functionObjects::sizeDistribution
|
|
|
|
Group
|
|
grpreactingEulerFoamFunctionObjects
|
|
|
|
Description
|
|
This function object calculates and outputs information on the
|
|
sizeDistribution as calculated by the populationBalanceModel class
|
|
implemented in the reactionEulerFoam solver suite. It is build up very
|
|
similar to the fieldValue/volRegion functionObjects, since it must be
|
|
possible to obtain information about the populationBalanceModel within a
|
|
defined region.
|
|
|
|
Example of function object specification:
|
|
\verbatim
|
|
box.all.numberDensity.volume.bubbles
|
|
{
|
|
type sizeDistribution;
|
|
libs ("libreactingEulerFoamFunctionObjects.so");
|
|
writeControl outputTime;
|
|
writeInterval 1;
|
|
log true;
|
|
...
|
|
functionType numberDensity;
|
|
abszissaType volume;
|
|
regionType all;
|
|
populationBalanceModel bubbles;
|
|
normalize true;
|
|
}
|
|
\endverbatim
|
|
|
|
Usage
|
|
\table
|
|
Property | Description | Required | Default value
|
|
type | type name: sizeDistribution | yes |
|
|
functionType | numberDensity, volumeDensity, numberConcentration,
|
|
moments | yes |
|
|
abszissaType | volume, diameter | yes |
|
|
momentOrder | Write moment up to given order | no | 0
|
|
regionType | Evaluate for cellZone or entire mesh | yes |
|
|
cellZoneName | Required if regionType is cellZone | |
|
|
populationBalanceModel | Respective populationBalanceModel | yes |
|
|
normalize | Normalization | no |
|
|
\endtable
|
|
|
|
See also
|
|
Foam::diameterModels::populationBalanceModel
|
|
Foam::functionObjects::fvMeshFunctionObject
|
|
Foam::functionObjects::logFiles
|
|
Foam::functionObject
|
|
|
|
SourceFiles
|
|
sizeDistribution.C
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef functionObjects_sizeDistribution_H
|
|
#define functionObjects_sizeDistribution_H
|
|
|
|
#include "fvMeshFunctionObject.H"
|
|
#include "logFiles.H"
|
|
#include "populationBalanceModel.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
|
|
// Forward declaration of classes
|
|
class fvMesh;
|
|
|
|
namespace functionObjects
|
|
{
|
|
|
|
/*---------------------------------------------------------------------------*\
|
|
Class sizeDistribution Declaration
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
class sizeDistribution
|
|
:
|
|
public fvMeshFunctionObject,
|
|
public logFiles
|
|
{
|
|
|
|
public:
|
|
|
|
// Public data types
|
|
|
|
//- Region type enumeration
|
|
enum regionTypes
|
|
{
|
|
rtCellZone,
|
|
rtAll
|
|
};
|
|
|
|
//- Region type names
|
|
static const NamedEnum<regionTypes, 2> regionTypeNames_;
|
|
|
|
|
|
//- Function type enumeration
|
|
enum functionTypes
|
|
{
|
|
ftNdf,
|
|
ftVdf,
|
|
ftNc,
|
|
ftMom
|
|
};
|
|
|
|
//- Function type names
|
|
static const NamedEnum<functionTypes, 4> functionTypeNames_;
|
|
|
|
|
|
//- abszissa type enumeration
|
|
enum abszissaTypes
|
|
{
|
|
atDiameter,
|
|
atVolume,
|
|
};
|
|
|
|
//- Abszissa type names
|
|
static const NamedEnum<abszissaTypes, 2> abszissaTypeNames_;
|
|
|
|
|
|
protected:
|
|
|
|
// Protected data
|
|
|
|
//- Construction dictionary
|
|
dictionary dict_;
|
|
|
|
//- Region type
|
|
regionTypes regionType_;
|
|
|
|
//- Name of region
|
|
word regionName_;
|
|
|
|
//- Function type
|
|
functionTypes functionType_;
|
|
|
|
//- Abszissa type
|
|
abszissaTypes abszissaType_;
|
|
|
|
//- Global number of cells
|
|
label nCells_;
|
|
|
|
//- Local list of cell IDs
|
|
labelList cellId_;
|
|
|
|
//- Total volume of the evaluated region
|
|
scalar volume_;
|
|
|
|
//- Optionally write the volume of the sizeDistribution
|
|
bool writeVolume_;
|
|
|
|
//- PopulationBalance
|
|
const Foam::diameterModels::populationBalanceModel& popBal_;
|
|
|
|
//- Number concentrations
|
|
List<scalar> N_;
|
|
|
|
//- Write moments up to spezified order with respect to abszissaType
|
|
label momentOrder_;
|
|
|
|
//- Normalization switch
|
|
const Switch normalize_;
|
|
|
|
//- Sum of number concentrations
|
|
scalar sumN_;
|
|
|
|
//- Volumertic sum
|
|
scalar sumV_;
|
|
|
|
|
|
// Protected Member Functions
|
|
|
|
//- Initialise, e.g. cell addressing
|
|
void initialise(const dictionary& dict);
|
|
|
|
//- Set cells to evaluate based on a cell zone
|
|
void setCellZoneCells();
|
|
|
|
//- Calculate and return volume of the evaluated cell zone
|
|
scalar volume() const;
|
|
|
|
//- Combine fields from all processor domains into single field
|
|
void combineFields(scalarField& field);
|
|
|
|
//- Filter field according to cellIds
|
|
tmp<scalarField> filterField(const scalarField& field) const;
|
|
|
|
//- Output file header information
|
|
virtual void writeFileHeader(const label i);
|
|
|
|
|
|
public:
|
|
|
|
//- Runtime type information
|
|
TypeName("sizeDistribution");
|
|
|
|
|
|
// Constructors
|
|
|
|
//- Construct from Time and dictionary
|
|
sizeDistribution
|
|
(
|
|
const word& name,
|
|
const Time& runTime,
|
|
const dictionary& dict
|
|
);
|
|
|
|
|
|
//- Destructor
|
|
virtual ~sizeDistribution();
|
|
|
|
|
|
// Member Functions
|
|
|
|
//- Return the reference to the construction dictionary
|
|
const dictionary& dict() const
|
|
{
|
|
return dict_;
|
|
}
|
|
|
|
//- Return the local list of cell IDs
|
|
const labelList& cellId() const
|
|
{
|
|
return cellId_;
|
|
}
|
|
|
|
//- Helper function to return the reference to the mesh
|
|
const fvMesh& mesh() const
|
|
{
|
|
return refCast<const fvMesh>(obr_);
|
|
}
|
|
|
|
//- Read from dictionary
|
|
virtual bool read(const dictionary& dict);
|
|
|
|
//- Execute
|
|
virtual bool execute();
|
|
|
|
//- Write
|
|
virtual bool write();
|
|
};
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
} // End namespace functionObjects
|
|
} // End namespace Foam
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#endif
|
|
|
|
// ************************************************************************* //
|