さあ、始めよう!

バイオ・リファイナリー(再生可能資源であるバイオマスを原料にバイオ燃料や樹脂などを製造するプラントや技術)のシミュレーションソフト"BioSTEAM"の基本的な使い方を解説しています。 オリジナルのページはGetting startedです。 ソースコードは以下の実行環境で確認しています。
  • Visual Studio Code バージョン: 1.104.2
  • 拡張機能:Jupyter バージョン 2025.8.0
  • Python 3.12.10
  • biosteam 2.52.13
  • graphviz-14.0.2
では、

さあ、始めよう!

ストリームの初期化

「ストリーム」は物質の流れを、流量と熱力学的状態として定義されます。ストリームを作成する前に、「Thermo(熱)」物性を設定します。あるいは、化学物質の名前を渡すだけで、BioSTEAMが理想的な混合則とUNIFAC活量係数に基づいて、相平衡のための物性パッケージを自動的に作成してくれます。より複雑な物性パッケージは、BioSTEAMの主要な熱力学エンジンである Thermosteam を通じて設定することができます。詳細はThermosteam 101を見てください。ここでのサンプルは、いくつかの良く知られている化学物質からなる単純な流入ストリームを初期化しています。
  1. ストリームの設定
  2. 水が50kmol/hr、メタノール20kmol/hrの混合物が流入してくる状況を考えます。
    import biosteam as bst
    from biosteam import settings
    bst.nbtutorial() # Light-mode html diagrams and filter warnings
    settings.set_thermo(['Water', 'Methanol'])
    feed = bst.Stream(Water=50, Methanol=20)
    feed.show()
    
    結果:流れは液相(phase:'l')で、なにも指定していないと、温度と圧力はデフォルトで25℃、101.325kPaになります。
    Stream: s1
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kmol/hr): Water     50
                    Methanol  20
    
  3. コストの設定
  4. 後で技術経済性を解析するために、この物質の㎏あたりのコストを設定しておきます。
    feed.price = 0.15 # USD/kg
    from biosteam import settings
    feed.cost # USD/hr
    
    結果:kgあたり0.15USDだと、1時間あたりで231.24018USDになるようです。
    231.24018
    

プロセスの設定

プロセスの設定には原料および製品の価格、ユーティリティの条件、化学工学プラント費用指数が含まれます。これらはシステムのシミュレーションを行う前に設定しておく必要があります。
  1. 化学工学プラント費用指数の設定
  2. 化学工学プラント費用指数(Chemical Engineering Plant Cost Index)を設定します。※(Chemical Engineering Plant Cost Index, CEPCI)とは、化学プラントの建設・運営にかかるコストの変動を数値化した指標だそうです。たとえば、2000年に建設されたプラントの費用が100億円で、当時のCEPCIが400、現在のCEPCIが800であれば、現在の推定費用 ≒ 100億円 × (800 ÷ 400) = 200億円のように使うそうです。
    settings.CEPCI # デフォルトは2017年の数字
    567.5
  3. CEPCIの設定
  4. settings.CEPCI = 603.1 # 2018年の数字
  5. 電力関係の設定
  6. 電力関係の設定で電力のコストを設定できます。
    settings.electricity_price # デフォルトの電力価格 (USD/kWhr)
    0.0782
  7. 電力料金の設定
  8. settings.electricity_price = 0.065 # 適正に設定できます
  9. 冷熱関係の設定
  10. 冷熱関係の設定HeatUtilityは、UtilityAgent オブジェクトを使って設定します。これらのオブジェクトは Stream オブジェクトであり、ユーティリティエージェントを記述する属性が追加されています。
    settings.cooling_agents # 利用可能な冷却媒体の表示
    [<UtilityAgent: cooling_water>,
     <UtilityAgent: chilled_water>,
     <UtilityAgent: chilled_brine>,
     <UtilityAgent: propane>,
     <UtilityAgent: propylene>,
     <UtilityAgent: ethylene>]
    
  11. 冷却水の設定
  12. 冷却水を選択した場合の設定を確認します。
    cooling_water = settings.get_cooling_agent('cooling_water')
    cooling_water.show() # A UtilityAgent
    UtilityAgent: cooling_water
    heat_transfer_efficiency: 1.000
    heat_transfer_price: 0 USD/kJ
    regeneration_price: 0.000488 USD/kmol
    T_limit: 325 K
    phase: 'l'
    T: 305.37 K
    P: 101325 Pa
    flow (kmol/hr): Water  1 
  13. 再生水のコスト(USD/kmol)を確認
  14. # Price of regenerating the utility in USD/kmol
    cooling_water.regeneration_price
    0.00048785
  15. 他の冷却方法のコストは熱の輸送量により、単位は USD/kJ
  16. ここでは「chilled water(チルドウォーター)」を確認します。「chilled water(チルドウォーター)」とは、「冷却された水」で、「cooling_water」は通常常温で使用する冷却水を指すことが多いようです。
    # Other utilities may be priced for amount of heat transfered in USD/kJ
    chilled_water = settings.get_cooling_agent('chilled_water')
    chilled_water.heat_transfer_price
    5e-06
  17. 冷却水の温度を変更
  18. cooling_water.T = 302 # Change the temperature of cooling water (K)
  19. 選択可能な加熱方法を確認
  20. settings.heating_agents # All available heating agents
    [<UtilityAgent: low_pressure_steam>,
     <UtilityAgent: medium_pressure_steam>,
     <UtilityAgent: high_pressure_steam>,
     <UtilityAgent: natural_gas>]
  21. 加熱方法を設定
  22. 詳細も確認可能。ただし、冷却方法と違い、相が変わる可能性もあるので 'T_limit' はありません。
    lps = settings.get_heating_agent('low_pressure_steam') # A UtilityAgent
    lps.show() # Note that because utility changes phase, T_limit is None
    UtilityAgent: low_pressure_steam
    heat_transfer_efficiency: 0.950
    heat_transfer_price: 0 USD/kJ
    regeneration_price: 0.238 USD/kmol
    T_limit: None
    phase: 'g'
    T: 412.19 K
    P: 344738 Pa
    flow (kmol/hr): Water  1
  23. コストを調整
  24. lps.regeneration_price = 0.20 # Adjust price (USD/kmol)
  25. 冷媒の変更
  26. プロパン、プロピレン、エチレンを冷媒から外します。
    settings.cooling_agents = settings.cooling_agents[:-3]
    settings.cooling_agents
    [<UtilityAgent: cooling_water>,
     <UtilityAgent: chilled_water>,
     <UtilityAgent: chilled_brine>]
  27. アンモニアを冷媒に追加
  28. 推定コストはProduct and Process Design Principles Synthesis, Analysis and Evaluation. Wiley (2016), Warren D.Seider's の表 17.1より。
    # Assume cost from Table 17.1 in Warren D.Seider's
    # Product and Process Design Principles Synthesis, Analysis and Evaluation. Wiley (2016)
    Ammonia = bst.Chemical('Ammonia') # Load ammonia properties
    P = 101325 * 1.2 # Pressure should be above atmospheric
    T = Ammonia.Tsat(P) # Temperature should be at the bubble point for latent cooling
    ammonia = bst.UtilityAgent(
        'ammonia',
        Ammonia=1,
        P=P,
        T=T,
        phase='l',
        thermo=bst.Thermo([Ammonia]),
        heat_transfer_price=13.17e-6,
    )
    settings.cooling_agents.append(ammonia)
    BioSTEAMでは、ユーティリティエージェントとして認識されるのは settings.cooling_agents および settings.heating_agents に含まれるものだけです。ユーティリティエージェントの並び順が優先順位を決定します。たとえば、冷却水がチルド水より先にリストにある場合、BioSTEAMは冷却水を優先的に使用します。 加熱方法は冷たいものから熱いもの、冷却方法は熱いものから冷たいもの、の順に並べる必要があります。

機能ユニットの設計要求とコスト

機能ユニットの作成は柔軟にできます。機能ユニットはIDとユニット固有の引数で初期化されます。BioSTEAMには、厳密なモデリングと設計アルゴリズムを備えた基本的なユニット操作が含まれています。 以下は、例としてフラッシュ蒸留器モデルを作成する方法です:
  1. フラッシュ蒸留器モデル
  2. フラッシュ蒸留器とは、一般に加熱された混合液を減圧もしくは加圧することで蒸発させて液体と蒸気に分離する装置です。 蒸気分率Vと、大気圧と同じ圧力を指示することで定圧変化であること(isobaric)を指定します。蒸気分率Vは 0 は完全に液体、1 は完全に蒸気であることを示します。
    # Specify vapor fraction and isobaric conditions
    F1 = bst.Flash('F1', ins=feed, V=0.1, P=101325)
    F1.show()
    流入は[1]で作成した、水 50kmol/h、メタノール 20kmol/hのストリームを設定します。
    Flash: F1
    ins...
    [0] s1  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow (kmol/hr): Water     50
                        Methanol  20
    outs...
    [0] s2  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow: 0
    [1] s3  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow: 0
    outsは出力ストリームですが、この時点では出力ストリームは空のストリームで初期化されていることに注意してください。
  3. シミュレーションの実行
  4. モデルを動作させるためにはsimulateメソッドを実行します。
    F1.simulate()
    F1.show()
    フラッシュ蒸留器は、一般に加熱された混合液を減圧もしくは加圧することで蒸発させて液体と蒸気に分離する装置ですが、ここでは定圧変化を指定しているので、圧力変化なしで温度が上昇している様子と、液体と気体に分離出来ている様子が確認できます。
    Flash: F1
    ins...
    [0] s1  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow (kmol/hr): Water     50
                        Methanol  20
    outs...
    [0] s2  
        phase: 'g', T: 352.84 K, P: 101325 Pa
        flow (kmol/hr): Water     2.59
                        Methanol  4.41
    [1] s3  
        phase: 'l', T: 352.84 K, P: 101325 Pa
        flow (kmol/hr): Water     47.4
                        Methanol  15.6
    CostWarning(コスト警告)が表示されることがあります。これは、指定された設定に対して購入コストの相関式が適用範囲外であることを通知するものです。例としては問題ありませんが、プロセスが適切に設計されており、コスト相関が対象とする領域に合っていることを確認することが重要です。
  5. 結果の一覧
  6. デフォルトでモデルのDataFrame objectが確認できます。
    F1.results() # Default returns DataFrame object with units
    Flash Units F1
    Low pressure steam Duty kJ/hr 5.92e+05
    Flow kmol/hr 15.3
    Cost USD/hr 3.06
    Design Vessel type Horizontal
    Length ft 6.44
    Diameter ft 4
    Weight lb 1.38e+03
    Wall thickness in 0.312
    Vessel material Carbon steel
    Purchase cost Horizontal pressure vessel USD 1.12e+04
    Platform and ladders USD 3.21e+03
    Heat exchanger - Double pipe USD 4.3e+03
    Total purchase cost USD 1.87e+04
    Utility cost USD/hr 3.06
  7. 熱負荷(Duty)
  8. 機能ユニットには、ストリームやユーティリティ要件にアクセスするための便利なプロパティが備わっています。 以下では熱損失を含む熱負荷を返します。単位はデフォルトではkJ/hrです。
    F1.net_duty # Duty with heat transfer losses [kJ / hr]
    591521.1044683229
  9. 電力消費量
  10. 電力消費量を返します。単位はデフォルトではkWです。
    F1.net_power # Electricity consumption [kW]
    0.0
  11. 入出力の確認
  12. [F1.feed, F1.vapor, F1.liquid] # Inlet feed and vapor and liquid outlets
    [<Stream: s1>, <Stream: s2>, <Stream: s3>]
    BioSTEAMには多くの基本的な機能ユニットがありますが、プロセス固有のプロパティの多くはまだ利用できません。未実装のプロパティを実現するためにサブクラスを作成することもできます。

リサイクルループとプロセス仕様の計算

化学プロセスの設計は簡単な作業ではありません。ここでは、フラッシュ蒸留器を用いた部分的な液体リサイクルを含む、シンプルなリサイクルプロセスの例を紹介します。
  1. フラッシュ蒸留器と混合器(ミキサー)、分離器(スプリッター)を組み合わせたシステムの例
  2. recycle = bst.Stream('liquid_recycle')
    feed = bst.Stream('feed', Methanol=100, Water=450)
    M1 = bst.Mixer('M1', ins=(recycle, feed))
    F1 = bst.Flash('F1',
        ins=M1-0, # -pipe- notation equivalent to M1.outs[0]
        outs=('vapor_product', 'liquid'),
        V=0.1, P=101325
    )
    S1 = bst.Splitter('S1',
        ins=F1-1, # -pipe- notation equivalent to F1.outs[1]
        outs=(recycle, 'liquid_product'),
        split=0.5 # Split to 0th output stream
    )
    pipe記法で、ストリームの取得やユニットの接続をしています。
  3. フローシート
  4. ユニットの確認や接続の管理は、メイン フローシート(main flowsheet) を使って行うことができます。以下のメソッドで、システムの構成図を作成することが出来ます。空のストリームは点線で、線の太さは質量流量を表しています。※Graphvizをインストールしないと表示されません。
    bst.main_flowsheet.diagram()
    # Note that empty streams are dashed and the
    # width of streams depend on their flow rates (by mass)
  5. System オブジェクト
  6. System オブジェクトは、リサイクルループの計算やすべての機能モデルのシミュレーションを実行します。システムを作成する方法は複数ありますが、最も推奨される方法はフローシート(flowsheet)を利用することです。
    sys = bst.main_flowsheet.create_system('sys')
    sys.show()
    システムの入力はfeedストリームで、出力は液相(?あれ、気相では?温度から見ると液相か)のvapor_productストリームと液相のliquid_productストリームだということが分かります。
    System: sys
    ins...
    [0] feed  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow (kmol/hr): Water     450
                        Methanol  100
    outs...
    [0] vapor_product  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow: 0
    [1] liquid_product  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow: 0
  7. System オブジェクトの実行
  8. System オブジェクトのシミュレーションを実行します。
    sys.simulate()
    sys.show()
    System: sys
    Highest convergence error among components in recycle
    stream S1-0 after 4 loops:
    - flow rate   3.12e-01 kmol/hr (0.57%)
    - temperature 3.56e-02 K (0.0099%)
    ins...
    [0] feed  
        phase: 'l', T: 298.15 K, P: 101325 Pa
        flow (kmol/hr): Water     450
                        Methanol  100
    outs...
    [0] vapor_product  
        phase: 'g', T: 359.26 K, P: 101325 Pa
        flow (kmol/hr): Water     53.4
                        Methanol  46.7
    [1] liquid_product  
        phase: 'l', T: 359.26 K, P: 101325 Pa
        flow (kmol/hr): Water     397
                        Methanol  53.6
    リサイクルストリームが収束し、フラッシュ蒸留器を含むすべてのユニットがシミュレーションできました。vapor_productストリームの方も無事、気相になってました。※Highest convergence error among components in ...というのは、最も収束誤差が大きかったのは、ということで、今回は流量(flow rate)が最も誤差が大きかったが0.57%と十分小さい、と言いたいものと思われます。
  9. System 計算結果
  10. システムレベルでの結果を確認します。
    sys.results()
    System Units sys
    Low pressure steam Duty kJ/hr 6.76e+06
    Flow kmol/hr 175
    Cost USD/hr 34.9
    Total purchase cost USD 3.87e+04
    Installed equipment cost USD 1.15e+05
    Utility cost USD/hr 34.9
    Material cost USD/hr 0
    Sales USD/hr 0
  11. レポートの出力
  12. 一度、システムのシミュレーションを実行すると、システムレポートを保存することができ、詳細な結果を エクセル スプレッドシート形式で確認することができます。
    sys.save_report('Example.xlsx')
    システムの図と、Stream tableUtilitiesesign requirementsというシートが生成されました。
    • Stream table
    • Utilities
    • Design requirements
  13. (おまけ)システム図をPNGで保存
  14. sys.diagram()のオブジェクトを取得することで、PNGファイルとして出力できます。先程のエクセル シートにも含まれていましたが、別のファイルに出力したい場合は以下で出力できます。
    bst.main_flowsheet.diagram(file='flowsheet_diagram', format='png')
キャッシュフロー分析がレポートに表示されなかったのは、分析を行うために必要なパラメータ(例:減価償却スケジュール、プラントの寿命、建設スケジュールなど)を含む TEA(Techno-Economic Analysis)オブジェクト が設定されていないためです。 TEAオブジェクトを使用すると、内部収益率(IRR)、最小製品販売価格(MPSP)、最大原料購入価格(MFPP)のような経済指標を計算することも可能になります。技術経済評価(techno-economic analysis:TEA)は、キャッシュフロー分析が非常に広範であるため、チュートリアルの後半で詳しく解説されます。

このブログの人気の投稿

蒸留塔

機器ユニットの計算結果