「応用物理」に掲載された記事「半導体デバイスシミュレーションのコツ」のプログラム例のページです
森 伸 也(大阪大学)
「応用物理」2017年12月号,2018年1月号に掲載された記事「半導体デバイスシミュレーションのコツ」(正誤表)のプログラム例のページです.より多くの方に試してもらえるよう,Fortran 90, C, Ruby, Pythonでプログラムを作成しました(ただし,最初にFortran 90で作成し,それを他の言語に翻訳しましたので,それぞれの言語の良さが発揮されたコードではありません).できるだけ記事に沿った形でプログラムを作成しましたが,不明な点などがありましたらお問い合わせ下さい註1.バグを見つけた場合もお知らせ下さるようお願いします.
プログラム例は,図1に示したようなシリコンpnダイオード(右側がn領域,左側がp領域)の順方向特性を計算するプログラムです.p領域側の電極を正とした印加電圧 V を 0 V から順に増加させ,1次元のドリフト拡散法を用いて電流を計算することにより,ダイオードの電流電圧特性を求めます.
図1:pnダイオード
表1:入力パラメータ
L | ダイオードの全長.メートル (m) 単位. |
N | 最大の格子点指数.全格子点数は (N+1) 個,格子点間隔は h = L / N になります. |
Nd | n領域のドナー密度.毎立方メートル (m-3) 単位. |
Na | p領域のアクセプタ密度.毎立方メートル (m-3) 単位. |
ΔV | 印加電圧刻み幅.ボルト (V) 単位. |
M | 最大印加電圧を決める指数.計算を行う印加電圧 V は 0, ΔV, 2ΔV, ..., M ΔV となります. |
ε | ポテンシャルの収束条件.ボルト (V) 単位. |
プログラムは,標準入力より,表1のパラメータを表1の順に読み込み,標準出力に,電流電圧特性を出力します.あわせて,最後の印加電圧(V = M ΔV )における内部の物理量の x 依存性を,2つのファイル dd_out_m.txt と dd_out_a.txt とに書き込みます.ファイル dd_out_m.txt には主格子点における物理量の値が,dd_out_a.txt には副格子点における物理量の値が保存されます.標準出力,dd_out_m.txt, dd_out_a.txt の各列の物理量は,表2の通りです(標準出力の電流密度はアノード端における値としています).
表2:出力のフォーマット
列 | 標準出力 | dd_out_m.txt | dd_out_a.txt |
1 | 印加電圧 V (V) | 主格子点座標 xi (m) | 副格子点座標 xi+1/2 (m) |
2 | 正孔電流密度 Jp (A/m2) | ポテンシャル ψi (V) | 電 界 Ei+1/2 (V/m) |
3 | 電子電流密度 Jn (A/m2) | 正孔密度 pi (m-3) | 正孔電流密度 Jp,i+1/2 (A/m2) |
4 | 全電流密度 Jp + Jn (A/m2) | 電子密度 ni (m-3) | 電子電流密度 Jn,i+1/2 (A/m2) |
5 | 反復計算の回数 | 空間電荷密度/電気素量 ρi (m-3) | 全電流密度 Jp,i+1/2 + Jn,i+1/2 (A/m2) |
プログラムおよび入力ファイルの例は,表3のファイル名をクリック註2するとダウンロードできます(説明をクリックするとブラウザ上でファイルの内容を確認できます註3).
表3:プログラムおよび入力ファイルの例(註4)
ファイル名 | 説 明 | 日 付 |
dd.f90 | Fortran 90 プログラム | 2018/4/27 |
dd.c | C プログラム | 2018/4/27 |
dd.rb | Ruby 2.x 系 プログラム | 2018/4/27 |
dd.rb | Ruby 1.x 系 プログラム | 2018/4/27 |
dd.py | Python プログラム | 2018/4/27 |
dd_input.txt | 入力ファイル | 2017/12/21 |
GNU Fortran コンパイラの gfortran (version 4.8.4) と,Intel Fortran コンパイラの ifort (version 16.0.1) とで動作確認を行いました.
$ gfortran dd.f90
$ ./a.out < dd_input.txt > dd_out_iv.txt
$ ifort dd.f90
$ ./a.out < dd_input.txt > dd_out_iv.txt
GNU C コンパイラの gcc (version 4.8.4) で動作確認を行いました.
$ gcc dd.c -lm
$ ./a.out < dd_input.txt > dd_out_iv.txt
ruby (version 2.4.1) で動作確認を行いました.動作させるためには,numo/narray
および numo/linalg
が必要です.
$ ruby dd.rb < dd_input.txt > dd_out_iv.txt
ruby (version 1.8.7) で動作確認を行いました.動作させるためには,narray
が必要です.
$ ruby dd.rb < dd_input.txt > dd_out_iv.txt
python2 (version 2.7.6) および python3 (version 3.4.3) で動作確認を行いました.動作させるためには,numpy
が必要です.
$ python dd.py < dd_input.txt > dd_out_iv.txt
前節の通りに実行すると,標準出力の内容が dd_out_iv.txt に保存され,ファイル dd_out_m.txt,dd_out_a.txt が作成されます.参考のため,図2から図5に,これら3個のファイルの内容の一部をプロットしました.
図2:電流電圧特性.dd_out_iv.txt の第2列から第4列の値を第1列の値に対してプロットした.
図3:V = 0.5 V におけるポテンシャル分布.dd_out_m.txt の第2列の値を第1列の値に対してプロットした.
図4:V = 0.5 V における"密度"分布.dd_out_m.txt の第3列から第5列の値を第1列の値に対してプロットした.
図5:V = 0.5 V における電界分布.dd_out_a.txt の第2列の値を第1列の値に対してプロットした.
Fortran 90, C, Ruby, Python以外の,もっと他の言語でも作ってみたかったのですが,叶いませんでした.もし,他の言語で同じ内容のプログラムを作成された方がいましたらお知らせ下さい.
表A:正 誤 表(註5)
編 | ページ | カラム | 行 | 誤 | 正 |
基礎編 | 1077 | 右 | 図2キャプションの最終行 | 11) | 15) |
基礎編 | 1078 | 左 | 上から4行目 | 文献11 | 文献15 |