Stream(ストリーム)

バイオ・リファイナリー(再生可能資源であるバイオマスを原料にバイオ燃料や樹脂などを製造するプラントや技術)のシミュレーションソフト"BioSTEAM"の固体、液体、気体を含むプロセス流体を表すStreamの使い方を説明しています。 オリジナルのページはStreamです。本家ページは巨大なので、調査した部分のみ、記載しています。徐々に充実させていく予定です。 ソースコードは以下の実行環境で確認しています。
  • Visual Studio Code バージョン: 1.104.2
  • 拡張機能:Jupyter バージョン 2025.8.0
  • Python 3.12.10
  • biosteam 2.52.13
  • graphviz-14.0.2

Stream

class Stream (ID='', flow=None, phase='l', T=298.15, P=101325.0, units=None, price=0.0, total_flow=None, thermo=None, characterization_factors=None, vlle=False, **chemical_flows) [source]

Streamオブジェクトを作成することで、物質の流量と熱力学状態を定義できます。 ストリームの熱力学的性質や輸送特性はプロパティとして取得可能であり、熱力学的平衡(例:蒸気液平衡(VLE)、沸点、露点)はメソッドとして利用できます。

  • パラメータ
    • ID (str、省略可)
    • 他で使われていない、一意の識別子(ID)。IDが None の場合、ストリームは登録されません。IDが指定されていない場合は、自動的に一意のIDが付与されます。
    • flow (シーケンス(順序付きコレクション)[float]、省略可)
    • 定義された成分それぞれに対応する流量。単位はunitsで指定する。
    • phase (str、省略可)
    • 相。'g'は気相(ガス)、'l'は液相(リキッド)、's'は固体相(ソリッド)。デフォルトは'l'。
    • T (float、省略可)
    • 温度[K]。デフォルトは298.15[K](=25℃)。
    • P (float、省略可)
    • 圧力[Pa]。デフォルトは101325[Pa]。
    • units (str、省略可)
    • 流量の単位。質量、モル、体積流量が利用可能。デフォルトは'kmol/hr'
    • Price (float、省略可)
    • 体積当たりの費用[USD/kg]。デフォルトは0。
    • total_flow (float、省略可)
    • 総流量
    • thermo (Thermo、省略可)
    • Thermoオブジェクトの入力ストリームと出力ストリームを初期化する。デフォルトはsettings.thermo.
    • characterization_factors (dict[str,float]、省略可)
    • ライフサイクル評価(LCA: Life Cycle Assessment)において、環境影響評価の段階で使用される特性係数。
    • vlle (bool、省略可)
    • 厳密な相平衡計算を実行して相を決定するかどうか。デフォルトはFalse。
    • **chemical_flows (float、省略可)
    • ID - 流量のペア。
  • ストリームを生成する前に、使用する化学種を設定します。

    import thermosteam as tmo
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    ストリームを生成するには、熱力学的状態と流量を定義します。
    s1 = tmo.Stream(ID='s1',
                    Water=20, Ethanol=10, units='kg/hr',
                    T=298.15, P=101325, phase='l')
    s1.show(flow='kg/hr') # 表示するための単位を選択するにはshowメソッドを使います
    Stream: s1
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Water    20
                  Ethanol  10
    s1.show(composition=True, flow='kg/hr') # 割合で表示することも可能(この場合は質量分率)
    Stream: s1
    phase: 'l', T: 298.15 K, P: 101325 Pa
    composition (%): Water    66.7
                     Ethanol  33.3
                     -------  30 kg/hr
    すべての流量は、mol 属性内の疎配列として保存されています。この配列は NumPy 配列と同様に動作しますが、疎な化学データに対しては、よりスケーラブル(メモリ節約と高速化)に機能します。
    s1.mol # モル流量 [kmol/hr]
    sparse([1.11 , 0.217])
    質量流量や体積流量も利用可能です。
    s1.mass # [kg/hr] 
    sparse([20., 10.])
    s1.vol # m3/hr
    sparse([0.02 , 0.013])
    これらの配列は、モル流量と連携しています。
    # 質量流量はモル流量と同期して最新の状態に保たれます
    s1.mol[0] = 1
    s1.mass
    sparse([18.015, 10.   ])
    s1.mass[0]
    18.01528
    ※水1molの質量は約18.015g
    # モル流量を変更するとモル流量も変化します
    s1.mass[0] *= 2
    s1.mol[0]
    2.0
    以下の例では、配列の元のデータは変更されず、新しい配列が返されます。これはNumpyやPandasの仕様に依存しています。
    # 新しい配列はモル流量とリンクしていません
    s1.mass + 2
    これを実行すると各要素が+2された配列が返ってきますが、
    sparse([38.031, 12.   ])
    再度s1.massを確認すると、
    s1.mass
    sparse([36.031, 10.   ])
    となっていて、元のデータは変更されていません。元のデータを変更したい場合は例えば、
    s1.mass += 2
    などとすれば変更できます。
    s1.mass
    sparse([38.031, 12.   ])
    温度、圧力、相も同様に確認できます。
    (s1.T, s1.P, s1.phase)
    (298.15, 101325.0, 'l')
    流量を取得・設定する最も便利な方法は、get_flow メソッドと set_flow メソッドを使うことです。
    # 流量をセット
    s1.set_flow(1, 'gpm', 'Water')
    s1.get_flow('gpm', 'Water')
    1.0
    gpmはガロン毎分(Gallons Per Minute)ですかね。次はいくつかの成分をまとめて設定する場合です。
    # 複数の成分を設定
    s1.set_flow([10, 20], 'kg/hr', ('Ethanol', 'Water'))
    s1.get_flow('kg/hr', ('Ethanol', 'Water'))
    array([10., 20.])
    IDを指定して、imol、imass、ivol の各インデクサーを使って取得することも可能です。
    s1.imol.show()
    ChemicalMolarFlowIndexer (kmol/hr):
    (l) Water    1.11
        Ethanol  0.217
    s1.imol['Water']
    1.1101687012358397
    順番を入れ替えても指定通りの順番で返ってきます。
    s1.imol['Ethanol', 'Water']
    array([0.217, 1.11 ])
    熱力学的な値もストリームのプロパティとして扱うことが出来ます。
    s1.H # エンタルピー (kJ/hr)
    0.0
    基準エンタルピーは、基準温度 298.15 K(25℃) および圧力 101,325 Pa において 0.0 と定義されています。 基準温度より10℃高い温度のエンタルピーは以下のように取得できます。
    s1.T += 10
    s1.H
    1083.467342125117
    他の温度や圧力に依存する熱力学的な値、たとえば密度は以下のように取得できます。
    s1.rho # 密度 [kg/m3]
    909.1470679081256
    単位を変えるのも簡単です。
    s1.get_property('rho', 'g/cm3')
    0.9091470679081258
    他にも、単位を指定して設定することが出来ます。
    s1.set_property('T', 40, 'degC')
    s1.T
    313.15
    気泡点(バブルポイント)および露点(デューポイント)の計算は、ストリームに備えられたメソッドを通じて実行できます。
    bp = s1.bubble_point_at_P() # 所定圧力での気泡点
    bp
    BubblePointValues(T=357.14, P=101325, IDs=('Water', 'Ethanol'), z=[0.836 0.164], y=[0.492 0.508])
    BubblePointValuesには種々のデータが含まれています。
    tmo.docround(bp.T) # 温度 [K]
    357.1442
    bp.y # 気相のモル比率
    array([0.492, 0.508])
    気液平衡は、 T[温度(K)]、P[圧力(Pa)]、V[蒸気分率(混合物中の蒸気の割合)]、H[エンタルピー(kJ/hr)]のうち2つを指定することで計算可能です。 ストリームの蒸気分率と圧力を指定してみましょう。
    s1.vle(P=101325, V=0.5)
    s1.show()
    MultiStream: s1
    phases: ('g', 'l'), T: 364.78 K, P: 101325 Pa
    flow (kmol/hr): (g) Water    0.472
                        Ethanol  0.191
                    (l) Water    0.638
                        Ethanol  0.0257
    今、このストリームは、複数の相を管理するために、マルチストリームオブジェクト(MultiStream object)になっています。 各相の値はそれぞれ取り出すこともできます。
    s1['l'].show()
    Stream: 
    phase: 'l', T: 364.78 K, P: 101325 Pa
    flow (kmol/hr): Water    0.638
                    Ethanol  0.0257
    s1['g'].show()
    Stream: 
    phase: 'g', T: 364.78 K, P: 101325 Pa
    flow (kmol/hr): Water    0.472
                    Ethanol  0.191
    ここまでの結果を使って、蒸気分率が本当に0.5になっているかも確認しておきます。ストリームの総モル数はF_molで取得できます。
    s1.F_mol
    1.3272370456382114
    液相のモル数
    s1['l'].F_mol
    0.6636185226365505
    気相のモル数
    s1['g'].F_mol
    0.6636185230016609
    マルチストリームは、相を指定することで単相のストリームに戻すこともできます。
    s1.phase = 'l'
    s1.show(flow='kg/hr')
    Stream: s1
    phase: 'l', T: 364.78 K, P: 101325 Pa
    flow (kg/hr): Water    20
                  Ethanol  10
    温度、圧力そのままで液体のみのストリームになった、という想定でしょうか。

price : プロパティ, float

ストリームの質量当たりのコスト[USD/kg]。ケーススタディの Sugarcane ethanol biorefineryでは、以下のように設定されています。
sugarcane = bst.Stream(
    'sugarcane',
    Water=0.7,
    Glucose=0.01208,
    Sucrose=0.1369,
    Ash=0.006,
    Fiber=0.13,
    Solids=0.015,
    total_flow=370396,
    units='kg/hr',
    price=price['Sugar cane']
)

sugarcane.price
0.03455

cost : プロパティ, float

ストリームのコスト[USD/hr]。運用コストの計算等に使用する。price * F_mass。

T : プロパティ, float

温度[K]。

P : プロパティ, float

圧力[Pa]。

phase : プロパティ, str

ストリームの相。'g':気相(気体)、'l':液相(液体)、's':固相(固体)。

mol : プロパティ, ndarray [Any,dtype[float]]

成分ごとのモル流量[kmol/hr]の配列。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.mol # モル流量 [kmol/hr]
sparse([1.11 , 0.217])

mass : プロパティ, SparseVector / SparseArray

成分ごとの質量流量[kg/hr]の配列。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.mass # [kg/hr] 
sparse([20., 10.])

vol : プロパティ, SparseVector / SparseArray

成分ごとの体積流量[m3/hr]の配列。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.vol # m3/hr 
sparse([0.02 , 0.013])

imol : プロパティ, Indexer

指定成分のモル流量[kmol/hr]。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.imol['Water']
1.1101687012358397
s1.imol['Ethanol', 'Water']
array([0.217, 1.11 ])
成分の指定がない場合はそのストリームに含まれるすべての成分と流量を相ごとに取得できる。
s1.vle(P=101325, V=0.5)
s1.imol
MolarFlowIndexer (kmol/hr):
(g) Water     0.472
    Ethanol   0.191
(l) Water     0.638
    Ethanol   0.0257
相が分かれているときも、成分を指定するときはその成分の合計になる。
s1.imol['Water']
1.1101687012358397

imass : プロパティ, Indexer

指定成分の質量流量[kg/hr]。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.imass['Water']
20.0
s1.imass['Ethanol', 'Water']
array([10., 20.])
インデックスの指定がない場合はそのストリームに含まれるすべての成分(ID)と流量を相ごとに取得できる。
s1.vle(P=101325, V=0.5)
s1.imass
MassFlowIndexer (kg/hr):
(g) Water     8.51
    Ethanol   8.82
(l) Water     11.5
    Ethanol   1.18
相が分かれているときも、成分(ID)を指定するときはその成分のモル数に応じた質量の合計になる。
s1.imass['Water']
20.0

ivol : プロパティ, Indexer

指定成分の体積流量[m3/hr]。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.ivol['Water']
0.020058883268535846
s1.ivol['Ethanol', 'Water']
array([ 5.596, 13.951])
インデックスの指定がない場合はそのストリームに含まれるすべての成分(ID)と流量を相ごとに取得できる。
s1.vle(P=101325, V=0.5)
s1.imass
VolumetricFlowIndexer (m^3/hr):
(g) Water     13.9
    Ethanol   5.59
(l) Water     0.0119
    Ethanol   0.00164
相が分かれているときも、成分(ID)を指定するときはその成分のモル数に応じた体積の合計になる。
s1.ivol['Water']
13.951053242798679

F_mol : プロパティ, float

総モル流量[kmol/hr]。

import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.F_mol
1.3272370456382114

F_mass : プロパティ, float

総質量流量[kg/hr]。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.F_mass
30.0

F_vol : プロパティ, float

総体積流量[m3/hr]。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.F_vol
0.03279510123305701

H : プロパティ float

エンタルピー流量[kJ/hr]。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.H # エンタルピー (kJ/hr)
0.0
基準エンタルピーは、基準温度 298.15 K(25℃) および圧力 101,325 Pa において 0.0 と定義されています。 基準温度より10℃高い温度のエンタルピーは以下のように取得できます。
s1.T += 10
s1.H
1083.467342125117

MW : プロパティ float

ストリーム全体の1モル当たりの質量[g/mol(=kg/kmol)]。 Mixture.MW(mol)を使って計算しています。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.MW
22.603347381382264

Cn : プロパティ, float

定圧モル比熱(熱容量) [J/mol/K]。 いくつかのサイトによると、水の定圧モル比熱は75.291 J/mol/Kらしい。近い値が設定されています。
import thermosteam as tmo
tmo.settings.set_thermo(['Water'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.Cn
75.32753127987698

Cp : プロパティ float

定圧比熱(熱容量) [J/g/K]。 いくつかのサイトによると、水の定圧比熱は4184 J/kg/Kらしい。
import thermosteam as tmo
tmo.settings.set_thermo(['Water','Ethanol'], cache=True)

s1 = tmo.Stream(ID='s1',
                Water=20, units='kg/hr',
                T=298.15, P=101325, phase='l')
s1.Cp
4.181313378414156
エタノールは液体(25℃、常圧)で 2418 J(kg/k)らしい。
s2 = tmo.Stream(ID='s2',
                Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s2.Cp
2.4344813098812486
混合した場合も自動で計算されます。こういう計算を自動でやってくれるところがこの手のソフトの嬉しいところ。
import thermosteam as tmo
tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)

s3 = tmo.Stream(ID='s3',
                Water=20, Ethanol=10, units='kg/hr',
                T=298.15, P=101325, phase='l')
s3.Cp
3.59903602223652
最後までソースコードを追えていませんが、 \[ Cp_{混合流} = \frac{Cn_{水} \cdot (水のモル分率) + Cn_{エタノール} \cdot (エタノールのモル分率)}{モル当たりの質量} \] というような計算をしているようですので、確認してみます。
(s1.Cn * s3.imol['Water'] / s3.F_mol + s2.Cn * s3.imol['Ethanol'] / s3.F_mol ) / s3.MW
3.59903602223652
と一致します。なお、ここまで見ても分かるように、単位は[kJ/g/K]と思われます。

bubble_point_at_T(P=None, IDs=None)[source]

指定温度で平衡状態になった時の気泡点(バブルポイント)に関するすべてのデータを含む BubblePointResults オブジェクトを返します。

  • パラメータ
    • T(float、省略可)
    • 温度 [K]。省略時はストリームの定義に基づいて25℃(298.15K)になります。
    • IDs(シーケンス(順序付きコレクション)[str]、省略可)
    • 平衡に関与する成分。指定がない場合は、ストリームにあるすべての成分が対象となり、平衡となった場合の気泡点温度を返します。
  • import thermosteam as tmo
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    s1 = tmo.Stream('s1', Water=20, Ethanol=10, T=350, units='kg/hr')
    s1.bubble_point_at_T()
    BubblePointValues(T=350.00, P=76463, IDs=('Water', 'Ethanol'), z=[0.836 0.164], y=[0.488 0.512])

    結果、ストリームs1定義時にT=350K(76.85℃)で設定しているので、350K(76.85℃)での気泡点(バブリングポイント)データが確認できます。T:温度350K(76.85℃)、P:圧力76,463Pa、計算対象の成分(ID)は水、エタノール、zは全体のモル比率(液相と気相の全体の組成)で、水 0.836:エタノール 0.164、yは気相のモル比率(気相の組成)で、水 0.492:エタノール 0.508だそうです。

  • 補足(i)
  • BubblePointValuesオブジェクトは、thermosteam.equilibrium.bubble_point.BubblePointValuesにあります。

  • 補足(ii)
  • 気泡点(バブルポイント)が自分にとっては聞きなれない言葉だったので追加で調べてみました。
    import thermosteam as tmo
    tmo.settings.set_thermo(['Water'], cache=True)
    
    water = tmo.Stream(ID='water',
                    Water=20, units='kg/hr',
                    T=298.15, P=101325, phase='l')
    water.bubble_point_at_T()
    BubblePointValues(T=298.15, P=3170, IDs=('Water',), z=[1.], y=[1.])
    水の25℃での飽和水蒸気圧は3,170Paだそうで、通常の大気圧(101.3 kPa)では沸騰しない、と。
    import thermosteam as tmo
    tmo.settings.set_thermo(['Ethanol'], cache=True)
    
    ethanol = tmo.Stream(ID='ethanol',
                    Ethanol=10, units='kg/hr',
                    T=298.15, P=101325, phase='l')
    ethanol.bubble_point_at_T()
    BubblePointValues(T=298.15, P=7885, IDs=('Ethanol',), z=[1.], y=[1.])
    エタノールの25℃での飽和蒸気圧は7,885Paだそうなので、やはり25℃では沸騰しないが、減圧していくと水よりは高い圧力で沸騰しそうですね。混合すると、その間の圧力になりました。
    import thermosteam as tmo
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    
    s2 = tmo.Stream(ID='s2',
                    Water=20, Ethanol=10, units='kg/hr',
                    T=298.15, P=101325, phase='l')
    s2.bubble_point_at_T()
    BubblePointValues(T=298.15, P=5946, IDs=('Water', 'Ethanol'), z=[0.836 0.164], y=[0.472 0.528])
    温度を350Kまで上げると、先ほどの例と同じ結果になりますね。
    s2.T=350
    s2.bubble_point_at_T()
    BubblePointValues(T=350.00, P=76463, IDs=('Water', 'Ethanol'), z=[0.836 0.164], y=[0.488 0.512])

bubble_point_at_P(P=None, IDs=None, vlle=False)[source]

指定圧力で平衡状態になった時の気泡点(バブルポイント)に関するすべてのデータを含む BubblePointResults オブジェクトを返します。

  • パラメータ
    • P(float、省略可)
    • 圧力 [Pa]。省略時はストリームの定義に基づいて大気圧(101,325Pa)になります。
    • IDs(シーケンス(順序付きコレクション)[str]、省略可)
    • 平衡に関与する成分。指定がない場合は、ストリームにあるすべての成分が対象となり、平衡となった場合の気泡点温度を返します。
    • vlle
    • vlle=Trueの時は、蒸気-液体-液体平衡(VLLE:Vapor-Liquid-Liquid Equilibrium)を考慮した気泡点を計算します。通常の気液平衡(VLE)とは異なり、VLLEでは液相が水相と有機相のような2つの相に分離するような状態も考慮するそうです。
  • import thermosteam as tmo
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    s1 = tmo.Stream('s1', Water=20, Ethanol=10, T=350, units='kg/hr')
    s1.bubble_point_at_P()
    BubblePointValues(T=357.14, P=101325, IDs=('Water', 'Ethanol'), z=[0.836 0.164], y=[0.492 0.508])
    結果、Pは省略したので、大気圧(101,325Pa)での気泡点(バブルポイント)に関するデータが確認でき、T:温度357.15K(83.99℃)、P:圧力101,325Pa、計算対象の成分(ID)は水、エタノール、zは全体のモル比率(液相と気相の全体の組成)で、水 0.836:エタノール 0.164、yは気相のモル比率(気相の組成)で、水 0.492:エタノール 0.508だそうです。
  • 補足(i)
  • BubblePointValuesオブジェクトは、thermosteam.equilibrium.bubble_point.BubblePointにあります。

  • 補足(ii)
  • 気泡点(バブルポイント)が自分にとっては聞きなれない言葉だったので追加で調べてみました。
    import thermosteam as tmo
    tmo.settings.set_thermo(['Water'], cache=True)
    
    water = tmo.Stream(ID='water',
                    Water=20, units='kg/hr',
                    T=298.15, P=101325, phase='l')
    water.bubble_point_at_P()
    BubblePointValues(T=373.12, P=101325, IDs=('Water',), z=[1.], y=[1.])
    水の大気圧での沸点は99.97℃(373.12K)になっています。
    import thermosteam as tmo
    tmo.settings.set_thermo(['Ethanol'], cache=True)
    
    ethanol = tmo.Stream(ID='ethanol',
                    Ethanol=10, units='kg/hr',
                    T=298.15, P=101325, phase='l')
    ethanol.bubble_point_at_P()
    BubblePointValues(T=351.57, P=101325, IDs=('Ethanol',), z=[1.], y=[1.])
    エタノールの大気圧での沸点は78.6℃(351.57K)となっています。この二つの結果
    import thermosteam as tmo
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    
    s2 = tmo.Stream(ID='s2',
                    Water=20, Ethanol=10, units='kg/hr',
                    T=298.15, P=101325, phase='l')
    s2.bubble_point_at_P()
    BubblePointValues(T=357.14, P=101325, IDs=('Water', 'Ethanol'), z=[0.836 0.164], y=[0.492 0.508])
    温度を83.99℃(357.14K)まで上げると、気泡が発生しだす、ということですね。

mix_from(flow=None, energy_balance=True, vle=False, Q=0.0, conserve_phases=False ) [source]

複数のストリームをひとつに混合します。その際、元の設定は無視します。

  • パラメータ
  • 注記
  • 混合するストリームの圧力が違う場合、BioSTEAMは混合したストリームが逆流しない様にバルブを想定し、減圧します。ベルヌーイの定理に従い、圧力は流れる方向に向かって圧力が下がるものとします。下流の圧力は、混合されたストリームの一番低い圧力となります。
  • 2つの同じ熱力学的特性を持つストリームを混合します。
    import thermosteam as tmo
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    s1 = tmo.Stream('s1', Water=20, Ethanol=10, units='kg/hr')
    s2 = s1.copy('s2')
    s1.mix_from([s1, s2])
    s1.show(flow='kg/hr')
    Stream: s1
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Water    40
                  Ethanol  20
    混合先のストリームの物性パッケージにすべての化学種が定義されていれば、異なる物性パッケージを持つストリーム同士を混合することも可能です。
    tmo.settings.set_thermo(['Water'], cache=True)
    s1 = tmo.Stream('s1', Water=40, units='kg/hr')
    tmo.settings.set_thermo(['Ethanol'], cache=True)
    s2 = tmo.Stream('s2', Ethanol=20, units='kg/hr')
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    s_mix = tmo.Stream('s_mix')
    s_mix.mix_from([s1, s2])
    s_mix.show(flow='kg/hr')
    Stream: s_mix
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Water    40
                  Ethanol  20
    空のストリームを指定することも可能です。
    s1.empty(); s2.empty(); s_mix.mix_from([s1, s2])
    s_mix.show()
    Stream: s_mix
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow: 0

copy_flow(flow=None, remove=False, exclude=False ) [source]

指定したストリームのコピーを作成します。

  • パラメータ
  • コピー元のストリームとして's1'を、コピー先のストリームとして's2'を用意します。's1'は水 20kg/hrとエタノール 10kg/hrが混合されているとします。
    import thermosteam as tmo
    tmo.settings.set_thermo(['Water', 'Ethanol'], cache=True)
    s1 = tmo.Stream('s1', Water=20, Ethanol=10, units='kg/hr')
    s2 = tmo.Stream('s2')
    全てをコピーします。
    s2.copy_flow(s1)
    s2.show(flow='kg/hr')
    Stream: s2
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Water    20
                  Ethanol  10
    一度's2'を削除し、水だけをコピーします。
    s2.empty()
    s2.copy_flow(s1, 'Water')
    s2.show(flow='kg/hr')
    Stream: s2
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Water  20
    再度's2'を削除し、水以外をコピーします。
    s2.empty()
    s2.copy_flow(s1, 'Water', exclude=True)
    s2.show(flow='kg/hr')
    Stream: s2
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Ethanol  10
    コピーして元のストリームを削除します。
    s2.copy_flow(s1, remove=True)
    s2.show(flow='kg/hr')
    Stream: s2
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Water    20
                  Ethanol  10
    元の's1'を確認します。
    s1.show()
    Stream: s1
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow: 0
    流量がゼロになっていますね。これは、混相流でも適用できます。気体の水のストリームを設定します。
    s1.phases = ('g', 'l')
    s1.imol['g', 'Water'] = 10
    s1.show()
    MultiStream: s1
    phases: ('g', 'l'), T: 298.15 K, P: 101325 Pa
    flow (kmol/hr): (g) Water  10
    s2.copy_flow(s1, remove=True)
    s2.show()
    Stream: s2
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kmol/hr): Water  10
    モル流量はコピーできましたが、相は液体になるようです。remove=Trueとしましたので、元のストリームの流量はゼロになります。
    s1.show()
    MultiStream: s1
    phases: ('g', 'l'), T: 298.15 K, P: 101325 Pa
     flow: 0
    水分以外をコピーし、元のストリームから削除します。水以外の成分を抜き出して移動させるイメージでしょうか。
    s1 = tmo.Stream('s1', Water=20, Ethanol=10, units='kg/hr')
    s2 = tmo.Stream('s2')
    s2.copy_flow(s1, 'Water', exclude=True, remove=True)
    s1.show('wt')
    Stream: s1
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Water  20
    's1'には水分だけ残っています。
    s2.show('wt')
    Stream: s2
    phase: 'l', T: 298.15 K, P: 101325 Pa
    flow (kg/hr): Ethanol  10
    's2'にエタノールが移動した形です。

show(layout=None, T=None, P=None, flow=None, composition=None, N=None, IDs=None, sort=None, data=True)

当該機器ユニットの情報を表示します。

  • パラメータ
    • layout (str、省略可) - 流量・組成・成分数 N をまとめて設定するための簡易的な表現。最初の文字が'%'または'c'の時はcompostion=True、'wt'はflow='kg/hr'、その後に数字があればN=で設定できる。例えば、‘%wt100’は compostion=True, flow='kg/hr',and N=100と同じ。
    • T(str、省略可) - 表示される温度の単位。摂氏は'degC'、デフォルトは'K'。
    • P(str、省略可) - 表示される圧力の単位。気圧は'atm'、使用可能な単位は'kPa'、'mmHg'、'psi'等。デフォルトは'Pa'。
    • flow(str、省略可) - 表示される流体流量の単位。質量流量は例えば'kg/hr'、'L/hr'、デフォルトは'kmol/hr'。
    • composition(bool、省略可) - 成分割合(%)を表示する場合はTrue、不要の場合はFalse。デフォルトはTrue。
    • data(bool、省略可) - データの表示なしで流入、流出ストリームの確認のみで良い場合はFalse、デフォルトはTrue。
  • import biosteam as bst
    bst.settings.set_thermo(['Water', 'Ethanol', 'Methanol', 'Propanol'])
    stream = bst.Stream('stream', Water=0.5, Ethanol=1.5, Methanol=0.2, Propanol=0.3, units='kg/hr')
    stream.show('cwt2s') # Alternatively: stream.show(composition=True, flow='kg/hr', N=2, sort=True)
    Stream: stream
    phase: 'l', T: 298.15 K, P: 101325 Pa
    composition (%): Ethanol  60
                     Water    20
                     ...      20
                     -------  2.5 kg/hr

このブログの人気の投稿

さあ、始めよう!

蒸留塔

機器ユニットの計算結果