Scilabで二酸化炭素の状態方程式 その2

Scilabで二酸化炭素の状態方程式 その1では、Scilabを用いてファンデルワールスの状態方程式を解くプログラムを作成しました。

\left(P + \frac{a^2}{V} \right) (V-b)=RT

(P: 圧力, V: モル体積, R: 気体定数, T: 絶対温度, a, b: ファンデルワールス定数)

実はファンデルワールスの状態方程式は気体の体積だけでなく、液体や気体・液体共存のときのP,V,Tも計算することが出来ます。
この計算を行う際にMaxwellの規則を利用します(参考:ファン・デル・ワールスの状態方程式 (クラウジウス=クラペイロンの式、ジュール=トムソン効果)3.液体・気体共存領域)。Maxwellの規則ではグラフの面積が等しくなる条件を用いますが、こういった条件を探すのは、解析的には難しく、数値計算の出番となります。

004_20130811163805e0f.png

Fig.1: T = 250 (K)のときの二酸化炭素の圧力Pとモル体積Vの関係。グラフ中の赤の水平線の部分が液体・気体の共存領域、それよりも右側が気体の安定領域で左側が液体の安定領域。赤の水平線は、赤の水平線と赤の点線で囲まれた二つの領域の面積が等しくなる条件から引かれる。(Maxwellの規則)



二酸化炭素の相図


常温・常圧の二酸化炭素は気体ですが、固体の二酸化炭素といえばドライアイスです。ドライアイスは室温においておくと液体にならずに気体になりますが、5.1×105(Pa)つまり5気圧以上では水などと同様に液体になります。
以下に示すのは、ファン・デル・ワールスの状態方程式 (クラウジウス=クラペイロンの式、ジュール=トムソン効果)から引用した二酸化炭素の相図です。相図(Phase diagram, 状態図とも)は物質の状態(固体,液体,気体)と温度・圧力・化学組成の関係性を表した図です。



液体・気体共存領域


ファンデルワールスの状態方程式の1つの特徴として気体と液体の相転移を表すことができる点が挙げられます。
このときの液体、気体のそれぞれのモル体積は、Fig.1に示したとおりファンデルワールスの状態方程式と水平線の一番左の交点と一番右の交点として表されます。
またこの水平線は、水平線と状態方程式の作る二つの領域の面積が等しくなる条件から引くことが出来ます。
これをMaxwellの規則と呼び、数式で表すと以下のようになります。

\int_{V_l}^{V_g}P_{vdw}\mathrm{d}V - \int_{V_l}^{V_g}P_k \mathrm{d}V = 0

ただしPvdwがファンデルワールスの状態方程式で計算した圧力、Pkが水平線の圧力です。これらの交点のうち一番左の物が液体の体積Vlで一番右のものが気体の体積Vgです。

数値計算


色々な教科書に水平線Pkは面積が等しくなる条件から決定することが出来ると簡単に書かれていますが、Pkを決めないと交点Vg,Vlが決まらないため、Pkを決めるためには数値計算が必要です。

この計算にはScilabで金属の化学ポテンシャルScilabでおもりの吊り下げで利用した非線形方程式ソルバfsolveが使えます。

まずPkとPvdw(V)が与えられているとして3つの交点の値を求めます。
交点の値は、ファンデルワールスの状態方程式を変形して得られる以下の三次方程式の解です。

P_k V^3 - (b P_k + RT) V^2 + aV - ab = 0

Scilabでは多項式の解はrootsを用いて簡単に計算できます。解は複素数の要素を持つ縦ベクトルになります。Scilab言語には(C言語のような)型の宣言が無いのでミスを犯しやすいのですが、解の全ての要素が実部しか持たなかったとしても、変数の型としては複素数なので、realをつかって実数型へ変換する必要があります。

数値積分にはScilabで数値積分: 固体の比熱Scilabで関数フィッティング: 金属の電気抵抗で使ったintegrateを利用します。

最終的なプログラムはCO2-subcritical_sce.txtです。

clear;

// *** 入力パラメータ ***
// 物理定数
r = 8.31 // 気体定数 (J/K/mol)

// 二酸化炭素のファンデルワールス状態方程式
a = 3.65E-1; // Pa m^6 / mol^2
b = 4.28E-5; // m^3 / mol
// 温度 (K)
t = 250;

// *** ファンデルワールスの状態方程式 **
function p = pvdw(v)
p = r .* t ./ (v - b) - a ./ v ./ v
endfunction

// *** 解くべき方程式 ***
function e = func(pk)
Vx = roots([pk, -1 * (b * pk + r * t), a, - a * b]);
vg = max(real(Vx));
vl = min(real(Vx));
s1 = integrate('pvdw(v)','v',vl,vg);
s2 = (vg - vl) * pk;
e = s1 - s2;
endfunction

// *** 非線形方程式の数値解 ***
pk0 = %eps;
pk = fsolve(pk0,func);

Vx = roots([pk, -1 * (b * pk + r * t), a, - a * b]);
vg = max(real(Vx));
vl = min(real(Vx));

// *** 圧力の計算とプロット ***
// モル体積ベクトル
Vl = linspace(b,vl,1000) + %eps; // (m^3 / mol)
Vm = linspace(vl,vg,1000); // (m^3 / mol)
Vg = linspace(vg,1e-3,1000); // (m^3 / mol)
// 温度
plot(Vl,pvdw(Vl),'-r');
plot(Vm,pk,'-r');
plot(Vm,pvdw(Vm),'--r');
plot(Vg,pvdw(Vg),'-r');
// *** グラフの装飾 ***
xlabel("Molar volume (m^3/mol)");
ylabel("Pressure (Pa)");
plot([b,b],[-1E8,2E7],'--k');
plot([0,0.001],[0,0],'--k');
zoom_rect([0,-2E6,1E-3,2E7]);


関連エントリ




参考URL




付録


このエントリで使用したScilabのシミュレーション用ファイルを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 非線形方程式ソルバ 数値積分 状態方程式 熱力学 

Scilabで二酸化炭素の状態方程式 その1

気体の温度・圧力・体積の関係を表す式といえば、理想気体の状態方程式を思い浮かべる人は多いと思います。理想気体の状態方程式は、気体分子自体の体積や気体分子間の相互作用を無視して作られた状態方程式です。しかしながら、実在気体ではこれらの効果が無視できないことがあります。

そこで今回のエントリでは、実在気体の挙動をよりよく再現できるファンデルワールスの状態方程式を計算するプログラムをScilabで作成しました。

\left(P + \frac{a^2}{V} \right) (V-b)=RT

(P: 圧力, V: モル体積, R: 気体定数, T: 絶対温度, a, b: ファンデルワールス定数)

001_20130811163806c85.jpg

Fig.1: 気体の二酸化炭素のイメージ。もっとも、ドライアイスを水に入れたときに発生している白煙は、実際には二酸化炭素ではないのですが・・・。画像は(c)Kim H Yusukeより



理想気体の状態方程式


物質化学の分野では、状態方程式というと、物質の圧力P,温度T,体積Vの間に成り立つ関係式の事を指します。
最も簡単なものとして、理想気体の状態方程式が挙げられます。

PV = RT

(P: 圧力, V: モル体積, R: 気体定数, T: 絶対温度)

この式から分かるとおり、物質はP,V,Tのうち2つを指定すると残りの1つが決まってしまいます。
このようにP,V,Tのうち2つを決めて残り1つを計算することを状態方程式を解くといいます。

ファンデルワールスの状態方程式


理想気体の状態方程式は、以下の2点を仮定しています。

  • 気体分子同士の間に力(分子間力)が働かない
  • 気体分子の大きさは無視できる

しかしながら、実際には分子と分子の間には、ファンデルワールス力による引力が働きます。また、気体分子自身の大きさは、気体全体のモル体積が大きいときは無視できますが、強く圧縮されて(または冷却されて)分子間の距離が近くなると無視できなくなります。

そこでよく用いられるのがファンデルワールスの状態方程式です。

\left(P + \frac{a^2}{V} \right) (V-b)=RT

a,bはファンデルワールス定数と呼ばれるもので、物質によって異なる定数です。

aはファンデルワールス力による分子間の引力を表すパラメータです。圧力のイメージは、ピストン内に閉じ込められた気体が容器の壁を押す力であるといったものですが、気体の分子同士が引き合うとその分、壁を押す力が減ります。

bは別名、排除体積とも呼ばれ、気体分子そのものの体積を反映しています。極めて高圧・低温になってもモル体積はbよりも小さくなりません。

二酸化炭素の状態方程式


ファン・デル・ワールスの状態方程式 (クラウジウス=クラペイロンの式、ジュール=トムソン効果)によると二酸化炭素のファンデルワールス定数は a = 3.65×10-1(Pa m6/mol2), b = 4.28×10-5(m3/mol)です。このパラメータを使ってモル体積Vと絶対温度Tから状態方程式を解いてPを求めるプログラムをScilabで書きます。

作成したプログラムはvdwEOS-CO2_sce.txtです。

002_201308111638065fd.png

Fig.2: 二酸化炭素の状態方程式の2次元プロット。250-350Kの温度範囲にわたってモル体積と温度から圧力を計算した。


同じプログラム中に、3次元プロットをする部分も含めました。
3次元プロットをするための空間グリッド作成にはndgridが便利です。

003_2013081116380518d.png

Fig.3: 二酸化炭素の状態方程式の3次元プロット。200-500Kの温度範囲にわたってモル体積と温度から圧力を計算した。軸が切れてしまっているがZ軸は圧力を表す。


clear;

// *** 入力パラメータ ***
// 物理定数
r = 8.31 // 気体定数 (J/K/mol)

// 二酸化炭素のファンデルワールス状態方程式
a = 3.65E-1; // Pa m^6 / mol^2
b = 4.28E-5; // m^3 / mol
// 理想気体の状態方程式
//a = 0; // Pa m^6 / mol^2
//b = 0; // m^3 / mol

// *** ファンデルワールスの状態方程式 **
deff("p = f(v,t)","p = r .* t ./ (v - b) - a ./ v ./ v");

// 体積・温度ベクトルと計算グリッド
v = [5E-5:1E-5:1E-3]; // 体積ベクトル (m^3 / mol)
t = [200:10:500]; // 温度ベクトル (K)
[V,T] = ndgrid(v,t); // 体積温度空間グリッド

// *** 圧力の計算と2次元グラフのプロット ***
scf(0);
plot(v,f(v,250),'-r');
plot(v,f(v,275),'-g');
plot(v,f(v,300),'-b');
plot(v,f(v,325),'-m');
plot(v,f(v,350),'-c');
// グラフの装飾
xlabel("Molar volume (m^3/mol)");
ylabel("Pressure (Pa)");
plot([b,b],[-1E8,2E7],'--k'); //
plot([0,0.001],[0,0],'--k');
zoom_rect([0,-2E6,1E-3,2E7]);
legend(["T = 250 (K)","T = 275 (K)","T = 300 (K)","T = 325 (K)","T = 350 (K)"],1);

// *** 圧力の計算と3次元グラフのプロット ***
scf(1);
P = f(V,T);
mesh(V,T,P);
// グラフの装飾
a = gca();
a.data_bounds = [0,200,0;1E-3,500,2E7];
xlabel("Volume (m^3/mol)");
ylabel("Temperature (K)");
zlabel("Pressure (Pa)");


関連エントリ




参考URL




付録


このエントリで使用したScilabのシミュレーション用ファイルを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 状態方程式 熱力学 

AkaiKKRで鉄の安定相と格子定数

AkaiKKRでダイヤモンド型構造半導体AkaiKKRでニッケル・鉄・コバルトでは、色々な結晶構造を持つ固体の電子構造の計算を行いましたが、その格子定数はあらかじめ分かっているものとして入力ファイルを作成しました。

今回は、全エネルギー最小化という条件から、結晶構造や格子定数を第一原理的に決定することを目的にα, γ, δ-Feの計算をAkaiKKRで行い、計算結果をMurnaghanの状態方程式へフィッティングしました。

その結果α-Feが最も安定で、その格子定数は a=2.81(Å) となる事がわかりました。これは、実測値である a=2.87 (Å) と極めて近い値です。


第一原理計算と格子定数


『第一原理計算とは』といった説明は、調べてみると色々な方が説明されていますが、私にとって直感的に分かりやすかったのは第一原理計算 (基礎編)の下記のものです。

第一原理(英語はfirst-principlesまたはab initio(英語ではない))とは、なんら実験データや経験パラメーターを使わないで理論計算をする方法の総称。でも、この業界では電子状態計算、平たく言うとシュレディンガー方程式を解く計算のことを暗に指すことが多い。


第一原理計算というために大切なことは、実験データを見てパラメータをいじるということをしていないということです。

とは言うものの実際に第一原理計算パッケージを使うときには、これまでAkaiKKRを使ったエントリにも当てはまることですが、結晶構造やその格子定数は計算の前に入力する必要があります。

例えば鉄の場合について考えます。

鉄は常温では体心立方(body-centered cubic; bcc)構造となり(フェライト; α-Fe)強磁性を持ちます。温度を上げていくと911℃で面心立方(face-centered cubic; fcc)構造に相転移します(オーステナイト; γ-Fe)。さらに温度を上げていくと1392℃で再びbcc構造へ戻りますが(デルタフェライト; δ-Fe)、このときは既にキュリー温度を超えているため常磁性です。

AkaiKKRの入力ファイルを作成するとき、常温(というよりは絶対零度)でα, γ, δのどの鉄が安定なのか、また、その格子定数がいくつなのかは実験データを見ないと分からないことになります。

第一原理計算が実験データを使わないとは言っても、入力する結晶構造と格子定数だけは多くの場合大目に見てくれるというのが暗黙の了解の様ですが、厳しい見方をするなら第一原理でないということも出来ます。

この問題は、いろいろな結晶構造でいろいろな格子定数を使って計算をした後、全エネルギーを比較することによって解決することが出来ます。
実例として、アドバンスソフト社が発売しているAdvance/PHASEで行われた計算例が公開されています。

basis_spin_01.png
Fig.1: Advance/PHASEによるFeの全エネルギーと体積の関係


今回のエントリではこの計算をAkaiKKRで行います。

specx.fの設定


今回の計算では、specx.fを下記の設定にしてmakeしました。
     & (natmmx=4, ncmpmx=4, msizmx=198, mxlmx=3, nk1x=2200, nk3x=2688,
& msex=201, ngmx=15, nrpmx=650, ngpmx=650, npmx=350, msr=400)


入力ファイル


磁性を考慮した(magtyp=mag)bcc鉄(alpha_in.txt)、及び考慮しない(magtyp=nmag)bcc鉄(delta_in.txt)とfcc鉄(gamma_in.txt)の3つの入力ファイルを用意し、それぞれ1原子あたりの体積が8-15(Å3)となるようにしました。

Murnaghanの状態方程式へのフィッティング


計算結果の体積とエネルギーの対応関係(Energy_dat.txt)から、最もエネルギーが低いときの体積を求めるため、gnuplotを用いてMurnaghanの状態方程式へ最小二乗法フィッティングを行います。

Murnaghanの状態方程式は下記の式で表されます。

E_{tot}(V) = \frac{BV}{B^{'}(B^{'}-1)}\left[B^{'}\left(1-\frac{V_0}{V}\right)+\left(\frac{V_0}{V}\right)^{B^{'}}-1\right]+E_0

ここでEtotが全エネルギー、Bが体積弾性率、B'が体積弾性率の圧力微分、Vが体積です。
フィッティングとグラフの描画を行うgnuplotのスクリプトはEnergy_plt.txtです。

結果


結果をFig.2に示します。Advance/PHASEで行われた計算結果と比較すると(定量的なものはともかく)強磁性bcc構造のα-Feが1原子辺りの体積が11(Å3)のあたりで最もエネルギーが低く安定であることが再現できています。


001_20130309181913.png
Fig.2: AkaiKKRによるFeの全エネルギーと体積の関係


実際に測定された鉄の格子定数、Advance/PHASEによる計算結果と今回AkaiKKRで計算したものをTable.1にまとめました。

実測PHASEAkaiKKR
a (Å)2.872.8452.81
B (GPa)168177.237190
table.1: 強磁性bcc鉄の格子定数と体積弾性率


実測とAdvance/PHASEの値は第一原理シミュレータ入門 PHASE&CIAOから引用しました。

ひょっとしたらたまたまなのかも知れませんが、格子定数に関しては非常によく一致しています。

Appendix: β-Fe?


今回のエントリでは「強磁性bcc鉄=α-Fe」「常磁性bcc鉄=δ-Fe」という様な書き方をしてしまいましたが、これは厳密には間違いです。鉄のキュリー温度は770℃なので、常温付近では常磁性だったbcc鉄はfcc(γ-Fe)へ相転移する911℃よりも低温で常磁性になります。
この770-911℃の間で安定な常磁性bcc鉄のことを以前はβ-Feと呼んでいたようですが、現在ではα-Feの一部として扱われています。

強磁性bcc鉄(α-Fe)
 |
 | 770℃
 ↓
常磁性bcc鉄(これもα-Fe,以前はβ-Feと呼ばれていた。)
 |
 | 911℃
 ↓
fcc鉄(γ-Fe)
 |
 | 1392℃
 ↓
常磁性bcc鉄(δ-Fe)

AkaiKKRでは絶対零度の計算しか出来ないため『もしも絶対零度のとき常磁性bcc構造が安定だったとしたらどうなるか』という計算を(本来高温の相である)δ-Feと呼ぶのはおかしいのですが、表記をややこしくしないためこう書きました。

なお、第一原理シミュレータ入門 PHASE&CIAOの表3.4にはα,β,γと書いてありますが、これは単なるα,γ,δの誤植だと思われます。

関連エントリ




参考URL




付録


このエントリで使用したAkaiKKR用入力ファイルなどを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器





フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: AkaiKKR machikaneyama KKR 安定相 状態方程式 

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoCOPアンプCPAPIC強磁性モンテカルロ解析常微分方程式トランジスタode状態密度インターフェースecalj定電流スイッチング回路PDS5022DOS半導体乱数シェルスクリプトレベルシフトHP6632Aブレッドボード分散関係温度解析トランジスタ技術R6452A可変抵抗I2Cセミナー確率論反強磁性非線形方程式ソルバ絶縁偏微分方程式バンド構造熱設計数値積分バンドギャップカオスA/DコンバータフォトカプラシュミットトリガGW近似LEDLM358ISO-I2C三端子レギュレータ数値微分サーボ直流動作点解析カレントミラーマフィンティン半径TL431PC817C発振回路74HC4053USBアナログスイッチbzqltyFFTチョッパアンプ2ちゃんねる補間量子力学開発環境電子負荷標準ロジックパラメトリック解析アセンブラ基本並進ベクトルブラべ格子単振り子BSchLDAイジング模型繰り返しMaximaキュリー温度位相図状態方程式失敗談スピン軌道相互作用六方最密充填構造相対論FET抵抗コバルト不規則合金TLP621ewidthGGAQSGWgfortranランダムウォークラプラス方程式スイッチト・キャパシタcygwin熱伝導SMPスレーターポーリング曲線三角波格子比熱LM555条件分岐TLP552MCUNE555UPSTLP521QNAPマントルテスタFXA-7020ZR過渡解析詰め回路ガイガー管ダイヤモンド自動計測Writer509データロガー固有値問題VESTAスーパーセルOpenMP差し込みグラフ平均場近似起電力awk仮想結晶近似VCAubuntufsolveブラウン運動熱力学第一原理計算井戸型ポテンシャルシュレディンガー方程式面心立方構造fccウィグナーザイツ胞interp12SC1815L10構造非線型方程式ソルバFSMキーボードTeX結晶磁気異方性初期値OPA2277化学反応等高線ジバニャン方程式ヒストグラム確率論三次元フィルタRealforcePGAフェルミ面正規分布固定スピンモーメント全エネルギースワップ領域リジッドバンド模型edeltquantumESPRESSOルチル構造岩塩構造二相共存ZnOウルツ鉱構造BaOフォノンデバイ模型multiplotgnuplotc/aノコギリ波合金クーロン散乱ハーフメタル半金属CapSenseマンデルブロ集合マテリアルデザインSICGimpCK1026MAS830L円周率トランスPIC16F785凡例線種シンボルLMC662ヒストグラム不規則局所モーメント文字列疎行列TS-110TS-112Excel直流解析等価回路モデル入出力トラックボールPC軸ラベルAACircuitP-10フラクタル境界条件連立一次方程式Ubuntuifortパラメータ・モデルspecx.f関数フィッティング最小二乗法Crank-Nicolson法陰解法日本語EAGLEMBEグラフの分割負帰還安定性ナイキスト線図熱拡散方程式HiLAPW両対数グラフ片対数グラフ縮退

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ