pythonで動く半導体バンド構造シミュレータ「Aestimo」で、バリアドープド量子井戸のバンド構造を計算してみる。

>>21/07/21 記事の表現を修正

こちらの記事は2021年2月にzenn.devへ投稿したものと同じものになります。

(著者はいずれも私)

それでは、書いていきましょう。

目次

Aestimoとは?

h-hebel氏らが開発した自己無頓着な1次元シュレディンガー方程式シミュレーターです
python3系で書かれている

有料材料計算ソフトnextnanoと比較してもほとんど誤差なく計算できる[1]

今回はtutorials/Aestimo_Tutorial.htmlにある
「バリアドープ量子井戸」の計算をしてみよう

実行環境

mac OS Big Sur 11.1
python 3.7.6
Visual Studio Code 1.49.3

それではやってみよう

まずはこちら からコードをダウンロード

config.pyの編集

DL直後は、config.pyは

~~~~~
#inputfilename = "sample_qw_barrierdope"
#inputfilename = "sample_qw_qwdope"
#inputfilename = "sample_moddop"
#inputfilename = "sample_qw_HarrisonCh3_3"
#inputfilename = "sample_qw_barrierdope_p"
#inputfilename = "sample_multi_qw_barrierdope_p"
~~~~~
#inputfilename = "sample_qw_barrierdope_p_AlGaInN"
#inputfilename = "sample_qw_barrierdope_p_AlGaInN_2"
#inputfilename = "sample_pn"
inputfilename = "sample_2qw_InGaN_GaN_vs_1ddcc"
# Calculation
~~~~~


と、InGaN/GaN量子井戸が指定されているので、これをコメントアウトして、
config.py を

~~~~~
inputfilename = "sample_qw_barrierdope"
#inputfilename = "sample_qw_qwdope"
#inputfilename = "sample_moddop"
#inputfilename = "sample_qw_HarrisonCh3_3"
#inputfilename = "sample_qw_barrierdope_p"
#inputfilename = "sample_multi_qw_barrierdope_p"
~~~~~
#inputfilename = "sample_qw_barrierdope_p_AlGaInN"
#inputfilename = "sample_qw_barrierdope_p_AlGaInN_2"
#inputfilename = "sample_pn"
#inputfilename = "sample_2qw_InGaN_GaN_vs_1ddcc"
# Calculation
~~~~~

と書き直して保存。

いざ実行! ただエラーが出るかも…

実行はターミナルからaestimo.pyの実行で出来る。
うまく行けば、examplesフォルダ内にoutput_sample_qw_barrierdopeフォルダが生成されて、そこに計算結果が格納される。

…はずだが初めて実行する時に以下の二つのエラーが出てしまうかもしれない。

  1. AttributeError: ‘module’ object has no attribute ‘fermi_np_scheme’
  2. AttributeError: ‘module’ object has no attribute ‘meff_method’

なんとかしていこう。

エラー1 AttributeError: ‘module’ object has no attribute ‘fermi_np_scheme’

aestimo.py冒頭の説明を見ると

#fermi_np_scheme - bool - include nonparabolicity in calculation of Fermi level

と書かれていた。つまり、サンプル構造に応じて非放物線性であればTrue、そうでなければFalse、となるわけだから

処理の流れ
1. aestimo.py実行
2. config.pyから実行するサンプル構造名を取得
3. サンプル構造名から構造で使われている物性値(ex. AlGaAsのバンドギャップ)を取得
4. run_aestimo関数実行

の3で、うまくfermi_np_schemeの情報が処理されていないようだ。
パスも通ってるっぽいし…

今回シミュレートするAlGaAs, GaAsは比較的バンドギャップが広めなのでfermi_np_schemeはFalseとするのが適当かと思います。

具体的には336行目を

#self.fermi_np_scheme = inputfile.fermi_np_scheme
self.fermi_np_scheme = False

とする(プログラムの処置としてはあまり良くない)

本当は、「処理の流れ 3」の処理が正しく行われるようにpyファイル内の変数を受け渡すべき。

補足:nonparabolicityは簡単に言うと、半導体のバンドシミュレーションの際に、バンド端を放物線として近似するか、直線として近似するか選ぶことらしいです
詳しくはnextnanoのFAQに書いてあるのでリンク置いておきます
https://www.nextnano.de/nextnano3/faq.htm

エラー2 AttributeError: ‘module’ object has no attribute ‘meff_method’

aestimo.pyの説明を見ると

#meff_method - int - choose effective mass function to model non-parabolicity (see below)


see belowと言われてたので、ぐーっと下まで行くと

EFFECTIVE MASS MODELS (meff_method)
- for when nonparabolicity is modelled (see comp_scheme)
0: no energy dependence
1: Nelson's effective 2-band model
2: k.p model from Vurgaftman's 2001 paper

なるほど、有効質量(mass effective -> meff)のモデルをどれにするかってことか。
meff_methodもconfig.pyのパラメータなはずだがうまく渡されていないらしい。

今回はエラー1で非放物線性のシミュレーションにしたので1か2どちらかを選ぶ。
1にしましょう。astimo.pyの222行目と373行目を

#self.meff_method = inputfile.meff_method
self.meff_method = 1


と書き換えて保存.(あまり良くない2度目)


これで、実行! 成功!


コマンドラインに

INFO Simulation is finished. All files are closed. Please control the related

と出ていればOK.

そして出力結果として、examplesフォルダに6つのdatファイル

– efield.dat(1列目: 位置 (m), 2列目: 電界強度(V/m))
– potn.dat (1列目: 位置 (m), 2列目: 伝導帯のエネルギー (J))
– sigma.dat (1列目: 位置 (m), 2列目: 単位面積当たりの電荷量 (e/m^2)
– states.dat (1列目: 状態数(個), 2列目: キャリアの状態密度(m^-2), 3列目: 状態のエネルギー (meV), 4列目: 状態の有効質量 (kg))
– wavefunctions.dat(1列目: 位置 (m), 2と3列目: 波動関数の実部虚部?,4列目: 波動関数の2乗?)

が出力・表示されているはずである。

例としてpotn.datの結果を見ると


きちんとポテンシャルの谷が見える。

終わり

結構新しめ(2014年にver1, 2020年にver2)の1次元シュレディンガーシミュレーターについて
試行錯誤してみた。
とりあえず動かしたい!!!って方など、ご参考までに。

スポンサーリンク
レクタングル(大)