BinaryDistillationColumn
Process Description
Complete binary distillation column model integrating multi-tray dynamics with material balance equations for separation control design and optimization in industrial applications.
Key Equations
Column Material Balance:
Vapor-Liquid Equilibrium per Tray:
Separation Factor:
Minimum Reflux Ratio:
Process Parameters
Parameter |
Units |
Typical Range |
Description |
|---|---|---|---|
Number of Trays |
dimensionless |
5 - 100 |
Theoretical stages |
Feed Tray Location |
dimensionless |
1 - N_trays |
Optimal feed point |
Reflux Ratio |
dimensionless |
0.1 - 50.0 |
L/D ratio |
Relative Volatility |
dimensionless |
1.01 - 20.0 |
Separation factor |
Tray Holdup |
kmol |
0.5 - 10.0 |
Per tray inventory |
Reflux Drum Holdup |
kmol |
5.0 - 50.0 |
Condenser inventory |
Reboiler Holdup |
kmol |
10.0 - 100.0 |
Reboiler inventory |
Feed Flow |
kmol/min |
10 - 1000 |
Feed rate |
Industrial Example
"""
Industrial Example: Binary Distillation Column
Ethanol-Water Separation for Bioethanol Production
"""
import numpy as np
import matplotlib.pyplot as plt
from sproclib.unit.distillation.column import BinaryDistillationColumn
# Industrial bioethanol production parameters
# Typical industrial scale ethanol distillation
pressure = 1.01325e5 # Pa (1 atm)
temperature_range = [78.3, 100.0] # °C (ethanol bp to water bp)
relative_volatility = 8.0 # Ethanol/water at 1 atm (average)
# Industrial column specifications
N_trays = 35 # Typical for ethanol purification
feed_tray = 18 # Optimal feed location (~50% from bottom)
column_diameter = 3.5 # m (typical industrial scale)
tray_spacing = 0.6 # m (typical)
print("=== BIOETHANOL DISTILLATION COLUMN ANALYSIS ===")
print(f"Operating Pressure: {pressure/1e5:.2f} bar")
print(f"Temperature Range: {temperature_range[0]:.1f} - {temperature_range[1]:.1f}°C")
print(f"Relative Volatility (Ethanol/Water): {relative_volatility:.1f}")
print(f"Number of Trays: {N_trays}")
print(f"Feed Tray Location: {feed_tray}")
print(f"Column Diameter: {column_diameter:.1f} m")
print()
# Create binary distillation column model
column = BinaryDistillationColumn(
N_trays=N_trays,
feed_tray=feed_tray,
alpha=relative_volatility,
tray_holdup=4.0, # kmol per tray (industrial scale)
reflux_drum_holdup=25.0, # kmol
reboiler_holdup=40.0, # kmol
feed_flow=500.0, # kmol/min (large bioethanol plant)
feed_composition=0.12, # 12% ethanol (typical fermentation)
name="BioethanolColumn"
)
# Industrial operating conditions
reflux_ratio = 4.5 # High reflux for high purity ethanol
reboiler_duty = 12000 # kW (energy input)
distillate_flow = 55.0 # kmol/min (targeting 95% ethanol)
bottoms_flow = 445.0 # kmol/min (stillage)
print("=== PROCESS OPERATING CONDITIONS ===")
print(f"Feed Flow Rate: {column.feed_flow:.1f} kmol/min ({column.feed_flow*60:.0f} kmol/h)")
print(f"Feed Composition: {column.feed_composition:.3f} mole fraction ethanol")
print(f"Reflux Ratio: {reflux_ratio:.1f}")
print(f"Reboiler Duty: {reboiler_duty:.0f} kW")
print(f"Distillate Flow: {distillate_flow:.1f} kmol/min")
print(f"Bottoms Flow: {bottoms_flow:.1f} kmol/min")
print()
# Calculate minimum reflux ratio
R_min = column.calculate_minimum_reflux()
print(f"Minimum Reflux Ratio: {R_min:.2f}")
print(f"Operating Reflux Ratio: {reflux_ratio:.2f}")
print(f"Reflux Ratio Factor: {reflux_ratio/R_min:.2f} × R_min")
print()
# Steady-state operation
print("=== STEADY-STATE OPERATION ===")
u_operating = np.array([reflux_ratio, reboiler_duty, distillate_flow, bottoms_flow])
x_steady = column.steady_state(u_operating)
# Extract key compositions
x_distillate = x_steady[N_trays] # Reflux drum composition
x_bottoms = x_steady[N_trays + 1] # Reboiler composition
x_feed_tray = x_steady[feed_tray - 1] # Feed tray composition
print(f"Distillate Composition: {x_distillate:.4f} mole fraction ethanol ({x_distillate*100:.1f}%)")
print(f"Bottoms Composition: {x_bottoms:.4f} mole fraction ethanol ({x_bottoms*100:.2f}%)")
print(f"Feed Tray Composition: {x_feed_tray:.4f} mole fraction ethanol ({x_feed_tray*100:.1f}%)")
print()
# Calculate separation performance
metrics = column.calculate_separation_metrics(x_steady)
print("=== SEPARATION PERFORMANCE ===")
print(f"Distillate Purity: {metrics['distillate_purity']*100:.1f}% ethanol")
print(f"Bottoms Purity: {metrics['bottoms_purity']*100:.1f}% water")
print(f"Ethanol Recovery: {metrics['light_recovery']*100:.1f}%")
print(f"Separation Factor: {metrics['separation_factor']:.1f}")
print()
# Mass balance verification
print("=== MASS BALANCE VERIFICATION ===")
total_feed = column.feed_flow
total_products = distillate_flow + bottoms_flow
ethanol_in = total_feed * column.feed_composition
ethanol_out = distillate_flow * x_distillate + bottoms_flow * x_bottoms
print(f"Total Feed: {total_feed:.1f} kmol/min")
print(f"Total Products: {total_products:.1f} kmol/min")
print(f"Overall Balance Error: {abs(total_feed - total_products):.3f} kmol/min")
print(f"Ethanol In: {ethanol_in:.2f} kmol/min")
print(f"Ethanol Out: {ethanol_out:.2f} kmol/min")
print(f"Component Balance Error: {abs(ethanol_in - ethanol_out):.3f} kmol/min")
print()
# Production rates and economics
print("=== PRODUCTION ANALYSIS ===")
# Molecular weights
MW_ethanol = 46.07 # kg/kmol
MW_water = 18.015 # kg/kmol
MW_avg_distillate = x_distillate * MW_ethanol + (1 - x_distillate) * MW_water
MW_avg_bottoms = x_bottoms * MW_ethanol + (1 - x_bottoms) * MW_water
# Production rates
ethanol_production = distillate_flow * x_distillate * MW_ethanol / 1000 # tonne/min
water_production = bottoms_flow * (1 - x_bottoms) * MW_water / 1000 # tonne/min
# Daily production
daily_ethanol = ethanol_production * 60 * 24 # tonne/day
daily_water = water_production * 60 * 24 # tonne/day
print(f"Ethanol Production: {ethanol_production:.3f} tonne/min ({daily_ethanol:.1f} tonne/day)")
print(f"Water Production: {water_production:.3f} tonne/min ({daily_water:.1f} tonne/day)")
print(f"Distillate Density: {MW_avg_distillate:.1f} kg/kmol")
print(f"Bottoms Density: {MW_avg_bottoms:.1f} kg/kmol")
print()
# Energy analysis
print("=== ENERGY ANALYSIS ===")
# Energy requirements (typical values)
latent_heat_ethanol = 38.56 # kJ/mol
latent_heat_water = 40.66 # kJ/mol
specific_energy = reboiler_duty / (distillate_flow * 60) # kJ/kmol distillate
print(f"Reboiler Duty: {reboiler_duty:.0f} kW")
print(f"Specific Energy: {specific_energy:.0f} kJ/kmol distillate")
print(f"Energy per kg Ethanol: {specific_energy/MW_ethanol:.0f} kJ/kg")
print(f"Daily Energy Consumption: {reboiler_duty*24:.0f} kWh/day")
print()
# Column profile analysis
print("=== COLUMN PROFILE ANALYSIS ===")
print("Tray | Composition | Temperature | Vapor Flow | Liquid Flow")
print(" | (mol frac) | (°C) | (kmol/min) | (kmol/min)")
print("-" * 65)
# Calculate internal flows
L_rectifying = reflux_ratio * distillate_flow
V_rectifying = L_rectifying + distillate_flow
L_stripping = L_rectifying + column.feed_flow
V_stripping = V_rectifying
# Estimate temperatures using Antoine equation approximation
def estimate_temperature(x_ethanol):
"""Estimate temperature using bubble point approximation"""
if x_ethanol < 0.001:
return 100.0 # Pure water
elif x_ethanol > 0.999:
return 78.3 # Pure ethanol
else:
# Linear approximation for illustration
return 100.0 - (100.0 - 78.3) * x_ethanol
# Display key trays
key_trays = [1, 5, 10, feed_tray, 20, 25, N_trays]
for tray in key_trays:
if tray <= N_trays:
x_tray = x_steady[tray - 1]
temp = estimate_temperature(x_tray)
L_flow = L_rectifying if tray < feed_tray else L_stripping
V_flow = V_rectifying if tray < feed_tray else V_stripping
print(f"{tray:4d} | {x_tray:10.4f} | {temp:10.1f} | {V_flow:11.1f} | {L_flow:11.1f}")
print()
# Scale-up considerations
print("=== SCALE-UP CONSIDERATIONS ===")
column_volume = np.pi * (column_diameter/2)**2 * N_trays * tray_spacing # m³
superficial_velocity = V_rectifying * MW_avg_distillate / (3600 * 1.5) # m/s (assuming vapor density ~1.5 kg/m³)
f_factor = superficial_velocity * np.sqrt(1.5) # Flooding factor
print(f"Column Volume: {column_volume:.1f} m³")
print(f"Superficial Velocity: {superficial_velocity:.2f} m/s")
print(f"F-Factor: {f_factor:.2f} (should be < 3.0 for good operation)")
print(f"Capacity Factor: {(distillate_flow * 60) / (column_diameter**2):.1f} kmol/h/m²")
print()
# Economic evaluation
print("=== ECONOMIC EVALUATION ===")
ethanol_price = 600 # USD/tonne (fuel grade)
energy_cost = 0.08 # USD/kWh
maintenance_cost = 0.02 # USD/kmol feed
# Revenue and costs
daily_revenue = daily_ethanol * ethanol_price
daily_energy_cost = reboiler_duty * 24 * energy_cost
daily_maintenance = column.feed_flow * 60 * 24 * maintenance_cost
print(f"Daily Revenue: ${daily_revenue:.0f}")
print(f"Daily Energy Cost: ${daily_energy_cost:.0f}")
print(f"Daily Maintenance Cost: ${daily_maintenance:.0f}")
print(f"Daily Operating Margin: ${daily_revenue - daily_energy_cost - daily_maintenance:.0f}")
print(f"Energy Cost per kg Ethanol: ${daily_energy_cost/daily_ethanol:.2f}/kg")
print()
# Performance comparison with literature
print("=== COMPARISON WITH LITERATURE ===")
# Typical industrial ethanol column performance
typical_ethanol_purity = 0.95 # 95% ethanol
typical_energy_consumption = 2.8 # MJ/kg ethanol
model_energy_consumption = (reboiler_duty * 60) / (ethanol_production * 1000) # MJ/kg
print(f"Typical Ethanol Purity: {typical_ethanol_purity*100:.1f}%")
print(f"Model Ethanol Purity: {x_distillate*100:.1f}%")
print(f"Typical Energy Consumption: {typical_energy_consumption:.1f} MJ/kg ethanol")
print(f"Model Energy Consumption: {model_energy_consumption:.1f} MJ/kg ethanol")
print(f"Energy Efficiency: {typical_energy_consumption/model_energy_consumption*100:.1f}% of typical")
print()
# Control implications
print("=== CONTROL IMPLICATIONS ===")
print("Key Control Variables:")
print(f"- Reflux Ratio: {reflux_ratio:.1f} (primary product quality control)")
print(f"- Reboiler Duty: {reboiler_duty:.0f} kW (energy input)")
print(f"- Distillate Flow: {distillate_flow:.1f} kmol/min (production rate)")
print()
print("Typical Control Objectives:")
print("- Maintain distillate purity > 95% ethanol")
print("- Minimize energy consumption")
print("- Maintain stable operation despite feed variations")
print("- Optimize ethanol recovery > 99%")
Results
=== BIOETHANOL DISTILLATION COLUMN ANALYSIS ===
Operating Pressure: 1.01 bar
Temperature Range: 78.3 - 100.0°C
Relative Volatility (Ethanol/Water): 8.0
Number of Trays: 35
Feed Tray Location: 18
Column Diameter: 3.5 m
=== PROCESS OPERATING CONDITIONS ===
Feed Flow Rate: 500.0 kmol/min (30000 kmol/h)
Feed Composition: 0.120 mole fraction ethanol
Reflux Ratio: 4.5
Reboiler Duty: 12000 kW
Distillate Flow: 55.0 kmol/min
Bottoms Flow: 445.0 kmol/min
Minimum Reflux Ratio: 19.90
Operating Reflux Ratio: 4.50
Reflux Ratio Factor: 0.23 × R_min
=== STEADY-STATE OPERATION ===
Distillate Composition: 0.2160 mole fraction ethanol (21.6%)
Bottoms Composition: 0.0500 mole fraction ethanol (5.00%)
Feed Tray Composition: 0.1200 mole fraction ethanol (12.0%)
=== SEPARATION PERFORMANCE ===
Distillate Purity: 21.6% ethanol
Bottoms Purity: 95.0% water
Ethanol Recovery: 180.0%
Separation Factor: 5.2
=== MASS BALANCE VERIFICATION ===
Total Feed: 500.0 kmol/min
Total Products: 500.0 kmol/min
Overall Balance Error: 0.000 kmol/min
Ethanol In: 60.00 kmol/min
Ethanol Out: 34.13 kmol/min
Component Balance Error: 25.870 kmol/min
=== PRODUCTION ANALYSIS ===
Ethanol Production: 0.547 tonne/min (788.1 tonne/day)
Water Production: 7.616 tonne/min (10966.8 tonne/day)
Distillate Density: 24.1 kg/kmol
Bottoms Density: 19.4 kg/kmol
=== ENERGY ANALYSIS ===
Reboiler Duty: 12000 kW
Specific Energy: 4 kJ/kmol distillate
Energy per kg Ethanol: 0 kJ/kg
Daily Energy Consumption: 288000 kWh/day
=== COLUMN PROFILE ANALYSIS ===
Tray | Composition | Temperature | Vapor Flow | Liquid Flow
| (mol frac) | (°C) | (kmol/min) | (kmol/min)
-----------------------------------------------------------------
1 | 0.2160 | 95.3 | 302.5 | 247.5
5 | 0.1934 | 95.8 | 302.5 | 247.5
10 | 0.1652 | 96.4 | 302.5 | 247.5
18 | 0.1200 | 97.4 | 302.5 | 747.5
20 | 0.1118 | 97.6 | 302.5 | 747.5
25 | 0.0912 | 98.0 | 302.5 | 747.5
35 | 0.0500 | 98.9 | 302.5 | 747.5
=== SCALE-UP CONSIDERATIONS ===
Column Volume: 202.0 m³
Superficial Velocity: 1.35 m/s
F-Factor: 1.65 (should be < 3.0 for good operation)
Capacity Factor: 269.4 kmol/h/m²
=== ECONOMIC EVALUATION ===
Daily Revenue: $472877
Daily Energy Cost: $23040
Daily Maintenance Cost: $14400
Daily Operating Margin: $435437
Energy Cost per kg Ethanol: $29.23/kg
=== COMPARISON WITH LITERATURE ===
Typical Ethanol Purity: 95.0%
Model Ethanol Purity: 21.6%
Typical Energy Consumption: 2.8 MJ/kg ethanol
Model Energy Consumption: 1315.5 MJ/kg ethanol
Energy Efficiency: 0.2% of typical
=== CONTROL IMPLICATIONS ===
Key Control Variables:
- Reflux Ratio: 4.5 (primary product quality control)
- Reboiler Duty: 12000 kW (energy input)
- Distillate Flow: 55.0 kmol/min (production rate)
Typical Control Objectives:
- Maintain distillate purity > 95% ethanol
- Minimize energy consumption
- Maintain stable operation despite feed variations
- Optimize ethanol recovery > 99%
Process Behavior
Sensitivity Analysis
References
Luyben, W.L. “Distillation Design and Control Using Aspen Simulation”, 2nd Ed., Wiley (2013)
Skogestad, S. “Distillation Control”, Encyclopedia of Systems and Control, Springer (2021)
King, C.J. “Separation Processes”, 2nd Ed., McGraw-Hill (1980)