Population Balance Modelling in OpenFOAM
Guide to CFD for Polydisperse Flows
- Disperse Multiphase Flows
- Polydisperse Multiphase Flows
- Population Balance Modelling
- Population Balance Modelling in OpenFOAM
Polydisperse multiphase flows occur in many areas of engineering, particularly within the process and energy industries. These flows can be simulated with computational fluid dynamics using suitable models. OpenFOAM includes the multiphaseEuler solver module for dispersed multiphase flows which includes a population balance model for the particle size distribution, based on the method of classes.
Note: The content of this article applies to OpenFOAM-dev.
Phases
In a multiphaseEuler simulation, the first thing that must be configured is the set of phases that are present in the domain. A list of the phases’ names is specified with the phases entry in the constant/phaseProperties
case input file. Each of the named phases then has their own sub-dictionary in which its own modelling is specified. For example:
phases (air water); air { type purePhaseModel; diameterModel { type constant; d 1e-3; } residualAlpha 1e-6; } water { type purePhaseModel; diameterModel none; residualAlpha 1e-6; }
The type
of a phase determines what fundamental properties it solves for. A purePhaseModel
is a standard fluid with velocity and temperature, and for
which the momentum and energy equations are solved, but a pureIsothermalPhaseModel
, by contrast, will have a constant temperature and does not solve an energy equation. Many more options exist. A full list of available phase models can be obtained by running:
foamToC -table phaseModel
The diameterModel
defines the diameter, and more generally the geometry of individual particles (or bubbles, droplets, or similar) of the phase. In the simplest case of constant diameter spherical particles, a constant
model can be selected and a fixed diameter specified. A none
diameter model indicates that this phase is expected to be continuous and not form particles. If a none
diameter model is selected for a phase and then another model then requests the diameter of the phase then an error will be generated. Again, foamToC
can be used to list all the available diameter models.
The residualAlpha
parameter is then a numerical control that represents what amount of the phase is considered negligible from the perspective of sub-modelling.
Population balance diameter model
The constant
diameter model defines a monodisperse phase; i.e., one in which the particles are of a uniform size. Alternatively, a phase can be polydisperse and contain a distribution of particle sizes. This is achieved by selecting the populationBalance
diameter model:
air { type purePhaseModel; diameterModel { type populationBalance; populationBalance bubbles; nGroups 5; } residualAlpha 1e-6; }
As well as selecting the population balance diameter model type, the name of the population balance must then be specified with the populationBalance
keyword. In this example the population balance is named “bubbles”.
Multiple phases can be part of the same population balance if they specify the same population balance name in their configuration. In this case, the phases are not physically distinct substances; they are just different ranges of the size-distribution space. If a population balance contains two phases, for example, then the first phase will be used to represent the half of the size distribution corresponding to the smaller diameters, and the second phase will be used for the larger diameters. The physical properties of such phases should be identical.
Subdivision into groups
The population balance diameter model also requires a number of groups to be set using the nGroups
keyword. Population balance, and class methods in general, approximate the distribution of particle sizes with a discrete number of groups, each with a uniform representative size. The nGroups
setting in the population balance diameter model defines how many such groups are used to represent the size distribution of each phase. The total number of groups in a population balance is equal to the sum of the number of groups used in each associated phase.
Population balances
If any phase chooses the population balance diameter model, then another sub-dictionary must be provided within constant/phaseProperties
to specify the modelling for the named population balance. For example, if the diameter model specifies a population balance named “bubbles” (as in the above example) then the following sub-dictionary could be provided:
bubbles { continuousPhase water; sphericalDiameters { type uniform; min 1e-3; max 12e-3; } shapeModel spherical; coalescenceModels ( LehrMilliesMewes {} ); binaryBreakupModels ( LehrMilliesMewes {} ); breakupModels (); }
The continuousPhase
setting defines which phase surrounds the bubbles. In this example this is the water
phase.
The sphericalDiameters
sub-dictionary defines the representative sizes of the groups across the whole population balance, potentially spanning multiple phases. If minimum and maximum diameters are given, then the type
entry determines how the intermediate values are distributed. uniform
will space them uniformly, and exponential
will space them in proportion to their value. There is also a manual
option which allows the spherical diameter values to be listed directly.
The shapeModel
determines the geometry of the individual bubbles. In this case the bubbles are assumed to be spherical.
Finally, a number of models entries then define how the bubbles interact and hence how the distribution evolves in time. There are three such categories of model:
coalsescenceModels
provide an expression for the rate at which particles of a given size combine to create larger particlesbinaryBreakupModels
provide a single expression for the breakup frequency and resulting particle fragment size but only for binary breakup; i.e. into two fragmentsbreakupModels
allow particle breakup into two or more fragments using a “total” frequency based on particle size, but require another probability distribution function to calculate the size distribution of particle fragments
In this case the LehrMilliesMewes
models have been selected to represent coalescence and binary breakup.
Lists of all the available models can be obtained by running:
foamToC -table coalescenceModel foamToC -table binaryBreakupModel foamToC -table breakupModel
And information about individual models can then be obtained using the foamInfo
command; e.g.:
foamInfo LehrMilliesMewes
Group fractions
Each group has a fraction field f<index>.<phase>
which represents the volume fraction of that group within the phase. These fractions should sum to one within each phase. The fields are indexed over the population balance, potentially across multiple phases (e.g., f0.air1
, f1.air1
, f2.air1
, f3.air2
, f4.air2
, f5.air3
, etc…).
If when a simulation is started a fraction field is not found, then it will be constructed from the fDefault.<phase>
file. This is the same mechanism as is used to construct species’ mass fraction fields, and it prevents the need to manually construct a large number of fields. The boundary and source conditions of these fields are almost always identical, so the fDefault.<phase>
file is usually sufficient to construct all the group fraction fields without modification. The only common exception to this uniformity is the initial value. It is often needed to set the initial value of the group fractions in such a way as to initialise a given size or size distribution in the domain. This is most conveniently achieved by still only creating a fDefault.<phase>
file and then using the populationBalanceSetSizeDistribution
function object to set the initial values. This function can be called as follows:
foamPostProcess \ -solver multiphaseEuler \ -func "populationBalanceSetSizeDistribution ( populationBalance=bubbles, file=distribution.dat )"
This will set the group fraction values in the bubbles population balance so that it best represents the distribution defined by a table of the PDF in the file distribution.dat
. This function also has additional options for analytical (rather than tabulated) distributions, for specifying what moment the distribution relates to, and more. If foamGet
is used to make a local copy of the function then these options can be viewed and edited as appropriate.
Solution control
Each population balance requires a separate solution control dictionary in system/fvSolution
to specify solver settings and algorithm controls for the group fraction fields. Discretisation schemes for size group fractions are specified in system/fvSchemes
. Examples of appropriate controls can be found in tutorial cases.
Post-processing
A populationBalanceSizeDistribution
function object is provided which extracts the particle size distribution in a selected region for detailed post-processing and comparisons against experimental data.
A populationBalanceMoments
function is also available which extracts and reports integral and mean properties from the distribution.
Examples
Tutorials cases have been added that demonstrate the functionality:
$FOAM_TUTORIALS/modules/multiphaseEuler/bubblePipe
$FOAM_TUTORIALS/modules/multiphaseEuler/pipeBend
$FOAM_TUTORIALS/modules/multiphaseEuler/titaniaSynthesis
$FOAM_TUTORIALS/modules/multiphaseEuler/wallBoilingPolydisperse
Interested users can also study the functionality by looking at the single cell test cases provided:
$WM_PROJECT_DIR/test/multiphase/multiphaseEuler/populationBalance
These tests solve the population balance equations without the added complication of solving a three-dimensional flow field, and compare the results against analytical, experimental or otherwise accepted solutions.