Close

24th March 2021

Population Balance Modelling in OpenFOAM


Guide to CFD for Polydisperse Flows

  1. Disperse Multiphase Flows
  2. Polydisperse Multiphase Flows
  3. Population Balance Modelling
  4. 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 particles
  • binaryBreakupModels provide a single expression for the breakup frequency and resulting particle fragment size but only for binary breakup; i.e. into two fragments
  • breakupModels 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.