This package implements several equations of state for multicomponent vapor-liquid equilibrium, also called flash, for mixtures. These can be used to determine vapor fractions, molar partition between the phases and predict properties such as density and volume.
The following equations of state (EOS) are implemented as a class of generic cubics:
The code is fully type stable, easy to use and fairly performant, with additional options to avoid allocations if you need to perform many flashes. The main implementation goal is to have a compact, performant and easy to use code suitable for integration in simulators of multiphase flow.
We highlight a few of the features. For more details, please see the API and the Basic usage examples.
- Support for different solution methods (successive substition (SSI), Newton, SSI+Newton) and type dispatch makes it easy for users to add their own.
- User friendly interface - with options to pre-allocate for increase performance.
- Compatible with AD. Mostly tested with
ForwardDiff
. - Phase stability test.
- Rachford-Rice for constant K-values.
- Useful utilities for molar density, molar volume, single-phase liquid-vapor estimation and Lohrenz-Bray-Clark viscosity correlations that are compatible with custom types and AD.
For more details, please see the documentation
We solve the Rachford-Rice equations:
using MultiComponentFlash
K = [0.1, 9.0] # K-values
z = [0.7, 0.3] # Mole fractions
V = solve_rachford_rice(K, z)
V
now holds the vapor fraction:
0.24583333333333332
Solve vapor-liquid equilibrium with a two-component mixture and the Peng-Robinson equation of state:
props = MolecularProperty.(["Methane", "n-Decane"])
mixture = MultiComponentMixture(props)
eos = GenericCubicEOS(mixture, PengRobinson())
# Define conditions to flash at
p = 5e6 # 5 000 000 Pa, or 50 bar
T = 303.15 # 30 °C = 303.15 °K
z = [0.4, 0.6] # 4 mole methane per 6 moles of decane
conditions = (p = p, T = T, z = z)
# Perform a flash to get the vapor fraction
V = flash_2ph(eos, conditions)
julia> V
0.20785284212697513
If we also want to know how the components are partitioned in the two phases, we can turn on the extra_out
flag.
V, K, = flash_2ph(eos, conditions, extra_out = true)
x = liquid_mole_fraction.(z, K, V)
y = vapor_mole_fraction.(z, K, V)
julia> x
2-element Vector{Float64}:
0.24266084237653415
0.7573391576234659
julia> y
2-element Vector{Float64}:
0.999634651410856
0.00036534858914410106
julia> K
2-element Vector{Float64}:
4.119472435769978
0.00048241080032170367
More examples, and details are found in the documentation. Here is a p-T phase diagram for methane, n-decane and carbon dioxide found in the advanced examples: