pythonで動く半導体バンド構造シミュレータ"Aestimo"で、バリアドープド量子井戸のバンド構造を計算してみる。
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
プログラムコード
それでは実行してみよう
config.pyの編集
DL直後は、
~~~~~
#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量子井戸が指定されているので、これをコメントアウトして、
~~~~~
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フォルダが生成されて、計算結果が格納・表示される。
...はずだが初めて実行する時に私は以下の二つのエラーが出てしまった。
- AttributeError: 'module' object has no attribute 'fermi_np_scheme'
- 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、となるわけだから
処理の流れ
- aestimo.py実行
- config.pyから実行するサンプル構造名を取得
- サンプル構造名を元に必要な物性値を取得
- run_aestimo関数実行
の3で、うまくfermi_np_schemeの情報が処理されていないからかなあ。
パスも通ってるっぽいし...
とりあえず今回シミュレートするAlGaAs.GaAsは比較的バンドギャップが広めなので
応急処置として、336行目を
#self.fermi_np_scheme = inputfile.fermi_np_scheme
self.fermi_np_scheme = False
とした(あまり良くない)
補足:nonparabolicityは簡単に言うと、半導体のバンドシミュレーションの際に、バンド端を放物線として近似するか、直線として近似するか選ぶことらしいです
詳しくはnextnanoのFAQに書いてあるのでリンク置いておきます
エラー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次元シュレディンガーシミュレーターについて
試行錯誤してみた。
とりあえず動かしたい!!!って方など、ご参考までに。
-
https://www.sciencedirect.com/science/article/pii/S0927025620305061?via%3Dihub nextnanoとAestimoの比較論文 ↩︎