2成分(バイナリ)蒸留塔
バイオ・リファイナリー(再生可能資源であるバイオマスを原料にバイオ燃料や樹脂などを製造するプラントや技術)のシミュレーションソフト"BioSTEAM"の蒸留塔モデルの使い方を解説しています。蒸留塔モデルはいくつか種類がありますが、特に極性の高い化合物を軽質成分、重質成分に、それぞれ塔頂およびボトム製品に完全に分離されると仮定した2成分(バイナリ)蒸留塔を取り扱います。オリジナルのページはdistillationです。また、ソースコードは以下の実行環境で確認しています。
- Visual Studio Code バージョン: 1.104.2
- 拡張機能:Jupyter バージョン 2025.8.0
- Python 3.12.10
- biosteam 2.52.13
- graphviz-14.0.2
蒸留塔
class distillation(ID='', ins=None, outs=(), thermo=None, **kwargs) [source]
蒸留塔のモデル distillation column クラスの抽象クラス。マーフリー効率は、修正されたオコンネル相関式に基づいています[2]。塔の直径はトレイ間隔およびフラッディング速度に基づいて決定されます[1][3]。購入価格は、Warren らによってまとめられた相関式[4]に基づいています。 詳細はこちら distillation。class BinaryDistillation(ID='', ins=None, outs=(), thermo=None, **kwargs) [source]
軽質および重質成分がそれぞれ塔頂およびボトム製品に完全に分離されると仮定した2成分(バイナリ)蒸留塔を構築します。 指定された実還流比と最小還流比の比率から、必要な段数と還流比をマッケイブ・ティーレ法[1]により計算します。この仮定は、極性の高い化合物の2成分(バイナリ)蒸留にも、沸点差の大きい軽質および重質成分が完全に分離されると仮定した3成分蒸留にも適しています。予備解析では、この手法をメタノール/グリセロール/水系に適用した場合に理論段数の誤差は±1段以内であることが示されました。フェンスキー・アンダーウッド・ギリランド法などの他の手法は、炭化水素系の分離により適しています。マーフィー効率は、修正オコンネル相関式[2]に基づいています。塔の直径はトレイ間隔とフラッディング速度から計算されます[1][3]。購入価格はワレンらのまとめた関係[4]に基づいています。- パラメータ
- ID (str、省略可) 他で使われていない、一意の識別子(ID)。IDが指定されていない場合は、自動的に一意のIDが付与されます。
- ins (Sequence(順序付きコレクション)[Stream | str]、省略可) フィード層で混合される流入ストリーム。
- outs (Sequence(順序付きコレクション)[Stream | str]、省略可)
- [0] 塔頂留出物
- [1] ボトム生成物
- LHK (tuple[str]) - 軽質成分と重質成分としたい成分。
- y_top (float) - 塔頂留出物の軽質成分のモル分率。
- x_bot (float) - 塔底の軽質成分のモル分率。
- Lr (float) - 塔頂留出成分のリカバリ
- Hr (float) - ボトム流出成分のリカバリ
- k (float) - 最小還流比に対する還流比の比率。還流比/最小還流比
- Rmin (float、省略可) ユーザー指定最小還流比。実際の最少還流比がRminより大きい場合は無視される。デフォルトは0.3。
- product_specification_format=None ("Composition" or "Recovery") "Composition"の場合はy_top、x_botの指定が必須。"Recovery"の場合はLr、Hrの指定が必須。
- P (float) - 運転圧力。デフォルトは101325 Pa。
- vessel_material (str、省略可) - 容器の構造材。デフォルトは
炭素鋼
。 - tray_material (str、省略可) - トレイの構造材。デフォルトは
炭素鋼
。 - tray_type ( str) トレイのタイプ。
- tray_spacing (float) トレイ間隔。一般的には152から915 mm。デフォルトは450 mm。
- stage_efficiency (float) ユーザー指定ステージ効率。指定がない場合はオコンネル相関式[2]より計算されます。
- velocity_fraction (float) フラッディング限界速度に対する実速度比。デフォルトは0.8。
- foaming_factor (float) - 0と1の間であることが必要。デフォルトは1。
- open_tray_area (float) - トレイの面積に対する有効な面積の比。デフォルトは0.1。
- downcomer_area_fraction (float) ユーザーが指定するトレイ全体面積に対するダウンカマー面積の比率。指定がない場合はオリバー式[1]を基に推定します。
- is_divided (bool) - 分離塔と精留塔の分離型構成である場合はTrue。デフォルトはFalse
- 例
- \( N_T \): トレイの枚数
- \( F_{CE} \): CE/500(CEPCIによる補正)
- \( C_{BT} \): トレイ1枚のベース購入価格 = \(412.6985 e^{0.1482 D_i} \) ※ CE が 500の時のトレイ1枚のベース購入価格
- \( F_{NT} \): トレイのコスト補正係数 \( \begin{cases} 2.25/1.0414^{N_T} & N_T < 20 \\ 1 & \text{その他} \end{cases} \)
- pressure vessel 耐圧容器代。容器の重量より計算。_vessel_purchase_cost(重量、直径、長さ)
- Platform and ladders 基礎はしご代。容器の直径、容器の長さより計算。_vessel_purchase_cost(重量、直径、長さ)
シーブトレイ(Sieve)か
バルブトレイ(Valve)か
バブルキャップトレイ(Bubble cap)。デフォルトは
シーブトレイ(Sieve)。
バイナリ蒸留では指定されていない成分は100%分離されると仮定します。
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 stage | 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 - Vertical pressure vessel | 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 |
コスト計算
塔本体はこのクラスから、設計をまとめた/units/design_tools/column_design.pyの各メソッドを使って計算しています。凝縮器(コンデンサー)、留出タンク(リフラックスドラム)、ポンプ、リボイラーはそれぞれ基になる機器(クラス)を通じて計算し、塔本体の要素と合わせて辞書型配列 baseline_purchase_costsに格納されます。ここでのコストは、化学工学プラント費用指数(CEPCI)によるコスト上昇分は加味されています。D1.baseline_purchase_costs
{'Rectifier trays': 14960.873367434679,
'Stripper trays': 12475.550054318259,
'Rectifier tower': 45637.48359095114,
'Stripper platform and ladders': 13925.29590080431,
'Stripper tower': 38327.06468510335,
'Rectifier platform and ladders': 11375.523735267567,
'Condenser - Floating head': 33922.46517378671,
'Reflux drum - Horizontal pressure vessel': 10248.332488183933,
'Reflux drum - Platform and ladders': 3016.798216210068,
'Pump - Pump': 4371.7419498990475,
'Pump - Motor': 367.57377129373225,
'Reboiler - Floating head': 27415.790772638335}
トレイ
ベースライン購入価格は棚段数、直径から計算されます。精留(Rectifier)塔と分離(Stripper)塔のトレイのベースライン購入価格は、D1.baseline_purchase_costs['Rectifier trays']
14960.873367434679
D1.baseline_purchase_costs['Stripper trays']
12475.550054318259一方で、それぞれの棚段数は
D1.design_results['Rectifier stages']
15.0
D1.design_results['Stripper stages']
13.0CEPCIを確認しておくと、
bst.CE
567.5トレイ1枚のベース購入価格が \(412.6985 e^{0.1482 * (直径)} \) なので、それぞれ、
import numpy as np
412.6985 * np.exp(0.1482*D1.design_results['Rectifier diameter'])
738.408280833377
412.6985 * np.exp(0.1482*D1.design_results['Stripper diameter'])
662.3857142589579column_design.compute_purchase_cost_of_trays(N_T, Di)によると、 \[ \text{トレイのベースライン購入価[USD]} = N_T * F_{CE} * F_{NT} * C_{BT} \]
N_T = D1.design_results['Rectifier stages'] - 1
N_T * bst.CE/500. * 2.25/1.0414**N_T * 412.6985 * np.exp(0.1482*D1.design_results['Rectifier diameter'])
14960.873367434679
N_T = D1.design_results['Stripper stages'] - 1
N_T * bst.CE/500. * 2.25/1.0414**N_T * 412.6985 * np.exp(0.1482*D1.design_results['Stripper diameter'])
12475.550054318259それぞれ、baseline_purchase_costs と同じ値になっていることが確認でき、トレイのベースライン購入価格はトレイの直径とトレイの枚数から計算されていて、化学工学プラント費用指数(CEPCI)によるコスト上昇分が加味されていることが確認できました。
塔
塔の重量より計算。D1.baseline_purchase_costs['Rectifier trays']
14960.873367434679
凝縮器(コンデンサー)
凝縮器(コンデンサー)のコストを確認してみます。D1.condenser.baseline_purchase_costs
{'Floating head': 33922.46517378671}
凝縮器(コンデンサー)は、熱交換機HXutilityクラスとして計算されています。HXutilityではコスト計算はタイプによって違うので、タイプを確認します。
D1.condenser.heat_exchanger_type
'Floating head''Floating head'はcompute_floating_head_purchase_costになります。compute_floating_head_purchase_costを確認すると、戻り値は面積A ft2単位で
def compute_floating_head_purchase_cost(A, CE): # A - area ft**2
return exp(12.0310 - 0.8709*ln(A) + 0.09005 * ln(A)**2)*CE/567とあります。AはD1.condenser.design_results['Area']
1346.4853081554352となるので、先程の式と同じ計算をすると、
from math import exp, log as ln
import biosteam as bst
exp(12.0310 - 0.8709*ln(D1.condenser.design_results['Area']) + 0.09005 * ln(D1.condenser.design_results['Area'])**2)*bst.CE/567
33922.46517378671となり、D1.condenser.baseline_purchase_costs と同じ値になっていることが確認でき、baseline_purchase_costsは面積から指数関数モデルで計算されていて、化学工学プラント費用指数(CEPCI)によるコスト上昇分が加味されていることが確認できました。
留出タンク(リフラックスドラム)
留出タンク(リフラックスドラム)はRefluxDrumクラスとして計算されます。
RefluxDrumクラスは
PressureVesselクラスを継承していて、耐圧容器代と基礎はしご代に分けて試算されています。
D1.reflux_drum.baseline_purchase_costs
{'Horizontal pressure vessel': 10248.332488183933,
'Platform and ladders': 3016.798216210068}でした。では、留出タンク(リフラックスドラム)の重量は、
D1.reflux_drum.design_results['Weight']
1308.74直径は
D1.reflux_drum.design_results['Diameter']
4.0長さは
D1.reflux_drum.design_results['Length']
6.017518836256716タイプによって式が違うので、タイプを確認しておくと、
D1.reflux_drum.design_results['Vessel type']
'Horizontal'計算式は、_horizontal_vessel_purchase_cost()になります。式を確認すると、さらにflash_vessel_designの計算式を使っていることが分かりました。flash_vessel_designの_compute_horizontal_vessel_purchase_cost(W, CE)を確認すると、計算式は \[ \text{耐圧容器のベースライン購入価[USD]} = CE/567 * exp(5.6336 + 0.4599 * ln(W) + 0.00582 * ln(W)^2) \] となっていました。この式に従って計算すると、
bst.CE/567 * exp(5.6336 + 0.4599 * ln(D1.reflux_drum.design_results['Weight']) + 0.00582 * ln(D1.reflux_drum.design_results['Weight'])**2)
10248.332488183933D1.reflux_drum.baseline_purchase_costsの'Horizontal pressure vessel'と同じ値になりました。続いて、基礎はしご代ですが、こちらも_compute_horizontal_vessel_platform_and_ladders_purchase_cost(D, CE)を確認すると \[ \text{基礎はしごのベースライン購入価[USD]} = CE/567 * 2275.*D^{0.20294} \] でした。
bst.CE/567 * 2275.*D1.reflux_drum.design_results['Diameter']**0.20294
3016.798216210068D1.reflux_drum.baseline_purchase_costsの'Platform and ladders'と同じ値になりました。
ポンプ
ポンプはPumpクラスとして計算されます。まず、ポンプのベースライン購入価格を確認しておくと、
D1.pump.baseline_purchase_costs
{'Pump': 4371.7419498990475, 'Motor': 367.57377129373225}
_cost()にまとめましたが、ポンプの種類、流量とヘッド圧(揚程)、出力によって切り替えています。 種類を確認しておくと、
D1.pump.design_results['Type']
'Centrifugal'次に、流量が50(gpm、ガロン毎分?)以下の時は計算上は50、ヘッド圧が50(ft)以下の時は計算上は50とするようなので流量、ヘッド圧を調べます。
D1.pump.design_results['Flow rate']
35.480211800804824
D1.pump.design_results['Head']
95.44450175635913以下の計算では、流量の方は50となります。 サイズファクター \(S = \text{流量} \cdot \text{ヘッド圧} ^ {0.5} \) となっているので計算すると、
50 * D1.pump.design_results['Head'] **0.5
488.4785096510366400 より大きいので、 \(S_{new} = S = 488.4785096510366 \) で、さらに計算式を確認すると \begin{align*} \textit{ポンプ}&\textit{のベースライン購入価[USD]} \\ & = CE/567 * S/S_{new} * exp(12.1656-1.1448*ln(S_{new})+0.0862*ln(S_{new})^2) \end{align*} \( S/S_{new} = 1 \)になることも考慮して計算すると、
S = 50 * D1.pump.design_results['Head'] **0.5
lnS = ln(S)
bst.CE /567 * exp(12.1656-1.1448*lnS+0.0862*lnS**2)
4371.7419498990475D1.pump.baseline_purchase_costsの'Pump'と同じになったので、このように計算されていると思われます。 次に、'Motor'の方は、electric_motor_cost(p)でpはポンプの出力、となっていました。electric_motor_cost(p)は
biosteam.units.design_tools.mechanicalにありました。計算式として書くと、 \begin{align*} \textit{モータ}&\textit{のベースライン購入価[USD]} \\ & = exp(5.9332 + 0.16829 * log(p) - 0.110056*log(p)^2 + 0.071413*log(p)^3- 0.0063788*log(p)^4) * CE / 567 \end{align*} この式に従って計算すると、
p=D1.pump.design_results['Power']
exp(5.9332 + 0.16829 * ln(p) - 0.110056*ln(p)**2 + 0.071413*ln(p)**3- 0.0063788*ln(p)**4) * bst.CE / 567
367.57377129373225D1.pump.baseline_purchase_costsの'Motor'と同じ値になりました。
リボイラー
リボイラーは、熱交換機HXutilityクラスとして計算されています。HXutilityではコスト計算はタイプによって違うので、タイプを確認します。
D1.reboiler.heat_exchanger_type
'Floating head'リボイラーのコストを確認してみます。
D1.reboiler.baseline_purchase_costs
{'Floating head': 27415.790772638335}
HXutilityで'Floating head'であれば、計算式としては凝縮器(コンデンサー)と同じで面積違いになります。
D1.reboiler.design_results['Area']
763.9193882618522
exp(12.0310 - 0.8709*ln(D1.reboiler.design_results['Area']) + 0.09005 * ln(D1.reboiler.design_results['Area'])**2)*bst.CE/567
27415.790772638335ということで同じ値になり、計算手順の確認が出来ました。
全凝縮器付き
全凝縮器付きのバイナリ蒸留は次のようになります。partindenserをFalseに、
is_dividedもFalseにしています。塔が一つになり、設備のコストは減るようですが、冷却水の消費量が多くなり、その分ユーティリティコストが上がるようです。(※完全凝縮器付きのバイナリ蒸留:塔頂から出てくる蒸気を全量液化(100%凝縮)し、その液体の一部を還流として塔に戻し、残りを留出液(distillate)として回収するタイプ)
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()
| Divided Distillation Column | Units | D1 | |
|---|---|---|---|
| Electricity | Power | kW | 0.644 |
| Cost | USD/hr | 0.0504 | |
| 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.94 | |
| Wall thickness | in | 0.312 | |
| Weight | lb | 8.85e+03 | |
| Purchase cost | Trays | USD | 2.27e+04 |
| Tower | USD | 5.74e+04 | |
| Platform and ladders | USD | 1.94e+04 | |
| Condenser - Floating head | USD | 4.35e+04 | |
| Pump - Pump | USD | 4.37e+03 | |
| Pump - Motor | USD | 368 | |
| Reboiler - Floating head | USD | 2.71e+04 | |
| Total purchase cost | USD | 1.75e+05 | |
| Utility cost | USD/hr | 65.5 |
_units : dict [str, str] = {}
D1._units
class-attribute 計算結果である辞書型配列 design_results の値の単位。
{'Minimum reflux': 'Ratio',
'Reflux': 'Ratio',
'Rectifier height': 'ft',
'Rectifier diameter': 'ft',
'Rectifier wall thickness': 'in',
'Rectifier weight': 'lb',
'Stripper height': 'ft',
'Stripper diameter': 'ft',
'Stripper wall thickness': 'in',
'Stripper weight': 'lb',
'Height': 'ft',
'Diameter': 'ft',
'Wall thickness': 'in',
'Weight': 'lb'}
_F_BM_default : dict [str,float]
設置に関するコストを見積るための係数のデフォルト値。設備単体の価格から、実際に稼働状態にするための据付・配管・電気・計装なのどの補助設備費を推定する。
D1._F_BM_default
{'Rectifier tower': 4.3,
'Stripper tower': 4.3,
'Rectifier trays': 4.3,
'Stripper trays': 4.3,
'Platform and ladders': 1.0,
'Rectifier platform and ladders': 1.0,
'Stripper platform and ladders': 1.0,
'Tower': 4.3,
'Trays': 4.3,
'Vacuum system': 1.0}
