半導体デバイスシミュレーション用のLua材料スクリプト
OghmaNanoでは、グラフィカルな電気的パラメータ編集機能を通じて固定値を個別に入力する代わりに、Lua言語を用いた材料スクリプトの記述が可能である。ほとんどのシミュレーションにおいてはGUIから入力した固定値で十分だが、電気的・光学的・熱的な材料特性をプログラム上で定義したい場合や、温度、位置(x、y、z)、組成、光子密度に応じて変化させたい場合にはLuaスクリプトが利用される。その結果、バンドギャップ、電子親和力、キャリア移動度、再結合係数、熱伝導率といったパラメータを単一の定数ではなく関数として表現できる。本ページでは、Lua材料スクリプトの構造、OghmaNanoがそれらをどのように検出・選択するか、材料や光学定数データセットとどのように関連付けられるか、そしてシミュレーション内でスクリプトで定義されたパラメータがどのように利用されるかについて説明する。
1. 何がLua材料スクリプトなのでしょうか?
Lua形式の材料スクリプトとは、固定値ではなく小さな関数を用いて材料特性を定義するプレーンテキスト形式の .lua ファイルである。各関数はバンドギャップ、電子親和力、キャリア移動度、再結合係数、熱伝導率といった特定の材料パラメータの値を返す。これらの値は一定の定数でもよいし、温度 T や位置 (x, y, z) の関数として変化しても構わない。各関数は個別に有効化または無効化可能であり、これにより必要なパラメータのみをスクリプトで上書きし、他の値は標準のシミュレーション設定から引き続き用いることができる。典型的な関数の記述例は次の通りである:
function material.Eg(state)
-- Band gap, units: eV
local enabled = true
local T = state.T
local value = 1.42 - 4.5e-4*(T - 300.0)
return value, enabled
end
OghmaNanoの材料データベース内にある任意の .lua ファイルは、ファイルの先頭1000バイト以内にテーブル宣言 local material = {} が記載されていれば材料スクリプトとして扱われる。つまり、ライセンス情報や説明用のコメントブロックが宣言より前に記載されていても構わず、ただしそのマーカーがファイルの冒頭付近に存在する必要がある。材料のスクリプト内容は、材料エディタ内のコードエディタタブ ?? から直接閲覧・編集可能である。
材料スクリプトでは、必要なだけの内容を定義することが可能です。バンドギャップや電子親和力のみを定義することも、バンド構造、輸送特性、再結合係数、熱伝導率といった全パラメータを定義することも可能です。不要な関数は単に記述しないか、enabled = falseを返すようにすれば、モデルは標準エディタに保存されている値を使用することになります。
enabledフラグを返す小さな関数となっている。
CH3NH3PbI3.lua)が存在する。OghmaNanoはシミュレーションに最適なファイルを自動的に選択する。2. スクリプトがディスク上に保存される場所
材料スクリプトは2か所のいずれかに配置可能であり、その場所によってOghmaNano上での表示形態が決定されます。
- 材料フォルダー内、例えばガリウムヒ素やMAPI-CH3NH3PbI3のフォルダー内に配置された材料スクリプトは、該当する材料に属するものとなります。この場合、そのスクリプトは材料を開いた際に、n/kデータやその他のファイルと共に表示されます。
- 材料フォルダの外部、つまりデータベース内の他の場所に配置された独立した
.luaファイルです。この場合、単一の材料に紐付けられるのではなく、材料データベースブラウザ内で独立した.luaファイルとして表示されます。
図 ?? に示すように、材料フォルダー内に配置されたスクリプトが存在します。MAPI-CH3NH3PbI3ペロブスカイト用のフォルダーには、Ball、Leguy、Leguy-hydrated、Phillipsといった複数の光学定数(n/k)データセットが原子アイコンで示されており、さらにコードファイルアイコンで表される単一の電気的パラメータ用スクリプト CH3NH3PbI3.lua も含まれています。
3. 電気的パラメータ用スクリプトは1つだが、光学定数用データセットは複数存在する
通常、1つの材料に対して複数の光学定数セットが存在する一方で、電気的パラメータとしては1つの整合性の取れた定義のみが用いられる。異なる研究グループではそれぞれ異なる試料や手法を用いて波長範囲ごとにnおよびkを測定するため、各光学データセットを個別に保持し、シミュレーションごとに適切なものを選択することが有益となる。一方で電気的パラメータ(バンドギャップ、電子親和力、キャリア移動度など)は、材料にとって一貫した単一の定義として保持するのが最適である。これこそが??に示されている構成であり、4つのn/kデータセットと1つの電気的スクリプトが存在する形となっている。
材料が使用される際、OghmaNanoは最も適切なファイルを自動的に選択しようとする。シミュレーション対象となる特定の材料レベルに電気的パラメータ用スクリプトが存在しない場合、モデルは材料フォルダ構造を遡って適切なスクリプトを探す。この仕組みにより、適切な階層に1つの電気的パラメータ用スクリプトを設定するだけで、その下位に配置された複数の光学定数データセットに一括して適用可能となり、各光学データバリエーションごとに同じ電気的パラメータを個別に設定する手間が不要になる。
なぜ両者を分離する必要があるのか?光学定数データは測定条件によってしばしば変化する。例えば、ある研究グループが800ナノメートルまでの範囲で測定した薄膜データと、別のグループが1100ナノメートルまで測定したデータは、どちらも正当なn/kデータセットとなる。一方、材料の電気的挙動は光学測定の波長範囲とは無関係であるため、単一の材料スクリプトを用いることで、どの光学データセットと組み合わせても物理的整合性が保たれるのである。
4. 材料スクリプトの構造
以下に示す例は、通信用レーザーや検出器に用いられる格子整合型のInPベース四元混晶であるAlGaInAs用の完全な電気的パラメータ材料スクリプトです。実際に使用され、十分に文書化されたスクリプトがどのように構成されているかをご覧いただくため、全文を掲載しています。その後、各関数については下記のセクション5にて詳細に説明します。クリックして展開してください。
完全な材料スクリプトの例 — AlGaInAs.lua
-- See end of file for copyright, licensing and documentation links.
local material = {}
-- ---------------------------------------------------------------------------
-- NOTES ON AlGaInAs (read before using):
--
-- (Al_x Ga_{1-x})_{0.47} In_{0.53} As, LATTICE-MATCHED to InP (a = 5.869 A). The
-- workhorse quaternary for 1.3-1.55 um telecom lasers, modulators and
-- photodetectors. In is fixed at 0.53 for the InP match, so the single design
-- knob is the Al fraction x on the group-III sublattice.
--
-- DIRECT gap for all x (no crossover in the useful range): ~0.75 eV at x=0
-- (Ga0.47In0.53As, "InGaAs", ~1.65 um) rising to ~1.46 eV at x=1
-- (Al0.48In0.52As, ~0.85 um).
さらに表示する
-- Compared with the older InGaAsP telecom
-- quaternary, AlGaInAs offers a larger conduction-band offset (better electron
-- confinement), which is why it is favoured for high-temperature laser
-- operation - a device advantage, captured here only via Xi/Eg.
--
-- The lattice constant is FIXED by the InP match (independent of x). Eg is
-- computed from x; the remaining parameters are given at a representative
-- x = 0.30 (Eg ~ 0.92 eV, ~1.34 um) with InGaAs/AlInAs end points noted.
--
-- REFERENCES
--
-- [1] I. Vurgaftman, J. R. Meyer, L. R. Ram-Mohan, J. Appl. Phys. 89, 5815
-- (2001). [constituent band parameters, bowing]
-- [2] S. Adachi, "Properties of Semiconductor Alloys", Wiley (2009); and
-- S. Adachi, "Physical Properties of III-V Semiconductor Compounds"
-- (1992). [Eg(x), transport, dielectric, thermal]
-- [3] O. Madelung, "Semiconductors: Data Handbook", Springer (2004).
-- ---------------------------------------------------------------------------
function material.name()
local enabled = true
return "AlGaInAs", enabled
end
function material.description()
local enabled = true
return "(AlxGa1-x)0.47In0.53As on InP, x = Al ~ 0.30 (direct gap)", enabled
end
function material.formula()
local enabled = true
return "AlGaInAs", enabled
end
function material.Eg(state)
-- Units: eV
-- Refs: [1],[2]
--
-- Direct gap, lattice-matched to InP, in Al fraction x. 300 K relation
-- [2]: Eg(x) = 0.76 + 0.49*x + 0.20*x^2
-- (0.76 eV at x=0 -> 1.45 eV at x=1). Temperature handled by a
-- Varshni-type shift about 300 K (alpha = 4.0e-4 eV/K, beta = 200 K).
-- x = 0.30 -> ~0.925 eV (~1.34 um) at 300 K. Change al_fraction here
-- and in the functions noted in the header.
local enabled = true
local al_fraction = 0.30
local x = al_fraction
local T = state.T
local eg_300 = 0.76 + 0.49*x + 0.20*x*x
local tshift = 4.0e-4*(90000.0/500.0 - T*T/(T + 200.0))
local value = eg_300 + tshift
return value, enabled
end
function material.Xi(state)
-- Electron affinity
-- Units: eV
-- Refs: [2],[3]
--
-- ~4.45 eV at x = 0.30. Falls with Al (InGaAs ~4.6 -> AlInAs ~4.1 eV);
-- the resulting large conduction-band offset to InP / across the alloy
-- is the key confinement advantage over InGaAsP.
local enabled = true
local value = 4.45
return value, enabled
end
function material.Nc(state)
-- Effective conduction-band density of states
-- Units: m^-3
-- Refs: [2],[3]
--
-- ~4e23 m^-3 at 300 K for x = 0.30 (small direct-valley mass, m_e* ~
-- 0.05-0.07 m0). Endpoints: InGaAs ~2.1e23, AlInAs ~5.4e23 m^-3.
local enabled = true
local T = state.T
local value = 4.0e23*(T/300.0)^1.5
return value, enabled
end
function material.Nv(state)
-- Effective valence-band density of states
-- Units: m^-3
-- Refs: [2],[3]
--
-- ~8e24 m^-3 at 300 K for x = 0.30 (InGaAs ~7.7e24, AlInAs ~9e24 m^-3).
local enabled = true
local T = state.T
local value = 8.0e24*(T/300.0)^1.5
return value, enabled
end
function material.mu_e(state)
-- Low-field electron mobility
-- Units: m^2 V^-1 s^-1
-- Refs: [2]
--
-- ~0.3 m^2/V/s (3000 cm^2/V/s) at x = 0.30 - high (small mass) but
-- alloy-scattering-reduced from InGaAs (~10000-13000 cm^2/V/s) toward
-- AlInAs (~1000-4000 cm^2/V/s). (300/T)^1.5 approximate.
local enabled = true
local T = state.T
local value = 0.30*(300.0/T)^1.5
return value, enabled
end
function material.mue_x(state)
return material.mu_e(state)
end
function material.mue_y(state)
return material.mu_e(state)
end
function material.mue_z(state)
return material.mu_e(state)
end
function material.mu_h(state)
-- Low-field hole mobility
-- Units: m^2 V^-1 s^-1
-- Refs: [2]
--
-- ~0.02 m^2/V/s (200 cm^2/V/s) at x = 0.30 (InGaAs ~300, AlInAs ~100
-- cm^2/V/s). (300/T)^1.5 approximate.
local enabled = true
local T = state.T
local value = 0.02*(300.0/T)^1.5
return value, enabled
end
function material.muh_x(state)
return material.mu_h(state)
end
function material.muh_y(state)
return material.mu_h(state)
end
function material.muh_z(state)
return material.mu_h(state)
end
function material.epsilonr(state)
-- Relative static permittivity
-- Dimensionless
-- Refs: [2],[3]
--
-- ~13.4 at x = 0.30 (InGaAs ~13.9 -> AlInAs ~12.5).
local enabled = true
local value = 13.4
return value, enabled
end
function material.free_to_free_recombination(state)
-- Radiative recombination coefficient
-- Units: m^3 s^-1
-- Refs: representative (see note)
--
-- Direct-gap value ~1e-10 cm^3/s = 1e-16 m^3/s. Representative; refine
-- against measured lifetimes.
local enabled = true
local value = 1.0e-16
return value, enabled
end
function material.auger_Cn(state)
-- Electron Auger recombination coefficient
-- Units: m^6 s^-1
-- Refs: representative (see note)
--
-- ~2e-28 cm^6/s = 2e-40 m^6/s at the InGaAs-rich (narrow-gap) end.
-- Auger is a major loss mechanism in 1.55 um AlGaInAs/InGaAsP lasers
-- and grows sharply as x decreases (gap narrows) - scale accordingly.
local enabled = true
local value = 2.0e-40
return value, enabled
end
function material.auger_Cp(state)
-- Hole Auger recombination coefficient
-- Units: m^6 s^-1
-- Refs: representative (see note)
--
-- As auger_Cn: representative 2e-28 cm^6/s = 2e-40 m^6/s.
local enabled = true
local value = 2.0e-40
return value, enabled
end
function material.ss_srh_trap_energy(state)
-- SRH trap energy relative to the middle of the band gap.
-- Units: eV
--
-- Positive values are above mid-gap (towards the conduction band).
-- Negative values are below mid-gap (towards the valence band).
--
-- Defect-dependent. Lattice-matched InP-based material can be very high
-- quality; set level and density from your own data. Mid-gap default.
local enabled = true
local value = 0.0
return value, enabled
end
function material.ss_srh_Nt(state)
-- SRH trap density
-- Units: m^-3
--
-- Defect-dependent placeholder; set from the intended material
-- quality.
local enabled = true
local value = 1.0e21
return value, enabled
end
function material.ss_srh_sigma_n(state)
-- Electron capture cross section
-- Units: m^2
--
-- Defect-dependent placeholder; set from measurement.
local enabled = true
local value = 1.0e-19
return value, enabled
end
function material.ss_srh_sigma_p(state)
-- Hole capture cross section
-- Units: m^2
--
-- Defect-dependent placeholder; set from measurement.
local enabled = true
local value = 1.0e-19
return value, enabled
end
function material.thermal_kl(state)
-- Thermal conductivity
-- Units: W m^-1 K^-1
-- Refs: [2]
--
-- ~4.5 W/m/K at x = 0.30 - LOW, from strong mass-disorder phonon
-- scattering in this quaternary (well below InP's ~68 or InAs's ~27
-- W/m/K). Weakly dependent in the alloy regime; (300/T)^0.4 approximate.
-- This low kappa contributes to self-heating in InP-based lasers.
local enabled = true
local T = state.T
local value = 4.5*(300.0/T)^0.4
return value, enabled
end
function material.heat_capacity(state)
-- Specific heat capacity
-- Units: J kg^-1 K^-1
-- Refs: [3]
--
-- ~320 J/kg/K near 300 K (interpolated across the constituents).
local enabled = true
local value = 320.0
return value, enabled
end
function material.density(state)
-- Mass density
-- Units: kg m^-3
-- Refs: [3]
--
-- ~5300 kg/m^3 at x = 0.30 (InGaAs ~5500 -> AlInAs ~4650 kg/m^3).
local enabled = true
local value = 5300.0
return value, enabled
end
function material.lattice_constant(state)
-- Cubic lattice constant
-- Units: m
-- Refs: [1],[3]
--
-- FIXED at the InP match, a = 5.8697 A, INDEPENDENT of x (Al substitutes
-- for Ga at constant lattice constant along the InP-matched line).
-- Linear thermal expansion ~4.6e-6 /K (InP-like).
local enabled = true
local T = state.T
local a300 = 5.8697e-10
local expansion = 4.6e-6
local value = a300*(1.0 + expansion*(T - 300.0))
return value, enabled
end
function material.thermal_tau_e(state)
-- Electron energy relaxation time towards the lattice temperature
-- Units: s
--
-- Value basis: III-V family estimate
-- Confidence: Medium
--
-- Reference:
-- https://www.mdpi.com/2673-3978/3/2/16
--
-- Comments:
-- Representative III-V carrier-to-lattice relaxation time. GaAs-like values
-- are typically sub-ps to ps and field dependent.
local enabled = true
local value = 5.000000e-13
return value, enabled
end
function material.thermal_tau_h(state)
-- Hole energy relaxation time towards the lattice temperature
-- Units: s
--
-- Value basis: III-V family estimate
-- Confidence: Medium
--
-- Reference:
-- https://www.mdpi.com/2673-3978/3/2/16
--
-- Comments:
-- Representative III-V carrier-to-lattice relaxation time. GaAs-like values
-- are typically sub-ps to ps and field dependent.
local enabled = true
local value = 5.000000e-13
return value, enabled
end
function material.print()
local state = {
T = 300.0,
x = 0.0,
y = 0.0,
z = 0.0,
photon_density = 0.0,
}
print(string.format("Material: %s", material.name()))
print(string.format("Description: %s", material.description()))
print(string.format("Formula: %s", material.formula()))
print(string.format("Temperature: %.2f K", state.T))
print(string.format("Position: %.6e, %.6e, %.6e m", state.x, state.y, state.z))
print(string.format("Photon density: %.6e m^-3", state.photon_density))
print(string.format("Band gap: %.6f eV", material.Eg(state)))
print(string.format("Electron affinity: %.6f eV", material.Xi(state)))
print(string.format("Electron mobility: %.6e m^2/V/s", material.mu_e(state)))
print(string.format("Hole mobility: %.6e m^2/V/s", material.mu_h(state)))
print(string.format("Nc: %.6e m^-3", material.Nc(state)))
print(string.format("Nv: %.6e m^-3", material.Nv(state)))
print(string.format("Relative permittivity: %.6f", material.epsilonr(state)))
print(string.format("Radiative coeff.: %.6e m^3/s", material.free_to_free_recombination(state)))
print(string.format("Electron Auger coeff.: %.6e m^6/s", material.auger_Cn(state)))
print(string.format("Hole Auger coeff.: %.6e m^6/s", material.auger_Cp(state)))
print(string.format("SRH trap energy: %.6f eV", material.ss_srh_trap_energy(state)))
print(string.format("SRH trap density: %.6e m^-3", material.ss_srh_Nt(state)))
print(string.format("SRH sigma n: %.6e m^2", material.ss_srh_sigma_n(state)))
print(string.format("SRH sigma p: %.6e m^2", material.ss_srh_sigma_p(state)))
print(string.format("Electron energy relax.: %.6e s", material.thermal_tau_e(state)))
print(string.format("Hole energy relax.: %.6e s", material.thermal_tau_h(state)))
print(string.format("Thermal conductivity: %.6e W/m/K", material.thermal_kl(state)))
print(string.format("Heat capacity: %.6e J/kg/K", material.heat_capacity(state)))
print(string.format("Mass density: %.6e kg/m^3", material.density(state)))
end
return material
5. 各関数の詳細
材料スクリプト内の各関数はすべて同じパターンに従う。すなわち、stateテーブルを受け取り、valueとenabledフラグを返すのである。以下の各項では、AlGaInAsの例に基づき各関数群について詳述する。
5.1 state構造体とenabledフラグ
各関数には、値が要求されているデバイス内の位置における局所的なシミュレーション条件を含む state オブジェクトが引数として渡される。Lua においてはこれはテーブルとして実装されており、C 言語に精通している場合は struct と考えるのが適切である。また C++ においては、そのメンバーが現在の局所状態を表す小さなクラスまたはオブジェクトと見なせる。利用可能なフィールドは以下の通りである:
state.T— 局所温度(K)。state.x,state.y,state.z— デバイス内の位置(単位:メートル)。state.photon_density— 局所的な光子密度(単位:m-3).
OghmaNanoがこの局所的なstateデータを関数に供給することで、材料パラメータを単一の固定値に限定せず、温度や位置、光子密度に基づいて算出することが可能となる。2番目の戻り値であるenabledは、モデルがスクリプトから返された値を使用するかどうかを制御する。enabledの値がtrueの場合はスクリプト値が用いられ、falseの場合は標準エディタに保存されている値が使用される。この仕組みにより、スクリプトでは変動させたいパラメータのみを定義し、他のパラメータは通常の固定値のままに保つことができる。
5.2 識別情報:name、description、formula
これら3つの関数は物理的な値ではなく説明的な文字列を返します。これらは材料を識別し、人間が読める簡潔な説明を提供し、さらにその化学式も示します。
function material.name()
local enabled = true
return "AlGaInAs", enabled
end
function material.description()
local enabled = true
return "(AlxGa1-x)0.47In0.53As on InP, x = Al ~ 0.30 (direct gap)", enabled
end
function material.formula()
local enabled = true
return "AlGaInAs", enabled
end
5.3 バンド構造:EgおよびXi
Egはバンドギャップ(単位:eV)を返し、Xiは電子親和力(単位:eV)を返す。これら二つの値によって伝導帯および価電子帯のエネルギー位置が決定され、モデル全体で利用される(セクション7参照)。このファイルにおいて最も重要な関数がAlGaInAsのバンドギャップ計算機能であり、まずAl組成比xから300 Kにおけるバンドギャップを算出した上でヴァーシュニ項に基づく温度補正を施すため、最終的な値はstate.Tにも依存する。
function material.Eg(state)
-- Units: eV. Direct gap, lattice-matched to InP, in Al fraction x.
local enabled = true
local al_fraction = 0.30
local x = al_fraction
local T = state.T
local eg_300 = 0.76 + 0.49*x + 0.20*x*x -- 300 K value from composition
local tshift = 4.0e-4*(90000.0/500.0 - T*T/(T + 200.0)) -- Varshni-type shift
local value = eg_300 + tshift
return value, enabled
end
function material.Xi(state)
-- Electron affinity, units: eV
local enabled = true
local value = 4.45
return value, enabled
end
具体例として、x = 0.30の場合、300 Kにおける組成項より Eg(300 K) ≈ 0.76 + 0.49(0.30) + 0.20(0.30)² ≈ 0.925 eV(波長約1.34 μm)となる。Egがstate.Tを読み取る仕組みにより、デバイス温度が上昇するとヴァーシュニ項の作用でバンドギャップが自動的に縮小する。このような挙動は固定値では決して再現できない。
5.4 状態密度:NcおよびNv
NcおよびNvは、有効な伝導帯および価電子帯の状態密度(単位:m-3)をそれぞれ返す。この例では、両者とも300 Kにおける値が示されており、温度に対しては(T/300)1.5の比例関係でスケーリングされている。これは標準的な放物線型バンドモデルにおける結果に相当する。この温度依存性はここで用いられている材料モデルに特有のものであり、他の材料においては状況に応じて異なる温度依存性が適用される場合もある。
function material.Nc(state)
local enabled = true
local T = state.T
local value = 4.0e23*(T/300.0)^1.5
return value, enabled
end
function material.Nv(state)
local enabled = true
local T = state.T
local value = 8.0e24*(T/300.0)^1.5
return value, enabled
end
5.5 キャリア移動度:mu_e、mu_hおよび方向性に関する別名
mu_eおよびmu_hは低電界下における電子および正孔のキャリア移動度(単位:m2 V-1 s-1)を返します。本例では移動度は(300/T)1.5の式に従って温度依存性を示しますが、この温度依存関係は特定の材料モデルに固有のものであり、必要に応じて別の関係式に置き換えることも可能です。例えば有機半導体の場合、移動度は活性化型またはホッピング型の温度依存性によって記述されることもあります。OghmaNanoでは方向依存性を持つ移動度も利用可能であり、そのため本ファイルではmue_x、mue_y、mue_zおよびmuh_x、muh_y、muh_zも用意されています。本例は等方的な材料を想定しているため、これらはすべて同一のスカラー値を返しますが、異方的な材料の場合には各方向ごとに独自の数式を指定することも可能です。
function material.mu_e(state)
-- Low-field electron mobility, units: m^2 V^-1 s^-1
local enabled = true
local T = state.T
local value = 0.30*(300.0/T)^1.5
return value, enabled
end
function material.mue_x(state) return material.mu_e(state) end
function material.mue_y(state) return material.mu_e(state) end
function material.mue_z(state) return material.mu_e(state) end
function material.mu_h(state)
-- Low-field hole mobility, units: m^2 V^-1 s^-1
local enabled = true
local T = state.T
local value = 0.02*(300.0/T)^1.5
return value, enabled
end
function material.muh_x(state) return material.mu_h(state) end
function material.muh_y(state) return material.mu_h(state) end
function material.muh_z(state) return material.mu_h(state) end
5.6 誘電率:epsilonr
epsilonr 無次元の相対静電誘電率を返します。この値はドリフト・拡散ソルバーにおける静電場の計算に用いられます。
function material.epsilonr(state)
-- Relative static permittivity, dimensionless
local enabled = true
local value = 13.4
return value, enabled
end
5.7 再結合:放射再結合およびオージェ再結合
free_to_free_recombinationはバンド間(放射性)再結合係数(単位:m3 s-1)を返し、auger_Cnおよびauger_Cpはそれぞれ電子および正孔のオージェ再結合係数(単位:m6 s-1)を返す。オージェ再結合はバンドギャップの狭いIII–V族半導体デバイスにおける主要な損失要因であり、バンドギャップが狭くなるほどその影響は急激に増大する。したがって、より高度な材料スクリプトにおいては、これらの係数を組成や温度に応じて変化させる表現式を設定するのが自然なアプローチとなる。
function material.free_to_free_recombination(state)
-- Radiative recombination coefficient, units: m^3 s^-1
local enabled = true
local value = 1.0e-16
return value, enabled
end
function material.auger_Cn(state)
-- Electron Auger coefficient, units: m^6 s^-1
local enabled = true
local value = 2.0e-40
return value, enabled
end
function material.auger_Cp(state)
-- Hole Auger coefficient, units: m^6 s^-1
local enabled = true
local value = 2.0e-40
return value, enabled
end
5.8 SRHトラップ
4つのショックレー・リード・ホール関数は、単一の平衡状態にあるトラップ準位を記述する。すなわち ss_srh_trap_energy(バンドギャップ中央からのトラップエネルギー、単位は電子ボルト;正の値は伝導帯側を意味する)、ss_srh_Nt(トラップ密度、単位は立方メートル当たり個数)、そして ss_srh_sigma_n/ss_srh_sigma_p(電子および正孔の捕獲断面積、単位は平方メートル)である。これらは欠陥の種類や試料の特性に強く依存するため、例示されている数値はあくまで適当な仮置き値であり、実際には測定によって得られたご自身のデータに置き換える必要がある。
function material.ss_srh_trap_energy(state)
-- Trap energy relative to mid-gap, units: eV
local enabled = true
local value = 0.0
return value, enabled
end
function material.ss_srh_Nt(state)
-- SRH trap density, units: m^-3
local enabled = true
local value = 1.0e21
return value, enabled
end
function material.ss_srh_sigma_n(state)
-- Electron capture cross section, units: m^2
local enabled = true
local value = 1.0e-19
return value, enabled
end
function material.ss_srh_sigma_p(state)
-- Hole capture cross section, units: m^2
local enabled = true
local value = 1.0e-19
return value, enabled
end
5.9 熱的および構造的パラメータ
その他の物理関数は、材料の熱的・構造的特性を記述するものである:thermal_kl(格子熱伝導率、単位:W m-1 K-1)、heat_capacity(単位:J kg-1 K-1)、density(単位:kg m-3)、lattice_constant(単位:mで、300 K付近における線膨張を考慮)、そしてキャリアのエネルギー緩和時間を示すthermal_tau_eおよびthermal_tau_h(単位:秒)。なお、thermal_klおよびlattice_constantはstate.Tを参照することで温度依存性のある値を返す仕組みとなっている。
function material.thermal_kl(state)
-- Thermal conductivity, units: W m^-1 K^-1
local enabled = true
local T = state.T
local value = 4.5*(300.0/T)^0.4
return value, enabled
end
function material.heat_capacity(state)
-- Specific heat capacity, units: J kg^-1 K^-1
local enabled = true
local value = 320.0
return value, enabled
end
function material.density(state)
-- Mass density, units: kg m^-3
local enabled = true
local value = 5300.0
return value, enabled
end
function material.lattice_constant(state)
-- Cubic lattice constant, units: m (with thermal expansion)
local enabled = true
local T = state.T
local a300 = 5.8697e-10
local expansion = 4.6e-6
local value = a300*(1.0 + expansion*(T - 300.0))
return value, enabled
end
function material.thermal_tau_e(state)
-- Electron energy relaxation time, units: s
local enabled = true
local value = 5.000000e-13
return value, enabled
end
function material.thermal_tau_h(state)
-- Hole energy relaxation time, units: s
local enabled = true
local value = 5.000000e-13
return value, enabled
end
5.10 print() — 自己診断用ヘルパー
最後に、print()は材料の物理特性そのものではなく便宜的な関数です。この関数は代表的なstateテーブル(温度300 K、原点位置、光子密度ゼロの状態)を生成し、スクリプトが算出したすべての値を出力します。これはシミュレーションで使用する前に、コマンドラインや独立したLuaインタプリタ上でスクリプトの動作を検証する際に役立ち、算出値が妥当な範囲にあるかを迅速に確認する手段となります。
6. シミュレーションにおけるスクリプトの利用方法
これまでの説明では、Materialsデータベースに保存されているLuaスクリプトについて述べてきました。実際のデバイスシミュレーションでこれらのスクリプトを利用するには、対象となる層の電気的パラメータエディタを開きます。このエディタは2つの動作モードを持ち、sim.jsonに保存されている通常の固定パラメータ値を使用することも、Lua材料スクリプトから直接必要なパラメータ値を取得することも可能です。
デフォルト設定ではスクリプト機能は無効化されており、エディタは通常通りに動作します ??。各パラメータは sim.json に保存された数値として編集可能な形で表されます。このモードではLua材料スクリプトは使用されません。
「Script」ボタンをクリックすると材料スクリプト機能が有効化されます??。この状態では、スクリプトによって指定されたパラメータはエディタ上で「値はスクリプトにより決定」と表示されるようになります。一方、対応するLua関数が無効化されているパラメータについては、引き続きsim.jsonに保存されている固定値が使用されます。この仕組みにより、スクリプトで制御すべきプロパティのみを動的に変更し、その他のパラメータは変更せずに維持することが可能となります。
sim.json に保存され、スクリプトは使用されません。
GaAs.lua)。
sim.jsonに書き込まれます。
sim.jsonにデータを入力する際に表示される確認ダイアログには、変更されるすべての値が一覧表示される。スクリプト機能が有効化されると、??タブの隣にコードエディタタブが表示されます。これにより、材料データベースに戻ることなく、シミュレーション中に直接Lua言語で記述された材料スクリプトを確認・編集することが可能となります。
6.1 スクリプトの選択、またはその値をシミュレーションにコピーする方法
??で参照される材料スクリプトを利用する際には、スクリプトボタンの横にある小さなメニューから2つの方法が選択可能である:
- 材料スクリプトのインポート — 材料データベースを開き、シミュレーションで使用するLua製の材料スクリプトを選択できる機能です。
- JSONデータの生成 — 選択した材料スクリプトを実行し、得られたパラメータ値を
sim.json内の固定値としてコピーします。
これら二つの手法はそれぞれ異なる目的に用いられる。スクリプトを直接利用する場合、その関数はシミュレーション中も有効なままとなる。温度、位置、組成、あるいは光子密度といった量に応じてパラメータを変化させる必要がある際には、このモードが適切である。
EgおよびXiの変更内容は自動的にここに反映される。あるいは、スクリプトが定義する初期値セットを利用したいがスクリプトを常時実行させる必要がない場合には「Populate json from script」機能を使用できます。OghmaNanoは該当スクリプトを評価し、得られた数値を通常のパラメータフィールドに書き込みます。その後、これらの値は通常通り手動で編集可能となります。
sim.jsonの生成処理によりシミュレーション内に既に存在する値が上書きされる可能性があるため、OghmaNanoはまず確認ダイアログ ?? を表示します。このダイアログには使用されるスクリプト名が記載され、変更対象となる各パラメータの現在値と新たに設定される値が示されます。操作が確定されるまで、いかなる値も変更されません。
同一の材料スクリプトを利用する方法は2通りある。1つ目は、シミュレーション中にパラメータを変化させる必要がある場合にスクリプトをアクティブな状態に維持すること。もう1つは「Populate json from script」機能を用いて固定された初期値を生成し、その後通常のグラフィカルインターフェースを通じて編集することである。
7. スクリプトで生成された値が使用される箇所
材料スクリプトによって生成される値は、電気的ソルバー内だけでなくモデル全体で利用される。EgやXiといった値は、必要な箇所すべてにおいてバンド端の位置を決定する。例えば、バンド構造図や生成率ビューアーに表示されるエネルギー準位もこれらの値に基づいて算出される??。したがって、スクリプト内でバンドギャップや電子親和力を変更すると、それらは自動的にバンド構造図、光学モデル、電気的ソルバーにも反映されるのである。
よくある落とし穴
local material = {}の宣言文はファイルの先頭1000バイト以内に記載する必要があります。そうでなければOghmaNanoはそれを材料スクリプトとして認識できません。- 各関数は2つの値、すなわち計算結果と
enabledフラグを返さなければならない。あるボックスが「値についてはスクリプトを参照」と表示されるのは、その関数がenabledを返した場合のみである。 - 全ての計算はSI単位系で行うこと(単位:メートル、立方メートル、平方メートル毎ボルト毎秒、必要に応じて電子ボルト)。算出された値のオーダーを大まかに確認し、物理的に妥当な値であるかを検証すること。
- スクリプトからJSONデータを生成すると、
sim.json内に記載されている固定値が上書きされます。承認する前に確認ダイアログを必ず確認してください。
概要および次の手順
- Lua言語で記述された材料スクリプトでは、温度、位置、組成、または光子密度の関数として物性値を定義できる。このスクリプトは任意であり、パラメータを動的に変化させたい場合や信頼性の高いデータが存在する場合にのみ使用される。
- ファイルは先頭1000バイト内の
local material = {}データによって識別され、材料フォルダ内に存在することも(その場合は材料と共に表示される)、単独で存在することも可能である(その場合は.luaファイルとして表示される)。 - 1つの電気的パラメータ用スクリプトが複数の光学定数(n/k)データセットに適用されることが一般的であり、モデルは最も適切なファイルを選択する。また、材料レベルで該当するスクリプトが存在しない場合には、上位レベルからファイルを検索する。
- シミュレーションにおいて、電気的パラメータ編集機能では固定された
sim.json値またはスクリプトを利用可能です。「Populate json from script」機能を使用すると、スクリプトで定義された値を固定値入力欄に取り込むことができます。 EgやXiといった値は、バンド構造図を含めモデル全体で使用される。
次に、データベースの保存方法について記載したパートCに戻るか、光学データベースおよびその他の材料のダウンロードをご覧ください。