This is Part 9b of a series.
In Part 9a, I reported that
the Julia package Clapeyron.jl did not have a flash procedure
implemented. Recently, I was contacted by one of the package authors to inform me 
that a flash algorithm has been added; the focus of this post will be to check its
performance against my flash benchmarks
for mixtures containing methane and helium.
The first step is to obtain the latest version of the package 
(at the time of writing this is 0.3.6):
  ] add https://github.com/ypaul21/Clapeyron.jl#master
  using Clapeyron
  model = GERG2008(["helium","nitrogen"])
  (x,n,G) = tp_flash(model,2e6,90,[0.5,0.5])
([0.9616497782871675 0.038350221712832484; 0.09980808558719821 0.9001919144128017], [0.44653730380779205 0.01780773519709112; 0.05346269619220795 0.4821922648029089], -2.010398635641377)
I tried using the following code to run the flash against the benchmarks:
using Clapeyron
using CSV
model = Clapeyron.GERG2008(["methane","helium"])
file = "test\\flash_benchmark_GERG2008_methane+helium.csv"
for row in CSV.File(file)
    z = [row.z1, 1-row.z1]
    (x,ϕ,G) = Clapeyron.tp_flash(model,row.p*1e3,row.T,z)
    if (abs(x[1,1]-row.x1)>2.e-6 && abs(x[2,1]-row.x1)>2.e-6) || 
       (abs(x[2,1]-row.y1)>2.e-6 && abs(x[1,1]-row.y1)>2.e-6)
        @info row
    end
end
tp_flash indicates that the method being used is 
named DETPFlash. Its documentation begins:
  DETPFlash(;
      numphases = 2;
      max_steps = 1e4*(numphases-1),
      population_size =20,
      time_limit = Inf,
      verbose = false, 
      logspace = false
  )
so it should be possible to set a limit on the time like so (indicated in bold):
for row in CSV.File(file)
    z = [row.z1, 1-row.z1]
    (x,ϕ,G) = Clapeyron.tp_flash(model,row.p*1e3,row.T,z,DETPFlash(time_limit=4))
    if (abs(x[1,1]-row.x1)>2.e-6 && abs(x[2,1]-row.x1)>2.e-6) || 
       (abs(x[2,1]-row.y1)>2.e-6 && abs(x[1,1]-row.y1)>2.e-6)
        @info row
    end
end
I observe no common feature to all of the failure cases: several of them appear to be returning a phase composition that is essentially pure methane or pure helium; some of the failure cases are reaching the allotted time limit (even when increased to 10 seconds) but so are some of the successful cases.
As noted above, some cases are timing out after 10 seconds. However, even those that terminate on their own are taking more than 1 second, with some exceeding 6 seconds. For comparison, my flash algorithm can return in under 4 milliseconds. The speed of the calculations is an issue, especially if the results are incorrect about 25 % of the time.
Overall, the flash algorithm in Clapeyron.jl is unreliable and slow
when applied to mixtures of methane and helium modelled with the GERG-2008 EOS.
As I have detailed in this series, helium presents unique challenges for the flash
so it is possible that the algorithm performs better on other systems.
I have not spent any time trying to debug the failures I observed. However, if 
some additional information had been returned from the flash it could have
facilitated that effort, e.g.:
[1] Kunz and Wagner, J. Chem. Eng. Data, 2012, 57, 3032 (link to publisher)
[2] Span et al., TREND. Thermodynamic Reference and Engineering Data 4.0. Lehrstuhl für Thermodynamik, Ruhr-Universität Bochum, 2019
| Go to Home | How to cite this page | Permalink to this page |