>>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フォルダが生成されて、そこに計算結果が格納される。
…はずだが初めて実行する時に以下の二つのエラーが出てしまうかもしれない。
- 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、となるわけだから
処理の流れ
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次元シュレディンガーシミュレーターについて
試行錯誤してみた。
とりあえず動かしたい!!!って方など、ご参考までに。