Pythonでは科学計算ライブラリが充実していることはみなさんご存じのことだと思います。
その豊富なライブラリを活用して様々な数値計算にPythonが使われています。
今回は、ちょっとマイナーなX線回折波形をシミュレーションするためのパッケージを見つけたので、
その内容と使い方をご紹介します。(半分は自分用のメモです。)
X線回折計算用のパッケージ:xrayutilities
X線回折の解析用に作られたプログラムで、回折点や回折波形、逆格子マップなどの計算をすることができます。
実験データの波形にフィッティングするための関数も用意されており、実験データファイルを読み込むことができます。
インストール
HP上には
1 | pip install xrayutilities |
でインストールしてくださいと書かれていますが、私のようにAnacondaで環境を構築しており、condaでインストールしたい場合は、
1 | conda install - c conda - forge xrayutilities |
でインストールすることができます。
結晶構造の定義
X線回折波形を計算するにあたって、まずは結晶構造を定義する必要があります。
HP上にも載っているInPの結晶構造を定義するサンプルは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import matplotlib.pyplot as plt import xrayutilities as xu # elements (which contain their x-ray optical properties) are loaded from # xrayutilities.materials.elements In = xu.materials.elements.In P = xu.materials.elements.P # define elastic parameters of the material we use a helper function which # creates the 6x6 tensor needed from the only 3 free parameters of a cubic # material. elastictensor = xu.materials.CubicElasticTensor( 10.11e + 10 , 5.61e + 10 , 4.56e + 10 ) # definition of zincblende InP: InP = xu.materials.Crystal( "InP" , xu.materials.SGLattice( 216 , 5.8687 , atoms = [In, P], pos = [ '4a' , '4c' ]), elastictensor) # a hexagonal equivalent which shows how parameters change for material # definition with a different space group. Since the elasticity tensor is # optional its not specified here. InPWZ = xu.materials.Crystal( "InP(WZ)" , xu.materials.SGLattice( 186 , 4.1423 , 6.8013 , atoms = [In, P], pos = [( '2b' , 0 ), ( '2b' , 3 / 8. )])) f = plt.figure() InP.show_unitcell(fig = f, subplot = 121 ) title( 'InP zincblende' ) InPWZ.show_unitcell(fig = f, subplot = 122 ) title( 'InP wurtzite' ) |
結晶構造を定義している関数のうち、六方晶の定義をしている部分を抜き出してみてみます。
xu.materials.SGLattice(186, 4.1423, 6.8013, atoms=[In, P], pos=[(‘2b’, 0), (‘2b’, 3/8)])
最初の変数は、空間群の番号となっています。
ウルツ鉱構造はNo. 186, 閃亜鉛構造はNo. 216です。
その次は格子定数であるa, b, c, alpha, beta, gammmaの数値です。
結晶構造の対称性から不要なものは省略している。
その次は結晶に含まれる原子とその位置を指定しています。
この例では原子の位置はワイコフ位置で表記しています。
ちなみに、上記のプログラムを実行すると、単位格子の絵をプロットできます。
定義した構造が正しくできているかどうか、簡単に判断できるようになっているところも素晴らしいと思います。
参考:ワイコフ位置一覧
https://yseto.net/?page_id=33
GaN, AlN, SiCの結晶構造の定義
デフォルトでいくつかの結晶構造は定義されていますが、それ以外の結晶については自分で定義する必要があります。
ここでは、例としてGaN, AlN, SiCの構造を定義してみます。
以下のプログラムは、Zenodoという研究結果のシェアサイト(?)にアップロードされていたプログラムを参考にしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # elements (which contain their x-ray optical properties) are loaded from # xrayutilities.materials.elements Ga = xu.materials.elements.Ga Al = xu.materials.elements.Al N = xu.materials.elements.N Si = xu.materials.elements.Si C = xu.materials.elements.C a_GaN = 3.189 c_GaN = 5.185 u_GaN = . 376 a_AlN = 3.112 c_AlN = 4.982 u_AlN = . 38 GaN = xu.materials.Crystal( "GaN(WZ)" , xu.materials.SGLattice( 186 ,a_GaN,c_GaN, atoms = [Ga, N], pos = [( '2b' , 0 ), ( '2b' , u_GaN)]), xu.materials.HexagonalElasticTensor( 390e9 , 145e9 , 106e9 , 398e9 , 105e9 )) AlN = xu.materials.Crystal( "AlN(WZ)" , xu.materials.SGLattice( 186 ,a_AlN,c_AlN, atoms = [Al, N], pos = [( '2b' , 0 ), ( '2b' , u_AlN)]), xu.materials.HexagonalElasticTensor( 396e9 , 137e9 , 108e9 , 373e9 , 116e9 )) |
単位格子のパラメータを設定して、結晶構造を定義します。
a_GaN/AlN, c_GaN/AlNはそれぞれa軸長、c軸長の値、
u_GaN/AlNは窒素原子のc軸方向の位置を表しています。
ElasticTensorは弾性定数テンソルで、六方晶の場合、 C11, C12, C13, C33, C44の5成分を持ち、その順番に設定します。
弾性定数テンソルはひずみを計算するときに使う値です。
SiCも同様に自分でパラメータを定義しても良いのだが、例えば4H-SiCの場合、Si,Cをそれぞれ二種類定義するので、設定がちょっと面倒です。
そこで、cifファイルから読み込むことにしましょう。
cifファイルは、American Mineralogist Crystal Structure Database(http://rruff.geo.arizona.edu/AMS/amcsd.php)や
The material project(https://materialsproject.org/)
からダウンロードできます。(GaN, AlNもcifファイルから読み込んでも良い。)
cifファイルから読み込んで定義するにはこのようにします。
1 | SiC4H = xu.materials.Crystal.fromCIF( "SiC4H.cif" ) |
AlGaNの結晶構造の定義
AlGaNのような混晶の結晶構造の定義は次のように行います。(Al20% AlGaNの場合)
1 | AlGaN = xu.materials.material.Alloy(GaN, AlN, 0.20 ) |
AlGaNの格子定数などはGaNとAlNの値から線形に計算されていて、
例えば、a軸長の場合、
a_AlGaN = (1-0.28)*a_GaN + 0.20*a_AlN
となります。
正しくは、線形からずれるのだが、そこはとりあえず目をつぶることにします。
Al組成をパラメータに、正しい格子定数を計算する関数を作って、その計算結果を使って結晶構造を定義すればいいのかなと考えています。
まとめ
X線回折の解析用のパッケージであるxrayutilitiesのインストールと結晶構造の定義の方法について紹介しました。
解析にはまず結晶構造を定義する必要があり、これで解析の準備が整いました。
次の記事で、定義した結晶構造をもとにX線回折波形などを計算してみます。
次の記事
https://sciencompass.com/phys-engineer/semiconductor_physics/xrayutilities_2
X線回折とは
そもそもX線回折とは何か?ということを知らない人はこのページに来ることはないと思いますが、、、
簡単に言うと、結晶の構造を解析するための手法の一つです。
材料にX線を照射すると原子の配列に応じてX線が回折します。
X線を入射する角度と検出器の角度を変えて回折光の強度をプロットすることで得られた、
その回折光の波形から結晶構造を解析します。
3 comments on PythonでX線回折波形のシミュレーション(1)