ユーザ用ツール

サイト用ツール


tabuchi:xrayutils

文書の過去の版を表示しています。


xrayUtilities の使用例

python のライブラリとして提供されているxrayUtiliesの使用例を幾つか紹介しています。 応用物理学会 結晶工学分科会が企画する結晶工学セミナー「PythonとAIで進める結晶工学 ~結晶成長から評価技術まで~」(2026.3.9)での講演内容に対応して準備したものです。

主な目的は 「1.使用例」 を示すことです。
python の使用やプログラムを書くことについてはセミナーでは、より詳細な説明がありますのでそちらに従って下さい (セミナーが推奨する神谷先生のwebページ)。

後日、セミナーの受講とは別に xrayUtilities を試してみたいという時には「xrayUtilities の準備」を参照してみて下さい。

1. 使用例

1.1 結晶構造の定義

  1. 結晶構造の定義と表示 ここをクリックすると表示
  2. 結晶構造の定義のバリエーション ここをクリックすると表示

1.2 構造因子の計算

  1. 構造因子の計算と表示 ここをクリックすると表示

1.3 回折パタンの計算と逆格子マップの表示

  1. 回折パタンの計算と逆格子マップの表示 ここをクリックすると表示

1.4 回折スペクトルの計算

  1. AlN/GaN(Sub)の回折スペクトルの計算と表示 ここをクリックすると表示
  2. AlGaN/GaN(Sub)の回折スペクトルの計算と表示 ここをクリックすると表示
  3. 仮に生成したAlGaN/GaN(Sub)の回折スペクトルに対するなんちゃってフィッティング ここをクリックすると表示

- AlGaN/GaN(Sub)の回折スペクトルの計算と表示 ++ ここをクリックすると表示

example-04-4.py
import numpy as np
import matplotlib.pyplot as plt
import xrayutilities as xu
 
# GaN, AlN の結晶構造をCIFから読む
GaN = xu.materials.Crystal.fromCIF("CIFs/GaN-Hex.cif")
AlN = xu.materials.Crystal.fromCIF("CIFs/AlN-Hex.cif")
 
# 今作った結晶(GaN, AlN)は、結晶構造の情報しか持ってないので
# 積層構造にした時の歪の計算ができるように、弾性に関わる情報を追加する
#
## どちらも Hexagonal 
GaN.symm_class_name = 'Hexagonal'
AlN.symm_class_name = 'Hexagonal'
#
## GaN, AlN の弾性定数 Cij の値を、名前のついた値として準備
C11_GaN, C12_GaN, C13_GaN, C33_GaN, C44_GaN = 390, 145, 106, 398, 105
C11_AlN, C12_AlN, C13_AlN, C33_AlN, C44_AlN = 396, 137, 108, 373, 116
#
## xu にサポートしてもらって 2階テンソルの形に組み上げる
cij_array_GaN = xu.materials.material.HexagonalElasticTensor( C11_GaN, C12_GaN, C13_GaN, C33_GaN, C44_GaN )
cij_array_AlN = xu.materials.material.HexagonalElasticTensor( C11_AlN, C12_AlN, C13_AlN, C33_AlN, C44_AlN )
#
## さらに4階テンソルの形にもしておく ij to ijkl (プログラムでは '2' を 'to' の意味でよく使う)
cijkl_tensor_GaN = xu.materials.material.Cij2Cijkl(cij_array_GaN)
cijkl_tensor_AlN = xu.materials.material.Cij2Cijkl(cij_array_AlN)
#
## Crystal オブジェクト(GaN, AlN)に4階テンソルを属性として設定
setattr(GaN, 'cijkl', cijkl_tensor_GaN)
setattr(AlN, 'cijkl', cijkl_tensor_AlN)
#
## 2階テンソルも elastic 属性に代入
GaN.elastic = cij_array_GaN
AlN.elastic = cij_array_AlN
 
# さらに混晶も準備する
Alx = 0.2                                                # Al組成 x = 0.2
AlGaN = xu.materials.material.Alloy(GaN, AlN, Alx);      # AlN 0.2 + GaN (1-0.2)
 
# ここまでで、弾性定数の情報も持った GaN, AlN という結晶が準備できた。
# 次は、この物質のを積み上げていくためにその部品として Layer を作り、
# それを積み上げて積層構造にする
#
## まずは 基板(厚さ無限のGaN Layer)、AlN層を準備
sub    = xu.simpack.Layer( GaN, float('inf') )            # 基板 (GaN)
lGaN   = xu.simpack.Layer( GaN,   1500, relaxation=1.0 )  # 膜 (GaN)       # ここでは使わない
lAlN   = xu.simpack.Layer( AlN,   1500, relaxation=1.0 )  # 膜 (AlN)       # ここでは使わない
lAlGaN = xu.simpack.Layer( AlGaN, 1500, relaxation=0.0 )  # 膜 (Al0.2GaN)  # relaxation=1.0 => 0.0 にすると回折ピークは広角側に動く
#
## 準備した Layer を積み上げて AlN層 / GaN 基板という積層構造を構築
Epi_Sub = xu.simpack.PseudomorphicStack001( "AlN/GaN", sub+lAlGaN )
 
# ω-2θ 強度計算
## 波長、エネルギー、計算する角度範囲指定
wavelength = xu.wavelength('CuKa1')           # 波長は Cu Ka1 の波長(1.5405...A)
energy     = 12390 / wavelength               # エネルギーは波長から計算
two_theta  = np.linspace( 32, 38, 200 )       # 横軸になる角度範囲のベクトルを作っておく
 
#### ここまでは先にやった omega-2theta のシミュレーションの時と同一 ####
 
# 動的モデルの設定とシミュレーション
## リファレンスに基板(GaN)だけの計算もする
sub_model         = xu.simpack.DynamicalModel( sub,     energy=energy, resolution_width=0.0001 )
int_w2th_sub      = sub_model.simulate( two_theta/2, hkl=(0, 0, 2) )  # 基板だけの時の omega-2theta スペクトル
peak_index_sub    = np.argmax( int_w2th_sub )                         # そのピーク位置(2theta)の指数
peak_sub          = two_theta[ peak_index_sub ]                       # そのピーク位置(2theta)の角度
omega_sub         = np.linspace( peak_sub/2-0.5, peak_sub/2+0.5, 400 )  # 今わかった角度+/-0.5 omega の範囲を対称に
int_RC_sub        = sub_model.simulate( omega_sub, hkl=(0,0,2), geometry="omega" ) # ロッキングカーブ方向の強度計算
 
## こちらは Epi/Sub = AlGaN/GaN の計算
epi_sub_model      = xu.simpack.DynamicalModel( Epi_Sub, energy=energy, resolution_width=0.0001 )
int_w2th_epi_sub   = epi_sub_model.simulate( two_theta/2, hkl=(0, 0, 2) ) # omega-2theta スペクトル
peak_index_epi_sub = np.argmax( int_w2th_epi_sub )                        # そのピーク index
peak_epi_sub       = two_theta[ peak_index_epi_sub ]                      # ピーク角度
omega_epi_sub      = np.linspace( peak_epi_sub/2-0.5, peak_epi_sub/2+0.5, 400 )
int_RC_epi_sub     = epi_sub_model.simulate( omega_epi_sub, hkl=(0,0,2), geometry="omega" )
 
# 結果のプロット
plt.figure()
plt.plot( omega_sub     - peak_sub/2,     int_RC_sub )
plt.plot( omega_epi_sub - peak_epi_sub/2, int_RC_epi_sub )
plt.title( 'Dynamical Simulation of Rocking Curve of AlGaN/GaN and GaN Sub')
plt.yscale('log')
plt.xlabel(r'$\omega\ (deg)$')
plt.ylabel('Intensity (arb. u.)')
plt.show()


田渕の講演資料の一部
田渕のページのルート
当 web ページとその下のページに関するお問い合わせ等ございましたら、連絡先にご連絡をお願いします。
今日: 4 / 昨日: 21 / 総計: 79

tabuchi/xrayutils.1772097886.txt.gz · 最終更新: by mtab