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 the process and energy industries. These flows can be simulated with computational fluid dynamics using suitable models. OpenFOAM includes the multiphaseEulerFoam solver 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.

Phase system configuration

In a multiphaseEulerFoam simulation, the user must specify a phase system which describes the fluid phases and the package of models for transfer of mass, momentum and energy between them. The phase system is specified through the type keyword entry in the phaseProperties case input file. The available phase systems are compiled from the multiphaseSystems.C file in the multiphaseEulerFoam source code, which can be listed by typing:

find $FOAM_SOLVERS -name multiphaseSystems.C -type f | xargs grep -h "System;"

They include, for example, the basicMultiphaseSystem which provides momentum and heat transfer modelling between phases. The phases are listed by the phases keyword, followed by sub-dictionaries to specify the modelling of each named phase, e.g.

type    basicMultiphaseSystem;
phases (air water ...); 
air
{
    diameterModel   constant;
    ...

The phaseProperties file then includes configurations for the models for mass, momentum and heat transfer between a pair of phases. These models depend on particle size which in turn is computed according to the model specified through the diameterModel keyword.

Population balance phase systems

The population balance functionality is available by selecting a phase system that includes it from the following:

  • populationBalanceMultiphaseSystem, with basic momentum and heat transfer with population balance;
  • thermalPhaseChangePopulationBalanceMultiphaseSystem, as above but with additional thermal phase change.

One or more population balances are then named within the populationBalances list, with models describing processes such as coalescence or breakup defined subsequently under the populationBalanceCoeffs sub-dictionary, e.g.

populationBalances (bubbles ...);
populationBalanceCoeffs
{
    bubbles
    {
        continuousPhase water;
        coalescenceModels
        (
            LehrMilliesMewes{}
        );
        binaryBreakupModels
        (
            LehrMilliesMewes{}
        );
        breakupModels();
        driftModels
        (
            densityChange{}
        );
        nucleationModels();
    }
    ...
}

Particle breakup is an important area of modelling relating to particle size distribution. Two categories of models are available, listed below.

  • 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.

Other models are available, including the following.

  • nucleationModel, to simulate wall boiling or reaction-driven phase transfer.
  • driftModels for particle growth or surface loss due to density or phase changes.

Subdivision into size groups

The method of classes subdivides a population of particles into size groups, i.e groups of particles with common representative sizes. Size groups are specified in the sub-dictionary of the corresponding dispersed phase by selecting velocityGroup as the diameterModel, e.g.

air
{
    diameterModel   velocityGroup;
    velocityGroupCoeffs
    {
        populationBalance bubbles;
        shapeModel spherical;
        sizeGroups
        (
            f1 {dSph 1e-3; value 1.0;}
            f2 {dSph 2e-3; value 0.0;}
            f3 {dSph 3e-3; value 0.0;}
            ...
        );
    }
    ...

Each size group is assigned a representative sphere-equivalent diameter along with a value that is used for initialization of the corresponding field as well as at all inlet boundaries. The value entries must sum up to unity for each phase. The individual size group fraction fields are generated using the boundary conditions specified in a  f.<phaseName> field in the start time directory. In most cases the boundary conditions are identical to those specified in the phase fraction field alpha.<phaseName>. Size group fraction fields that are present in the “latest” time directory, e.g. upon restart of a simulation, take precedence over the settings in the phaseProperties file.

Solution and data processing

Each population balance requires a separate solution control dictionary in fvSolution to specify solver settings and algorithm controls for size group fraction fields. Discretisation schemes for size group fractions are specified in fvSchemes. Population balance modelling provides a bespoke sizeDistribution function object which extracts the particle size distribution in a selected region for detailed post-processing and comparisons against experimental data. Another function object named moments allows to extract integral and mean properties from a size distribution.

Examples

Tutorials cases have been added that demonstrate the functionality:

  • $FOAM_TUTORIALS/modules/multiphaseEuler/bubblePipe
  • $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 in

  • $WM_PROJECT_DIR/test/multiphase/multiphaseEuler/populationBalance

which solve the population balance equation standalone and compare the result against an exact solution.