PythonでX線回折波形のシミュレーション(1)

Pythonでは科学計算ライブラリが充実していることはみなさんご存じのことだと思います。
その豊富なライブラリを活用して様々な数値計算にPythonが使われています。

今回は、ちょっとマイナーなX線回折波形をシミュレーションするためのパッケージを見つけたので、
その内容と使い方をご紹介します。(半分は自分用のメモです。)

X線回折計算用のパッケージ:xrayutilities

X線回折の解析用に作られたプログラムで、回折点や回折波形、逆格子マップなどの計算をすることができます。
実験データの波形にフィッティングするための関数も用意されており、実験データファイルを読み込むことができます。

インストール

HP上には

pip install xrayutilities

でインストールしてくださいと書かれていますが、私のようにAnacondaで環境を構築しており、condaでインストールしたい場合は、

conda install -c conda-forge xrayutilities

でインストールすることができます。

結晶構造の定義

X線回折波形を計算するにあたって、まずは結晶構造を定義する必要があります。
HP上にも載っているInPの結晶構造を定義するサンプルは以下の通りです。

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の数値です。
結晶構造の対称性から不要なものは省略している。
その次は結晶に含まれる原子とその位置を指定しています。
この例では原子の位置はワイコフ位置で表記しています。
ちなみに、上記のプログラムを実行すると、単位格子の絵をプロットできます。
定義した構造が正しくできているかどうか、簡単に判断できるようになっているところも素晴らしいと思います。

参考:ワイコフ位置一覧

GaN, AlN, SiCの結晶構造の定義

デフォルトでいくつかの結晶構造は定義されていますが、それ以外の結晶については自分で定義する必要があります。
ここでは、例としてGaN, AlN, SiCの構造を定義してみます。
以下のプログラムは、Zenodoという研究結果のシェアサイト(?)にアップロードされていたプログラムを参考にしました。

# 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ファイルから読み込んで定義するにはこのようにします。

SiC4H = xu.materials.Crystal.fromCIF("SiC4H.cif")

AlGaNの結晶構造の定義

AlGaNのような混晶の結晶構造の定義は次のように行います。(Al20% AlGaNの場合)

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線回折波形などを計算してみます。

X線回折とは

そもそもX線回折とは何か?ということを知らない人はこのページに来ることはないと思いますが、、、
簡単に言うと、結晶の構造を解析するための手法の一つです。
材料にX線を照射すると原子の配列に応じてX線が回折します。
X線を入射する角度と検出器の角度を変えて回折光の強度をプロットすることで得られた、
その回折光の波形から結晶構造を解析します。

sciencompass34 has written 146 articles

はじめまして!”あおやぎ”と言います。
メーカーで研究開発の仕事をしています。このブログでは、私の専門分野である半導体やそれに関連する内容を紹介していきます。
半導体関連の知識をまとめたデータベースのようにしたいなと思っています。

3 thoughts on “PythonでX線回折波形のシミュレーション(1)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください