distillation#
- class Distillation(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]#
Abstract distillation column class. The Murphree efficiency is based on the modified O’Connell correlation [2]. The diameter is based on tray separation and flooding velocity [1] [3]. Purchase costs are based on correlations compiled by Warren et. al. [4].
- Parameters:
ins (
Stream
], optional) – Inlet fluids to be mixed into the feed stage.outs (
Stream
], optional) –[0] Distillate
[1] Bottoms product
y_top (float) – Molar fraction of light key to the light and heavy keys in the distillate.
x_bot (float) – Molar fraction of light key to the light and heavy keys in the bottoms product.
Lr (float) – Recovery of the light key in the distillate.
Hr (float) – Recovery of the heavy key in the bottoms product.
k (float) – Ratio of reflux to minimum reflux.
Rmin (float, optional) – User enforced minimum reflux ratio. If the actual minimum reflux ratio is more than Rmin, this enforced value is ignored. Defaults to 0.3.
product_specification_format=None ("Composition" or "Recovery") – If composition is used, y_top and x_bot must be specified. If recovery is used, Lr and Hr must be specified.
P=101325 (float) – Operating pressure [Pa].
vessel_material (str, optional) – Vessel construction material. Defaults to ‘Carbon steel’.
tray_material (str, optional) – Tray construction material. Defaults to ‘Carbon steel’.
tray_type='Sieve' ('Sieve', 'Valve', or 'Bubble cap') – Tray type.
tray_spacing=450 (float) – Typically between 152 to 915 mm.
stage_efficiency=None – User enforced stage efficiency. If None, stage efficiency is calculated by the O’Connell correlation [2].
velocity_fraction=0.8 (float) – Fraction of actual velocity to maximum velocity allowable before flooding.
foaming_factor=1.0 (float) – Must be between 0 to 1.
open_tray_area_fraction=0.1 (float) – Fraction of open area to active area of a tray.
downcomer_area_fraction=None (float) – Enforced fraction of downcomer area to net (total) area of a tray. If None, estimate ratio based on Oliver’s estimation [1].
is_divided=False (bool) – True if the stripper and rectifier are two separate columns.
- class BinaryDistillation(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]#
Create a binary distillation column that assumes all light and heavy non keys separate to the top and bottoms product respectively. McCabe-Thiele analysis is used to find both the number of stages and the reflux ratio given a ratio of actual reflux to minimum reflux [1]. This assumption is good for both binary distillation of highly polar compounds and ternary distillation assuming complete separation of light non-keys and heavy non-keys with large differences in boiling points. Preliminary analysis showed that the theoretical number of stages using this method on Methanol/Glycerol/Water systems is off by less than +-1 stage. Other methods, such as the Fenske-Underwood-Gilliland method, are more suitable for hydrocarbons. The Murphree efficiency is based on the modified O’Connell correlation [2]. The diameter is based on tray separation and flooding velocity [1] [3]. Purchase costs are based on correlations compiled by Warren et. al. [4].
- Parameters:
ins (
Stream
], optional) – Inlet fluids to be mixed into the feed stage.outs (
Stream
], optional) –[0] Distillate
[1] Bottoms product
y_top (float) – Molar fraction of light key to the light and heavy keys in the distillate.
x_bot (float) – Molar fraction of light key to the light and heavy keys in the bottoms product.
Lr (float) – Recovery of the light key in the distillate.
Hr (float) – Recovery of the heavy key in the bottoms product.
k (float) – Ratio of reflux to minimum reflux.
Rmin (float, optional) – User enforced minimum reflux ratio. If the actual minimum reflux ratio is more than Rmin, this enforced value is ignored. Defaults to 0.3.
product_specification_format=None ("Composition" or "Recovery") – If composition is used, y_top and x_bot must be specified. If recovery is used, Lr and Hr must be specified.
P=101325 (float) – Operating pressure [Pa].
vessel_material (str, optional) – Vessel construction material. Defaults to ‘Carbon steel’.
tray_material (str, optional) – Tray construction material. Defaults to ‘Carbon steel’.
tray_type='Sieve' ('Sieve', 'Valve', or 'Bubble cap') – Tray type.
tray_spacing=450 (float) – Typically between 152 to 915 mm.
stage_efficiency=None – User enforced stage efficiency. If None, stage efficiency is calculated by the O’Connell correlation [2].
velocity_fraction=0.8 (float) – Fraction of actual velocity to maximum velocity allowable before flooding.
foaming_factor=1.0 (float) – Must be between 0 to 1.
open_tray_area_fraction=0.1 (float) – Fraction of open area to active area of a tray.
downcomer_area_fraction=None (float) – Enforced fraction of downcomer area to net (total) area of a tray. If None, estimate ratio based on Oliver’s estimation [1].
is_divided=False (bool) – True if the stripper and rectifier are two separate columns.
Examples
Binary distillation assuming 100% separation on non-keys:
>>> from biosteam.units import BinaryDistillation >>> from biosteam import Stream, settings >>> settings.set_thermo(['Water', 'Methanol', 'Glycerol'], cache=True) >>> feed = Stream('feed', flow=(80, 100, 25)) >>> bp = feed.bubble_point_at_P() >>> feed.T = bp.T # Feed at bubble point T >>> D1 = BinaryDistillation('D1', ins=feed, ... outs=('distillate', 'bottoms_product'), ... LHK=('Methanol', 'Water'), ... y_top=0.99, x_bot=0.01, k=2, ... is_divided=True) >>> D1.simulate() >>> # See all results >>> D1.show(T='degC', P='atm', composition=True) BinaryDistillation: D1 ins... [0] feed phase: 'l', T: 76.082 degC, P: 1 atm composition (%): Water 39 Methanol 48.8 Glycerol 12.2 -------- 205 kmol/hr outs... [0] distillate phase: 'g', T: 64.854 degC, P: 1 atm composition (%): Water 1 Methanol 99 -------- 100 kmol/hr [1] bottoms_product phase: 'l', T: 100.02 degC, P: 1 atm composition (%): Water 75.4 Methanol 0.761 Glycerol 23.9 -------- 105 kmol/hr >>> D1.results() Divided Distillation Column Units D1 Electricity Power kW 0.644 Cost USD/hr 0.0504 Cooling water Duty kJ/hr -4.88e+06 Flow kmol/hr 3.33e+03 Cost USD/hr 1.63 Low pressure steam Duty kJ/hr 1.02e+07 Flow kmol/hr 263 Cost USD/hr 62.6 Design Theoretical feed stage 9 Theoretical stages 13 Minimum reflux Ratio 0.687 Reflux Ratio 1.37 Rectifier stages 15 Stripper stages 13 Rectifier height ft 34.7 Stripper height ft 31.7 Rectifier diameter ft 3.93 Stripper diameter ft 3.19 Rectifier wall thickness in 0.312 Stripper wall thickness in 0.312 Rectifier weight lb 6e+03 Stripper weight lb 4.43e+03 Purchase cost Rectifier trays USD 1.5e+04 Stripper trays USD 1.25e+04 Rectifier tower USD 4.56e+04 Stripper platform and ladders USD 1.39e+04 Stripper tower USD 3.83e+04 Rectifier platform and ladders USD 1.14e+04 Condenser - Floating head USD 3.33e+04 Reflux drum - Horizontal pressur... USD 1.02e+04 Reflux drum - Platform and ladders USD 3.02e+03 Pump - Pump USD 4.37e+03 Pump - Motor USD 368 Reboiler - Floating head USD 2.71e+04 Total purchase cost USD 2.15e+05 Utility cost USD/hr 64.3
Binary distillation with full-condenser
>>> from biosteam.units import BinaryDistillation >>> from biosteam import Stream, settings >>> settings.set_thermo(['Water', 'Methanol', 'Glycerol'], cache=True) >>> feed = Stream('feed', flow=(80, 100, 25)) >>> bp = feed.bubble_point_at_P() >>> feed.T = bp.T # Feed at bubble point T >>> D1 = BinaryDistillation('D1', ins=feed, ... outs=('distillate', 'bottoms_product'), ... LHK=('Methanol', 'Water'), ... y_top=0.99, x_bot=0.01, k=2, ... partial_condenser=False, ... is_divided=False) >>> D1.simulate() >>> # See all results >>> D1.results() Distillation Column Units D1 Electricity Power kW 2.48 Cost USD/hr 0.194 Cooling water Duty kJ/hr -8.41e+06 Flow kmol/hr 5.74e+03 Cost USD/hr 2.8 Low pressure steam Duty kJ/hr 1.02e+07 Flow kmol/hr 263 Cost USD/hr 62.6 Design Theoretical feed stage 9 Theoretical stages 13 Minimum reflux Ratio 0.687 Reflux Ratio 1.37 Actual stages 28 Height ft 52.4 Diameter ft 3.97 Wall thickness in 0.312 Weight lb 8.9e+03 Purchase cost Trays USD 2.28e+04 Tower USD 5.76e+04 Platform and ladders USD 1.95e+04 Condenser - Floating head USD 4.35e+04 Pump - Pump USD 4.32e+03 Pump - Motor USD 441 Reboiler - Floating head USD 2.71e+04 Total purchase cost USD 1.75e+05 Utility cost USD/hr 65.6
- class ShortcutColumn(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]#
Create a multicomponent distillation column that relies on the Fenske-Underwood-Gilliland method to solve for the theoretical design of the distillation column and the separation of non-keys [1].The Murphree efficiency (i.e. column efficiency) is based on the modified O’Connell correlation [2]. The diameter is based on tray separation and flooding velocity [1] [3]. Purchase costs are based on correlations compiled by Warren et. al. [4].
- Parameters:
ins (
Stream
], optional) – Inlet fluids to be mixed into the feed stage.outs (
Stream
], optional) –[0] Distillate
[1] Bottoms product
y_top (float) – Molar fraction of light key to the light and heavy keys in the distillate.
x_bot (float) – Molar fraction of light key to the light and heavy keys in the bottoms product.
Lr (float) – Recovery of the light key in the distillate.
Hr (float) – Recovery of the heavy key in the bottoms product.
k (float) – Ratio of reflux to minimum reflux.
Rmin (float, optional) – User enforced minimum reflux ratio. If the actual minimum reflux ratio is less than Rmin, this enforced value is ignored. Defaults to 0.6.
specification="Composition" ("Composition" or "Recovery") – If composition is used, y_top and x_bot must be specified. If recovery is used, Lr and Hr must be specified.
P=101325 (float) – Operating pressure [Pa].
vessel_material (str, optional) – Vessel construction material. Defaults to ‘Carbon steel’.
tray_material (str, optional) – Tray construction material. Defaults to ‘Carbon steel’.
tray_type='Sieve' ('Sieve', 'Valve', or 'Bubble cap') – Tray type.
tray_spacing=450 (float) – Typically between 152 to 915 mm.
stage_efficiency=None – User enforced stage efficiency. If None, stage efficiency is calculated by the O’Connell correlation [2].
velocity_fraction=0.8 (float) – Fraction of actual velocity to maximum velocity allowable before flooding.
foaming_factor=1.0 (float) – Must be between 0 to 1.
open_tray_area_fraction=0.1 (float) – Fraction of open area to active area of a tray.
downcomer_area_fraction=None (float) – Enforced fraction of downcomer area to net (total) area of a tray. If None, estimate ratio based on Oliver’s estimation [1].
is_divided=False (bool) – True if the stripper and rectifier are two separate columns.
Examples
>>> from biosteam.units import ShortcutColumn >>> from biosteam import Stream, settings >>> settings.set_thermo(['Water', 'Methanol', 'Glycerol'], cache=True) >>> feed = Stream('feed', flow=(80, 100, 25)) >>> bp = feed.bubble_point_at_P() >>> feed.T = bp.T # Feed at bubble point T >>> D1 = ShortcutColumn('D1', ins=feed, ... outs=('distillate', 'bottoms_product'), ... LHK=('Methanol', 'Water'), ... y_top=0.99, x_bot=0.01, k=2, ... is_divided=True) >>> D1.simulate() >>> # See all results >>> D1.show(T='degC', P='atm', composition=True) ShortcutColumn: D1 ins... [0] feed phase: 'l', T: 76.082 degC, P: 1 atm composition (%): Water 39 Methanol 48.8 Glycerol 12.2 -------- 205 kmol/hr outs... [0] distillate phase: 'g', T: 64.854 degC, P: 1 atm composition (%): Water 1 Methanol 99 -------- 100 kmol/hr [1] bottoms_product phase: 'l', T: 100.02 degC, P: 1 atm composition (%): Water 75.4 Methanol 0.761 Glycerol 23.9 -------- 105 kmol/hr >>> D1.results() Divided Distillation Column Units D1 Electricity Power kW 0.761 Cost USD/hr 0.0595 Cooling water Duty kJ/hr -7.54e+06 Flow kmol/hr 5.15e+03 Cost USD/hr 2.51 Low pressure steam Duty kJ/hr 1.34e+07 Flow kmol/hr 346 Cost USD/hr 82.4 Design Theoretical feed stage 8 Theoretical stages 16 Minimum reflux Ratio 1.06 Reflux Ratio 2.12 Rectifier stages 13 Stripper stages 26 Rectifier height ft 31.7 Stripper height ft 50.9 Rectifier diameter ft 4.52 Stripper diameter ft 3.64 Rectifier wall thickness in 0.312 Stripper wall thickness in 0.312 Rectifier weight lb 6.45e+03 Stripper weight lb 7.93e+03 Purchase cost Rectifier trays USD 1.52e+04 Stripper trays USD 2.01e+04 Rectifier tower USD 4.76e+04 Stripper platform and ladders USD 1.42e+04 Stripper tower USD 5.38e+04 Rectifier platform and ladders USD 1.81e+04 Condenser - Floating head USD 4.07e+04 Reflux drum - Horizontal pressur... USD 1.03e+04 Reflux drum - Platform and ladders USD 3.02e+03 Pump - Pump USD 4.37e+03 Pump - Motor USD 379 Reboiler - Floating head USD 2.98e+04 Total purchase cost USD 2.57e+05 Utility cost USD/hr 84.9
- class MESHDistillation(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]#
Create a distillation column that rigorously converges MESH (Mass, Equilibrium, Summation, and Enthalpy) equations.
- Parameters:
ins – Inlet fluids to be mixed into the feed stage.
outs –
[0] Distillate
[1] Bottoms product
[…] Vapor side draws
[…] Liquid side draws
LHK (tuple[str]) – IDs of light and heavy keys. The stage efficiency is estimated based on the relative volatility of the light and heavy keys.
boilup (float) – Vapor to liquid flow rate at the reboiler.
reflux (float) – Liquid to vapor flow rate at the condenser.
N_stages (int) – Number of stages.
feed_stages (tuple[int]) – Stage at which each inlet enters, respectively
vapor_side_draws (tuple[tuple[int]]) – Stage number and split fraction pairs.
liquid_side_draws (tuple[tuple[int]]) – Stage number and split fraction pairs.
P=101325 (float) – Operating pressure [Pa].
vessel_material (str, optional) – Vessel construction material. Defaults to ‘Carbon steel’.
tray_material (str, optional) – Tray construction material. Defaults to ‘Carbon steel’.
tray_type='Sieve' ('Sieve', 'Valve', or 'Bubble cap') – Tray type.
tray_spacing=450 (float) – Typically between 152 to 915 mm.
stage_efficiency=None – User enforced stage efficiency. If None, stage efficiency is calculated by the O’Connell correlation [2].
velocity_fraction=0.8 (float) – Fraction of actual velocity to maximum velocity allowable before flooding.
foaming_factor=1.0 (float) – Must be between 0 to 1.
open_tray_area_fraction=0.1 (float) – Fraction of open area to active area of a tray.
downcomer_area_fraction=None (float) – Enforced fraction of downcomer area to net (total) area of a tray. If None, estimate ratio based on Oliver’s estimation [1].
is_divided=False (bool) – True if the stripper and rectifier are two separate columns.
Examples
Simulate distillation column with 5 stages, a 0.673 reflux ratio, 2.57 boilup ratio, and feed at stage 2:
>>> import biosteam as bst >>> bst.settings.set_thermo(['Water', 'Ethanol'], cache=True) >>> feed = bst.Stream('feed', Ethanol=80, Water=100, T=80.215 + 273.15) >>> D1 = bst.MESHDistillation(None, N_stages=5, ins=[feed], feed_stages=[2], ... outs=['vapor', 'liquid'], ... reflux=0.673, boilup=2.57, ... LHK=('Ethanol', 'Water'), ... ) >>> D1.simulate() >>> vapor, liquid = D1.outs >>> vapor.imol['Ethanol'] / feed.imol['Ethanol'] 0.96 >>> vapor.imol['Ethanol'] / vapor.F_mol 0.69
>>> D1.results() Distillation Units Electricity Power kW 0.553 Cost USD/hr 0.0432 Low pressure steam Duty kJ/hr 1.47e+07 Flow kmol/hr 381 Cost USD/hr 90.5 Design Theoretical stages 5 Actual stages 9 Height ft 27.3 Diameter ft 3.32 Wall thickness in 0.312 Weight lb 4.02e+03 Purchase cost Trays USD 9.97e+03 Tower USD 3.63e+04 Platform and ladders USD 1.03e+04 Condenser - Floating head USD 2.06e+04 Reflux drum - Vertical pressure ... USD 1.29e+04 Reflux drum - Platform and ladders USD 3.89e+03 Pump - Pump USD 4.35e+03 Pump - Motor USD 355 Reboiler - Floating head USD 2.22e+04 Total purchase cost USD 1.21e+05 Utility cost USD/hr 90.6
Notes
The convergence algorithm decouples the equilibrium relationships, mass balances, and energy balances using a custom version of the Wang-Henke bubble point method. This algorithm is authored by Yoel Cortes-Pena, but is not yet peer reviewed. The main difference is that the tridiagonal matrix of mass balances across stages is used to solve for flow rates instead of mass fractions and an internal loop is added to converge phase fractions based on the energy balance.
The initialization algorithm first converges a “collapsed” column without adiabatic stages which have no feeds or side draws. This collapsed column is initialized by solving for liquid and vapor flow rates assuming no phase change across adiabatic stages and unity partition coefficients at reboilers/condensers (in which case the stripping factor is equal to the boil-up ratio).
The Murphree efficiency (i.e. stage efficiency) is based on the modified O’Connell correlation [2]. The diameter is based on tray separation and flooding velocity [1] [3]. Purchase costs are based on correlations compiled by Warren et. al. [4].
- class AdiabaticMultiStageVLEColumn(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]#
Create an adsorption or stripping column without a reboiler/condenser. The diameter is based on tray separation and flooding velocity. Purchase costs are based on correlations compiled by Warren et. al.
- Parameters:
ins –
[0] Liquid
[1] Vapor
outs –
[0] Vapor
[1] Liquid
P (float) – Operating pressure [Pa].
vessel_material (str, optional) – Vessel construction material. Defaults to ‘Carbon steel’.
tray_material (str, optional) – Tray construction material. Defaults to ‘Carbon steel’.
tray_type='Sieve' ('Sieve', 'Valve', or 'Bubble cap') – Tray type.
tray_spacing=450 (float) – Typically between 152 to 915 mm.
stage_efficiency=None – User enforced stage efficiency. If None, stage efficiency is calculated by the O’Connell correlation [2].
velocity_fraction=0.8 (float) – Fraction of actual velocity to maximum velocity allowable before flooding.
foaming_factor=1.0 (float) – Must be between 0 to 1.
open_tray_area_fraction=0.1 (float) – Fraction of open area to active area of a tray.
downcomer_area_fraction=None (float) – Enforced fraction of downcomer area to net (total) area of a tray. If None, estimate ratio based on Oliver’s estimation [1].
Examples
>>> import biosteam as bst >>> bst.settings.set_thermo(['AceticAcid', 'EthylAcetate', 'Water', 'MTBE'], cache=True) >>> feed = bst.Stream('feed', Water=75, AceticAcid=5, MTBE=20, T=320) >>> steam = bst.Stream('steam', Water=100, phase='g', T=390) >>> absorber = bst.Absorber(None, ... N_stages=2, ins=[feed, steam], ... solute="AceticAcid", outs=['vapor', 'liquid'] ... ) >>> absorber.simulate() >>> absorber.show() AdiabaticMultiStageVLEColumn ins... [0] feed phase: 'l', T: 320 K, P: 101325 Pa flow (kmol/hr): AceticAcid 5 Water 75 MTBE 20 [1] steam phase: 'g', T: 390 K, P: 101325 Pa flow (kmol/hr): Water 100 outs... [0] vapor phase: 'g', T: 366.32 K, P: 101325 Pa flow (kmol/hr): AceticAcid 3.71 Water 73.8 MTBE 20 [1] liquid phase: 'l', T: 372.87 K, P: 101325 Pa flow (kmol/hr): AceticAcid 1.29 Water 101 MTBE 0.00031
>>> absorber.results() Absorber Units Design Theoretical stages 2 Actual stages 4 Height ft 19.9 Diameter ft 3 Wall thickness in 0.312 Weight lb 2.71e+03 Purchase cost Trays USD 5.59e+03 Tower USD 2.91e+04 Platform and ladders USD 7.52e+03 Total purchase cost USD 4.23e+04 Utility cost USD/hr 0
References