Webアプリを作成するためにFlaskやDjangoを勉強していましたが、なかなかGUIの作成まで辿りつかないまま挫折していました。
今回Streamlitという素晴らしいモジュールと出会ったので、こちらを使って簡単なBVLEプロットアプリを作成してみました。
先に動作イメージは以下のような感じです。
サブウィンドウ、スライダー、ラジオボタンや入力ボックスの設置、グラフ表示等を簡単に行うことができます。
またLatexも使うことができます!
サイドバーへの表示、ラジオボタンの設置は以下のように設定できます。
サイドバーは、sidebarを間に挟むだけす。
ラジオボタンは、radio(表示文字列、(選択肢1、選択肢2))で設定できます。
# サイドバーへの表示は、sidebarを追加
st.sidebar.subheader("計算条件")
methods = st.sidebar.radio(
"物性推算法を選択してください",
('Wilson', 'NRTL'))
spec = st.sidebar.radio(
"T spec or P spec?",
('T spec', 'P spec'))
スライドバーの設置はslidebar(表示文字列、最小値、最大値、刻み幅、初期阿合)で以下のように設定できます。
またグラフについては、例えばMatplotlibを使う場合、事前に定義したfigをwrite()でそのまま表示できます。
if spec == 'T spec':
# スライドバー
T = st.sidebar.slider('Temperature[K]', min_value=300, max_value=500, step=1, value=300)
st.sidebar.write("Temperature: ", T, '[K]')
else:
P = st.sidebar.slider('Pressure[kPa]', min_value=50, max_value=500, step=1, value=100)
st.sidebar.write("Pressure: ", P, '[kPa]')
# 入力ボックスの表示
xnum = st.sidebar.number_input('組成の刻み幅', 0, 51, 21)
#グラフ表示
fig = plt.figure(figsize=(10, 8))
,,,
st.write(fig)
以上、簡単ですが上の動画と合わせてみていただくと、動作イメージが掴みやすいかと思います。
これほど簡単にInteractiveなGUIを作れるモジュールがあるとは知りませんでした。
]]>Streamlitではタイトル、ヘッダー等の関数があるものの、リンクの作成方法が分からず調べていたところ、こちらで回答されていました。
以下のような形で、リンクをmarkdownに入れ込むことで表現できるようです。
link = '[Chemesim](https://chemesim.com/PhysicalProp.html)'
st.sidebar.markdown(link, unsafe_allow_html=True)
st.sidebar.write('NRTLのバイナリパラメーターについては上のリンクをご参照ください')

表題の通り、作成したアプリをHPに置く前に、ローカル環境で実行する方法を探していた所、こちらに解決方法が記載されていました。
Run→Edit Configurationsから、Interpreter optionsに、-m streamlit.cli runを追加すると、python.exeにオプションで記載した部分を追記して所定の.pyを実行してくれるため、Pycharmでそのまま実行できるようになるようです。

上記実行すると、初回はEmail入力を求められますが、そのままEnterで進めばブラウザが立ち上がります。最近Flaskを勉強したいたのですが、Streamlitを知ってあまりのお手軽さに衝撃を受けました。これからStreamlitを使って色々なアプリ作成をしてみたいと思います!

一番最初に躓いたのが表記の件で、dispositionやviolation_codeを数値に変換しようとした際に、なぜか”Responsible (Fine Waived) by Deter”等の括弧を含むデータについて数値への変換ができておらず、RandomForestのfit関数がエラーになってしまう。
Debugで確認する限り、上記の文字列の認識自体はできているので、なかなか原因が分らず、、、。
こちらのリンクを参考にして解消。
括弧を含む文字列の場合は、\で囲う必要があるようです。
]]>

こちらのBernieさんの論文ですが、公開されている論文の情報をベースにアンモニア反応器の非定常解析を行われています。
アンモニアの合成反応としては、Temkin-Pyzhevの反応式(1940)にAnnableの反応定数(1952)を用いた組み合わせが広く使われています。しかし、上記の組み合わせでは反応定数に圧力項がなく、以下の論文では正反応に対して、圧力の影響も考慮した反応定数(以下のGillespie–Beattie correlation)が紹介されています。
$$ K_p^{GB} = K_p^{GB*} 10^{\alpha – p^*}$$
ここで、αが圧力補正項となっており、以下の式で表されます。( \(K_p^{GB*}\)は温度のみの関数になっています 。なお、温度、圧力の単位系はそれぞれK、atmです。)
$$ \alpha = \frac{0.1191849}{T} + \frac{91.87212}{T^2} + \frac{25122730}{T^4}$$
$$ log (K_p^{GB*}) = -2.69112 log(T) – 5.51926 * 10^{-5} T + 1.84886 * 10 ^ {-7} T^2 + 2001.6 / T_r + 2.6899 $$
参考論文1. Dynamic Model of an Ammonia Synthesis Reactor Based on Open Infomration, Bernt Lie
参考論文2. STABILITY MAP FOR AMMONIA SYNTHESIS REACTORS, Volker Siepmann
ちょっと反応モデルがややこしいので、AVEVA社のSimCentralで通常のTemkin-Pyzhevの反応式とどの程度の差異が生じるのか比較してみました。(こちらに記載しておりますが、SimCentralの場合は、全ての式がオープンになっており、自由にカスタマイズできるため、このような若干厄介な式もそのまま書けます)
以下が同様の断熱反応で計算させた結果ですが、Gillespie-Beattie equilibrium constantを使うと、圧力補正項の分、反応速度が落ちるようです。

早速試してみましたが、以下のような形で等高線図と、3dplotを重ね書きすることができます。(等高線図はtricontour関数を使います)

上から見ると、以下のような形でまさに三角線図。

ちょっと面倒なのが、tricontourf(triangles, z)の三角形の指定の仕方(trianglesの部分)で、下図のような形で各三角形の頂点部分の番号を振り分けていく必要があります。

H2の回収率とCO2の除去率はトレードオフの関係となるため、最適点を探すためにMatlabでパレート解領域を描いています。
化学工学の問題において多目的最適化は避けて通れない問題ですが、Brentさんの論文ではOperabilityについても考慮されている点が興味深い点です。
]]>こちらに記載したようにPRO/IIは、外部からCOM接続を行うことでデータの授受を行うことができ非常に便利です。
例えば、PythonでCOM接続を行う場合は、以下のようにwin32.comをimportすることで接続が可能。
import win32com.client as win32
具体的な使い方は、「PRO/IITM Process Engineering COM Server Programmer’s Guide and Tutorial」に記載されていますが、大まかな流れは以下の通り。(マニュアルのBasic Operations参照)
サーバーやデータベース、オブジェクトに対して行えるコマンド類は、「PRO/IITM Process Engineering COM Server Reference Guide」にまとめられています。
PRO/IIをインストールした際、同時にインストールされるPRO/II Viewerを使うことで、接続しているPRO/IIファイル内のオブジェクト名、Attributeを簡単に確認することができます。
例えば、以下では登録されている成分名がCompInというオブジェクト内にあることが分かります。また、各成分名をクリックすると、各成分に登録されている物性情報を確認することができます。

シミュレーターの計算がおかしいと感じた場合、手計算と一致するか確認したい場合があるかと思います。
各物性情報を一つずつ手動で取り出すのは手間がかかるので、COM接続で一括取得してみます。
例えば、Idealgasのエンタルピーの係数は、CompInオブジェクトのCorrrelCoefxLib(xは1~9の数字)の中の2番目に保存されています。
このため、HIGの係数をまとめて取得し、CSV形式で出力したいという場合は、例えば以下のように記載できます。
for i in range(0, NOC):
compnames.append(pro2db.GetObjectNames("CompIn", i))
comps.append(pro2db.ActivateObject("CompIn", compnames[i]))
for j in range(0,6):
if j == 0:
coeff = comps[i].GetAttribute("CorrelCoeff1Lib", -1)
elif j == 1:
coeff = comps[i].GetAttribute("CorrelCoeff2Lib", -1)
elif j == 2:
coeff = comps[i].GetAttribute("CorrelCoeff3Lib", -1)
elif j == 3:
coeff = comps[i].GetAttribute("CorrelCoeff4Lib", -1)
elif j == 4:
coeff = comps[i].GetAttribute("CorrelCoeff5Lib", -1)
elif j == 5:
coeff = comps[i].GetAttribute("CorrelCoeff6Lib", -1)
else:
print("error")
coef_HIG[i, j] = coeff[1]
np.savetxt('out.csv',coef_HIG,delimiter=',')
NISTのWeb bookには、 以下のようにShomate式により気相の比熱、Enthalpy, Entropy計算に必要な係数が記載されています。

温度範囲毎に係数が分かれているため、上記のテーブルをまとめてスクレイピングし、csvファイルに落とすコードを作成していきます。
NIST webbookで例えばCOの気相物性を調べると、そのURLは以下のようになっている。
xxx.cgiまでがベースのURL、そこにCAS番号やMaskといったパラメーターが必要となる。
以下の例ではGoogle Colaboratory上でスクレイピングし、結果をcsvで出力している。
import os
import re
import csv
import requests
from bs4 import BeautifulSoup
params = {'ID': 'C630080' , 'Units': 'SI' , 'Mask' : '1' }
response = requests.get('http://webbook.nist.gov/cgi/cbook.cgi', params=params)
soup = BeautifulSoup(response.text)
#h3タグを取得(Gas Phase Heat Capacity (Shomate Equation))
h3 = soup.h3
#最初のpタグ
p1 = soup.find_all('td', class_='exp right-nowrap')
writer = csv.writer(file)
for row in rows:
csvRow = []
for cell in row.findAll(['td', 'th']):
csvRow.append(cell.get_text())
writer.writerow(csvRow)
files.download('data.csv')
]]>