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

4 min読了の目安(約4100字TECH技術記事

Aestimoとは?

h-hebel氏が開発したフリーの自己無頓着な1次元シュレディンガーsolverです。
python3系で動作する。

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

今回は付属のtutorials/Aestimo_Tutorial.htmlに記載のある
バリアドープ量子井戸の計算をすることを目標にする

実行環境

mac OS Big Sur 11.1
python 3.7.6
Visual Studio Code 1.49.3

プログラムコード

https://github.com/aestimosolver/aestimo

それでは実行してみよう

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の説明を見ると

config.py
#fermi_np_scheme - bool - include nonparabolicity in calculation of Fermi level

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

処理の流れ

  1. aestimo.py実行
  2. config.pyから実行するサンプル構造名を取得
  3. サンプル構造名を元に必要な物性値を取得
  4. run_aestimo関数実行

の3で、うまくfermi_np_schemeの情報が処理されていないからかなあ。
パスも通ってるっぽいし...

とりあえず今回シミュレートするAlGaAs.GaAsは比較的バンドギャップが広めなので
応急処置として、336行目を

aestimo.py
#self.fermi_np_scheme = inputfile.fermi_np_scheme
self.fermi_np_scheme = False

とした(あまり良くない)

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

https://www.nextnano.de/nextnano3/faq.htm

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

aestimo.pyの説明を見ると

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

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

aestimo.py
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行目を

aestimo.py
#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次元シュレディンガーシミュレーターについて
試行錯誤してみた。
とりあえず動かしたい!!!って方など、ご参考までに。

脚注
  1. https://www.sciencedirect.com/science/article/pii/S0927025620305061?via%3Dihub nextnanoとAestimoの比較論文 ↩︎