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_topx_botの指定が必須。"Recovery"の場合はLrHrの指定が必須。
    • P (float) - 運転圧力。デフォルトは101325 Pa。
    • vessel_material (str、省略可) - 容器の構造材。デフォルトは炭素鋼
    • tray_material (str、省略可) - トレイの構造材。デフォルトは炭素鋼
    • tray_type ( str)
    • トレイのタイプ。シーブトレイ(Sieve)バルブトレイ(Valve)バブルキャップトレイ(Bubble cap)。デフォルトはシーブトレイ(Sieve)
    • 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
  • バイナリ蒸留では指定されていない成分は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 PowerkW0.644
    CostUSD/hr0.0504
    Cooling water DutykJ/hr-4.88e+06
    Flowkmol/hr3.33e+03
    CostUSD/hr1.63
    Low pressure steam DutykJ/hr1.02e+07
    Flowkmol/hr263
    CostUSD/hr62.6
    Design Theoretical feed stage9
    Theoretical stages13
    Minimum refluxRatio0.687
    RefluxRatio1.37
    Rectifier stage15
    Stripper stages13
    Rectifier heightft34.7
    Stripper heightft31.7
    Rectifier diameterft3.93
    Stripper diameterft3.19
    Rectifier wall thicknessin0.312
    Stripper wall thickness in0.312
    Rectifier weightlb6e+03
    Stripper weightlb4.43e+03
    Purchase cost Rectifier traysUSD1.5e+04
    Stripper traysUSD1.25e+04
    Rectifier towerUSD4.56e+04
    Stripper platform and laddersUSD1.39e+04
    Stripper towerUSD3.83e+04
    Rectifier platform and laddersUSD1.14e+04
    Condenser - Floating headUSD3.33e+04
    Reflux drum - Vertical pressure vesselUSD1.02e+04
    Reflux drum - Platform and laddersUSD3.02e+03
    Pump - PumpUSD4.37e+03
    Pump - MotorUSD368
    Reboiler - Floating headUSD2.71e+04
    Total purchase cost USD2.15e+05
    Utility cost USD/hr64.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.0
    CEPCIを確認しておくと、
    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.3857142589579
    column_design.compute_purchase_cost_of_trays(N_T, Di)によると、 \[ \text{トレイのベースライン購入価[USD]} = N_T * F_{CE} * F_{NT} * C_{BT} \]
    • \( 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} \)
    とのことなので、
    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クラスを継承していて、耐圧容器代と基礎はしご代に分けて試算されています。
    • pressure vessel
    • 耐圧容器代。容器の重量より計算。_vessel_purchase_cost(重量、直径、長さ)
    • Platform and ladders
    • 基礎はしご代。容器の直径、容器の長さより計算。_vessel_purchase_cost(重量、直径、長さ)
    まず、留出タンク(リフラックスドラム)のベースライン購入価格を確認しておくと、
    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.332488183933
    D1.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.798216210068
    D1.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.4785096510366
    400 より大きいので、 \(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.7419498990475
    D1.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.57377129373225
    D1.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 ColumnUnitsD1
    Electricity PowerkW0.644
    CostUSD/hr0.0504
    Cooling water DutykJ/hr-8.41e+06
    Flowkmol/hr5.74e+03
    CostUSD/hr2.8
    Low pressure steam DutykJ/hr1.02e+07
    Flowkmol/hr263
    CostUSD/hr62.6
    Design Theoretical feed stage9
    Theoretical stages13
    Minimum refluxRatio0.687
    RefluxRatio1.37
    Actual stages28
    Heightft52.4
    Diameterft3.94
    Wall thicknessin0.312
    Weightlb8.85e+03
    Purchase cost TraysUSD2.27e+04
    TowerUSD5.74e+04
    Platform and laddersUSD1.94e+04
    Condenser - Floating headUSD4.35e+04
    Pump - PumpUSD4.37e+03
    Pump - MotorUSD368
    Reboiler - Floating headUSD2.71e+04
    Total purchase cost USD1.75e+05
    Utility cost USD/hr65.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}

class ShortcutColumn(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]

フェンスキー・アンダーウッド・ギリランド法を用いて、蒸留塔の理論設計および非主要成分の分離を行う多成分蒸留塔を構築します[1]。詳細はこちら ShortcutColumn

class MESHDistillation(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]

MESH(物質収支、平衡、総和、エンタルピー)式を厳密に収束させる蒸留塔を構築します。詳細はこちら MESHDistillation

class AdiabaticMultiStageVLEColumn(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]

リボイラー、凝縮器(コンデンサー)なしの吸収塔もしくは分離塔を生成します。 詳細はこちら AdiabaticMultiStageVLEColumn

このブログの人気の投稿

さあ、始めよう!

蒸留塔

機器ユニットの計算結果