さあ、始めよう!
バイオ・リファイナリー(再生可能資源であるバイオマスを原料にバイオ燃料や樹脂などを製造するプラントや技術)のシミュレーションソフト"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を見てください。ここでのサンプルは、いくつかの良く知られている化学物質からなる単純な流入ストリームを初期化しています。- ストリームの設定 水が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
feed.price = 0.15 # USD/kg
from biosteam import settings
feed.cost # USD/hr
結果:kgあたり0.15USDだと、1時間あたりで231.24018USDになるようです。
231.24018
プロセスの設定
プロセスの設定には原料および製品の価格、ユーティリティの条件、化学工学プラント費用指数が含まれます。これらはシステムのシミュレーションを行う前に設定しておく必要があります。- 化学工学プラント費用指数の設定 化学工学プラント費用指数(Chemical Engineering Plant Cost Index)を設定します。※(Chemical Engineering Plant Cost Index, CEPCI)とは、化学プラントの建設・運営にかかるコストの変動を数値化した指標だそうです。たとえば、2000年に建設されたプラントの費用が100億円で、当時のCEPCIが400、現在のCEPCIが800であれば、現在の推定費用 ≒ 100億円 × (800 ÷ 400) = 200億円のように使うそうです。
- CEPCIの設定
- 電力関係の設定 電力関係の設定で電力のコストを設定できます。
- 電力料金の設定
- 冷熱関係の設定 冷熱関係の設定HeatUtilityは、UtilityAgent オブジェクトを使って設定します。これらのオブジェクトは Stream オブジェクトであり、ユーティリティエージェントを記述する属性が追加されています。
- 冷却水の設定 冷却水を選択した場合の設定を確認します。
- 再生水のコスト(USD/kmol)を確認
- 他の冷却方法のコストは熱の輸送量により、単位は USD/kJ ここでは「chilled water(チルドウォーター)」を確認します。「chilled water(チルドウォーター)」とは、「冷却された水」で、「cooling_water」は通常常温で使用する冷却水を指すことが多いようです。
- 冷却水の温度を変更
- 選択可能な加熱方法を確認
- 加熱方法を設定 詳細も確認可能。ただし、冷却方法と違い、相が変わる可能性もあるので 'T_limit' はありません。
- コストを調整
- 冷媒の変更 プロパン、プロピレン、エチレンを冷媒から外します。
- アンモニアを冷媒に追加 推定コストはProduct and Process Design Principles Synthesis, Analysis and Evaluation. Wiley (2016), Warren D.Seider's の表 17.1より。
settings.CEPCI # デフォルトは2017年の数字
567.5
settings.CEPCI = 603.1 # 2018年の数字
settings.electricity_price # デフォルトの電力価格 (USD/kWhr)
0.0782
settings.electricity_price = 0.065 # 適正に設定できます
settings.cooling_agents # 利用可能な冷却媒体の表示
[<UtilityAgent: cooling_water>, <UtilityAgent: chilled_water>, <UtilityAgent: chilled_brine>, <UtilityAgent: propane>, <UtilityAgent: propylene>, <UtilityAgent: ethylene>]
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
# Price of regenerating the utility in USD/kmol
cooling_water.regeneration_price
0.00048785
# 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
cooling_water.T = 302 # Change the temperature of cooling water (K)
settings.heating_agents # All available heating agents
[<UtilityAgent: low_pressure_steam>, <UtilityAgent: medium_pressure_steam>, <UtilityAgent: high_pressure_steam>, <UtilityAgent: natural_gas>]
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
lps.regeneration_price = 0.20 # Adjust price (USD/kmol)
settings.cooling_agents = settings.cooling_agents[:-3]
settings.cooling_agents
[<UtilityAgent: cooling_water>, <UtilityAgent: chilled_water>, <UtilityAgent: chilled_brine>]
# 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には、厳密なモデリングと設計アルゴリズムを備えた基本的なユニット操作が含まれています。 以下は、例としてフラッシュ蒸留器モデルを作成する方法です:- フラッシュ蒸留器モデル フラッシュ蒸留器とは、一般に加熱された混合液を減圧もしくは加圧することで蒸発させて液体と蒸気に分離する装置です。 蒸気分率Vと、大気圧と同じ圧力を指示することで定圧変化であること(isobaric)を指定します。蒸気分率Vは 0 は完全に液体、1 は完全に蒸気であることを示します。
- シミュレーションの実行 モデルを動作させるためには
- 結果の一覧 デフォルトでモデルの
- 熱負荷(Duty) 機能ユニットには、ストリームやユーティリティ要件にアクセスするための便利なプロパティが備わっています。 以下では熱損失を含む熱負荷を返します。単位はデフォルトではkJ/hrです。
- 電力消費量 電力消費量を返します。単位はデフォルトではkWです。
- 入出力の確認
# 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は出力ストリームですが、この時点では出力ストリームは空のストリームで初期化されていることに注意してください。
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(コスト警告)が表示されることがあります。これは、指定された設定に対して購入コストの相関式が適用範囲外であることを通知するものです。例としては問題ありませんが、プロセスが適切に設計されており、コスト相関が対象とする領域に合っていることを確認することが重要です。
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 |
F1.net_duty # Duty with heat transfer losses [kJ / hr]
591521.1044683229
F1.net_power # Electricity consumption [kW]
0.0
[F1.feed, F1.vapor, F1.liquid] # Inlet feed and vapor and liquid outlets
[<Stream: s1>, <Stream: s2>, <Stream: s3>]BioSTEAMには多くの基本的な機能ユニットがありますが、プロセス固有のプロパティの多くはまだ利用できません。未実装のプロパティを実現するためにサブクラスを作成することもできます。
リサイクルループとプロセス仕様の計算
化学プロセスの設計は簡単な作業ではありません。ここでは、フラッシュ蒸留器を用いた部分的な液体リサイクルを含む、シンプルなリサイクルプロセスの例を紹介します。- フラッシュ蒸留器と混合器(ミキサー)、分離器(スプリッター)を組み合わせたシステムの例
- フローシート ユニットの確認や接続の管理は、
- System オブジェクト System オブジェクトは、リサイクルループの計算やすべての機能モデルのシミュレーションを実行します。システムを作成する方法は複数ありますが、最も推奨される方法はフローシート(flowsheet)を利用することです。
- System オブジェクトの実行 System オブジェクトのシミュレーションを実行します。
- System 計算結果 システムレベルでの結果を確認します。
- レポートの出力 一度、システムのシミュレーションを実行すると、システムレポートを保存することができ、詳細な結果を エクセル スプレッドシート形式で確認することができます。
- (おまけ)システム図をPNGで保存 sys.diagram()のオブジェクトを取得することで、PNGファイルとして出力できます。先程のエクセル シートにも含まれていましたが、別のファイルに出力したい場合は以下で出力できます。
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記法で、ストリームの取得やユニットの接続をしています。
メイン フローシート(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)
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
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%と十分小さい、と言いたいものと思われます。
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 |
sys.save_report('Example.xlsx')
システムの図と、Stream table、
Utilities、
esign requirementsというシートが生成されました。
bst.main_flowsheet.diagram(file='flowsheet_diagram', format='png')



